diff --git a/.gitignore b/.gitignore index 5ec57a167..25a5a3091 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,13 @@ GPATH examples/*/sdkconfig examples/*/sdkconfig.old examples/*/build + +#Doc build artifacts +docs/_build/ +docs/doxygen-warning-log.txt +docs/xml/ + +# Unit test app files +tools/unit-test-app/sdkconfig +tools/unit-test-app/sdkconfig.old +tools/unit-test-app/build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aff9bea8d..1d68d2f60 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,8 @@ stages: - build + - unit_test - test + - test_report - deploy before_script: @@ -61,10 +63,7 @@ build_ssc: <<: *build_template artifacts: paths: - - ./SSC/build/*.bin - - ./SSC/build/*.elf - - ./SSC/build/*.map - - ./SSC/build/bootloader/*.bin + - ./SSC/ssc_bin expire_in: 6 mos script: @@ -75,6 +74,22 @@ build_ssc: - chmod +x gen_misc_ng.sh - ./gen_misc_ng.sh +build_esp_idf_tests: + <<: *build_template + artifacts: + paths: + - ./tools/unit-test-app/build/*.bin + - ./tools/unit-test-app/build/*.elf + - ./tools/unit-test-app/build/*.map + - ./tools/unit-test-app/build/bootloader/*.bin + expire_in: 6 mos + + script: + - cd tools/unit-test-app + - git checkout ${CI_BUILD_REF_NAME} || echo "Using default branch..." + - make defconfig + - make + build_examples: <<: *build_template artifacts: @@ -92,13 +107,30 @@ build_examples: - cd build_examples - ${IDF_PATH}/make/build_examples.sh +build_docs: + stage: build + image: espressif/esp32-ci-env + tags: + - build_docs + script: + - cd docs + - doxygen + # If not building master branch, and there are Doxygen warnings, print them and bail out + - test "${CI_BUILD_REF_NAME}" = "master" || test $(cat doxygen-warning-log.txt | wc -l) -eq 0 || ( echo "Doxygen pass had some warnings:" && cat doxygen-warning-log.txt && false ) + - make html + artifacts: + paths: + - docs/_build/html + expire_in: 1 mos + + test_nvs_on_host: stage: test image: espressif/esp32-ci-env tags: - nvs_host_test script: - - cd components/nvs_flash/test + - cd components/nvs_flash/test_nvs_host - make test test_build_system: @@ -112,13 +144,12 @@ test_build_system: - ./make/test_build_system.sh test_report: - stage: deploy + stage: test_report only: - master - triggers tags: - test_report - allow_failure: true variables: LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF" TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test" @@ -127,7 +158,8 @@ test_report: when: always paths: - $REPORT_PATH - expire_in: 6 mos + - $LOG_PATH + expire_in: 12 mos script: # clone test bench - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git @@ -159,6 +191,31 @@ push_master_to_github: - git push --follow-tags github HEAD:master +deploy_docs: + before_script: + - echo "Not setting up GitLab key, not fetching submodules" + stage: deploy + only: + - master + - triggers + tags: + - deploy + image: espressif/esp32-ci-env + script: + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64 + - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa + - chmod 600 ~/.ssh/id_rsa + - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config + - export GIT_VER=$(git describe --always) + - cd docs/_build/ + - mv html $GIT_VER + - tar czvf $GIT_VER.tar.gz $GIT_VER + - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH + - ssh $DOCS_SERVER -x "cd $DOCS_PATH && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest" + + # AUTO GENERATED PART START, DO NOT MODIFY CONTENT BELOW # template for test jobs .test_template: &test_template @@ -172,11 +229,11 @@ push_master_to_github: variables: # LOCAL_ENV_CONFIG_PATH: define in template and jobs can overwrite if required LOCAL_ENV_CONFIG_PATH: /home/gitlab-runner/LocalConfig/ESP32_IDF - BIN_PATH: "$CI_PROJECT_DIR/SSC/build/" + BIN_PATH: "$CI_PROJECT_DIR/SSC/ssc_bin/SSC" APP_NAME: "ssc" LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF" # append test level folder to TEST_CASE_FILE_PATH in before_script of test job - TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test" + TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test" # jobs MUST set CONFIG_FILE in before_script, and overwrite the variables above if necessary artifacts: @@ -222,13 +279,34 @@ push_master_to_github: # run test - python CIRunner.py -l $LOG_PATH -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH bin_path $APP_NAME $BIN_PATH +# template for unit test jobs +.unit_test_template: &unit_test_template + <<: *test_template + allow_failure: false + stage: unit_test + + variables: + # jobs MUST set CONFIG_FILE in before_script, and overwrite the variables above if necessary + LOCAL_ENV_CONFIG_PATH: /home/gitlab-runner/LocalConfig/ESP32_IDF + BIN_PATH: "$CI_PROJECT_DIR/esp-idf-tests/build/" + LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF" + APP_NAME: "ut" + TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/unit_test" + +UT_Function_SYS_01: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + before_script: + - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/UT_Function_SYS_01.yml + IT_Function_SYS_01: <<: *test_template tags: - ESP32_IDF - SSC_T1_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_SYS_01.yml IT_Function_WIFI_01: @@ -238,7 +316,6 @@ IT_Function_WIFI_01: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_01.yml IT_Function_WIFI_02: @@ -248,7 +325,6 @@ IT_Function_WIFI_02: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_02.yml IT_Function_TCPIP_01: @@ -258,7 +334,6 @@ IT_Function_TCPIP_01: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_01.yml IT_Function_TCPIP_02: @@ -268,7 +343,6 @@ IT_Function_TCPIP_02: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_02.yml IT_Function_TCPIP_03: @@ -278,7 +352,6 @@ IT_Function_TCPIP_03: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_03.yml IT_Function_TCPIP_04: @@ -288,7 +361,6 @@ IT_Function_TCPIP_04: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_04.yml IT_Function_TCPIP_05: @@ -298,7 +370,6 @@ IT_Function_TCPIP_05: - SSC_T1_1 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_05.yml IT_Function_TCPIP_06: @@ -307,7 +378,6 @@ IT_Function_TCPIP_06: - ESP32_IDF - SSC_T1_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_06.yml IT_Function_WIFI_03: @@ -316,7 +386,6 @@ IT_Function_WIFI_03: - ESP32_IDF - SSC_T3_PhyMode before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_03.yml IT_Function_WIFI_04: @@ -325,7 +394,6 @@ IT_Function_WIFI_04: - ESP32_IDF - SSC_T1_APC before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_04.yml IT_Function_WIFI_05: @@ -334,7 +402,6 @@ IT_Function_WIFI_05: - ESP32_IDF - SSC_T1_WEP before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_05.yml IT_Function_WIFI_06: @@ -343,7 +410,6 @@ IT_Function_WIFI_06: - ESP32_IDF - SSC_T2_PhyMode before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_WIFI_06.yml IT_Function_TCPIP_07: @@ -354,7 +420,6 @@ IT_Function_TCPIP_07: - SSC_T1_2 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_07.yml IT_Function_TCPIP_08: @@ -363,7 +428,6 @@ IT_Function_TCPIP_08: - ESP32_IDF - SSC_T1_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_08.yml IT_Function_TCPIP_09: @@ -372,7 +436,6 @@ IT_Function_TCPIP_09: - ESP32_IDF - SSC_T1_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_09.yml IT_Function_TCPIP_10: @@ -383,7 +446,6 @@ IT_Function_TCPIP_10: - SSC_T1_2 - SSC_T2_1 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_10.yml IT_Function_TCPIP_11: @@ -391,8 +453,8 @@ IT_Function_TCPIP_11: tags: - ESP32_IDF - SSC_T1_1 + - SSC_T1_2 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_11.yml IT_Function_TCPIP_12: @@ -400,7 +462,5 @@ IT_Function_TCPIP_12: tags: - ESP32_IDF - SSC_T1_1 - - SSC_T1_2 before_script: - - TEST_CASE_FILE_PATH=$TEST_CASE_FILE_PATH/integration_test - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/IT_Function_TCPIP_12.yml diff --git a/.gitmodules b/.gitmodules index df4084826..c26f92e80 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "components/bt/lib"] path = components/bt/lib url = https://github.com/espressif/esp32-bt-lib.git +[submodule "components/micro-ecc/micro-ecc"] + path = components/micro-ecc/micro-ecc + url = https://github.com/kmackay/micro-ecc.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.rst similarity index 57% rename from CONTRIBUTING.md rename to CONTRIBUTING.rst index b0af761d5..5810d06b9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.rst @@ -1,30 +1,36 @@ -# Contributions Guide +Contributions Guide +=================== We welcome contributions to the esp-idf project! -## How to Contribute +How to Contribute +----------------- -Contributions to esp-idf - fixing bugs, adding features, adding documentation - are welcome. We accept contributions via [Github Pull Requests](https://help.github.com/articles/about-pull-requests/). +Contributions to esp-idf - fixing bugs, adding features, adding documentation - are welcome. We accept contributions via `Github Pull Requests `_. -## Before Contributing +Before Contributing +------------------- Before sending us a Pull Request, please consider this list of points: * Is the contribution entirely your own work, or already licensed under an Apache License 2.0 compatible Open Source License? If not then we unfortunately cannot accept it. -* Does any new code conform to the esp-idf Style Guide? (Style Guide currently pending). +* Does any new code conform to the esp-idf :doc:`Style Guide `? + +* Does the code documentation follow requirements in :doc:`documenting-code`? * Is the code adequately commented for people to understand how it is structured? -* Is there documentation or examples that go with code contributions? [There are additional suggestions for writing good examples in the examples README](examples/README.md). +* Is there documentation or examples that go with code contributions? `There are additional suggestions for writing good examples in the examples README `_. * Are comments and documentation written in clear English, with no spelling or grammar errors? -* If the contribution contains multiple commits, are they grouped together into logical changes (one major change per pull request)? Are any commits with names like "fixed typo" [squashed into previous commits](http://eli.thegreenplace.net/2014/02/19/squashing-github-pull-requests-into-a-single-commit/)? +* If the contribution contains multiple commits, are they grouped together into logical changes (one major change per pull request)? Are any commits with names like "fixed typo" `squashed into previous commits `_? * If you're unsure about any of these points, please open the Pull Request anyhow and then ask us for feedback. -## Pull Request Process +Pull Request Process +-------------------- After you open the Pull Request, there will probably be some discussion in the comments field of the request itself. @@ -32,6 +38,10 @@ Once the Pull Request is ready to merge, it will first be merged into our intern If this process passes, it will be merged onto the public github repository. -## Legal Part +Legal Part +---------- + +Before a contribution can be accepted, you will need to sign our :doc:`contributor-agreement`. You will be prompted for this automatically as part of the Pull Request process. + + -Before a contribution can be accepted, you will need to sign our [Contributor Agreement](docs/contributor-agreement.rst). You will be prompted for this automatically as part of the Pull Request process. diff --git a/README.md b/README.md index ff645c339..c01e314f1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Using Espressif IoT Development Framework with the ESP32 +[![alt text](https://readthedocs.org/projects/docs/badge/?version=latest "Documentation Status")](http://esp-idf.readthedocs.io/en/latest/?badge=latest) + # Setting Up ESP-IDF In the [docs](docs) directory you will find per-platform setup guides: @@ -60,14 +62,15 @@ The simplest way to use the partition table is to `make menuconfig` and choose o In both cases the factory app is flashed at offset 0x10000. If you `make partition_table` then it will print a summary of the partition table. -For more details about partition tables and how to create custom variations, view the `docs/partition_tables.rst` file. +For more details about partition tables and how to create custom variations, view the `docs/partition-tables.rst` file. # Resources -* The [docs directory of the esp-idf repository](docs) contains esp-idf documentation. +* The [docs directory of the esp-idf repository](docs) contains source of [esp-idf](http://esp-idf.readthedocs.io/) documentation. * The [esp32.com forum](http://esp32.com/) is a place to ask questions and find community resources. * [Check the Issues section on github](https://github.com/espressif/esp-idf/issues) if you find a bug or have a feature request. Please check existing Issues before opening a new one. -* If you're interested in contributing to esp-idf, please check the [CONTRIBUTING.md](CONTRIBUTING.md) file. +* If you're interested in contributing to esp-idf, please check the [Contributions Guide](http://esp-idf.readthedocs.io/en/latest/contributing.html>). + diff --git a/components/bootloader/Kconfig.projbuild b/components/bootloader/Kconfig.projbuild index 394bcc1bd..50165d0e5 100644 --- a/components/bootloader/Kconfig.projbuild +++ b/components/bootloader/Kconfig.projbuild @@ -20,12 +20,99 @@ config LOG_BOOTLOADER_LEVEL_VERBOSE endchoice config LOG_BOOTLOADER_LEVEL - int - default 0 if LOG_BOOTLOADER_LEVEL_NONE - default 1 if LOG_BOOTLOADER_LEVEL_ERROR - default 2 if LOG_BOOTLOADER_LEVEL_WARN - default 3 if LOG_BOOTLOADER_LEVEL_INFO - default 4 if LOG_BOOTLOADER_LEVEL_DEBUG - default 5 if LOG_BOOTLOADER_LEVEL_VERBOSE + int + default 0 if LOG_BOOTLOADER_LEVEL_NONE + default 1 if LOG_BOOTLOADER_LEVEL_ERROR + default 2 if LOG_BOOTLOADER_LEVEL_WARN + default 3 if LOG_BOOTLOADER_LEVEL_INFO + default 4 if LOG_BOOTLOADER_LEVEL_DEBUG + default 5 if LOG_BOOTLOADER_LEVEL_VERBOSE endmenu + + + +menu "Secure boot configuration" + +choice SECURE_BOOTLOADER + bool "Secure bootloader" + default SECURE_BOOTLOADER_DISABLED + help + Build a bootloader with the secure boot flag enabled. + + Secure bootloader can be one-time-flash (chip will only ever + boot that particular bootloader), or a digest key can be used + to allow the secure bootloader to be re-flashed with + modifications. Secure boot also permanently disables JTAG. + + See docs/security/secure-boot.rst for details. + +config SECURE_BOOTLOADER_DISABLED + bool "Disabled" + +config SECURE_BOOTLOADER_ONE_TIME_FLASH + bool "One-time flash" + help + On first boot, the bootloader will generate a key which is not readable externally or by software. A digest is generated from the bootloader image itself. This digest will be verified on each subsequent boot. + + Enabling this option means that the bootloader cannot be changed after the first time it is booted. + +config SECURE_BOOTLOADER_REFLASHABLE + bool "Reflashable" + help + Generate a reusable secure bootloader key, derived (via SHA-256) from the secure boot signing key. + + This allows the secure bootloader to be re-flashed by anyone with access to the secure boot signing key. + + This option is less secure than one-time flash, because a leak of the digest key from one device allows reflashing of any device that uses it. + +endchoice + +config SECURE_BOOT_SIGNING_KEY + string "Secure boot signing key" + depends on SECURE_BOOTLOADER_ENABLED + default secure_boot_signing_key.pem + help + Path to the key file used to sign partition tables and app images for secure boot. + + Key file is an ECDSA private key (NIST256p curve) in PEM format. + + Path is evaluated relative to the project directory. + + You can generate a new signing key by running the following command: + espsecure.py generate_signing_key secure_boot_signing_key.pem + + See docs/security/secure-boot.rst for details. + +config SECURE_BOOT_DISABLE_JTAG + bool "First boot: Permanently disable JTAG" + depends on SECURE_BOOTLOADER_ENABLED + default Y + help + Bootloader permanently disable JTAG (across entire chip) when enabling secure boot. This happens on first boot of the bootloader. + + It is recommended this option remains set for production environments. + +config SECURE_BOOT_DISABLE_ROM_BASIC + bool "First boot: Permanently disable ROM BASIC fallback" + depends on SECURE_BOOTLOADER_ENABLED + default Y + help + Bootloader permanently disables ROM BASIC (on UART console) as a fallback if the bootloader image becomes invalid. This happens on first boot. + + It is recommended this option remains set in production environments. + +config SECURE_BOOT_TEST_MODE + bool "Test mode: don't actually enable secure boot" + depends on SECURE_BOOTLOADER_ENABLED + default N + help + If this option is set, all permanent secure boot changes (via Efuse) are disabled. + + This option is for testing purposes only - it effectively completely disables secure boot protection. + +config SECURE_BOOTLOADER_ENABLED + bool + default SECURE_BOOTLOADER_ONE_TIME_FLASH || SECURE_BOOTLOADER_REFLASHABLE + +endmenu \ No newline at end of file diff --git a/components/bootloader/Makefile.projbuild b/components/bootloader/Makefile.projbuild index 50c95f9fe..a49f3d868 100644 --- a/components/bootloader/Makefile.projbuild +++ b/components/bootloader/Makefile.projbuild @@ -13,45 +13,110 @@ ifndef IS_BOOTLOADER_BUILD BOOTLOADER_COMPONENT_PATH := $(COMPONENT_PATH) BOOTLOADER_BUILD_DIR=$(abspath $(BUILD_DIR_BASE)/bootloader) BOOTLOADER_BIN=$(BOOTLOADER_BUILD_DIR)/bootloader.bin -BOOTLOADER_SDKCONFIG=$(BOOTLOADER_BUILD_DIR)/sdkconfig + +# signing key path is resolved relative to the project directory +SECURE_BOOT_SIGNING_KEY=$(abspath $(call dequote,$(CONFIG_SECURE_BOOT_SIGNING_KEY))) +export SECURE_BOOT_SIGNING_KEY # used by bootloader_support component # Custom recursive make for bootloader sub-project BOOTLOADER_MAKE=+$(MAKE) -C $(BOOTLOADER_COMPONENT_PATH)/src \ - V=$(V) SDKCONFIG=$(BOOTLOADER_SDKCONFIG) \ - BUILD_DIR_BASE=$(BOOTLOADER_BUILD_DIR) \ + V=$(V) BUILD_DIR_BASE=$(BOOTLOADER_BUILD_DIR) TEST_COMPONENTS= .PHONY: bootloader-clean bootloader-flash bootloader $(BOOTLOADER_BIN) -$(BOOTLOADER_BIN): | $(BOOTLOADER_BUILD_DIR)/sdkconfig - $(Q) $(BOOTLOADER_MAKE) $@ - -bootloader-clean: - $(Q) $(BOOTLOADER_MAKE) app-clean config-clean - $(Q) rm -f $(BOOTLOADER_SDKCONFIG) $(BOOTLOADER_SDKCONFIG).old +$(BOOTLOADER_BIN): $(SDKCONFIG_MAKEFILE) + $(BOOTLOADER_MAKE) $@ clean: bootloader-clean -bootloader: $(BOOTLOADER_BIN) - @echo "Bootloader built. Default flash command is:" - @echo "$(ESPTOOLPY_WRITE_FLASH) 0x1000 $(BOOTLOADER_BIN)" +ifdef CONFIG_SECURE_BOOTLOADER_DISABLED +# If secure boot disabled, bootloader flashing is integrated +# with 'make flash' and no warnings are printed. -all_binaries: $(BOOTLOADER_BIN) +bootloader: $(BOOTLOADER_BIN) + @echo $(SEPARATOR) + @echo "Bootloader built. Default flash command is:" + @echo "$(ESPTOOLPY_WRITE_FLASH) 0x1000 $^" ESPTOOL_ALL_FLASH_ARGS += 0x1000 $(BOOTLOADER_BIN) -# bootloader-flash calls flash in the bootloader dummy project bootloader-flash: $(BOOTLOADER_BIN) - $(BOOTLOADER_MAKE) flash + $(ESPTOOLPY_WRITE_FLASH) 0x1000 $^ -# synchronise the project level config to the bootloader's -# config -$(BOOTLOADER_SDKCONFIG): $(PROJECT_PATH)/sdkconfig | $(BOOTLOADER_BUILD_DIR) - $(Q) cp $< $@ +else ifdef CONFIG_SECURE_BOOTLOADER_ONE_TIME_FLASH + +#### TEMPORARILY DISABLE THIS OPTION +ifneq ("$(IDF_INSECURE_SECURE_BOOT)","1") +bootloader: + @echo "Secure boot features are not yet mature, so the current secure bootloader will not properly secure the device" + @echo "If you flash this bootloader, you will be left with an non-updateable bootloader that is missing features." + @echo "If you really want to do this, set the environment variable IDF_INSECURE_SECURE_BOOT=1 and rerun make." + exit 1 +else + +# One time flashing requires user to run esptool.py command themselves, +# and warning is printed about inability to reflash. + +bootloader: $(BOOTLOADER_BIN) + @echo $(SEPARATOR) + @echo "Bootloader built. One-time flash command is:" + @echo "$(ESPTOOLPY_WRITE_FLASH) 0x1000 $(BOOTLOADER_BIN)" + @echo $(SEPARATOR) + @echo "* IMPORTANT: After first boot, BOOTLOADER CANNOT BE RE-FLASHED on same device" + +endif # IDF_INSECURE_SECURE_BOOT +else ifdef CONFIG_SECURE_BOOTLOADER_REFLASHABLE +# Reflashable secure bootloader +# generates a digest binary (bootloader + digest) + +#### TEMPORARILY DISABLE THIS OPTION +ifneq ("$(IDF_INSECURE_SECURE_BOOT)","1") +bootloader: + @echo "Secure boot features are not yet mature, so the current secure bootloader will not properly secure the device." + @echo "If using this feature, expect to reflash the bootloader at least one more time." + @echo "If you really want to do this, set the environment variable IDF_INSECURE_SECURE_BOOT=1 and rerun make." + exit 1 +else + +BOOTLOADER_DIGEST_BIN := $(BOOTLOADER_BUILD_DIR)/bootloader-reflash-digest.bin +SECURE_BOOTLOADER_KEY := $(BOOTLOADER_BUILD_DIR)/secure-bootloader-key.bin + +$(SECURE_BOOTLOADER_KEY): $(SECURE_BOOT_SIGNING_KEY) + $(Q) $(ESPSECUREPY) digest_private_key -k $< $@ + +bootloader: $(BOOTLOADER_DIGEST_BIN) + @echo $(SEPARATOR) + @echo "Bootloader built and secure digest generated. First time flash command is:" + @echo "$(ESPEFUSEPY) burn_key secure_boot $(SECURE_BOOTLOADER_KEY)" + @echo "$(ESPTOOLPY_WRITE_FLASH) 0x1000 $(BOOTLOADER_BIN)" + @echo $(SEPARATOR) + @echo "To reflash the bootloader after initial flash:" + @echo "$(ESPTOOLPY_WRITE_FLASH) 0x0 $(BOOTLOADER_DIGEST_BIN)" + @echo $(SEPARATOR) + @echo "* After first boot, only re-flashes of this kind (with same key) will be accepted." + @echo "* Not recommended to re-use the same secure boot keyfile on multiple production devices." + +$(BOOTLOADER_DIGEST_BIN): $(BOOTLOADER_BIN) $(SECURE_BOOTLOADER_KEY) + @echo "DIGEST $(notdir $@)" + $(Q) $(ESPSECUREPY) digest_secure_bootloader -k $(SECURE_BOOTLOADER_KEY) -o $@ $< + +endif # IDF_INSECURE_SECURE_BOOT +else +bootloader: + @echo "Invalid bootloader target: bad sdkconfig?" + @exit 1 +endif + +all_binaries: $(BOOTLOADER_BIN) + +bootloader-clean: + $(BOOTLOADER_MAKE) app-clean + rm -f $(SECURE_BOOTLOADER_KEY) $(BOOTLOADER_DIGEST_BIN) $(BOOTLOADER_BUILD_DIR): - $(Q) mkdir -p $@ + mkdir -p $@ else -CFLAGS += -D BOOTLOADER_BUILD=1 -I $(IDF_PATH)/components/esp32/include +CFLAGS += -D BOOTLOADER_BUILD=1 -I $(IDF_PATH)/components/esp32/include endif diff --git a/components/bootloader/src/Makefile b/components/bootloader/src/Makefile index add9c15d6..bb4e64d0b 100644 --- a/components/bootloader/src/Makefile +++ b/components/bootloader/src/Makefile @@ -4,7 +4,10 @@ # PROJECT_NAME := bootloader -COMPONENTS := esptool_py bootloader log spi_flash + +#We cannot include the esp32 component directly but we need its includes. +#This is fixed by adding CFLAGS from Makefile.projbuild +COMPONENTS := esptool_py bootloader bootloader_support log spi_flash micro-ecc # The bootloader pseudo-component is also included in this build, for its Kconfig.projbuild to be included. # @@ -12,7 +15,7 @@ COMPONENTS := esptool_py bootloader log spi_flash IS_BOOTLOADER_BUILD := 1 export IS_BOOTLOADER_BUILD -#We cannot include the esp32 component directly but we need its includes. -#This is fixed by adding CFLAGS from Makefile.projbuild +# include the top-level "project" include directory, for sdkconfig.h +CFLAGS += -I$(BUILD_DIR_BASE)/../include include $(IDF_PATH)/make/project.mk diff --git a/components/bootloader/src/main/bootloader_config.h b/components/bootloader/src/main/bootloader_config.h index 8a837693c..4559d5f81 100644 --- a/components/bootloader/src/main/bootloader_config.h +++ b/components/bootloader/src/main/bootloader_config.h @@ -25,8 +25,6 @@ extern "C" #define BOOT_VERSION "V0.1" #define SPI_SEC_SIZE 0x1000 -#define MEM_CACHE(offset) (uint8_t *)(0x3f400000 + (offset)) -#define CACHE_READ_32(offset) ((uint32_t *)(0x3f400000 + (offset))) #define IROM_LOW 0x400D0000 #define IROM_HIGH 0x40400000 #define DROM_LOW 0x3F400000 @@ -36,7 +34,6 @@ extern "C" #define RTC_DATA_LOW 0x50000000 #define RTC_DATA_HIGH 0x50002000 - #define PART_TYPE_APP 0x00 #define PART_SUBTYPE_FACTORY 0x00 #define PART_SUBTYPE_OTA_FLAG 0x10 @@ -62,12 +59,7 @@ typedef struct { uint32_t selected_subtype; } bootloader_state_t; -void boot_cache_redirect( uint32_t pos, size_t size ); -uint32_t get_bin_len(uint32_t pos); - bool flash_encrypt(bootloader_state_t *bs); -bool secure_boot(void); - #ifdef __cplusplus } diff --git a/components/bootloader/src/main/bootloader_start.c b/components/bootloader/src/main/bootloader_start.c index 5b1e15207..6b92aaf34 100644 --- a/components/bootloader/src/main/bootloader_start.c +++ b/components/bootloader/src/main/bootloader_start.c @@ -33,6 +33,9 @@ #include "soc/timer_group_reg.h" #include "sdkconfig.h" +#include "esp_image_format.h" +#include "esp_secure_boot.h" +#include "bootloader_flash.h" #include "bootloader_config.h" @@ -49,9 +52,9 @@ flash cache is down and the app CPU is in reset. We do have a stack, so we can d extern void Cache_Flush(int); void bootloader_main(); -void unpack_load_app(const esp_partition_pos_t *app_node); +static void unpack_load_app(const esp_partition_pos_t *app_node); void print_flash_info(const esp_image_header_t* pfhdr); -void IRAM_ATTR set_cache_and_start_app(uint32_t drom_addr, +void set_cache_and_start_app(uint32_t drom_addr, uint32_t drom_load_addr, uint32_t drom_size, uint32_t irom_addr, @@ -94,53 +97,6 @@ void IRAM_ATTR call_start_cpu0() bootloader_main(); } -/** - * @function : get_bin_len - * @description: get bin's length - * - * @inputs: pos bin locate address in flash - * @return: uint32 length of bin,if bin MAGIC error return 0 - */ - -uint32_t get_bin_len(uint32_t pos) -{ - uint32_t len = 8 + 16; - uint8_t i; - ESP_LOGD(TAG, "pos %d %x",pos,*(uint8_t *)pos); - if(0xE9 != *(uint8_t *)pos) { - return 0; - } - for (i = 0; i < *(uint8_t *)(pos + 1); i++) { - len += *(uint32_t *)(pos + len + 4) + 8; - } - if (len % 16 != 0) { - len = (len / 16 + 1) * 16; - } else { - len += 16; - } - ESP_LOGD(TAG, "bin length = %d", len); - return len; -} - -/** - * @function : boot_cache_redirect - * @description: Configure several pages in flash map so that `size` bytes - * starting at `pos` are mapped to 0x3f400000. - * This sets up mapping only for PRO CPU. - * - * @inputs: pos address in flash - * size size of the area to map, in bytes - */ -void boot_cache_redirect( uint32_t pos, size_t size ) -{ - uint32_t pos_aligned = pos & 0xffff0000; - uint32_t count = (size + 0xffff) / 0x10000; - Cache_Read_Disable( 0 ); - Cache_Flush( 0 ); - ESP_LOGD(TAG, "mmu set paddr=%08x count=%d", pos_aligned, count ); - cache_flash_mmu_set( 0, 0, 0x3f400000, pos_aligned, 64, count ); - Cache_Read_Enable( 0 ); -} /** * @function : load_partition_table @@ -148,85 +104,103 @@ void boot_cache_redirect( uint32_t pos, size_t size ) * OTA info sector, factory app sector, and test app sector. * * @inputs: bs bootloader state structure used to save the data - * addr address of partition table in flash * @return: return true, if the partition table is loaded (and MD5 checksum is valid) * */ -bool load_partition_table(bootloader_state_t* bs, uint32_t addr) +bool load_partition_table(bootloader_state_t* bs) { - esp_partition_info_t partition; - uint32_t end = addr + 0x1000; - int index = 0; + const esp_partition_info_t *partitions; + const int ESP_PARTITION_TABLE_DATA_LEN = 0xC00; /* length of actual data (signature is appended to this) */ + const int MAX_PARTITIONS = ESP_PARTITION_TABLE_DATA_LEN / sizeof(esp_partition_info_t); char *partition_usage; ESP_LOGI(TAG, "Partition Table:"); ESP_LOGI(TAG, "## Label Usage Type ST Offset Length"); - while (addr < end) { - ESP_LOGD(TAG, "load partition table entry from %x(%08x)", addr, MEM_CACHE(addr)); - memcpy(&partition, MEM_CACHE(addr), sizeof(partition)); - ESP_LOGD(TAG, "type=%x subtype=%x", partition.type, partition.subtype); +#ifdef CONFIG_SECURE_BOOTLOADER_ENABLED + if(esp_secure_boot_enabled()) { + ESP_LOGI(TAG, "Verifying partition table signature..."); + esp_err_t err = esp_secure_boot_verify_signature(ESP_PARTITION_TABLE_ADDR, ESP_PARTITION_TABLE_DATA_LEN); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to verify partition table signature."); + return false; + } + ESP_LOGD(TAG, "Partition table signature verified"); + } +#endif + + partitions = bootloader_mmap(ESP_PARTITION_TABLE_ADDR, ESP_PARTITION_TABLE_DATA_LEN); + if (!partitions) { + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", ESP_PARTITION_TABLE_ADDR, ESP_PARTITION_TABLE_DATA_LEN); + return false; + } + ESP_LOGD(TAG, "mapped partition table 0x%x at 0x%x", ESP_PARTITION_TABLE_ADDR, (intptr_t)partitions); + + for(int i = 0; i < MAX_PARTITIONS; i++) { + const esp_partition_info_t *partition = &partitions[i]; + ESP_LOGD(TAG, "load partition table entry 0x%x", (intptr_t)partition); + ESP_LOGD(TAG, "type=%x subtype=%x", partition->type, partition->subtype); partition_usage = "unknown"; - if (partition.magic == ESP_PARTITION_MAGIC) { /* valid partition definition */ - switch(partition.type) { - case PART_TYPE_APP: /* app partition */ - switch(partition.subtype) { - case PART_SUBTYPE_FACTORY: /* factory binary */ - bs->factory = partition.pos; - partition_usage = "factory app"; - break; - case PART_SUBTYPE_TEST: /* test binary */ - bs->test = partition.pos; - partition_usage = "test app"; - break; - default: - /* OTA binary */ - if ((partition.subtype & ~PART_SUBTYPE_OTA_MASK) == PART_SUBTYPE_OTA_FLAG) { - bs->ota[partition.subtype & PART_SUBTYPE_OTA_MASK] = partition.pos; - ++bs->app_count; - partition_usage = "OTA app"; - } - else { - partition_usage = "Unknown app"; - } - break; + if (partition->magic != ESP_PARTITION_MAGIC) { + /* invalid partition definition indicates end-of-table */ + break; + } + + /* valid partition table */ + switch(partition->type) { + case PART_TYPE_APP: /* app partition */ + switch(partition->subtype) { + case PART_SUBTYPE_FACTORY: /* factory binary */ + bs->factory = partition->pos; + partition_usage = "factory app"; + break; + case PART_SUBTYPE_TEST: /* test binary */ + bs->test = partition->pos; + partition_usage = "test app"; + break; + default: + /* OTA binary */ + if ((partition->subtype & ~PART_SUBTYPE_OTA_MASK) == PART_SUBTYPE_OTA_FLAG) { + bs->ota[partition->subtype & PART_SUBTYPE_OTA_MASK] = partition->pos; + ++bs->app_count; + partition_usage = "OTA app"; } - break; /* PART_TYPE_APP */ - case PART_TYPE_DATA: /* data partition */ - switch(partition.subtype) { - case PART_SUBTYPE_DATA_OTA: /* ota data */ - bs->ota_info = partition.pos; - partition_usage = "OTA data"; - break; - case PART_SUBTYPE_DATA_RF: - partition_usage = "RF data"; - break; - case PART_SUBTYPE_DATA_WIFI: - partition_usage = "WiFi data"; - break; - default: - partition_usage = "Unknown data"; - break; + else { + partition_usage = "Unknown app"; } - break; /* PARTITION_USAGE_DATA */ - default: /* other partition type */ break; } - } - /* invalid partition magic number */ - else { - break; /* todo: validate md5 */ + break; /* PART_TYPE_APP */ + case PART_TYPE_DATA: /* data partition */ + switch(partition->subtype) { + case PART_SUBTYPE_DATA_OTA: /* ota data */ + bs->ota_info = partition->pos; + partition_usage = "OTA data"; + break; + case PART_SUBTYPE_DATA_RF: + partition_usage = "RF data"; + break; + case PART_SUBTYPE_DATA_WIFI: + partition_usage = "WiFi data"; + break; + default: + partition_usage = "Unknown data"; + break; + } + break; /* PARTITION_USAGE_DATA */ + default: /* other partition type */ + break; } /* print partition type info */ - ESP_LOGI(TAG, "%2d %-16s %-16s %02x %02x %08x %08x", index, partition.label, partition_usage, - partition.type, partition.subtype, - partition.pos.offset, partition.pos.size); - index++; - addr += sizeof(partition); + ESP_LOGI(TAG, "%2d %-16s %-16s %02x %02x %08x %08x", i, partition->label, partition_usage, + partition->type, partition->subtype, + partition->pos.offset, partition->pos.size); } + bootloader_munmap(partitions); + ESP_LOGI(TAG,"End of partition table"); return true; } @@ -254,8 +228,10 @@ void bootloader_main() esp_image_header_t fhdr; bootloader_state_t bs; - SpiFlashOpResult spiRet1,spiRet2; + SpiFlashOpResult spiRet1,spiRet2; esp_ota_select_entry_t sa,sb; + const esp_ota_select_entry_t *ota_select_map; + memset(&bs, 0, sizeof(bs)); ESP_LOGI(TAG, "compile time " __TIME__ ); @@ -263,16 +239,17 @@ void bootloader_main() REG_CLR_BIT( RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_FLASHBOOT_MOD_EN ); REG_CLR_BIT( TIMG_WDTCONFIG0_REG(0), TIMG_WDT_FLASHBOOT_MOD_EN ); SPIUnlock(); - /*register first sector in drom0 page 0 */ - boot_cache_redirect( 0, 0x5000 ); - memcpy((unsigned int *) &fhdr, MEM_CACHE(0x1000), sizeof(esp_image_header_t) ); + if(esp_image_load_header(0x1000, &fhdr) != ESP_OK) { + ESP_LOGE(TAG, "failed to load bootloader header!"); + return; + } print_flash_info(&fhdr); update_flash_config(&fhdr); - if (!load_partition_table(&bs, ESP_PARTITION_TABLE_ADDR)) { + if (!load_partition_table(&bs)) { ESP_LOGE(TAG, "load partition table error!"); return; } @@ -281,9 +258,19 @@ void bootloader_main() if (bs.ota_info.offset != 0) { // check if partition table has OTA info partition //ESP_LOGE("OTA info sector handling is not implemented"); - boot_cache_redirect(bs.ota_info.offset, bs.ota_info.size ); - memcpy(&sa,MEM_CACHE(bs.ota_info.offset & 0x0000ffff),sizeof(sa)); - memcpy(&sb,MEM_CACHE((bs.ota_info.offset + 0x1000)&0x0000ffff) ,sizeof(sb)); + if (bs.ota_info.size < 2 * sizeof(esp_ota_select_entry_t)) { + ESP_LOGE(TAG, "ERROR: ota_info partition size %d is too small (minimum %d bytes)", bs.ota_info.size, sizeof(esp_ota_select_entry_t)); + return; + } + ota_select_map = bootloader_mmap(bs.ota_info.offset, bs.ota_info.size); + if (!ota_select_map) { + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", bs.ota_info.offset, bs.ota_info.size); + return; + } + sa = ota_select_map[0]; + sb = ota_select_map[1]; + bootloader_munmap(ota_select_map); + if(sa.ota_seq == 0xFFFFFFFF && sb.ota_seq == 0xFFFFFFFF) { // init status flash load_part_pos = bs.ota[0]; @@ -329,35 +316,61 @@ void bootloader_main() } ESP_LOGI(TAG, "Loading app partition at offset %08x", load_part_pos); - if(fhdr.secure_boot_flag == 0x01) { - /* protect the 2nd_boot */ - if(false == secure_boot()){ - ESP_LOGE(TAG, "secure boot failed"); - return; - } + +#ifdef CONFIG_SECURE_BOOTLOADER_ENABLED + /* Generate secure digest from this bootloader to protect future + modifications */ + esp_err_t err = esp_secure_boot_permanently_enable(); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Bootloader digest generation failed (%d). SECURE BOOT IS NOT ENABLED.", err); + /* Allow booting to continue, as the failure is probably + due to user-configured EFUSEs for testing... + */ } +#endif if(fhdr.encrypt_flag == 0x01) { - /* encrypt flash */ + /* encrypt flash */ if (false == flash_encrypt(&bs)) { ESP_LOGE(TAG, "flash encrypt failed"); return; } } - // copy sections to RAM, set up caches, and start application + // copy loaded segments to RAM, set up caches for mapped segments, and start application unpack_load_app(&load_part_pos); } -void unpack_load_app(const esp_partition_pos_t* partition) +static void unpack_load_app(const esp_partition_pos_t* partition) { - boot_cache_redirect(partition->offset, partition->size); - - uint32_t pos = 0; + esp_err_t err; esp_image_header_t image_header; - memcpy(&image_header, MEM_CACHE(pos), sizeof(image_header)); - pos += sizeof(image_header); + uint32_t image_length; + + /* TODO: verify the app image as part of OTA boot decision, so can have fallbacks */ + err = esp_image_basic_verify(partition->offset, &image_length); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to verify app image @ 0x%x (%d)", partition->offset, err); + return; + } + +#ifdef CONFIG_SECURE_BOOTLOADER_ENABLED + if (esp_secure_boot_enabled()) { + ESP_LOGI(TAG, "Verifying app signature @ 0x%x (length 0x%x)", partition->offset, image_length); + err = esp_secure_boot_verify_signature(partition->offset, image_length); + if (err != ESP_OK) { + ESP_LOGE(TAG, "App image @ 0x%x failed signature verification (%d)", partition->offset, err); + return; + } + ESP_LOGD(TAG, "App signature is valid"); + } +#endif + + if (esp_image_load_header(partition->offset, &image_header) != ESP_OK) { + ESP_LOGE(TAG, "Failed to load app image header @ 0x%x", partition->offset); + return; + } uint32_t drom_addr = 0; uint32_t drom_load_addr = 0; @@ -366,24 +379,27 @@ void unpack_load_app(const esp_partition_pos_t* partition) uint32_t irom_load_addr = 0; uint32_t irom_size = 0; - /* Reload the RTC memory sections whenever a non-deepsleep reset + /* Reload the RTC memory segments whenever a non-deepsleep reset is occurring */ bool load_rtc_memory = rtc_get_reset_reason(0) != DEEPSLEEP_RESET; ESP_LOGD(TAG, "bin_header: %u %u %u %u %08x", image_header.magic, - image_header.blocks, + image_header.segment_count, image_header.spi_mode, image_header.spi_size, (unsigned)image_header.entry_addr); - for (uint32_t section_index = 0; - section_index < image_header.blocks; - ++section_index) { - esp_image_section_header_t section_header = {0}; - memcpy(§ion_header, MEM_CACHE(pos), sizeof(section_header)); - pos += sizeof(section_header); + for (int segment = 0; segment < image_header.segment_count; segment++) { + esp_image_segment_header_t segment_header; + uint32_t data_offs; + if(esp_image_load_segment_header(segment, partition->offset, + &image_header, &segment_header, + &data_offs) != ESP_OK) { + ESP_LOGE(TAG, "failed to load segment header #%d", segment); + return; + } - const uint32_t address = section_header.load_addr; + const uint32_t address = segment_header.load_addr; bool load = true; bool map = false; if (address == 0x00000000) { // padding, ignore block @@ -395,47 +411,50 @@ void unpack_load_app(const esp_partition_pos_t* partition) } if (address >= DROM_LOW && address < DROM_HIGH) { - ESP_LOGD(TAG, "found drom section, map from %08x to %08x", pos, - section_header.load_addr); - drom_addr = partition->offset + pos - sizeof(section_header); - drom_load_addr = section_header.load_addr; - drom_size = section_header.data_len + sizeof(section_header); + ESP_LOGD(TAG, "found drom segment, map from %08x to %08x", data_offs, + segment_header.load_addr); + drom_addr = data_offs; + drom_load_addr = segment_header.load_addr; + drom_size = segment_header.data_len + sizeof(segment_header); load = false; map = true; } if (address >= IROM_LOW && address < IROM_HIGH) { - ESP_LOGD(TAG, "found irom section, map from %08x to %08x", pos, - section_header.load_addr); - irom_addr = partition->offset + pos - sizeof(section_header); - irom_load_addr = section_header.load_addr; - irom_size = section_header.data_len + sizeof(section_header); + ESP_LOGD(TAG, "found irom segment, map from %08x to %08x", data_offs, + segment_header.load_addr); + irom_addr = data_offs; + irom_load_addr = segment_header.load_addr; + irom_size = segment_header.data_len + sizeof(segment_header); load = false; map = true; } if (!load_rtc_memory && address >= RTC_IRAM_LOW && address < RTC_IRAM_HIGH) { - ESP_LOGD(TAG, "Skipping RTC code section at %08x\n", pos); + ESP_LOGD(TAG, "Skipping RTC code segment at %08x\n", data_offs); load = false; } if (!load_rtc_memory && address >= RTC_DATA_LOW && address < RTC_DATA_HIGH) { - ESP_LOGD(TAG, "Skipping RTC data section at %08x\n", pos); + ESP_LOGD(TAG, "Skipping RTC data segment at %08x\n", data_offs); load = false; } - ESP_LOGI(TAG, "section %d: paddr=0x%08x vaddr=0x%08x size=0x%05x (%6d) %s", section_index, pos, - section_header.load_addr, section_header.data_len, section_header.data_len, (load)?"load":(map)?"map":""); + ESP_LOGI(TAG, "segment %d: paddr=0x%08x vaddr=0x%08x size=0x%05x (%6d) %s", segment, data_offs - sizeof(esp_image_segment_header_t), + segment_header.load_addr, segment_header.data_len, segment_header.data_len, (load)?"load":(map)?"map":""); - if (!load) { - pos += section_header.data_len; - continue; + if (load) { + const void *data = bootloader_mmap(data_offs, segment_header.data_len); + if(!data) { + ESP_LOGE(TAG, "bootloader_mmap(0x%xc, 0x%x) failed", + data_offs, segment_header.data_len); + return; + } + memcpy((void *)segment_header.load_addr, data, segment_header.data_len); + bootloader_munmap(data); } - - memcpy((void*) section_header.load_addr, MEM_CACHE(pos), section_header.data_len); - pos += section_header.data_len; } - + set_cache_and_start_app(drom_addr, drom_load_addr, drom_size, @@ -445,7 +464,7 @@ void unpack_load_app(const esp_partition_pos_t* partition) image_header.entry_addr); } -void IRAM_ATTR set_cache_and_start_app( +void set_cache_and_start_app( uint32_t drom_addr, uint32_t drom_load_addr, uint32_t drom_size, @@ -456,9 +475,7 @@ void IRAM_ATTR set_cache_and_start_app( { ESP_LOGD(TAG, "configure drom and irom and start"); Cache_Read_Disable( 0 ); - Cache_Read_Disable( 1 ); Cache_Flush( 0 ); - Cache_Flush( 1 ); uint32_t drom_page_count = (drom_size + 64*1024 - 1) / (64*1024); // round up to 64k ESP_LOGV(TAG, "d mmu set paddr=%08x vaddr=%08x size=%d n=%d", drom_addr & 0xffff0000, drom_load_addr & 0xffff0000, drom_size, drom_page_count ); int rc = cache_flash_mmu_set( 0, 0, drom_load_addr & 0xffff0000, drom_addr & 0xffff0000, 64, drom_page_count ); @@ -474,7 +491,8 @@ void IRAM_ATTR set_cache_and_start_app( REG_CLR_BIT( DPORT_PRO_CACHE_CTRL1_REG, (DPORT_PRO_CACHE_MASK_IRAM0) | (DPORT_PRO_CACHE_MASK_IRAM1 & 0) | (DPORT_PRO_CACHE_MASK_IROM0 & 0) | DPORT_PRO_CACHE_MASK_DROM0 | DPORT_PRO_CACHE_MASK_DRAM1 ); REG_CLR_BIT( DPORT_APP_CACHE_CTRL1_REG, (DPORT_APP_CACHE_MASK_IRAM0) | (DPORT_APP_CACHE_MASK_IRAM1 & 0) | (DPORT_APP_CACHE_MASK_IROM0 & 0) | DPORT_APP_CACHE_MASK_DROM0 | DPORT_APP_CACHE_MASK_DRAM1 ); Cache_Read_Enable( 0 ); - Cache_Read_Enable( 1 ); + + // Application will need to do Cache_Flush(1) and Cache_Read_Enable(1) ESP_LOGD(TAG, "start: 0x%08x", entry_addr); typedef void (*entry_t)(void); @@ -521,7 +539,7 @@ void print_flash_info(const esp_image_header_t* phdr) #if (BOOT_LOG_LEVEL >= BOOT_LOG_LEVEL_NOTICE) ESP_LOGD(TAG, "magic %02x", phdr->magic ); - ESP_LOGD(TAG, "blocks %02x", phdr->blocks ); + ESP_LOGD(TAG, "segments %02x", phdr->segment_count ); ESP_LOGD(TAG, "spi_mode %02x", phdr->spi_mode ); ESP_LOGD(TAG, "spi_speed %02x", phdr->spi_speed ); ESP_LOGD(TAG, "spi_size %02x", phdr->spi_size ); diff --git a/components/bootloader/src/main/component.mk b/components/bootloader/src/main/component.mk index 8c8ea4cb6..01b07b949 100644 --- a/components/bootloader/src/main/component.mk +++ b/components/bootloader/src/main/component.mk @@ -1,12 +1,9 @@ # -# Main Makefile. This is basically the same as a component makefile. +# Main bootloader Makefile. # -# This Makefile should, at the very least, just include $(IDF_PATH)/make/component_common.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the esp-idf build system document if you need to do this. +# This is basically the same as a component makefile, but in the case of the bootloader +# we pull in bootloader-specific linker arguments. # -COMPONENT_ADD_LDFLAGS := -L $(abspath .) -lmain -T esp32.bootloader.ld -T $(IDF_PATH)/components/esp32/ld/esp32.rom.ld +COMPONENT_ADD_LDFLAGS := -L $(COMPONENT_PATH) -lmain -T esp32.bootloader.ld -T $(IDF_PATH)/components/esp32/ld/esp32.rom.ld -include $(IDF_PATH)/make/component_common.mk diff --git a/components/bootloader/src/main/esp32.bootloader.ld b/components/bootloader/src/main/esp32.bootloader.ld index 58935fe50..6a77eb6ad 100644 --- a/components/bootloader/src/main/esp32.bootloader.ld +++ b/components/bootloader/src/main/esp32.bootloader.ld @@ -15,7 +15,7 @@ MEMORY of the various regions. The 'data access port' dram/drom regions map to the same iram/irom regions but are connected to the data port of the CPU and eg allow bytewise access. */ dport0_seg (RW) : org = 0x3FF00000, len = 0x10 /* IO */ - iram_seg (RWX) : org = 0x4009A000, len = 0x1000 + iram_seg (RWX) : org = 0x40080000, len = 0x400 /* 1k of IRAM used by bootloader functions which need to flush/enable APP CPU cache */ iram_pool_1_seg (RWX) : org = 0x40078000, len = 0x8000 /* IRAM POOL1, used for APP CPU cache. We can abuse it in bootloader because APP CPU is still held in reset, until we enable APP CPU cache */ dram_seg (RW) : org = 0x3FFC0000, len = 0x20000 /* Shared RAM, minus rom bss/data/stack.*/ } diff --git a/components/bootloader/src/main/flash_encrypt.c b/components/bootloader/src/main/flash_encrypt.c index 2fb57a987..2b1479097 100644 --- a/components/bootloader/src/main/flash_encrypt.c +++ b/components/bootloader/src/main/flash_encrypt.c @@ -17,6 +17,7 @@ #include "esp_types.h" #include "esp_attr.h" #include "esp_log.h" +#include "esp_err.h" #include "rom/cache.h" #include "rom/ets_sys.h" @@ -30,6 +31,7 @@ #include "sdkconfig.h" #include "bootloader_config.h" +#include "esp_image_format.h" static const char* TAG = "flash_encrypt"; @@ -90,103 +92,97 @@ bool flash_encrypt_write(uint32_t pos, uint32_t len) Cache_Read_Enable(0); return true; } + + /** * @function : flash_encrypt * @description: encrypt 2nd boot ,partition table ,factory bin ��test bin (if use)��ota bin * ��OTA info sector. * * @inputs: bs bootloader state structure used to save the data - * + * * @return: return true, if the encrypt flash success - * + * */ bool flash_encrypt(bootloader_state_t *bs) { - uint32_t bin_len = 0; - uint32_t flash_crypt_cnt = REG_GET_FIELD(EFUSE_BLK0_RDATA0_REG, EFUSE_FLASH_CRYPT_CNT); - uint8_t count = bitcount(flash_crypt_cnt); - int i = 0; - ESP_LOGD(TAG, "flash encrypt cnt %x, bitcount %d", flash_crypt_cnt, count); + esp_err_t err; + uint32_t image_len = 0; + uint32_t flash_crypt_cnt = REG_GET_FIELD(EFUSE_BLK0_RDATA0_REG, EFUSE_FLASH_CRYPT_CNT); + uint8_t count = bitcount(flash_crypt_cnt); + ESP_LOGD(TAG, "flash encrypt cnt %x, bitcount %d", flash_crypt_cnt, count); - if ((count % 2) == 0) { - boot_cache_redirect( 0, 64*1024); - /* encrypt iv and abstruct */ - if (false == flash_encrypt_write(0, SPI_SEC_SIZE)) { - ESP_LOGE(TAG, "encrypt iv and abstract error"); - return false; - } + if ((count % 2) == 0) { + /* encrypt iv and abstract */ + if (false == flash_encrypt_write(0, SPI_SEC_SIZE)) { + ESP_LOGE(TAG, "encrypt iv and abstract error"); + return false; + } + + /* encrypt bootloader image */ + err = esp_image_basic_verify(0x1000, &image_len); + if(err == ESP_OK && image_len != 0) { + if (false == flash_encrypt_write(0x1000, image_len)) { + ESP_LOGE(TAG, "encrypt 2nd boot error"); + return false; + } + } else { + ESP_LOGE(TAG, "2nd boot len error"); + return false; + } - /* encrypt write boot bin*/ - bin_len = get_bin_len((uint32_t)MEM_CACHE(0x1000)); - if(bin_len != 0) { - if (false == flash_encrypt_write(0x1000, bin_len)) { - ESP_LOGE(TAG, "encrypt 2nd boot error"); - return false; - } - } else { - ESP_LOGE(TAG, "2nd boot len error"); - return false; - } /* encrypt partition table */ - if (false == flash_encrypt_write(ESP_PARTITION_TABLE_ADDR, SPI_SEC_SIZE)) { - ESP_LOGE(TAG, "encrypt partition table error"); - return false; - } + if (false == flash_encrypt_write(ESP_PARTITION_TABLE_ADDR, SPI_SEC_SIZE)) { + ESP_LOGE(TAG, "encrypt partition table error"); + return false; + } /* encrypt write factory bin */ - if(bs->factory.offset != 0x00) { - ESP_LOGD(TAG, "have factory bin"); - boot_cache_redirect(bs->factory.offset, bs->factory.size); - bin_len = get_bin_len((uint32_t)MEM_CACHE(bs->factory.offset&0xffff)); - if(bin_len != 0) { - if (false == flash_encrypt_write(bs->factory.offset, bin_len)) { - ESP_LOGE(TAG, "encrypt factory bin error"); - return false; - } - } - } + if(bs->factory.offset != 0 && bs->factory.size != 0) { + ESP_LOGD(TAG, "have factory bin"); + if (false == flash_encrypt_write(bs->factory.offset, bs->factory.size)) { + ESP_LOGE(TAG, "encrypt factory bin error"); + return false; + } + } + /* encrypt write test bin */ - if(bs->test.offset != 0x00) { - ESP_LOGD(TAG, "have test bin"); - boot_cache_redirect(bs->test.offset, bs->test.size); - bin_len = get_bin_len((uint32_t)MEM_CACHE(bs->test.offset&0xffff)); - if(bin_len != 0) { - if (false == flash_encrypt_write(bs->test.offset, bin_len)) { - ESP_LOGE(TAG, "encrypt test bin error"); - return false; - } - } - } + if(bs->test.offset != 0 && bs->test.size != 0) { + ESP_LOGD(TAG, "have test bin"); + if (false == flash_encrypt_write(bs->test.offset, bs->test.size)) { + ESP_LOGE(TAG, "encrypt test bin error"); + return false; + } + } + /* encrypt write ota bin */ - for (i = 0;i<16;i++) { - if(bs->ota[i].offset != 0x00) { - ESP_LOGD(TAG, "have ota[%d] bin",i); - boot_cache_redirect(bs->ota[i].offset, bs->ota[i].size); - bin_len = get_bin_len((uint32_t)MEM_CACHE(bs->ota[i].offset&0xffff)); - if(bin_len != 0) { - if (false == flash_encrypt_write(bs->ota[i].offset, bin_len)) { - ESP_LOGE(TAG, "encrypt ota bin error"); - return false; - } - } - } - } + for (int i = 0; i < 16; i++) { + if(bs->ota[i].offset != 0 && bs->ota[i].size != 0) { + ESP_LOGD(TAG, "have ota[%d] bin",i); + if (false == flash_encrypt_write(bs->ota[i].offset, bs->ota[i].size)) { + ESP_LOGE(TAG, "encrypt ota bin error"); + return false; + } + } + } + /* encrypt write ota info bin */ - if (false == flash_encrypt_write(bs->ota_info.offset, 2*SPI_SEC_SIZE)) { - ESP_LOGE(TAG, "encrypt ota info error"); - return false; - } - REG_SET_FIELD(EFUSE_BLK0_WDATA0_REG, EFUSE_FLASH_CRYPT_CNT, 0x04); - REG_WRITE(EFUSE_CONF_REG, 0x5A5A); /* efuse_pgm_op_ena, force no rd/wr disable */ - REG_WRITE(EFUSE_CMD_REG, 0x02); /* efuse_pgm_cmd */ - while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_pagm_cmd=0 */ - ESP_LOGW(TAG, "burn flash_crypt_cnt"); - REG_WRITE(EFUSE_CONF_REG, 0x5AA5); /* efuse_read_op_ena, release force */ - REG_WRITE(EFUSE_CMD_REG, 0x01); /* efuse_read_cmd */ - while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_read_cmd=0 */ - return true; - } else { - ESP_LOGI(TAG, "flash already encrypted."); - return true; - } + if (false == flash_encrypt_write(bs->ota_info.offset, 2*SPI_SEC_SIZE)) { + ESP_LOGE(TAG, "encrypt ota info error"); + return false; + } + + REG_SET_FIELD(EFUSE_BLK0_WDATA0_REG, EFUSE_FLASH_CRYPT_CNT, 0x04); + REG_WRITE(EFUSE_CONF_REG, 0x5A5A); /* efuse_pgm_op_ena, force no rd/wr disable */ + REG_WRITE(EFUSE_CMD_REG, 0x02); /* efuse_pgm_cmd */ + while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_pagm_cmd=0 */ + ESP_LOGW(TAG, "burn flash_crypt_cnt"); + REG_WRITE(EFUSE_CONF_REG, 0x5AA5); /* efuse_read_op_ena, release force */ + REG_WRITE(EFUSE_CMD_REG, 0x01); /* efuse_read_cmd */ + while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_read_cmd=0 */ + return true; + } else { + ESP_LOGI(TAG, "flash already encrypted."); + return true; + } } diff --git a/components/bootloader/src/main/secure_boot.c b/components/bootloader/src/main/secure_boot.c deleted file mode 100644 index 3dfdbd141..000000000 --- a/components/bootloader/src/main/secure_boot.c +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2015-2016 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. - -#include - -#include "esp_attr.h" -#include "esp_types.h" -#include "esp_log.h" - -#include "rom/cache.h" -#include "rom/ets_sys.h" -#include "rom/spi_flash.h" -#include "rom/secure_boot.h" - -#include "soc/dport_reg.h" -#include "soc/io_mux_reg.h" -#include "soc/efuse_reg.h" -#include "soc/rtc_cntl_reg.h" - -#include "sdkconfig.h" - -#include "bootloader_config.h" - -static const char* TAG = "secure_boot"; - -/** - * @function : secure_boot_generate - * @description: generate boot abstract & iv - * - * @inputs: bool - */ -bool secure_boot_generate(uint32_t bin_len){ - SpiFlashOpResult spiRet; - uint16_t i; - uint32_t buf[32]; - if (bin_len % 128 != 0) { - bin_len = (bin_len / 128 + 1) * 128; - } - ets_secure_boot_start(); - ets_secure_boot_rd_iv(buf); - ets_secure_boot_hash(NULL); - Cache_Read_Disable(0); - /* iv stored in sec 0 */ - spiRet = SPIEraseSector(0); - if (spiRet != SPI_FLASH_RESULT_OK) - { - ESP_LOGE(TAG, SPI_ERROR_LOG); - return false; - } - /* write iv to flash, 0x0000, 128 bytes (1024 bits) */ - spiRet = SPIWrite(0, buf, 128); - if (spiRet != SPI_FLASH_RESULT_OK) - { - ESP_LOGE(TAG, SPI_ERROR_LOG); - return false; - } - ESP_LOGD(TAG, "write iv to flash."); - Cache_Read_Enable(0); - /* read 4K code image from flash, for test */ - for (i = 0; i < bin_len; i+=128) { - ets_secure_boot_hash((uint32_t *)(0x3f400000 + 0x1000 + i)); - } - - ets_secure_boot_obtain(); - ets_secure_boot_rd_abstract(buf); - ets_secure_boot_finish(); - Cache_Read_Disable(0); - /* write abstract to flash, 0x0080, 64 bytes (512 bits) */ - spiRet = SPIWrite(0x80, buf, 64); - if (spiRet != SPI_FLASH_RESULT_OK) { - ESP_LOGE(TAG, SPI_ERROR_LOG); - return false; - } - ESP_LOGD(TAG, "write abstract to flash."); - Cache_Read_Enable(0); - return true; -} - - -/** - * @function : secure_boot - * @description: protect boot code in flash - * - * @inputs: bool - */ -bool secure_boot(void){ - uint32_t bin_len = 0; - if (REG_READ(EFUSE_BLK0_RDATA6_REG) & EFUSE_RD_ABS_DONE_0) - { - ESP_LOGD(TAG, "already secure boot !"); - return true; - } else { - boot_cache_redirect( 0, 64*1024); - bin_len = get_bin_len((uint32_t)MEM_CACHE(0x1000)); - if (bin_len == 0) { - ESP_LOGE(TAG, "boot len is error"); - return false; - } - if (false == secure_boot_generate(bin_len)){ - ESP_LOGE(TAG, "secure boot generate failed"); - return false; - } - } - - REG_SET_BIT(EFUSE_BLK0_WDATA6_REG, EFUSE_RD_ABS_DONE_0); - REG_WRITE(EFUSE_CONF_REG, 0x5A5A); /* efuse_pgm_op_ena, force no rd/wr disable */ - REG_WRITE(EFUSE_CMD_REG, 0x02); /* efuse_pgm_cmd */ - while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_pagm_cmd=0 */ - ESP_LOGW(TAG, "burn abstract_done_0"); - REG_WRITE(EFUSE_CONF_REG, 0x5AA5); /* efuse_read_op_ena, release force */ - REG_WRITE(EFUSE_CMD_REG, 0x01); /* efuse_read_cmd */ - while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_read_cmd=0 */ - ESP_LOGI(TAG, "read EFUSE_BLK0_RDATA6 %x", REG_READ(EFUSE_BLK0_RDATA6_REG)); - return true; - -} diff --git a/components/bootloader_support/README.rst b/components/bootloader_support/README.rst new file mode 100644 index 000000000..54ac861c9 --- /dev/null +++ b/components/bootloader_support/README.rst @@ -0,0 +1,9 @@ +Bootloader Support Component +============================ + +Overview +-------- + +"Bootloader support" contains APIs which are used by the bootloader but are also needed for the main app. + +Code in this component needs to be aware of being executed in a bootloader environment (no RTOS available, BOOTLOADER_BUILD macro set) or in an esp-idf app environment (RTOS running, need locking support.) diff --git a/components/bootloader_support/component.mk b/components/bootloader_support/component.mk new file mode 100755 index 000000000..a7e5b849d --- /dev/null +++ b/components/bootloader_support/component.mk @@ -0,0 +1,35 @@ +COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_PRIV_INCLUDEDIRS := include_priv + +ifdef IS_BOOTLOADER_BUILD +# share "private" headers with the bootloader component +# eventual goal: all functionality that needs this lives in bootloader_support +COMPONENT_ADD_INCLUDEDIRS += include_priv +endif + +COMPONENT_SRCDIRS := src + +# +# Secure boot signing key support +# +ifdef CONFIG_SECURE_BOOTLOADER_ENABLED + +# this path is created relative to the component build directory +SECURE_BOOT_VERIFICATION_KEY := $(abspath signature_verification_key.bin) + +$(SECURE_BOOT_SIGNING_KEY): + @echo "Need to generate secure boot signing key." + @echo "One way is to run this command:" + @echo "$(ESPSECUREPY) generate_signing_key $@" + @echo "Keep key file safe after generating." + @echo "(See secure boot documentation for risks & alternatives.)" + @exit 1 + +$(SECURE_BOOT_VERIFICATION_KEY): $(SECURE_BOOT_SIGNING_KEY) + $(ESPSECUREPY) extract_public_key --keyfile $< $@ + +COMPONENT_EXTRA_CLEAN += $(SECURE_BOOT_VERIFICATION_KEY) + +COMPONENT_EMBED_FILES := $(SECURE_BOOT_VERIFICATION_KEY) + +endif diff --git a/components/bootloader_support/include/esp_image_format.h b/components/bootloader_support/include/esp_image_format.h new file mode 100644 index 000000000..a32a50a4a --- /dev/null +++ b/components/bootloader_support/include/esp_image_format.h @@ -0,0 +1,132 @@ +// Copyright 2015-2016 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 __ESP32_IMAGE_FORMAT_H +#define __ESP32_IMAGE_FORMAT_H + +#include +#include + +#define ESP_ERR_IMAGE_BASE 0x2000 +#define ESP_ERR_IMAGE_FLASH_FAIL (ESP_ERR_IMAGE_BASE + 1) +#define ESP_ERR_IMAGE_INVALID (ESP_ERR_IMAGE_BASE + 2) + +/* Support for app/bootloader image parsing + Can be compiled as part of app or bootloader code. +*/ + +/* SPI flash mode, used in esp_image_header_t */ +typedef enum { + ESP_IMAGE_SPI_MODE_QIO, + ESP_IMAGE_SPI_MODE_QOUT, + ESP_IMAGE_SPI_MODE_DIO, + ESP_IMAGE_SPI_MODE_DOUT, + ESP_IMAGE_SPI_MODE_FAST_READ, + ESP_IMAGE_SPI_MODE_SLOW_READ +} esp_image_spi_mode_t; + +/* SPI flash clock frequency */ +enum { + ESP_IMAGE_SPI_SPEED_40M, + ESP_IMAGE_SPI_SPEED_26M, + ESP_IMAGE_SPI_SPEED_20M, + ESP_IMAGE_SPI_SPEED_80M = 0xF +} esp_image_spi_freq_t; + +/* Supported SPI flash sizes */ +typedef enum { + ESP_IMAGE_FLASH_SIZE_1MB = 0, + ESP_IMAGE_FLASH_SIZE_2MB, + ESP_IMAGE_FLASH_SIZE_4MB, + ESP_IMAGE_FLASH_SIZE_8MB, + ESP_IMAGE_FLASH_SIZE_16MB, + ESP_IMAGE_FLASH_SIZE_MAX +} esp_image_flash_size_t; + +#define ESP_IMAGE_HEADER_MAGIC 0xE9 + +/* Main header of binary image */ +typedef struct { + uint8_t magic; + uint8_t segment_count; + uint8_t spi_mode; /* flash read mode (esp_image_spi_mode_t as uint8_t) */ + uint8_t spi_speed: 4; /* flash frequency (esp_image_spi_freq_t as uint8_t) */ + uint8_t spi_size: 4; /* flash chip size (esp_image_flash_size_t as uint8_t) */ + uint32_t entry_addr; + uint8_t encrypt_flag; /* encrypt flag */ + uint8_t extra_header[15]; /* ESP32 additional header, unused by second bootloader */ +} esp_image_header_t; + +/* Header of binary image segment */ +typedef struct { + uint32_t load_addr; + uint32_t data_len; +} esp_image_segment_header_t; + + +/** + * @brief Read an ESP image header from flash. + * + * @param src_addr Address in flash to load image header. Must be 4 byte aligned. + * @param[out] image_header Pointer to an esp_image_header_t struture to be filled with data. If the function fails, contents are undefined. + * + * @return ESP_OK if image header was loaded, ESP_ERR_IMAGE_FLASH_FAIL + * if a SPI flash error occurs, ESP_ERR_IMAGE_INVALID if the image header + * appears invalid. + */ +esp_err_t esp_image_load_header(uint32_t src_addr, esp_image_header_t *image_header); + +/** + * @brief Read the segment header and data offset of a segment in the image. + * + * @param index Index of the segment to load information for. + * @param src_addr Base address in flash of the image. + * @param[in] image_header Pointer to the flash image header, already loaded by @ref esp_image_load_header(). + * @param[out] segment_header Pointer to a segment header structure to be filled with data. If the function fails, contents are undefined. + * @param[out] segment_data_offset Pointer to the data offset of the segment. + * + * @return ESP_OK if segment_header & segment_data_offset were loaded successfully, ESP_ERR_IMAGE_FLASH_FAIL if a SPI flash error occurs, ESP_ERR_IMAGE_INVALID if the image header appears invalid, ESP_ERR_INVALID_ARG if the index is invalid. + */ +esp_err_t esp_image_load_segment_header(uint8_t index, uint32_t src_addr, const esp_image_header_t *image_header, esp_image_segment_header_t *segment_header, uint32_t *segment_data_offset); + + +/** + * @brief Return length of an image in flash. Non-cryptographically validates image integrity in the process. + * + * If the image has a secure boot signature appended, the signature is not checked and this length is not included in the result. + * + * Image validation checks: + * - Magic byte + * - No single segment longer than 16MB + * - Total image no longer than 16MB + * - 8 bit image checksum is valid + * + * @param src_addr Offset of the start of the image in flash. Must be 4 byte aligned. + * @param[out] length Length of the image, set to a value if the image is valid. Can be null. + * + * @return ESP_OK if image is valid, ESP_FAIL or ESP_ERR_IMAGE_INVALID on errors. + * + */ +esp_err_t esp_image_basic_verify(uint32_t src_addr, uint32_t *length); + + +typedef struct { + uint32_t drom_addr; + uint32_t drom_load_addr; + uint32_t drom_size; + uint32_t irom_addr; + uint32_t irom_load_addr; + uint32_t irom_size; +} esp_image_flash_mapping_t; + +#endif diff --git a/components/bootloader_support/include/esp_secure_boot.h b/components/bootloader_support/include/esp_secure_boot.h new file mode 100644 index 000000000..f9fc57708 --- /dev/null +++ b/components/bootloader_support/include/esp_secure_boot.h @@ -0,0 +1,75 @@ +// Copyright 2015-2016 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 __ESP32_SECUREBOOT_H +#define __ESP32_SECUREBOOT_H + +#include +#include +#include "soc/efuse_reg.h" + +/* Support functions for secure boot features. + + Can be compiled as part of app or bootloader code. +*/ + +/** @brief Is secure boot currently enabled in hardware? + * + * Secure boot is enabled if the ABS_DONE_0 efuse is blown. This means + * that the ROM bootloader code will only boot a verified secure + * bootloader digest from now on. + * + * @return true if secure boot is enabled. + */ +static inline bool esp_secure_boot_enabled(void) { + return REG_READ(EFUSE_BLK0_RDATA6_REG) & EFUSE_RD_ABS_DONE_0; +} + + +/** @brief Enable secure boot if it is not already enabled. + * + * @important If this function succeeds, secure boot is permanently + * enabled on the chip via efuse. + * + * @important This function is intended to be called from bootloader code only. + * + * If secure boot is not yet enabled for bootloader, this will + * generate the secure boot digest and enable secure boot by blowing + * the EFUSE_RD_ABS_DONE_0 efuse. + * + * This function does not verify secure boot of the bootloader (the + * ROM bootloader does this.) + * + * Will fail if efuses have been part-burned in a way that indicates + * secure boot should not or could not be correctly enabled. + * + * + * @return ESP_ERR_INVALID_STATE if efuse state doesn't allow + * secure boot to be enabled cleanly. ESP_OK if secure boot + * is enabled on this chip from now on. + */ +esp_err_t esp_secure_boot_permanently_enable(void); + +/** @brief Verify the secure boot signature (determinstic ECDSA w/ SHA256) appended to some binary data in flash. + * + * Public key is compiled into the calling program. See docs/security/secure-boot.rst for details. + * + * @param src_addr Starting offset of the data in flash. + * @param length Length of data in bytes. Signature is appended -after- length bytes. + * + * @return ESP_OK if signature is valid, ESP_ERR_INVALID_STATE if + * signature fails, ESP_FAIL for other failures (ie can't read flash). + */ +esp_err_t esp_secure_boot_verify_signature(uint32_t src_addr, uint32_t length); + +#endif diff --git a/components/bootloader_support/include_priv/bootloader_flash.h b/components/bootloader_support/include_priv/bootloader_flash.h new file mode 100644 index 000000000..769c47b90 --- /dev/null +++ b/components/bootloader_support/include_priv/bootloader_flash.h @@ -0,0 +1,69 @@ +// Copyright 2015-2016 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 __BOOTLOADER_FLASH_H +#define __BOOTLOADER_FLASH_H + +#include +#include +#include +#include + +/* Provide a Flash API for bootloader_support code, + that can be used from bootloader or app code. + + This header is available to source code in the bootloader & + bootloader_support components only. +*/ + +/** + * @brief Map a region of flash to data memory + * + * @important In bootloader code, only one region can be bootloader_mmaped at once. The previous region must be bootloader_munmapped before another region is mapped. + * + * @important In app code, these functions are not thread safe. + * + * Call bootloader_munmap once for each successful call to bootloader_mmap. + * + * In esp-idf app, this function maps directly to spi_flash_mmap. + * + * @param offset - Starting flash offset to map to memory. + * @param length - Length of data to map. + * + * @return Pointer to mapped data memory (at src_addr), or NULL + * if an allocation error occured. + */ +const void *bootloader_mmap(uint32_t src_addr, uint32_t size); + + +/** + * @brief Unmap a previously mapped region of flash + * + * Call bootloader_munmap once for each successful call to bootloader_mmap. + */ +void bootloader_munmap(const void *mapping); + +/** + * @brief Read data from Flash. + * + * @note Both src and dest have to be 4-byte aligned. + * + * @param src source address of the data in Flash. + * @param dest pointer to the destination buffer + * @param size length of data + * + * @return esp_err_t + */ +esp_err_t bootloader_flash_read(size_t src_addr, void *dest, size_t size); + +#endif diff --git a/components/bootloader_support/src/bootloader_flash.c b/components/bootloader_support/src/bootloader_flash.c new file mode 100644 index 000000000..3fd107dea --- /dev/null +++ b/components/bootloader_support/src/bootloader_flash.c @@ -0,0 +1,122 @@ +// Copyright 2015-2016 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. +#include + +#include +#include +#include /* including in bootloader for error values */ + +#ifndef BOOTLOADER_BUILD +/* Normal app version maps to esp_spi_flash.h operations... + */ +static const char *TAG = "bootloader_mmap"; + +static spi_flash_mmap_memory_t map; + +const void *bootloader_mmap(uint32_t src_addr, uint32_t size) +{ + if (map) { + ESP_LOGE(TAG, "tried to bootloader_mmap twice"); + return NULL; /* existing mapping in use... */ + } + const void *result = NULL; + esp_err_t err = spi_flash_mmap(src_addr, size, SPI_FLASH_MMAP_DATA, &result, &map); + if (err != ESP_OK) { + result = NULL; + } + return result; +} + +void bootloader_munmap(const void *mapping) +{ + if(mapping && map) { + spi_flash_munmap(map); + } + map = 0; +} + +esp_err_t bootloader_flash_read(size_t src, void *dest, size_t size) +{ + return spi_flash_read(src, dest, size); +} + +#else +/* Bootloader version, uses ROM functions only */ +#include +#include + +static const char *TAG = "bootloader_flash"; + +static bool mapped; + +const void *bootloader_mmap(uint32_t src_addr, uint32_t size) +{ + if (mapped) { + ESP_LOGE(TAG, "tried to bootloader_mmap twice"); + return NULL; /* can't map twice */ + } + + uint32_t src_addr_aligned = src_addr & 0xffff0000; + uint32_t count = (size + (src_addr - src_addr_aligned) + 0xffff) / 0x10000; + Cache_Read_Disable(0); + Cache_Flush(0); + ESP_LOGD(TAG, "mmu set paddr=%08x count=%d", src_addr_aligned, count ); + cache_flash_mmu_set( 0, 0, 0x3f400000, src_addr_aligned, 64, count ); + Cache_Read_Enable( 0 ); + + mapped = true; + + return (void *)(0x3f400000 + (src_addr - src_addr_aligned)); +} + +void bootloader_munmap(const void *mapping) +{ + if (mapped) { + /* Full MMU reset */ + Cache_Read_Disable(0); + Cache_Flush(0); + mmu_init(0); + mapped = false; + } +} + +esp_err_t bootloader_flash_read(size_t src_addr, void *dest, size_t size) +{ + if(src_addr & 3) { + ESP_LOGE(TAG, "bootloader_flash_read src_addr 0x%x not 4-byte aligned", src_addr); + return ESP_FAIL; + } + if((intptr_t)dest & 3) { + ESP_LOGE(TAG, "bootloader_flash_read dest 0x%x not 4-byte aligned", (intptr_t)dest); + return ESP_FAIL; + } + + Cache_Read_Disable(0); + Cache_Flush(0); + SpiFlashOpResult r = SPIRead(src_addr, dest, size); + Cache_Read_Enable(0); + + switch(r) { + case SPI_FLASH_RESULT_OK: + return ESP_OK; + case SPI_FLASH_RESULT_ERR: + return ESP_ERR_FLASH_OP_FAIL; + case SPI_FLASH_RESULT_TIMEOUT: + return ESP_ERR_FLASH_OP_TIMEOUT; + default: + return ESP_FAIL; + } +} + +#endif diff --git a/components/bootloader_support/src/esp_image_format.c b/components/bootloader_support/src/esp_image_format.c new file mode 100644 index 000000000..ca75f6ae4 --- /dev/null +++ b/components/bootloader_support/src/esp_image_format.c @@ -0,0 +1,161 @@ +// Copyright 2015-2016 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. +#include + +#include +#include +#include + +static const char *TAG = "esp_image"; + +#define SIXTEEN_MB 0x1000000 +#define ESP_ROM_CHECKSUM_INITIAL 0xEF + +esp_err_t esp_image_load_header(uint32_t src_addr, esp_image_header_t *image_header) +{ + esp_err_t err; + ESP_LOGD(TAG, "reading image header @ 0x%x", src_addr); + + err = bootloader_flash_read(src_addr, image_header, sizeof(esp_image_header_t)); + + if (err == ESP_OK) { + if (image_header->magic != ESP_IMAGE_HEADER_MAGIC) { + ESP_LOGE(TAG, "image at 0x%x has invalid magic byte", src_addr); + err = ESP_ERR_IMAGE_INVALID; + } + if (image_header->spi_mode > ESP_IMAGE_SPI_MODE_SLOW_READ) { + ESP_LOGW(TAG, "image at 0x%x has invalid SPI mode %d", src_addr, image_header->spi_mode); + } + if (image_header->spi_speed > ESP_IMAGE_SPI_SPEED_80M) { + ESP_LOGW(TAG, "image at 0x%x has invalid SPI speed %d", src_addr, image_header->spi_speed); + } + if (image_header->spi_size > ESP_IMAGE_FLASH_SIZE_MAX) { + ESP_LOGW(TAG, "image at 0x%x has invalid SPI size %d", src_addr, image_header->spi_size); + } + } + + if (err != ESP_OK) { + bzero(image_header, sizeof(esp_image_header_t)); + } + return err; +} + +esp_err_t esp_image_load_segment_header(uint8_t index, uint32_t src_addr, const esp_image_header_t *image_header, esp_image_segment_header_t *segment_header, uint32_t *segment_data_offset) +{ + esp_err_t err = ESP_OK; + uint32_t next_addr = src_addr + sizeof(esp_image_header_t); + + if(index >= image_header->segment_count) { + ESP_LOGE(TAG, "index %d higher than segment count %d", index, image_header->segment_count); + return ESP_ERR_INVALID_ARG; + } + + for(int i = 0; i <= index && err == ESP_OK; i++) { + ESP_LOGV(TAG, "loading segment header %d at offset 0x%x", i, next_addr); + err = bootloader_flash_read(next_addr, segment_header, sizeof(esp_image_segment_header_t)); + if (err == ESP_OK) { + if ((segment_header->data_len & 3) != 0 + || segment_header->data_len >= SIXTEEN_MB) { + ESP_LOGE(TAG, "invalid segment length 0x%x", segment_header->data_len); + err = ESP_ERR_IMAGE_INVALID; + } + next_addr += sizeof(esp_image_segment_header_t); + ESP_LOGV(TAG, "segment data length 0x%x data starts 0x%x", segment_header->data_len, next_addr); + *segment_data_offset = next_addr; + next_addr += segment_header->data_len; + } + } + + if (err != ESP_OK) { + *segment_data_offset = 0; + bzero(segment_header, sizeof(esp_image_segment_header_t)); + } + + return err; +} + +esp_err_t esp_image_basic_verify(uint32_t src_addr, uint32_t *p_length) +{ + esp_err_t err; + uint8_t buf[16]; + uint8_t checksum = ESP_ROM_CHECKSUM_INITIAL; + esp_image_header_t image_header; + esp_image_segment_header_t segment_header = { 0 }; + uint32_t segment_data_offs = 0; + const uint8_t *segment_data; + uint32_t end_addr; + uint32_t length; + + if (p_length != NULL) { + *p_length = 0; + } + + err = esp_image_load_header(src_addr, &image_header); + if (err != ESP_OK) { + return err; + } + + ESP_LOGD(TAG, "reading %d image segments", image_header.segment_count); + + /* Checksum each segment's data */ + for (int i = 0; i < image_header.segment_count; i++) { + err = esp_image_load_segment_header(i, src_addr, &image_header, + &segment_header, &segment_data_offs); + if (err != ESP_OK) { + return err; + } + + segment_data = bootloader_mmap(segment_data_offs, segment_header.data_len); + if (segment_data == NULL) { + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", segment_data_offs, segment_header.data_len); + return ESP_FAIL; + } + for(int i = 0; i < segment_header.data_len; i++) { + checksum ^= segment_data[i]; + } + bootloader_munmap(segment_data); + } + + /* End of image, verify checksum */ + end_addr = segment_data_offs + segment_header.data_len; + + if (end_addr < src_addr) { + ESP_LOGE(TAG, "image offset has wrapped"); + return ESP_ERR_IMAGE_INVALID; + } + + length = end_addr - src_addr; + if (length >= SIXTEEN_MB) { + ESP_LOGE(TAG, "invalid total length 0x%x", length); + return ESP_ERR_IMAGE_INVALID; + } + + /* image padded to next full 16 byte block, with checksum byte at very end */ + ESP_LOGV(TAG, "unpadded image length 0x%x", length); + length += 16; /* always pad by at least 1 byte */ + length = length - (length % 16); + ESP_LOGV(TAG, "padded image length 0x%x", length); + ESP_LOGD(TAG, "reading checksum block at 0x%x", src_addr + length - 16); + bootloader_flash_read(src_addr + length - 16, buf, 16); + if (checksum != buf[15]) { + ESP_LOGE(TAG, "checksum failed. Calculated 0x%x read 0x%x", + checksum, buf[15]); + return ESP_ERR_IMAGE_INVALID; + } + + if (p_length != NULL) { + *p_length = length; + } + return ESP_OK; +} diff --git a/components/bootloader_support/src/secure_boot.c b/components/bootloader_support/src/secure_boot.c new file mode 100644 index 000000000..d908d39c3 --- /dev/null +++ b/components/bootloader_support/src/secure_boot.c @@ -0,0 +1,222 @@ +// Copyright 2015-2016 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. + +#include + +#include "esp_attr.h" +#include "esp_types.h" +#include "esp_log.h" + +#include "rom/cache.h" +#include "rom/ets_sys.h" +#include "rom/spi_flash.h" +#include "rom/secure_boot.h" + +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" +#include "soc/efuse_reg.h" +#include "soc/rtc_cntl_reg.h" + +#include "sdkconfig.h" + +#include "bootloader_flash.h" +#include "esp_image_format.h" +#include "esp_secure_boot.h" + +static const char* TAG = "secure_boot"; + +#define HASH_BLOCK_SIZE 128 +#define IV_LEN HASH_BLOCK_SIZE +#define DIGEST_LEN 64 + +/** + * @function : secure_boot_generate + * @description: generate boot digest (aka "abstract") & iv + * + * @inputs: image_len - length of image to calculate digest for + */ +static bool secure_boot_generate(uint32_t image_len){ + SpiFlashOpResult spiRet; + /* buffer is uint32_t not uint8_t to meet ROM SPI API signature */ + uint32_t buf[IV_LEN / sizeof(uint32_t)]; + const void *image; + + /* hardware secure boot engine only takes full blocks, so round up the + image length. The additional data should all be 0xFF. + */ + if (image_len % HASH_BLOCK_SIZE != 0) { + image_len = (image_len / HASH_BLOCK_SIZE + 1) * HASH_BLOCK_SIZE; + } + ets_secure_boot_start(); + ets_secure_boot_rd_iv(buf); + ets_secure_boot_hash(NULL); + Cache_Read_Disable(0); + /* iv stored in sec 0 */ + spiRet = SPIEraseSector(0); + if (spiRet != SPI_FLASH_RESULT_OK) + { + ESP_LOGE(TAG, "SPI erase failed %d", spiRet); + return false; + } + Cache_Read_Enable(0); + + /* write iv to flash, 0x0000, 128 bytes (1024 bits) */ + ESP_LOGD(TAG, "write iv to flash."); + spiRet = SPIWrite(0, buf, IV_LEN); + if (spiRet != SPI_FLASH_RESULT_OK) + { + ESP_LOGE(TAG, "SPI write failed %d", spiRet); + return false; + } + bzero(buf, sizeof(buf)); + + /* generate digest from image contents */ + image = bootloader_mmap(0x1000, image_len); + if (!image) { + ESP_LOGE(TAG, "bootloader_mmap(0x1000, 0x%x) failed", image_len); + return false; + } + for (int i = 0; i < image_len; i+= HASH_BLOCK_SIZE) { + ets_secure_boot_hash(image + i/sizeof(void *)); + } + bootloader_munmap(image); + + ets_secure_boot_obtain(); + ets_secure_boot_rd_abstract(buf); + ets_secure_boot_finish(); + + ESP_LOGD(TAG, "write digest to flash."); + spiRet = SPIWrite(0x80, buf, DIGEST_LEN); + if (spiRet != SPI_FLASH_RESULT_OK) { + ESP_LOGE(TAG, "SPI write failed %d", spiRet); + return false; + } + ESP_LOGD(TAG, "write digest to flash."); + Cache_Read_Enable(0); + return true; +} + +/* Burn values written to the efuse write registers */ +static inline void burn_efuses() +{ +#ifdef CONFIG_SECURE_BOOT_TEST_MODE + ESP_LOGE(TAG, "SECURE BOOT TEST MODE. Not really burning any efuses!"); +#else + REG_WRITE(EFUSE_CONF_REG, 0x5A5A); /* efuse_pgm_op_ena, force no rd/wr disable */ + REG_WRITE(EFUSE_CMD_REG, 0x02); /* efuse_pgm_cmd */ + while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_pagm_cmd=0 */ + REG_WRITE(EFUSE_CONF_REG, 0x5AA5); /* efuse_read_op_ena, release force */ + REG_WRITE(EFUSE_CMD_REG, 0x01); /* efuse_read_cmd */ + while (REG_READ(EFUSE_CMD_REG)); /* wait for efuse_read_cmd=0 */ +#endif +} + +esp_err_t esp_secure_boot_permanently_enable(void) { + esp_err_t err; + uint32_t image_len = 0; + if (esp_secure_boot_enabled()) + { + ESP_LOGI(TAG, "bootloader secure boot is already enabled, continuing.."); + return ESP_OK; + } + + err = esp_image_basic_verify(0x1000, &image_len); + if (err != ESP_OK) { + ESP_LOGE(TAG, "bootloader image appears invalid! error %d", err); + return err; + } + + uint32_t dis_reg = REG_READ(EFUSE_BLK0_RDATA0_REG); + bool efuse_key_read_protected = dis_reg & EFUSE_RD_DIS_BLK2; + bool efuse_key_write_protected = dis_reg & EFUSE_WR_DIS_BLK2; + if (efuse_key_read_protected == false + && efuse_key_write_protected == false + && REG_READ(EFUSE_BLK2_RDATA0_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA1_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA2_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA3_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA4_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA5_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA6_REG) == 0 + && REG_READ(EFUSE_BLK2_RDATA7_REG) == 0) { + ESP_LOGI(TAG, "Generating new secure boot key..."); + /* reuse the secure boot IV generation function to generate + the key, as this generator uses the hardware RNG. */ + uint32_t buf[32]; + ets_secure_boot_start(); + ets_secure_boot_rd_iv(buf); + ets_secure_boot_finish(); + for (int i = 0; i < 8; i++) { + ESP_LOGV(TAG, "EFUSE_BLK2_WDATA%d_REG = 0x%08x", i, buf[i]); + REG_WRITE(EFUSE_BLK2_WDATA0_REG + 4*i, buf[i]); + } + bzero(buf, sizeof(buf)); + burn_efuses(); + ESP_LOGI(TAG, "Read & write protecting new key..."); + REG_WRITE(EFUSE_BLK0_WDATA0_REG, EFUSE_WR_DIS_BLK2 | EFUSE_RD_DIS_BLK2); + burn_efuses(); + efuse_key_read_protected = true; + efuse_key_write_protected = true; + + } else { + ESP_LOGW(TAG, "Using pre-loaded secure boot key in EFUSE block 2"); + } + + ESP_LOGI(TAG, "Generating secure boot digest..."); + if (false == secure_boot_generate(image_len)){ + ESP_LOGE(TAG, "secure boot generation failed"); + return ESP_FAIL; + } + ESP_LOGI(TAG, "Digest generation complete."); + + if (!efuse_key_read_protected) { + ESP_LOGE(TAG, "Pre-loaded key is not read protected. Refusing to blow secure boot efuse."); + return ESP_ERR_INVALID_STATE; + } + if (!efuse_key_write_protected) { + ESP_LOGE(TAG, "Pre-loaded key is not write protected. Refusing to blow secure boot efuse."); + return ESP_ERR_INVALID_STATE; + } + + ESP_LOGI(TAG, "blowing secure boot efuse..."); + ESP_LOGD(TAG, "before updating, EFUSE_BLK0_RDATA6 %x", REG_READ(EFUSE_BLK0_RDATA6_REG)); + + uint32_t new_wdata6 = EFUSE_RD_ABS_DONE_0; + + #ifdef CONFIG_SECURE_BOOT_DISABLE_JTAG + ESP_LOGI(TAG, "disabling JTAG..."); + new_wdata6 |= EFUSE_RD_DISABLE_JTAG; + #endif + + #ifdef CONFIG_SECURE_BOOT_DISABLE_UART_BOOTLOADER + ESP_LOGI(TAG, "disabling UART bootloader..."); + new_wdata6 |= EFUSE_RD_CONSOLE_DEBUG_DISABLE_S; + #endif + + REG_WRITE(EFUSE_BLK0_WDATA6_REG, new_wdata6); + burn_efuses(); + uint32_t after = REG_READ(EFUSE_BLK0_RDATA6_REG); + ESP_LOGD(TAG, "after updating, EFUSE_BLK0_RDATA6 %x", after); + if (after & EFUSE_RD_ABS_DONE_0) { + ESP_LOGI(TAG, "secure boot is now enabled for bootloader image"); + return ESP_OK; + } else { +#ifdef CONFIG_SECURE_BOOT_TEST_MODE + ESP_LOGE(TAG, "secure boot not enabled due to test mode"); +#else + ESP_LOGE(TAG, "secure boot not enabled for bootloader image, EFUSE_RD_ABS_DONE_0 is probably write protected!"); +#endif + return ESP_ERR_INVALID_STATE; + } +} diff --git a/components/bootloader_support/src/secure_boot_signatures.c b/components/bootloader_support/src/secure_boot_signatures.c new file mode 100644 index 000000000..f7e435e86 --- /dev/null +++ b/components/bootloader_support/src/secure_boot_signatures.c @@ -0,0 +1,110 @@ +// Copyright 2015-2016 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. +#include "sdkconfig.h" + +#include "bootloader_flash.h" +#include "esp_log.h" +#include "esp_image_format.h" +#include "esp_secure_boot.h" + +#include "uECC.h" + +#ifdef BOOTLOADER_BUILD +#include "rom/sha.h" +typedef SHA_CTX sha_context; +#else +#include "hwcrypto/sha.h" +typedef esp_sha_context sha_context; +#endif + +typedef struct { + uint32_t version; + uint8_t signature[64]; +} signature_block_t; + +static const char* TAG = "secure_boot"; + +extern const uint8_t signature_verification_key_start[] asm("_binary_signature_verification_key_bin_start"); +extern const uint8_t signature_verification_key_end[] asm("_binary_signature_verification_key_bin_end"); + +#define SIGNATURE_VERIFICATION_KEYLEN 64 + +esp_err_t esp_secure_boot_verify_signature(uint32_t src_addr, uint32_t length) +{ + sha_context sha; + uint8_t digest[32]; + ptrdiff_t keylen; + const uint8_t *data; + const signature_block_t *sigblock; + bool is_valid; +#ifdef BOOTLOADER_BUILD + const uint8_t *digest_data; + uint32_t digest_len; +#endif + + ESP_LOGD(TAG, "verifying signature src_addr 0x%x length 0x%x", src_addr, length); + + data = bootloader_mmap(src_addr, length + sizeof(signature_block_t)); + if(data == NULL) { + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", src_addr, length+sizeof(signature_block_t)); + return ESP_FAIL; + } + + sigblock = (const signature_block_t *)(data + length); + + if (sigblock->version != 0) { + ESP_LOGE(TAG, "src 0x%x has invalid signature version field 0x%08x", src_addr, sigblock->version); + goto unmap_and_fail; + } + +#ifdef BOOTLOADER_BUILD + /* Use ROM SHA functions directly */ + ets_sha_enable(); + ets_sha_init(&sha); + digest_len = length * 8; + digest_data = data; + while (digest_len > 0) { + uint32_t chunk_len = (digest_len > 64) ? 64 : digest_len; + ets_sha_update(&sha, SHA2_256, digest_data, chunk_len); + digest_len -= chunk_len; + digest_data += chunk_len / 8; + } + ets_sha_finish(&sha, SHA2_256, digest); + ets_sha_disable(); +#else + /* Use thread-safe esp-idf SHA layer */ + esp_sha256_init(&sha); + esp_sha256_start(&sha, false); + esp_sha256_update(&sha, data, length); + esp_sha256_finish(&sha, digest); + esp_sha256_free(&sha); +#endif + + keylen = signature_verification_key_end - signature_verification_key_start; + if(keylen != SIGNATURE_VERIFICATION_KEYLEN) { + ESP_LOGE(TAG, "Embedded public verification key has wrong length %d", keylen); + goto unmap_and_fail; + } + + is_valid = uECC_verify(signature_verification_key_start, + digest, sizeof(digest), sigblock->signature, + uECC_secp256r1()); + + bootloader_munmap(data); + return is_valid ? ESP_OK : ESP_ERR_IMAGE_INVALID; + + unmap_and_fail: + bootloader_munmap(data); + return ESP_FAIL; +} diff --git a/components/bt/Kconfig b/components/bt/Kconfig index e43ff864d..e2f7d9734 100644 --- a/components/bt/Kconfig +++ b/components/bt/Kconfig @@ -8,6 +8,18 @@ config BT_ENABLED help This compiles in the low-level BT stack. +menu "BT_UTIL" +visible if BT_ENABLED + +config BT_USE_ETS_PRINT + bool "BT USE ETS_PRINT" + default y + depends on BT_ENABLED + help + This select use print or ets_print + +endmenu #menu + #config BT_BTLE # bool "Enable BTLE" # depends on BT_ENABLED diff --git a/components/bt/bluedroid/api/esp_adv_api.c b/components/bt/bluedroid/api/esp_adv_api.c deleted file mode 100644 index 81eb91286..000000000 --- a/components/bt/bluedroid/api/esp_adv_api.c +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2015-2016 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. - -#include "esp_bt_defs.h" - - - /******************************************************************************* - ** - ** Function esp_ble_config_adv_data - ** - ** Description This function is called to override the BTA default ADV parameters. - ** - ** adv_data: Pointer to User defined ADV data structure. This - ** memory space can not be freed until p_adv_data_cback - ** is received. - ** p_adv_data_cback: set adv data complete callback. - ** - ** Returns None - ** - *******************************************************************************/ - void esp_ble_config_adv_data(esp_ble_adv_data_cfg_t *adv_data, - esp_ble_set_adv_data_cmpl_cb_t *p_adv_data_cback) -{ - tBTA_BLE_AD_MASK data_mask = 0; - if(adv_data->adv_name != NULL) - { - data_mask |= BTM_BLE_AD_BIT_DEV_NAME; - BTA_DmSetDeviceName(adv_data->adv_name); - } - if(adv_data->ble_adv_data.int_range.low != 0 || - adv_data->ble_adv_data.int_range.hi != 0) - data_mask |= BTM_BLE_AD_BIT_INT_RANGE; - - if(adv_data->ble_adv_data.p_manu != NULL) - { - data_mask |= BTM_BLE_AD_BIT_MANU; - } - - if(adv_data->ble_adv_data.p_services != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE; - } - - if(adv_data->ble_adv_data.p_service_32b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_32; - } - - if(adv_data->ble_adv_data.p_services_128b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_128; - } - - if(adv_data->ble_adv_data.p_sol_services != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; - } - - if(adv_data->ble_adv_data.p_sol_service_32b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_32SOL; - } - - if(adv_data->ble_adv_data.p_sol_service_128b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; - } - - if(adv_data->ble_adv_data.p_service_data != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_DATA; - } - - if(adv_data->ble_adv_data.appearance != 0) - { - data_mask |= BTM_BLE_AD_BIT_APPEARANCE; - } - - if(adv_data->ble_adv_data.p_proprietary != NULL) - { - data_mask |= BTM_BLE_AD_BIT_PROPRIETARY; - } - - if(adv_data->ble_adv_data.tx_power != 0) - { - data_mask |= BTM_BLE_AD_BIT_TX_PWR; - } - - BTA_DmBleSetAdvConfig(data_mask, &(adv_data->ble_adv_data), p_adv_data_cback); -} - - -/******************************************************************************* -** -** Function esp_ble_set_scan_rsp -** -** Description This function is called to override the app scan response. -** -** Parameters Pointer to User defined ADV data structure -** -** Returns None -** -*******************************************************************************/ -void esp_ble_set_scan_rsp(esp_ble_adv_data_cfg_t *scan_rsp_data, - esp_ble_set_adv_data_cmpl_cb_t *p_scan_rsp_data_cback) -{ - tBTA_BLE_AD_MASK data_mask = 0; - if(scan_rsp_data->adv_name != NULL) - { - data_mask |= BTM_BLE_AD_BIT_DEV_NAME; - BTA_DmSetDeviceName(scan_rsp_data->adv_name); - } - if(scan_rsp_data->ble_adv_data.int_range.low != 0 || - scan_rsp_data->ble_adv_data.int_range.hi != 0) - data_mask |= BTM_BLE_AD_BIT_INT_RANGE; - - if(scan_rsp_data->ble_adv_data.p_manu != NULL) - { - data_mask |= BTM_BLE_AD_BIT_MANU; - } - - if(scan_rsp_data->ble_adv_data.p_services != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE; - } - - if(scan_rsp_data->ble_adv_data.p_service_32b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_32; - } - - if(scan_rsp_data->ble_adv_data.p_services_128b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_128; - } - - if(scan_rsp_data->ble_adv_data.p_sol_services != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; - } - - if(scan_rsp_data->ble_adv_data.p_sol_service_32b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_32SOL; - } - - if(scan_rsp_data->ble_adv_data.p_sol_service_128b != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; - } - - if(scan_rsp_data->ble_adv_data.p_service_data != NULL) - { - data_mask |= BTM_BLE_AD_BIT_SERVICE_DATA; - } - - if(scan_rsp_data->ble_adv_data.appearance != 0) - { - data_mask |= BTM_BLE_AD_BIT_APPEARANCE; - } - - if(scan_rsp_data->ble_adv_data.p_proprietary != NULL) - { - data_mask |= BTM_BLE_AD_BIT_PROPRIETARY; - } - - if(scan_rsp_data->ble_adv_data.tx_power != 0) - { - data_mask |= BTM_BLE_AD_BIT_TX_PWR; - } - - BTA_DmBleSetScanRsp(data_mask, &(scan_rsp_data->ble_adv_data), p_scan_rsp_data_cback); -} - -#if 0 - -/******************************************************************************* -** -** @function esp_ble_config_adv_data -** -** @brief This function is called to override the BTA default ADV parameters. -** -** @param[in] adv_data: Pointer to User defined ADV data structure. This -** memory space can not be freed until p_adv_data_cback -** is received. -** @param[in|out] adv_data_cback: set adv data complete callback. -** -** @return None -** -*******************************************************************************/ -void esp_ble_config_adv_data (esp_ble_adv_data_cfg_t *adv_data, - esp_ble_set_adv_data_cmpl_cb_t *adv_data_cback) -{ - if(adv_data != NULL) - { - ble_config_adv_data(adv_data, adv_data_cback); - }else{ - LOG_ERROR("The adv_data is NULL\n"); - } - - if(++adv_data != NULL) - { - ble_set_scan_rsp(adv_data, NULL); - } - -} -#endif - -/******************************************************************************* -** -** @function esp_ble_start_advertising -** -** @brief This function is called to start advertising. -** -** @param[in] esp_ble_adv_params_all_t: ointer to User defined adv_params data structure. -** -** @return None -** -*******************************************************************************/ -void esp_ble_start_advertising (esp_ble_adv_params_all_t *ble_adv_params) -{ - if (!API_BLE_ISVALID_PARAM(ble_adv_params->adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) || - !API_BLE_ISVALID_PARAM(ble_adv_params->adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) - { - LOG_ERROR("Invalid advertisting interval parameters.\n"); - return ; - } - - if ((ble_adv_params->adv_type < API_NON_DISCOVERABLE) && - (ble_adv_params->adv_type > API_BROADCASTER_MODE) ) - { - LOG_ERROR("Invalid advertisting type parameters.\n"); - return; - } - - if ((ble_adv_params->adv_filter_policy < ADV_ALLOW_SCAN_ANY_CON_ANY) && - (ble_adv_params->adv_filter_policy > ADV_ALLOW_SCAN_WLST_CON_WLST) ) - { - LOG_ERROR("Invalid advertisting type parameters.\n"); - return; - } - - LOG_ERROR("API_Ble_AppStartAdvertising\n"); - - /// - BTA_DmSetBleAdvParamsAll(ble_adv_params->adv_int_min, - ble_adv_params->adv_int_max, - ble_adv_params->adv_type, - ble_adv_params->addr_type_own, - ble_adv_params->channel_map, - ble_adv_params->adv_filter_policy, - ble_adv_params->p_dir_bda); - - -} - - -/******************************************************************************* -** -** @function esp_ble_set_scan_params -** -** @brief This function is called to set scan parameters -** -** @param[in] esp_ble_scan_params: Pointer to User defined scan_params data structure. This -** memory space can not be freed until scan_param_setup_cback -** @param[in] client_if: Client interface ID -** @param[in|out] scan_param_setup_status_cback - Set scan param status callback -** -** @return None -** -*******************************************************************************/ -void esp_ble_set_scan_params (esp_ble_scan_params *scan_params, esp_gattc_if_t client_if, - esp_scan_param_setup_cb_t scan_param_setup_cback) -{ - if (API_BLE_ISVALID_PARAM(scan_params->scan_intv, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) && - API_BLE_ISVALID_PARAM(scan_params->scan_win, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) && - (scan_params->scan_type == BTM_BLE_SCAN_MODE_ACTI || scan_params->scan_type == BTM_BLE_SCAN_MODE_PASS)) - { - BTA_DmSetBleScanFilterParams(client_if, - scan_params->scan_intv, - scan_params->scan_win, - scan_params->scan_type, - scan_params->scan_fil_policy, - scan_params->addr_type_own, - scan_param_setup_cback); - } -} - - -/******************************************************************************* -** -** @function esp_ble_start_scanning -** -** @brief This procedure keep the device scanning the peer device whith advertising on the air -** -** @param[in] duration: Keeping the scaning time, the unit is second. -** @param[in|out] results_cb: The scanning function callback when the peer device has been scan -** which advertising on the air -** -** @return None -** -*******************************************************************************/ -void esp_ble_start_scanning (UINT8 duration, esp_dm_search_cb_t *results_cb) -{ - if((duration != 0) && (results_cb != NULL)) - { - ///Start scan the device - BTA_DmBleObserve(true, duration, results_cb); - }else{ - LOG_ERROR("The scan duration or p_results_cb invalid\n"); - } -} - - -/******************************************************************************* -** -** @function esp_ble_stop_advertising -** -** @brief This function is called to stop advertising. -** -** @param None -** -** @return None -** -*******************************************************************************/ -void esp_ble_stop_advertising (void) -{ - bool stop_adv = false; - - BTA_DmBleBroadcast(stop_adv); -} - - - diff --git a/components/bt/bluedroid/api/esp_app_sec.c b/components/bt/bluedroid/api/esp_app_sec.c index 60d48bf04..e1ec079b4 100644 --- a/components/bt/bluedroid/api/esp_app_sec.c +++ b/components/bt/bluedroid/api/esp_app_sec.c @@ -29,7 +29,7 @@ tAPP_SEC_ENV app_sec_env; ** ** Function app_ble_sec_gen_tk ** -** Description This function is called to generate the ble tk +** Description This function is called to generate the ble tk ** ** Returns the generate tk value ** @@ -37,14 +37,14 @@ tAPP_SEC_ENV app_sec_env; UINT32 app_ble_sec_gen_tk(void) { // Generate a PIN Code (Between 100000 and 999999) - return (100000 + (random()%900000)); + return (100000 + (random() % 900000)); } /******************************************************************************* ** ** Function app_ble_sec_gen_ltk ** -** Description This function is called to generate the ble ltk +** Description This function is called to generate the ble ltk ** ** Returns NULL ** @@ -56,19 +56,17 @@ void app_ble_sec_gen_ltk(UINT8 key_size) app_sec_env.key_size = key_size; // Randomly generate the LTK and the Random Number - for (i = 0; i < RAND_NB_LEN; i++) - { - app_sec_env.rand_nb.nb[i] = random()%256; + for (i = 0; i < RAND_NB_LEN; i++) { + app_sec_env.rand_nb.nb[i] = random() % 256; } // Randomly generate the end of the LTK - for (i = 0; i < SEC_KEY_LEN; i++) - { - app_sec_env.ltk.key[i] = (((key_size) < (16 - i)) ? 0 : random()%256); + for (i = 0; i < SEC_KEY_LEN; i++) { + app_sec_env.ltk.key[i] = (((key_size) < (16 - i)) ? 0 : random() % 256); } // Randomly generate the EDIV - app_sec_env.ediv = random()%65536; + app_sec_env.ediv = random() % 65536; } @@ -92,14 +90,14 @@ void app_ble_sec_init() ** ** Function app_ble_security_start ** -** Description This function is called by the slave when the seurity start +** Description This function is called by the slave when the seurity start ** ** Returns NULL ** *******************************************************************************/ void app_ble_security_start(void) { - + } diff --git a/components/bt/bluedroid/api/esp_blufi_api.c b/components/bt/bluedroid/api/esp_blufi_api.c new file mode 100644 index 000000000..a74c9d04b --- /dev/null +++ b/components/bt/bluedroid/api/esp_blufi_api.c @@ -0,0 +1,66 @@ +// Copyright 2015-2016 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. + + +#include "esp_blufi_api.h" +#include "esp_bt_defs.h" +#include "esp_bt_main.h" +#include "btc_task.h" +#include "btc_blufi_prf.h" +#include "btc_manage.h" +#include "btc_main.h" +#include "future.h" + +esp_err_t esp_blufi_register_callback(esp_profile_cb_t callback) +{ + return (btc_profile_cb_set(BTC_PID_BLUFI, callback) == 0 ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_blufi_send_config_state(esp_blufi_config_state_t state) +{ + btc_msg_t msg; + btc_blufi_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_BLUFI; + msg.act = BTC_BLUFI_ACT_SEND_CFG_STATE; + arg.cfg_state.state = state; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_blufi_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_blufi_profile_init(void) +{ + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_BLUFI; + msg.act = BTC_BLUFI_ACT_INIT; + + return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_blufi_profile_deinit(void) +{ + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_BLUFI; + msg.act = BTC_BLUFI_ACT_DEINIT; + + return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + diff --git a/components/bt/bluedroid/api/esp_bt_common.c b/components/bt/bluedroid/api/esp_bt_common.c deleted file mode 100644 index 868b6a7a9..000000000 --- a/components/bt/bluedroid/api/esp_bt_common.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "esp_bt_defs.h" -#include "esp_bt_common.h" -#include "esp_err.h" - -extern int bte_main_boot_entry(void *cb); -extern int bte_main_shutdown(void); - -// tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback) -esp_err_t esp_enable_bluetooth(esp_bt_sec_cb_t *p_cback) -{ - return BTA_EnableBluetooth(p_cback) == BTA_SUCCESS ? ESP_OK : ESP_FAIL; -} - -esp_err_t esp_disable_bluetooth(void) -{ - return BTA_DisableBluetooth() == BTA_SUCCESS ? ESP_OK : ESP_FAIL; -} - -esp_err_t esp_init_bluetooth(bluetooth_init_cb_t cb) -{ - return bte_main_boot_entry(cb) == 0 ? ESP_OK : ESP_FAIL; -} - - -void esp_deinit_bluetooth(void) -{ - bte_main_shutdown(); -} - - diff --git a/components/bt/bluedroid/api/esp_bt_main.c b/components/bt/bluedroid/api/esp_bt_main.c new file mode 100644 index 000000000..f18599928 --- /dev/null +++ b/components/bt/bluedroid/api/esp_bt_main.c @@ -0,0 +1,157 @@ +// Copyright 2015-2016 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. + + +#include "esp_bt_main.h" +#include "btc_task.h" +#include "btc_main.h" +#include "future.h" + +static bool esp_already_enable = false; +static bool esp_already_init = false; + +esp_err_t esp_enable_bluetooth(void) +{ + btc_msg_t msg; + future_t **future_p; + + if (esp_already_enable) { + LOG_ERROR("%s already enable\n", __func__); + return ESP_ERR_INVALID_STATE; + } + + future_p = btc_main_get_future_p(BTC_MAIN_ENABLE_FUTURE); + *future_p = future_new(); + if (*future_p == NULL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_ERR_NO_MEM; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_MAIN_INIT; + msg.act = BTC_MAIN_ACT_ENABLE; + btc_transfer_context(&msg, NULL, 0, NULL); + + if (future_await(*future_p) == FUTURE_FAIL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_FAIL; + } + + esp_already_enable = true; + + return ESP_OK; +} + +esp_err_t esp_disable_bluetooth(void) +{ + btc_msg_t msg; + future_t **future_p; + + if (!esp_already_enable) { + LOG_ERROR("%s already disable\n", __func__); + return ESP_ERR_INVALID_STATE; + } + + future_p = btc_main_get_future_p(BTC_MAIN_DISABLE_FUTURE); + *future_p = future_new(); + if (*future_p == NULL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_ERR_NO_MEM; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_MAIN_INIT; + msg.act = BTC_MAIN_ACT_DISABLE; + btc_transfer_context(&msg, NULL, 0, NULL); + + if (future_await(*future_p) == FUTURE_FAIL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_FAIL; + } + + esp_already_enable = false; + + return ESP_OK; +} + +esp_err_t esp_init_bluetooth(void) +{ + btc_msg_t msg; + future_t **future_p; + + if (esp_already_init) { + LOG_ERROR("%s already init\n", __func__); + return ESP_ERR_INVALID_STATE; + } + + future_p = btc_main_get_future_p(BTC_MAIN_INIT_FUTURE); + *future_p = future_new(); + if (*future_p == NULL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_ERR_NO_MEM; + } + + btc_init(); + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_MAIN_INIT; + msg.act = BTC_MAIN_ACT_INIT; + btc_transfer_context(&msg, NULL, 0, NULL); + + if (future_await(*future_p) == FUTURE_FAIL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_FAIL; + } + + esp_already_init = true;; + + return ESP_OK; +} + + +esp_err_t esp_deinit_bluetooth(void) +{ + btc_msg_t msg; + future_t **future_p; + + if (!esp_already_init) { + LOG_ERROR("%s already deinit\n", __func__); + return ESP_ERR_INVALID_STATE; + } + + future_p = btc_main_get_future_p(BTC_MAIN_DEINIT_FUTURE); + *future_p = future_new(); + if (*future_p == NULL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_ERR_NO_MEM; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_MAIN_INIT; + msg.act = BTC_MAIN_ACT_DEINIT; + btc_transfer_context(&msg, NULL, 0, NULL); + + if (future_await(*future_p) == FUTURE_FAIL) { + LOG_ERROR("%s failed\n", __func__); + return ESP_FAIL; + } + + btc_deinit(); + + esp_already_init = false; + + return ESP_OK; +} + + diff --git a/components/bt/bluedroid/api/esp_gap_ble_api.c b/components/bt/bluedroid/api/esp_gap_ble_api.c new file mode 100644 index 000000000..7f4950a9f --- /dev/null +++ b/components/bt/bluedroid/api/esp_gap_ble_api.c @@ -0,0 +1,221 @@ +// Copyright 2015-2016 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. + +#include + +#include "esp_gap_ble_api.h" +#include "bta_api.h" +#include "bt_trace.h" +#include "btc_manage.h" +#include "btc_gap_ble.h" + + +esp_err_t esp_ble_gap_register_callback(esp_profile_cb_t callback) +{ + return (btc_profile_cb_set(BTC_PID_GAP_BLE, callback) == 0 ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gap_config_adv_data(esp_ble_adv_data_t *adv_data) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + if (adv_data == NULL) { + return ESP_ERR_INVALID_ARG; + } + + if (adv_data->service_uuid_len & 0xf) { //not 16*n + return ESP_ERR_INVALID_ARG; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA; + memcpy(&arg.cfg_adv_data.adv_data, adv_data, sizeof(esp_ble_adv_data_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); + +} + + +esp_err_t esp_ble_gap_set_scan_params(esp_ble_scan_params_t *scan_params) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + if (scan_params == NULL) { + return ESP_ERR_INVALID_ARG; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_SET_SCAN_PARAM; + memcpy(&arg.set_scan_param.scan_params, scan_params, sizeof(esp_ble_scan_params_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_start_scanning(uint32_t duration) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_START_SCAN; + arg.start_scan.duration = duration; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gap_stop_scanning(void) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_STOP_SCAN; + return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_start_advertising(esp_ble_adv_params_t *adv_params) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_START_ADV; + memcpy(&arg.start_adv.adv_params, adv_params, sizeof(esp_ble_adv_params_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_stop_advertising(void) +{ + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_STOP_ADV; + + return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM; + memcpy(&arg.conn_update_params.conn_params, params, sizeof(esp_ble_conn_update_params_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN; + arg.set_pkt_data_len.tx_data_length = tx_data_length; + memcpy(arg.set_pkt_data_len.remote_device, remote_device, ESP_BD_ADDR_LEN); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS; + memcpy(arg.set_rand_addr.rand_addr, rand_addr, ESP_BD_ADDR_LEN); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY; + arg.cfg_local_privacy.privacy_enable = privacy_enable; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gap_set_device_name(char *name) +{ + btc_msg_t msg; + btc_ble_gap_args_t arg; + + if (strlen(name) > ESP_GAP_DEVICE_NAME_MAX) { + return ESP_ERR_INVALID_ARG; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GAP_BLE; + msg.act = BTC_GAP_BLE_ACT_SET_DEV_NAME; + strcpy(arg.set_dev_name.device_name, name); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +/******************************************************************************* +** +** Function esp_ble_resolve_adv_data +** +** Description This function is called to get ADV data for a specific type. +** +** Parameters p_adv - pointer of ADV data +** type - finding ADV data type +** p_length - return the length of ADV data not including type +** +** Returns pointer of ADV data +** +*******************************************************************************/ +uint8_t *esp_ble_resolve_adv_data( uint8_t *p_adv, uint8_t type, uint8_t *p_length) +{ + if (((type < ESP_BLE_AD_TYPE_FLAG) || (type > ESP_BLE_AD_TYPE_128SERVICE_DATA)) && + (type != ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE)) { + LOG_ERROR("the eir type not define, type = %x\n", type); + return NULL; + } + + if (p_adv == NULL) { + LOG_ERROR("Invalid p_eir data.\n"); + return NULL; + } + + return (BTM_CheckAdvData( p_adv, type, p_length)); +} + diff --git a/components/bt/bluedroid/profiles/core/bt_profile_act.c b/components/bt/bluedroid/api/esp_gap_bt_api.c similarity index 89% rename from components/bt/bluedroid/profiles/core/bt_profile_act.c rename to components/bt/bluedroid/api/esp_gap_bt_api.c index 934ee0f41..179832af3 100644 --- a/components/bt/bluedroid/profiles/core/bt_profile_act.c +++ b/components/bt/bluedroid/api/esp_gap_bt_api.c @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. - - +#include "esp_gap_bt_api.h" +#include "bta_api.h" +#include "bt_trace.h" diff --git a/components/bt/bluedroid/api/esp_gatt_api.c b/components/bt/bluedroid/api/esp_gatt_api.c deleted file mode 100644 index b322c6dae..000000000 --- a/components/bt/bluedroid/api/esp_gatt_api.c +++ /dev/null @@ -1,1077 +0,0 @@ -// Copyright 2015-2016 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. - -#include "esp_gatt_api.h" -#include "btm_ble_api.h" -//#include "btm_ble_int.h" - -/******************************************************************************* -** -** @function esp_ble_update_conn_params -** -** @brief Update connection parameters, can only be used when connection is up. -** -** @param[in] bd_addr - BD address of the peer -** @param[in] min_int - minimum connection interval, [0x0004~ 0x4000] -** @param[in] max_int - maximum connection interval, [0x0004~ 0x4000] -** @param[in] latency - slave latency [0 ~ 500] -** @param[in] timeout - supervision timeout [0x000a ~ 0xc80] -** -** @return None -** -*******************************************************************************/ -void esp_ble_update_conn_params (BD_ADDR bd_addr, uint16_t min_int, - uint16_t max_int, uint16_t latency, uint16_t timeout) -{ - if (min_int > max_int){ - min_int = max_int; - } - - if (min_int < BTM_BLE_CONN_INT_MIN || max_int > BTM_BLE_CONN_INT_MAX){ - LOG_ERROR("Invalid interval value.\n"); - } - - BTA_DmBleUpdateConnectionParams(bd_addr, min_int, max_int, - latency, timeout); - -} - - - -/******************************************************************************* -** -** @function esp_ble_set_pkt_data_len -** -** @brief This function is to set maximum LE data packet size -** -** @return None -** -** -*******************************************************************************/ -void esp_ble_set_pkt_data_len (BD_ADDR remote_device, uint16_t tx_data_length) -{ - if (tx_data_length > BTM_BLE_DATA_SIZE_MAX){ - tx_data_length = BTM_BLE_DATA_SIZE_MAX; - }else if (tx_data_length < BTM_BLE_DATA_SIZE_MIN){ - tx_data_length = BTM_BLE_DATA_SIZE_MIN; - } - - BTA_DmBleSetDataLength(remote_device, tx_data_length); -} - - - -/******************************************************************************* -** -** @function esp_ble_set_rand_addr -** -** @brief This function set the random address for the appliction -** -** @param[in] rand_addr: the random address whith should be setting -** -** @return None -** -** -*******************************************************************************/ -void esp_ble_set_rand_addr (BD_ADDR rand_addr) -{ - if (rand_addr != NULL){ - BTA_DmSetRandAddress(rand_addr); - }else{ - LOG_ERROR("Invalid randrom address.\n"); - } -} - - -/******************************************************************************* -** -** @function esp_ble_config_local_privacy -** -** @brief Enable/disable privacy on the local device -** -** @param[in] privacy_enable - enable/disabe privacy on remote device. -** -** @return None -** -*******************************************************************************/ -void esp_ble_config_local_privacy (BOOLEAN privacy_enable) -{ - BTA_DmBleConfigLocalPrivacy(privacy_enable); -} - - -/******************************************************************************* -** @function esp_gattc_disable -** @brief This function is called by application to disable GATTC module -** -** @param NULL -** -** @return None. -** -*******************************************************************************/ -void esp_gattc_disable(void) -{ - // TODO: This API funciton didn't finish, will be added it in future -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_app_register -** -** @brief This function is called to register application callbacks -** with GATTC module. -** -** @param[in] app_uuid - applicaiton UUID -** @param[in] client_cb - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_app_register(esp_bt_uuid_t *app_uuid, esp_gattc_cb_t *client_cb) -{ - if (app_uuid != NULL) - { - BTA_GATTC_AppRegister(app_uuid, client_cb); - }else{ - LOG_ERROR("The app uuid invalid.\n"); - } -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_app_unregister -** -** @brief This function is called to unregister an application -** from GATTC module. -** -** @param[in] client_if - client interface identifier. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_app_unregister(esp_gattc_if_t client_if) -{ - BTA_GATTC_AppDeregister(client_if); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_conn -** -** @brief Open a direct connection or add a background auto connection -** bd address -** -** @param[in] client_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_conn(esp_gattc_if_t client_if, BD_ADDR remote_bda, BOOLEAN is_direct) -{ - tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; - if(remote_bda == NULL ){ - LOG_ERROR("Invaild address data \n"); - return; - } - - BTA_GATTC_Open(client_if, remote_bda, is_direct, transport); - - - - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_cancel_conn -** -** @brief Cancel a direct open connection or remove a background auto connection -** bd address -** -** @param[in] client_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_cancel_conn (esp_gattc_if_t client_if, BD_ADDR remote_bda, BOOLEAN is_direct) -{ - if(remote_bda == NULL ){ - LOG_ERROR("Invaild address data \n"); - return; - } - - BTA_GATTC_CancelOpen(client_if, remote_bda, is_direct); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_close -** -** @brief Close a connection to a GATT server. -** -** @param[in] conn_id: connectino ID to be closed. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_close (uint16_t conn_id) -{ - BTA_GATTC_Close(conn_id); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_config_mtu -** -** @brief Configure the MTU size in the GATT channel. This can be done -** only once per connection. -** -** @param[in] conn_id: connection ID. -** mtu: desired MTU size to use. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the mtu value invalid -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_config_mtu (uint16_t conn_id, uint16_t mtu) -{ - if ((mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE)){ - LOG_ERROR("Invalid MTU parameters\n"); - return ESP_GATT_ILLEGAL_PARAMETER; - } - - BTA_GATTC_ConfigureMTU (conn_id, mtu); - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_svc_search_req -** -** @brief This function is called to request a GATT service discovery -** on a GATT server. This function report service search result -** by a callback event, and followed by a service search complete -** event. -** -** @param[in] conn_id: connection ID. -** @param[in] srvc_uuid: a UUID of the service application is interested in. -** If Null, discover for all services. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_svc_search_req (uint16_t conn_id, esp_bt_uuid_t *srvc_uuid) -{ - BTA_GATTC_ServiceSearchRequest(conn_id, srvc_uuid); -} - - -/**************************************************************************************************** -** -** @function esp_ble_gattc_get_first_char -** -** @brief This function is called to find the first characteristic of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] srvc_id: the service ID of which the characteristic is belonged to. -** @param[in] char_uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] char_result: output parameter which will store the GATT -** characteristic ID. -** @param[in] property: output parameter to carry the characteristic property. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the srvc_id or char_result parameter is NULL. -** -*****************************************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_char (uint16_t conn_id, esp_gatt_srvc_id_t *srvc_id, - esp_bt_uuid_t *char_uuid_cond, - esp_gattc_char_id_t *char_result, - esp_gatt_char_prop_t *property) -{ - esp_gatt_status_t status = 0; - - if (!srvc_id || !char_result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetFirstChar (conn_id, srvc_id, char_uuid_cond, - char_result, property); - - return status; - - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_first_char_descr -** -** @brief This function is called to find the first characteristic descriptor of the -** characteristic on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] char_id: the characteristic ID of which the descriptor is belonged to. -** @param[in] descr_uuid_cond: Characteristic Descr UUID, if NULL find the first available -** characteristic. -** @param[in] descr_result: output parameter which will store the GATT -** characteristic descriptor ID. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the char_id or descr_result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_char_descr (uint16_t conn_id, esp_gattc_char_id_t *char_id, - esp_bt_uuid_t *descr_uuid_cond, - esp_gattc_char_descr_id_t *descr_result) -{ - esp_gatt_status_t status; - - if (!char_id || !descr_result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetFirstCharDescr (conn_id, char_id, descr_uuid_cond, descr_result); - - return status; - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_char -** -** @brief This function is called to find the next characteristic of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_char_id: start the characteristic search from the next record -** after the one identified by char_id. -** @param[in] char_uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] char_result: output parameter which will store the GATT -** characteristic ID. -** @param[in] property: output parameter to carry the characteristic property. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the start_char_id or char_result parameter is NULL. -** -*******************************************************************************/ - -esp_gatt_status_t esp_ble_gattc_get_next_char (uint16_t conn_id, - esp_gattc_char_id_t *start_char_id, - esp_bt_uuid_t *char_uuid_cond, - esp_gattc_char_id_t *char_result, - esp_gatt_char_prop_t *property) -{ - - esp_gatt_status_t status; - - if (!start_char_id || !char_result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetNextChar(conn_id, start_char_id, char_uuid_cond, - char_result, property); - - return status; - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_char_descr -** -** @brief This function is called to find the next characteristic descriptor -** of the characterisctic. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_descr_id: start the descriptor search from the next record -** after the one identified by p_start_descr_id. -** @param[in] descr_uuid_cond: Characteristic descriptor UUID, if NULL find -** the first available characteristic descriptor. -** @param[in] descr_result: output parameter which will store the GATT -** characteristic descriptor ID. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the start_descr_id or descr_result parameter is NULL. -** -*******************************************************************************/ - -esp_gatt_status_t esp_ble_gattc_get_next_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *start_descr_id, - esp_bt_uuid_t *descr_uuid_cond, - esp_gattc_char_descr_id_t *descr_result) -{ - esp_gatt_status_t status; - - if (!start_descr_id || !descr_result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetNextCharDescr (conn_id, start_descr_id, descr_uuid_cond, descr_result); - - return status; - -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_first_inclu_srvc -** -** @brief This function is called to find the first included service of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] srvc_id: the service ID of which the characteristic is belonged to. -** @param[in] uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] result: output parameter which will store the GATT ID -** of the included service found. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the srvc_id or result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_inclu_srvc (uint16_t conn_id, esp_gatt_srvc_id_t *srvc_id, - esp_bt_uuid_t *uuid_cond, esp_gattc_incl_srvc_id_t *result) -{ - - esp_gatt_status_t status; - - if (!srvc_id || !result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetFirstIncludedService(conn_id, srvc_id, uuid_cond, result); - - return status; -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_inclu_srvc -** -** @brief This function is called to find the next included service of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_id: start the search from the next record -** after the one identified by p_start_id. -** @param[in] uuid_cond: Included service UUID, if NULL find the first available -** included service. -** @param[in] result: output parameter which will store the GATT ID -** of the included service found. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the p_char_id or p_descr_result parameter is NULL. - -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_next_inclu_srvc (uint16_t conn_id, - esp_gattc_incl_srvc_id_t *start_id, - esp_bt_uuid_t *uuid_cond, - esp_gattc_incl_srvc_id_t *result) -{ - esp_gatt_status_t status; - - if (!start_id || !result){ - return ESP_GATT_ILLEGAL_PARAMETER; - } - - status = BTA_GATTC_GetNextIncludedService(conn_id, start_id, uuid_cond, result); - - return status; -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_char -** -** @brief This function is called to read a service's characteristics of -** the given characteritisc ID. -** -** @param[in] conn_id - connectino ID. -** @param[in] char_id - characteritic ID to read. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_char (uint16_t conn_id, esp_gattc_char_id_t *char_id, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_ReadCharacteristic(conn_id, char_id, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_char_descr -** -** @brief This function is called to read a characteristics descriptor. -** -** @param[in] conn_id - connection ID. -** @param[in] descr_id - characteritic descriptor ID to read. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *descr_id, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_ReadCharDescr (conn_id, descr_id, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_multi -** -** @brief This function is called to read multiple characteristic or -** characteristic descriptors. -** -** @param[in] conn_id - connectino ID. -** @param[in] read_multi - pointer to the read multiple parameter. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_multi (uint16_t conn_id, esp_gattc_multi_t *read_multi, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_ReadMultiple(conn_id, read_multi, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_write_char_val -** -** @brief This function is called to write characteristic value. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - characteristic ID to write. -** @param[in] write_type - type of write. -** @param[in] len: length of the data to be written. -** @param[in] value - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_write_char_val ( uint16_t conn_id, - esp_gattc_char_id_t *char_id, - esp_gattc_write_type_t write_type, - uint16_t len, - uint8_t *value, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_WriteCharValue (conn_id, char_id, write_type, len, value, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_write_char_descr -** -** @brief This function is called to write characteristic descriptor value. -** -** @param[in] conn_id - connection ID -** @param[in] char_descr_id - characteristic descriptor ID to write. -** @param[in] write_type - write type. -** @param[in] data - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_write_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *char_descr_id, - esp_gattc_write_type_t write_type, - esp_gatt_unfmt_t *data, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_WriteCharDescr (conn_id, char_descr_id, write_type, data, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_prepa_write -** -** @brief This function is called to prepare write a characteristic value. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - GATT characteritic ID of the service. -** @param[in] offset - offset of the write value. -** @param[in] len: length of the data to be written. -** @param[in] value - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_prepa_write (uint16_t conn_id, esp_gattc_char_id_t *char_id, - uint16_t offset, uint16_t len, uint8_t *value, - esp_gatt_auth_req_t auth_req) -{ - BTA_GATTC_PrepareWrite (conn_id, char_id, offset, len, value, auth_req); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_execu_write -** -** @brief This function is called to execute write a prepare write sequence. -** -** @param[in] conn_id - connection ID. -** @param[in] is_execute - execute or cancel. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_execu_write (uint16_t conn_id, BOOLEAN is_execute) -{ - BTA_GATTC_ExecuteWrite (conn_id, is_execute); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_send_ind_cfm -** -** @brief This function is called to send handle value confirmation. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - characteristic ID to confirm. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_send_ind_cfm (uint16_t conn_id, esp_gattc_char_id_t *char_id) -{ - BTA_GATTC_SendIndConfirm (conn_id, char_id); -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_register_ntf -** -** @brief This function is called to register for notification of a service. -** -** @param[in] client_if - client interface. -** @param[in] bda - target GATT server. -** @param[in] char_id - pointer to GATT characteristic ID. -** -** @return OK if registration succeed, otherwise failed. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_register_ntf (esp_gattc_if_t client_if, - BD_ADDR bda, - esp_gattc_char_id_t *char_id) -{ - esp_gatt_status_t status = ESP_GATT_ILLEGAL_PARAMETER; - status = BTA_GATTC_RegisterForNotifications (client_if, bda, char_id); - - return status; -} - - -/******************************************************************************* -** -** @function esp_ble_gattc_unregister_ntf -** -** @brief This function is called to de-register for notification of a service. -** -** @param[in] client_if - client interface. -** @param[in] bda - target GATT server. -** @param[in] char_id - pointer to GATT characteristic ID. -** -** @return OK if deregistration succeed, otherwise failed. -** -*******************************************************************************/ -tBTA_GATT_STATUS esp_ble_gattc_unregister_ntf (esp_gattc_if_t client_if, - BD_ADDR bda, - esp_gattc_char_id_t *char_id) -{ - esp_gatt_status_t status = ESP_GATT_ILLEGAL_PARAMETER; - status = BTA_GATTC_DeregisterForNotifications (client_if, bda, char_id); - - return status; -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_disale -** -** @brief This function is called to disable GATTS module -** -** @param[in] None. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_disale(void) -{ - BTA_GATTS_Disable(); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_app_register -** -** @brief This function is called to register application callbacks -** with BTA GATTS module. -** -** @param[in] app_uuid - applicaiton UUID -** @param[in] cback - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_app_register(esp_bt_uuid_t *app_uuid, esp_gatts_cb_t *cback) -{ - BTA_GATTS_AppRegister(app_uuid, cback); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_app_unregister -** -** @brief un-register with GATT Server. -** -** @param[in] server_if: service interface id. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_app_unregister(esp_gatts_if_t server_if) -{ - BTA_GATTS_AppDeregister(server_if); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_create_srvc -** -** @brief Create a service. When service creation is done, a callback -** event BTA_GATTS_CREATE_SRVC_EVT is called to report status -** and service ID to the profile. The service ID obtained in -** the callback function needs to be used when adding included -** service and characteristics/descriptors into the service. -** -** @param[in] server_if: Profile ID this service is belonged to. -** @param[in] service_uuid: service UUID. -** @param[in] inst: instance ID number of this service. -** @param[in] num_handle: numble of handle requessted for this service. -** @param[in] is_primary: is this service a primary one or not. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_create_srvc(esp_gatts_if_t server_if, esp_bt_uuid_t *service_uuid, uint8_t inst, - uint16_t num_handle, BOOLEAN is_primary) -{ - BTA_GATTS_CreateService(server_if, service_uuid, inst, num_handle, is_primary); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_add_inclu_srvc -** -** @brief This function is called to add an included service. After included -** service is included, a callback event BTA_GATTS_ADD_INCL_SRVC_EVT -** is reported the included service ID. -** -** @param[in] service_id: service ID to which this included service is to -** be added. -** @param[in] included_service_id: the service ID to be included. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_inclu_srvc (uint16_t service_id, uint16_t included_service_id) -{ - BTA_GATTS_AddIncludeService(service_id, included_service_id); -} - -/******************************************************************************* -** -** @function esp_ble_gatts_add_char -** -** @brief This function is called to add a characteristic into a service. -** -** @param[in] service_id: service ID to which this included service is to -** be added. -** @param[in] char_uuid : Characteristic UUID. -** @param[in] perm : Characteristic value declaration attribute permission. -** @param[in] property : Characteristic Properties -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_char (uint16_t service_id, esp_bt_uuid_t *char_uuid, - esp_gatt_perm_t perm, esp_gatt_char_prop_t property) -{ - BTA_GATTS_AddCharacteristic (service_id, char_uuid, perm, property); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_add_char_descr -** -** @brief This function is called to add characteristic descriptor. When -** it's done, a callback event BTA_GATTS_ADD_DESCR_EVT is called -** to report the status and an ID number for this descriptor. -** -** @param[in] service_id: service ID to which this charatceristic descriptor is to -** be added. -** @param[in] perm: descriptor access permission. -** @param[in] descr_uuid: descriptor UUID. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_char_descr (uint16_t service_id, - esp_gatt_perm_t perm, - esp_bt_uuid_t * descr_uuid) -{ - BTA_GATTS_AddCharDescriptor (service_id, perm, descr_uuid); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_dele_srvc -** -** @brief This function is called to delete a service. When this is done, -** a callback event BTA_GATTS_DELETE_EVT is report with the status. -** -** @param[in] service_id: service_id to be deleted. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_dele_srvc (uint16_t service_id) -{ - BTA_GATTS_DeleteService(service_id); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_start_srvc -** -** @brief This function is called to start a service. -** -** @param[in] service_id: the service ID to be started. -** @param[in] sup_transport: supported trasnport. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_start_srvc(uint16_t service_id) -{ - tBTA_GATT_TRANSPORT transport = BT_TRANSPORT_LE; - BTA_GATTS_StartService(service_id, transport); -} - -/******************************************************************************* -** -** @function esp_ble_gatts_stop_srvc -** -** @brief This function is called to stop a service. -** -** @param[in] service_id - service to be topped. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_stop_srvc(uint16_t service_id) -{ - BTA_GATTS_StopService(service_id); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_hdl_val_indica -** -** @brief This function is called to read a characteristics descriptor. -** -** @param[in] bda - remote device bd address to indicate. -** @param[in] attr_id - attribute ID to indicate. -** @param[in] data_len - indicate data length. -** @param[in] data: data to indicate. -** @param[in] need_confirm - if this indication expects a confirmation or not. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_hdl_val_indica (uint16_t conn_id, uint16_t attr_id, uint16_t data_len, - uint8_t *data, BOOLEAN need_confirm) -{ - BTA_GATTS_HandleValueIndication (conn_id, attr_id, data_len, data, need_confirm); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_send_rsp -** -** @brief This function is called to send a response to a request. -** -** @param[in] conn_id - connection identifier. -** @param[in] trans_id - transaction ID. -** @param[in] status - response status -** @param[in] msg - response data. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_send_rsp (uint16_t conn_id, uint32_t trans_id, - esp_gatt_status_t status, esp_gatts_rsp_t *msg) -{ - BTA_GATTS_SendRsp (conn_id, trans_id, status, msg); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_conn -** -** @brief Open a direct open connection or add a background auto connection -** bd address -** -** @param[in] server_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_conn (esp_gatts_if_t server_if, BD_ADDR remote_bda, BOOLEAN is_direct) -{ - tBTA_GATT_TRANSPORT transport = BT_TRANSPORT_LE; - BTA_GATTS_Open(server_if, remote_bda, is_direct, transport); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_cancel_conn -** -** @brief Cancel a direct open connection or remove a background auto connection -** bd address -** -** @param[in] server_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_cancel_conn (esp_gatts_if_t server_if, BD_ADDR remote_bda, BOOLEAN is_direct) -{ - BTA_GATTS_CancelOpen(server_if, remote_bda, is_direct); -} - - -/******************************************************************************* -** -** @function esp_ble_gatts_close -** -** @param[in] Close a connection a remote device. -** -** @param[in] conn_id: connectino ID to be closed. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_close(uint16_t conn_id) -{ - BTA_GATTS_Close(conn_id); -} - - -/******************************************************************************* -** -** @function esp_prf_app_register -** -** @brief This function is called to register application callbacks -** with BTA GATTS module. -** -** @param[in] p_app_uuid - applicaiton UUID -** @param[in] p_cback - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_prf_app_register(uint8_t prf_id, void *p_cback) -{ - //tBTA_GATTS_API_REG *p_buf; - - /* register with BTA system manager */ - if (bt_prf_sys_is_register(PRF_ID_SYS) == FALSE) - { - bt_prf_sys_register(PRF_ID_SYS, NULL); - } - -// if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL) -// { -// p_buf->hdr.event = BTA_GATTS_API_REG_EVT; - -// if (p_app_uuid != NULL) -// memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID)); -// p_buf->p_cback = p_cback; - -// bta_sys_sendmsg(p_buf); -// } - return; -} - - - - - diff --git a/components/bt/bluedroid/api/esp_gattc_api.c b/components/bt/bluedroid/api/esp_gattc_api.c new file mode 100644 index 000000000..c59e94ad9 --- /dev/null +++ b/components/bt/bluedroid/api/esp_gattc_api.c @@ -0,0 +1,623 @@ +// Copyright 2015-2016 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. + +#include + +#include "esp_gattc_api.h" +#include "btc_manage.h" +#include "btc_gattc.h" + +/******************************************************************************* +** +** @function esp_ble_gattc_app_register_callback +** +** @brief This function is called to register application callbacks +** with GATTC module. +** +** @param[in] callback - pointer to the application callback function. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_register_callback(esp_profile_cb_t callback) +{ + if (callback == NULL) { + return ESP_FAIL; + } + + btc_profile_cb_set(BTC_PID_GATTC, callback); + return ESP_OK; +} + +/******************************************************************************* +** +** @function esp_ble_gattc_app_register +** +** @brief This function is called to register application +** with GATTC module. +** +** @param[in] app_id : Application Identitfy (UUID), for different application +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_app_register(uint16_t app_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_APP_REGISTER; + arg.app_reg.app_id = app_id; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_app_unregister +** +** @brief This function is called to unregister an application +** from GATTC module. +** +** @param[in] client_if - client interface identifier. +** +** @return None +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_app_unregister(esp_gatt_if_t gatt_if) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_APP_UNREGISTER; + arg.app_unreg.gatt_if = gatt_if; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_conn +** +** @brief Open a direct connection or add a background auto connection +** bd address +** +** @param[in] gatt_if: application identity. +** @param[in] remote_bda: remote device BD address. +** @param[in] is_direct: direct connection or background auto connection +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_open(esp_gatt_if_t gatt_if, esp_bd_addr_t remote_bda, bool is_direct) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_OPEN; + arg.open.gatt_if = gatt_if; + memcpy(arg.open.remote_bda, remote_bda, ESP_BD_ADDR_LEN); + arg.open.is_direct = is_direct; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_close +** +** @brief Close a connection to a GATT server. +** +** @param[in] conn_id: connectino ID to be closed. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_close (uint16_t conn_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_CLOSE; + arg.close.conn_id = conn_id; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +/******************************************************************************* +** +** @function esp_ble_gattc_config_mtu +** +** @brief Configure the MTU size in the GATT channel. This can be done +** only once per connection. +** +** @param[in] conn_id: connection ID. +** mtu: desired MTU size to use. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_config_mtu (uint16_t conn_id, uint16_t mtu) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + if ((mtu < ESP_GATT_DEF_BLE_MTU_SIZE) || (mtu > ESP_GATT_MAX_MTU_SIZE)) { + return ESP_GATT_ILLEGAL_PARAMETER; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_CFG_MTU; + arg.cfg_mtu.conn_id = conn_id; + arg.cfg_mtu.mtu = mtu; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_search_service +** +** @brief This function is called to request a GATT service discovery +** on a GATT server. This function report service search result +** by a callback event, and followed by a service search complete +** event. +** +** @param[in] conn_id: connection ID. +** @param[in] filter_uuid: a UUID of the service application is interested in. +** If Null, discover for all services. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_search_service(uint16_t conn_id, esp_bt_uuid_t *filter_uuid) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_SEARCH_SERVICE; + arg.search_srvc.conn_id = conn_id; + if (filter_uuid) { + arg.search_srvc.filter_uuid_enable = true; + memcpy(&arg.search_srvc.filter_uuid, filter_uuid, sizeof(esp_bt_uuid_t)); + } else { + arg.search_srvc.filter_uuid_enable = false; + } + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_characteristic +** +** @brief This function is called to find the first characteristic of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** +** @param[in] srvc_id: serivce ID +** +** @param[in] start_char_id: the start characteristic ID +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ + +esp_err_t esp_ble_gattc_get_characteristic(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *start_char_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + if (start_char_id) { + arg.get_next_char.conn_id = conn_id; + memcpy(&arg.get_next_char.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.get_next_char.char_id, start_char_id, sizeof(esp_gatt_id_t)); + msg.act = BTC_GATTC_ACT_GET_NEXT_CHAR; + } else { + arg.get_first_char.conn_id = conn_id; + memcpy(&arg.get_first_char.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + msg.act = BTC_GATTC_ACT_GET_FIRST_CHAR; + } + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_descriptor +** +** @brief This function is called to find the descriptor of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** @param[in] srvc_id: the service ID of which the characteristic is belonged to. +** @param[in] char_id: Characteristic ID, if NULL find the first available +** characteristic. +** @param[in] start_descr_id: the sctart descriptor id +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ +esp_err_t esp_ble_gattc_get_descriptor(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_id_t *start_descr_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + + if (start_descr_id) { + arg.get_next_descr.conn_id = conn_id; + memcpy(&arg.get_next_descr.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.get_next_descr.char_id, char_id, sizeof(esp_gatt_id_t)); + memcpy(&arg.get_next_descr.descr_id, start_descr_id, sizeof(esp_gatt_id_t)); + msg.act = BTC_GATTC_ACT_GET_NEXT_DESCR; + } else { + arg.get_first_descr.conn_id = conn_id; + memcpy(&arg.get_first_descr.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.get_first_descr.char_id, char_id, sizeof(esp_gatt_id_t)); + msg.act = BTC_GATTC_ACT_GET_FIRST_DESCR; + } + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_include_service +** +** @brief This function is called to find the first characteristic of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** @param[in] srvc_id: the service ID of which the characteristic is belonged to. +** @param[in] start_incl_srvc_id: the start include service id +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ + + +esp_err_t esp_ble_gattc_get_included_service(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_srvc_id_t *start_incl_srvc_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + + if (start_incl_srvc_id) { + arg.get_next_incl_srvc.conn_id = conn_id; + memcpy(&arg.get_next_incl_srvc.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.get_next_incl_srvc.start_service_id, start_incl_srvc_id, sizeof(esp_gatt_srvc_id_t)); + msg.act = BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE; + } else { + arg.get_first_incl_srvc.conn_id = conn_id; + memcpy(&arg.get_first_incl_srvc.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + msg.act = BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE; + } + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_read_char +** +** @brief This function is called to read a service's characteristics of +** the given characteritisc ID.UTH_REQ_NO_SCATTERNET +** +** @param[in] conn_id - connectino ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteritic ID to read. +** @param[in] auth_req - authenticate request type +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_read_char (uint16_t conn_id, esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, esp_gatt_auth_req_t auth_req) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_READ_CHAR; + arg.read_char.conn_id = conn_id; + memcpy(&arg.read_char.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.read_char.char_id, char_id, sizeof(esp_gatt_id_t)); + arg.read_char.auth_req = auth_req; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_read_char_descr +** +** @brief This function is called to read a characteristics descriptor. +** +** @param[in] conn_id - connection ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] descr_id - characteritic descriptor ID to read. +** @param[in] auth_req - authenticate request type +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_read_char_descr (uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_id_t *descr_id, + esp_gatt_auth_req_t auth_req) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_READ_CHAR_DESCR; + arg.read_descr.conn_id = conn_id; + memcpy(&arg.read_descr.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.read_descr.char_id, char_id, sizeof(esp_gatt_id_t)); + memcpy(&arg.read_descr.descr_id, descr_id, sizeof(esp_gatt_id_t)); + arg.read_descr.auth_req = auth_req; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_write_char +** +** @brief This function is called to write characteristic value. +** +** @param[in] conn_id - connection ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteristic ID to write. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_write_char( uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_WRITE_CHAR; + arg.write_char.conn_id = (uint16_t) conn_id; + memcpy(&arg.write_char.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.write_char.char_id, char_id, sizeof(esp_gatt_id_t)); + arg.write_char.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len; + arg.write_char.value = value; + arg.write_char.auth_req = auth_req; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_write_char_descr +** +** @brief This function is called to write characteristic descriptor value. +** +** @param[in] conn_id - connection ID +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteristic ID. +** @param[in] descr_id - characteristic descriptor ID to write. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_write_char_descr (uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_id_t *descr_id, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_WRITE_CHAR_DESCR; + arg.write_descr.conn_id = (uint16_t) conn_id; + memcpy(&arg.write_descr.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.write_descr.char_id, char_id, sizeof(esp_gatt_id_t)); + memcpy(&arg.write_descr.descr_id, descr_id, sizeof(esp_gatt_id_t)); + arg.write_descr.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len; + arg.write_descr.value = value; + arg.write_descr.auth_req = auth_req; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +/******************************************************************************* +** +** @function esp_ble_gattc_prepare_write +** +** @brief This function is called to prepare write a characteristic value. +** +** @param[in] conn_id - connection ID. +** @param[in] char_id - GATT characteritic ID of the service. +** @param[in] offset - offset of the write value. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_prepare_write(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + uint16_t offset, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req) +{ + //TODO: Review this function + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_PREPARE_WRITE; + arg.prep_write.conn_id = conn_id; + memcpy(&arg.prep_write.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.prep_write.char_id, char_id, sizeof(esp_gatt_id_t)); + arg.prep_write.offset = offset; + arg.prep_write.value_len = value_len > ESP_GATT_MAX_ATTR_LEN ? ESP_GATT_MAX_ATTR_LEN : value_len; // length check ? + arg.prep_write.value = value; + arg.prep_write.auth_req = auth_req; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), btc_gattc_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + + +/******************************************************************************* +** +** @function esp_ble_gattc_execu_write +** +** @brief This function is called to execute write a prepare write sequence. +** +** @param[in] conn_id - connection ID. +** @param[in] is_execute - execute or cancel. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_execute_write (uint16_t conn_id, bool is_execute) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_EXECUTE_WRITE; + arg.exec_write.conn_id = conn_id; + arg.exec_write.is_execute = is_execute; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + + +/******************************************************************************* +** +** @function esp_ble_gattc_register_for_notify +** +** @brief This function is called to register for notification of a service. +** +** @param[in] gatt_if - gatt interface id. +** @param[in] bda - target GATT server. +** @param[in] srvc_id - pointer to GATT service ID. +** @param[in] char_id - pointer to GATT characteristic ID. +** +** @return OK if registration succeed, otherwise failed. +** +*******************************************************************************/ +esp_gatt_status_t esp_ble_gattc_register_for_notify (esp_gatt_if_t gatt_if, + esp_bd_addr_t server_bda, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_REG_FOR_NOTIFY; + arg.reg_for_notify.gatt_if = gatt_if; + memcpy(&arg.reg_for_notify.remote_bda, &server_bda, sizeof(esp_bd_addr_t)); + memcpy(&arg.reg_for_notify.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.reg_for_notify.char_id, char_id, sizeof(esp_gatt_id_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + + +/******************************************************************************* +** +** @function esp_ble_gattc_unregister_ntf +** +** @brief This function is called to de-register for notification of a service. +** +** @param[in] gatt_if - gatt interface id. +** @param[in] bda - target GATT server. +** @param[in] srvc_id - pointer to GATT service ID. +** @param[in] char_id - pointer to GATT characteristic ID. +** +** @return OK if deregistration succeed, otherwise failed. +** +*******************************************************************************/ +esp_gatt_status_t esp_ble_gattc_unregister_for_notify (esp_gatt_if_t gatt_if, + esp_bd_addr_t server_bda, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id) +{ + btc_msg_t msg; + btc_ble_gattc_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTC; + msg.act = BTC_GATTC_ACT_UNREG_FOR_NOTIFY; + arg.unreg_for_notify.gatt_if = gatt_if; + memcpy(&arg.unreg_for_notify.remote_bda, &server_bda, sizeof(esp_bd_addr_t)); + memcpy(&arg.unreg_for_notify.service_id, srvc_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(&arg.unreg_for_notify.char_id, char_id, sizeof(esp_gatt_id_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + diff --git a/components/bt/bluedroid/api/esp_gatts_api.c b/components/bt/bluedroid/api/esp_gatts_api.c new file mode 100644 index 000000000..3004ee8be --- /dev/null +++ b/components/bt/bluedroid/api/esp_gatts_api.c @@ -0,0 +1,227 @@ +// Copyright 2015-2016 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. + +#include "string.h" +#include "esp_gatt_defs.h" +#include "esp_gatts_api.h" +#include "btc_manage.h" +#include "btc_gatts.h" + +#define COPY_TO_GATTS_ARGS(_gatt_args, _arg, _arg_type) memcpy(_gatt_args, _arg, sizeof(_arg_type)) + +esp_err_t esp_ble_gatts_register_callback(esp_profile_cb_t callback) +{ + return (btc_profile_cb_set(BTC_PID_GATTS, callback) == 0 ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_app_register(uint16_t app_id) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + if (app_id < APP_ID_MIN || app_id > APP_ID_MAX) { + return ESP_ERR_INVALID_ARG; + } + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_APP_REGISTER; + arg.app_reg.app_id = app_id; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gatts_app_unregister(esp_gatt_if_t gatt_if) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_APP_UNREGISTER; + arg.app_unreg.gatt_if = gatt_if; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_create_service(esp_gatt_if_t gatt_if, + esp_gatt_srvc_id_t *service_id, uint16_t num_handle) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_CREATE_SERVICE; + arg.create_srvc.gatt_if = gatt_if; + arg.create_srvc.num_handle = num_handle; + memcpy(&arg.create_srvc.service_id, service_id, sizeof(esp_gatt_srvc_id_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gatts_add_include_service(uint16_t service_handle, uint16_t included_service_handle) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_ADD_INCLUDE_SERVICE; + arg.add_incl_srvc.service_handle = service_handle; + arg.add_incl_srvc.included_service_handle = included_service_handle; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gatts_add_char(uint16_t service_handle, esp_bt_uuid_t *char_uuid, + esp_gatt_perm_t perm, esp_gatt_char_prop_t property) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_ADD_CHAR; + arg.add_char.service_handle = service_handle; + arg.add_char.perm = perm; + arg.add_char.property = property; + memcpy(&arg.add_char.char_uuid, char_uuid, sizeof(esp_bt_uuid_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gatts_add_char_descr (uint16_t service_handle, + esp_bt_uuid_t *descr_uuid, + esp_gatt_perm_t perm) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_ADD_CHAR_DESCR; + arg.add_descr.service_handle = service_handle; + arg.add_descr.perm = perm; + memcpy(&arg.add_descr.descr_uuid, descr_uuid, sizeof(esp_bt_uuid_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_delete_service(uint16_t service_handle) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_DELETE_SERVICE; + arg.delete_srvc.service_handle = service_handle; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_start_service(uint16_t service_handle) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_START_SERVICE; + arg.start_srvc.service_handle = service_handle; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_stop_service(uint16_t service_handle) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_STOP_SERVICE; + arg.stop_srvc.service_handle = service_handle; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + + +esp_err_t esp_ble_gatts_send_indicate(uint16_t conn_id, uint16_t attr_handle, + uint16_t value_len, uint8_t *value, bool need_confirm) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_SEND_INDICATE; + arg.send_ind.conn_id = conn_id; + arg.send_ind.attr_handle = attr_handle; + arg.send_ind.need_confirm = need_confirm; + arg.send_ind.value_len = value_len; + arg.send_ind.value = value; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), btc_gatts_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_send_response(uint16_t conn_id, uint32_t trans_id, + esp_gatt_status_t status, esp_gatt_rsp_t *rsp) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_SEND_RESPONSE; + arg.send_rsp.conn_id = conn_id; + arg.send_rsp.trans_id = trans_id; + arg.send_rsp.status = status; + arg.send_rsp.rsp = rsp; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), btc_gatts_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_open(esp_gatt_if_t gatt_if, esp_bd_addr_t remote_bda, bool is_direct) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_OPEN; + arg.open.gatt_if = gatt_if; + arg.open.is_direct = is_direct; + memcpy(&arg.open.remote_bda, remote_bda, sizeof(esp_bd_addr_t)); + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} + +esp_err_t esp_ble_gatts_close(uint16_t conn_id) +{ + btc_msg_t msg; + btc_ble_gatts_args_t arg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_GATTS; + msg.act = BTC_GATTS_ACT_CLOSE; + arg.close.conn_id = conn_id; + + return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gatts_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); +} diff --git a/components/bt/bluedroid/api/esp_sdp_api.c b/components/bt/bluedroid/api/esp_sdp_api.c index a64988226..382f6dc02 100644 --- a/components/bt/bluedroid/api/esp_sdp_api.c +++ b/components/bt/bluedroid/api/esp_sdp_api.c @@ -22,7 +22,7 @@ esp_err_t esp_bt_sdp_enable(bt_sdp_cb_t *cback) return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; } -esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t* uuid) +esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t *uuid) { tBTA_SDP_STATUS status = BTA_SdpSearch(bd_addr, (tSDP_UUID *)uuid); return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; @@ -90,9 +90,9 @@ bool esp_bt_sdp_add_protocol_list (uint32_t handle, uint16_t num_elem, } bool esp_bt_sdp_add_addition_protocol_lists(uint32_t handle, uint16_t num_elem, - sdp_proto_list_elem_t *p_proto_list) + sdp_proto_list_elem_t *p_proto_list) { - return SDP_AddAdditionProtoLists(handle, num_elem, (tSDP_PROTO_LIST_ELEM *)p_proto_list); + return SDP_AddAdditionProtoLists(handle, num_elem, (tSDP_PROTO_LIST_ELEM *)p_proto_list); } bool esp_bt_sdp_add_profile_dscp_list (uint32_t handle, @@ -103,15 +103,15 @@ bool esp_bt_sdp_add_profile_dscp_list (uint32_t handle, } bool esp_bt_sdp_add_lang_base_attr_id_list(uint32_t handle, - uint16_t lang, uint16_t char_enc, - uint16_t base_id) + uint16_t lang, uint16_t char_enc, + uint16_t base_id) { return SDP_AddLanguageBaseAttrIDList(handle, lang, char_enc, base_id); } bool esp_bt_sdp_add_service_class_id_list(uint32_t handle, - uint16_t num_services, - uint16_t *p_service_uuids) + uint16_t num_services, + uint16_t *p_service_uuids) { return SDP_AddServiceClassIdList(handle, num_services, p_service_uuids); } diff --git a/components/bt/bluedroid/api/include/esp_adv_api.h b/components/bt/bluedroid/api/include/esp_adv_api.h deleted file mode 100644 index 88790183b..000000000 --- a/components/bt/bluedroid/api/include/esp_adv_api.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef __ESP_ADV_API_H__ -#define __ESP_ADV_API_H__ - -#include "bt_types.h" -#include "esp_bt_defs.h" -#include "bta_gatt_api.h" -#include "bt_prf_sys.h" - - -/******************************************************************************* -** -** @function esp_ble_config_adv_data -** -** @brief This function is called to override the BTA default ADV parameters. -** -** @param[in] adv_data: Pointer to User defined ADV data structure. This -** memory space can not be freed until p_adv_data_cback -** is received. -** @param[in|out] adv_data_cback: set adv data complete callback. -** -** @return None -** -*******************************************************************************/ -void esp_ble_config_adv_data (esp_ble_adv_data_cfg_t *adv_data, - esp_ble_set_adv_data_cmpl_cb_t *adv_data_cback); - - -/******************************************************************************* -** -** Function esp_ble_set_scan_rsp -** -** Description This function is called to override the app scan response. -** -** Parameters Pointer to User defined ADV data structure -** -** Returns None -** -*******************************************************************************/ -void esp_ble_set_scan_rsp(esp_ble_adv_data_cfg_t *scan_rsp_data, - esp_ble_set_adv_data_cmpl_cb_t *p_scan_rsp_data_cback); - - -/******************************************************************************* -** -** @function esp_ble_set_scan_params -** -** @brief This function is called to set scan parameters -** -** @param[in] esp_ble_scan_params: Pointer to User defined scan_params data structure. This -** memory space can not be freed until scan_param_setup_cback -** @param[in] client_if: Client interface ID -** @param[in|out] scan_param_setup_status_cback - Set scan param status callback -** -** @return None -** -*******************************************************************************/ -void esp_ble_set_scan_params (esp_ble_scan_params *scan_params, esp_gattc_if_t client_if, - esp_scan_param_setup_cb_t scan_param_setup_cback); - - -/******************************************************************************* -** -** @function esp_ble_start_scanning -** -** @brief This procedure keep the device scanning the peer device whith advertising on the air -** -** @param[in] duration: Keeping the scaning time, the unit is second. -** @param[in|out] results_cb: The scanning function callback when the peer device has been scan -** which advertising on the air -** -** @return None -** -*******************************************************************************/ -void esp_ble_start_scanning (UINT8 duration, esp_dm_search_cb_t *results_cb); - - - -/******************************************************************************* -** -** @function esp_ble_start_advertising -** -** @brief This function is called to start advertising. -** -** @param[in] esp_ble_adv_params_all_t: ointer to User defined adv_params data structure. -** -** @return None -** -*******************************************************************************/ -void esp_ble_start_advertising (esp_ble_adv_params_all_t *ble_adv_params); - - - -/******************************************************************************* -** -** @function esp_ble_stop_advertising -** -** @brief This function is called to stop advertising. -** -** @param None -** -** @return None -** -*******************************************************************************/ -void esp_ble_stop_advertising (void); - -#endif /* __ESP_ADV_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_blufi_api.h b/components/bt/bluedroid/api/include/esp_blufi_api.h new file mode 100644 index 000000000..45790f8e8 --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_blufi_api.h @@ -0,0 +1,111 @@ +// Copyright 2015-2016 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_BLUFI_API_H__ +#define __ESP_BLUFI_API_H__ + +#include "bt_types.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "bta_gatt_api.h" +#include "esp_err.h" + +#define ESP_BLUFI_RECV_DATA_LEN_MAX 128 + +#define ESP_BLUFI_EVENT_INIT_FINISH 0 +#define ESP_BLUFI_EVENT_DEINIT_FINISH 1 +#define ESP_BLUFI_EVENT_RECV_DATA 2 + +typedef enum { + ESP_BLUFI_CONFIG_OK = 0, + ESP_BLUFI_CONFIG_FAILED, +} esp_blufi_config_state_t; + +typedef enum { + ESP_BLUFI_INIT_OK = 0, + ESP_BLUFI_INIT_FAILED = 0, +} esp_blufi_init_state_t; + +typedef enum { + ESP_BLUFI_DEINIT_OK = 0, + ESP_BLUFI_DEINIT_FAILED = 0, +} esp_blufi_deinit_state_t; + +typedef union { + //ESP_BLUFI_EVENT_INIT_FINISH + struct blufi_init_finish_evt_param { + esp_blufi_init_state_t state; + } init_finish; + //ESP_BLUFI_EVENT_DEINIT_FINISH + struct blufi_deinit_finish_evt_param { + esp_blufi_deinit_state_t state; + } deinit_finish; + //ESP_BLUFI_EVENT_RECV_DATA + struct blufi_recv_evt_param { + uint8_t data[ESP_BLUFI_RECV_DATA_LEN_MAX]; + uint8_t data_len; + } recv_data; +} esp_blufi_cb_param_t; + +/******************************************************************************* +** +** @function esp_blufi_register_callback +** +** @brief This function is called to receive blufi callback event +** +** @param[in] callback: callback function +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_blufi_register_callback(esp_profile_cb_t callback); + +/******************************************************************************* +** +** @function esp_blufi_send_config_state +** +** @brief This function is called to send config state to phone +** +** @param[in] state: blufi config ok or not +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_blufi_send_config_state(esp_blufi_config_state_t state); + +/******************************************************************************* +** +** @function esp_blufi_profile_init +** +** @brief This function is called to init blufi_profile +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_blufi_profile_init(void); + +/******************************************************************************* +** +** @function esp_blufi_profile_deinit +** +** @brief This function is called to init blufi_profile +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_blufi_profile_deinit(void); + + + +#endif /* _ESP_BLUFI_API_ */ diff --git a/components/bt/bluedroid/api/include/esp_bt_common.h b/components/bt/bluedroid/api/include/esp_bt_common.h deleted file mode 100644 index 4886b12bb..000000000 --- a/components/bt/bluedroid/api/include/esp_bt_common.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef __ESP_BT_COMMON_H__ -#define __ESP_BT_COMMON_H__ - -#include - -#include "bt_types.h" -#include "bta_api.h" -#include "esp_err.h" - -typedef tBT_UUID esp_bt_uuid_t; /* tBT_UUID in "bt_types.h" */ - -typedef BD_ADDR esp_bd_addr_t; /* BD_ADDR in bt_types.h */ - -typedef tBTA_DM_SEC_CBACK esp_bt_sec_cb_t; - -typedef void (*bluetooth_init_cb_t)(void); - -/******************************************************************************* -** -** @function esp_enable_bluetooth -** -** @brief This function is called to enable bluetooth host. This -** function must be called before any other functions in the -** API (except esp_bluetooth_init) are called. -** -** @param[in] p_cback: -** security call back function -** @param[out] None -** -** @return ESP_OK - Success; Other - Failed -** -*******************************************************************************/ -esp_err_t esp_enable_bluetooth(esp_bt_sec_cb_t p_cback); - - -/******************************************************************************* -** -** @function esp_disable_bluetooth -** -** @brief This function is called to disable bluetooth host -** -** @param[in] None -** -** @param[out] None -** -** @return ESP_OK - Success; Other - Failed -** -*******************************************************************************/ -esp_err_t esp_disable_bluetooth(void); - -/******************************************************************************* -** -** @function esp_init_bluetooth -** -** @brief This function is called to init bluetooth host and alloc the -** resource. This function must be called before all othor API -** are called. -** -** @param[in] cb: When this function called success, the callback will be called -** -** @param[out] None -** -** @return ESP_OK - Success; Other - Failed -** -*******************************************************************************/ -esp_err_t esp_init_bluetooth(bluetooth_init_cb_t cb); - -/******************************************************************************* -** -** @function esp_deinit_bluetooth -** -** @brief This function is called to deinit bluetooth host and free the -** resource. -** -** @param[in] None -** -** @param[out] None -** -** @return ESP_OK - Success; Other - Failed -** -*******************************************************************************/ -void esp_deinit_bluetooth(void); - -#endif /* __ESP_BT_COMMON_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_bt_defs.h b/components/bt/bluedroid/api/include/esp_bt_defs.h index a6fee49bc..f968669ce 100644 --- a/components/bt/bluedroid/api/include/esp_bt_defs.h +++ b/components/bt/bluedroid/api/include/esp_bt_defs.h @@ -1,331 +1,88 @@ +// Copyright 2015-2016 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_BT_DEFS_H__ -#define __ESP_BT_DEFS_H__ +#define __ESP_BT_DEFS_H__ +#include +#include -#include "bta_api.h" -#include "btm_ble_api.h" -#include "bta_gatt_api.h" +/* Status Return Value */ +typedef enum { + ESP_BT_STATUS_SUCCESS = 0, /* Successful operation. */ + ESP_BT_STATUS_FAILURE = 1, /* Generic failure. */ + ESP_BT_STATUS_PENDING = 2, /* API cannot be completed right now */ + ESP_BT_STATUS_BUSY = 3, + ESP_BT_STATUS_NO_RESOURCES = 4, + ESP_BT_STATUS_WRONG_MODE = 5, +} esp_bt_status_t; + +#define ESP_DEFAULT_GATT_IF 0xff #define ESP_BLE_CONN_PARAM_UNDEF 0xffff /* use this value when a specific value not to be overwritten */ -#define ESP_BLE_ADV_CHNL_MAP (ESP_BLE_ADV_CHNL_37|ESP_BLE_ADV_CHNL_38|ESP_BLE_ADV_CHNL_39) +#define ESP_BLE_IS_VALID_PARAM(x, min, max) (((x) >= (min) && (x) <= (max)) || ((x) == ESP_BLE_CONN_PARAM_UNDEF)) -/* advertising channel map */ -#define ESP_BLE_ADV_CHNL_37 (0x01 << 0) -#define ESP_BLE_ADV_CHNL_38 (0x01 << 1) -#define ESP_BLE_ADV_CHNL_39 (0x01 << 2) +typedef struct { +#define ESP_UUID_LEN_16 2 +#define ESP_UUID_LEN_32 4 +#define ESP_UUID_LEN_128 16 + uint16_t len; + union { + uint16_t uuid16; + uint32_t uuid32; + uint8_t uuid128[ESP_UUID_LEN_128]; + } uuid; +} __attribute__((packed)) esp_bt_uuid_t; /* tBT_UUID in "bt_types.h" */ -typedef tBTA_GATT_STATUS esp_gatt_status_t; +typedef enum { + ESP_BT_DEVICE_TYPE_BREDR = 0x01, + ESP_BT_DEVICE_TYPE_BLE = 0x02, + ESP_BT_DEVICE_TYPE_DUMO = 0x03, +} esp_bt_dev_type_t; +#define ESP_BD_ADDR_LEN 6 +typedef uint8_t esp_bd_addr_t[ESP_BD_ADDR_LEN]; /* BD_ADDR in bt_types.h */ +/// Own BD address source of the device +typedef enum { + /// Public Address + BD_ADDR_PUBLIC, + /// Provided random address + BD_ADDR_PROVIDED_RND, + /// Provided static random address + BD_ADDR_GEN_STATIC_RND, + /// Generated resolvable private random address + BD_ADDR_GEN_RSLV, + /// Generated non-resolvable private random address + BD_ADDR_GEN_NON_RSLV, + /// Provided Reconnection address + BD_ADDR_PROVIDED_RECON, +} esp_bd_addr_type_t; +typedef enum { + BLE_ADDR_TYPE_PUBLIC = 0x00, + BLE_ADDR_TYPE_RANDOM = 0x01, + BLE_ADDR_TYPE_RPA_PUBLIC = 0x02, + BLE_ADDR_TYPE_RPA_RANDOM = 0x03, +} esp_ble_addr_type_t; +#define APP_ID_MIN 0x0000 +#define APP_ID_MAX 0x7fff - -typedef UINT16 gatt_size_t; -typedef tBT_UUID esp_bt_uuid_t; -typedef tBTA_GATT_ID esp_gatt_id_t; - -typedef tBTA_BLE_AD_MASK esp_ble_ad_mask_t; -typedef tGATT_IF esp_gatt_if_t; -typedef tBTA_GATT_SRVC_ID esp_gatt_srvc_id_t; -typedef tBTA_GATTC_CHAR_ID esp_gattc_char_id_t; -typedef tBTA_GATTC_CHAR_DESCR_ID esp_gattc_char_descr_id_t; -typedef tBTA_GATTC_INCL_SVC_ID esp_gattc_incl_srvc_id_t; -typedef tBTA_GATT_AUTH_REQ esp_gatt_auth_req_t; -typedef tBTA_GATTC_MULTI esp_gattc_multi_t; -typedef tBTA_GATTC_WRITE_TYPE esp_gattc_write_type_t; -typedef tBTA_GATT_UNFMT esp_gatt_unfmt_t; -typedef tBTA_GATT_PERM esp_gatt_perm_t; -typedef tBTA_GATT_CHAR_PROP esp_gatt_char_prop_t; -typedef tBTA_GATTC esp_gattc_t; - -typedef tBTA_GATTC_EVT esp_gattc_evt_t; - -typedef tBTA_GATTC_IF esp_gattc_if_t; - - - -/* Client callback function events */ -#define ESP_GATTC_REG_EVT 0 /* GATT client is registered. */ -#define ESP_GATTC_DEREG_EVT 1 /* GATT client deregistered event */ -#define ESP_GATTC_OPEN_EVT 2 /* GATTC open request status event */ -#define ESP_GATTC_READ_CHAR_EVT 3 /* GATT read characteristic event */ -#define ESP_GATTC_WRITE_CHAR_EVT 4 /* GATT write characteristic or char descriptor event */ -#define ESP_GATTC_CLOSE_EVT 5 /* GATTC close request status event */ -#define ESP_GATTC_SEARCH_CMPL_EVT 6 /* GATT discovery complete event */ -#define ESP_GATTC_SEARCH_RES_EVT 7 /* GATT discovery result event */ -#define ESP_GATTC_READ_DESCR_EVT 8 /* GATT read characterisitc descriptor event */ -#define ESP_GATTC_WRITE_DESCR_EVT 9 /* GATT write characteristic descriptor event */ -#define ESP_GATTC_NOTIF_EVT 10 /* GATT attribute notification event */ -#define ESP_GATTC_PREP_WRITE_EVT 11 /* GATT prepare write event */ -#define ESP_GATTC_EXEC_EVT 12 /* execute write complete event */ -#define ESP_GATTC_ACL_EVT 13 /* ACL up event */ -#define ESP_GATTC_CANCEL_OPEN_EVT 14 /* cancel open event */ -#define ESP_GATTC_SRVC_CHG_EVT 15 /* service change event */ -#define ESP_GATTC_ENC_CMPL_CB_EVT 17 /* encryption complete callback event */ -#define ESP_GATTC_CFG_MTU_EVT 18 /* configure MTU complete event */ -#define ESP_GATTC_ADV_DATA_EVT 19 /* ADV data event */ -#define ESP_GATTC_MULT_ADV_ENB_EVT 20 /* Enable Multi ADV event */ -#define ESP_GATTC_MULT_ADV_UPD_EVT 21 /* Update parameter event */ -#define ESP_GATTC_MULT_ADV_DATA_EVT 22 /* Multi ADV data event */ -#define ESP_GATTC_MULT_ADV_DIS_EVT 23 /* Disable Multi ADV event */ -#define ESP_GATTC_CONGEST_EVT 24 /* Congestion event */ -#define ESP_GATTC_BTH_SCAN_ENB_EVT 25 /* Enable batch scan event */ -#define ESP_GATTC_BTH_SCAN_CFG_EVT 26 /* Config storage event */ -#define ESP_GATTC_BTH_SCAN_RD_EVT 27 /* Batch scan reports read event */ -#define ESP_GATTC_BTH_SCAN_THR_EVT 28 /* Batch scan threshold event */ -#define ESP_GATTC_BTH_SCAN_PARAM_EVT 29 /* Batch scan param event */ -#define ESP_GATTC_BTH_SCAN_DIS_EVT 30 /* Disable batch scan event */ -#define ESP_GATTC_SCAN_FLT_CFG_EVT 31 /* Scan filter config event */ -#define ESP_GATTC_SCAN_FLT_PARAM_EVT 32 /* Param filter event */ -#define ESP_GATTC_SCAN_FLT_STATUS_EVT 33 /* Filter status event */ -#define ESP_GATTC_ADV_VSC_EVT 34 /* ADV VSC event */ - - -/* GATT Server Data Structure */ -/* Server callback function events */ -#define ESP_GATTS_REG_EVT 0 -#define ESP_GATTS_READ_EVT GATTS_REQ_TYPE_READ /* 1 */ -#define ESP_GATTS_WRITE_EVT GATTS_REQ_TYPE_WRITE /* 2 */ -#define ESP_GATTS_EXEC_WRITE_EVT GATTS_REQ_TYPE_WRITE_EXEC /* 3 */ -#define ESP_GATTS_MTU_EVT GATTS_REQ_TYPE_MTU /* 4 */ -#define ESP_GATTS_CFM_EVT GATTS_REQ_TYPE_CONF /* 5 */ -#define ESP_GATTS_DEREG_EVT 6 -#define ESP_GATTS_CREATE_EVT 7 -#define ESP_GATTS_ADD_INCL_SRVC_EVT 8 -#define ESP_GATTS_ADD_CHAR_EVT 9 -#define ESP_GATTS_ADD_CHAR_DESCR_EVT 10 -#define ESP_GATTS_DELELTE_EVT 11 -#define ESP_GATTS_START_EVT 12 -#define ESP_GATTS_STOP_EVT 13 -#define ESP_GATTS_CONNECT_EVT 14 -#define ESP_GATTS_DISCONNECT_EVT 15 -#define ESP_GATTS_OPEN_EVT 16 -#define ESP_GATTS_CANCEL_OPEN_EVT 17 -#define ESP_GATTS_CLOSE_EVT 18 -#define ESP_GATTS_CONGEST_EVT 20 - -/* Attribute permissions -*/ -#define ESP_GATT_PERM_READ BTA_GATT_PERM_READ /* bit 0 - 0x0001 */ -#define ESP_GATT_PERM_READ_ENCRYPTED BTA_GATT_PERM_READ_ENCRYPTED /* bit 1 - 0x0002 */ -#define ESP_GATT_PERM_READ_ENC_MITM BTA_GATT_PERM_READ_ENC_MITM /* bit 2 - 0x0004 */ -#define ESP_GATT_PERM_WRITE BTA_GATT_PERM_WRITE /* bit 4 - 0x0010 */ -#define ESP_GATT_PERM_WRITE_ENCRYPTED BTA_GATT_PERM_WRITE_ENCRYPTED /* bit 5 - 0x0020 */ -#define ESP_GATT_PERM_WRITE_ENC_MITM BTA_GATT_PERM_WRITE_ENC_MITM /* bit 6 - 0x0040 */ -#define ESP_GATT_PERM_WRITE_SIGNED BTA_GATT_PERM_WRITE_SIGNED /* bit 7 - 0x0080 */ -#define ESP_GATT_PERM_WRITE_SIGNED_MITM BTA_GATT_PERM_WRITE_SIGNED_MITM /* bit 8 - 0x0100 */ - -#define ESP_GATTS_INVALID_APP 0xff - -#define ESP_GATTS_INVALID_IF 0 - -/* definition of characteristic properties */ -#define ESP_GATT_CHAR_PROP_BIT_BROADCAST BTA_GATT_CHAR_PROP_BIT_BROADCAST /* 0x01 */ -#define ESP_GATT_CHAR_PROP_BIT_READ BTA_GATT_CHAR_PROP_BIT_READ /* 0x02 */ -#define ESP_GATT_CHAR_PROP_BIT_WRITE_NR BTA_GATT_CHAR_PROP_BIT_WRITE_NR /* 0x04 */ -#define ESP_GATT_CHAR_PROP_BIT_WRITE BTA_GATT_CHAR_PROP_BIT_WRITE /* 0x08 */ -#define ESP_GATT_CHAR_PROP_BIT_NOTIFY BTA_GATT_CHAR_PROP_BIT_NOTIFY /* 0x10 */ -#define ESP_GATT_CHAR_PROP_BIT_INDICATE BTA_GATT_CHAR_PROP_BIT_INDICATE /* 0x20 */ -#define ESP_GATT_CHAR_PROP_BIT_AUTH BTA_GATT_CHAR_PROP_BIT_AUTH /* 0x40 */ -#define ESP_GATT_CHAR_PROP_BIT_EXT_PROP BTA_GATT_CHAR_PROP_BIT_EXT_PROP /* 0x80 */ - -typedef tBTA_GATTS_EVT esp_gatts_evt_t; -typedef tBTA_GATTS_IF esp_gatts_if_t; - -/* attribute value */ -typedef tBTA_GATT_VALUE esp_gatt_value_t; - -/* attribute response data */ -typedef tBTA_GATTS_RSP esp_gatts_rsp_t; - -typedef tBTA_GATTS esp_gatts_t; - -/* attribute request data from the client */ -#define ESP_GATT_PREP_WRITE_CANCEL 0x00 -#define ESP_GATT_PREP_WRITE_EXEC 0x01 -typedef tBTA_GATT_EXEC_FLAG esp_gatt_exec_flag_t; - -/* read request always based on UUID */ -typedef tBTA_GATT_READ_REQ esp_gatt_read_req_t; - -/* write request data */ -typedef tBTA_GATT_WRITE_REQ esp_gatt_write_req_t; - -/* callback data for server access request from client */ -typedef tBTA_GATTS_REQ_DATA esp_gatts_req_data_t; - - -/* Search callback */ -typedef tBTA_DM_SEARCH_CBACK esp_dm_search_cb_t; - -typedef tBLE_SCAN_PARAM_SETUP_CBACK esp_scan_param_setup_cb_t; - - -typedef tBTA_SET_ADV_DATA_CMPL_CBACK esp_ble_set_adv_data_cmpl_cb_t; - -/* GATTC enable callback function */ -typedef void (esp_gattc_enb_cb_t)(esp_gatt_status_t status); - -/* Client callback function */ -typedef void (esp_gattc_cb_t)(esp_gattc_evt_t event, esp_gattc_t *cb_data); - - -/* GATTS enable callback function */ -typedef void (esp_gatts_enb_cb_t)(esp_gatt_status_t status); - -/* Server callback function */ -typedef void (esp_gatts_cb_t)(esp_gatts_evt_t event, esp_gatts_t *cb_data); - - -/* Success code and error codes */ -#define ESP_GATT_OK BTA_GATT_OK -#define ESP_GATT_INVALID_HANDLE BTA_GATT_INVALID_HANDLE /* 0x0001 */ -#define ESP_GATT_READ_NOT_PERMIT BTA_GATT_READ_NOT_PERMIT /* 0x0002 */ -#define ESP_GATT_WRITE_NOT_PERMIT BTA_GATT_WRITE_NOT_PERMIT /* 0x0003 */ -#define ESP_GATT_INVALID_PDU BTA_GATT_INVALID_PDU /* 0x0004 */ -#define ESP_GATT_INSUF_AUTHENTICATION BTA_GATT_INSUF_AUTHENTICATION /* 0x0005 */ -#define ESP_GATT_REQ_NOT_SUPPORTED BTA_GATT_REQ_NOT_SUPPORTED /* 0x0006 */ -#define ESP_GATT_INVALID_OFFSET BTA_GATT_INVALID_OFFSET /* 0x0007 */ -#define ESP_GATT_INSUF_AUTHORIZATION BTA_GATT_INSUF_AUTHORIZATION /* 0x0008 */ -#define ESP_GATT_PREPARE_Q_FULL BTA_GATT_PREPARE_Q_FULL /* 0x0009 */ -#define ESP_GATT_NOT_FOUND BTA_GATT_NOT_FOUND /* 0x000a */ -#define ESP_GATT_NOT_LONG BTA_GATT_NOT_LONG /* 0x000b */ -#define ESP_GATT_INSUF_KEY_SIZE BTA_GATT_INSUF_KEY_SIZE /* 0x000c */ -#define ESP_GATT_INVALID_ATTR_LEN BTA_GATT_INVALID_ATTR_LEN /* 0x000d */ -#define ESP_GATT_ERR_UNLIKELY BTA_GATT_ERR_UNLIKELY /* 0x000e */ -#define ESP_GATT_INSUF_ENCRYPTION BTA_GATT_INSUF_ENCRYPTION /* 0x000f */ -#define ESP_GATT_UNSUPPORT_GRP_TYPE BTA_GATT_UNSUPPORT_GRP_TYPE /* 0x0010 */ -#define ESP_GATT_INSUF_RESOURCE BTA_GATT_INSUF_RESOURCE /* 0x0011 */ - - -#define ESP_GATT_NO_RESOURCES BTA_GATT_NO_RESOURCES /* 0x80 */ -#define ESP_GATT_INTERNAL_ERROR BTA_GATT_INTERNAL_ERROR /* 0x81 */ -#define ESP_GATT_WRONG_STATE BTA_GATT_WRONG_STATE /* 0x82 */ -#define ESP_GATT_DB_FULL BTA_GATT_DB_FULL /* 0x83 */ -#define ESP_GATT_BUSY BTA_GATT_BUSY /* 0x84 */ -#define ESP_GATT_ERROR BTA_GATT_ERROR /* 0x85 */ -#define ESP_GATT_CMD_STARTED BTA_GATT_CMD_STARTED /* 0x86 */ -#define ESP_GATT_ILLEGAL_PARAMETER BTA_GATT_ILLEGAL_PARAMETER /* 0x87 */ -#define ESP_GATT_PENDING BTA_GATT_PENDING /* 0x88 */ -#define ESP_GATT_AUTH_FAIL BTA_GATT_AUTH_FAIL /* 0x89 */ -#define ESP_GATT_MORE BTA_GATT_MORE /* 0x8a */ -#define ESP_GATT_INVALID_CFG BTA_GATT_INVALID_CFG /* 0x8b */ -#define ESP_GATT_SERVICE_STARTED BTA_GATT_SERVICE_STARTED /* 0x8c */ -#define ESP_GATT_ENCRYPED_MITM BTA_GATT_ENCRYPED_MITM /* GATT_SUCCESS */ -#define ESP_GATT_ENCRYPED_NO_MITM BTA_GATT_ENCRYPED_NO_MITM /* 0x8d */ -#define ESP_GATT_NOT_ENCRYPTED BTA_GATT_NOT_ENCRYPTED /* 0x8e */ -#define ESP_GATT_CONGESTED BTA_GATT_CONGESTED /* 0x8f */ - -#define ESP_GATT_DUP_REG BTA_GATT_DUP_REG /* 0x90 */ -#define ESP_GATT_ALREADY_OPEN BTA_GATT_ALREADY_OPEN /* 0x91 */ -#define ESP_GATT_CANCEL BTA_GATT_CANCEL /* 0x92 */ - - /* 0xE0 ~ 0xFC reserved for future use */ -#define ESP_GATT_CCC_CFG_ERR BTA_GATT_CCC_CFG_ERR /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */ -#define ESP_GATT_PRC_IN_PROGRESS BTA_GATT_PRC_IN_PROGRESS /* 0xFE Procedure Already in progress */ -#define ESP_GATT_OUT_OF_RANGE BTA_GATT_OUT_OF_RANGE /* 0xFFAttribute value out of range */ - - +typedef void (* esp_profile_cb_t)(uint32_t event, void *param); #define API_BLE_ISVALID_PARAM(x, min, max) (((x) >= (min) && (x) <= (max)) || ((x) == ESP_BLE_CONN_PARAM_UNDEF)) - -enum -{ - BLE_ADV_DATA_IDX, - BLE_SCAN_RSP_DATA_IDX, - ADV_SCAN_IDX_MAX -}; - -/// Advertising mode -enum api_adv_type -{ - /// Mode in non-discoverable - API_NON_DISCOVERABLE, - /// Mode in general discoverable - API_GEN_DISCOVERABLE, - /// Mode in limited discoverable - API_LIM_DISCOVERABLE, - /// Broadcaster mode which is a non discoverable and non connectable mode. - API_BROADCASTER_MODE, -}; - -enum api_adv_filter -{ - ///Allow both scan and connection requests from anyone - ADV_ALLOW_SCAN_ANY_CON_ANY = 0x00, - ///Allow both scan req from White List devices only and connection req from anyone - ADV_ALLOW_SCAN_WLST_CON_ANY, - ///Allow both scan req from anyone and connection req from White List devices only - ADV_ALLOW_SCAN_ANY_CON_WLST, - ///Allow scan and connection requests from White List devices only - ADV_ALLOW_SCAN_WLST_CON_WLST, - ///Enumeration end value for advertising filter policy value check - ADV_ALLOW_SCAN_END -}; - -/// Own BD address source of the device -enum api_own_addr_src -{ - /// Public Address - API_PUBLIC_ADDR, - /// Provided random address - API_PROVIDED_RND_ADDR, - /// Provided static random address - API_GEN_STATIC_RND_ADDR, - /// Generated resolvable private random address - API_GEN_RSLV_ADDR, - /// Generated non-resolvable private random address - API_GEN_NON_RSLV_ADDR, - /// Provided Reconnection address - API_PROVIDED_RECON_ADDR, -}; - - - -typedef struct -{ - char *adv_name; //set the device name to be sent on the advertising - tBTA_BLE_ADV_DATA ble_adv_data; -}esp_ble_adv_data_cfg_t; - -typedef struct -{ - UINT16 adv_int_min; - UINT16 adv_int_max; - tBLE_BD_ADDR *p_dir_bda; -}esp_ble_adv_params_t; - -typedef struct -{ - UINT16 adv_int_min; - UINT16 adv_int_max; - UINT8 adv_type; - tBLE_ADDR_TYPE addr_type_own; - tBTM_BLE_ADV_CHNL_MAP channel_map; - tBTM_BLE_AFP adv_filter_policy; - tBLE_BD_ADDR *p_dir_bda; -}esp_ble_adv_params_all_t; - -typedef struct -{ - UINT8 scan_type; - UINT16 scan_intv; - UINT16 scan_win; - UINT8 addr_type_own; - UINT8 scan_fil_policy; -}esp_ble_scan_params; - - -extern void ble_config_adv_data(esp_ble_adv_data_cfg_t *adv_data, - tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback); - -extern void ble_set_scan_rsp(esp_ble_adv_data_cfg_t *scan_rsp_data, - tBTA_SET_ADV_DATA_CMPL_CBACK *p_scan_rsp_data_cback); - - - - -#endif ///__ESP_BT_DEFS_H__ +#endif ///__ESP_BT_DEFS_H__ diff --git a/components/bt/bluedroid/api/include/esp_bt_main.h b/components/bt/bluedroid/api/include/esp_bt_main.h new file mode 100644 index 000000000..dd7ec7116 --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_bt_main.h @@ -0,0 +1,30 @@ +// Copyright 2015-2016 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_BT_MAIN_H__ +#define __ESP_BT_MAIN_H__ + +#include "btc_main.h" +#include "esp_err.h" + +esp_err_t esp_enable_bluetooth(void); + +esp_err_t esp_disable_bluetooth(void); + +esp_err_t esp_init_bluetooth(void); + +esp_err_t esp_deinit_bluetooth(void); + + +#endif /* __ESP_BT_MAIN_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gap_api.h b/components/bt/bluedroid/api/include/esp_gap_api.h deleted file mode 100644 index 809da0a19..000000000 --- a/components/bt/bluedroid/api/include/esp_gap_api.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __ESP_GAP_API_H__ -#define __ESP_GAP_API_H__ - -#include - -#include "esp_err.h" -#include "esp_bt_common.h" - -enum { - BT_SCAN_MODE_NONE, - BT_SCAN_MODE_CONNECTABLE, - BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE -}; -typedef uint16_t bt_scan_mode_t; - -esp_err_t esp_bt_gap_set_scan_mode(bt_scan_mode_t mode); - -#endif /* __ESP_GAP_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gap_ble_api.h b/components/bt/bluedroid/api/include/esp_gap_ble_api.h new file mode 100644 index 000000000..08190eec8 --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_gap_ble_api.h @@ -0,0 +1,390 @@ +// Copyright 2015-2016 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_GAP_BLE_API_H__ +#define __ESP_GAP_BLE_API_H__ + +#include +#include + +#include "esp_err.h" +#include "esp_bt_defs.h" + +#define ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT 0 +#define ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT 1 +#define ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT 2 +#define ESP_GAP_BLE_SCAN_RESULT_EVT 3 + +#define ESP_BLE_ADV_DATA_LEN_MAX 31 + +/****************** define the adv type macro***************************************/ +#define ESP_BLE_AD_TYPE_FLAG 0x01 +#define ESP_BLE_AD_TYPE_16SRV_PART 0x02 +#define ESP_BLE_AD_TYPE_16SRV_CMPL 0x03 +#define ESP_BLE_AD_TYPE_32SRV_PART 0x04 +#define ESP_BLE_AD_TYPE_32SRV_CMPL 0x05 +#define ESP_BLE_AD_TYPE_128SRV_PART 0x06 +#define ESP_BLE_AD_TYPE_128SRV_CMPL 0x07 +#define ESP_BLE_AD_TYPE_NAME_SHORT 0x08 +#define ESP_BLE_AD_TYPE_NAME_CMPL 0x09 +#define ESP_BLE_AD_TYPE_TX_PWR 0x0A +#define ESP_BLE_AD_TYPE_DEV_CLASS 0x0D +#define ESP_BLE_AD_TYPE_SM_TK 0x10 +#define ESP_BLE_AD_TYPE_SM_OOB_FLAG 0x11 +#define ESP_BLE_AD_TYPE_INT_RANGE 0x12 +#define ESP_BLE_AD_TYPE_SOL_SRV_UUID 0x14 +#define ESP_BLE_AD_TYPE_128SOL_SRV_UUID 0x15 +#define ESP_BLE_AD_TYPE_SERVICE_DATA 0x16 +#define ESP_BLE_AD_TYPE_PUBLIC_TARGET 0x17 +#define ESP_BLE_AD_TYPE_RANDOM_TARGET 0x18 +#define ESP_BLE_AD_TYPE_APPEARANCE 0x19 +#define ESP_BLE_AD_TYPE_ADV_INT 0x1A +#define ESP_BLE_AD_TYPE_32SOL_SRV_UUID 0x1B +#define ESP_BLE_AD_TYPE_32SERVICE_DATA 0x1C +#define ESP_BLE_AD_TYPE_128SERVICE_DATA 0x1D +#define ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE 0xFF + + +typedef uint32_t esp_gap_ble_event_t; + +/// Advertising mode +typedef enum { + ADV_TYPE_IND = 0x00, + ADV_TYPE_DIRECT_IND_HIGH = 0x01, + ADV_TYPE_SCAN_IND = 0x02, + ADV_TYPE_NONCONN_IND = 0x03, + ADV_TYPE_DIRECT_IND_LOW = 0x04, +} esp_ble_adv_type_t; + +typedef enum { + ADV_CHNL_37 = 0x01, + ADV_CHNL_38 = 0x02, + ADV_CHNL_39 = 0x03, + ADV_CHNL_ALL = 0x07, +} esp_ble_adv_channel_t; + +typedef enum { + ///Allow both scan and connection requests from anyone + ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY = 0x00, + ///Allow both scan req from White List devices only and connection req from anyone + ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY, + ///Allow both scan req from anyone and connection req from White List devices only + ADV_FILTER_ALLOW_SCAN_ANY_CON_WLST, + ///Allow scan and connection requests from White List devices only + ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST, + ///Enumeration end value for advertising filter policy value check +} esp_ble_adv_filter_t; + + +typedef struct { + uint16_t adv_int_min; + uint16_t adv_int_max; + esp_ble_adv_type_t adv_type; + esp_ble_addr_type_t own_addr_type; + esp_bd_addr_t peer_addr; + esp_ble_addr_type_t peer_addr_type; + esp_ble_adv_channel_t channel_map; + esp_ble_adv_filter_t adv_filter_policy; +} esp_ble_adv_params_t; + +typedef struct { + bool set_scan_rsp; + bool include_name; + bool include_txpower; + int min_interval; + int max_interval; + int appearance; + uint16_t manufacturer_len; + uint8_t *p_manufacturer_data; + uint16_t service_data_len; + uint8_t *p_service_data; + uint16_t service_uuid_len; + uint8_t *p_service_uuid; + uint8_t flag; +} esp_ble_adv_data_t; + +/// Own BD address source of the device +typedef enum { + /// Public Address + ESP_PUBLIC_ADDR, + /// Provided random address + ESP_PROVIDED_RND_ADDR, + /// Provided static random address + ESP_GEN_STATIC_RND_ADDR, + /// Generated resolvable private random address + ESP_GEN_RSLV_ADDR, + /// Generated non-resolvable private random address + ESP_GEN_NON_RSLV_ADDR, + /// Provided Reconnection address + ESP_PROVIDED_RECON_ADDR, +} esp_ble_own_addr_src_t; + + +typedef enum { + BLE_SCAN_TYPE_PASSIVE = 0x0, + BLE_SCAN_TYPE_ACTIVE = 0x1, +} esp_ble_scan_type_t; + +typedef enum { + BLE_SCAN_FILTER_ALLOW_ALL = 0x0, + BLE_SCAN_FILTER_ALLOW_ONLY_WLST = 0x1, + BLE_SCAN_FILTER_ALLOW_UND_RPA_DIR = 0x2, + BLE_SCAN_FILTER_ALLOW_WLIST_PRA_DIR = 0x3, +} esp_ble_scan_filter_t; + +typedef struct { + esp_ble_scan_type_t scan_type; + esp_ble_addr_type_t own_addr_type; + esp_ble_scan_filter_t scan_filter_policy; + uint16_t scan_interval; + uint16_t scan_window; +} esp_ble_scan_params_t; + +typedef struct { + esp_bd_addr_t bda; + uint16_t min_int; + uint16_t max_int; + uint16_t latency; + uint16_t timeout; +} esp_ble_conn_update_params_t; + +typedef void (*esp_gap_ble_cb_t)(esp_gap_ble_event_t event, void *param); + +typedef enum { + /* Search callback events */ + ESP_GAP_SEARCH_INQ_RES_EVT = 0, /* Inquiry result for a peer device. */ + ESP_GAP_SEARCH_INQ_CMPL_EVT = 1, /* Inquiry complete. */ + ESP_GAP_SEARCH_DISC_RES_EVT = 2, /* Discovery result for a peer device. */ + ESP_GAP_SEARCH_DISC_BLE_RES_EVT = 3, /* Discovery result for BLE GATT based servoce on a peer device. */ + ESP_GAP_SEARCH_DISC_CMPL_EVT = 4, /* Discovery complete. */ + ESP_GAP_SEARCH_DI_DISC_CMPL_EVT = 5, /* Discovery complete. */ + ESP_GAP_SEARCH_SEARCH_CANCEL_CMPL_EVT = 6, /* Search cancelled */ +} esp_gap_search_evt_t; + +typedef union { + //ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT 0 + struct ble_adv_data_cmpl_evt_param { + esp_bt_status_t status; + } adv_data_cmpl; + //ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT 1 + struct ble_scan_rsp_data_cmpl_evt_param { + esp_bt_status_t status; + } scan_rsp_data_cmpl; + //ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT 2 + struct ble_scan_param_cmpl_evt_param { + esp_bt_status_t status; + } scan_param_cmpl; + //ESP_GAP_BLE_SCAN_RESULT_EVT 3 + struct ble_scan_result_evt_param { + esp_gap_search_evt_t search_evt; + esp_bd_addr_t bda; + esp_bt_dev_type_t dev_type; + esp_ble_addr_type_t ble_addr_type; + int rssi; + uint8_t ble_adv[ESP_BLE_ADV_DATA_LEN_MAX]; /* received EIR */ + int flag; + int num_resps; + } scan_rst; +} esp_ble_gap_cb_param_t; + +/******************************************************************************* +** +** @function esp_ble_gap_register_callback +** +** @brief This function is called to occur gap event, such as scan result +** +** @param[in] callback: callback function +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ + +esp_err_t esp_ble_gap_register_callback(esp_profile_cb_t callback); + + +/******************************************************************************* +** +** @function esp_ble_gap_config_adv_data +** +** @brief This function is called to override the BTA default ADV parameters. +** +** @param[in] adv_data: Pointer to User defined ADV data structure. This +** memory space can not be freed until p_adv_data_cback +** is received. +** @param[in|out] adv_data_cback: set adv data complete callback. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_config_adv_data (esp_ble_adv_data_t *adv_data); + + + +/******************************************************************************* +** +** @function esp_ble_gap_set_scan_params +** +** @brief This function is called to set scan parameters +** +** @param[in] esp_ble_scan_params: Pointer to User defined scan_params data structure. This +** memory space can not be freed until scan_param_setup_cback +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_set_scan_params(esp_ble_scan_params_t *scan_params); + + +/******************************************************************************* +** +** @function esp_ble_gap_start_scanning +** +** @brief This procedure keep the device scanning the peer device whith advertising on the air +** +** @param[in] duration: Keeping the scaning time, the unit is second. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_start_scanning(uint32_t duration); + + +/******************************************************************************* +** +** @function esp_ble_gap_stop_scanning +** +** @brief This function call to stop the device scanning the peer device whith advertising on the air +** @param void +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_stop_scanning(void); + +/******************************************************************************* +** +** @function esp_ble_gap_start_advertising +** +** @brief This function is called to start advertising. +** +** @param[in] esp_ble_adv_params_all_t: ointer to User defined adv_params data structure. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_start_advertising (esp_ble_adv_params_t *adv_params); + + + +/******************************************************************************* +** +** @function esp_gap_ble_stop_advertising +** +** @brief This function is called to stop advertising. +** +** @param None +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_stop_advertising(void); + + + +/******************************************************************************* +** +** @function esp_ble_update_conn_params +** +** @brief Update connection parameters, can only be used when connection is up. +** +** @param[in] param - connection update params +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params); + + +/******************************************************************************* +** +** @function esp_ble_gap_set_pkt_data_len +** +** @brief This function is to set maximum LE data packet size +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length); + + + +/******************************************************************************* +** +** @function esp_ble_gap_set_rand_addr +** +** @brief This function set the random address for the appliction +** +** @param[in] rand_addr: the random address whith should be setting +** +** @return ESP_OK - success, other - failed +** +** +*******************************************************************************/ +esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr); + + + +/******************************************************************************* +** +** @function esp_ble_gap_config_local_privacy +** +** @brief Enable/disable privacy on the local device +** +** @param[in] privacy_enable - enable/disabe privacy on remote device. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable); + + +/******************************************************************************* +** +** @function esp_ble_gap_set_device_name +** +** @brief Set device name to the local device +** +** @param[in] name - device name. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gap_set_device_name(char *name); + + +/******************************************************************************* +** +** @function esp_ble_resolve_adv_data +** +** @brief This function is called to get ADV data for a specific type. +** +** @param[in] p_adv - pointer of ADV data whitch to be resolved +** @param[in] type - finding ADV data type +** @param[out] p_length - return the length of ADV data not including type +** +** @return pointer of ADV data +** +*******************************************************************************/ +uint8_t *esp_ble_resolve_adv_data( uint8_t *p_adv, uint8_t type, uint8_t *p_length ); + +#endif /* __ESP_GAP_BLE_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gap_bt_api.h b/components/bt/bluedroid/api/include/esp_gap_bt_api.h new file mode 100644 index 000000000..6b958a891 --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_gap_bt_api.h @@ -0,0 +1,31 @@ +// Copyright 2015-2016 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_GAP_BT_API_H__ +#define __ESP_GAP_BT_API_H__ + +#include + +#include "esp_err.h" +#include "esp_bt_defs.h" + +typedef enum { + BT_SCAN_MODE_NONE = 0, + BT_SCAN_MODE_CONNECTABLE, + BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE +} bt_scan_mode_t; + +esp_err_t esp_bt_gap_set_scan_mode(bt_scan_mode_t mode); + +#endif /* __ESP_GAP_BT_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gatt_api.h b/components/bt/bluedroid/api/include/esp_gatt_api.h deleted file mode 100644 index 53fcf7a2c..000000000 --- a/components/bt/bluedroid/api/include/esp_gatt_api.h +++ /dev/null @@ -1,829 +0,0 @@ -#ifndef __ESP_GATT_API_H__ -#define __ESP_GATT_API_H__ - -#include "bt_types.h" -#include "esp_bt_defs.h" -#include "bta_gatt_api.h" -#include "bt_prf_sys.h" - - -/******************************************************************************* -** -** @function esp_ble_update_conn_params -** -** @brief Update connection parameters, can only be used when connection is up. -** -** @param[in] bd_addr - BD address of the peer -** @param[in] min_int - minimum connection interval, [0x0004~ 0x4000] -** @param[in] max_int - maximum connection interval, [0x0004~ 0x4000] -** @param[in] latency - slave latency [0 ~ 500] -** @param[in] timeout - supervision timeout [0x000a ~ 0xc80] -** -** @return None -** -*******************************************************************************/ -void esp_ble_update_conn_params (BD_ADDR bd_addr, uint16_t min_int, - uint16_t max_int, uint16_t latency, uint16_t timeout); - - -/******************************************************************************* -** -** @function esp_ble_set_pkt_data_len -** -** @brief This function is to set maximum LE data packet size -** -** @return None -** -** -*******************************************************************************/ -void esp_ble_set_pkt_data_len (BD_ADDR remote_device, uint16_t tx_data_length); - - - -/******************************************************************************* -** -** @function esp_ble_set_rand_addr -** -** @brief This function set the random address for the appliction -** -** @param[in] rand_addr: the random address whith should be setting -** -** @return None -** -** -*******************************************************************************/ -void esp_ble_set_rand_addr (BD_ADDR rand_addr); - - - -/******************************************************************************* -** -** @function esp_ble_config_local_privacy -** -** @brief Enable/disable privacy on the local device -** -** @param[in] privacy_enable - enable/disabe privacy on remote device. -** -** @return None -** -*******************************************************************************/ -void esp_ble_config_local_privacy (BOOLEAN privacy_enable); - - - -/******************************************************************************* -** @function esp_gattc_disable -** @brief This function is called by application to disable GATTC module -** -** @param NULL -** -** @return None. -** -*******************************************************************************/ -void esp_gattc_disable(void); - - -/******************************************************************************* -** -** @function esp_ble_gattc_app_register -** -** @brief This function is called to register application callbacks -** with GATTC module. -** -** @param[in] app_uuid - applicaiton UUID -** @param[in] client_cb - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_app_register(esp_bt_uuid_t *app_uuid, esp_gattc_cb_t *client_cb); - - -/******************************************************************************* -** -** @function esp_ble_gattc_app_unregister -** -** @brief This function is called to unregister an application -** from GATTC module. -** -** @param[in] client_if - client interface identifier. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_app_unregister(esp_gattc_if_t client_if); - - -/******************************************************************************* -** -** @function esp_ble_gattc_conn -** -** @brief Open a direct connection or add a background auto connection -** bd address -** -** @param[in] client_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_conn(esp_gattc_if_t client_if, BD_ADDR remote_bda, BOOLEAN is_direct); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_cancel_conn -** -** @brief Cancel a direct open connection or remove a background auto connection -** bd address -** -** @param[in] client_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_cancel_conn (esp_gattc_if_t client_if, BD_ADDR remote_bda, BOOLEAN is_direct); - - -/******************************************************************************* -** -** @function esp_ble_gattc_close -** -** @brief Close a connection to a GATT server. -** -** @param[in] conn_id: connectino ID to be closed. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_close (uint16_t conn_id); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_config_mtu -** -** @brief Configure the MTU size in the GATT channel. This can be done -** only once per connection. -** -** @param[in] conn_id: connection ID. -** mtu: desired MTU size to use. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the mtu value invalid -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_config_mtu (uint16_t conn_id, uint16_t mtu); - - -/******************************************************************************* -** -** @function esp_ble_gattc_svc_search_req -** -** @brief This function is called to request a GATT service discovery -** on a GATT server. This function report service search result -** by a callback event, and followed by a service search complete -** event. -** -** @param[in] conn_id: connection ID. -** @param[in] srvc_uuid: a UUID of the service application is interested in. -** If Null, discover for all services. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_svc_search_req (uint16_t conn_id, esp_bt_uuid_t *srvc_uuid); - - -/**************************************************************************************************** -** -** @function esp_ble_gattc_get_first_char -** -** @brief This function is called to find the first characteristic of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] srvc_id: the service ID of which the characteristic is belonged to. -** @param[in] char_uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] char_result: output parameter which will store the GATT -** characteristic ID. -** @param[in] property: output parameter to carry the characteristic property. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the srvc_id or char_result parameter is NULL. -** -*****************************************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_char (uint16_t conn_id, esp_gatt_srvc_id_t *srvc_id, - esp_bt_uuid_t *char_uuid_cond, - esp_gattc_char_id_t *char_result, - esp_gatt_char_prop_t *property); - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_first_char_descr -** -** @brief This function is called to find the first characteristic descriptor of the -** characteristic on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] char_id: the characteristic ID of which the descriptor is belonged to. -** @param[in] descr_uuid_cond: Characteristic Descr UUID, if NULL find the first available -** characteristic. -** @param[in] descr_result: output parameter which will store the GATT -** characteristic descriptor ID. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the char_id or descr_result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_char_descr (uint16_t conn_id, esp_gattc_char_id_t *char_id, - esp_bt_uuid_t *descr_uuid_cond, - esp_gattc_char_descr_id_t *descr_result); - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_inclu_srvc -** -** @brief This function is called to find the next included service of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_id: start the search from the next record -** after the one identified by p_start_id. -** @param[in] uuid_cond: Included service UUID, if NULL find the first available -** included service. -** @param[in] result: output parameter which will store the GATT ID -** of the included service found. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the p_char_id or p_descr_result parameter is NULL. - -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_next_inclu_srvc (uint16_t conn_id, - esp_gattc_incl_srvc_id_t *start_id, - esp_bt_uuid_t *uuid_cond, - esp_gattc_incl_srvc_id_t *result); - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_char -** -** @brief This function is called to find the next characteristic of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_char_id: start the characteristic search from the next record -** after the one identified by char_id. -** @param[in] char_uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] char_result: output parameter which will store the GATT -** characteristic ID. -** @param[in] property: output parameter to carry the characteristic property. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the start_char_id or char_result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_next_char (uint16_t conn_id, - esp_gattc_char_id_t *start_char_id, - esp_bt_uuid_t *char_uuid_cond, - esp_gattc_char_id_t *char_result, - esp_gatt_char_prop_t *property); - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_next_char_descr -** -** @brief This function is called to find the next characteristic descriptor -** of the characterisctic. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] start_descr_id: start the descriptor search from the next record -** after the one identified by p_start_descr_id. -** @param[in] descr_uuid_cond: Characteristic descriptor UUID, if NULL find -** the first available characteristic descriptor. -** @param[in] descr_result: output parameter which will store the GATT -** characteristic descriptor ID. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the start_descr_id or descr_result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_next_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *start_descr_id, - esp_bt_uuid_t *descr_uuid_cond, - esp_gattc_char_descr_id_t *descr_result); - - -/******************************************************************************* -** -** @function esp_ble_gattc_get_first_inclu_srvc -** -** @brief This function is called to find the first included service of the -** service on the given server. -** -** @param[in] conn_id: connection ID which identify the server. -** @param[in] srvc_id: the service ID of which the characteristic is belonged to. -** @param[in] uuid_cond: Characteristic UUID, if NULL find the first available -** characteristic. -** @param[in] result: output parameter which will store the GATT ID -** of the included service found. -** -** @return Command status code: -** - @ref ESP_GATT_OK: If request succeeds -** - @ref ESP_GATT_ILLEGAL_PARAMETER: If the srvc_id or result parameter is NULL. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_get_first_inclu_srvc (uint16_t conn_id, esp_gatt_srvc_id_t *srvc_id, - esp_bt_uuid_t *uuid_cond, esp_gattc_incl_srvc_id_t *result); - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_char -** -** @brief This function is called to read a service's characteristics of -** the given characteritisc ID. -** -** @param[in] conn_id - connectino ID. -** @param[in] char_id - characteritic ID to read. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_char (uint16_t conn_id, esp_gattc_char_id_t *char_id, - esp_gatt_auth_req_t auth_req); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_char_descr -** -** @brief This function is called to read a characteristics descriptor. -** -** @param[in] conn_id - connection ID. -** @param[in] descr_id - characteritic descriptor ID to read. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *descr_id, - esp_gatt_auth_req_t auth_req); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_read_multi -** -** @brief This function is called to read multiple characteristic or -** characteristic descriptors. -** -** @param[in] conn_id - connectino ID. -** @param[in] read_multi - pointer to the read multiple parameter. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_read_multi (uint16_t conn_id, esp_gattc_multi_t *read_multi, - esp_gatt_auth_req_t auth_req); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_write_char_val -** -** @brief This function is called to write characteristic value. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - characteristic ID to write. -** @param[in] write_type - type of write. -** @param[in] len: length of the data to be written. -** @param[in] value - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_write_char_val ( uint16_t conn_id, - esp_gattc_char_id_t *char_id, - esp_gattc_write_type_t write_type, - uint16_t len, - uint8_t *value, - esp_gatt_auth_req_t auth_req); - - -/******************************************************************************* -** -** @function esp_ble_gattc_write_char_descr -** -** @brief This function is called to write characteristic descriptor value. -** -** @param[in] conn_id - connection ID -** @param[in] char_descr_id - characteristic descriptor ID to write. -** @param[in] write_type - write type. -** @param[in] data - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_write_char_descr (uint16_t conn_id, - esp_gattc_char_descr_id_t *char_descr_id, - esp_gattc_write_type_t write_type, - esp_gatt_unfmt_t *data, - esp_gatt_auth_req_t auth_req); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_prepa_write -** -** @brief This function is called to prepare write a characteristic value. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - GATT characteritic ID of the service. -** @param[in] offset - offset of the write value. -** @param[in] len: length of the data to be written. -** @param[in] value - the value to be written. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_prepa_write (uint16_t conn_id, esp_gattc_char_id_t *char_id, - uint16_t offset, uint16_t len, uint8_t *value, - esp_gatt_auth_req_t auth_req); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_execu_write -** -** @brief This function is called to execute write a prepare write sequence. -** -** @param[in] conn_id - connection ID. -** @param[in] is_execute - execute or cancel. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_execu_write (uint16_t conn_id, BOOLEAN is_execute); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_send_ind_cfm -** -** @brief This function is called to send handle value confirmation. -** -** @param[in] conn_id - connection ID. -** @param[in] char_id - characteristic ID to confirm. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gattc_send_ind_cfm (uint16_t conn_id, esp_gattc_char_id_t *char_id); - - - - -/******************************************************************************* -** -** @function esp_ble_gattc_register_ntf -** -** @brief This function is called to register for notification of a service. -** -** @param[in] client_if - client interface. -** @param[in] bda - target GATT server. -** @param[in] char_id - pointer to GATT characteristic ID. -** -** @return OK if registration succeed, otherwise failed. -** -*******************************************************************************/ -esp_gatt_status_t esp_ble_gattc_register_ntf (esp_gattc_if_t client_if, - BD_ADDR bda, - esp_gattc_char_id_t *char_id); - - - -/******************************************************************************* -** -** @function esp_ble_gattc_unregister_ntf -** -** @brief This function is called to de-register for notification of a service. -** -** @param[in] client_if - client interface. -** @param[in] bda - target GATT server. -** @param[in] char_id - pointer to GATT characteristic ID. -** -** @return OK if deregistration succeed, otherwise failed. -** -*******************************************************************************/ -tBTA_GATT_STATUS esp_ble_gattc_unregister_ntf (esp_gattc_if_t client_if, - BD_ADDR bda, - esp_gattc_char_id_t *char_id); - - -/******************************************************************************* -** -** @function esp_ble_gatts_disale -** -** @brief This function is called to disable GATTS module -** -** @param[in] None. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_disale(void); - - - - -/******************************************************************************* -** -** @function esp_ble_gatts_app_register -** -** @brief This function is called to register application callbacks -** with BTA GATTS module. -** -** @param[in] app_uuid - applicaiton UUID -** @param[in] cback - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_app_register(esp_bt_uuid_t *app_uuid, esp_gatts_cb_t *cback); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_app_unregister -** -** @brief un-register with GATT Server. -** -** @param[in] server_if: service interface id. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_app_unregister(esp_gatts_if_t server_if); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_create_srvc -** -** @brief Create a service. When service creation is done, a callback -** event BTA_GATTS_CREATE_SRVC_EVT is called to report status -** and service ID to the profile. The service ID obtained in -** the callback function needs to be used when adding included -** service and characteristics/descriptors into the service. -** -** @param[in] server_if: Profile ID this service is belonged to. -** @param[in] service_uuid: service UUID. -** @param[in] inst: instance ID number of this service. -** @param[in] num_handle: numble of handle requessted for this service. -** @param[in] is_primary: is this service a primary one or not. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_create_srvc(esp_gatts_if_t server_if, esp_bt_uuid_t *service_uuid, uint8_t inst, - uint16_t num_handle, BOOLEAN is_primary); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_add_inclu_srvc -** -** @brief This function is called to add an included service. After included -** service is included, a callback event BTA_GATTS_ADD_INCL_SRVC_EVT -** is reported the included service ID. -** -** @param[in] service_id: service ID to which this included service is to -** be added. -** @param[in] included_service_id: the service ID to be included. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_inclu_srvc (uint16_t service_id, uint16_t included_service_id); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_add_char -** -** @brief This function is called to add a characteristic into a service. -** -** @param[in] service_id: service ID to which this included service is to -** be added. -** @param[in] char_uuid : Characteristic UUID. -** @param[in] perm : Characteristic value declaration attribute permission. -** @param[in] property : Characteristic Properties -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_char (uint16_t service_id, esp_bt_uuid_t *char_uuid, - esp_gatt_perm_t perm, esp_gatt_char_prop_t property); - - - - -/******************************************************************************* -** -** @function esp_ble_gatts_add_char_descr -** -** @brief This function is called to add characteristic descriptor. When -** it's done, a callback event BTA_GATTS_ADD_DESCR_EVT is called -** to report the status and an ID number for this descriptor. -** -** @param[in] service_id: service ID to which this charatceristic descriptor is to -** be added. -** @param[in] perm: descriptor access permission. -** @param[in] descr_uuid: descriptor UUID. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_add_char_descr (uint16_t service_id, - esp_gatt_perm_t perm, - esp_bt_uuid_t * descr_uuid); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_dele_srvc -** -** @brief This function is called to delete a service. When this is done, -** a callback event BTA_GATTS_DELETE_EVT is report with the status. -** -** @param[in] service_id: service_id to be deleted. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_dele_srvc (uint16_t service_id); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_start_srvc -** -** @brief This function is called to start a service. -** -** @param[in] service_id: the service ID to be started. -** @param[in] sup_transport: supported trasnport. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_start_srvc(uint16_t service_id); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_stop_srvc -** -** @brief This function is called to stop a service. -** -** @param[in] service_id - service to be topped. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_stop_srvc(uint16_t service_id); - - - -/******************************************************************************* -** -** @function esp_ble_gatts_hdl_val_indica -** -** @brief This function is called to read a characteristics descriptor. -** -** @param[in] bda - remote device bd address to indicate. -** @param[in] attr_id - attribute ID to indicate. -** @param[in] data_len - indicate data length. -** @param[in] data: data to indicate. -** @param[in] need_confirm - if this indication expects a confirmation or not. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_hdl_val_indica (uint16_t conn_id, uint16_t attr_id, uint16_t data_len, - uint8_t *data, BOOLEAN need_confirm); - - -/******************************************************************************* -** -** @function esp_ble_gatts_send_rsp -** -** @brief This function is called to send a response to a request. -** -** @param[in] conn_id - connection identifier. -** @param[in] trans_id - transaction ID. -** @param[in] status - response status -** @param[in] msg - response data. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_send_rsp (uint16_t conn_id, uint32_t trans_id, - esp_gatt_status_t status, esp_gatts_rsp_t *msg); - - -/******************************************************************************* -** -** @function esp_ble_gatts_conn -** -** @brief Open a direct open connection or add a background auto connection -** bd address -** -** @param[in] server_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_conn (esp_gatts_if_t server_if, BD_ADDR remote_bda, BOOLEAN is_direct); - - -/******************************************************************************* -** -** @function esp_ble_gatts_cancel_conn -** -** @brief Cancel a direct open connection or remove a background auto connection -** bd address -** -** @param[in] server_if: server interface. -** @param[in] remote_bda: remote device BD address. -** @param[in] is_direct: direct connection or background auto connection -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_cancel_conn (esp_gatts_if_t server_if, BD_ADDR remote_bda, BOOLEAN is_direct); - - -/******************************************************************************* -** -** @function esp_ble_gatts_close -** -** @brief Close a connection a remote device. -** -** @param[in] conn_id: connectino ID to be closed. -** -** @return None -** -*******************************************************************************/ -void esp_ble_gatts_close(uint16_t conn_id); - - -/******************************************************************************* -** -** @function esp_prf_app_register -** -** @brief This function is called to register application callbacks -** with BTA GATTS module. -** -** @param[in] prf_id - the profile identification -** @param[in] p_cback - pointer to the application callback function. -** -** @return None -** -*******************************************************************************/ -void esp_prf_app_register(uint8_t prf_id, void *p_cback); - - -#endif /* __ESP_GATT_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gatt_defs.h b/components/bt/bluedroid/api/include/esp_gatt_defs.h new file mode 100644 index 000000000..05cf6de7d --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_gatt_defs.h @@ -0,0 +1,149 @@ +// Copyright 2015-2016 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_GATT_DEFS_H__ +#define __ESP_GATT_DEFS_H__ + +#include "esp_bt_defs.h" + +/* attribute request data from the client */ +#define ESP_GATT_PREP_WRITE_CANCEL 0x00 +#define ESP_GATT_PREP_WRITE_EXEC 0x01 + +/* Success code and error codes */ +typedef enum { + ESP_GATT_OK = 0x0, + ESP_GATT_INVALID_HANDLE = 0x01, /* 0x0001 */ + ESP_GATT_READ_NOT_PERMIT = 0x02, /* 0x0002 */ + ESP_GATT_WRITE_NOT_PERMIT = 0x03, /* 0x0003 */ + ESP_GATT_INVALID_PDU = 0x04, /* 0x0004 */ + ESP_GATT_INSUF_AUTHENTICATION = 0x05, /* 0x0005 */ + ESP_GATT_REQ_NOT_SUPPORTED = 0x06, /* 0x0006 */ + ESP_GATT_INVALID_OFFSET = 0x07, /* 0x0007 */ + ESP_GATT_INSUF_AUTHORIZATION = 0x08, /* 0x0008 */ + ESP_GATT_PREPARE_Q_FULL = 0x09, /* 0x0009 */ + ESP_GATT_NOT_FOUND = 0x0a, /* 0x000a */ + ESP_GATT_NOT_LONG = 0x0b, /* 0x000b */ + ESP_GATT_INSUF_KEY_SIZE = 0x0c, /* 0x000c */ + ESP_GATT_INVALID_ATTR_LEN = 0x0d, /* 0x000d */ + ESP_GATT_ERR_UNLIKELY = 0x0e, /* 0x000e */ + ESP_GATT_INSUF_ENCRYPTION = 0x0f, /* 0x000f */ + ESP_GATT_UNSUPPORT_GRP_TYPE = 0x10, /* 0x0010 */ + ESP_GATT_INSUF_RESOURCE = 0x11, /* 0x0011 */ + + ESP_GATT_NO_RESOURCES = 0x80, /* 0x80 */ + ESP_GATT_INTERNAL_ERROR = 0x81, /* 0x81 */ + ESP_GATT_WRONG_STATE = 0x82, /* 0x82 */ + ESP_GATT_DB_FULL = 0x83, /* 0x83 */ + ESP_GATT_BUSY = 0x84, /* 0x84 */ + ESP_GATT_ERROR = 0x85, /* 0x85 */ + ESP_GATT_CMD_STARTED = 0x86, /* 0x86 */ + ESP_GATT_ILLEGAL_PARAMETER = 0x87, /* 0x87 */ + ESP_GATT_PENDING = 0x88, /* 0x88 */ + ESP_GATT_AUTH_FAIL = 0x89, /* 0x89 */ + ESP_GATT_MORE = 0x8a, /* 0x8a */ + ESP_GATT_INVALID_CFG = 0x8b, /* 0x8b */ + ESP_GATT_SERVICE_STARTED = 0x8c, /* 0x8c */ + ESP_GATT_ENCRYPED_MITM = ESP_GATT_OK, + ESP_GATT_ENCRYPED_NO_MITM = 0x8d, /* 0x8d */ + ESP_GATT_NOT_ENCRYPTED = 0x8e, /* 0x8e */ + ESP_GATT_CONGESTED = 0x8f, /* 0x8f */ + ESP_GATT_DUP_REG = 0x90, /* 0x90 */ + ESP_GATT_ALREADY_OPEN = 0x91, /* 0x91 */ + ESP_GATT_CANCEL = 0x92, /* 0x92 */ + + /* 0xE0 ~ 0xFC reserved for future use */ + ESP_GATT_CCC_CFG_ERR = 0xfd, /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */ + ESP_GATT_PRC_IN_PROGRESS = 0xfe, /* 0xFE Procedure Already in progress */ + ESP_GATT_OUT_OF_RANGE = 0xff, /* 0xFFAttribute value out of range */ +} esp_gatt_status_t; + +typedef enum { + ESP_GATT_CONN_UNKNOWN = 0, + ESP_GATT_CONN_L2C_FAILURE = 1, /* general L2cap failure */ + ESP_GATT_CONN_TIMEOUT = 0x08, /* 0x08 connection timeout */ + ESP_GATT_CONN_TERMINATE_PEER_USER = 0x13, /* 0x13 connection terminate by peer user */ + ESP_GATT_CONN_TERMINATE_LOCAL_HOST = 0x16, /* 0x16 connectionterminated by local host */ + ESP_GATT_CONN_FAIL_ESTABLISH = 0x3e, /* 0x03E connection fail to establish */ + // ESP_GATT_CONN_LMP_TIMEOUT = 0x22, /* 0x22 connection fail for LMP response tout */ + ESP_GATT_CONN_CONN_CANCEL = 0x0100, /* 0x0100 L2CAP connection cancelled */ + ESP_GATT_CONN_NONE = 0x0101 /* 0x0101 no connection to cancel */ +} esp_gatt_reason_t; + +typedef struct { + esp_bt_uuid_t uuid; + uint8_t inst_id; +} __attribute__((packed)) esp_gatt_id_t; + +typedef struct { + esp_gatt_id_t id; + bool is_primary; +} __attribute__((packed)) esp_gatt_srvc_id_t; + +typedef enum { + AUTH_REQ_NO_SCATTERNET, /* Device doesn't support scatternet, it might + support "role switch during connection" for + an incoming connection, when it already has + another connection in master role */ + AUTH_REQ_PARTIAL_SCATTERNET, /* Device supports partial scatternet. It can have + simulateous connection in Master and Slave roles + for short period of time */ + AUTH_REQ_FULL_SCATTERNET /* Device can have simultaneous connection in master + and slave roles */ +} esp_gatt_auth_req_t; + +/* Attribute permissions +*/ +typedef enum { + ESP_GATT_PERM_READ = (1 << 0), /* bit 0 - 0x0001 */ + ESP_GATT_PERM_READ_ENCRYPTED = (1 << 1), /* bit 1 - 0x0002 */ + ESP_GATT_PERM_READ_ENC_MITM = (1 << 2), /* bit 2 - 0x0004 */ + ESP_GATT_PERM_WRITE = (1 << 4), /* bit 4 - 0x0010 */ + ESP_GATT_PERM_WRITE_ENCRYPTED = (1 << 5), /* bit 5 - 0x0020 */ + ESP_GATT_PERM_WRITE_ENC_MITM = (1 << 6), /* bit 6 - 0x0040 */ + ESP_GATT_PERM_WRITE_SIGNED = (1 << 7), /* bit 7 - 0x0080 */ + ESP_GATT_PERM_WRITE_SIGNED_MITM = (1 << 8), /* bit 8 - 0x0100 */ +} esp_gatt_perm_t; + +/* definition of characteristic properties */ +typedef enum { + ESP_GATT_CHAR_PROP_BIT_BROADCAST = (1 << 0), /* 0x01 */ + ESP_GATT_CHAR_PROP_BIT_READ = (1 << 1), /* 0x02 */ + ESP_GATT_CHAR_PROP_BIT_WRITE_NR = (1 << 2), /* 0x04 */ + ESP_GATT_CHAR_PROP_BIT_WRITE = (1 << 3), /* 0x08 */ + ESP_GATT_CHAR_PROP_BIT_NOTIFY = (1 << 4), /* 0x10 */ + ESP_GATT_CHAR_PROP_BIT_INDICATE = (1 << 5), /* 0x20 */ + ESP_GATT_CHAR_PROP_BIT_AUTH = (1 << 6), /* 0x40 */ + ESP_GATT_CHAR_PROP_BIT_EXT_PROP = (1 << 7), /* 0x80 */ +} esp_gatt_char_prop_t; + +#define ESP_GATT_MAX_ATTR_LEN 600 //as same as GATT_MAX_ATTR_LEN + +typedef struct { + uint8_t value[ESP_GATT_MAX_ATTR_LEN]; + uint16_t handle; + uint16_t offset; + uint16_t len; + uint8_t auth_req; +} esp_gatt_value_t; + +/** GATT remote read request response type */ +typedef union { + esp_gatt_value_t attr_value; + uint16_t handle; +} esp_gatt_rsp_t; + +typedef uint32_t esp_gatt_if_t; + +#endif /* __ESP_GATT_DEFS_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gattc_api.h b/components/bt/bluedroid/api/include/esp_gattc_api.h new file mode 100644 index 000000000..5b5fff5fb --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_gattc_api.h @@ -0,0 +1,554 @@ +// Copyright 2015-2016 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_GATTC_API_H__ +#define __ESP_GATTC_API_H__ + +#include "bt_types.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "esp_err.h" + +/* Client callback function events */ +#define ESP_GATTC_REG_EVT 0 /* GATT client is registered. */ +#define ESP_GATTC_UNREG_EVT 1 /* GATT client unregistered event */ +#define ESP_GATTC_OPEN_EVT 2 /* GATTC open request status event */ +#define ESP_GATTC_READ_CHAR_EVT 3 /* GATT read characteristic event */ +#define ESP_GATTC_WRITE_CHAR_EVT 4 /* GATT write characteristic or char descriptor event */ +#define ESP_GATTC_CLOSE_EVT 5 /* GATTC close request status event */ +#define ESP_GATTC_SEARCH_CMPL_EVT 6 /* GATT discovery complete event */ +#define ESP_GATTC_SEARCH_RES_EVT 7 /* GATT discovery result event */ +#define ESP_GATTC_READ_DESCR_EVT 8 /* GATT read characterisitc descriptor event */ +#define ESP_GATTC_WRITE_DESCR_EVT 9 /* GATT write characteristic descriptor event */ +#define ESP_GATTC_NOTIFY_EVT 10 /* GATT attribute notification event */ +#define ESP_GATTC_PREP_WRITE_EVT 11 /* GATT prepare write event */ +#define ESP_GATTC_EXEC_EVT 12 /* execute write complete event */ +#define ESP_GATTC_ACL_EVT 13 /* ACL up event */ +#define ESP_GATTC_CANCEL_OPEN_EVT 14 /* cancel open event */ +#define ESP_GATTC_SRVC_CHG_EVT 15 /* service change event */ +#define ESP_GATTC_ENC_CMPL_CB_EVT 17 /* encryption complete callback event */ +#define ESP_GATTC_CFG_MTU_EVT 18 /* configure MTU complete event */ +#define ESP_GATTC_ADV_DATA_EVT 19 /* ADV data event */ +#define ESP_GATTC_MULT_ADV_ENB_EVT 20 /* Enable Multi ADV event */ +#define ESP_GATTC_MULT_ADV_UPD_EVT 21 /* Update parameter event */ +#define ESP_GATTC_MULT_ADV_DATA_EVT 22 /* Multi ADV data event */ +#define ESP_GATTC_MULT_ADV_DIS_EVT 23 /* Disable Multi ADV event */ +#define ESP_GATTC_CONGEST_EVT 24 /* Congestion event */ +#define ESP_GATTC_BTH_SCAN_ENB_EVT 25 /* Enable batch scan event */ +#define ESP_GATTC_BTH_SCAN_CFG_EVT 26 /* Config storage event */ +#define ESP_GATTC_BTH_SCAN_RD_EVT 27 /* Batch scan reports read event */ +#define ESP_GATTC_BTH_SCAN_THR_EVT 28 /* Batch scan threshold event */ +#define ESP_GATTC_BTH_SCAN_PARAM_EVT 29 /* Batch scan param event */ +#define ESP_GATTC_BTH_SCAN_DIS_EVT 30 /* Disable batch scan event */ +#define ESP_GATTC_SCAN_FLT_CFG_EVT 31 /* Scan filter config event */ +#define ESP_GATTC_SCAN_FLT_PARAM_EVT 32 /* Param filter event */ +#define ESP_GATTC_SCAN_FLT_STATUS_EVT 33 /* Filter status event */ +#define ESP_GATTC_ADV_VSC_EVT 34 /* ADV VSC event */ + +#define ESP_GATTC_GET_CHAR_EVT 35 /* get characteristic event */ +#define ESP_GATTC_GET_DESCR_EVT 36 /* get characteristic descriptor event */ +#define ESP_GATTC_GET_INCL_SRVC_EVT 37 /* get included service event */ +#define ESP_GATTC_REG_FOR_NOTIFY_EVT 38 /* register for notification event */ +#define ESP_GATTC_UNREG_FOR_NOTIFY_EVT 39 /* unregister for notification event */ + + +#define ESP_GATT_DEF_BLE_MTU_SIZE 23 +#define ESP_GATT_MAX_MTU_SIZE 517 + +/* esp_ble_gattc_cb_param_t */ +typedef union { + /*registration data for ESP_GATTC_REG_EVT */ + struct gattc_reg_evt_param { + esp_gatt_status_t status; + esp_gatt_if_t gatt_if; + esp_bt_uuid_t uuid; /* btla-specific ++ */ + } reg; + + /* ESP_GATTC_OPEN_EVT */ + struct gattc_open_evt_param { + esp_gatt_status_t status; + uint16_t conn_id; + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + // tBTA_TRANSPORT transport; + uint16_t mtu; + } open; + + /* ESP_GATTC_CLOSE_EVT */ + struct gattc_close_evt_param { + esp_gatt_status_t status; + uint16_t conn_id; + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + esp_gatt_reason_t reason; + } close; + + /* ESP_GATTC_CFG_MTU_EVT */ + struct gattc_cfg_mtu_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + uint16_t mtu; + } cfg_mtu; + + /* ESP_GATTC_SEARCH_CMPL_EVT */ + struct gattc_search_cmpl_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + } search_cmpl; + + /* ESP_GATTC_SEARCH_RES_EVT */ + struct gattc_search_res_evt_param { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + } search_res; + + /* ESP_GATTC_READ_CHAR_EVT, ESP_GATTC_READ_DESCR_EVT */ + struct gattc_read_char_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + uint8_t *value; + uint16_t value_type; + uint16_t value_len; + } read; /* ESP_GATTC_READ_CHAR_EVT */ + + /* ESP_GATTC_WRITE_CHAR_EVT, ESP_GATTC_PREP_WRITE_EVT, ESP_GATTC_WRITE_DESCR_EVT */ + struct gattc_write_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + } write; + + /* ESP_GATTC_EXEC_EVT */ + struct gattc_exec_cmpl_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + } exec_cmpl; + + /* ESP_GATTC_NOTIF_EVT */ + struct gattc_notify_evt_param { + uint16_t conn_id; + esp_bd_addr_t bda; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + uint16_t value_len; + uint8_t *value; + bool is_notify; + } notify; + + /* ESP_GATTC_SRVC_CHG_EVT*/ + struct gattc_srvc_chg_evt_param { + esp_bd_addr_t remote_bda; + } srvc_chg; + + /* ESP_GATTC_CONGEST_EVT */ + struct gattc_congest_evt_param { + uint16_t conn_id; + bool congested; + } congest; + + /* ESP_GATTC_GET_CHAR_EVT */ + struct gattc_get_char_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + esp_gatt_char_prop_t char_prop; + } get_char; + + /* ESP_GATTC_GET_DESCR_EVT */ + struct gattc_get_descr_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + } get_descr; + + /* ESP_GATTC_GET_INCL_SRVC_EVT */ + struct gattc_get_incl_srvc_evt_param { + uint16_t conn_id; + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_srvc_id_t incl_srvc_id; + } get_incl_srvc; + + /* ESP_GATTC_REG_FOR_NOTIF_EVT, ESP_GATTC_UNREG_FOR_NOTIF_EVT */ + struct gattc_reg_for_notify_evt_param { + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + } reg_for_notify; + + struct gattc_unreg_for_notify_evt_param { + esp_gatt_status_t status; + esp_gatt_srvc_id_t srvc_id; + esp_gatt_id_t char_id; + } unreg_for_notify; + + +} esp_ble_gattc_cb_param_t; + + +/******************************************************************************* +** +** @function esp_ble_gattc_app_register_callback +** +** @brief This function is called to register application callbacks +** with GATTC module. +** +** @param[in] callback - pointer to the application callback function. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_register_callback(esp_profile_cb_t callback); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_app_register +** +** @brief This function is called to register application callbacks +** with GATTC module. +** +** @param[in] app_id : Application Identitfy (UUID), for different application +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_app_register(uint16_t app_id); + + +/******************************************************************************* +** +** @function esp_ble_gattc_app_unregister +** +** @brief This function is called to unregister an application +** from GATTC module. +** +** @param[in] gatt_if - app identifier. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_app_unregister(esp_gatt_if_t gatt_if); + + +/******************************************************************************* +** +** @function esp_ble_gattc_conn +** +** @brief Open a direct connection or add a background auto connection +** bd address +** +** @param[in] gatt_if: application identity. +** @param[in] remote_bda: remote device BD address. +** @param[in] is_direct: direct connection or background auto connection +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_open(esp_gatt_if_t gatt_if, esp_bd_addr_t remote_bda, bool is_direct); + +/******************************************************************************* +** +** @function esp_ble_gattc_close +** +** @brief Close a connection to a GATT server. +** +** @param[in] conn_id: connectino ID to be closed. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_close (uint16_t conn_id); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_config_mtu +** +** @brief Configure the MTU size in the GATT channel. This can be done +** only once per connection. +** +** @param[in] conn_id: connection ID. +** mtu: desired MTU size to use. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_config_mtu (uint16_t conn_id, uint16_t mtu); + + +/******************************************************************************* +** +** @function esp_ble_gattc_search_service +** +** @brief This function is called to request a GATT service discovery +** on a GATT server. This function report service search result +** by a callback event, and followed by a service search complete +** event. +** +** @param[in] conn_id: connection ID. +** @param[in] filter_uuid: a UUID of the service application is interested in. +** If Null, discover for all services. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_search_service(uint16_t conn_id, esp_bt_uuid_t *filter_uuid); + + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_characteristic +** +** @brief This function is called to find the first characteristic of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** +** @param[in] srvc_id: serivce ID +** +** @param[in] start_char_id: the start characteristic ID +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ + +esp_err_t esp_ble_gattc_get_characteristic(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, esp_gatt_id_t *start_char_id); + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_descriptor +** +** @brief This function is called to find the descriptor of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** @param[in] srvc_id: the service ID of which the characteristic is belonged to. +** @param[in] char_id: Characteristic ID, if NULL find the first available +** characteristic. +** @param[in] start_descr_id: the sctart descriptor id +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ +esp_err_t esp_ble_gattc_get_descriptor(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, esp_gatt_id_t *char_id, + esp_gatt_id_t *start_descr_id); + + +/**************************************************************************************************** +** +** @function esp_ble_gattc_get_include_service +** +** @brief This function is called to find the first characteristic of the +** service on the given server. +** +** @param[in] conn_id: connection ID which identify the server. +** @param[in] srvc_id: the service ID of which the characteristic is belonged to. +** @param[in] start_incl_srvc_id: the start include service id +** +** @return ESP_OK - success, other - failed +** +*****************************************************************************************************/ + + +esp_err_t esp_ble_gattc_get_included_service(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, esp_gatt_srvc_id_t *start_incl_srvc_id); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_read_char +** +** @brief This function is called to read a service's characteristics of +** the given characteritisc ID.UTH_REQ_NO_SCATTERNET +** +** @param[in] conn_id - connectino ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteritic ID to read. +** @param[in] auth_req - authenticate request type +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_read_char (uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_auth_req_t auth_req); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_read_char_descr +** +** @brief This function is called to read a characteristics descriptor. +** +** @param[in] conn_id - connection ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] descr_id - characteritic descriptor ID to read. +** @param[in] auth_req - authenticate request type +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_read_char_descr (uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_id_t *descr_id, + esp_gatt_auth_req_t auth_req); + + +/******************************************************************************* +** +** @function esp_ble_gattc_write_char +** +** @brief This function is called to write characteristic value. +** +** @param[in] conn_id - connection ID. +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteristic ID to write. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_write_char( uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req); + + +/******************************************************************************* +** +** @function esp_ble_gattc_write_char_descr +** +** @brief This function is called to write characteristic descriptor value. +** +** @param[in] conn_id - connection ID +** @param[in] srvc_id - serivcie ID. +** @param[in] char_id - characteristic ID. +** @param[in] descr_id - characteristic descriptor ID to write. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_write_char_descr (uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + esp_gatt_id_t *descr_id, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_prepare_write +** +** @brief This function is called to prepare write a characteristic value. +** +** @param[in] conn_id - connection ID. +** @param[in] char_id - GATT characteritic ID of the service. +** @param[in] offset - offset of the write value. +** @param[in] value_len: length of the value to be written. +** @param[in] value - the value to be written. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_prepare_write(uint16_t conn_id, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id, + uint16_t offset, + uint16_t value_len, + uint8_t *value, + esp_gatt_auth_req_t auth_req); + +/******************************************************************************* +** +** @function esp_ble_gattc_execu_write +** +** @brief This function is called to execute write a prepare write sequence. +** +** @param[in] conn_id - connection ID. +** @param[in] is_execute - execute or cancel. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gattc_execute_write (uint16_t conn_id, bool is_execute); + + +/******************************************************************************* +** +** @function esp_ble_gattc_register_for_notify +** +** @brief This function is called to register for notification of a service. +** +** @param[in] gatt_if - gatt interface id. +** @param[in] bda - target GATT server. +** @param[in] srvc_id - pointer to GATT service ID. +** @param[in] char_id - pointer to GATT characteristic ID. +** +** @return OK if registration succeed, otherwise failed. +** +*******************************************************************************/ +esp_gatt_status_t esp_ble_gattc_register_for_notify (esp_gatt_if_t gatt_if, + esp_bd_addr_t server_bda, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id); + + + +/******************************************************************************* +** +** @function esp_ble_gattc_unregister_ntf +** +** @brief This function is called to de-register for notification of a service. +** +** @param[in] gatt_if - gatt interface id. +** @param[in] bda - target GATT server. +** @param[in] srvc_id - pointer to GATT service ID. +** @param[in] char_id - pointer to GATT characteristic ID. +** +** @return OK if deregistration succeed, otherwise failed. +** +*******************************************************************************/ +esp_gatt_status_t esp_ble_gattc_unregister_for_notify (esp_gatt_if_t gatt_if, + esp_bd_addr_t server_bda, + esp_gatt_srvc_id_t *srvc_id, + esp_gatt_id_t *char_id); + + +#endif /* __ESP_GATTC_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_gatts_api.h b/components/bt/bluedroid/api/include/esp_gatts_api.h new file mode 100644 index 000000000..c2420379d --- /dev/null +++ b/components/bt/bluedroid/api/include/esp_gatts_api.h @@ -0,0 +1,418 @@ +// Copyright 2015-2016 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_GATTS_API_H__ +#define __ESP_GATTS_API_H__ + +#include "bt_types.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "bta_gatt_api.h" +#include "esp_err.h" + +/* GATT Server Data Structure */ +/* Server callback function events */ +#define ESP_GATTS_REG_EVT 0 +#define ESP_GATTS_READ_EVT 1 +#define ESP_GATTS_WRITE_EVT 2 +#define ESP_GATTS_EXEC_WRITE_EVT 3 +#define ESP_GATTS_MTU_EVT 4 +#define ESP_GATTS_CONF_EVT 5 +#define ESP_GATTS_UNREG_EVT 6 +#define ESP_GATTS_CREATE_EVT 7 +#define ESP_GATTS_ADD_INCL_SRVC_EVT 8 +#define ESP_GATTS_ADD_CHAR_EVT 9 +#define ESP_GATTS_ADD_CHAR_DESCR_EVT 10 +#define ESP_GATTS_DELELTE_EVT 11 +#define ESP_GATTS_START_EVT 12 +#define ESP_GATTS_STOP_EVT 13 +#define ESP_GATTS_CONNECT_EVT 14 +#define ESP_GATTS_DISCONNECT_EVT 15 +#define ESP_GATTS_OPEN_EVT 16 +#define ESP_GATTS_CANCEL_OPEN_EVT 17 +#define ESP_GATTS_CLOSE_EVT 18 +#define ESP_GATTS_LISTEN_EVT 19 +#define ESP_GATTS_CONGEST_EVT 20 +/* following is extra event */ +#define ESP_GATTS_RESPONSE_EVT 21 + +/* esp_ble_gatts_cb_param_t */ +typedef union { + //ESP_GATTS_REG_EVT + struct gatts_reg_evt_param { + int status; + uint16_t gatt_if; + uint16_t app_id; + } reg; + // param for ESP_GATTS_READ_EVT + struct gatts_read_evt_param { + uint16_t conn_id; + uint32_t trans_id; + esp_bd_addr_t bda; + uint16_t handle; + uint16_t offset; + bool is_long; + } read; + // param for ESP_GATTS_WRITE_EVT + struct gatts_write_evt_param { + uint16_t conn_id; + uint32_t trans_id; + esp_bd_addr_t bda; + uint16_t handle; + uint16_t offset; + bool need_rsp; + bool is_prep; + uint16_t len; + uint8_t *value; + } write; + // param for ESP_GATTS_EXEC_WRITE_EVT + struct gatts_exec_write_evt_param { + uint16_t conn_id; + uint32_t trans_id; + esp_bd_addr_t bda; +#define ESP_GATT_PREP_WRITE_CANCEL 0x00 +#define ESP_GATT_PREP_WRITE_EXEC 0x01 + uint8_t exec_write_flag; + } exec_write; + // param for ESP_GATTS_MTU_EVT + struct gatts_mtu_evt_param { + uint16_t conn_id; + uint16_t mtu; + } mtu; + // param for ESP_GATTS_CONF_EVT + struct gatts_conf_evt_param { + uint16_t conn_id; + int status; + } conf; + // param for ESP_GATTS_DEREG_EVT, NONE + // param for ESP_GATTS_CREATE_EVT + struct gatts_create_evt_param { + int status; + uint16_t gatt_if; + uint16_t service_handle; //handle + esp_gatt_srvc_id_t service_id; //id + } create; + // param for ESP_GATTS_ADD_INCL_SRVC_EVT + struct gatts_add_incl_srvc_evt_param { + int status; + uint16_t gatt_if; + uint16_t attr_handle; //handle + uint16_t service_handle; //handle + } add_incl_srvc; + // param for ESP_GATTS_ADD_CHAR_EVT + struct gatts_add_char_evt_param { + int status; + uint16_t gatt_if; + uint16_t attr_handle; //handle + uint16_t service_handle; //handle + esp_bt_uuid_t char_uuid; + } add_char; + // param for ESP_GATTS_ADD_CHAR_DESCR_EVT + struct gatts_add_char_descr_evt_param { + int status; + uint16_t gatt_if; + uint16_t attr_handle; //handle + uint16_t service_handle; //handle + esp_bt_uuid_t char_uuid; + } add_char_descr; + // param for ESP_GATTS_DELELTE_EVT + struct gatts_delete_evt_param { + int status; + uint16_t gatt_if; + uint16_t service_handle; //handle + } del; + // param for ESP_GATTS_START_EVT + struct gatts_start_evt_param { + int status; + uint16_t gatt_if; + uint16_t service_handle; //handle + } start; + // param for ESP_GATTS_STOP_EVT + struct gatts_stop_evt_param { + int status; + uint16_t gatt_if; + uint16_t service_handle; //handle + } stop; + // param for ESP_GATTS_CONNECT_EVT + struct gatts_connect_evt_param { + uint16_t conn_id; + uint16_t gatt_if; + esp_bd_addr_t remote_bda; + bool is_connected; + } connect; + // param for ESP_GATTS_DISCONNECT_EVT + struct gatts_disconnect_evt_param { + uint16_t conn_id; + uint16_t gatt_if; + esp_bd_addr_t remote_bda; + bool is_connected; + } disconnect; + // param for ESP_GATTS_OPEN_EVT none + // param for ESP_GATTS_CANCEL_OPEN_EVT none + // param for ESP_GATTS_CLOSE_EVT none + // param for ESP_GATTS_LISTEN_EVT none + // param for ESP_GATTS_CONGEST_EVT + struct gatts_congest_evt_param { + uint16_t conn_id; + bool congested; + } congest; + // param for ESP_GATTS_RESPONSE_EVT + struct gatts_rsp_evt_param { + int status; //response status, 0 is success + uint16_t handle; //attribute handle which send response + } rsp; +} esp_ble_gatts_cb_param_t; + +/******************************************************************************* +** +** @function esp_ble_gatts_register_callback +** +** @brief This function is called to register application callbacks +** with BTA GATTS module. +** +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_register_callback(esp_profile_cb_t callback); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_app_register +** +** @brief This function is called to register application identity +** +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_app_register(uint16_t app_id); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_app_unregister +** +** @brief un-register with GATT Server. +** +** @param[in] gatt_if: gatt interface id. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_app_unregister(esp_gatt_if_t gatt_if); + + +/******************************************************************************* +** +** @function esp_ble_gatts_create_service +** +** @brief Create a service. When service creation is done, a callback +** event BTA_GATTS_CREATE_SRVC_EVT is called to report status +** and service ID to the profile. The service ID obtained in +** the callback function needs to be used when adding included +** service and characteristics/descriptors into the service. +** +** @param[in] gatt_if: gatt interface ID +** @param[in] service_id: service ID. +** @param[in] num_handle: numble of handle requessted for this service. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_create_service(esp_gatt_if_t gatt_if, + esp_gatt_srvc_id_t *service_id, uint16_t num_handle); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_add_include_service +** +** @brief This function is called to add an included service. After included +** service is included, a callback event BTA_GATTS_ADD_INCL_SRVC_EVT +** is reported the included service ID. +** +** @param[in] service_handle: service handle to which this included service is to +** be added. +** @param[in] included_service_handle: the service ID to be included. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_add_include_service(uint16_t service_handle, uint16_t included_service_handle); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_add_char +** +** @brief This function is called to add a characteristic into a service. +** +** @param[in] service_handle: service handle to which this included service is to +** be added. +** @param[in] char_uuid : Characteristic UUID. +** @param[in] perm : Characteristic value declaration attribute permission. +** @param[in] property : Characteristic Properties +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_add_char(uint16_t service_handle, esp_bt_uuid_t *char_uuid, + esp_gatt_perm_t perm, esp_gatt_char_prop_t property); + + + + +/******************************************************************************* +** +** @function esp_ble_gatts_add_char_descr +** +** @brief This function is called to add characteristic descriptor. When +** it's done, a callback event BTA_GATTS_ADD_DESCR_EVT is called +** to report the status and an ID number for this descriptor. +** +** @param[in] service_handle: service handle to which this charatceristic descriptor is to +** be added. +** @param[in] perm: descriptor access permission. +** @param[in] descr_uuid: descriptor UUID. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_add_char_descr (uint16_t service_handle, + esp_bt_uuid_t *descr_uuid, + esp_gatt_perm_t perm); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_delete_service +** +** @brief This function is called to delete a service. When this is done, +** a callback event BTA_GATTS_DELETE_EVT is report with the status. +** +** @param[in] service_handled: service_handle to be deleted. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_delete_service(uint16_t service_handle); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_start_service +** +** @brief This function is called to start a service. +** +** @param[in] service_handle: the service handle to be started. +** @param[in] sup_transport: supported trasnport. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_start_service(uint16_t service_handle); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_stop_service +** +** @brief This function is called to stop a service. +** +** @param[in] service_handle - service to be topped. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_stop_service(uint16_t service_handle); + + + +/******************************************************************************* +** +** @function esp_ble_gatts_send_indicate +** +** @brief This function is called to read a characteristics descriptor. +** +** @param[in] conn_id - connection id to indicate. +** @param[in] attribute_handle - attribute handle to indicate. +** @param[in] value_len - indicate value length. +** @param[in] value: value to indicate. +** @param[in] need_confirm - if this indication expects a confirmation or not. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_send_indicate(uint16_t conn_id, uint16_t attr_handle, + uint16_t value_len, uint8_t *value, bool need_confirm); + + +/******************************************************************************* +** +** @function esp_ble_gatts_send_rsp +** +** @brief This function is called to send a response to a request. +** +** @param[in] conn_id - connection identifier. +** @param[in] trans_id - transfe id +** @param[in] status - response status +** @param[in] rsp - response data. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_send_response(uint16_t conn_id, uint32_t trans_id, + esp_gatt_status_t status, esp_gatt_rsp_t *rsp); + + +/******************************************************************************* +** +** @function esp_ble_gatts_open +** +** @brief Open a direct open connection or add a background auto connection +** bd address +** +** @param[in] gatt_if: application ID. +** @param[in] remote_bda: remote device BD address. +** @param[in] is_direct: direct connection or background auto connection +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_open(esp_gatt_if_t gatt_if, esp_bd_addr_t remote_bda, bool is_direct); + +/******************************************************************************* +** +** @function esp_ble_gatts_close +** +** @brief Close a connection a remote device. +** +** @param[in] conn_id: connectino ID to be closed. +** +** @return ESP_OK - success, other - failed +** +*******************************************************************************/ +esp_err_t esp_ble_gatts_close(uint16_t conn_id); + + +#endif /* __ESP_GATTS_API_H__ */ diff --git a/components/bt/bluedroid/api/include/esp_sdp_api.h b/components/bt/bluedroid/api/include/esp_sdp_api.h index 3b5b587ad..81add1e20 100644 --- a/components/bt/bluedroid/api/include/esp_sdp_api.h +++ b/components/bt/bluedroid/api/include/esp_sdp_api.h @@ -1,9 +1,23 @@ +// Copyright 2015-2016 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_SDP_API_H__ #define __ESP_SDP_API_H__ #include #include "esp_err.h" -#include "esp_bt_common.h" +#include "esp_bt_defs.h" #include "bta_sdp_api.h" #include "bt_sdp.h" @@ -33,20 +47,19 @@ typedef struct { esp_bt_uuid_t uuid; int record_count; bt_sdp_record_t records[BT_SDP_MAX_RECORDS]; -} bt_sdp_search_comp_t; +} bt_sdp_search_comp_t; /* tBTA_SDP, bta_sdp_api.h */ -typedef union -{ +typedef union { bt_sdp_status_t status; bt_sdp_search_comp_t sdp_search_comp; } bt_sdp_t; -typedef void (bt_sdp_cb_t)(bt_sdp_evt_t event, bt_sdp_t *p_data, void * user_data); +typedef void (bt_sdp_cb_t)(bt_sdp_evt_t event, bt_sdp_t *p_data, void *user_data); esp_err_t esp_bt_sdp_enable(bt_sdp_cb_t *cback); -esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t* uuid); +esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t *uuid); esp_err_t esp_bt_sdp_create_record_by_user(void *user_data); @@ -69,8 +82,7 @@ typedef struct { } sdp_proto_elem_t; // tSDP_PROTOCOL_ELEM, sdp_api.h #define ESP_BT_SDP_MAX_LIST_ELEMS SDP_MAX_LIST_ELEMS // sdp_api.h -typedef struct -{ +typedef struct { uint16_t num_elems; sdp_proto_elem_t list_elem[ESP_BT_SDP_MAX_LIST_ELEMS]; } sdp_proto_list_elem_t; // tSDP_PROTO_LIST_ELEM, sdp_api.h @@ -98,19 +110,19 @@ bool esp_bt_sdp_add_protocol_list (uint32_t handle, uint16_t num_elem, sdp_proto_elem_t *p_elem_list); bool esp_bt_sdp_add_addition_protocol_lists(uint32_t handle, uint16_t num_elem, - sdp_proto_list_elem_t *p_proto_list); + sdp_proto_list_elem_t *p_proto_list); bool esp_bt_sdp_add_profile_dscp_list (uint32_t handle, uint16_t profile_uuid, uint16_t version); bool esp_bt_sdp_add_lang_base_attr_id_list(uint32_t handle, - uint16_t lang, uint16_t char_enc, - uint16_t base_id); + uint16_t lang, uint16_t char_enc, + uint16_t base_id); bool esp_bt_sdp_add_service_class_id_list(uint32_t handle, - uint16_t num_services, - uint16_t *p_service_uuids); + uint16_t num_services, + uint16_t *p_service_uuids); bool esp_bt_sdp_delete_attribute(uint32_t handle, uint16_t attr_id); diff --git a/components/bt/bluedroid/api/include/esp_sec_api.h b/components/bt/bluedroid/api/include/esp_sec_api.h index e078d73ff..f9b0f9ec1 100644 --- a/components/bt/bluedroid/api/include/esp_sec_api.h +++ b/components/bt/bluedroid/api/include/esp_sec_api.h @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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_SEC_API_H__ #define __ESP_SEC_API_H__ @@ -5,56 +19,53 @@ #define APP_SEC_IRK_FLAG (0) #define RAND_NB_LEN 0x08 -#define SEC_KEY_LEN 0x10 - - /* - * STRUCTURES DEFINITIONS - **************************************************************************************** - */ +#define SEC_KEY_LEN 0x10 - - /// Generic Security key structure -typedef struct - { - /// Key value MSB -> LSB - UINT8 key[SEC_KEY_LEN]; - }smp_sec_key; - - ///Random number structure -typedef struct -{ - ///8-byte array for random number - UINT8 nb[RAND_NB_LEN]; -}rand_nb; - - typedef struct - { - // LTK - smp_sec_key ltk; - // Random Number - rand_nb rand_nb; - // EDIV - UINT16 ediv; - // LTK key size - UINT8 key_size; - - // Last paired peer address type - UINT8 peer_addr_type; - // Last paired peer address - BD_ADDR peer_addr; - - // authentication level - UINT8 auth; - - }tAPP_SEC_ENV; - - extern tAPP_SEC_ENV app_sec_env; - - /* - * GLOBAL FUNCTIONS DECLARATIONS +/* + * STRUCTURES DEFINITIONS **************************************************************************************** */ + +/// Generic Security key structure +typedef struct { + /// Key value MSB -> LSB + UINT8 key[SEC_KEY_LEN]; +} smp_sec_key; + +///Random number structure +typedef struct { + ///8-byte array for random number + UINT8 nb[RAND_NB_LEN]; +} rand_nb; + +typedef struct { + // LTK + smp_sec_key ltk; + // Random Number + rand_nb rand_nb; + // EDIV + UINT16 ediv; + // LTK key size + UINT8 key_size; + + // Last paired peer address type + UINT8 peer_addr_type; + // Last paired peer address + BD_ADDR peer_addr; + + // authentication level + UINT8 auth; + +} tAPP_SEC_ENV; + +extern tAPP_SEC_ENV app_sec_env; + +/* +* GLOBAL FUNCTIONS DECLARATIONS +**************************************************************************************** +*/ + void app_ble_sec_init(void); void app_ble_sec_pairing_cmp_evt_send(UINT8); diff --git a/components/bt/bluedroid/bta/dm/bta_dm_act.c b/components/bt/bluedroid/bta/dm/bta_dm_act.c old mode 100755 new mode 100644 index 08e6d7b12..155602fac --- a/components/bt/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_act.c @@ -47,7 +47,7 @@ #endif static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); -static void bta_dm_inq_cmpl_cb (void * p_result); +static void bta_dm_inq_cmpl_cb (void *p_result); static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name); static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name); static void bta_dm_find_services ( BD_ADDR bd_addr); @@ -56,7 +56,7 @@ static void bta_dm_sdp_callback (UINT16 sdp_status); static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator); static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BOOLEAN min_16_digit); static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type); -static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result); +static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result); static void bta_dm_local_name_cback(BD_ADDR bd_addr); static BOOLEAN bta_dm_check_av(UINT16 event); static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data); @@ -92,24 +92,24 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch); static char *bta_dm_get_remname(void); static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result); -static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport); +static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport); static void bta_dm_discover_device(BD_ADDR remote_bd_addr); static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ); static void bta_dm_disable_search_and_disc(void); #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) - #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE)) +#if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE)) static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data); - #endif +#endif static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key); - #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) +#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) static void bta_dm_gattc_register(void); static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr); static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr); static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data); extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void); - #endif +#endif #if BLE_VND_INCLUDED == TRUE static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result); @@ -122,14 +122,13 @@ static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result); static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr); static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); -static void bta_dm_observe_cmpl_cb(void * p_result); +static void bta_dm_observe_cmpl_cb(void *p_result); static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle); -extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128); +extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128); static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle); -const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = -{ +const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = { UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */ UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */ @@ -160,7 +159,7 @@ const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */ UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */ #if BLE_INCLUDED && BTA_GATT_INCLUDED - ,UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */ + , UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */ #endif }; @@ -171,8 +170,7 @@ const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = * i.e., If you add new Service ID for BTA, the correct security ID of the new service * from Security service definitions (btm_api.h) should be added to this lookup table. */ -const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = -{ +const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = { 0, /* Reserved */ BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */ @@ -203,14 +201,13 @@ const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */ BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */ #if BLE_INCLUDED && BTA_GATT_INCLUDED - ,BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */ + , BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */ #endif }; /* bta security callback */ -const tBTM_APPL_INFO bta_security = -{ +const tBTM_APPL_INFO bta_security = { &bta_dm_authorize_cback, &bta_dm_pin_cback, &bta_dm_new_link_key_cback, @@ -223,9 +220,9 @@ const tBTM_APPL_INFO bta_security = #endif #if BLE_INCLUDED == TRUE #if SMP_INCLUDED == TRUE - ,&bta_dm_ble_smp_cback + , &bta_dm_ble_smp_cback #endif - ,&bta_dm_ble_id_key_cback + , &bta_dm_ble_id_key_cback #endif }; @@ -251,13 +248,13 @@ void bta_dm_enable(tBTA_DM_MSG *p_data) tBTA_DM_ENABLE enable_event; /* if already in use, return an error */ - if( bta_dm_cb.is_bta_dm_active == TRUE ) - { + if ( bta_dm_cb.is_bta_dm_active == TRUE ) { APPL_TRACE_WARNING("%s Device already started by another application", __func__); memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE)); enable_event.status = BTA_FAILURE; - if (p_data->enable.p_sec_cback != NULL) + if (p_data->enable.p_sec_cback != NULL) { p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, (tBTA_DM_SEC *)&enable_event); + } return; } @@ -266,14 +263,14 @@ void bta_dm_enable(tBTA_DM_MSG *p_data) /* make sure security callback is saved - if no callback, do not erase the previous one, it could be an error recovery mechanism */ - if( p_data->enable.p_sec_cback != NULL ) - bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback; + if ( p_data->enable.p_sec_cback != NULL ) { + bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback; + } /* notify BTA DM is now active */ bta_dm_cb.is_bta_dm_active = TRUE; /* send a message to BTA SYS */ - if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) - { + if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) { sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT; sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; @@ -305,15 +302,16 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) /* On H/W error evt, report to the registered DM application callback */ if (status == BTA_SYS_HW_ERROR_EVT) { - if( bta_dm_cb.p_sec_cback != NULL ) - bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL); - return; + if ( bta_dm_cb.p_sec_cback != NULL ) { + bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL); + } + return; } - if( status == BTA_SYS_HW_OFF_EVT ) - { - if( bta_dm_cb.p_sec_cback != NULL ) + if ( status == BTA_SYS_HW_OFF_EVT ) { + if ( bta_dm_cb.p_sec_cback != NULL ) { bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL); + } /* reinitialize the control block */ memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); @@ -322,10 +320,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH ); /* notify BTA DM is now unactive */ bta_dm_cb.is_bta_dm_active = FALSE; - } - else - if( status == BTA_SYS_HW_ON_EVT ) - { + } else if ( status == BTA_SYS_HW_ON_EVT ) { /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error. * We need to revisit when this platform has more than one BLuetooth H/W chip */ //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH); @@ -335,7 +330,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) /* make sure the control block is properly initialized */ memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); /* and retrieve the callback */ - bta_dm_cb.p_sec_cback=temp_cback; + bta_dm_cb.p_sec_cback = temp_cback; bta_dm_cb.is_bta_dm_active = TRUE; /* hw is ready, go on with BTA DM initialization */ @@ -350,12 +345,10 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) /* load BLE local information: ID keys, ER if available */ bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key); - if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) - { + if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) { BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er); } - if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) - { + if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) { BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key); } #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) @@ -363,12 +356,12 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) #endif #endif - BTM_SecRegister((tBTM_APPL_INFO*)&bta_security); + BTM_SecRegister((tBTM_APPL_INFO *)&bta_security); BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout); BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout); bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings; BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); - BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK); + BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK); #if BLE_VND_INCLUDED == TRUE BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback); @@ -381,20 +374,20 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) the DM_ENABLE_EVT to be sent only after all the init steps are complete */ BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback); - bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback); + bta_sys_rm_register((tBTA_SYS_CONN_CBACK *)bta_dm_rm_cback); /* initialize bluetooth low power manager */ bta_dm_init_pm(); - bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback); + bta_sys_policy_register((tBTA_SYS_CONN_CBACK *)bta_dm_policy_cback); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) bta_dm_gattc_register(); #endif - } - else + } else { APPL_TRACE_DEBUG(" --- ignored event"); + } } @@ -431,24 +424,21 @@ void bta_dm_disable (tBTA_DM_MSG *p_data) BTM_BleClearBgConnDev(); #endif - if(BTM_GetNumAclLinks()==0) - { + if (BTM_GetNumAclLinks() == 0) { #if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0) /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by * BTA_DISABLE_DELAY milliseconds */ APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms", - __FUNCTION__, BTA_DISABLE_DELAY); + __FUNCTION__, BTA_DISABLE_DELAY); bta_sys_stop_timer(&bta_dm_cb.disable_timer); - bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback; + bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback; bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY); #else bta_dm_disable_conn_down_timer_cback(NULL); #endif - } - else - { - bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback; + } else { + bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback; bta_dm_cb.disable_timer.param = 0; bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000); } @@ -477,10 +467,8 @@ static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle) APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param); - if(BTM_GetNumAclLinks() && p_tle->param == 0) - { - for(i=0; iparam == 0) { + for (i = 0; i < bta_dm_cb.device_list.count; i++) { #if (BLE_INCLUDED == TRUE) transport = bta_dm_cb.device_list.peer_device[i].transport; #endif @@ -490,15 +478,12 @@ static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle) /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need to be sent out to avoid jave layer disable timeout */ - if (trigger_disc) - { - bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback; + if (trigger_disc) { + bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback; bta_dm_cb.disable_timer.param = 1; bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500); } - } - else - { + } else { bta_dm_cb.disabling = FALSE; bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION); @@ -522,8 +507,8 @@ static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle) void bta_dm_set_dev_name (tBTA_DM_MSG *p_data) { - BTM_SetLocalDeviceName((char*)p_data->set_name.name); - bta_dm_set_eir ((char*)p_data->set_name.name); + BTM_SetLocalDeviceName((char *)p_data->set_name.name); + bta_dm_set_eir ((char *)p_data->set_name.name); } /******************************************************************************* @@ -545,8 +530,7 @@ void bta_dm_set_visibility(tBTA_DM_MSG *p_data) UINT16 conn_mode = BTM_ReadConnectability(&window, &interval); /* set modes for Discoverability and connectability if not ignore */ - if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) - { + if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) { if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) p_data->set_visibility.disc_mode = ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode); @@ -556,12 +540,11 @@ void bta_dm_set_visibility(tBTA_DM_MSG *p_data) ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode); BTM_SetDiscoverability(p_data->set_visibility.disc_mode, - bta_dm_cb.inquiry_scan_window, - bta_dm_cb.inquiry_scan_interval); + bta_dm_cb.inquiry_scan_window, + bta_dm_cb.inquiry_scan_interval); } - if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) - { + if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) { if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) p_data->set_visibility.conn_mode = ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode); @@ -571,35 +554,36 @@ void bta_dm_set_visibility(tBTA_DM_MSG *p_data) ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode); BTM_SetConnectability(p_data->set_visibility.conn_mode, - bta_dm_cb.page_scan_window, - bta_dm_cb.page_scan_interval); + bta_dm_cb.page_scan_window, + bta_dm_cb.page_scan_interval); } /* Send False or True if not ignore */ - if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) - { + if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) { - if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) + if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) { bta_dm_cb.disable_pair_mode = TRUE; - else + } else { bta_dm_cb.disable_pair_mode = FALSE; + } } /* Send False or True if not ignore */ - if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) - { + if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) { - if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) + if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) { bta_dm_cb.conn_paired_only = FALSE; - else + } else { bta_dm_cb.conn_paired_only = TRUE; + } } /* Change mode if either mode is not ignore */ - if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) - BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only); + if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) { + BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)), bta_dm_cb.conn_paired_only); + } } @@ -613,25 +597,24 @@ void bta_dm_set_visibility(tBTA_DM_MSG *p_data) void bta_dm_process_remove_device(BD_ADDR bd_addr) { #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) - /* need to remove all pending background connection before unpair */ - BTA_GATTC_CancelOpen(0, bd_addr, FALSE); + /* need to remove all pending background connection before unpair */ + BTA_GATTC_CancelOpen(0, bd_addr, FALSE); #endif - BTM_SecDeleteDevice(bd_addr); + BTM_SecDeleteDevice(bd_addr); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) - /* remove all cached GATT information */ - BTA_GATTC_Refresh(bd_addr); + /* remove all cached GATT information */ + BTA_GATTC_Refresh(bd_addr); #endif - if (bta_dm_cb.p_sec_cback) - { - tBTA_DM_SEC sec_event; - bdcpy(sec_event.link_down.bd_addr, bd_addr); - /* No connection, set status to success (acl disc code not valid) */ - sec_event.link_down.status = HCI_SUCCESS; - bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event); - } + if (bta_dm_cb.p_sec_cback) { + tBTA_DM_SEC sec_event; + bdcpy(sec_event.link_down.bd_addr, bd_addr); + /* No connection, set status to success (acl disc code not valid) */ + sec_event.link_down.status = HCI_SUCCESS; + bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event); + } } /******************************************************************************* @@ -644,8 +627,9 @@ void bta_dm_process_remove_device(BD_ADDR bd_addr) void bta_dm_remove_device(tBTA_DM_MSG *p_data) { tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev; - if (p_dev == NULL) + if (p_dev == NULL) { return; + } BD_ADDR other_address; bdcpy(other_address, p_dev->bd_addr); @@ -655,32 +639,28 @@ void bta_dm_remove_device(tBTA_DM_MSG *p_data) UINT8 other_transport = BT_TRANSPORT_INVALID; if (BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) || - BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR)) - { + BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR)) { APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, bta_dm_cb.device_list.count); continue_delete_dev = FALSE; /* Take the link down first, and mark the device for removal when disconnected */ - for(int i=0; i < bta_dm_cb.device_list.count; i++) - { - if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr)) - { + for (int i = 0; i < bta_dm_cb.device_list.count; i++) { + if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr)) { bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; btm_remove_acl( p_dev->bd_addr, bta_dm_cb.device_list.peer_device[i].transport); APPL_TRACE_DEBUG("%s:transport = %d", __func__, - bta_dm_cb.device_list.peer_device[i].transport); + bta_dm_cb.device_list.peer_device[i].transport); /* save the other transport to check if device is connected on other_transport */ - if(bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE) - other_transport = BT_TRANSPORT_BR_EDR; - else - other_transport = BT_TRANSPORT_LE; + if (bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE) { + other_transport = BT_TRANSPORT_BR_EDR; + } else { + other_transport = BT_TRANSPORT_LE; + } break; } } - } - else - { + } else { continue_delete_dev = TRUE; } @@ -688,35 +668,32 @@ void bta_dm_remove_device(tBTA_DM_MSG *p_data) // if different address BOOLEAN continue_delete_other_dev = FALSE; if ((other_transport && (BTM_ReadConnectedTransportAddress(other_address, other_transport))) || - (!other_transport && (BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_BR_EDR) || - BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_LE)))) - { + (!other_transport && (BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_BR_EDR) || + BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_LE)))) { continue_delete_other_dev = FALSE; /* Take the link down first, and mark the device for removal when disconnected */ - for(int i=0; i < bta_dm_cb.device_list.count; i++) - { - if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, other_address)) - { + for (int i = 0; i < bta_dm_cb.device_list.count; i++) { + if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, other_address)) { bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; - btm_remove_acl(other_address,bta_dm_cb.device_list.peer_device[i].transport); + btm_remove_acl(other_address, bta_dm_cb.device_list.peer_device[i].transport); break; } } - } - else - { + } else { APPL_TRACE_DEBUG("%s: continue to delete the other dev ", __func__); continue_delete_other_dev = TRUE; } /* Delete the device mentioned in the msg */ - if (continue_delete_dev) + if (continue_delete_dev) { bta_dm_process_remove_device(p_dev->bd_addr); + } /* Delete the other paired device too */ BD_ADDR dummy_bda = {0}; - if (continue_delete_other_dev && (bdcmp(other_address, dummy_bda) != 0)) + if (continue_delete_other_dev && (bdcmp(other_address, dummy_bda) != 0)) { bta_dm_process_remove_device(other_address); + } } /******************************************************************************* @@ -740,24 +717,23 @@ void bta_dm_add_device (tBTA_DM_MSG *p_data) memset (trusted_services_mask, 0, sizeof(trusted_services_mask)); /* If not all zeros, the device class has been specified */ - if (p_dev->dc_known) + if (p_dev->dc_known) { p_dc = (UINT8 *)p_dev->dc; + } - if (p_dev->link_key_known) + if (p_dev->link_key_known) { p_lc = (UINT8 *)p_dev->link_key; + } - if (p_dev->is_trusted) - { + if (p_dev->is_trusted) { /* covert BTA service mask to BTM mask */ - while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) - { - if (p_dev->tm & (UINT32)(1<tm && (index < BTA_MAX_SERVICE_ID)) { + if (p_dev->tm & (UINT32)(1 << index)) { btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS; trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32))); - p_dev->tm &= (UINT32)(~(1<tm &= (UINT32)(~(1 << index)); } index++; @@ -766,11 +742,10 @@ void bta_dm_add_device (tBTA_DM_MSG *p_data) if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features, trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap, - p_dev->pin_length)) - { + p_dev->pin_length)) { APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x", - (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3], - (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]); + (p_dev->bd_addr[0] << 24) + (p_dev->bd_addr[1] << 16) + (p_dev->bd_addr[2] << 8) + p_dev->bd_addr[3], + (p_dev->bd_addr[4] << 8) + p_dev->bd_addr[5]); } } @@ -790,30 +765,25 @@ void bta_dm_close_acl(tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("bta_dm_close_acl"); - if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) - { - for (index = 0; index < bta_dm_cb.device_list.count; index ++) - { - if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr)) + if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) { + for (index = 0; index < bta_dm_cb.device_list.count; index ++) { + if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr)) { break; } - if (index != bta_dm_cb.device_list.count) - { - if (p_remove_acl->remove_dev) - bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE; } - else - { + if (index != bta_dm_cb.device_list.count) { + if (p_remove_acl->remove_dev) { + bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE; + } + } else { APPL_TRACE_ERROR("unknown device, remove ACL failed"); } /* Disconnect the ACL link */ btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport); } /* if to remove the device from security database ? do it now */ - else if (p_remove_acl->remove_dev) - { - if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr)) - { + else if (p_remove_acl->remove_dev) { + if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr)) { APPL_TRACE_ERROR("delete device from security database failed."); } #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) @@ -841,17 +811,15 @@ void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type); - for (UINT8 i=0; i < bta_dm_cb.device_list.count; i++) - { + for (UINT8 i = 0; i < bta_dm_cb.device_list.count; i++) { BD_ADDR addr = {0}; bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr); #if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE) transport = bta_dm_cb.device_list.peer_device[i].transport; #endif if ((link_type == BTA_DM_LINK_TYPE_ALL) || - ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) || - ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR))) - { + ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) || + ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR))) { /* Disconnect the ACL link */ btm_remove_acl(addr, transport); } @@ -875,35 +843,31 @@ void bta_dm_bond (tBTA_DM_MSG *p_data) tBTA_DM_SEC sec_event; char *p_name; - if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN) + if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN) { status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 ); - else + } else { status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 ); + } - if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) - { + if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) { memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr); p_name = BTM_SecReadDevName(p_data->bond.bd_addr); - if (p_name != NULL) - { - memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1)); - sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0; + if (p_name != NULL) { + memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN - 1)); + sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0; } -/* taken care of by memset [above] - sec_event.auth_cmpl.key_present = FALSE; - sec_event.auth_cmpl.success = FALSE; -*/ + /* taken care of by memset [above] + sec_event.auth_cmpl.key_present = FALSE; + sec_event.auth_cmpl.success = FALSE; + */ sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND; - if (status == BTM_SUCCESS) - { + if (status == BTM_SUCCESS) { sec_event.auth_cmpl.success = TRUE; - } - else - { + } else { /* delete this device entry from Sec Dev DB */ bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr); } @@ -930,8 +894,7 @@ void bta_dm_bond_cancel (tBTA_DM_MSG *p_data) APPL_TRACE_EVENT(" bta_dm_bond_cancel "); status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr ); - if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) - { + if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) { sec_event.bond_cancel_cmpl.result = BTA_FAILURE; bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); @@ -952,26 +915,20 @@ void bta_dm_bond_cancel (tBTA_DM_MSG *p_data) void bta_dm_pin_reply (tBTA_DM_MSG *p_data) { UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; - UINT32 * current_trusted_mask; + UINT32 *current_trusted_mask; current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr); - if(current_trusted_mask) - { + if (current_trusted_mask) { memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask)); - } - else - { + } else { memset(trusted_mask, 0, sizeof(trusted_mask)); } - if(p_data->pin_reply.accept) - { + if (p_data->pin_reply.accept) { BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask ); - } - else - { + } else { BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask ); } @@ -992,30 +949,31 @@ static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app UINT16 policy = app_id; UINT32 mask = (UINT32)(1 << id); - if(peer_addr) + if (peer_addr) { p_dev = bta_dm_find_peer_device(peer_addr); + } APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x", - status, policy); - switch(status) - { + status, policy); + switch (status) { case BTA_SYS_PLCY_SET: - if(!p_dev) + if (!p_dev) { return; + } /* restore the default link policy */ p_dev->link_policy |= policy; BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); break; case BTA_SYS_PLCY_CLR: - if(!p_dev) + if (!p_dev) { return; + } /* clear the policy from the default link policy */ p_dev->link_policy &= (~policy); BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); - if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) - { + if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) { /* if clearing sniff/park, wake the link */ bta_dm_pm_active(p_dev->peer_bdaddr); } @@ -1024,8 +982,7 @@ static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app case BTA_SYS_PLCY_DEF_SET: /* want to restore/set the role switch policy */ bta_dm_cb.role_policy_mask &= ~mask; - if(0 == bta_dm_cb.role_policy_mask) - { + if (0 == bta_dm_cb.role_policy_mask) { /* if nobody wants to insist on the role */ bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); @@ -1055,8 +1012,9 @@ void bta_dm_confirm(tBTA_DM_MSG *p_data) { tBTM_STATUS res = BTM_NOT_AUTHORIZED; - if(p_data->confirm.accept == TRUE) + if (p_data->confirm.accept == TRUE) { res = BTM_SUCCESS; + } BTM_ConfirmReqReply(res, p_data->confirm.bd_addr); } @@ -1088,10 +1046,11 @@ void bta_dm_loc_oob(tBTA_DM_MSG *p_data) void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data) { tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; - if(p_data->ci_io_req.auth_req) + if (p_data->ci_io_req.auth_req) { auth_req = BTM_AUTH_AP_YES; + } BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap, - p_data->ci_io_req.oob_data, auth_req); + p_data->ci_io_req.oob_data, auth_req); } /******************************************************************************* @@ -1108,10 +1067,11 @@ void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data) { tBTM_STATUS res = BTM_NOT_AUTHORIZED; - if(p_data->ci_rmt_oob.accept == TRUE) + if (p_data->ci_rmt_oob.accept == TRUE) { res = BTM_SUCCESS; + } BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr, - p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r ); + p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r ); } #endif /* BTM_OOB_INCLUDED */ @@ -1137,8 +1097,7 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter); if (p_bta_dm_cfg->avoid_scatter && - (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) - { + (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) { memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH)); return; } @@ -1152,10 +1111,8 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 && - p_data->search.p_uuid != NULL) - { - if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) - { + p_data->search.p_uuid != NULL) { + if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) { APPL_TRACE_ERROR("%s no resources", __func__); result.status = BTA_FAILURE; @@ -1167,13 +1124,12 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len); } #endif - result.status = BTM_StartInquiry( (tBTM_INQ_PARMS*)&p_data->search.inq_params, - bta_dm_inq_results_cb, - (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb); + result.status = BTM_StartInquiry( (tBTM_INQ_PARMS *)&p_data->search.inq_params, + bta_dm_inq_results_cb, + (tBTM_CMPL_CB *) bta_dm_inq_cmpl_cb); APPL_TRACE_EVENT("%s status=%d", __func__, result.status); - if (result.status != BTM_CMD_STARTED) - { + if (result.status != BTM_CMD_STARTED) { result.num_resp = 0; bta_dm_inq_cmpl_cb ((void *)&result); } @@ -1192,16 +1148,13 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) void bta_dm_search_cancel (tBTA_DM_MSG *p_data) { UNUSED(p_data); - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; - if (BTM_IsInquiryActive()) - { - if (BTM_CancelInquiry() != BTM_CMD_STARTED) - { + if (BTM_IsInquiryActive()) { + if (BTM_CancelInquiry() != BTM_CMD_STARTED) { bta_dm_search_cancel_notify(NULL); p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); - if (p_msg != NULL) - { + if (p_msg != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); @@ -1212,21 +1165,17 @@ void bta_dm_search_cancel (tBTA_DM_MSG *p_data) } } /* If no Service Search going on then issue cancel remote name in case it is active */ - else if (!bta_dm_search_cb.name_discover_done) - { + else if (!bta_dm_search_cb.name_discover_done) { BTM_CancelRemoteDeviceName(); - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); } - } - else { - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + } else { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); @@ -1234,8 +1183,7 @@ void bta_dm_search_cancel (tBTA_DM_MSG *p_data) } #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE - if (bta_dm_search_cb.gatt_disc_active) - { + if (bta_dm_search_cb.gatt_disc_active) { bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); } #endif @@ -1257,7 +1205,7 @@ void bta_dm_discover (tBTA_DM_MSG *p_data) UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid); #endif APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__, - p_data->discover.services, p_data->discover.sdp_search); + p_data->discover.services, p_data->discover.sdp_search); /* save the search condition */ bta_dm_search_cb.services = p_data->discover.services; @@ -1266,10 +1214,8 @@ void bta_dm_discover (tBTA_DM_MSG *p_data) bta_dm_gattc_register(); utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 && - p_data->discover.p_uuid != NULL) - { - if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) - { + p_data->discover.p_uuid != NULL) { + if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) { p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL); return; } @@ -1309,13 +1255,12 @@ void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data) memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); - if((p_data->hdr.offset == SDP_SUCCESS) - || (p_data->hdr.offset == SDP_DB_FULL)) - { + if ((p_data->hdr.offset == SDP_SUCCESS) + || (p_data->hdr.offset == SDP_DB_FULL)) { di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db); - } - else + } else { di_disc.result = BTA_FAILURE; + } bta_dm_di_cb.p_di_db = NULL; bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc); @@ -1333,10 +1278,9 @@ void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data) *******************************************************************************/ static void bta_dm_di_disc_callback(UINT16 result) { - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; p_msg->hdr.offset = result; @@ -1359,11 +1303,11 @@ static void bta_dm_disable_search_and_disc (void) { tBTA_DM_DI_DISC_CMPL di_disc; - if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) + if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) { bta_dm_search_cancel(NULL); + } - if (bta_dm_di_cb.p_di_db != NULL) - { + if (bta_dm_di_cb.p_di_db != NULL) { memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); di_disc.result = BTA_FAILURE; @@ -1392,22 +1336,17 @@ void bta_dm_di_disc (tBTA_DM_MSG *p_data) bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr); bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db; - if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) - { + if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) { if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db, - p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS) - { + p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS) { result = BTA_SUCCESS; } - } - else - { + } else { APPL_TRACE_ERROR("No buffer to start DI discovery"); } if ( result == BTA_FAILURE && - (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; p_data->hdr.offset = result; @@ -1424,7 +1363,7 @@ void bta_dm_di_disc (tBTA_DM_MSG *p_data) ** Returns TRUE if started to get remote name ** *******************************************************************************/ -static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport) +static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport) { tBTM_STATUS btm_status; @@ -1437,14 +1376,11 @@ static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT tra (tBTM_CMPL_CB *) bta_dm_remname_cback, transport); - if ( btm_status == BTM_CMD_STARTED ) - { + if ( btm_status == BTM_CMD_STARTED ) { APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started"); return (TRUE); - } - else if ( btm_status == BTM_BUSY ) - { + } else if ( btm_status == BTM_BUSY ) { APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy"); /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */ @@ -1452,9 +1388,7 @@ static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT tra BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); return (TRUE); - } - else - { + } else { APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status); return (FALSE); @@ -1472,7 +1406,7 @@ static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT tra *******************************************************************************/ void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data) { - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; tBTA_DM_SEARCH data; APPL_TRACE_DEBUG("bta_dm_inq_cmpl"); @@ -1480,26 +1414,22 @@ void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data) data.inq_cmpl.num_resps = p_data->inq_cmpl.num; bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data); - if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL) - { + if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL) { /* start name and service discovery from the first device on inquiry result */ bta_dm_search_cb.name_discover_done = FALSE; bta_dm_search_cb.peer_name[0] = 0; bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); - } - else - { + } else { /* no devices, search complete */ bta_dm_search_cb.services = 0; - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); } - } } +} /******************************************************************************* ** @@ -1514,8 +1444,7 @@ void bta_dm_rmt_name (tBTA_DM_MSG *p_data) { APPL_TRACE_DEBUG("bta_dm_rmt_name"); - if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info) - { + if ( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info) { bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE; } @@ -1539,10 +1468,8 @@ void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("bta_dm_disc_rmt_name"); p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr); - if( p_btm_inq_info ) - { - if( p_data->rem_name.result.disc_res.bd_name[0] ) - { + if ( p_btm_inq_info ) { + if ( p_data->rem_name.result.disc_res.bd_name[0] ) { p_btm_inq_info->appl_knows_rem_name = TRUE; } } @@ -1577,54 +1504,43 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) UINT32 num_uuids = 0; UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services - if((p_data->sdp_event.sdp_result == SDP_SUCCESS) - || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH) - || (p_data->sdp_event.sdp_result == SDP_DB_FULL)) - { + if ((p_data->sdp_event.sdp_result == SDP_SUCCESS) + || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH) + || (p_data->sdp_event.sdp_result == SDP_DB_FULL)) { APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result); - do - { + do { p_sdp_rec = NULL; - if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) ) - { + if ( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1) ) { p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec); - if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) { bta_dm_search_cb.peer_scn = (UINT8) pe.params[0]; scn_found = TRUE; } - } - else - { - service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; + } else { + service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1]; p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec); } #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE /* finished with BR/EDR services, now we check the result for GATT based service UUID */ - if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) - { - if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) - { + if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) { + if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) { p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search); /* only support 16 bits UUID for now */ service = p_uuid->uu.uuid16; } /* all GATT based services */ - do - { + do { /* find a service record, report it */ p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, - 0, p_sdp_rec); - if (p_sdp_rec) - { - if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) - { + 0, p_sdp_rec); + if (p_sdp_rec) { + if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) { /* send result back to app now, one by one */ bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN)); + BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN)); result.disc_ble_res.bd_name[BD_NAME_LEN] = 0; result.disc_ble_res.service.len = service_uuid.len; result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16; @@ -1633,26 +1549,24 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) } } - if (bta_dm_search_cb.uuid_to_search > 0) + if (bta_dm_search_cb.uuid_to_search > 0) { break; + } } while (p_sdp_rec); - } - else + } else #endif { /* SDP_DB_FULL means some records with the required attributes were received */ if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) && bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) || - (p_sdp_rec != NULL)) - { - if (service != UUID_SERVCLASS_PNP_INFORMATION) - { + (p_sdp_rec != NULL)) { + if (service != UUID_SERVCLASS_PNP_INFORMATION) { UINT16 tmp_svc = 0xFFFF; bta_dm_search_cb.services_found |= - (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1)); - tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; + (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index - 1)); + tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1]; /* Add to the list of UUIDs */ sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]); num_uuids++; @@ -1660,24 +1574,23 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) } } - if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK && - bta_dm_search_cb.services_to_search == 0) - { + if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK && + bta_dm_search_cb.services_to_search == 0) { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && - bta_dm_search_cb.uuid_to_search > 0) + bta_dm_search_cb.uuid_to_search > 0) { bta_dm_search_cb.uuid_to_search --; + } if (bta_dm_search_cb.uuid_to_search == 0 || - bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) + bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) #endif bta_dm_search_cb.service_index++; - } - else /* regular one service per search or PNP search */ + } else { /* regular one service per search or PNP search */ break; + } - } - while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID); + } while (bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID); // GKI_freebuf(bta_dm_search_cb.p_sdp_db); // bta_dm_search_cb.p_sdp_db = NULL; @@ -1685,18 +1598,14 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) bta_dm_search_cb.services_found); /* Collect the 128-bit services here and put them into the list */ - if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) - { + if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) { p_sdp_rec = NULL; - do - { + do { tBT_UUID temp_uuid; /* find a service record, report it */ p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec); - if (p_sdp_rec) - { - if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) - { + if (p_sdp_rec) { + if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) { memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE); num_uuids++; } @@ -1704,22 +1613,18 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) } while (p_sdp_rec); } /* if there are more services to search for */ - if(bta_dm_search_cb.services_to_search) - { + if (bta_dm_search_cb.services_to_search) { /* Free up the p_sdp_db before checking the next one */ bta_dm_free_sdp_db(NULL); bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); - } - else - { + } else { /* callbacks */ /* start next bd_addr if necessary */ BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; p_msg->disc_result.result.disc_res.p_raw_data = NULL; @@ -1727,20 +1632,20 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) p_msg->disc_result.result.disc_res.num_uuids = num_uuids; p_msg->disc_result.result.disc_res.p_uuid_list = NULL; if (num_uuids > 0) { - p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE); + p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8 *)GKI_getbuf(num_uuids * MAX_UUID_SIZE); if (p_msg->disc_result.result.disc_res.p_uuid_list) { memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list, - num_uuids*MAX_UUID_SIZE); + num_uuids * MAX_UUID_SIZE); } else { - p_msg->disc_result.result.disc_res.num_uuids = 0; - APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__); + p_msg->disc_result.result.disc_res.num_uuids = 0; + APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__); } } //copy the raw_data to the discovery result structure // if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 && - bta_dm_search_cb.p_sdp_db->raw_data != NULL) { + bta_dm_search_cb.p_sdp_db->raw_data != NULL) { APPL_TRACE_DEBUG( "%s raw_data used = 0x%x raw_data_ptr = 0x%x", __func__, bta_dm_search_cb.p_sdp_db->raw_used, @@ -1757,14 +1662,13 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) } else { APPL_TRACE_DEBUG("%s GKI Alloc failed to allocate %d bytes !!", __func__, - bta_dm_search_cb.p_sdp_db->raw_used); + bta_dm_search_cb.p_sdp_db->raw_used); } bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned. bta_dm_search_cb.p_sdp_db->raw_used = 0; bta_dm_search_cb.p_sdp_db->raw_size = 0; - } - else { + } else { APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", __func__); } /* Done with p_sdp_db. Free it */ @@ -1772,29 +1676,29 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; //Piggy back the SCN over result field - if( scn_found ) - { - p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn); - p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK; + if ( scn_found ) { + p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn); + p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK; - APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn); + APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn); } bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), - bta_dm_get_remname(), (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), + bta_dm_get_remname(), (BD_NAME_LEN - 1)); /* make sure the string is null terminated */ - p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; + p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0; bta_sys_sendmsg(p_msg); } } } else { /* conn failed. No need for timer */ - if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED - || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) + if (p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED + || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) { bta_dm_search_cb.wait_disc = FALSE; + } /* not able to connect go to next device */ GKI_freebuf(bta_dm_search_cb.p_sdp_db); @@ -1802,17 +1706,16 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; p_msg->disc_result.result.disc_res.result = BTA_FAILURE; p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), - bta_dm_get_remname(), (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), + bta_dm_get_remname(), (BD_NAME_LEN - 1)); /* make sure the string is null terminated */ - p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; + p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0; bta_sys_sendmsg(p_msg); } @@ -1836,10 +1739,11 @@ void bta_dm_search_cmpl (tBTA_DM_MSG *p_data) utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); #endif - if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) + if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) { bta_dm_di_disc_cmpl(p_data); - else + } else { bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL); + } } /******************************************************************************* @@ -1859,13 +1763,12 @@ void bta_dm_disc_result (tBTA_DM_MSG *p_data) /* if any BR/EDR service discovery has been done, report the event */ if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK))) #endif - bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); + bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); /* send a message to change state */ - if (p_msg != NULL) - { + if (p_msg != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); @@ -1884,29 +1787,26 @@ void bta_dm_disc_result (tBTA_DM_MSG *p_data) void bta_dm_search_result (tBTA_DM_MSG *p_data) { APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__, - bta_dm_search_cb.services, - p_data->disc_result.result.disc_res.services); + bta_dm_search_cb.services, + p_data->disc_result.result.disc_res.services); /* call back if application wants name discovery or found services that application is searching */ if (( !bta_dm_search_cb.services ) - ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services ))) - { + || (( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services ))) { bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); } /* if searching did not initiate to create link */ - if(!bta_dm_search_cb.wait_disc ) - { + if (!bta_dm_search_cb.wait_disc ) { /* if service searching is done with EIR, don't search next device */ - if( bta_dm_search_cb.p_btm_inq_info ) - bta_dm_discover_next_device(); - } - else - { + if ( bta_dm_search_cb.p_btm_inq_info ) { + bta_dm_discover_next_device(); + } + } else { /* wait until link is disconnected or timeout */ bta_dm_search_cb.sdp_results = TRUE; - bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback; - bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) ); + bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK *)&bta_dm_search_timer_cback; + bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000 * (L2CAP_LINK_INACTIVITY_TOUT + 1) ); } } @@ -1946,8 +1846,7 @@ static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle) void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data) { UNUSED(p_data); - if(bta_dm_search_cb.p_sdp_db) - { + if (bta_dm_search_cb.p_sdp_db) { GKI_freebuf(bta_dm_search_cb.p_sdp_db); bta_dm_search_cb.p_sdp_db = NULL; } @@ -1965,8 +1864,7 @@ void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_queue_search (tBTA_DM_MSG *p_data) { - if(bta_dm_search_cb.p_search_queue) - { + if (bta_dm_search_cb.p_search_queue) { GKI_freebuf(bta_dm_search_cb.p_search_queue); } @@ -1986,8 +1884,7 @@ void bta_dm_queue_search (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_queue_disc (tBTA_DM_MSG *p_data) { - if(bta_dm_search_cb.p_search_queue) - { + if (bta_dm_search_cb.p_search_queue) { GKI_freebuf(bta_dm_search_cb.p_search_queue); } @@ -2008,8 +1905,7 @@ void bta_dm_queue_disc (tBTA_DM_MSG *p_data) void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data) { UNUSED(p_data); - if(bta_dm_search_cb.p_search_queue) - { + if (bta_dm_search_cb.p_search_queue) { GKI_freebuf(bta_dm_search_cb.p_search_queue); bta_dm_search_cb.p_search_queue = NULL; } @@ -2027,8 +1923,7 @@ void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data) void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data) { UNUSED(p_data); - if(bta_dm_search_cb.p_search_queue) - { + if (bta_dm_search_cb.p_search_queue) { bta_sys_sendmsg(bta_dm_search_cb.p_search_queue); bta_dm_search_cb.p_search_queue = NULL; } @@ -2048,8 +1943,7 @@ void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data) void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data) { UNUSED(p_data); - if(bta_dm_search_cb.p_sdp_db) - { + if (bta_dm_search_cb.p_sdp_db) { GKI_freebuf(bta_dm_search_cb.p_sdp_db); bta_dm_search_cb.p_sdp_db = NULL; } @@ -2070,17 +1964,14 @@ void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data) void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data) { UNUSED(p_data); - if (bta_dm_search_cb.p_search_cback) - { + if (bta_dm_search_cb.p_search_cback) { bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL); } - if (!bta_dm_search_cb.name_discover_done) - { + if (!bta_dm_search_cb.name_discover_done) { BTM_CancelRemoteDeviceName(); } #if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE) - if (bta_dm_search_cb.gatt_disc_active) - { + if (bta_dm_search_cb.gatt_disc_active) { bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); } #endif @@ -2105,68 +1996,56 @@ static void bta_dm_find_services ( BD_ADDR bd_addr) memset (&uuid, 0, sizeof(tSDP_UUID)); - while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) - { - if( bta_dm_search_cb.services_to_search - & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))) - { - if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) - { + while (bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) { + if ( bta_dm_search_cb.services_to_search + & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))) { + if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) { APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services); /* try to search all services by search based on L2CAP UUID */ - if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK ) - { + if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK ) { LOG_INFO("%s services_to_search=%08x", __func__, bta_dm_search_cb.services_to_search); - if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) - { + if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) { uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0]; bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK; - } - else - { + } else { uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP; bta_dm_search_cb.services_to_search = 0; } - } - else - { + } else { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE /* for LE only profile */ - if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID) - { - if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid) - { + if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID) { + if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid) { memcpy(&uuid, (const void *)(bta_dm_search_cb.p_srvc_uuid + \ bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search), sizeof(tBT_UUID)); bta_dm_search_cb.uuid_to_search -- ; - } - else + } else { uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; + } /* last one? clear the BLE service bit if all discovery has been done */ if (bta_dm_search_cb.uuid_to_search == 0) bta_dm_search_cb.services_to_search &= - (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); + (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); - } - else + } else #endif { /* remove the service from services to be searched */ bta_dm_search_cb.services_to_search &= - (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); + (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; } } - if (uuid.len == 0) + if (uuid.len == 0) { uuid.len = LEN_UUID_16; + } - if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID) - { + if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID) { memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID)); } @@ -2178,28 +2057,23 @@ static void bta_dm_find_services ( BD_ADDR bd_addr) bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF; - if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) - { + if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) { /* if discovery not successful with this device proceed to next one */ GKI_freebuf(bta_dm_search_cb.p_sdp_db); bta_dm_search_cb.p_sdp_db = NULL; bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID; - } - else - { + } else { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && - bta_dm_search_cb.uuid_to_search == 0) || - bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) + bta_dm_search_cb.uuid_to_search == 0) || + bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) #endif - bta_dm_search_cb.service_index++; + bta_dm_search_cb.service_index++; return; } - } - else - { + } else { APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####"); } } @@ -2208,18 +2082,16 @@ static void bta_dm_find_services ( BD_ADDR bd_addr) } /* no more services to be discovered */ - if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) - { - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if (bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), - bta_dm_get_remname(), (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), + bta_dm_get_remname(), (BD_NAME_LEN - 1)); /* make sure the string is terminated */ - p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; + p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0; bta_sys_sendmsg(p_msg); } @@ -2238,24 +2110,20 @@ static void bta_dm_find_services ( BD_ADDR bd_addr) static void bta_dm_discover_next_device(void) { - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; APPL_TRACE_DEBUG("bta_dm_discover_next_device"); /* searching next device on inquiry result */ - if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL) - { + if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL) { bta_dm_search_cb.name_discover_done = FALSE; bta_dm_search_cb.peer_name[0] = 0; bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); - } - else - { + } else { /* no devices, search complete */ bta_dm_search_cb.services = 0; - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); @@ -2274,18 +2142,18 @@ static void bta_dm_discover_next_device(void) *******************************************************************************/ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) { - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; #if BLE_INCLUDED == TRUE - if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) - { + if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) { tBT_DEVICE_TYPE dev_type; tBLE_ADDR_TYPE addr_type; BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type); - if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) + if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) { transport = BT_TRANSPORT_LE; + } } else { transport = bta_dm_search_cb.transport; } @@ -2295,48 +2163,45 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN; APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__, - remote_bd_addr[0],remote_bd_addr[1], - remote_bd_addr[2],remote_bd_addr[3], - remote_bd_addr[4],remote_bd_addr[5]); + remote_bd_addr[0], remote_bd_addr[1], + remote_bd_addr[2], remote_bd_addr[3], + remote_bd_addr[4], remote_bd_addr[5]); bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr); APPL_TRACE_DEBUG("%s name_discover_done = %d p_btm_inq_info 0x%x state = %d, transport=%d", - __func__, - bta_dm_search_cb.name_discover_done, - bta_dm_search_cb.p_btm_inq_info, - bta_dm_search_cb.state, - transport); + __func__, + bta_dm_search_cb.name_discover_done, + bta_dm_search_cb.p_btm_inq_info, + bta_dm_search_cb.state, + transport); - if (bta_dm_search_cb.p_btm_inq_info) - { + if (bta_dm_search_cb.p_btm_inq_info) { APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__, - bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name); + bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name); } - if((bta_dm_search_cb.p_btm_inq_info) - && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE) - && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) - { + if ((bta_dm_search_cb.p_btm_inq_info) + && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE) + && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) { /* Do not perform RNR for LE devices at inquiry complete*/ bta_dm_search_cb.name_discover_done = TRUE; } /* if name discovery is not done and application needs remote name */ if ((!bta_dm_search_cb.name_discover_done) - && (( bta_dm_search_cb.p_btm_inq_info == NULL ) - ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) - { - if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE) + && (( bta_dm_search_cb.p_btm_inq_info == NULL ) + || (bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) { + if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE) { return; + } /* starting name discovery failed */ bta_dm_search_cb.name_discover_done = TRUE; } /* if application wants to discover service */ - if ( bta_dm_search_cb.services ) - { + if ( bta_dm_search_cb.services ) { /* initialize variables */ bta_dm_search_cb.service_index = 0; bta_dm_search_cb.services_found = 0; @@ -2345,9 +2210,8 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; #endif if ((bta_dm_search_cb.p_btm_inq_info != NULL) && - bta_dm_search_cb.services != BTA_USER_SERVICE_MASK - &&(bta_dm_search_cb.sdp_search == FALSE)) - { + bta_dm_search_cb.services != BTA_USER_SERVICE_MASK + && (bta_dm_search_cb.sdp_search == FALSE)) { /* check if EIR provides the information of supported services */ bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results, &bta_dm_search_cb.services_to_search, @@ -2355,30 +2219,27 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) } /* if seaching with EIR is not completed */ - if(bta_dm_search_cb.services_to_search) - { + if (bta_dm_search_cb.services_to_search) { /* check whether connection already exists to the device if connection exists, we don't have to wait for ACL link to go down to start search on next device */ - if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR)) + if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR)) { bta_dm_search_cb.wait_disc = FALSE; - else + } else { bta_dm_search_cb.wait_disc = TRUE; - -#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) - if ( bta_dm_search_cb.p_btm_inq_info ) - { - APPL_TRACE_DEBUG("%s p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x", - __func__, - bta_dm_search_cb.p_btm_inq_info, - bta_dm_search_cb.p_btm_inq_info->results.device_type, - bta_dm_search_cb.services_to_search); } - if (transport == BT_TRANSPORT_LE) - { - if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) - { +#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) + if ( bta_dm_search_cb.p_btm_inq_info ) { + APPL_TRACE_DEBUG("%s p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x", + __func__, + bta_dm_search_cb.p_btm_inq_info, + bta_dm_search_cb.p_btm_inq_info->results.device_type, + bta_dm_search_cb.services_to_search); + } + + if (transport == BT_TRANSPORT_LE) { + if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) { //set the raw data buffer here memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf)); bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf; @@ -2390,8 +2251,7 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr); return; } - } - else + } else #endif { bta_dm_search_cb.sdp_results = FALSE; @@ -2402,19 +2262,18 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) } /* name discovery and service discovery are done for this device */ - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; /* initialize the data structure - includes p_raw_data and raw_data_size */ memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES)); p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), - (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), + (char *)bta_dm_search_cb.peer_name, (BD_NAME_LEN - 1)); /* make sure the string is terminated */ - p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; + p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0; bta_sys_sendmsg(p_msg); } @@ -2432,10 +2291,9 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) static void bta_dm_sdp_callback (UINT16 sdp_status) { - tBTA_DM_SDP_RESULT * p_msg; + tBTA_DM_SDP_RESULT *p_msg; - if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL) - { + if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL) { p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT; p_msg->sdp_result = sdp_status; bta_sys_sendmsg(p_msg); @@ -2462,7 +2320,7 @@ static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr); memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN); BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class); - result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE; + result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? TRUE : FALSE; result.inq_res.rssi = p_inq->rssi; #if (BLE_INCLUDED == TRUE) @@ -2475,22 +2333,22 @@ static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) /* application will parse EIR to find out remote device name */ result.inq_res.p_eir = p_eir; - if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) - { + if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) { /* initialize remt_name_not_required to FALSE so that we get the name by default */ result.inq_res.remt_name_not_required = FALSE; } - if(bta_dm_search_cb.p_search_cback) + if (bta_dm_search_cb.p_search_cback) { bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result); + } - if(p_inq_info) - { + if (p_inq_info) { /* application indicates if it knows the remote name, inside the callback copy that to the inquiry data base*/ - if(result.inq_res.remt_name_not_required) + if (result.inq_res.remt_name_not_required) { p_inq_info->appl_knows_rem_name = TRUE; + } } @@ -2507,12 +2365,11 @@ static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) ** Returns void ** *******************************************************************************/ -static void bta_dm_inq_cmpl_cb (void * p_result) +static void bta_dm_inq_cmpl_cb (void *p_result) { - tBTA_DM_MSG * p_msg; + tBTA_DM_MSG *p_msg; - if (bta_dm_search_cb.cancel_pending == FALSE) - { + if (bta_dm_search_cb.cancel_pending == FALSE) { APPL_TRACE_DEBUG("%s", __FUNCTION__); p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); if (p_msg != NULL) { @@ -2520,9 +2377,7 @@ static void bta_dm_inq_cmpl_cb (void * p_result) p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp; bta_sys_sendmsg(p_msg); } - } - else - { + } else { bta_dm_search_cb.cancel_pending = FALSE; bta_dm_search_cancel_notify(NULL); @@ -2553,32 +2408,25 @@ static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name); /* if this is what we are looking for */ - if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr)) - { - rem_name.length = strlen((char*)bd_name); - if (rem_name.length > (BD_NAME_LEN-1)) - { - rem_name.length = (BD_NAME_LEN-1); - rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0; + if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr)) { + rem_name.length = strlen((char *)bd_name); + if (rem_name.length > (BD_NAME_LEN - 1)) { + rem_name.length = (BD_NAME_LEN - 1); + rem_name.remote_bd_name[(BD_NAME_LEN - 1)] = 0; } - BCM_STRNCPY_S((char*)rem_name.remote_bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)rem_name.remote_bd_name, sizeof(BD_NAME), (char *)bd_name, (BD_NAME_LEN - 1)); rem_name.status = BTM_SUCCESS; bta_dm_remname_cback(&rem_name); - } - else - { + } else { /* get name of device */ btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr, - (tBTM_CMPL_CB *) bta_dm_remname_cback, - BT_TRANSPORT_BR_EDR); - if ( btm_status == BTM_BUSY ) - { + (tBTM_CMPL_CB *) bta_dm_remname_cback, + BT_TRANSPORT_BR_EDR); + if ( btm_status == BTM_BUSY ) { /* wait for next chance(notification of remote name discovery done) */ APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy"); - } - else if ( btm_status != BTM_CMD_STARTED ) - { + } else if ( btm_status != BTM_CMD_STARTED ) { /* if failed to start getting remote name then continue */ APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status); @@ -2602,29 +2450,27 @@ static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, *******************************************************************************/ static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name) { - tBTA_DM_REM_NAME * p_msg; + tBTA_DM_REM_NAME *p_msg; APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length, - p_remote_name->remote_bd_name); + p_remote_name->remote_bd_name); /* remote name discovery is done but it could be failed */ bta_dm_search_cb.name_discover_done = TRUE; - BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN)); - bta_dm_search_cb.peer_name[BD_NAME_LEN]=0; + BCM_STRNCPY_S((char *)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char *)p_remote_name->remote_bd_name, (BD_NAME_LEN)); + bta_dm_search_cb.peer_name[BD_NAME_LEN] = 0; BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); #if BLE_INCLUDED == TRUE - if (bta_dm_search_cb.transport == BT_TRANSPORT_LE ) - { + if (bta_dm_search_cb.transport == BT_TRANSPORT_LE ) { GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr); } #endif - if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL) - { + if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL) { bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN)); + BCM_STRNCPY_S((char *)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char *)p_remote_name->remote_bd_name, (BD_NAME_LEN)); /* make sure the string is null terminated */ p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0; @@ -2655,20 +2501,18 @@ static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NA bdcpy(sec_event.authorize.bd_addr, bd_addr); memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN); - BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)sec_event.authorize.bd_name, sizeof(BD_NAME), (char *)bd_name, (BD_NAME_LEN - 1)); /* make sure the string is null terminated */ - sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0; + sec_event.authorize.bd_name[BD_NAME_LEN - 1] = 0; #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE ) sec_event.authorize.service = service_id; #endif - while(index < BTA_MAX_SERVICE_ID) - { + while (index < BTA_MAX_SERVICE_ID) { /* get the BTA service id corresponding to BTM id */ - if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) - { + if (bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) { sec_event.authorize.service = index; break; } @@ -2677,18 +2521,15 @@ static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NA /* if supported service callback otherwise not authorized */ - if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID + if (bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE ) - /* pass through JV service ID */ - || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID) + /* pass through JV service ID */ + || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID) #endif - )) - { + )) { bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event); return BTM_CMD_STARTED; - } - else - { + } else { return BTM_NOT_AUTHORIZED; } } @@ -2713,49 +2554,45 @@ static void bta_dm_pinname_cback (void *p_data) UINT32 bytes_to_copy; tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt; - if (BTA_DM_SP_CFM_REQ_EVT == event) - { + if (BTA_DM_SP_CFM_REQ_EVT == event) { /* Retrieved saved device class and bd_addr */ bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr); BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class); - if (p_result && p_result->status == BTM_SUCCESS) - { - bytes_to_copy = (p_result->length < (BD_NAME_LEN-1)) - ? p_result->length : (BD_NAME_LEN-1); + if (p_result && p_result->status == BTM_SUCCESS) { + bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1)) + ? p_result->length : (BD_NAME_LEN - 1); memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy); - sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; - } - else /* No name found */ + sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0; + } else { /* No name found */ sec_event.cfm_req.bd_name[0] = 0; + } sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */ /* 1 additional event data fields for this event */ sec_event.cfm_req.just_works = bta_dm_cb.just_works; - } - else - { + } else { /* Retrieved saved device class and bd_addr */ bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr); BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class); - if (p_result && p_result->status == BTM_SUCCESS) - { - bytes_to_copy = (p_result->length < (BD_NAME_LEN-1)) - ? p_result->length : (BD_NAME_LEN-1); + if (p_result && p_result->status == BTM_SUCCESS) { + bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1)) + ? p_result->length : (BD_NAME_LEN - 1); memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy); - sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; - } - else /* No name found */ + sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0; + } else { /* No name found */ sec_event.pin_req.bd_name[0] = 0; + } event = bta_dm_cb.pin_evt; sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */ } - if( bta_dm_cb.p_sec_cback ) + if ( bta_dm_cb.p_sec_cback ) { bta_dm_cb.p_sec_cback(event, &sec_event); + } } /******************************************************************************* @@ -2768,29 +2605,30 @@ static void bta_dm_pinname_cback (void *p_data) ** *******************************************************************************/ static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, - BOOLEAN min_16_digit) + BOOLEAN min_16_digit) { tBTA_DM_SEC sec_event; - if (!bta_dm_cb.p_sec_cback) + if (!bta_dm_cb.p_sec_cback) { return BTM_NOT_AUTHORIZED; + } /* If the device name is not known, save bdaddr and devclass and initiate a name request */ - if (bd_name[0] == 0) - { + if (bd_name[0] == 0) { bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT; bdcpy(bta_dm_cb.pin_bd_addr, bd_addr); BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class); - if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) + if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) { return BTM_CMD_STARTED; + } APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request "); } bdcpy(sec_event.pin_req.bd_addr, bd_addr); BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class); - BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); - sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; + BCM_STRNCPY_S((char *)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char *)bd_name, (BD_NAME_LEN - 1)); + sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0; sec_event.pin_req.min_16_digit = min_16_digit; bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event); @@ -2817,15 +2655,14 @@ static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, memset (&sec_event, 0, sizeof(tBTA_DM_SEC)); /* Not AMP Key type */ - if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) - { + if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) { event = BTA_DM_AUTH_CMPL_EVT; p_auth_cmpl = &sec_event.auth_cmpl; bdcpy(p_auth_cmpl->bd_addr, bd_addr); - memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1)); - p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0; + memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN - 1)); + p_auth_cmpl->bd_name[BD_NAME_LEN - 1] = 0; p_auth_cmpl->key_present = TRUE; p_auth_cmpl->key_type = key_type; @@ -2838,11 +2675,10 @@ static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, // Report the BR link key based on the BR/EDR address and type BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type); #endif - if(bta_dm_cb.p_sec_cback) + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(event, &sec_event); - } - else - { + } + } else { APPL_TRACE_WARNING("%s() Received AMP Key", __func__); } @@ -2859,18 +2695,17 @@ static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, ** Returns void ** *******************************************************************************/ -static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result) +static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result) { tBTA_DM_SEC sec_event; UNUSED(dev_class); - if(result != BTM_SUCCESS) - { + if (result != BTM_SUCCESS) { memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr); - memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1)); - sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0; + memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN - 1)); + sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0; #if BLE_INCLUDED == TRUE // Report the BR link key based on the BR/EDR address and type @@ -2878,8 +2713,9 @@ static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev #endif sec_event.auth_cmpl.fail_reason = (UINT8)result; - if(bta_dm_cb.p_sec_cback) + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); + } bta_dm_remove_sec_dev_entry(bd_addr); } @@ -2903,17 +2739,17 @@ static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data) tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT; APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event); - if (!bta_dm_cb.p_sec_cback) + if (!bta_dm_cb.p_sec_cback) { return BTM_NOT_AUTHORIZED; + } /* TODO_SP */ - switch(event) - { + switch (event) { case BTM_SP_IO_REQ_EVT: #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) /* translate auth_req */ bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap, - &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig); + &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig); #endif #if BTM_OOB_INCLUDED == FALSE status = BTM_SUCCESS; @@ -2943,54 +2779,48 @@ static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data) /*case BTM_SP_KEY_REQ_EVT: */ case BTM_SP_KEY_NOTIF_EVT: #endif - if(BTM_SP_CFM_REQ_EVT == event) - { - /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT, - call remote name request using values from cfm_req */ - if(p_data->cfm_req.bd_name[0] == 0) - { - bta_dm_cb.pin_evt = pin_evt; - bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr); - BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class); - if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback, - BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) - return BTM_CMD_STARTED; - APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); - } - else - { - /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT, - copy these values into key_notif from cfm_req */ - bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr); - BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class); - BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), - (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1)); - sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0; - } + if (BTM_SP_CFM_REQ_EVT == event) { + /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT, + call remote name request using values from cfm_req */ + if (p_data->cfm_req.bd_name[0] == 0) { + bta_dm_cb.pin_evt = pin_evt; + bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr); + BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class); + if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback, + BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) { + return BTM_CMD_STARTED; + } + APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); + } else { + /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT, + copy these values into key_notif from cfm_req */ + bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr); + BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class); + BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, sizeof(BD_NAME), + (char *)p_data->cfm_req.bd_name, (BD_NAME_LEN - 1)); + sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0; + } } bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey; - if (BTM_SP_KEY_NOTIF_EVT == event) - { + if (BTM_SP_KEY_NOTIF_EVT == event) { /* If the device name is not known, save bdaddr and devclass and initiate a name request with values from key_notif */ - if(p_data->key_notif.bd_name[0] == 0) - { + if (p_data->key_notif.bd_name[0] == 0) { bta_dm_cb.pin_evt = pin_evt; bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr); BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class); if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback, - BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) - return BTM_CMD_STARTED; + BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) { + return BTM_CMD_STARTED; + } APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); - } - else - { + } else { bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr); BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class); - BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), - (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1)); - sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0; + BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, sizeof(BD_NAME), + (char *)p_data->key_notif.bd_name, (BD_NAME_LEN - 1)); + sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0; } } @@ -3001,26 +2831,26 @@ static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data) #if BTM_OOB_INCLUDED == TRUE case BTM_SP_LOC_OOB_EVT: bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS), - p_data->loc_oob.c, p_data->loc_oob.r); + p_data->loc_oob.c, p_data->loc_oob.r); break; case BTM_SP_RMT_OOB_EVT: /* If the device name is not known, save bdaddr and devclass and initiate a name request */ - if (p_data->rmt_oob.bd_name[0] == 0) - { - bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT; - bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr); - BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class); - if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback, - BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) - return BTM_CMD_STARTED; - APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); - } + if (p_data->rmt_oob.bd_name[0] == 0) { + bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT; + bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr); + BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class); + if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback, + BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) { + return BTM_CMD_STARTED; + } + APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); + } - bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr); - BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class); - BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1)); - sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0; + bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr); + BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class); + BCM_STRNCPY_S((char *)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char *)p_data->rmt_oob.bd_name, (BD_NAME_LEN - 1)); + sec_event.rmt_oob.bd_name[BD_NAME_LEN - 1] = 0; bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event); @@ -3065,8 +2895,9 @@ static void bta_dm_local_name_cback(UINT8 *p_name) sec_event.enable.status = BTA_SUCCESS; - if(bta_dm_cb.p_sec_cback) + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event); + } } @@ -3082,15 +2913,13 @@ static void bta_dm_local_name_cback(UINT8 *p_name) *******************************************************************************/ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data) { - tBTA_DM_ACL_CHANGE * p_msg; + tBTA_DM_ACL_CHANGE *p_msg; - if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) - { + if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) { p_msg->event = p_data->event; p_msg->is_new = FALSE; - switch(p_msg->event) - { + switch (p_msg->event) { case BTM_BL_CONN_EVT: p_msg->is_new = TRUE; bdcpy(p_msg->bd_addr, p_data->conn.p_bda); @@ -3139,7 +2968,7 @@ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data) *******************************************************************************/ #if BLE_INCLUDED == TRUE static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, - UINT8 *features, BOOLEAN is_new,UINT16 handle, + UINT8 *features, BOOLEAN is_new, UINT16 handle, tBT_TRANSPORT transport) #else static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, @@ -3147,8 +2976,7 @@ static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn #endif { tBTA_DM_ACL_CHANGE *p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE)); - if (p_msg != NULL) - { + if (p_msg != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_ACL_CHANGE)); bdcpy(p_msg->bd_addr, p_bda); @@ -3158,10 +2986,10 @@ static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn p_msg->transport = transport; #endif /* This is collision case */ - if (features != NULL) - { - if ((features[0] == 0xFF) && !is_new) + if (features != NULL) { + if ((features[0] == 0xFF) && !is_new) { p_msg->event = BTM_BL_COLLISION_EVT; + } } p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT; @@ -3183,8 +3011,7 @@ static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1) { UNUSED(p1); APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event); - if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) - { + if (bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) { bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */ bta_dm_cb.rs_event = 0; bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg); @@ -3212,26 +3039,21 @@ static BOOLEAN bta_dm_check_av(UINT16 event) /* avoid role switch upon inquiry if a2dp is actively streaming as it introduces an audioglitch due to FW scheduling delays (unavoidable) */ - if (event == BTA_DM_API_SEARCH_EVT) - { + if (event == BTA_DM_API_SEARCH_EVT) { avoid_roleswitch = TRUE; } #endif APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count); - if(bta_dm_cb.cur_av_count) - { - for(i=0; iconn_state, p_dev->info, avoid_roleswitch); - if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) && - (avoid_roleswitch == FALSE)) - { + i, p_dev->conn_state, p_dev->info, avoid_roleswitch); + if ((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) && + (avoid_roleswitch == FALSE)) { /* make master and take away the role switch policy */ - if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback)) - { + if (BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback)) { /* the role switch command is actually sent */ bta_dm_cb.rs_event = event; switching = TRUE; @@ -3269,11 +3091,9 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) tBTA_DM_PEER_DEVICE *p_dev; memset(&conn, 0, sizeof(tBTA_DM_SEC)); - switch(p_data->acl_change.event) - { + switch (p_data->acl_change.event) { case BTM_BL_UPDATE_EVT: /* busy level update */ - if( bta_dm_cb.p_sec_cback ) - { + if ( bta_dm_cb.p_sec_cback ) { conn.busy_level.level = p_data->acl_change.busy_level; conn.busy_level.level_flags = p_data->acl_change.busy_level_flags; bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn); @@ -3282,34 +3102,26 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) case BTM_BL_ROLE_CHG_EVT: /* role change event */ p_dev = bta_dm_find_peer_device(p_bda); - if(p_dev) - { + if (p_dev) { APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d", - p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count); - if(p_dev->info & BTA_DM_DI_AV_ACTIVE) - { + p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count); + if (p_dev->info & BTA_DM_DI_AV_ACTIVE) { /* there's AV activity on this link */ - if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1 - && p_data->acl_change.hci_status == HCI_SUCCESS) - { + if (p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1 + && p_data->acl_change.hci_status == HCI_SUCCESS) { /* more than one connections and the AV connection is role switched to slave * switch it back to master and remove the switch policy */ BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL); need_policy_change = TRUE; - } - else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) - { + } else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) { /* if the link updated to be master include AV activities, remove the switch policy */ need_policy_change = TRUE; } - if(need_policy_change) - { + if (need_policy_change) { bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr); } - } - else - { + } else { /* there's AV no activity on this link and role switch happened * check if AV is active * if so, make sure the AV link is master */ @@ -3318,43 +3130,41 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status); bdcpy(conn.role_chg.bd_addr, p_bda); conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role; - if( bta_dm_cb.p_sec_cback ) + if ( bta_dm_cb.p_sec_cback ) { bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn); + } } return; } /* Collision report from Stack: Notify profiles */ - if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) - { + if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) { bta_sys_notify_collision (p_bda); return; } - if(is_new) - { - for(i=0; iacl_change.handle + && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle #endif - ) + ) { break; + } } - if(i == bta_dm_cb.device_list.count) - { - if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) - { + if (i == bta_dm_cb.device_list.count) { + if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) { bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda); bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy; bta_dm_cb.device_list.count++; #if BLE_INCLUDED == TRUE bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle; - if (p_data->acl_change.transport == BT_TRANSPORT_LE) + if (p_data->acl_change.transport == BT_TRANSPORT_LE) { bta_dm_cb.device_list.le_count++; + } #endif } else { APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__); @@ -3372,56 +3182,55 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) #endif if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && - ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p))) - { + ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p))) { /* both local and remote devices support SSR */ bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR; } - APPL_TRACE_WARNING("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info); + APPL_TRACE_DEBUG("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info); - if (bta_dm_cb.p_sec_cback) + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn); + } } else { - for(i=0; iacl_change.transport + || bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport #endif - ) + ) { continue; + } - if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING ) - { - if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr)) + if ( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING ) { + if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr)) { issue_unpair_cb = TRUE; + } - APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ",__FUNCTION__, issue_unpair_cb); + APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ", __FUNCTION__, issue_unpair_cb); } conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending; - for(; iacl_change.transport == BT_TRANSPORT_LE) && - (bta_dm_cb.device_list.le_count)) + (bta_dm_cb.device_list.le_count)) { bta_dm_cb.device_list.le_count--; + } conn.link_down.link_type = p_data->acl_change.transport; #endif - if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) - { + if (bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) { bta_dm_search_cb.wait_disc = FALSE; - if(bta_dm_search_cb.sdp_results) - { + if (bta_dm_search_cb.sdp_results) { APPL_TRACE_EVENT(" timer stopped "); bta_sys_stop_timer(&bta_dm_search_cb.search_timer); bta_dm_discover_next_device(); @@ -3429,12 +3238,10 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) } - if(bta_dm_cb.disabling) - { - if(!BTM_GetNumAclLinks()) - { + if (bta_dm_cb.disabling) { + if (!BTM_GetNumAclLinks()) { bta_sys_stop_timer(&bta_dm_cb.disable_timer); - bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback; + bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback; /* * Start a timer to make sure that the profiles * get the disconnect event. @@ -3442,8 +3249,7 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000); } } - if (conn.link_down.is_removed) - { + if (conn.link_down.is_removed) { BTM_SecDeleteDevice(p_bda); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) /* need to remove all pending background connection */ @@ -3451,15 +3257,15 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) /* remove all cached GATT information */ BTA_GATTC_Refresh(p_bda); #endif - } + } bdcpy(conn.link_down.bd_addr, p_bda); conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code(); - if( bta_dm_cb.p_sec_cback ) - { + if ( bta_dm_cb.p_sec_cback ) { bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn); - if( issue_unpair_cb ) + if ( issue_unpair_cb ) { bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn); + } } } @@ -3488,8 +3294,7 @@ static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle) bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback ); /* send a message to BTA SYS */ - if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) - { + if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) { sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT; sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; bta_sys_sendmsg(sys_enable_event); @@ -3516,50 +3321,48 @@ static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, tBTA_DM_PEER_DEVICE *p_dev; p_dev = bta_dm_find_peer_device(peer_addr); - if( status == BTA_SYS_CONN_OPEN) - { - if(p_dev) - { + if ( status == BTA_SYS_CONN_OPEN) { + if (p_dev) { /* Do not set to connected if we are in the middle of unpairing. When AV stream is * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command. * But this should not be done if we are in the middle of unpairing. */ - if (p_dev->conn_state != BTA_DM_UNPAIRING) + if (p_dev->conn_state != BTA_DM_UNPAIRING) { p_dev->conn_state = BTA_DM_CONNECTED; + } - for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++) - { - if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) - && (p_bta_dm_rm_cfg[j].id == id)) - { + for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) { + if (((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) + && (p_bta_dm_rm_cfg[j].id == id)) { role = p_bta_dm_rm_cfg[j].cfg; - if(role > p_dev->pref_role ) + if (role > p_dev->pref_role ) { p_dev->pref_role = role; + } break; } } } } - if((BTA_ID_AV == id)||(BTA_ID_AVK ==id)) - { - if( status == BTA_SYS_CONN_BUSY) - { - if(p_dev) + if ((BTA_ID_AV == id) || (BTA_ID_AVK == id)) { + if ( status == BTA_SYS_CONN_BUSY) { + if (p_dev) { p_dev->info |= BTA_DM_DI_AV_ACTIVE; + } /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ - if(BTA_ID_AV == id) + if (BTA_ID_AV == id) { bta_dm_cb.cur_av_count = bta_dm_get_av_count(); - } - else if( status == BTA_SYS_CONN_IDLE) - { - if(p_dev) + } + } else if ( status == BTA_SYS_CONN_IDLE) { + if (p_dev) { p_dev->info &= ~BTA_DM_DI_AV_ACTIVE; + } /* get cur_av_count from connected services */ - if(BTA_ID_AV == id) + if (BTA_ID_AV == id) { bta_dm_cb.cur_av_count = bta_dm_get_av_count(); + } } APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status); } @@ -3567,8 +3370,9 @@ static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, /* Don't adjust roles for each busy/idle state transition to avoid excessive switch requests when individual profile busy/idle status changes */ - if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) + if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) { bta_dm_adjust_roles(FALSE); + } } /******************************************************************************* @@ -3602,26 +3406,20 @@ static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr) { UINT16 index = 0; if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) || - BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) - { - APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes", - __FUNCTION__); - for (index = 0; index < bta_dm_cb.device_list.count; index ++) - { - if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr)) + BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) { + APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes", + __FUNCTION__); + for (index = 0; index < bta_dm_cb.device_list.count; index ++) { + if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr)) { break; + } } - if (index != bta_dm_cb.device_list.count) - { + if (index != bta_dm_cb.device_list.count) { bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE; - } - else - { + } else { APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__); } - } - else - { + } else { BTM_SecDeleteDevice (remote_bd_addr); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) /* need to remove all pending background connection */ @@ -3653,55 +3451,46 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) #else UINT8 br_count = bta_dm_cb.device_list.count; #endif - if (br_count) - { + if (br_count) { /* the configuration is no scatternet * or AV connection exists and there are more than one ACL link */ if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) || - (bta_dm_cb.cur_av_count && br_count > 1) ) - { + (bta_dm_cb.cur_av_count && br_count > 1) ) { L2CA_SetDesireRole (HCI_ROLE_MASTER); set_master_role = TRUE; } - for(i=0; i 1)) - { + if ((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY) + || (br_count > 1)) { - /* Initiating immediate role switch with certain remote devices - has caused issues due to role switch colliding with link encryption setup and - causing encryption (and in turn the link) to fail . These device . Firmware - versions are stored in a blacklist and role switch with these devices are - delayed to avoid the collision with link encryption setup */ + /* Initiating immediate role switch with certain remote devices + has caused issues due to role switch colliding with link encryption setup and + causing encryption (and in turn the link) to fail . These device . Firmware + versions are stored in a blacklist and role switch with these devices are + delayed to avoid the collision with link encryption setup */ if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_SLAVE_ROLE_ONLY && - delay_role_switch == FALSE) - { + delay_role_switch == FALSE) { BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, HCI_ROLE_MASTER, NULL); - } - else - { + } else { bta_dm_cb.switch_delay_timer.p_cback = - (TIMER_CBACK*)&bta_dm_delay_role_switch_cback; + (TIMER_CBACK *)&bta_dm_delay_role_switch_cback; bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500); } } @@ -3710,16 +3499,13 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) } - if(!set_master_role) - { + if (!set_master_role) { L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE); } - } - else - { + } else { L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE); } @@ -3742,8 +3528,9 @@ static char *bta_dm_get_remname(void) /* If the name isn't already stored, try retrieving from BTM */ if (*p_name == '\0') - if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL) + if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL) { p_name = p_temp; + } return p_name; } @@ -3762,13 +3549,13 @@ static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result) tBTA_DM_SEC sec_event; - if (result == BTM_SUCCESS) + if (result == BTM_SUCCESS) { sec_event.bond_cancel_cmpl.result = BTA_SUCCESS; - else + } else { sec_event.bond_cancel_cmpl.result = BTA_FAILURE; + } - if(bta_dm_cb.p_sec_cback) - { + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); } } @@ -3804,27 +3591,26 @@ static void bta_dm_set_eir (char *local_name) UINT8 local_name_len; /* wait until complete to disable */ - if (bta_dm_cb.disable_timer.in_use) + if (bta_dm_cb.disable_timer.in_use) { return; + } #if ( BTA_EIR_CANNED_UUID_LIST != TRUE ) /* wait until App is ready */ - if (bta_dm_cb.app_ready_timer.in_use) + if (bta_dm_cb.app_ready_timer.in_use) { return; + } /* if local name is not provided, get it from controller */ - if( local_name == NULL ) - { - if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS ) - { + if ( local_name == NULL ) { + if ( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS ) { APPL_TRACE_ERROR("Fail to read local device name for EIR"); } } #endif // BTA_EIR_CANNED_UUID_LIST /* Allocate a buffer to hold HCI command */ - if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL) { APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer"); return; } @@ -3834,42 +3620,40 @@ static void bta_dm_set_eir (char *local_name) APPL_TRACE_DEBUG("BTA is generating EIR"); - if( local_name ) + if ( local_name ) { local_name_len = strlen( local_name ); - else + } else { local_name_len = 0; + } data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; /* if local name is longer than minimum length of shortened name */ /* check whether it needs to be shortened or not */ - if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len ) - { + if ( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len ) { /* get number of UUID 16-bit list */ #if (BTA_EIR_CANNED_UUID_LIST == TRUE) - num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16; + num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16; #else // BTA_EIR_CANNED_UUID_LIST - max_num_uuid = (free_eir_length - 2)/LEN_UUID_16; + max_num_uuid = (free_eir_length - 2) / LEN_UUID_16; data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, - max_num_uuid, &num_uuid ); + max_num_uuid, &num_uuid ); p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */ #endif // BTA_EIR_CANNED_UUID_LIST /* if UUID doesn't fit remaing space, shorten local name */ - if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16)) - { + if ( local_name_len > (free_eir_length - 4 - num_uuid * LEN_UUID_16)) { APPL_TRACE_WARNING("BTA EIR: local name is shortened"); local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len; data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; - } - else + } else { data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; + } } UINT8_TO_STREAM(p, local_name_len + 1); UINT8_TO_STREAM(p, data_type); - if (local_name != NULL) - { + if (local_name != NULL) { memcpy(p, local_name, local_name_len); p += local_name_len; } @@ -3877,20 +3661,15 @@ static void bta_dm_set_eir (char *local_name) #if (BTA_EIR_CANNED_UUID_LIST == TRUE) /* if UUID list is provided as static data in configuration */ - if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 ) - &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) - { - if( free_eir_length > LEN_UUID_16 + 2) - { + if (( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 ) + && (p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) { + if ( free_eir_length > LEN_UUID_16 + 2) { free_eir_length -= 2; - if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) - { + if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) { num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16; data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE; - } - else /* not enough room for all UUIDs */ - { + } else { /* not enough room for all UUIDs */ APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); num_uuid = free_eir_length / LEN_UUID_16; data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; @@ -3904,33 +3683,25 @@ static void bta_dm_set_eir (char *local_name) } #else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */ /* if UUID list is dynamic */ - if ( free_eir_length >= 2) - { + if ( free_eir_length >= 2) { p_length = p++; p_type = p++; num_uuid = 0; - max_num_uuid = (free_eir_length - 2)/LEN_UUID_16; + max_num_uuid = (free_eir_length - 2) / LEN_UUID_16; data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid ); - if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE ) - { + if ( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE ) { APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); } #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) - else - { - for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) - { - if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) - { - if ( num_uuid < max_num_uuid ) - { + else { + for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) { + if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) { + if ( num_uuid < max_num_uuid ) { UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16); num_uuid++; - } - else - { + } else { data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); break; @@ -3948,26 +3719,20 @@ static void bta_dm_set_eir (char *local_name) #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) /* Adding 32-bit UUID list */ - if ( free_eir_length >= 2) - { + if ( free_eir_length >= 2) { p_length = p++; p_type = p++; num_uuid = 0; data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE; - max_num_uuid = (free_eir_length - 2)/LEN_UUID_32; + max_num_uuid = (free_eir_length - 2) / LEN_UUID_32; - for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) - { - if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) - { - if ( num_uuid < max_num_uuid ) - { + for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) { + if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) { + if ( num_uuid < max_num_uuid ) { UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32); num_uuid++; - } - else - { + } else { data_type = BTM_EIR_MORE_32BITS_UUID_TYPE; APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated"); break; @@ -3981,26 +3746,20 @@ static void bta_dm_set_eir (char *local_name) } /* Adding 128-bit UUID list */ - if ( free_eir_length >= 2) - { + if ( free_eir_length >= 2) { p_length = p++; p_type = p++; num_uuid = 0; data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE; - max_num_uuid = (free_eir_length - 2)/LEN_UUID_128; + max_num_uuid = (free_eir_length - 2) / LEN_UUID_128; - for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) - { - if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) - { - if ( num_uuid < max_num_uuid ) - { + for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) { + if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) { + if ( num_uuid < max_num_uuid ) { ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128); num_uuid++; - } - else - { + } else { data_type = BTM_EIR_MORE_128BITS_UUID_TYPE; APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated"); break; @@ -4015,10 +3774,9 @@ static void bta_dm_set_eir (char *local_name) #endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */ /* if Flags are provided in configuration */ - if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 ) - &&( p_bta_dm_eir_cfg->bta_dm_eir_flags ) - &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 )) - { + if (( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 ) + && ( p_bta_dm_eir_cfg->bta_dm_eir_flags ) + && ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 )) { UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1); UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE); memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags, @@ -4028,10 +3786,9 @@ static void bta_dm_set_eir (char *local_name) } /* if Manufacturer Specific are provided in configuration */ - if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 ) - &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec ) - &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 )) - { + if (( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 ) + && ( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec ) + && ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 )) { p_length = p; UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1); @@ -4041,24 +3798,22 @@ static void bta_dm_set_eir (char *local_name) p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len; free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2; - } - else - { + } else { p_length = NULL; } /* if Inquiry Tx Resp Power compiled */ if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) && - (free_eir_length >= 3)) - { + (free_eir_length >= 3)) { UINT8_TO_STREAM(p, 2); /* Length field */ UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE); UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power)); free_eir_length -= 3; } - if( free_eir_length ) - UINT8_TO_STREAM(p, 0); /* terminator of significant part */ + if ( free_eir_length ) { + UINT8_TO_STREAM(p, 0); /* terminator of significant part */ + } BTM_WriteEIR( p_buf ); @@ -4081,9 +3836,9 @@ static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, tBTM_EIR_SEARCH_RESULT result; APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X", - p_result->remote_bd_addr[0],p_result->remote_bd_addr[1], - p_result->remote_bd_addr[2],p_result->remote_bd_addr[3], - p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]); + p_result->remote_bd_addr[0], p_result->remote_bd_addr[1], + p_result->remote_bd_addr[2], p_result->remote_bd_addr[3], + p_result->remote_bd_addr[4], p_result->remote_bd_addr[5]); APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search); @@ -4092,42 +3847,36 @@ static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, /* if GATT based service is also to be put in EIR, need to modify this */ while (service_index < (BTA_MAX_SERVICE_ID - 1)) #else - while(service_index < BTA_MAX_SERVICE_ID) + while (service_index < BTA_MAX_SERVICE_ID) #endif { - if( *p_services_to_search - & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) - { + if ( *p_services_to_search + & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) { result = BTM_HasInquiryEirService( p_result, bta_service_id_to_uuid_lkup_tbl[service_index] ); /* Searching for HSP v1.2 only device */ if ((result != BTM_EIR_FOUND) && - (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET)) - { + (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET)) { result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS); } - if( result == BTM_EIR_FOUND ) - { + if ( result == BTM_EIR_FOUND ) { /* If Plug and Play service record, need to check to see if Broadcom stack */ /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */ - if( bta_service_id_to_uuid_lkup_tbl[service_index] - != UUID_SERVCLASS_PNP_INFORMATION ) - { + if ( bta_service_id_to_uuid_lkup_tbl[service_index] + != UUID_SERVCLASS_PNP_INFORMATION ) { *p_services_found |= - (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)); + (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)); /* remove the service from services to be searched */ *p_services_to_search &= - (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); + (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); } - } - else if( result == BTM_EIR_NOT_FOUND ) - { + } else if ( result == BTM_EIR_NOT_FOUND ) { /* remove the service from services to be searched */ *p_services_to_search &= - (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); + (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); } } @@ -4135,7 +3884,7 @@ static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, } APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X", - *p_services_to_search, *p_services_found); + *p_services_to_search, *p_services_found); } #if (BTA_EIR_CANNED_UUID_LIST != TRUE) @@ -4151,17 +3900,15 @@ static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding) { /* if this UUID is not advertised in EIR */ - if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 )) + if ( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 )) { return; + } - if( adding ) - { + if ( adding ) { APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16); BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 ); - } - else - { + } else { APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16); BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 ); @@ -4170,7 +3917,7 @@ void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding) bta_dm_set_eir (NULL); APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X", - bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] ); + bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] ); } #endif @@ -4219,8 +3966,7 @@ void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data) void bta_dm_execute_callback(tBTA_DM_MSG *p_data) { /* sanity check */ - if(p_data->exec_cback.p_exec_cback == NULL) - { + if (p_data->exec_cback.p_exec_cback == NULL) { return; } @@ -4243,41 +3989,38 @@ void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_ UINT8 i ; UNUSED(p_ref_data); - for (i=0; iset_encryption.p_callback) - { + if (!p_data->set_encryption.p_callback) { APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided\n"); return; } - for (i=0; iset_encryption.bd_addr) == 0 && - bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) + bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) { break; + } } - if (i < bta_dm_cb.device_list.count) - { - if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) - { + if (i < bta_dm_cb.device_list.count) { + if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) { APPL_TRACE_ERROR("earlier enc was not done for same device\n"); (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, - p_data->set_encryption.transport, - BTA_BUSY); + p_data->set_encryption.transport, + BTA_BUSY); return; } if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport, - bta_dm_encrypt_cback, &p_data->set_encryption.sec_act) - == BTM_CMD_STARTED) - { + bta_dm_encrypt_cback, &p_data->set_encryption.sec_act) + == BTM_CMD_STARTED) { bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback; } } @@ -4340,7 +4079,7 @@ void bta_dm_set_encryption (tBTA_DM_MSG *p_data) *******************************************************************************/ static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) { -; + ; tBTA_DM_SEARCH result; tBTM_INQ_INFO *p_inq_info; APPL_TRACE_DEBUG("bta_dm_observe_results_cb") @@ -4355,21 +4094,21 @@ static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) /* application will parse EIR to find out remote device name */ result.inq_res.p_eir = p_eir; - if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) - { + if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) { /* initialize remt_name_not_required to FALSE so that we get the name by default */ result.inq_res.remt_name_not_required = FALSE; } - if(bta_dm_search_cb.p_scan_cback) + if (bta_dm_search_cb.p_scan_cback) { bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result); + } - if(p_inq_info) - { + if (p_inq_info) { /* application indicates if it knows the remote name, inside the callback copy that to the inquiry data base*/ - if(result.inq_res.remt_name_not_required) + if (result.inq_res.remt_name_not_required) { p_inq_info->appl_knows_rem_name = TRUE; + } } } @@ -4383,15 +4122,14 @@ static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) ** Returns void ** *******************************************************************************/ -static void bta_dm_observe_cmpl_cb (void * p_result) +static void bta_dm_observe_cmpl_cb (void *p_result) { tBTA_DM_SEARCH data; APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb"); data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp; - if (bta_dm_search_cb.p_scan_cback) - { + if (bta_dm_search_cb.p_scan_cback) { bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data); } } @@ -4415,127 +4153,115 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D UINT8 i; tBT_DEVICE_TYPE dev_type; - if (!bta_dm_cb.p_sec_cback) + if (!bta_dm_cb.p_sec_cback) { return BTM_NOT_AUTHORIZED; + } memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); - switch (event) - { - case BTM_LE_IO_REQ_EVT: + switch (event) { + case BTM_LE_IO_REQ_EVT: #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) - bta_dm_co_ble_io_req(bda, - &p_data->io_req.io_cap, - &p_data->io_req.oob_data, - &p_data->io_req.auth_req, - &p_data->io_req.max_key_size, - &p_data->io_req.init_keys, - &p_data->io_req.resp_keys); + bta_dm_co_ble_io_req(bda, + &p_data->io_req.io_cap, + &p_data->io_req.oob_data, + &p_data->io_req.auth_req, + &p_data->io_req.max_key_size, + &p_data->io_req.init_keys, + &p_data->io_req.resp_keys); #endif #if BTM_OOB_INCLUDED == FALSE - status = BTM_SUCCESS; + status = BTM_SUCCESS; #endif - APPL_TRACE_EVENT("io mitm: %d oob_data:%d\n", p_data->io_req.auth_req, p_data->io_req.oob_data); + APPL_TRACE_EVENT("io mitm: %d oob_data:%d\n", p_data->io_req.auth_req, p_data->io_req.oob_data); - break; + break; - case BTM_LE_SEC_REQUEST_EVT: - bdcpy(sec_event.ble_req.bd_addr, bda); - p_name = BTM_SecReadDevName(bda); - if (p_name != NULL) - { - BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name, - sizeof(BD_NAME), p_name, (BD_NAME_LEN)); - } - else - { - sec_event.ble_req.bd_name[0] = 0; - } - sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; - bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event); - break; + case BTM_LE_SEC_REQUEST_EVT: + bdcpy(sec_event.ble_req.bd_addr, bda); + p_name = BTM_SecReadDevName(bda); + if (p_name != NULL) { + BCM_STRNCPY_S((char *)sec_event.ble_req.bd_name, + sizeof(BD_NAME), p_name, (BD_NAME_LEN)); + } else { + sec_event.ble_req.bd_name[0] = 0; + } + sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; + bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event); + break; - case BTM_LE_KEY_NOTIF_EVT: - bdcpy(sec_event.key_notif.bd_addr, bda); - p_name = BTM_SecReadDevName(bda); - if (p_name != NULL) - { - BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, - sizeof(BD_NAME), p_name, (BD_NAME_LEN)); - } - else - { - sec_event.key_notif.bd_name[0] = 0; - } - sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; - sec_event.key_notif.passkey = p_data->key_notif; - bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); - break; + case BTM_LE_KEY_NOTIF_EVT: + bdcpy(sec_event.key_notif.bd_addr, bda); + p_name = BTM_SecReadDevName(bda); + if (p_name != NULL) { + BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, + sizeof(BD_NAME), p_name, (BD_NAME_LEN)); + } else { + sec_event.key_notif.bd_name[0] = 0; + } + sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; + sec_event.key_notif.passkey = p_data->key_notif; + bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); + break; - case BTM_LE_KEY_REQ_EVT: - bdcpy(sec_event.ble_req.bd_addr, bda); - bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event); - break; + case BTM_LE_KEY_REQ_EVT: + bdcpy(sec_event.ble_req.bd_addr, bda); + bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event); + break; - case BTM_LE_OOB_REQ_EVT: - bdcpy(sec_event.ble_req.bd_addr, bda); - bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event); - break; + case BTM_LE_OOB_REQ_EVT: + bdcpy(sec_event.ble_req.bd_addr, bda); + bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event); + break; - case BTM_LE_NC_REQ_EVT: - bdcpy(sec_event.key_notif.bd_addr, bda); - BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN)); - sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; - sec_event.key_notif.passkey = p_data->key_notif; - bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event); - break; + case BTM_LE_NC_REQ_EVT: + bdcpy(sec_event.key_notif.bd_addr, bda); + BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN)); + sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; + sec_event.key_notif.passkey = p_data->key_notif; + bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event); + break; - case BTM_LE_KEY_EVT: - bdcpy(sec_event.ble_key.bd_addr, bda); - sec_event.ble_key.key_type = p_data->key.key_type; - sec_event.ble_key.p_key_value = p_data->key.p_key_value; - bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event); - break; + case BTM_LE_KEY_EVT: + bdcpy(sec_event.ble_key.bd_addr, bda); + sec_event.ble_key.key_type = p_data->key.key_type; + sec_event.ble_key.p_key_value = p_data->key.p_key_value; + bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event); + break; - case BTM_LE_COMPLT_EVT: - bdcpy(sec_event.auth_cmpl.bd_addr, bda); + case BTM_LE_COMPLT_EVT: + bdcpy(sec_event.auth_cmpl.bd_addr, bda); #if BLE_INCLUDED == TRUE - BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type); + BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type); #endif - p_name = BTM_SecReadDevName(bda); - if (p_name != NULL) - { - BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name, - sizeof(BD_NAME), p_name, (BD_NAME_LEN)); - } - else - { - sec_event.auth_cmpl.bd_name[0] = 0; - } - if (p_data->complt.reason != 0) - { - sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason)); - /* delete this device entry from Sec Dev DB */ - bta_dm_remove_sec_dev_entry (bda); - } - else - { - sec_event.auth_cmpl.success = TRUE; - if (!p_data->complt.smp_over_br) - GATT_ConfigServiceChangeCCC(bda, TRUE, BT_TRANSPORT_LE); + p_name = BTM_SecReadDevName(bda); + if (p_name != NULL) { + BCM_STRNCPY_S((char *)sec_event.auth_cmpl.bd_name, + sizeof(BD_NAME), p_name, (BD_NAME_LEN)); + } else { + sec_event.auth_cmpl.bd_name[0] = 0; + } + if (p_data->complt.reason != 0) { + sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason)); + /* delete this device entry from Sec Dev DB */ + bta_dm_remove_sec_dev_entry (bda); + } else { + sec_event.auth_cmpl.success = TRUE; + if (!p_data->complt.smp_over_br) { + GATT_ConfigServiceChangeCCC(bda, TRUE, BT_TRANSPORT_LE); } + } - if (bta_dm_cb.p_sec_cback) - { - //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); - bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event); - } + if (bta_dm_cb.p_sec_cback) { + //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); + bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event); + } - break; + break; - default: - status = BTM_NOT_AUTHORIZED; - break; + default: + status = BTM_NOT_AUTHORIZED; + break; } return status; } @@ -4556,23 +4282,21 @@ static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key) UINT8 evt; tBTA_DM_SEC dm_key; - switch (key_type) - { - case BTM_BLE_KEY_TYPE_ID: - case BTM_BLE_KEY_TYPE_ER: - if (bta_dm_cb.p_sec_cback) - { - memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS)); + switch (key_type) { + case BTM_BLE_KEY_TYPE_ID: + case BTM_BLE_KEY_TYPE_ER: + if (bta_dm_cb.p_sec_cback) { + memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS)); - evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\ - BTA_DM_BLE_LOCAL_ER_EVT; - bta_dm_cb.p_sec_cback(evt, &dm_key); - } - break; + evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT : \ + BTA_DM_BLE_LOCAL_ER_EVT; + bta_dm_cb.p_sec_cback(evt, &dm_key); + } + break; - default: - APPL_TRACE_DEBUG("Unknown key type %d", key_type); - break; + default: + APPL_TRACE_DEBUG("Unknown key type %d", key_type); + break; } return; @@ -4594,12 +4318,11 @@ void bta_dm_add_blekey (tBTA_DM_MSG *p_data) { if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr, (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey, - p_data->add_ble_key.key_type)) - { + p_data->add_ble_key.key_type)) { APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x", - (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\ - (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3], - (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]); + (p_data->add_ble_key.bd_addr[0] << 24) + (p_data->add_ble_key.bd_addr[1] << 16) + \ + (p_data->add_ble_key.bd_addr[2] << 8) + p_data->add_ble_key.bd_addr[3], + (p_data->add_ble_key.bd_addr[4] << 8) + p_data->add_ble_key.bd_addr[5]); } } @@ -4618,12 +4341,11 @@ void bta_dm_add_ble_device (tBTA_DM_MSG *p_data) { if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL, p_data->add_ble_device.dev_type , - p_data->add_ble_device.addr_type)) - { + p_data->add_ble_device.addr_type)) { APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x", - (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \ - (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3], - (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]); + (p_data->add_ble_device.bd_addr[0] << 24) + (p_data->add_ble_device.bd_addr[1] << 16) + \ + (p_data->add_ble_device.bd_addr[2] << 8) + p_data->add_ble_device.bd_addr[3], + (p_data->add_ble_device.bd_addr[4] << 8) + p_data->add_ble_device.bd_addr[5]); } } @@ -4640,12 +4362,9 @@ void bta_dm_add_ble_device (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data) { - if (p_data->pin_reply.accept) - { + if (p_data->pin_reply.accept) { BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey); - } - else - { + } else { BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey); } @@ -4663,12 +4382,9 @@ void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data) { - if (p_data->confirm.accept) - { + if (p_data->confirm.accept) { BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS); - } - else - { + } else { BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED); } } @@ -4749,13 +4465,13 @@ void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG *p_data) { - BTM_BleSetScanFilterParams (p_data->ble_set_scan_fil_params.client_if, - p_data->ble_set_scan_fil_params.scan_int, - p_data->ble_set_scan_fil_params.scan_window, - p_data->ble_set_scan_fil_params.scan_mode, - p_data->ble_set_scan_fil_params.addr_type_own, - p_data->ble_set_scan_fil_params.scan_filter_policy, - p_data->ble_set_scan_fil_params.scan_param_setup_cback); + BTM_BleSetScanFilterParams (p_data->ble_set_scan_fil_params.client_if, + p_data->ble_set_scan_fil_params.scan_int, + p_data->ble_set_scan_fil_params.scan_window, + p_data->ble_set_scan_fil_params.scan_mode, + p_data->ble_set_scan_fil_params.addr_type_own, + p_data->ble_set_scan_fil_params.scan_filter_policy, + p_data->ble_set_scan_fil_params.scan_param_setup_cback); } @@ -4785,11 +4501,10 @@ void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data) void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data) { if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr, - p_data->ble_update_conn_params.min_int, - p_data->ble_update_conn_params.max_int, - p_data->ble_update_conn_params.latency, - p_data->ble_update_conn_params.timeout)) - { + p_data->ble_update_conn_params.min_int, + p_data->ble_update_conn_params.max_int, + p_data->ble_update_conn_params.latency, + p_data->ble_update_conn_params.timeout)) { APPL_TRACE_ERROR("Update connection parameters failed!"); } } @@ -4800,25 +4515,23 @@ void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data) ** ** Description This function set the LE random address for the device. ** -** Parameters: rand_addr:the random address whitch should be setting -** Explanation: This function added by Yulong at 2016/9/9 +** Parameters: rand_addr:the random address whitch should be setting +** Explanation: This function added by Yulong at 2016/9/9 *******************************************************************************/ void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data) { - UINT8 len = sizeof(p_data->set_addr); - if(len != BD_ADDR_LEN) - { - APPL_TRACE_ERROR("Invalid random adress"); - return; - } - if(p_data->set_addr.addr_type != BLE_ADDR_RANDOM) - { - APPL_TRACE_ERROR("Invalid random adress type = %d\n",p_data->set_addr.addr_type); - return; - } - //send the setting random address to BTM layer - BTM_BleSetRandAddress(p_data->set_addr.address); - + UINT8 len = sizeof(p_data->set_addr); + if (len != BD_ADDR_LEN) { + APPL_TRACE_ERROR("Invalid random adress"); + return; + } + if (p_data->set_addr.addr_type != BLE_ADDR_RANDOM) { + APPL_TRACE_ERROR("Invalid random adress type = %d\n", p_data->set_addr.addr_type); + return; + } + //send the setting random address to BTM layer + BTM_BleSetRandAddress(p_data->set_addr.address); + } /******************************************************************************* @@ -4827,17 +4540,16 @@ void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data) ** ** Description This function stop the BLE avdertising for the device. ** -** Parameters: void -** Explanation: This function added by Yulong at 2016/10/19 +** Parameters: void +** Explanation: This function added by Yulong at 2016/10/19 *******************************************************************************/ void bta_dm_ble_stop_advertising(tBTA_DM_MSG *p_data) { - if(p_data->hdr.event != BTA_DM_API_BLE_STOP_ADV_EVT) - { - APPL_TRACE_ERROR("Invalid BTA event,cann't stop the BLE adverting\n"); - } - - btm_ble_stop_adv(); + if (p_data->hdr.event != BTA_DM_API_BLE_STOP_ADV_EVT) { + APPL_TRACE_ERROR("Invalid BTA event,cann't stop the BLE adverting\n"); + } + + btm_ble_stop_adv(); } @@ -4870,26 +4582,21 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data) void bta_dm_ble_observe (tBTA_DM_MSG *p_data) { tBTM_STATUS status; - if (p_data->ble_observe.start) - { + if (p_data->ble_observe.start) { /*Save the callback to be called when a scan results are available */ bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback; if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration, - bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED) - { + bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb)) != BTM_CMD_STARTED) { tBTA_DM_SEARCH data; - APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d\n",__FUNCTION__,status); + APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d\n", __FUNCTION__, status); data.inq_cmpl.num_resps = 0; - if (bta_dm_search_cb.p_scan_cback) - { + if (bta_dm_search_cb.p_scan_cback) { bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data); } } - } - else - { + } else { bta_dm_search_cb.p_scan_cback = NULL; - BTM_BleObserve(FALSE, 0, NULL,NULL ); + BTM_BleObserve(FALSE, 0, NULL, NULL ); } } /******************************************************************************* @@ -4920,15 +4627,15 @@ void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data) ** Returns void ** *******************************************************************************/ -void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data) +void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data) { - BTM_BleSetAdvParamsStartAdv(p_data->ble_set_adv_params_all.adv_int_min, - p_data->ble_set_adv_params_all.adv_int_max, - p_data->ble_set_adv_params_all.adv_type, - p_data->ble_set_adv_params_all.addr_type_own, - p_data->ble_set_adv_params_all.p_dir_bda, - p_data->ble_set_adv_params_all.channel_map, - p_data->ble_set_adv_params_all.adv_filter_policy); + BTM_BleSetAdvParamsStartAdv(p_data->ble_set_adv_params_all.adv_int_min, + p_data->ble_set_adv_params_all.adv_int_max, + p_data->ble_set_adv_params_all.adv_type, + p_data->ble_set_adv_params_all.addr_type_own, + p_data->ble_set_adv_params_all.p_dir_bda, + p_data->ble_set_adv_params_all.channel_map, + p_data->ble_set_adv_params_all.adv_filter_policy); } /******************************************************************************* @@ -4945,13 +4652,13 @@ void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data) tBTA_STATUS status = BTA_FAILURE; if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask, - (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) - { + (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) { status = BTA_SUCCESS; } - if (p_data->ble_set_adv_data.p_adv_data_cback) + if (p_data->ble_set_adv_data.p_adv_data_cback) { (*p_data->ble_set_adv_data.p_adv_data_cback)(status); + } } /******************************************************************************* @@ -4967,14 +4674,14 @@ void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data) { tBTA_STATUS status = BTA_FAILURE; - if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask, - (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) - { + if (BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask, + (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) { status = BTA_SUCCESS; } - if (p_data->ble_set_adv_data.p_adv_data_cback) + if (p_data->ble_set_adv_data.p_adv_data_cback) { (*p_data->ble_set_adv_data.p_adv_data_cback)(status); + } } /******************************************************************************* @@ -4989,8 +4696,7 @@ void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data) void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data) { if (BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda, - p_data->ble_set_data_length.tx_data_length) != BTM_SUCCESS) - { + p_data->ble_set_data_length.tx_data_length) != BTM_SUCCESS) { APPL_TRACE_ERROR("%s failed\n", __FUNCTION__); } } @@ -5023,16 +4729,14 @@ void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data) tBTM_STATUS btm_status = 0; bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback; - if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref) - { - btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*) - p_data->ble_multi_adv_enb.p_params, - p_data->ble_multi_adv_enb.p_cback, - p_data->ble_multi_adv_enb.p_ref); + if (BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref) { + btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS *) + p_data->ble_multi_adv_enb.p_params, + p_data->ble_multi_adv_enb.p_cback, + p_data->ble_multi_adv_enb.p_ref); } - if(BTM_CMD_STARTED != btm_status) - { + if (BTM_CMD_STARTED != btm_status) { bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF, p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE); } @@ -5051,18 +4755,16 @@ void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data) tBTM_STATUS btm_status = 0; void *p_ref = NULL; - if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0 - && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount()) - { + if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0 + && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount()) { btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id, - (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params); + (tBTM_BLE_ADV_PARAMS *)p_data->ble_multi_adv_param.p_params); } - if(BTM_CMD_STARTED != btm_status) - { - p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id); - bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT, - p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE); + if (BTM_CMD_STARTED != btm_status) { + p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id); + bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT, + p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE); } } /******************************************************************************* @@ -5080,20 +4782,18 @@ void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data) tBTM_STATUS btm_status = 0; void *p_ref = NULL; - if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0 - && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount()) - { + if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0 + && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount()) { btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id, - p_data->ble_multi_adv_data.is_scan_rsp, - p_data->ble_multi_adv_data.data_mask, - (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data); + p_data->ble_multi_adv_data.is_scan_rsp, + p_data->ble_multi_adv_data.data_mask, + (tBTM_BLE_ADV_DATA *)p_data->ble_multi_adv_data.p_data); } - if(BTM_CMD_STARTED != btm_status) - { - p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id); - bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT, - p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE); + if (BTM_CMD_STARTED != btm_status) { + p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id); + bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT, + p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE); } } @@ -5111,17 +4811,15 @@ void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data) tBTM_STATUS btm_status = 0; void *p_ref = NULL; - if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0 - && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount()) - { + if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0 + && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount()) { btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id); } - if(BTM_CMD_STARTED != btm_status) - { - p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id); - bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT, - p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE); + if (BTM_CMD_STARTED != btm_status) { + p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id); + bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT, + p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE); } } @@ -5141,8 +4839,7 @@ void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max, p_data->ble_set_storage.batch_scan_trunc_max, p_data->ble_set_storage.batch_scan_notify_threshold, @@ -5152,9 +4849,9 @@ void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data) p_data->ble_set_storage.ref_value); } - if(BTM_CMD_STARTED != btm_status) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value, - btm_status); + if (BTM_CMD_STARTED != btm_status) + bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value, + btm_status); } /******************************************************************************* @@ -5173,8 +4870,7 @@ void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode, p_data->ble_enable_scan.scan_int, p_data->ble_enable_scan.scan_window, @@ -5183,9 +4879,9 @@ void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data) p_data->ble_enable_scan.ref_value); } - if(BTM_CMD_STARTED != btm_status) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value, - btm_status); + if (BTM_CMD_STARTED != btm_status) + bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value, + btm_status); } /******************************************************************************* @@ -5205,14 +4901,13 @@ void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value); } - if(BTM_CMD_STARTED != btm_status) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value, - btm_status); + if (BTM_CMD_STARTED != btm_status) + bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value, + btm_status); } /******************************************************************************* @@ -5231,15 +4926,14 @@ void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type, p_data->ble_read_reports.ref_value); } - if(BTM_CMD_STARTED != btm_status) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value, - btm_status); + if (BTM_CMD_STARTED != btm_status) + bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value, + btm_status); } /******************************************************************************* @@ -5261,15 +4955,13 @@ void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { btm_status = BTM_BleTrackAdvertiser((tBTM_BLE_TRACK_ADV_CBACK *) p_data->ble_track_advert.p_track_adv_cback, p_data->ble_track_advert.ref_value); } - if(BTM_CMD_STARTED != btm_status) - { + if (BTM_CMD_STARTED != btm_status) { memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA)); track_adv_data.advertiser_info_present = NO_ADV_INFO_PRESENT; /* Indicates failure */ track_adv_data.client_if = (UINT8)p_data->ble_track_advert.ref_value; @@ -5287,33 +4979,33 @@ void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data) ** *******************************************************************************/ void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value, - tBTM_STATUS status) + tBTM_STATUS status) { tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0; APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt, - ref_value, status); + ref_value, status); - switch(evt) - { - case BTM_BLE_BATCH_SCAN_ENABLE_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT; - break; - case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT; - break; - case BTM_BLE_BATCH_SCAN_DISABLE_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT; - break; - case BTM_BLE_BATCH_SCAN_PARAM_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT; - break; - default: - break; + switch (evt) { + case BTM_BLE_BATCH_SCAN_ENABLE_EVT: + bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT; + break; + case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT: + bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT; + break; + case BTM_BLE_BATCH_SCAN_DISABLE_EVT: + bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT; + break; + case BTM_BLE_BATCH_SCAN_PARAM_EVT: + bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT; + break; + default: + break; } - if(NULL != bta_dm_cb.p_setup_cback) - bta_dm_cb.p_setup_cback(bta_evt, ref_value, status); + if (NULL != bta_dm_cb.p_setup_cback) { + bta_dm_cb.p_setup_cback(bta_evt, ref_value, status); + } } @@ -5329,15 +5021,16 @@ void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_v ** *******************************************************************************/ static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op, - tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status, + tBTM_BLE_REF_VALUE ref_value) { - tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE; + tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE; APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status); - if(bta_dm_cb.p_scan_filt_cfg_cback) - bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value); + if (bta_dm_cb.p_scan_filt_cfg_cback) { + bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value); + } } /******************************************************************************* @@ -5358,15 +5051,13 @@ void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond"); BTM_BleGetVendorCapabilities(&cmn_vsc_cb); - if(0 != cmn_vsc_cb.filter_support) - { + if (0 != cmn_vsc_cb.filter_support) { if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action, - p_data->ble_cfg_filter_cond.cond_type, - (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index, - (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param, - bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value)) - == BTM_CMD_STARTED) - { + p_data->ble_cfg_filter_cond.cond_type, + (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index, + (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param, + bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value)) + == BTM_CMD_STARTED) { bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback; return; } @@ -5374,8 +5065,8 @@ void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data) if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback) p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT, - p_data->ble_cfg_filter_cond.cond_type, 0, status, - p_data->ble_cfg_filter_cond.ref_value); + p_data->ble_cfg_filter_cond.cond_type, 0, status, + p_data->ble_cfg_filter_cond.ref_value); return; } @@ -5397,18 +5088,18 @@ void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("bta_dm_enable_scan_filter"); BTM_BleGetVendorCapabilities(&cmn_vsc_cb); - if(0 != cmn_vsc_cb.filter_support) - { - if((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action, - p_data->ble_enable_scan_filt.p_filt_status_cback, - (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED) - bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback; + if (0 != cmn_vsc_cb.filter_support) { + if ((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action, + p_data->ble_enable_scan_filt.p_filt_status_cback, + (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED) { + bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback; + } return; } if (p_data->ble_enable_scan_filt.p_filt_status_cback) p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT, - p_data->ble_enable_scan_filt.ref_value, status); + p_data->ble_enable_scan_filt.ref_value, status); } @@ -5430,15 +5121,13 @@ void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup"); BTM_BleGetVendorCapabilities(&cmn_vsc_cb); - if(0 != cmn_vsc_cb.filter_support) - { + if (0 != cmn_vsc_cb.filter_support) { if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action, - p_data->ble_scan_filt_param_setup.filt_index, - (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params, - p_data->ble_scan_filt_param_setup.p_target, - p_data->ble_scan_filt_param_setup.p_filt_param_cback, - p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED) - { + p_data->ble_scan_filt_param_setup.filt_index, + (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params, + p_data->ble_scan_filt_param_setup.p_target, + p_data->ble_scan_filt_param_setup.p_filt_param_cback, + p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED) { bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback; return; } @@ -5446,7 +5135,7 @@ void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data) if (p_data->ble_scan_filt_param_setup.p_filt_param_cback) p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0, - p_data->ble_scan_filt_param_setup.ref_value, status); + p_data->ble_scan_filt_param_setup.ref_value, status); return; } @@ -5463,19 +5152,21 @@ void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data) ** *******************************************************************************/ static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time, - tBTM_BLE_RX_TIME_MS rx_time, - tBTM_BLE_IDLE_TIME_MS idle_time, - tBTM_BLE_ENERGY_USED energy_used, - tBTM_STATUS status) + tBTM_BLE_RX_TIME_MS rx_time, + tBTM_BLE_IDLE_TIME_MS idle_time, + tBTM_BLE_ENERGY_USED energy_used, + tBTM_STATUS status) { - tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE; + tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE; tBTA_DM_CONTRL_STATE ctrl_state = 0; - if (BTA_SUCCESS == st) - ctrl_state = bta_dm_pm_obtain_controller_state(); + if (BTA_SUCCESS == st) { + ctrl_state = bta_dm_pm_obtain_controller_state(); + } - if (bta_dm_cb.p_energy_info_cback) + if (bta_dm_cb.p_energy_info_cback) { bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st); + } } /******************************************************************************* @@ -5493,8 +5184,9 @@ void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data) bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback; btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl); - if (BTM_CMD_STARTED != btm_status) + if (BTM_CMD_STARTED != btm_status) { bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status); + } } #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) @@ -5514,10 +5206,9 @@ void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data) *******************************************************************************/ static void bta_dm_gattc_register(void) { - tBT_UUID app_uuid = {LEN_UUID_128,{0}}; + tBT_UUID app_uuid = {LEN_UUID_128, {0}}; - if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) - { + if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) { memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128); BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback); } @@ -5563,36 +5254,29 @@ static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id) */ - if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) - { + if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) { APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", - service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used); + service_id.uuid.uu.uuid16, bta_dm_search_cb.p_ble_rawdata, bta_dm_search_cb.ble_raw_used); - if(bta_dm_search_cb.p_ble_rawdata) - { + if (bta_dm_search_cb.p_ble_rawdata) { memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id, sizeof(service_id) ); bta_dm_search_cb.ble_raw_used += sizeof(service_id); - } - else - { + } else { APPL_TRACE_ERROR("p_ble_rawdata is NULL"); } - } - else - { - APPL_TRACE_ERROR("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used ); + } else { + APPL_TRACE_ERROR("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__, bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used ); } LOG_INFO("%s service_id_uuid_len=%d ", __func__, service_id.uuid.len); - if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) - { + if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) { /* send result back to app now, one by one */ bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN - 1)); result.disc_ble_res.bd_name[BD_NAME_LEN] = 0; memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID)); @@ -5613,48 +5297,43 @@ static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status) { tBTA_DM_MSG *p_msg; - APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id); + APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d", conn_id); - if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --; - - if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) - { - btm_dm_start_disc_gatt_services(conn_id); + if (bta_dm_search_cb.uuid_to_search > 0) { + bta_dm_search_cb.uuid_to_search --; } - else - { + + if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) { + btm_dm_start_disc_gatt_services(conn_id); + } else { bta_dm_search_cb.uuid_to_search = 0; /* no more services to be discovered */ - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { + if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; - p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE; + p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS : BTA_FAILURE; APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__, bta_dm_search_cb.services_found); p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; p_msg->disc_result.result.disc_res.num_uuids = 0; p_msg->disc_result.result.disc_res.p_uuid_list = NULL; bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); - BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), - bta_dm_get_remname(), (BD_NAME_LEN-1)); + BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), + bta_dm_get_remname(), (BD_NAME_LEN - 1)); /* make sure the string is terminated */ - p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; + p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0; p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE; - if ( bta_dm_search_cb.ble_raw_used > 0 ) - { + if ( bta_dm_search_cb.ble_raw_used > 0 ) { p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used); memcpy( p_msg->disc_result.result.disc_res.p_raw_data, - bta_dm_search_cb.p_ble_rawdata, - bta_dm_search_cb.ble_raw_used ); + bta_dm_search_cb.p_ble_rawdata, + bta_dm_search_cb.ble_raw_used ); p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used; - } - else - { + } else { p_msg->disc_result.result.disc_res.p_raw_data = NULL; bta_dm_search_cb.p_ble_rawdata = 0; } @@ -5662,11 +5341,10 @@ static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status) bta_sys_sendmsg(p_msg); } - if (conn_id != BTA_GATT_INVALID_CONN_ID) - { + if (conn_id != BTA_GATT_INVALID_CONN_ID) { /* start a GATT channel close delay timer */ bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT, - BTA_DM_GATT_CLOSE_DELAY_TOUT); + BTA_DM_GATT_CLOSE_DELAY_TOUT); bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr); } bta_dm_search_cb.gatt_disc_active = FALSE; @@ -5686,8 +5364,9 @@ void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data) { UNUSED(p_data); - if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) + if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) { BTA_GATTC_Close(bta_dm_search_cb.conn_id); + } memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN); bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; @@ -5708,14 +5387,13 @@ void btm_dm_start_gatt_discovery (BD_ADDR bd_addr) /* connection is already open */ if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 && - bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) - { + bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) { memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN); bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer); btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id); - } - else + } else { BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE, BTA_GATT_TRANSPORT_LE); + } } /******************************************************************************* @@ -5729,8 +5407,7 @@ void btm_dm_start_gatt_discovery (BD_ADDR bd_addr) *******************************************************************************/ static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr) { - if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) - { + if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) { BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE); } @@ -5755,25 +5432,22 @@ void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data) p2 = p_data->remote_bda; APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ", - bta_dm_search_cb.state, - ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]), - ((p1[4])<<8)+ p1[5], - ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]), - ((p2[4])<<8)+ p2[5]); + bta_dm_search_cb.state, + ((p1[0]) << 24) + ((p1[1]) << 16) + ((p1[2]) << 8) + (p1[3]), + ((p1[4]) << 8) + p1[5], + ((p2[0]) << 24) + ((p2[1]) << 16) + ((p2[2]) << 8) + (p2[3]), + ((p2[4]) << 8) + p2[5]); APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" , - p_data->conn_id, - p_data->client_if, - p_data->status); + p_data->conn_id, + p_data->client_if, + p_data->status); bta_dm_search_cb.conn_id = p_data->conn_id; - if (p_data->status == BTA_GATT_OK) - { + if (p_data->status == BTA_GATT_OK) { btm_dm_start_disc_gatt_services(p_data->conn_id); - } - else - { + } else { bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status); } } @@ -5791,42 +5465,42 @@ static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) { APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event); - switch (event) - { - case BTA_GATTC_REG_EVT: - APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if); - if (p_data->reg_oper.status == BTA_GATT_OK) - bta_dm_search_cb.client_if = p_data->reg_oper.client_if; - else - bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF; - break; + switch (event) { + case BTA_GATTC_REG_EVT: + APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if); + if (p_data->reg_oper.status == BTA_GATT_OK) { + bta_dm_search_cb.client_if = p_data->reg_oper.client_if; + } else { + bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF; + } + break; - case BTA_GATTC_OPEN_EVT: - bta_dm_proc_open_evt(&p_data->open); - break; + case BTA_GATTC_OPEN_EVT: + bta_dm_proc_open_evt(&p_data->open); + break; - case BTA_GATTC_SEARCH_RES_EVT: - bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id); - break; + case BTA_GATTC_SEARCH_RES_EVT: + bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id); + break; - case BTA_GATTC_SEARCH_CMPL_EVT: - if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) - bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status); - break; + case BTA_GATTC_SEARCH_CMPL_EVT: + if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) { + bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status); + } + break; - case BTA_GATTC_CLOSE_EVT: - APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason); - /* in case of disconnect before search is completed */ - if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) && - (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) && - !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN)) - { - bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR); - } - break; + case BTA_GATTC_CLOSE_EVT: + APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason); + /* in case of disconnect before search is completed */ + if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) && + (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) && + !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN)) { + bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR); + } + break; - default: - break; + default: + break; } } @@ -5845,14 +5519,12 @@ static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result) { APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result); - if (result == BTM_SUCCESS) - { - if(bta_dm_cb.p_sec_cback) + if (result == BTM_SUCCESS) { + if (bta_dm_cb.p_sec_cback) { bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL); - } - else - { - APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result); + } + } else { + APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __FUNCTION__, result); } } diff --git a/components/bt/bluedroid/bta/dm/bta_dm_api.c b/components/bt/bluedroid/bta/dm/bta_dm_api.c old mode 100755 new mode 100644 index bfae1011d..d21891190 --- a/components/bt/bluedroid/bta/dm/bta_dm_api.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_api.c @@ -36,14 +36,12 @@ ** Constants *****************************************************************************/ -static const tBTA_SYS_REG bta_dm_reg = -{ +static const tBTA_SYS_REG bta_dm_reg = { bta_dm_sm_execute, bta_dm_sm_disable }; -static const tBTA_SYS_REG bta_dm_search_reg = -{ +static const tBTA_SYS_REG bta_dm_search_reg = { bta_dm_search_sm_execute, bta_dm_search_sm_disable }; @@ -65,8 +63,9 @@ tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback) tBTA_DM_API_ENABLE *p_msg; /* Bluetooth disabling is in progress */ - if (bta_dm_cb.disabling) + if (bta_dm_cb.disabling) { return BTA_FAILURE; + } memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); @@ -76,8 +75,7 @@ tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback) /* if UUID list is not provided as static data */ bta_sys_eir_register(bta_dm_eir_update_uuid); - if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL) { p_msg->hdr.event = BTA_DM_API_ENABLE_EVT; p_msg->p_sec_cback = p_cback; bta_sys_sendmsg(p_msg); @@ -102,13 +100,10 @@ tBTA_STATUS BTA_DisableBluetooth(void) BT_HDR *p_msg; - if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_msg->event = BTA_DM_API_DISABLE_EVT; bta_sys_sendmsg(p_msg); - } - else - { + } else { return BTA_FAILURE; } @@ -131,8 +126,7 @@ tBTA_STATUS BTA_EnableTestMode(void) APPL_TRACE_API("BTA_EnableTestMode"); - if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_msg->event = BTA_DM_API_ENABLE_TEST_MODE_EVT; bta_sys_sendmsg(p_msg); return BTA_SUCCESS; @@ -156,8 +150,7 @@ void BTA_DisableTestMode(void) APPL_TRACE_API("BTA_DisableTestMode"); - if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_msg->event = BTA_DM_API_DISABLE_TEST_MODE_EVT; bta_sys_sendmsg(p_msg); } @@ -178,12 +171,11 @@ void BTA_DmSetDeviceName(char *p_name) tBTA_DM_API_SET_NAME *p_msg; - if ((p_msg = (tBTA_DM_API_SET_NAME *) GKI_getbuf(sizeof(tBTA_DM_API_SET_NAME))) != NULL) - { + if ((p_msg = (tBTA_DM_API_SET_NAME *) GKI_getbuf(sizeof(tBTA_DM_API_SET_NAME))) != NULL) { p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT; /* truncate the name if needed */ - BCM_STRNCPY_S((char*)p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN-1); - p_msg->name[BD_NAME_LEN-1]=0; + BCM_STRNCPY_S((char *)p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN - 1); + p_msg->name[BD_NAME_LEN - 1] = 0; bta_sys_sendmsg(p_msg); } @@ -207,8 +199,7 @@ void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode, UINT8 p tBTA_DM_API_SET_VISIBILITY *p_msg; - if ((p_msg = (tBTA_DM_API_SET_VISIBILITY *) GKI_getbuf(sizeof(tBTA_DM_API_SET_VISIBILITY))) != NULL) - { + if ((p_msg = (tBTA_DM_API_SET_VISIBILITY *) GKI_getbuf(sizeof(tBTA_DM_API_SET_VISIBILITY))) != NULL) { p_msg->hdr.event = BTA_DM_API_SET_VISIBILITY_EVT; p_msg->disc_mode = disc_mode; p_msg->conn_mode = conn_mode; @@ -239,8 +230,7 @@ void BTA_DmSearch(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK services, tBTA_DM_SEA tBTA_DM_API_SEARCH *p_msg; - if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(sizeof(tBTA_DM_API_SEARCH))) != NULL) - { + if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(sizeof(tBTA_DM_API_SEARCH))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_SEARCH)); p_msg->hdr.event = BTA_DM_API_SEARCH_EVT; @@ -268,8 +258,7 @@ void BTA_DmSearchCancel(void) { BT_HDR *p_msg; - if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT; bta_sys_sendmsg(p_msg); } @@ -292,8 +281,7 @@ void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services, { tBTA_DM_API_DISCOVER *p_msg; - if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL) - { + if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_DISCOVER)); p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; @@ -318,12 +306,11 @@ void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services, ** *******************************************************************************/ void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID *uuid, - tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) + tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) { tBTA_DM_API_DISCOVER *p_msg; - if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL) - { + if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL) { p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->services = BTA_USER_SERVICE_MASK; //Not exposed at API level @@ -356,8 +343,7 @@ void BTA_DmBond(BD_ADDR bd_addr) tBTA_DM_API_BOND *p_msg; p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND)); - if (p_msg != NULL) - { + if (p_msg != NULL) { p_msg->hdr.event = BTA_DM_API_BOND_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->transport = BTA_TRANSPORT_UNKNOWN; @@ -380,8 +366,7 @@ void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport) { tBTA_DM_API_BOND *p_msg; - if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL) { p_msg->hdr.event = BTA_DM_API_BOND_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->transport = transport; @@ -406,8 +391,7 @@ void BTA_DmBondCancel(BD_ADDR bd_addr) { tBTA_DM_API_BOND_CANCEL *p_msg; - if ((p_msg = (tBTA_DM_API_BOND_CANCEL *) GKI_getbuf(sizeof(tBTA_DM_API_BOND_CANCEL))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BOND_CANCEL *) GKI_getbuf(sizeof(tBTA_DM_API_BOND_CANCEL))) != NULL) { p_msg->hdr.event = BTA_DM_API_BOND_CANCEL_EVT; bdcpy(p_msg->bd_addr, bd_addr); bta_sys_sendmsg(p_msg); @@ -432,13 +416,11 @@ void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin { tBTA_DM_API_PIN_REPLY *p_msg; - if ((p_msg = (tBTA_DM_API_PIN_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PIN_REPLY))) != NULL) - { + if ((p_msg = (tBTA_DM_API_PIN_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PIN_REPLY))) != NULL) { p_msg->hdr.event = BTA_DM_API_PIN_REPLY_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->accept = accept; - if(accept) - { + if (accept) { p_msg->pin_len = pin_len; memcpy(p_msg->p_pin, p_pin, pin_len); } @@ -465,8 +447,7 @@ void BTA_DmLocalOob(void) { tBTA_DM_API_LOC_OOB *p_msg; - if ((p_msg = (tBTA_DM_API_LOC_OOB *) GKI_getbuf(sizeof(tBTA_DM_API_LOC_OOB))) != NULL) - { + if ((p_msg = (tBTA_DM_API_LOC_OOB *) GKI_getbuf(sizeof(tBTA_DM_API_LOC_OOB))) != NULL) { p_msg->hdr.event = BTA_DM_API_LOC_OOB_EVT; bta_sys_sendmsg(p_msg); } @@ -486,8 +467,7 @@ void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept) { tBTA_DM_API_CONFIRM *p_msg; - if ((p_msg = (tBTA_DM_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM))) != NULL) - { + if ((p_msg = (tBTA_DM_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM))) != NULL) { p_msg->hdr.event = BTA_DM_API_CONFIRM_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->accept = accept; @@ -513,8 +493,7 @@ void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key, tBTA_DM_API_ADD_DEVICE *p_msg; - if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_DEVICE)); p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT; @@ -523,16 +502,14 @@ void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key, p_msg->is_trusted = is_trusted; p_msg->io_cap = io_cap; - if (link_key) - { + if (link_key) { p_msg->link_key_known = TRUE; p_msg->key_type = key_type; memcpy(p_msg->link_key, link_key, LINK_KEY_LEN); } /* Load device class if specified */ - if (dev_class) - { + if (dev_class) { p_msg->dc_known = TRUE; memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN); } @@ -561,16 +538,13 @@ tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr) { tBTA_DM_API_REMOVE_DEVICE *p_msg; - if ((p_msg = (tBTA_DM_API_REMOVE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_DEVICE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_REMOVE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_DEVICE))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_REMOVE_DEVICE)); p_msg->hdr.event = BTA_DM_API_REMOVE_DEVICE_EVT; bdcpy(p_msg->bd_addr, bd_addr); bta_sys_sendmsg(p_msg); - } - else - { + } else { return BTA_FAILURE; } @@ -594,18 +568,15 @@ void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services ) { UINT8 xx, yy; UINT8 num_uuid, max_num_uuid = 32; - UINT8 uuid_list[32*LEN_UUID_16]; + UINT8 uuid_list[32 * LEN_UUID_16]; UINT16 *p_uuid16 = (UINT16 *)uuid_list; tBTA_SERVICE_MASK mask; BTM_GetEirUuidList( p_eir, LEN_UUID_16, &num_uuid, uuid_list, max_num_uuid); - for( xx = 0; xx < num_uuid; xx++ ) - { + for ( xx = 0; xx < num_uuid; xx++ ) { mask = 1; - for( yy = 0; yy < BTA_MAX_SERVICE_ID; yy++ ) - { - if( *(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy] ) - { + for ( yy = 0; yy < BTA_MAX_SERVICE_ID; yy++ ) { + if ( *(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy] ) { *p_services |= mask; break; } @@ -613,14 +584,17 @@ void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services ) } /* for HSP v1.2 only device */ - if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS) + if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS) { *p_services |= BTA_HSP_SERVICE_MASK; + } - if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE) + if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE) { *p_services |= BTA_HL_SERVICE_MASK; + } - if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK) + if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK) { *p_services |= BTA_HL_SERVICE_MASK; + } } } @@ -635,7 +609,7 @@ void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services ) *******************************************************************************/ UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr ) { - tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr); + tBTA_DM_PEER_DEVICE *p_dev = bta_dm_find_peer_device(bd_addr); return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED); } @@ -653,16 +627,13 @@ UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr ) ** *******************************************************************************/ tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info, - UINT32 *p_handle ) + UINT32 *p_handle ) { tBTA_STATUS status = BTA_FAILURE; - if(bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) - { - if(SDP_SetLocalDiRecord((tSDP_DI_RECORD *)p_device_info, p_handle) == SDP_SUCCESS) - { - if(!p_device_info->primary_record) - { + if (bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) { + if (SDP_SetLocalDiRecord((tSDP_DI_RECORD *)p_device_info, p_handle) == SDP_SUCCESS) { + if (!p_device_info->primary_record) { bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle; bta_dm_di_cb.di_num ++; } @@ -686,15 +657,14 @@ tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info, ** Returns void ** *******************************************************************************/ -void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param) +void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK *p_callback, void *p_param) { tBTA_DM_API_EXECUTE_CBACK *p_msg; - if ((p_msg = (tBTA_DM_API_EXECUTE_CBACK *) GKI_getbuf(sizeof(tBTA_DM_API_EXECUTE_CBACK))) != NULL) - { + if ((p_msg = (tBTA_DM_API_EXECUTE_CBACK *) GKI_getbuf(sizeof(tBTA_DM_API_EXECUTE_CBACK))) != NULL) { p_msg->hdr.event = BTA_DM_API_EXECUTE_CBACK_EVT; - p_msg->p_param= p_param; - p_msg->p_exec_cback= p_callback; + p_msg->p_param = p_param; + p_msg->p_exec_cback = p_callback; bta_sys_sendmsg(p_msg); } } @@ -721,8 +691,7 @@ void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key, tBTA_LE_KEY_ tBTA_DM_API_ADD_BLEKEY *p_msg; - if ((p_msg = (tBTA_DM_API_ADD_BLEKEY *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLEKEY))) != NULL) - { + if ((p_msg = (tBTA_DM_API_ADD_BLEKEY *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLEKEY))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLEKEY)); p_msg->hdr.event = BTA_DM_API_ADD_BLEKEY_EVT; @@ -756,8 +725,7 @@ void BTA_DmAddBleDevice(BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TY #if BLE_INCLUDED == TRUE tBTA_DM_API_ADD_BLE_DEVICE *p_msg; - if ((p_msg = (tBTA_DM_API_ADD_BLE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLE_DEVICE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_ADD_BLE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLE_DEVICE))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLE_DEVICE)); p_msg->hdr.event = BTA_DM_API_ADD_BLEDEVICE_EVT; @@ -788,16 +756,14 @@ void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, BOOLEAN accept, UINT32 passkey) #if BLE_INCLUDED == TRUE tBTA_DM_API_PASSKEY_REPLY *p_msg; - if ((p_msg = (tBTA_DM_API_PASSKEY_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PASSKEY_REPLY))) != NULL) - { + if ((p_msg = (tBTA_DM_API_PASSKEY_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PASSKEY_REPLY))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_PASSKEY_REPLY)); p_msg->hdr.event = BTA_DM_API_BLE_PASSKEY_REPLY_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->accept = accept; - if(accept) - { + if (accept) { p_msg->passkey = passkey; } bta_sys_sendmsg(p_msg); @@ -820,8 +786,7 @@ void BTA_DmBleConfirmReply(BD_ADDR bd_addr, BOOLEAN accept) { #if BLE_INCLUDED == TRUE tBTA_DM_API_CONFIRM *p_msg = (tBTA_DM_API_CONFIRM *)GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM)); - if (p_msg != NULL) - { + if (p_msg != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_CONFIRM)); p_msg->hdr.event = BTA_DM_API_BLE_CONFIRM_REPLY_EVT; bdcpy(p_msg->bd_addr, bd_addr); @@ -848,8 +813,7 @@ void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res) #if BLE_INCLUDED == TRUE tBTA_DM_API_BLE_SEC_GRANT *p_msg; - if ((p_msg = (tBTA_DM_API_BLE_SEC_GRANT *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SEC_GRANT))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_SEC_GRANT *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SEC_GRANT))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SEC_GRANT)); p_msg->hdr.event = BTA_DM_API_BLE_SEC_GRANT_EVT; @@ -882,14 +846,13 @@ void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res) ** *******************************************************************************/ void BTA_DmSetBlePrefConnParams(BD_ADDR bd_addr, - UINT16 min_conn_int, UINT16 max_conn_int, - UINT16 slave_latency, UINT16 supervision_tout ) + UINT16 min_conn_int, UINT16 max_conn_int, + UINT16 slave_latency, UINT16 supervision_tout ) { #if BLE_INCLUDED == TRUE tBTA_DM_API_BLE_CONN_PARAMS *p_msg; - if ((p_msg = (tBTA_DM_API_BLE_CONN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_CONN_PARAMS))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_CONN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_CONN_PARAMS))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_CONN_PARAMS)); p_msg->hdr.event = BTA_DM_API_BLE_CONN_PARAM_EVT; @@ -922,8 +885,7 @@ void BTA_DmSetBlePrefConnParams(BD_ADDR bd_addr, void BTA_DmSetBleConnScanParams(UINT32 scan_interval, UINT32 scan_window) { tBTA_DM_API_BLE_SCAN_PARAMS *p_msg; - if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS)); p_msg->hdr.event = BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT; p_msg->scan_int = scan_interval; @@ -953,8 +915,7 @@ void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval, { tBTA_DM_API_BLE_SCAN_PARAMS *p_msg; - if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS)); p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT; p_msg->client_if = client_if; @@ -984,24 +945,25 @@ void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval, ** *******************************************************************************/ void BTA_DmSetBleScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, - UINT32 scan_window, tBLE_SCAN_MODE scan_mode, UINT8 scan_fil_poilcy, - UINT8 addr_type_own, tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) + UINT32 scan_window, tBLE_SCAN_MODE scan_mode, UINT8 scan_fil_poilcy, + UINT8 addr_type_own, tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) { - tBTA_DM_API_BLE_SCAN_FILTER_PARAMS *p_msg; + tBTA_DM_API_BLE_SCAN_FILTER_PARAMS *p_msg; + + if ((p_msg = (tBTA_DM_API_BLE_SCAN_FILTER_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_FILTER_PARAMS))) != NULL) { + memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_FILTER_PARAMS)); + p_msg->hdr.event = BTA_DM_API_BLE_SCAN_FIL_PARAM_EVT; + p_msg->client_if = client_if; + p_msg->scan_int = scan_interval; + p_msg->scan_window = scan_window; + p_msg->scan_mode = scan_mode; + p_msg->addr_type_own = addr_type_own; + p_msg->scan_filter_policy = scan_fil_poilcy; + p_msg->scan_param_setup_cback = scan_param_setup_cback; + + bta_sys_sendmsg(p_msg); + } - if ((p_msg = (tBTA_DM_API_BLE_SCAN_FILTER_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_FILTER_PARAMS))) != NULL) - { - memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_FILTER_PARAMS)); - p_msg->hdr.event = BTA_DM_API_BLE_SCAN_FIL_PARAM_EVT; - p_msg->client_if = client_if; - p_msg->scan_int = scan_interval; - p_msg->scan_window = scan_window; - p_msg->scan_mode = scan_mode; - p_msg->addr_type_own = addr_type_own; - p_msg->scan_filter_policy = scan_fil_poilcy; - p_msg->scan_param_setup_cback = scan_param_setup_cback; - } - } @@ -1018,7 +980,7 @@ void BTA_DmSetBleScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, ** *******************************************************************************/ void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max, - tBLE_BD_ADDR *p_dir_bda) + tBLE_BD_ADDR *p_dir_bda) { #if BLE_INCLUDED == TRUE tBTA_DM_API_BLE_ADV_PARAMS *p_msg; @@ -1026,17 +988,15 @@ void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max, APPL_TRACE_API ("BTA_DmSetBleAdvParam: %d, %d\n", adv_int_min, adv_int_max); if ((p_msg = (tBTA_DM_API_BLE_ADV_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_ADV_PARAMS) - + sizeof(tBLE_BD_ADDR))) != NULL) - { - memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_ADV_PARAMS)+sizeof(tBLE_BD_ADDR)); + + sizeof(tBLE_BD_ADDR))) != NULL) { + memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_ADV_PARAMS) + sizeof(tBLE_BD_ADDR)); p_msg->hdr.event = BTA_DM_API_BLE_ADV_PARAM_EVT; p_msg->adv_int_min = adv_int_min; p_msg->adv_int_max = adv_int_max; - if (p_dir_bda != NULL) - { + if (p_dir_bda != NULL) { p_msg->p_dir_bda = (tBLE_BD_ADDR *)(p_msg + 1); memcpy(p_msg->p_dir_bda, p_dir_bda, sizeof(tBLE_BD_ADDR)); } @@ -1047,31 +1007,29 @@ void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max, } void BTA_DmSetBleAdvParamsAll (UINT16 adv_int_min, UINT16 adv_int_max, - UINT8 adv_type, tBLE_ADDR_TYPE addr_type_own, - tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP adv_fil_pol, - tBLE_BD_ADDR *p_dir_bda) + UINT8 adv_type, tBLE_ADDR_TYPE addr_type_own, + tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP adv_fil_pol, + tBLE_BD_ADDR *p_dir_bda) { #if BLE_INCLUDED == TRUE tBTA_DM_API_BLE_ADV_PARAMS_ALL *p_msg; APPL_TRACE_ERROR ("BTA_DmSetBleAdvParamsAll: %d, %d\n", adv_int_min, adv_int_max); - APPL_TRACE_ERROR ("adv_type = %d, addr_type_own = %d, chnl_map = %d, adv_fil_pol = %d\n", - adv_type,addr_type_own,chnl_map,adv_fil_pol); + APPL_TRACE_ERROR ("adv_type = %d, addr_type_own = %d, chnl_map = %d, adv_fil_pol = %d\n", + adv_type, addr_type_own, chnl_map, adv_fil_pol); if ((p_msg = (tBTA_DM_API_BLE_ADV_PARAMS_ALL *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_ADV_PARAMS_ALL) - + sizeof(tBLE_BD_ADDR))) != NULL) - { + + sizeof(tBLE_BD_ADDR))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_ADV_PARAMS_ALL)); p_msg->hdr.event = BTA_DM_API_BLE_ADV_PARAM_All_EVT; p_msg->adv_int_min = adv_int_min; p_msg->adv_int_max = adv_int_max; - p_msg->adv_type = adv_type; - p_msg->addr_type_own = addr_type_own; - p_msg->channel_map = chnl_map; - p_msg->adv_filter_policy = adv_fil_pol; - if (p_dir_bda != NULL) - { + p_msg->adv_type = adv_type; + p_msg->addr_type_own = addr_type_own; + p_msg->channel_map = chnl_map; + p_msg->adv_filter_policy = adv_fil_pol; + if (p_dir_bda != NULL) { p_msg->p_dir_bda = (tBLE_BD_ADDR *)(p_msg + 1); memcpy(p_msg->p_dir_bda, p_dir_bda, sizeof(tBLE_BD_ADDR)); } @@ -1109,8 +1067,7 @@ void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv tBTA_DM_API_SET_ADV_CONFIG *p_msg; if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) - GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_SET_ADV_CONFIG_EVT; p_msg->data_mask = data_mask; p_msg->p_adv_data_cback = p_adv_data_cback; @@ -1137,8 +1094,7 @@ extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA * tBTA_DM_API_SET_ADV_CONFIG *p_msg; if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) - GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT; p_msg->data_mask = data_mask; p_msg->p_adv_data_cback = p_adv_data_cback; @@ -1166,22 +1122,21 @@ extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA * ** *******************************************************************************/ extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max, - UINT8 batch_scan_trunc_max, - UINT8 batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, - tBTA_DM_BLE_REF_VALUE ref_value) + UINT8 batch_scan_trunc_max, + UINT8 batch_scan_notify_threshold, + tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback, + tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, + tBTA_BLE_SCAN_REP_CBACK *p_rep_cback, + tBTA_DM_BLE_REF_VALUE ref_value) { tBTA_DM_API_SET_STORAGE_CONFIG *p_msg; bta_dm_cb.p_setup_cback = p_setup_cback; if ((p_msg = (tBTA_DM_API_SET_STORAGE_CONFIG *) - GKI_getbuf(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_SETUP_STORAGE_EVT; - p_msg->p_setup_cback=bta_ble_scan_setup_cb; - p_msg->p_thres_cback=p_thres_cback; - p_msg->p_read_rep_cback=p_rep_cback; + p_msg->p_setup_cback = bta_ble_scan_setup_cb; + p_msg->p_thres_cback = p_thres_cback; + p_msg->p_read_rep_cback = p_rep_cback; p_msg->ref_value = ref_value; p_msg->batch_scan_full_max = batch_scan_full_max; p_msg->batch_scan_trunc_max = batch_scan_trunc_max; @@ -1207,15 +1162,14 @@ extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max, ** *******************************************************************************/ extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - UINT32 scan_interval, UINT32 scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTA_DM_BLE_REF_VALUE ref_value) + UINT32 scan_interval, UINT32 scan_window, + tBTA_BLE_DISCARD_RULE discard_rule, + tBLE_ADDR_TYPE addr_type, + tBTA_DM_BLE_REF_VALUE ref_value) { tBTA_DM_API_ENABLE_SCAN *p_msg; - if ((p_msg = (tBTA_DM_API_ENABLE_SCAN *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_SCAN))) != NULL) - { + if ((p_msg = (tBTA_DM_API_ENABLE_SCAN *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_SCAN))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT; p_msg->scan_mode = scan_mode; p_msg->scan_int = scan_interval; @@ -1243,8 +1197,7 @@ extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value) tBTA_DM_API_DISABLE_SCAN *p_msg; if ((p_msg = (tBTA_DM_API_DISABLE_SCAN *) - GKI_getbuf(sizeof(tBTA_DM_API_DISABLE_SCAN))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_DISABLE_SCAN))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT; p_msg->ref_value = ref_value; bta_sys_sendmsg(p_msg); @@ -1264,13 +1217,12 @@ extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value) ** *******************************************************************************/ extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTA_DM_BLE_REF_VALUE ref_value) + tBTA_DM_BLE_REF_VALUE ref_value) { tBTA_DM_API_READ_SCAN_REPORTS *p_msg; if ((p_msg = (tBTA_DM_API_READ_SCAN_REPORTS *) - GKI_getbuf(sizeof(tBTA_DM_API_READ_SCAN_REPORTS))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_READ_SCAN_REPORTS))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT; p_msg->scan_type = scan_type; p_msg->ref_value = ref_value; @@ -1291,13 +1243,12 @@ extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, ** *******************************************************************************/ extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value, - tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback) + tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback) { tBTA_DM_API_TRACK_ADVERTISER *p_msg; if ((p_msg = (tBTA_DM_API_TRACK_ADVERTISER *) - GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL) - { + GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL) { p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT; p_msg->p_track_adv_cback = p_track_adv_cback; p_msg->ref_value = ref_value; @@ -1329,8 +1280,7 @@ extern void BTA_DmBleBroadcast (BOOLEAN start) APPL_TRACE_API("BTA_DmBleBroadcast: start = %d \n", start); - if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_OBSERVE)); p_msg->hdr.event = BTA_DM_API_BLE_BROADCAST_EVT; @@ -1360,8 +1310,7 @@ void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_ #if BLE_INCLUDED == TRUE tBTA_DM_API_BLE_SET_BG_CONN_TYPE *p_msg; - if ((p_msg = (tBTA_DM_API_BLE_SET_BG_CONN_TYPE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_SET_BG_CONN_TYPE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE)); p_msg->hdr.event = BTA_DM_API_BLE_SET_BG_CONN_TYPE; @@ -1384,16 +1333,15 @@ void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_ *******************************************************************************/ #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, - tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, - tBTA_TRANSPORT transport) + tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, + tBTA_TRANSPORT transport) { tBTA_DM_API_DISCOVER *p_msg; UINT16 len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + sizeof(tBT_UUID) * p_services->num_uuid) : - sizeof(tBTA_DM_API_DISCOVER); + sizeof(tBTA_DM_API_DISCOVER); - if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL) { memset(p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; @@ -1402,13 +1350,11 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s p_msg->sdp_search = sdp_search; p_msg->transport = transport; - if (p_services != NULL) - { + if (p_services != NULL) { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE p_msg->services = p_services->srvc_mask; p_msg->num_uuid = p_services->num_uuid; - if (p_services->num_uuid != 0) - { + if (p_services->num_uuid != 0) { p_msg->p_uuid = (tBT_UUID *)(p_msg + 1); memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid); } @@ -1436,8 +1382,8 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s ** *******************************************************************************/ void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, - tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, - tBTA_TRANSPORT transport) + tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, + tBTA_TRANSPORT transport) { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport); @@ -1461,7 +1407,7 @@ void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_service ** *******************************************************************************/ void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, - tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) + tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) { #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN); @@ -1493,10 +1439,9 @@ void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, t #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE tBTA_DM_API_SEARCH *p_msg; UINT16 len = p_services ? (sizeof(tBTA_DM_API_SEARCH) + sizeof(tBT_UUID) * p_services->num_uuid) : - sizeof(tBTA_DM_API_SEARCH); + sizeof(tBTA_DM_API_SEARCH); - if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(len)) != NULL) { memset(p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_SEARCH_EVT; @@ -1505,18 +1450,16 @@ void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, t p_msg->rs_res = BTA_DM_RS_NONE; - if (p_services != NULL) - { + if (p_services != NULL) { p_msg->services = p_services->srvc_mask; p_msg->num_uuid = p_services->num_uuid; - if (p_services->num_uuid != 0) - { + if (p_services->num_uuid != 0) { p_msg->p_uuid = (tBT_UUID *)(p_msg + 1); memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid); - } - else + } else { p_msg->p_uuid = NULL; + } } bta_sys_sendmsg(p_msg); @@ -1550,8 +1493,7 @@ void BTA_DmBleUpdateConnectionParam(BD_ADDR bd_addr, UINT16 min_int, tBTA_DM_API_UPDATE_CONN_PARAM *p_msg; p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); - if (p_msg != NULL) - { + if (p_msg != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT; @@ -1577,12 +1519,12 @@ void BTA_DmBleUpdateConnectionParam(BD_ADDR bd_addr, UINT16 min_int, ** *******************************************************************************/ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable) -{ ///This function used the irk to generate the resolve address +{ + ///This function used the irk to generate the resolve address #if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE tBTA_DM_API_LOCAL_PRIVACY *p_msg; - if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL) - { + if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_LOCAL_PRIVACY)); p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT; @@ -1611,22 +1553,21 @@ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable) ** *******************************************************************************/ void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params, - tBTA_BLE_MULTI_ADV_CBACK *p_cback, - void *p_ref) -{ ///This function just used for vendor debug + tBTA_BLE_MULTI_ADV_CBACK *p_cback, + void *p_ref) +{ + ///This function just used for vendor debug tBTA_DM_API_BLE_MULTI_ADV_ENB *p_msg; UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB); APPL_TRACE_API ("BTA_BleEnableAdvInstance"); - if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_ENB *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_ENB *) GKI_getbuf(len)) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB)); p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_ENB_EVT; p_msg->p_cback = (void *)p_cback; - if (p_params != NULL) - { + if (p_params != NULL) { p_msg->p_params = (void *)(p_msg + 1); memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS)); } @@ -1651,20 +1592,19 @@ void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params, *******************************************************************************/ void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params) { - ///This function just used for vendor debug + ///This function just used for vendor debug tBTA_DM_API_BLE_MULTI_ADV_PARAM *p_msg; UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM); APPL_TRACE_API ("BTA_BleUpdateAdvInstParam"); - if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL) - { - memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM)); - p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT; - p_msg->inst_id = inst_id; - p_msg->p_params = (void *)(p_msg + 1); - memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS)); + if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL) { + memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM)); + p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT; + p_msg->inst_id = inst_id; + p_msg->p_params = (void *)(p_msg + 1); + memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS)); - bta_sys_sendmsg(p_msg); + bta_sys_sendmsg(p_msg); } } @@ -1688,22 +1628,22 @@ void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params) void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data) -{ ///This function just used for vendor debug +{ + ///This function just used for vendor debug tBTA_DM_API_BLE_MULTI_ADV_DATA *p_msg; UINT16 len = sizeof(tBTA_DM_API_BLE_MULTI_ADV_DATA) ; APPL_TRACE_API ("BTA_BleCfgAdvInstData"); - if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL) - { - memset(p_msg, 0, len); - p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT; - p_msg->inst_id = inst_id; - p_msg->is_scan_rsp = is_scan_rsp; - p_msg->data_mask = data_mask; - p_msg->p_data = p_data; + if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL) { + memset(p_msg, 0, len); + p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT; + p_msg->inst_id = inst_id; + p_msg->is_scan_rsp = is_scan_rsp; + p_msg->data_mask = data_mask; + p_msg->p_data = p_data; - bta_sys_sendmsg(p_msg); + bta_sys_sendmsg(p_msg); } } @@ -1718,18 +1658,17 @@ void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, ** Returns BTA_SUCCESS if command started sucessfully; otherwise failure. ** *******************************************************************************/ -void BTA_BleDisableAdvInstance (UINT8 inst_id) //this function just used for vendor debug +void BTA_BleDisableAdvInstance (UINT8 inst_id) //this function just used for vendor debug { tBTA_DM_API_BLE_MULTI_ADV_DISABLE *p_msg; APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id); if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *) - GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL) - { - memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE)); - p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT; - p_msg->inst_id = inst_id; - bta_sys_sendmsg(p_msg); + GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL) { + memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE)); + p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT; + p_msg->inst_id = inst_id; + bta_sys_sendmsg(p_msg); } } @@ -1765,34 +1704,31 @@ void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, sizeof(tBTA_DM_BLE_PF_COND_PARAM); UINT8 *p; - if (NULL != p_cond) - { - switch(cond_type) - { - case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: - case BTA_DM_BLE_PF_MANU_DATA: - /* Length of pattern and pattern mask and other elements in */ - /* tBTA_DM_BLE_PF_MANU_COND */ - len += ((p_cond->manu_data.data_len) * 2) + - sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8); - break; + if (NULL != p_cond) { + switch (cond_type) { + case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: + case BTA_DM_BLE_PF_MANU_DATA: + /* Length of pattern and pattern mask and other elements in */ + /* tBTA_DM_BLE_PF_MANU_COND */ + len += ((p_cond->manu_data.data_len) * 2) + + sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8); + break; - case BTA_DM_BLE_PF_LOCAL_NAME: - len += ((p_cond->local_name.data_len) + sizeof(UINT8)); - break; + case BTA_DM_BLE_PF_LOCAL_NAME: + len += ((p_cond->local_name.data_len) + sizeof(UINT8)); + break; - case BTM_BLE_PF_SRVC_UUID: - case BTM_BLE_PF_SRVC_SOL_UUID: - len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK); - break; + case BTM_BLE_PF_SRVC_UUID: + case BTM_BLE_PF_SRVC_SOL_UUID: + len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK); + break; - default: - break; + default: + break; } } - if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL) { memset (p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_CFG_FILTER_COND_EVT; @@ -1801,59 +1737,49 @@ void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, p_msg->filt_index = filt_index; p_msg->p_filt_cfg_cback = p_cmpl_cback; p_msg->ref_value = ref_value; - if (p_cond) - { + if (p_cond) { p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1); memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM)); p = (UINT8 *)(p_msg->p_cond_param + 1); if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN || - cond_type == BTA_DM_BLE_PF_MANU_DATA) - { + cond_type == BTA_DM_BLE_PF_MANU_DATA) { p_msg->p_cond_param->manu_data.p_pattern = p; p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len; memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern, - p_cond->manu_data.data_len); + p_cond->manu_data.data_len); p += p_cond->manu_data.data_len; - if (cond_type == BTA_DM_BLE_PF_MANU_DATA) - { + if (cond_type == BTA_DM_BLE_PF_MANU_DATA) { p_msg->p_cond_param->manu_data.company_id_mask = p_cond->manu_data.company_id_mask; - if ( p_cond->manu_data.p_pattern_mask != NULL) - { + if ( p_cond->manu_data.p_pattern_mask != NULL) { p_msg->p_cond_param->manu_data.p_pattern_mask = p; memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask, - p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len); + p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len); } } - } - else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME) - { + } else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME) { p_msg->p_cond_param->local_name.p_data = p; p_msg->p_cond_param->local_name.data_len = p_cond->local_name.data_len; memcpy(p_msg->p_cond_param->local_name.p_data, - p_cond->local_name.p_data, p_cond->local_name.data_len); - } - else if ((cond_type == BTM_BLE_PF_SRVC_UUID - || cond_type == BTM_BLE_PF_SRVC_SOL_UUID)) - { - if (p_cond->srvc_uuid.p_target_addr != NULL) - { + p_cond->local_name.p_data, p_cond->local_name.data_len); + } else if ((cond_type == BTM_BLE_PF_SRVC_UUID + || cond_type == BTM_BLE_PF_SRVC_SOL_UUID)) { + if (p_cond->srvc_uuid.p_target_addr != NULL) { p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p); p_msg->p_cond_param->srvc_uuid.p_target_addr->type = p_cond->srvc_uuid.p_target_addr->type; memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda, - p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN); - p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1); + p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN); + p = (UINT8 *)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1); } - if (p_cond->srvc_uuid.p_uuid_mask) - { + if (p_cond->srvc_uuid.p_uuid_mask) { p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p; memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask, - p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK)); + p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK)); } } } @@ -1887,10 +1813,10 @@ void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ void BTA_DmBleScanFilterSetup(UINT8 action, tBTA_DM_BLE_PF_FILT_INDEX filt_index, - tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params, - tBLE_BD_ADDR *p_target, - tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback, - tBTA_DM_BLE_REF_VALUE ref_value) + tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params, + tBLE_BD_ADDR *p_target, + tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback, + tBTA_DM_BLE_REF_VALUE ref_value) { #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *p_msg; @@ -1898,20 +1824,19 @@ void BTA_DmBleScanFilterSetup(UINT8 action, tBTA_DM_BLE_PF_FILT_INDEX filt_index UINT16 len = sizeof(tBTA_DM_API_SCAN_FILTER_PARAM_SETUP) + sizeof(tBLE_BD_ADDR); - if ((p_msg = (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *) GKI_getbuf(len)) != NULL) { memset (p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_SETUP_EVT; p_msg->action = action; p_msg->filt_index = filt_index; - if (p_filt_params) + if (p_filt_params) { memcpy(&p_msg->filt_params, p_filt_params, sizeof(tBTA_DM_BLE_PF_FILT_PARAMS)); + } p_msg->p_filt_param_cback = p_cmpl_cback; p_msg->ref_value = ref_value; - if (p_target) - { + if (p_target) { p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1); memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR)); } @@ -1946,8 +1871,7 @@ void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback) UINT16 len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR); - if ((p_msg = (tBTA_DM_API_ENERGY_INFO *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_ENERGY_INFO *) GKI_getbuf(len)) != NULL) { memset (p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_BLE_ENERGY_INFO_EVT; p_msg->p_energy_info_cback = p_cmpl_cback; @@ -1969,7 +1893,7 @@ void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback) ** *******************************************************************************/ void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback, - tBTA_DM_BLE_REF_VALUE ref_value) + tBTA_DM_BLE_REF_VALUE ref_value) { #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg; @@ -1977,8 +1901,7 @@ void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cb UINT16 len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR); - if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL) - { + if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL) { memset (p_msg, 0, len); p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_ENABLE_EVT; @@ -2011,12 +1934,11 @@ void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cb ** *******************************************************************************/ void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, UINT16 max_int, - UINT16 latency, UINT16 timeout) + UINT16 latency, UINT16 timeout) { tBTA_DM_API_UPDATE_CONN_PARAM *p_msg; - if ((p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM))) != NULL) - { + if ((p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM))) != NULL) { memset (p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT; @@ -2045,8 +1967,7 @@ void BTA_DmBleSetDataLength(BD_ADDR remote_device, UINT16 tx_data_length) tBTA_DM_API_BLE_SET_DATA_LENGTH *p_msg; if ((p_msg = (tBTA_DM_API_BLE_SET_DATA_LENGTH *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SET_DATA_LENGTH))) - != NULL) - { + != NULL) { bdcpy(p_msg->remote_bda, remote_device); p_msg->hdr.event = BTA_DM_API_SET_DATA_LENGTH_EVT; p_msg->tx_data_length = tx_data_length; @@ -2080,13 +2001,12 @@ void BTA_DmBleSetDataLength(BD_ADDR remote_device, UINT16 tx_data_length) ** *******************************************************************************/ void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK *p_callback, - tBTA_DM_BLE_SEC_ACT sec_act) + tBTA_DM_BLE_SEC_ACT sec_act) { tBTA_DM_API_SET_ENCRYPTION *p_msg; APPL_TRACE_API("BTA_DmSetEncryption"); //todo - if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL) - { + if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_SET_ENCRYPTION)); p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT; @@ -2119,8 +2039,7 @@ void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transpor APPL_TRACE_API("BTA_DmCloseACL"); - if ((p_msg = (tBTA_DM_API_REMOVE_ACL *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_ACL))) != NULL) - { + if ((p_msg = (tBTA_DM_API_REMOVE_ACL *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_ACL))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_REMOVE_ACL)); p_msg->hdr.event = BTA_DM_API_REMOVE_ACL_EVT; @@ -2156,8 +2075,7 @@ extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration, APPL_TRACE_API("BTA_DmBleObserve:start = %d ", start); - if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL) - { + if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_OBSERVE)); p_msg->hdr.event = BTA_DM_API_BLE_OBSERVE_EVT; @@ -2176,19 +2094,18 @@ extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration, ** Description This function set the random address for the APP ** ** Parameters void -** +** ** Returns void ** ** *******************************************************************************/ extern void BTA_DmBleStopAdvertising(void) { - BT_HDR *p_msg; + BT_HDR *p_msg; APPL_TRACE_API("BTA_DmBleStopAdvertising\n"); - if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { memset(p_msg, 0, sizeof(BT_HDR)); p_msg->event = BTA_DM_API_BLE_STOP_ADV_EVT; bta_sys_sendmsg(p_msg); @@ -2203,22 +2120,21 @@ extern void BTA_DmBleStopAdvertising(void) ** Description This function set the random address for the APP ** ** Parameters rand_addr: the random address whith should be setting -** +** ** Returns void ** ** *******************************************************************************/ extern void BTA_DmSetRandAddress(BD_ADDR rand_addr) { - tBTA_DM_APT_SET_DEV_ADDR *p_msg; - APPL_TRACE_API("set the random address "); - if ((p_msg = (tBTA_DM_APT_SET_DEV_ADDR *) GKI_getbuf(sizeof(tBTA_DM_APT_SET_DEV_ADDR))) != NULL) - { + tBTA_DM_APT_SET_DEV_ADDR *p_msg; + APPL_TRACE_API("set the random address "); + if ((p_msg = (tBTA_DM_APT_SET_DEV_ADDR *) GKI_getbuf(sizeof(tBTA_DM_APT_SET_DEV_ADDR))) != NULL) { memset(p_msg, 0, sizeof(tBTA_DM_APT_SET_DEV_ADDR)); - memcpy(p_msg->address,rand_addr,BD_ADDR_LEN); + memcpy(p_msg->address, rand_addr, BD_ADDR_LEN); p_msg->hdr.event = BTA_DM_API_SET_RAND_ADDR_EVT; - p_msg->addr_type = BLE_ADDR_RANDOM; - //start sent the msg to the bta system control moudle + p_msg->addr_type = BLE_ADDR_RANDOM; + //start sent the msg to the bta system control moudle bta_sys_sendmsg(p_msg); } } @@ -2252,20 +2168,21 @@ void BTA_VendorCleanup (void) BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); #if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE) - if (cmn_ble_vsc_cb.max_filter > 0) - { + if (cmn_ble_vsc_cb.max_filter > 0) { btm_ble_adv_filter_cleanup(); #if BLE_PRIVACY_SPT == TRUE btm_ble_resolving_list_cleanup (); #endif } - if (cmn_ble_vsc_cb.tot_scan_results_strg > 0) + if (cmn_ble_vsc_cb.tot_scan_results_strg > 0) { btm_ble_batchscan_cleanup(); + } #endif - if(cmn_ble_vsc_cb.adv_inst_max > 0) - btm_ble_multi_adv_cleanup(); + if (cmn_ble_vsc_cb.adv_inst_max > 0) { + btm_ble_multi_adv_cleanup(); + } } #endif diff --git a/components/bt/bluedroid/bta/dm/bta_dm_cfg.c b/components/bt/bluedroid/bta/dm/bta_dm_cfg.c old mode 100755 new mode 100644 index f0895185d..92274247c --- a/components/bt/bluedroid/bta/dm/bta_dm_cfg.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_cfg.c @@ -57,8 +57,7 @@ #endif -const tBTA_DM_CFG bta_dm_cfg = -{ +const tBTA_DM_CFG bta_dm_cfg = { /* mobile phone COD */ BTA_DM_COD, /* link policy settings */ @@ -101,8 +100,7 @@ const tBTA_DM_CFG bta_dm_cfg = /* First element is always for SYS: app_id = # of entries table, cfg is device scatternet support */ -const tBTA_DM_RM bta_dm_rm_cfg[] = -{ +const tBTA_DM_RM bta_dm_rm_cfg[] = { {BTA_ID_SYS, BTA_DM_NUM_RM_ENTRY, BTA_DM_SCATTERNET}, {BTA_ID_PAN, BTUI_PAN_ID_NAP, BTA_ANY_ROLE}, {BTA_ID_PAN, BTUI_PAN_ID_GN, BTA_ANY_ROLE}, @@ -113,9 +111,9 @@ const tBTA_DM_RM bta_dm_rm_cfg[] = }; -tBTA_DM_CFG *p_bta_dm_cfg = (tBTA_DM_CFG *)&bta_dm_cfg; +tBTA_DM_CFG *p_bta_dm_cfg = (tBTA_DM_CFG *) &bta_dm_cfg; -tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg; +tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *) &bta_dm_rm_cfg; #if BLE_INCLUDED == TRUE # define BTA_DM_NUM_PM_ENTRY 21 /* number of entries in bta_dm_pm_cfg except the first */ @@ -125,340 +123,338 @@ tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg; # define BTA_DM_NUM_PM_SPEC 13 /* number of entries in bta_dm_pm_spec */ #endif -tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] = -{ - {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0}, /* reserved: specifies length of this table. */ - {BTA_ID_AG, BTA_ALL_APP_ID, 0}, /* ag uses first spec table for app id 0 */ - {BTA_ID_CT, 1, 1}, /* ct (BTA_ID_CT,APP ID=1) spec table */ - {BTA_ID_CG, BTA_ALL_APP_ID, 1}, /* cg resue ct spec table */ - {BTA_ID_DG, BTA_ALL_APP_ID, 2}, /* dg spec table */ - {BTA_ID_AV, BTA_ALL_APP_ID, 4}, /* av spec table */ - {BTA_ID_AVK, BTA_ALL_APP_ID, 12}, /* avk spec table */ - {BTA_ID_FTC, BTA_ALL_APP_ID, 6}, /* ftc spec table */ - {BTA_ID_FTS, BTA_ALL_APP_ID, 7}, /* fts spec table */ - {BTA_ID_HD, BTA_ALL_APP_ID, 3}, /* hd spec table */ - {BTA_ID_HH, BTA_ALL_APP_ID, 5}, /* hh spec table */ - {BTA_ID_PBC, BTA_ALL_APP_ID, 2}, /* reuse dg spec table */ - {BTA_ID_PBS, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ - {BTA_ID_OPC, BTA_ALL_APP_ID, 6}, /* reuse ftc spec table */ - {BTA_ID_OPS, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ - {BTA_ID_MSE, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ - // {BTA_ID_JV, BTA_JV_PM_ID_1, 6}, /* app BTA_JV_PM_ID_1, reuse ftc spec table */ - // {BTA_ID_JV, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ - {BTA_ID_HL, BTA_ALL_APP_ID, 8}, /* reuse fts spec table */ - {BTA_ID_PAN, BTUI_PAN_ID_PANU, 9}, /* PANU spec table */ - {BTA_ID_PAN, BTUI_PAN_ID_NAP, 10}, /* NAP spec table */ - {BTA_ID_HS, BTA_ALL_APP_ID, 11} /* HS spec table */ +tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] = { + {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0}, /* reserved: specifies length of this table. */ + {BTA_ID_AG, BTA_ALL_APP_ID, 0}, /* ag uses first spec table for app id 0 */ + {BTA_ID_CT, 1, 1}, /* ct (BTA_ID_CT,APP ID=1) spec table */ + {BTA_ID_CG, BTA_ALL_APP_ID, 1}, /* cg resue ct spec table */ + {BTA_ID_DG, BTA_ALL_APP_ID, 2}, /* dg spec table */ + {BTA_ID_AV, BTA_ALL_APP_ID, 4}, /* av spec table */ + {BTA_ID_AVK, BTA_ALL_APP_ID, 12}, /* avk spec table */ + {BTA_ID_FTC, BTA_ALL_APP_ID, 6}, /* ftc spec table */ + {BTA_ID_FTS, BTA_ALL_APP_ID, 7}, /* fts spec table */ + {BTA_ID_HD, BTA_ALL_APP_ID, 3}, /* hd spec table */ + {BTA_ID_HH, BTA_ALL_APP_ID, 5}, /* hh spec table */ + {BTA_ID_PBC, BTA_ALL_APP_ID, 2}, /* reuse dg spec table */ + {BTA_ID_PBS, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ + {BTA_ID_OPC, BTA_ALL_APP_ID, 6}, /* reuse ftc spec table */ + {BTA_ID_OPS, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ + {BTA_ID_MSE, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ + // {BTA_ID_JV, BTA_JV_PM_ID_1, 6}, /* app BTA_JV_PM_ID_1, reuse ftc spec table */ + // {BTA_ID_JV, BTA_ALL_APP_ID, 7}, /* reuse fts spec table */ + {BTA_ID_HL, BTA_ALL_APP_ID, 8}, /* reuse fts spec table */ + {BTA_ID_PAN, BTUI_PAN_ID_PANU, 9}, /* PANU spec table */ + {BTA_ID_PAN, BTUI_PAN_ID_NAP, 10}, /* NAP spec table */ + {BTA_ID_HS, BTA_ALL_APP_ID, 11} /* HS spec table */ #if BLE_INCLUDED == TRUE - ,{BTA_ID_GATTC, BTA_ALL_APP_ID, 13} /* gattc spec table */ - ,{BTA_ID_GATTS, BTA_ALL_APP_ID, 14} /* gatts spec table */ + , {BTA_ID_GATTC, BTA_ALL_APP_ID, 13} /* gattc spec table */ + , {BTA_ID_GATTS, BTA_ALL_APP_ID, 14} /* gatts spec table */ #endif }; -tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = -{ - /* AG : 0 */ - { - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ +tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = { + /* AG : 0 */ + { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_SNIFF_SCO_OPEN_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_RETRY, 7000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_SNIFF_SCO_OPEN_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_RETRY, 7000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* CT, CG : 1 */ - { - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + /* CT, CG : 1 */ + { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_PARK, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open park */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */ - {{BTA_DM_PM_PARK, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close park */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_PARK, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open park */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */ + {{BTA_DM_PM_PARK, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close park */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* DG, PBC : 2 */ - { - (BTA_DM_PM_ACTIVE), /* no power saving mode allowed */ + /* DG, PBC : 2 */ + { + (BTA_DM_PM_ACTIVE), /* no power saving mode allowed */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF, 1000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF, 1000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* HD : 3 */ - { - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + /* HD : 3 */ + { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR3), /* the SSR entry */ + (BTA_DM_PM_SSR3), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* AV : 4 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* AV : 4 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* HH : 5 */ - { - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + /* HH : 5 */ + { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR1), /* the SSR entry */ + (BTA_DM_PM_SSR1), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_HH_OPEN_IDX, BTA_DM_PM_HH_OPEN_DELAY},{BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close, used for HH suspend */ - {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF_HH_OPEN_IDX, BTA_DM_PM_HH_OPEN_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close, used for HH suspend */ + {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* FTC, OPC, JV : 6 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* FTC, OPC, JV : 6 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* FTS, PBS, OPS, MSE, BTA_JV_PM_ID_1 : 7 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* FTS, PBS, OPS, MSE, BTA_JV_PM_ID_1 : 7 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* HL : 8 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* HL : 8 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* PANU : 9 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* PANU : 9 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* NAP : 10 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* NAP : 10 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + { + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* HS : 11 */ - { - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + /* HS : 11 */ + { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_SNIFF3, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ - {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ - {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_RETRY, 7000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - }, + { + {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_SNIFF3, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */ + {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff */ + {{BTA_DM_PM_SNIFF, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_RETRY, 7000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, - /* AVK : 12 */ - { - (BTA_DM_PM_SNIFF), /* allow sniff */ + /* AVK : 12 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF4, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - } + { + {{BTA_DM_PM_SNIFF, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF4, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + } #if BLE_INCLUDED == TRUE /* GATTC : 13 */ - ,{ - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + , { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + { + {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ #if defined(AMP_INCLUDED) && (AMP_INCLUDED == TRUE) - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* amp */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* amp */ #endif - {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - } + {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + } /* GATTS : 14 */ - ,{ - (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ + , { + (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */ #if (BTM_SSR_INCLUDED == TRUE) - (BTA_DM_PM_SSR2), /* the SSR entry */ + (BTA_DM_PM_SSR2), /* the SSR entry */ #endif - { - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + { + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ #if defined(AMP_INCLUDED) && (AMP_INCLUDED == TRUE) - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* amp */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* amp */ #endif - {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ - } - } + {{BTA_DM_PM_RETRY, 5000}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + } #endif #ifdef BTE_SIM_APP /* For Insight builds only */ - /* Entries at the end of the pm_spec table are user-defined (runtime configurable), - for power consumption experiments. - Insight finds the first user-defined entry by looking for the first BTA_DM_PM_NO_PREF. - The number of user_defined specs is defined by BTA_SWRAP_UD_PM_SPEC_COUNT */ - , - {BTA_DM_PM_NO_PREF}, /* pm_spec USER_DEFINED_0 */ - {BTA_DM_PM_NO_PREF} /* pm_spec USER_DEFINED_1 */ + /* Entries at the end of the pm_spec table are user-defined (runtime configurable), + for power consumption experiments. + Insight finds the first user-defined entry by looking for the first BTA_DM_PM_NO_PREF. + The number of user_defined specs is defined by BTA_SWRAP_UD_PM_SPEC_COUNT */ + , + {BTA_DM_PM_NO_PREF}, /* pm_spec USER_DEFINED_0 */ + {BTA_DM_PM_NO_PREF} /* pm_spec USER_DEFINED_1 */ #endif /* BTE_SIM_APP */ }; @@ -476,38 +472,37 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = * If there is a conflict among the connected services the setting with the lowest latency will * be selected. */ -tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] = -{ -/* - * More sniff parameter entries can be added for - * BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed. When entries are added or - * removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index - * BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the - * bdroid_buildcfg.h settings. - * The SNIFF table entries must be in the order from highest latency (biggest - * interval) to lowest latency. If there's a conflict among the connected - * services, the setting with lowest latency wins. - */ -/* sniff modes: max interval, min interval, attempt, timeout */ - {BTA_DM_PM_SNIFF_MAX, BTA_DM_PM_SNIFF_MIN, BTA_DM_PM_SNIFF_ATTEMPT, BTA_DM_PM_SNIFF_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF - A2DP */ - {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF1 */ - {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF2- HD idle */ - {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF3- SCO open */ - {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF4- HD active */ - {BTA_DM_PM_SNIFF5_MAX, BTA_DM_PM_SNIFF5_MIN, BTA_DM_PM_SNIFF5_ATTEMPT, BTA_DM_PM_SNIFF5_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF5- HD active */ - {BTA_DM_PM_PARK_MAX, BTA_DM_PM_PARK_MIN, BTA_DM_PM_PARK_ATTEMPT, BTA_DM_PM_PARK_TIMEOUT, BTM_PM_MD_PARK} +tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] = { + /* + * More sniff parameter entries can be added for + * BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed. When entries are added or + * removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index + * BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the + * bdroid_buildcfg.h settings. + * The SNIFF table entries must be in the order from highest latency (biggest + * interval) to lowest latency. If there's a conflict among the connected + * services, the setting with lowest latency wins. + */ + /* sniff modes: max interval, min interval, attempt, timeout */ + {BTA_DM_PM_SNIFF_MAX, BTA_DM_PM_SNIFF_MIN, BTA_DM_PM_SNIFF_ATTEMPT, BTA_DM_PM_SNIFF_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF - A2DP */ + {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF1 */ + {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF2- HD idle */ + {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF3- SCO open */ + {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF4- HD active */ + {BTA_DM_PM_SNIFF5_MAX, BTA_DM_PM_SNIFF5_MIN, BTA_DM_PM_SNIFF5_ATTEMPT, BTA_DM_PM_SNIFF5_TIMEOUT, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF5- HD active */ + {BTA_DM_PM_PARK_MAX, BTA_DM_PM_PARK_MIN, BTA_DM_PM_PARK_ATTEMPT, BTA_DM_PM_PARK_TIMEOUT, BTM_PM_MD_PARK} #ifdef BTE_SIM_APP /* For Insight builds only */ - /* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable), - for power consumption experiments. - Insight finds the first user-defined entry by looking for the first 'max=0'. - The number of user_defined specs is defined by BTA_SWRAP_UD_PM_DM_COUNT */ - , - {0}, /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_0 */ - {0}, /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_0 */ + /* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable), + for power consumption experiments. + Insight finds the first user-defined entry by looking for the first 'max=0'. + The number of user_defined specs is defined by BTA_SWRAP_UD_PM_DM_COUNT */ + , + {0}, /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_0 */ + {0}, /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_0 */ - {0}, /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_1 */ - {0} /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_1 */ + {0}, /* CONN_OPEN/SCO_CLOSE power mode settings for pm_spec USER_DEFINED_1 */ + {0} /* SCO_OPEN power mode settings for pm_spec USER_DEFINED_1 */ #endif /* BTE_SIM_APP */ }; @@ -515,8 +510,7 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] = /* the smaller of the SSR max latency wins. * the entries in this table must be from highest latency (biggest interval) to lowest latency */ #if (BTM_SSR_INCLUDED == TRUE) -tBTA_DM_SSR_SPEC bta_dm_ssr_spec[] = -{ +tBTA_DM_SSR_SPEC bta_dm_ssr_spec[] = { /*max_lat, min_rmt_to, min_loc_to*/ {0, 0, 0}, /* BTA_DM_PM_SSR0 - do not use SSR */ {0, 0, 2}, /* BTA_DM_PM_SSR1 - HH, can NOT share entry with any other profile, @@ -526,12 +520,12 @@ tBTA_DM_SSR_SPEC bta_dm_ssr_spec[] = {360, 160, 2} /* BTA_DM_PM_SSR3 - HD */ }; -tBTA_DM_SSR_SPEC *p_bta_dm_ssr_spec = (tBTA_DM_SSR_SPEC *)&bta_dm_ssr_spec; +tBTA_DM_SSR_SPEC *p_bta_dm_ssr_spec = (tBTA_DM_SSR_SPEC *) &bta_dm_ssr_spec; #endif -tBTA_DM_PM_CFG *p_bta_dm_pm_cfg = (tBTA_DM_PM_CFG *)&bta_dm_pm_cfg; -tBTA_DM_PM_SPEC *p_bta_dm_pm_spec = (tBTA_DM_PM_SPEC *)&bta_dm_pm_spec; -tBTM_PM_PWR_MD *p_bta_dm_pm_md = (tBTM_PM_PWR_MD *)&bta_dm_pm_md; +tBTA_DM_PM_CFG *p_bta_dm_pm_cfg = (tBTA_DM_PM_CFG *) &bta_dm_pm_cfg; +tBTA_DM_PM_SPEC *p_bta_dm_pm_spec = (tBTA_DM_PM_SPEC *) &bta_dm_pm_spec; +tBTM_PM_PWR_MD *p_bta_dm_pm_md = (tBTM_PM_PWR_MD *) &bta_dm_pm_md; /* The performance impact of EIR packet size ** @@ -552,20 +546,19 @@ tBTM_PM_PWR_MD *p_bta_dm_pm_md = (tBTM_PM_PWR_MD *)&bta_dm_pm_md; */ #if (BTA_EIR_CANNED_UUID_LIST == TRUE) - /* for example */ +/* for example */ const UINT8 bta_dm_eir_uuid16_list[] = { 0x08, 0x11, /* Headset */ 0x1E, 0x11, /* Handsfree */ 0x0E, 0x11, /* AV Remote Control */ 0x0B, 0x11, /* Audio Sink */ -}; + }; #endif // BTA_EIR_CANNED_UUID_LIST /* Extended Inquiry Response */ -const tBTA_DM_EIR_CONF bta_dm_eir_cfg = -{ +const tBTA_DM_EIR_CONF bta_dm_eir_cfg = { 50, /* minimum length of local name when it is shortened */ - /* if length of local name is longer than this and EIR has not enough */ - /* room for all UUID list then local name is shortened to this length */ + /* if length of local name is longer than this and EIR has not enough */ + /* room for all UUID list then local name is shortened to this length */ #if (BTA_EIR_CANNED_UUID_LIST == TRUE) 8, (UINT8 *)bta_dm_eir_uuid16_list, @@ -584,4 +577,4 @@ const tBTA_DM_EIR_CONF bta_dm_eir_cfg = 0, /* length of additional data in bytes */ NULL /* additional data */ }; -tBTA_DM_EIR_CONF *p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg; +tBTA_DM_EIR_CONF *p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF *) &bta_dm_eir_cfg; diff --git a/components/bt/bluedroid/bta/dm/bta_dm_ci.c b/components/bt/bluedroid/bta/dm/bta_dm_ci.c old mode 100755 new mode 100644 index 11ef0b2a2..fe4c39b7b --- a/components/bt/bluedroid/bta/dm/bta_dm_ci.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_ci.c @@ -43,13 +43,12 @@ ** *******************************************************************************/ void bta_dm_ci_io_req(BD_ADDR bd_addr, tBTA_IO_CAP io_cap, tBTA_OOB_DATA oob_data, - tBTA_AUTH_REQ auth_req) + tBTA_AUTH_REQ auth_req) { tBTA_DM_CI_IO_REQ *p_msg; - if ((p_msg = (tBTA_DM_CI_IO_REQ *) GKI_getbuf(sizeof(tBTA_DM_CI_IO_REQ))) != NULL) - { + if ((p_msg = (tBTA_DM_CI_IO_REQ *) GKI_getbuf(sizeof(tBTA_DM_CI_IO_REQ))) != NULL) { p_msg->hdr.event = BTA_DM_CI_IO_REQ_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->io_cap = io_cap; @@ -74,8 +73,7 @@ void bta_dm_ci_rmt_oob(BOOLEAN accept, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 { tBTA_DM_CI_RMT_OOB *p_msg; - if ((p_msg = (tBTA_DM_CI_RMT_OOB *) GKI_getbuf(sizeof(tBTA_DM_CI_RMT_OOB))) != NULL) - { + if ((p_msg = (tBTA_DM_CI_RMT_OOB *) GKI_getbuf(sizeof(tBTA_DM_CI_RMT_OOB))) != NULL) { p_msg->hdr.event = BTA_DM_CI_RMT_OOB_EVT; bdcpy(p_msg->bd_addr, bd_addr); p_msg->accept = accept; @@ -106,8 +104,7 @@ void bta_dm_sco_ci_data_ready(UINT16 event, UINT16 sco_handle) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = event; p_buf->layer_specific = sco_handle; diff --git a/components/bt/bluedroid/bta/dm/bta_dm_int.h b/components/bt/bluedroid/bta/dm/bta_dm_int.h old mode 100755 new mode 100644 index e098353c6..80e0bea47 --- a/components/bt/bluedroid/bta/dm/bta_dm_int.h +++ b/components/bt/bluedroid/bta/dm/bta_dm_int.h @@ -27,7 +27,7 @@ #include "bt_target.h" #if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) - #include "bta_gatt_api.h" +#include "bta_gatt_api.h" #endif @@ -47,8 +47,7 @@ #define BTA_SERVICE_ID_TO_SERVICE_MASK(id) (1 << (id)) /* DM events */ -enum -{ +enum { /* device manager local device API events */ BTA_DM_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_DM), BTA_DM_API_DISABLE_EVT, @@ -90,15 +89,15 @@ enum BTA_DM_API_BLE_CONN_PARAM_EVT, BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT, BTA_DM_API_BLE_SCAN_PARAM_EVT, - /*******This event added by Yulong at 2016/10/25 to + /*******This event added by Yulong at 2016/10/25 to support the scan filter setting for the APP******/ BTA_DM_API_BLE_SCAN_FIL_PARAM_EVT, BTA_DM_API_BLE_OBSERVE_EVT, BTA_DM_API_UPDATE_CONN_PARAM_EVT, - /*******This event added by Yulong at 2016/9/9 to + /*******This event added by Yulong at 2016/9/9 to support the random address setting for the APP******/ BTA_DM_API_SET_RAND_ADDR_EVT, - /*******This event added by Yulong at 2016/10/19 to + /*******This event added by Yulong at 2016/10/19 to support stop the ble advertising setting by the APP******/ BTA_DM_API_BLE_STOP_ADV_EVT, #if BLE_PRIVACY_SPT == TRUE @@ -106,7 +105,7 @@ enum #endif BTA_DM_API_BLE_ADV_PARAM_EVT, - /*******This event added by Yulong at 2016/10/20 to + /*******This event added by Yulong at 2016/10/20 to support setting the ble advertising param by the APP******/ BTA_DM_API_BLE_ADV_PARAM_All_EVT, BTA_DM_API_BLE_SET_ADV_CONFIG_EVT, @@ -142,8 +141,7 @@ enum /* DM search events */ -enum -{ +enum { /* DM search API events */ BTA_DM_API_SEARCH_EVT = BTA_SYS_EVT_START(BTA_ID_DM_SEARCH), BTA_DM_API_SEARCH_CANCEL_EVT, @@ -159,22 +157,19 @@ enum }; /* data type for BTA_DM_API_ENABLE_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_SEC_CBACK *p_sec_cback; } tBTA_DM_API_ENABLE; /* data type for BTA_DM_API_SET_NAME_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_NAME name; /* max 248 bytes name, plus must be Null terminated */ } tBTA_DM_API_SET_NAME; /* data type for BTA_DM_API_SET_VISIBILITY_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_DISC disc_mode; tBTA_DM_CONN conn_mode; @@ -182,8 +177,7 @@ typedef struct UINT8 conn_paired_only; } tBTA_DM_API_SET_VISIBILITY; -enum -{ +enum { BTA_DM_RS_NONE, /* straight API call */ BTA_DM_RS_OK, /* the role switch result - successful */ BTA_DM_RS_FAIL /* the role switch result - failed */ @@ -191,12 +185,11 @@ enum typedef UINT8 tBTA_DM_RS_RES; /* data type for BTA_DM_API_SEARCH_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_INQ inq_params; tBTA_SERVICE_MASK services; - tBTA_DM_SEARCH_CBACK * p_cback; + tBTA_DM_SEARCH_CBACK *p_cback; tBTA_DM_RS_RES rs_res; #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE UINT8 num_uuid; @@ -205,12 +198,11 @@ typedef struct } tBTA_DM_API_SEARCH; /* data type for BTA_DM_API_DISCOVER_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_SERVICE_MASK services; - tBTA_DM_SEARCH_CBACK * p_cback; + tBTA_DM_SEARCH_CBACK *p_cback; BOOLEAN sdp_search; tBTA_TRANSPORT transport; #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE @@ -221,34 +213,30 @@ typedef struct } tBTA_DM_API_DISCOVER; /* data type for BTA_DM_API_DI_DISC_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_DISCOVERY_DB *p_sdp_db; UINT32 len; - tBTA_DM_SEARCH_CBACK * p_cback; -}tBTA_DM_API_DI_DISC; + tBTA_DM_SEARCH_CBACK *p_cback; +} tBTA_DM_API_DI_DISC; /* data type for BTA_DM_API_BOND_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_TRANSPORT transport; } tBTA_DM_API_BOND; /* data type for BTA_DM_API_BOND_CANCEL_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_TRANSPORT transport; } tBTA_DM_API_BOND_CANCEL; /* data type for BTA_DM_API_PIN_REPLY_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; BOOLEAN accept; @@ -257,22 +245,19 @@ typedef struct } tBTA_DM_API_PIN_REPLY; /* data type for BTA_DM_API_LOC_OOB_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; } tBTA_DM_API_LOC_OOB; /* data type for BTA_DM_API_CONFIRM_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; BOOLEAN accept; } tBTA_DM_API_CONFIRM; /* data type for BTA_DM_CI_IO_REQ_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_IO_CAP io_cap; @@ -281,8 +266,7 @@ typedef struct } tBTA_DM_CI_IO_REQ; /* data type for BTA_DM_CI_RMT_OOB_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; BT_OCTET16 c; @@ -291,37 +275,32 @@ typedef struct } tBTA_DM_CI_RMT_OOB; /* data type for BTA_DM_REMT_NAME_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_SEARCH result; } tBTA_DM_REM_NAME; /* data type for tBTA_DM_DISC_RESULT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_SEARCH result; } tBTA_DM_DISC_RESULT; /* data type for BTA_DM_INQUIRY_CMPL_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 num; } tBTA_DM_INQUIRY_CMPL; /* data type for BTA_DM_SDP_RESULT_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 sdp_result; } tBTA_DM_SDP_RESULT; /* data type for BTA_DM_ACL_CHANGE_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTM_BL_EVENT event; UINT8 busy_level; @@ -337,8 +316,7 @@ typedef struct } tBTA_DM_ACL_CHANGE; /* data type for BTA_DM_PM_BTM_STATUS_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; @@ -349,8 +327,7 @@ typedef struct } tBTA_DM_PM_BTM_STATUS; /* data type for BTA_DM_PM_TIMER_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_DM_PM_ACTION pm_request; @@ -358,8 +335,7 @@ typedef struct /* data type for BTA_DM_API_ADD_DEVICE_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; DEV_CLASS dc; @@ -376,23 +352,20 @@ typedef struct } tBTA_DM_API_ADD_DEVICE; /* data type for BTA_DM_API_REMOVE_ACL_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; } tBTA_DM_API_REMOVE_DEVICE; /* data type for BTA_DM_API_EXECUTE_CBACK_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; - void * p_param; + void *p_param; tBTA_DM_EXEC_CBACK *p_exec_cback; } tBTA_DM_API_EXECUTE_CBACK; /* data type for tBTA_DM_API_SET_ENCRYPTION */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_TRANSPORT transport; tBTA_DM_ENCRYPT_CBACK *p_callback; @@ -401,50 +374,44 @@ typedef struct } tBTA_DM_API_SET_ENCRYPTION; #if BLE_INCLUDED == TRUE -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_LE_KEY_VALUE blekey; tBTA_LE_KEY_TYPE key_type; -}tBTA_DM_API_ADD_BLEKEY; +} tBTA_DM_API_ADD_BLEKEY; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBT_DEVICE_TYPE dev_type ; tBLE_ADDR_TYPE addr_type; -}tBTA_DM_API_ADD_BLE_DEVICE; +} tBTA_DM_API_ADD_BLE_DEVICE; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; BOOLEAN accept; UINT32 passkey; -}tBTA_DM_API_PASSKEY_REPLY; +} tBTA_DM_API_PASSKEY_REPLY; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tBTA_DM_BLE_SEC_GRANT res; -}tBTA_DM_API_BLE_SEC_GRANT; +} tBTA_DM_API_BLE_SEC_GRANT; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_BLE_CONN_TYPE bg_conn_type; tBTA_DM_BLE_SEL_CBACK *p_select_cback; -}tBTA_DM_API_BLE_SET_BG_CONN_TYPE; +} tBTA_DM_API_BLE_SET_BG_CONN_TYPE; /* set prefered BLE connection parameters for a device */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR peer_bda; UINT16 conn_int_min; @@ -452,150 +419,133 @@ typedef struct UINT16 supervision_tout; UINT16 slave_latency; -}tBTA_DM_API_BLE_CONN_PARAMS; +} tBTA_DM_API_BLE_CONN_PARAMS; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR peer_bda; BOOLEAN privacy_enable; -}tBTA_DM_API_ENABLE_PRIVACY; +} tBTA_DM_API_ENABLE_PRIVACY; -typedef struct -{ +typedef struct { BT_HDR hdr; BOOLEAN privacy_enable; -}tBTA_DM_API_LOCAL_PRIVACY; +} tBTA_DM_API_LOCAL_PRIVACY; /* set scan parameter for BLE connections */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATTC_IF client_if; UINT32 scan_int; UINT32 scan_window; tBLE_SCAN_MODE scan_mode; tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback; -}tBTA_DM_API_BLE_SCAN_PARAMS; +} tBTA_DM_API_BLE_SCAN_PARAMS; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATTC_IF client_if; UINT32 scan_int; UINT32 scan_window; tBLE_SCAN_MODE scan_mode; - UINT8 addr_type_own; - UINT8 scan_filter_policy; + UINT8 addr_type_own; + UINT8 scan_filter_policy; tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback; -}tBTA_DM_API_BLE_SCAN_FILTER_PARAMS; +} tBTA_DM_API_BLE_SCAN_FILTER_PARAMS; /* set scan parameter for BLE connections */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 scan_int; UINT16 scan_window; } tBTA_DM_API_BLE_CONN_SCAN_PARAMS; /* Data type for start/stop observe */ -typedef struct -{ +typedef struct { BT_HDR hdr; BOOLEAN start; UINT16 duration; - tBTA_DM_SEARCH_CBACK * p_cback; -}tBTA_DM_API_BLE_OBSERVE; + tBTA_DM_SEARCH_CBACK *p_cback; +} tBTA_DM_API_BLE_OBSERVE; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR remote_bda; UINT16 tx_data_length; -}tBTA_DM_API_BLE_SET_DATA_LENGTH; +} tBTA_DM_API_BLE_SET_DATA_LENGTH; /* set the address for BLE device this type added by Yulong at 2016/9/9*/ -typedef struct -{ - BT_HDR hdr; - tBLE_ADDR_TYPE addr_type; - BD_ADDR address; -}tBTA_DM_APT_SET_DEV_ADDR; +typedef struct { + BT_HDR hdr; + tBLE_ADDR_TYPE addr_type; + BD_ADDR address; +} tBTA_DM_APT_SET_DEV_ADDR; /* set adv parameter for BLE advertising */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 adv_int_min; UINT16 adv_int_max; tBLE_BD_ADDR *p_dir_bda; -}tBTA_DM_API_BLE_ADV_PARAMS; +} tBTA_DM_API_BLE_ADV_PARAMS; /* set adv parameter for BLE advertising */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 adv_int_min; UINT16 adv_int_max; - UINT8 adv_type; - tBLE_ADDR_TYPE addr_type_own; - tBTM_BLE_ADV_CHNL_MAP channel_map; - tBTM_BLE_AFP adv_filter_policy; + UINT8 adv_type; + tBLE_ADDR_TYPE addr_type_own; + tBTM_BLE_ADV_CHNL_MAP channel_map; + tBTM_BLE_AFP adv_filter_policy; tBLE_BD_ADDR *p_dir_bda; -}tBTA_DM_API_BLE_ADV_PARAMS_ALL; +} tBTA_DM_API_BLE_ADV_PARAMS_ALL; -typedef struct -{ +typedef struct { BT_HDR hdr; BOOLEAN enable; -}tBTA_DM_API_BLE_FEATURE; +} tBTA_DM_API_BLE_FEATURE; /* multi adv data structure */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_BLE_MULTI_ADV_CBACK *p_cback; void *p_ref; tBTA_BLE_ADV_PARAMS *p_params; -}tBTA_DM_API_BLE_MULTI_ADV_ENB; +} tBTA_DM_API_BLE_MULTI_ADV_ENB; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 inst_id; tBTA_BLE_ADV_PARAMS *p_params; -}tBTA_DM_API_BLE_MULTI_ADV_PARAM; +} tBTA_DM_API_BLE_MULTI_ADV_PARAM; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 inst_id; BOOLEAN is_scan_rsp; tBTA_BLE_AD_MASK data_mask; tBTA_BLE_ADV_DATA *p_data; -}tBTA_DM_API_BLE_MULTI_ADV_DATA; +} tBTA_DM_API_BLE_MULTI_ADV_DATA; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 inst_id; -}tBTA_DM_API_BLE_MULTI_ADV_DISABLE; +} tBTA_DM_API_BLE_MULTI_ADV_DISABLE; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT32 data_mask; tBTA_BLE_ADV_DATA *p_adv_cfg; tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback; -}tBTA_DM_API_SET_ADV_CONFIG; +} tBTA_DM_API_SET_ADV_CONFIG; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 batch_scan_full_max; UINT8 batch_scan_trunc_max; @@ -606,8 +556,7 @@ typedef struct tBTA_DM_BLE_REF_VALUE ref_value; } tBTA_DM_API_SET_STORAGE_CONFIG; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_BLE_BATCH_SCAN_MODE scan_mode; UINT32 scan_int; @@ -617,28 +566,24 @@ typedef struct tBTA_DM_BLE_REF_VALUE ref_value; } tBTA_DM_API_ENABLE_SCAN; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_BLE_REF_VALUE ref_value; } tBTA_DM_API_DISABLE_SCAN; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_BLE_BATCH_SCAN_MODE scan_type; tBTA_DM_BLE_REF_VALUE ref_value; } tBTA_DM_API_READ_SCAN_REPORTS; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_BLE_REF_VALUE ref_value; tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback; } tBTA_DM_API_TRACK_ADVERTISER; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_BLE_ENERGY_INFO_CBACK *p_energy_info_cback; } tBTA_DM_API_ENERGY_INFO; @@ -646,35 +591,31 @@ typedef struct #endif /* BLE_INCLUDED */ /* data type for BTA_DM_API_REMOVE_ACL_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; BOOLEAN remove_dev; tBTA_TRANSPORT transport; -}tBTA_DM_API_REMOVE_ACL; +} tBTA_DM_API_REMOVE_ACL; /* data type for BTA_DM_API_REMOVE_ALL_ACL_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_LINK_TYPE link_type; } tBTA_DM_API_REMOVE_ALL_ACL; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; UINT16 min_int; UINT16 max_int; UINT16 latency; UINT16 timeout; -}tBTA_DM_API_UPDATE_CONN_PARAM; +} tBTA_DM_API_UPDATE_CONN_PARAM; #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_DM_BLE_SCAN_COND_OP action; tBTA_DM_BLE_PF_COND_TYPE cond_type; @@ -682,18 +623,16 @@ typedef struct tBTA_DM_BLE_PF_COND_PARAM *p_cond_param; tBTA_DM_BLE_PF_CFG_CBACK *p_filt_cfg_cback; tBTA_DM_BLE_REF_VALUE ref_value; -}tBTA_DM_API_CFG_FILTER_COND; +} tBTA_DM_API_CFG_FILTER_COND; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 action; tBTA_DM_BLE_PF_STATUS_CBACK *p_filt_status_cback; tBTA_DM_BLE_REF_VALUE ref_value; -}tBTA_DM_API_ENABLE_SCAN_FILTER; +} tBTA_DM_API_ENABLE_SCAN_FILTER; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 action; tBTA_DM_BLE_PF_FILT_INDEX filt_index; @@ -701,12 +640,11 @@ typedef struct tBLE_BD_ADDR *p_target; tBTA_DM_BLE_PF_PARAM_CBACK *p_filt_param_cback; tBTA_DM_BLE_REF_VALUE ref_value; -}tBTA_DM_API_SCAN_FILTER_PARAM_SETUP; +} tBTA_DM_API_SCAN_FILTER_PARAM_SETUP; #endif /* union of all data types */ -typedef union -{ +typedef union { /* GKI event buffer header */ BT_HDR hdr; tBTA_DM_API_ENABLE enable; @@ -763,12 +701,12 @@ typedef union tBTA_DM_API_BLE_CONN_PARAMS ble_set_conn_params; tBTA_DM_API_BLE_CONN_SCAN_PARAMS ble_set_conn_scan_params; tBTA_DM_API_BLE_SCAN_PARAMS ble_set_scan_params; - tBTA_DM_API_BLE_SCAN_FILTER_PARAMS ble_set_scan_fil_params; + tBTA_DM_API_BLE_SCAN_FILTER_PARAMS ble_set_scan_fil_params; tBTA_DM_API_BLE_OBSERVE ble_observe; tBTA_DM_API_ENABLE_PRIVACY ble_remote_privacy; tBTA_DM_API_LOCAL_PRIVACY ble_local_privacy; tBTA_DM_API_BLE_ADV_PARAMS ble_set_adv_params; - tBTA_DM_API_BLE_ADV_PARAMS_ALL ble_set_adv_params_all; + tBTA_DM_API_BLE_ADV_PARAMS_ALL ble_set_adv_params_all; tBTA_DM_API_SET_ADV_CONFIG ble_set_adv_data; #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE tBTA_DM_API_SCAN_FILTER_PARAM_SETUP ble_scan_filt_param_setup; @@ -777,7 +715,7 @@ typedef union #endif tBTA_DM_API_UPDATE_CONN_PARAM ble_update_conn_params; tBTA_DM_API_BLE_SET_DATA_LENGTH ble_set_data_length; - tBTA_DM_APT_SET_DEV_ADDR set_addr; + tBTA_DM_APT_SET_DEV_ADDR set_addr; tBTA_DM_API_BLE_MULTI_ADV_ENB ble_multi_adv_enb; tBTA_DM_API_BLE_MULTI_ADV_PARAM ble_multi_adv_param; tBTA_DM_API_BLE_MULTI_ADV_DATA ble_multi_adv_data; @@ -819,8 +757,7 @@ typedef UINT8 tBTA_DM_DEV_INFO; #define BTA_DM_PM_EXECUTE 3 typedef UINT8 tBTA_DM_PM_REQ; -typedef struct -{ +typedef struct { BD_ADDR peer_bdaddr; UINT16 link_policy; tBTA_DM_CONN_STATE conn_state; @@ -844,8 +781,7 @@ typedef struct /* structure to store list of active connections */ -typedef struct -{ +typedef struct { tBTA_DM_PEER_DEVICE peer_device[BTA_DM_NUM_PEER_DEVICE]; UINT8 count; #if BLE_INCLUDED == TRUE @@ -854,8 +790,7 @@ typedef struct } tBTA_DM_ACTIVE_LINK; -typedef struct -{ +typedef struct { BD_ADDR peer_bdaddr; tBTA_SYS_ID id; UINT8 app_id; @@ -868,16 +803,14 @@ typedef struct #define BTA_DM_NUM_CONN_SRVS 10 #endif -typedef struct -{ +typedef struct { UINT8 count; tBTA_DM_SRVCS conn_srvc[BTA_DM_NUM_CONN_SRVS]; } tBTA_DM_CONNECTED_SRVCS; -typedef struct -{ +typedef struct { #define BTA_DM_PM_SNIFF_TIMER_IDX 0 #define BTA_DM_PM_PARK_TIMER_IDX 1 #define BTA_DM_PM_SUSPEND_TIMER_IDX 2 @@ -901,8 +834,7 @@ extern tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; #define BTA_DM_NUM_PM_TIMER 7 /* DM control block */ -typedef struct -{ +typedef struct { BOOLEAN is_bta_dm_active; tBTA_DM_ACTIVE_LINK device_list; tBTA_DM_SEC_CBACK *p_sec_cback; @@ -961,22 +893,21 @@ typedef struct #endif /* DM search control block */ -typedef struct -{ +typedef struct { - tBTA_DM_SEARCH_CBACK * p_search_cback; - tBTM_INQ_INFO * p_btm_inq_info; + tBTA_DM_SEARCH_CBACK *p_search_cback; + tBTM_INQ_INFO *p_btm_inq_info; tBTA_SERVICE_MASK services; tBTA_SERVICE_MASK services_to_search; tBTA_SERVICE_MASK services_found; - tSDP_DISCOVERY_DB * p_sdp_db; + tSDP_DISCOVERY_DB *p_sdp_db; UINT16 state; BD_ADDR peer_bdaddr; BOOLEAN name_discover_done; BD_NAME peer_name; TIMER_LIST_ENT search_timer; UINT8 service_index; - tBTA_DM_MSG * p_search_queue; /* search or discover commands during search cancel stored here */ + tBTA_DM_MSG *p_search_queue; /* search or discover commands during search cancel stored here */ BOOLEAN wait_disc; BOOLEAN sdp_results; tSDP_UUID uuid; @@ -985,7 +916,7 @@ typedef struct BOOLEAN cancel_pending; /* inquiry cancel is pending */ tBTA_TRANSPORT transport; #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) - tBTA_DM_SEARCH_CBACK * p_scan_cback; + tBTA_DM_SEARCH_CBACK *p_scan_cback; #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) tBTA_GATTC_IF client_if; UINT8 num_uuid; @@ -993,7 +924,7 @@ typedef struct UINT8 uuid_to_search; BOOLEAN gatt_disc_active; UINT16 conn_id; - UINT8 * p_ble_rawdata; + UINT8 *p_ble_rawdata; UINT32 ble_raw_size; UINT32 ble_raw_used; TIMER_LIST_ENT gatt_close_timer; /* GATT channel close delay timer */ @@ -1005,16 +936,14 @@ typedef struct } tBTA_DM_SEARCH_CB; /* DI control block */ -typedef struct -{ - tSDP_DISCOVERY_DB * p_di_db; /* pointer to the DI discovery database */ +typedef struct { + tSDP_DISCOVERY_DB *p_di_db; /* pointer to the DI discovery database */ UINT8 di_num; /* total local DI record number */ UINT32 di_handle[BTA_DI_NUM_MAX]; /* local DI record handle, the first one is primary record */ -}tBTA_DM_DI_CB; +} tBTA_DM_DI_CB; /* DM search state */ -enum -{ +enum { BTA_DM_SEARCH_IDLE, BTA_DM_SEARCH_ACTIVE, @@ -1025,8 +954,7 @@ enum -typedef struct -{ +typedef struct { DEV_CLASS dev_class; /* local device class */ UINT16 policy_settings; /* link policy setting hold, sniff, park, MS switch */ UINT16 page_timeout; /* timeout for page in slots */ @@ -1038,8 +966,7 @@ typedef struct extern const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl[]; -typedef struct -{ +typedef struct { UINT8 id; UINT8 app_id; UINT8 cfg; @@ -1049,48 +976,43 @@ typedef struct extern tBTA_DM_CFG *p_bta_dm_cfg; extern tBTA_DM_RM *p_bta_dm_rm_cfg; -typedef struct -{ +typedef struct { - UINT8 id; - UINT8 app_id; - UINT8 spec_idx; /* index of spec table to use */ + UINT8 id; + UINT8 app_id; + UINT8 spec_idx; /* index of spec table to use */ } tBTA_DM_PM_CFG; -typedef struct -{ +typedef struct { - tBTA_DM_PM_ACTION power_mode; - UINT16 timeout; + tBTA_DM_PM_ACTION power_mode; + UINT16 timeout; } tBTA_DM_PM_ACTN; -typedef struct -{ +typedef struct { - UINT8 allow_mask; /* mask of sniff/hold/park modes to allow */ + UINT8 allow_mask; /* mask of sniff/hold/park modes to allow */ #if (BTM_SSR_INCLUDED == TRUE) - UINT8 ssr; /* set SSR on conn open/unpark */ + UINT8 ssr; /* set SSR on conn open/unpark */ #endif - tBTA_DM_PM_ACTN actn_tbl [BTA_DM_PM_NUM_EVTS][2]; + tBTA_DM_PM_ACTN actn_tbl [BTA_DM_PM_NUM_EVTS][2]; } tBTA_DM_PM_SPEC; -typedef struct -{ +typedef struct { UINT16 max_lat; UINT16 min_rmt_to; UINT16 min_loc_to; } tBTA_DM_SSR_SPEC; -typedef struct -{ - UINT16 manufacturer; - UINT16 lmp_sub_version; - UINT8 lmp_version; -}tBTA_DM_LMP_VER_INFO; +typedef struct { + UINT16 manufacturer; + UINT16 lmp_sub_version; + UINT8 lmp_version; +} tBTA_DM_LMP_VER_INFO; extern tBTA_DM_PM_CFG *p_bta_dm_pm_cfg; extern tBTA_DM_PM_SPEC *p_bta_dm_pm_spec; @@ -1171,7 +1093,7 @@ extern void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data); extern void bta_dm_ble_stop_advertising(tBTA_DM_MSG *p_data); extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data); -extern void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data); +extern void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data); extern void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data); @@ -1188,10 +1110,10 @@ extern void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data); extern void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data); extern void bta_dm_ble_setup_storage(tBTA_DM_MSG *p_data); -extern void bta_dm_ble_enable_batch_scan(tBTA_DM_MSG * p_data); -extern void bta_dm_ble_disable_batch_scan(tBTA_DM_MSG * p_data); -extern void bta_dm_ble_read_scan_reports(tBTA_DM_MSG * p_data); -extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG * p_data); +extern void bta_dm_ble_enable_batch_scan(tBTA_DM_MSG *p_data); +extern void bta_dm_ble_disable_batch_scan(tBTA_DM_MSG *p_data); +extern void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data); +extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data); extern void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data); #endif @@ -1226,7 +1148,7 @@ extern void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data); extern void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data); extern void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data); extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data); -extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr); +extern tBTA_DM_PEER_DEVICE *bta_dm_find_peer_device(BD_ADDR peer_addr); extern void bta_dm_pm_active(BD_ADDR peer_addr); diff --git a/components/bt/bluedroid/bta/dm/bta_dm_main.c b/components/bt/bluedroid/bta/dm/bta_dm_main.c old mode 100755 new mode 100644 index e896b31f0..ea3f54618 --- a/components/bt/bluedroid/bta/dm/bta_dm_main.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_main.c @@ -44,8 +44,7 @@ tBTA_DM_DI_CB bta_dm_di_cb; typedef void (*tBTA_DM_ACTION)(tBTA_DM_MSG *p_data); /* action function list */ -const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = -{ +const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = { /* device manager local device API events */ bta_dm_enable, /* 0 BTA_DM_API_ENABLE_EVT */ @@ -87,15 +86,15 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = bta_dm_ble_set_conn_params, /* BTA_DM_API_BLE_CONN_PARAM_EVT */ bta_dm_ble_set_conn_scan_params, /* BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT */ bta_dm_ble_set_scan_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */ - bta_dm_ble_set_scan_fil_params, /* BTA_DM_API_BLE_SCAN_FIL_PARAM_EVT */ - bta_dm_ble_observe, /* BTA_DM_API_BLE_OBSERVE_EVT*/ + bta_dm_ble_set_scan_fil_params, /* BTA_DM_API_BLE_SCAN_FIL_PARAM_EVT */ + bta_dm_ble_observe, /* BTA_DM_API_BLE_OBSERVE_EVT*/ bta_dm_ble_update_conn_params, /* BTA_DM_API_UPDATE_CONN_PARAM_EVT */ - /*******This handler function added by Yulong at 2016/9/9 to - support the random address setting for the APP******/ - bta_dm_ble_set_rand_address, /*BTA_DM_API_SET_RAND_ADDR_EVT*/ - /*******This handler function added by Yulong at 2016/10/19 to - support stop the ble advertising setting by the APP******/ - bta_dm_ble_stop_advertising, /*BTA_DM_API_BLE_STOP_ADV_EVT*/ + /*******This handler function added by Yulong at 2016/9/9 to + support the random address setting for the APP******/ + bta_dm_ble_set_rand_address, /*BTA_DM_API_SET_RAND_ADDR_EVT*/ + /*******This handler function added by Yulong at 2016/10/19 to + support stop the ble advertising setting by the APP******/ + bta_dm_ble_stop_advertising, /*BTA_DM_API_BLE_STOP_ADV_EVT*/ #if BLE_PRIVACY_SPT == TRUE bta_dm_ble_config_local_privacy, /* BTA_DM_API_LOCAL_PRIVACY_EVT */ #endif @@ -133,8 +132,7 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = /* state machine action enumeration list */ -enum -{ +enum { BTA_DM_API_SEARCH, /* 0 bta_dm_search_start */ BTA_DM_API_SEARCH_CANCEL, /* 1 bta_dm_search_cancel */ BTA_DM_API_DISCOVER, /* 2 bta_dm_discover */ @@ -161,29 +159,28 @@ enum /* action function list */ -const tBTA_DM_ACTION bta_dm_search_action[] = -{ +const tBTA_DM_ACTION bta_dm_search_action[] = { - bta_dm_search_start, /* 0 BTA_DM_API_SEARCH */ - bta_dm_search_cancel, /* 1 BTA_DM_API_SEARCH_CANCEL */ - bta_dm_discover, /* 2 BTA_DM_API_DISCOVER */ - bta_dm_inq_cmpl, /* 3 BTA_DM_INQUIRY_CMPL */ - bta_dm_rmt_name, /* 4 BTA_DM_REMT_NAME */ - bta_dm_sdp_result, /* 5 BTA_DM_SDP_RESULT */ - bta_dm_search_cmpl, /* 6 BTA_DM_SEARCH_CMPL */ - bta_dm_free_sdp_db, /* 7 BTA_DM_FREE_SDP_DB */ - bta_dm_disc_result, /* 8 BTA_DM_DISC_RESULT */ - bta_dm_search_result, /* 9 BTA_DM_SEARCH_RESULT */ - bta_dm_queue_search, /* 10 BTA_DM_QUEUE_SEARCH */ - bta_dm_queue_disc, /* 11 BTA_DM_QUEUE_DISC */ - bta_dm_search_clear_queue, /* 12 BTA_DM_SEARCH_CLEAR_QUEUE */ - bta_dm_search_cancel_cmpl, /* 13 BTA_DM_SEARCH_CANCEL_CMPL */ - bta_dm_search_cancel_notify, /* 14 BTA_DM_SEARCH_CANCEL_NOTIFY */ - bta_dm_search_cancel_transac_cmpl, /* 15 BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL */ - bta_dm_disc_rmt_name, /* 16 BTA_DM_DISC_RMT_NAME */ - bta_dm_di_disc /* 17 BTA_DM_API_DI_DISCOVER */ + bta_dm_search_start, /* 0 BTA_DM_API_SEARCH */ + bta_dm_search_cancel, /* 1 BTA_DM_API_SEARCH_CANCEL */ + bta_dm_discover, /* 2 BTA_DM_API_DISCOVER */ + bta_dm_inq_cmpl, /* 3 BTA_DM_INQUIRY_CMPL */ + bta_dm_rmt_name, /* 4 BTA_DM_REMT_NAME */ + bta_dm_sdp_result, /* 5 BTA_DM_SDP_RESULT */ + bta_dm_search_cmpl, /* 6 BTA_DM_SEARCH_CMPL */ + bta_dm_free_sdp_db, /* 7 BTA_DM_FREE_SDP_DB */ + bta_dm_disc_result, /* 8 BTA_DM_DISC_RESULT */ + bta_dm_search_result, /* 9 BTA_DM_SEARCH_RESULT */ + bta_dm_queue_search, /* 10 BTA_DM_QUEUE_SEARCH */ + bta_dm_queue_disc, /* 11 BTA_DM_QUEUE_DISC */ + bta_dm_search_clear_queue, /* 12 BTA_DM_SEARCH_CLEAR_QUEUE */ + bta_dm_search_cancel_cmpl, /* 13 BTA_DM_SEARCH_CANCEL_CMPL */ + bta_dm_search_cancel_notify, /* 14 BTA_DM_SEARCH_CANCEL_NOTIFY */ + bta_dm_search_cancel_transac_cmpl, /* 15 BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL */ + bta_dm_disc_rmt_name, /* 16 BTA_DM_DISC_RMT_NAME */ + bta_dm_di_disc /* 17 BTA_DM_API_DI_DISCOVER */ #if BLE_INCLUDED == TRUE - ,bta_dm_close_gatt_conn + , bta_dm_close_gatt_conn #endif }; @@ -196,77 +193,73 @@ const tBTA_DM_ACTION bta_dm_search_action[] = /* state table for listen state */ -const UINT8 bta_dm_search_idle_st_table[][BTA_DM_SEARCH_NUM_COLS] = -{ +const UINT8 bta_dm_search_idle_st_table[][BTA_DM_SEARCH_NUM_COLS] = { -/* Event Action 1 Action 2 Next State */ -/* API_SEARCH */ {BTA_DM_API_SEARCH, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* API_SEARCH_DISC */ {BTA_DM_API_DISCOVER, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* INQUIRY_CMPL */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* REMT_NAME_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* SDP_RESULT_EVT */ {BTA_DM_FREE_SDP_DB, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* DISCV_RES_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* API_DI_DISCOVER_EVT */ {BTA_DM_API_DI_DISCOVER, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} + /* Event Action 1 Action 2 Next State */ + /* API_SEARCH */ {BTA_DM_API_SEARCH, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* API_SEARCH_DISC */ {BTA_DM_API_DISCOVER, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* INQUIRY_CMPL */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* REMT_NAME_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* SDP_RESULT_EVT */ {BTA_DM_FREE_SDP_DB, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* DISCV_RES_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* API_DI_DISCOVER_EVT */ {BTA_DM_API_DI_DISCOVER, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} #if BLE_INCLUDED == TRUE -/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE} + /* DISC_CLOSE_TOUT_EVT */ , {BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE} #endif }; -const UINT8 bta_dm_search_search_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = -{ +const UINT8 bta_dm_search_search_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = { -/* Event Action 1 Action 2 Next State */ -/* API_SEARCH */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* API_SEARCH_CANCEL */ {BTA_DM_API_SEARCH_CANCEL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, -/* API_SEARCH_DISC */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* INQUIRY_CMPL */ {BTA_DM_INQUIRY_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* REMT_NAME_EVT */ {BTA_DM_REMT_NAME, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* SDP_RESULT_EVT */ {BTA_DM_SDP_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* DISCV_RES_EVT */ {BTA_DM_SEARCH_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, -/* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} + /* Event Action 1 Action 2 Next State */ + /* API_SEARCH */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* API_SEARCH_CANCEL */ {BTA_DM_API_SEARCH_CANCEL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, + /* API_SEARCH_DISC */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* INQUIRY_CMPL */ {BTA_DM_INQUIRY_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* REMT_NAME_EVT */ {BTA_DM_REMT_NAME, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* SDP_RESULT_EVT */ {BTA_DM_SDP_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* DISCV_RES_EVT */ {BTA_DM_SEARCH_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, + /* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} #if BLE_INCLUDED == TRUE -/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} + /* DISC_CLOSE_TOUT_EVT */ , {BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} #endif }; -const UINT8 bta_dm_search_search_cancelling_st_table[][BTA_DM_SEARCH_NUM_COLS] = -{ +const UINT8 bta_dm_search_search_cancelling_st_table[][BTA_DM_SEARCH_NUM_COLS] = { -/* Event Action 1 Action 2 Next State */ -/* API_SEARCH */ {BTA_DM_QUEUE_SEARCH, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, -/* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CLEAR_QUEUE, BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_CANCELLING}, -/* API_SEARCH_DISC */ {BTA_DM_QUEUE_DISC, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, -/* INQUIRY_CMPL */ {BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* REMT_NAME_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, -/* SDP_RESULT_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, -/* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, -/* DISCV_RES_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, -/* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} + /* Event Action 1 Action 2 Next State */ + /* API_SEARCH */ {BTA_DM_QUEUE_SEARCH, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, + /* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CLEAR_QUEUE, BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_CANCELLING}, + /* API_SEARCH_DISC */ {BTA_DM_QUEUE_DISC, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, + /* INQUIRY_CMPL */ {BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* REMT_NAME_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, + /* SDP_RESULT_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, + /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, + /* DISCV_RES_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, + /* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} #if BLE_INCLUDED == TRUE -/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} + /* DISC_CLOSE_TOUT_EVT */ , {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} #endif }; -const UINT8 bta_dm_search_disc_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = -{ +const UINT8 bta_dm_search_disc_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = { -/* Event Action 1 Action 2 Next State */ -/* API_SEARCH */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, -/* API_SEARCH_DISC */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* INQUIRY_CMPL */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* REMT_NAME_EVT */ {BTA_DM_DISC_RMT_NAME, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* SDP_RESULT_EVT */ {BTA_DM_SDP_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, -/* DISCV_RES_EVT */ {BTA_DM_DISC_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, -/* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE} + /* Event Action 1 Action 2 Next State */ + /* API_SEARCH */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* API_SEARCH_CANCEL */ {BTA_DM_SEARCH_CANCEL_NOTIFY, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING}, + /* API_SEARCH_DISC */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* INQUIRY_CMPL */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* REMT_NAME_EVT */ {BTA_DM_DISC_RMT_NAME, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* SDP_RESULT_EVT */ {BTA_DM_SDP_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, + /* DISCV_RES_EVT */ {BTA_DM_DISC_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE}, + /* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE} #if BLE_INCLUDED == TRUE -/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE} + /* DISC_CLOSE_TOUT_EVT */ , {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE} #endif }; @@ -314,9 +307,8 @@ BOOLEAN bta_dm_sm_execute(BT_HDR *p_msg) APPL_TRACE_EVENT("bta_dm_sm_execute event:0x%x", event); /* execute action functions */ - if(event < BTA_DM_NUM_ACTIONS) - { - (*bta_dm_action[event])( (tBTA_DM_MSG*) p_msg); + if (event < BTA_DM_NUM_ACTIONS) { + (*bta_dm_action[event])( (tBTA_DM_MSG *) p_msg); } return TRUE; @@ -356,7 +348,7 @@ BOOLEAN bta_dm_search_sm_execute(BT_HDR *p_msg) int i; APPL_TRACE_EVENT("bta_dm_search_sm_execute state:%d, event:0x%x", - bta_dm_search_cb.state, p_msg->event); + bta_dm_search_cb.state, p_msg->event); /* look up the state table for the current state */ state_table = bta_dm_search_st_tbl[bta_dm_search_cb.state]; @@ -365,14 +357,10 @@ BOOLEAN bta_dm_search_sm_execute(BT_HDR *p_msg) /* execute action functions */ - for (i = 0; i < BTA_DM_SEARCH_ACTIONS; i++) - { - if ((action = state_table[p_msg->event & 0x00ff][i]) != BTA_DM_SEARCH_IGNORE) - { - (*bta_dm_search_action[action])( (tBTA_DM_MSG*) p_msg); - } - else - { + for (i = 0; i < BTA_DM_SEARCH_ACTIONS; i++) { + if ((action = state_table[p_msg->event & 0x00ff][i]) != BTA_DM_SEARCH_IGNORE) { + (*bta_dm_search_action[action])( (tBTA_DM_MSG *) p_msg); + } else { break; } } diff --git a/components/bt/bluedroid/bta/dm/bta_dm_pm.c b/components/bt/bluedroid/bta/dm/bta_dm_pm.c old mode 100755 new mode 100644 index 23273aef2..1acb0f46c --- a/components/bt/bluedroid/bta/dm/bta_dm_pm.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_pm.c @@ -44,7 +44,7 @@ static BOOLEAN bta_dm_pm_is_sco_active (); static void bta_dm_pm_hid_check(BOOLEAN bScoActive); static void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE *p_dev, BOOLEAN bDisable); static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER *p_timer, - UINT8 timer_idx); + UINT8 timer_idx); #if (BTM_SSR_INCLUDED == TRUE) #if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE) @@ -73,19 +73,18 @@ void bta_dm_init_pm(void) memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs)); /* if there are no power manger entries, so not register */ - if(p_bta_dm_pm_cfg[0].app_id != 0) - { - bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)bta_dm_pm_cback); + if (p_bta_dm_pm_cfg[0].app_id != 0) { + bta_sys_pm_register((tBTA_SYS_CONN_CBACK *)bta_dm_pm_cback); BTM_PmRegister((BTM_PM_REG_SET | BTM_PM_REG_NOTIF), &bta_dm_cb.pm_id, bta_dm_pm_btm_cback); } /* Need to initialize all PM timer service IDs */ - for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++) - { - for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) + for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { + for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) { bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX; + } } } @@ -108,13 +107,11 @@ void bta_dm_disable_pm(void) * Deregister the PM callback from the system handling to prevent * re-enabling the PM timers after this call if the callback is invoked. */ - bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)NULL); + bta_sys_pm_register((tBTA_SYS_CONN_CBACK *)NULL); /* Need to stop all active timers. */ - for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++) - { - for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) - { + for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { + for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) { bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], j); bta_dm_cb.pm_timer[i].pm_action[j] = BTA_DM_PM_NO_ACTION; } @@ -134,10 +131,10 @@ void bta_dm_disable_pm(void) UINT8 bta_dm_get_av_count(void) { UINT8 count = 0; - for (int i = 0; i < bta_dm_conn_srvcs.count; i++) - { - if (bta_dm_conn_srvcs.conn_srvc[i].id == BTA_ID_AV) + for (int i = 0; i < bta_dm_conn_srvcs.count; i++) { + if (bta_dm_conn_srvcs.conn_srvc[i].id == BTA_ID_AV) { ++count; + } } return count; } @@ -156,12 +153,9 @@ static void bta_dm_pm_stop_timer(BD_ADDR peer_addr) { APPL_TRACE_DEBUG("%s: ", __func__); - for(int i=0; iin_use = TRUE; p_timer->timer[timer_idx].p_cback = bta_dm_pm_timer_cback; - if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) + if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) { p_timer->active++; + } - if (p_timer->pm_action[timer_idx] < pm_action) + if (p_timer->pm_action[timer_idx] < pm_action) { p_timer->pm_action[timer_idx] = pm_action; + } p_timer->srvc_id[timer_idx] = srvc_id; @@ -305,13 +296,15 @@ static void bta_dm_pm_start_timer(tBTA_PM_TIMER *p_timer, UINT8 timer_idx, ** *******************************************************************************/ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER *p_timer, - UINT8 timer_idx) + UINT8 timer_idx) { - if ((p_timer == NULL) || (timer_idx >= BTA_DM_PM_MODE_TIMER_MAX)) + if ((p_timer == NULL) || (timer_idx >= BTA_DM_PM_MODE_TIMER_MAX)) { return; + } - if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) - return; /* The timer was not scheduled */ + if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) { + return; /* The timer was not scheduled */ + } assert(p_timer->in_use && (p_timer->active > 0)); @@ -320,8 +313,9 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER *p_timer, /* NOTE: pm_action[timer_idx] intentionally not reset */ p_timer->active--; - if (p_timer->active == 0) + if (p_timer->active == 0) { p_timer->in_use = FALSE; + } } UINT32 bta_dm_pm_get_remaining_ticks (TIMER_LIST_ENT *p_target_tle) @@ -342,7 +336,7 @@ UINT32 bta_dm_pm_get_remaining_ticks (TIMER_LIST_ENT *p_target_tle) static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - UINT8 i,j; + UINT8 i, j; UINT16 policy_setting; UINT8 *p = NULL; tBTA_DM_PEER_DEVICE *p_dev; @@ -356,78 +350,67 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, p_dev = bta_dm_find_peer_device(peer_addr); /* find if there is an power mode entry for the service */ - for(i=1; i<=p_bta_dm_pm_cfg[0].app_id; i++) - { + for (i = 1; i <= p_bta_dm_pm_cfg[0].app_id; i++) { - if((p_bta_dm_pm_cfg[i].id == id) - && ((p_bta_dm_pm_cfg[i].app_id == BTA_ALL_APP_ID ) || (p_bta_dm_pm_cfg[i].app_id == app_id ))) + if ((p_bta_dm_pm_cfg[i].id == id) + && ((p_bta_dm_pm_cfg[i].app_id == BTA_ALL_APP_ID ) || (p_bta_dm_pm_cfg[i].app_id == app_id ))) { break; + } } /* if no entries are there for the app_id and subsystem in p_bta_dm_pm_spec*/ - if(i> p_bta_dm_pm_cfg[0].app_id) + if (i > p_bta_dm_pm_cfg[0].app_id) { return; + } bta_dm_pm_stop_timer_by_srvc_id(peer_addr, id); /*p_dev = bta_dm_find_peer_device(peer_addr);*/ #if (BTM_SSR_INCLUDED == TRUE) /* set SSR parameters on SYS CONN OPEN */ - if((BTA_SYS_CONN_OPEN == status) && p_dev && (p_dev->info & BTA_DM_DI_USE_SSR)) - { + if ((BTA_SYS_CONN_OPEN == status) && p_dev && (p_dev->info & BTA_DM_DI_USE_SSR)) { index = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].ssr; } #endif /* if no action for the event */ - if(p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].actn_tbl[status][0].power_mode == BTA_DM_PM_NO_ACTION) - { + if (p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].actn_tbl[status][0].power_mode == BTA_DM_PM_NO_ACTION) { #if (BTM_SSR_INCLUDED == TRUE) - if(BTA_DM_PM_SSR0 == index) /* and do not need to set SSR, return. */ + if (BTA_DM_PM_SSR0 == index) /* and do not need to set SSR, return. */ #endif - return; + return; } - for(j=0; jpm_mode_attempted = 0; p_dev->pm_mode_failed = 0; } #if (BTM_SSR_INCLUDED == TRUE) - if(p_bta_dm_ssr_spec[index].max_lat + if (p_bta_dm_ssr_spec[index].max_lat #if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE) - || index == BTA_DM_PM_SSR_HH + || index == BTA_DM_PM_SSR_HH #endif - ) - { + ) { bta_dm_pm_ssr(peer_addr); - } - else - { - if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && - ((NULL != (p = BTM_ReadRemoteFeatures (peer_addr))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && - (index == BTA_DM_PM_SSR0)) - { - if (status == BTA_SYS_SCO_OPEN) - { + } else { + if ( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && + ((NULL != (p = BTM_ReadRemoteFeatures (peer_addr))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && + (index == BTA_DM_PM_SSR0)) { + if (status == BTA_SYS_SCO_OPEN) { APPL_TRACE_DEBUG("%s: SCO inactive, reset SSR to zero", __func__); - BTM_SetSsrParams (peer_addr, 0,0,0 ); - } - else if (status == BTA_SYS_SCO_CLOSE) - { + BTM_SetSsrParams (peer_addr, 0, 0, 0 ); + } else if (status == BTA_SYS_SCO_CLOSE) { APPL_TRACE_DEBUG("%s: SCO active, back to old SSR", __func__); bta_dm_pm_ssr(peer_addr); } @@ -495,14 +468,14 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, ** This will handle the case where HID connects when SCO already active */ if ( BTM_IsDeviceUp() && - ( ((status == BTA_SYS_SCO_OPEN) || (status == BTA_SYS_SCO_CLOSE)) || - ((status == BTA_SYS_CONN_OPEN) && (id == BTA_ID_HH) && bta_dm_pm_is_sco_active()) ) ) - { + ( ((status == BTA_SYS_SCO_OPEN) || (status == BTA_SYS_SCO_CLOSE)) || + ((status == BTA_SYS_CONN_OPEN) && (id == BTA_ID_HH) && bta_dm_pm_is_sco_active()) ) ) { BOOLEAN bScoActive; - if (status == BTA_SYS_CONN_OPEN) + if (status == BTA_SYS_CONN_OPEN) { bScoActive = TRUE; - else + } else { bScoActive = (status == BTA_SYS_SCO_OPEN); + } bta_dm_pm_hid_check(bScoActive); } @@ -527,7 +500,7 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, tBTA_DM_PM_ACTION pm_action = BTA_DM_PM_NO_ACTION; UINT16 timeout = 0; - UINT8 i,j; + UINT8 i, j; tBTA_DM_PM_ACTION failed_pm = 0; tBTA_DM_PEER_DEVICE *p_peer_device = NULL; tBTA_DM_PM_ACTION allowed_modes = 0; @@ -540,31 +513,31 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, UINT8 timer_idx, available_timer = BTA_DM_PM_MODE_TIMER_MAX; UINT32 remaining_ticks = 0; - if(!bta_dm_cb.device_list.count) + if (!bta_dm_cb.device_list.count) { return; + } /* see if any attempt to put device in low power mode failed */ p_peer_device = bta_dm_find_peer_device(peer_addr); /* if no peer device found return */ - if (p_peer_device == NULL) + if (p_peer_device == NULL) { return; + } failed_pm = p_peer_device->pm_mode_failed; - for(i=0; ipeer_bdaddr, peer_addr)) - { + if (!bdcmp(p_srvcs->peer_bdaddr, peer_addr)) { /* p_bta_dm_pm_cfg[0].app_id is the number of entries */ - for(j=1; j<=p_bta_dm_pm_cfg[0].app_id; j++) - { - if((p_bta_dm_pm_cfg[j].id == p_srvcs->id) - && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID ) || - (p_bta_dm_pm_cfg[j].app_id == p_srvcs->app_id))) + for (j = 1; j <= p_bta_dm_pm_cfg[0].app_id; j++) { + if ((p_bta_dm_pm_cfg[j].id == p_srvcs->id) + && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID ) || + (p_bta_dm_pm_cfg[j].app_id == p_srvcs->app_id))) { break; + } } p_pm_cfg = &p_bta_dm_pm_cfg[j]; @@ -578,28 +551,23 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, /* PM actions are in the order of strictness */ /* first check if the first preference is ok */ - if(!(failed_pm & p_act0->power_mode)) - { + if (!(failed_pm & p_act0->power_mode)) { pref_modes |= p_act0->power_mode; - if(p_act0->power_mode >= pm_action) - { + if (p_act0->power_mode >= pm_action) { pm_action = p_act0->power_mode; - if (pm_req != BTA_DM_PM_NEW_REQ || p_srvcs->new_request) - { + if (pm_req != BTA_DM_PM_NEW_REQ || p_srvcs->new_request) { p_srvcs->new_request = FALSE; timeout = p_act0->timeout; } } } /* if first preference has already failed, try second preference */ - else if(!(failed_pm & p_act1->power_mode)) - { + else if (!(failed_pm & p_act1->power_mode)) { pref_modes |= p_act1->power_mode; - if(p_act1->power_mode > pm_action) - { + if (p_act1->power_mode > pm_action) { pm_action = p_act1->power_mode; timeout = p_act1->timeout; } @@ -607,36 +575,28 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, } } - if(pm_action & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) - { + if (pm_action & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) { /* some service don't like the mode */ - if(!(allowed_modes & pm_action)) - { + if (!(allowed_modes & pm_action)) { /* select the other mode if its allowed and preferred, otherwise 0 which is BTA_DM_PM_NO_ACTION */ pm_action = (allowed_modes & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & pref_modes); /* no timeout needed if no action is required */ - if(pm_action == BTA_DM_PM_NO_ACTION) - { + if (pm_action == BTA_DM_PM_NO_ACTION) { timeout = 0; } } } /* if need to start a timer */ - if((pm_req != BTA_DM_PM_EXECUTE) && timeout) - { - for(i=0; iid, pm_action); timer_started = TRUE; } } /* no more timers */ - else - { + else { APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more"); } } @@ -682,31 +637,22 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, } /* if pending power mode timer expires, and currecnt link is in a lower power mode than current profile requirement, igonre it */ - if (pm_req == BTA_DM_PM_EXECUTE && pm_request < pm_action) - { + if (pm_req == BTA_DM_PM_EXECUTE && pm_request < pm_action) { APPL_TRACE_ERROR("Ignore the power mode request: %d", pm_request) return; } - if(pm_action == BTA_DM_PM_PARK) - { + if (pm_action == BTA_DM_PM_PARK) { p_peer_device->pm_mode_attempted = BTA_DM_PM_PARK; bta_dm_pm_park(peer_addr); - } - else if(pm_action & BTA_DM_PM_SNIFF) - { + } else if (pm_action & BTA_DM_PM_SNIFF) { /* dont initiate SNIFF, if link_policy has it disabled */ - if (p_peer_device->link_policy & HCI_ENABLE_SNIFF_MODE) - { + if (p_peer_device->link_policy & HCI_ENABLE_SNIFF_MODE) { p_peer_device->pm_mode_attempted = BTA_DM_PM_SNIFF; bta_dm_pm_sniff(p_peer_device, (UINT8)(pm_action & 0x0F) ); - } - else - { + } else { APPL_TRACE_DEBUG("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request"); } - } - else if(pm_action == BTA_DM_PM_ACTIVE) - { + } else if (pm_action == BTA_DM_PM_ACTIVE) { bta_dm_pm_active(peer_addr); } } @@ -728,8 +674,7 @@ static BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr) /* if not in park mode, switch to park */ BTM_ReadPowerMode(peer_addr, &mode); - if(mode != BTM_PM_MD_PARK) - { + if (mode != BTM_PM_MD_PARK) { BTM_SetPowerMode (bta_dm_cb.pm_id, peer_addr, &p_bta_dm_pm_md[BTA_DM_PM_PARK_IDX]); } return TRUE; @@ -760,12 +705,12 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) #if (BTM_SSR_INCLUDED == TRUE) APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info); if (mode != BTM_PM_MD_SNIFF || - (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && p_rem_feat && - HCI_SNIFF_SUB_RATE_SUPPORTED(p_rem_feat) && - !(p_peer_dev->info & BTA_DM_DI_USE_SSR))) + (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && p_rem_feat && + HCI_SNIFF_SUB_RATE_SUPPORTED(p_rem_feat) && + !(p_peer_dev->info & BTA_DM_DI_USE_SSR))) #else APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index); - if(mode != BTM_PM_MD_SNIFF) + if (mode != BTM_PM_MD_SNIFF) #endif { #if (BTM_SSR_INCLUDED == TRUE) @@ -773,8 +718,7 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) * remote sniff params. This avoid sniff loop issue with * some agrresive headsets who use sniff latencies more than * DUT supported range of Sniff intervals.*/ - if ((mode == BTM_PM_MD_SNIFF) && (p_peer_dev->info & BTA_DM_DI_ACP_SNIFF)) - { + if ((mode == BTM_PM_MD_SNIFF) && (p_peer_dev->info & BTA_DM_DI_ACP_SNIFF)) { APPL_TRACE_DEBUG("%s: already in remote initiate sniff", __func__); return TRUE; } @@ -782,25 +726,19 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) /* if the current mode is not sniff, issue the sniff command. * If sniff, but SSR is not used in this link, still issue the command */ memcpy(&pwr_md, &p_bta_dm_pm_md[index], sizeof (tBTM_PM_PWR_MD)); - if (p_peer_dev->info & BTA_DM_DI_INT_SNIFF) - { + if (p_peer_dev->info & BTA_DM_DI_INT_SNIFF) { pwr_md.mode |= BTM_PM_MD_FORCE; } status = BTM_SetPowerMode (bta_dm_cb.pm_id, p_peer_dev->peer_bdaddr, &pwr_md); - if (status == BTM_CMD_STORED|| status == BTM_CMD_STARTED) - { - p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF); + if (status == BTM_CMD_STORED || status == BTM_CMD_STARTED) { + p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF); p_peer_dev->info |= BTA_DM_DI_SET_SNIFF; - } - else if (status == BTM_SUCCESS) - { + } else if (status == BTM_SUCCESS) { APPL_TRACE_DEBUG("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS"); - p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); - } - else /* error */ - { + p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF | BTA_DM_DI_SET_SNIFF); + } else { /* error */ APPL_TRACE_ERROR("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status); - p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); + p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF | BTA_DM_DI_SET_SNIFF); } } return TRUE; @@ -819,24 +757,20 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) static void bta_dm_pm_ssr(BD_ADDR peer_addr) { tBTA_DM_SSR_SPEC *p_spec, *p_spec_cur; - UINT8 i,j; + UINT8 i, j; int ssr = BTA_DM_PM_SSR0; /* go through the connected services */ - for(i=0; imax_lat, &p_spec_cur->min_rmt_to) == BTA_HH_ERR) + if (p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr == BTA_DM_PM_SSR_HH) { + if (bta_hh_read_ssr_param(peer_addr, &p_spec_cur->max_lat, &p_spec_cur->min_rmt_to) == BTA_HH_ERR) { continue; + } } #endif if (p_spec_cur->max_lat < p_spec->max_lat || - (ssr == BTA_DM_PM_SSR0 && p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr != BTA_DM_PM_SSR0)) - { + (ssr == BTA_DM_PM_SSR0 && p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr != BTA_DM_PM_SSR0)) { ssr = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr; } @@ -864,11 +797,10 @@ static void bta_dm_pm_ssr(BD_ADDR peer_addr) p_spec = &p_bta_dm_ssr_spec[ssr]; APPL_TRACE_WARNING("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat); - if(p_spec->max_lat) - { + if (p_spec->max_lat) { /* set the SSR parameters. */ BTM_SetSsrParams (peer_addr, p_spec->max_lat, - p_spec->min_rmt_to, p_spec->min_loc_to); + p_spec->min_rmt_to, p_spec->min_loc_to); } } #endif @@ -886,7 +818,7 @@ void bta_dm_pm_active(BD_ADDR peer_addr) { tBTM_PM_PWR_MD pm; - memset( (void*)&pm, 0, sizeof(pm)); + memset( (void *)&pm, 0, sizeof(pm)); /* switch to active mode */ pm.mode = BTM_PM_MD_ACTIVE; @@ -908,10 +840,9 @@ void bta_dm_pm_active(BD_ADDR peer_addr) *******************************************************************************/ static void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status) { - tBTA_DM_PM_BTM_STATUS *p_buf; + tBTA_DM_PM_BTM_STATUS *p_buf; - if ((p_buf = (tBTA_DM_PM_BTM_STATUS *) GKI_getbuf(sizeof(tBTA_DM_PM_BTM_STATUS))) != NULL) - { + if ((p_buf = (tBTA_DM_PM_BTM_STATUS *) GKI_getbuf(sizeof(tBTA_DM_PM_BTM_STATUS))) != NULL) { p_buf->hdr.event = BTA_DM_PM_BTM_STATUS_EVT; p_buf->status = status; p_buf->value = value; @@ -935,35 +866,33 @@ static void bta_dm_pm_timer_cback(void *p_tle) { UINT8 i, j; - for (i=0; ihdr.event = BTA_DM_PM_TIMER_EVT; p_buf->pm_request = bta_dm_cb.pm_timer[i].pm_action[j]; bdcpy(p_buf->bd_addr, bta_dm_cb.pm_timer[i].peer_bdaddr); @@ -986,89 +915,84 @@ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) APPL_TRACE_DEBUG("%s status: %d", __func__, p_data->pm_status.status); tBTA_DM_PEER_DEVICE *p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr); - if (NULL == p_dev) + if (NULL == p_dev) { return; + } tBTA_DM_DEV_INFO info = p_dev->info; /* check new mode */ - switch (p_data->pm_status.status) - { - case BTM_PM_STS_ACTIVE: - /* if our sniff or park attempt failed - we should not try it again*/ - if (p_data->pm_status.hci_status != 0) - { - APPL_TRACE_ERROR("%s hci_status=%d", __func__, p_data->pm_status.hci_status); - p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); + switch (p_data->pm_status.status) { + case BTM_PM_STS_ACTIVE: + /* if our sniff or park attempt failed + we should not try it again*/ + if (p_data->pm_status.hci_status != 0) { + APPL_TRACE_ERROR("%s hci_status=%d", __func__, p_data->pm_status.hci_status); + p_dev->info &= ~(BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF | BTA_DM_DI_SET_SNIFF); - if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) - { - p_dev->pm_mode_failed - |= ((BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & p_dev->pm_mode_attempted); - bta_dm_pm_stop_timer_by_mode(p_data->pm_status.bd_addr, p_dev->pm_mode_attempted); - bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART); - } - } - else - { -#if (BTM_SSR_INCLUDED == TRUE) - if(p_dev->prev_low) - { - /* need to send the SSR paramaters to controller again */ - bta_dm_pm_ssr(p_dev->peer_bdaddr); - } - p_dev->prev_low = BTM_PM_STS_ACTIVE; -#endif - /* link to active mode, need to restart the timer for next low power mode if needed */ - bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); + if (p_dev->pm_mode_attempted & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) { + p_dev->pm_mode_failed + |= ((BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & p_dev->pm_mode_attempted); + bta_dm_pm_stop_timer_by_mode(p_data->pm_status.bd_addr, p_dev->pm_mode_attempted); bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART); } - break; + } else { +#if (BTM_SSR_INCLUDED == TRUE) + if (p_dev->prev_low) { + /* need to send the SSR paramaters to controller again */ + bta_dm_pm_ssr(p_dev->peer_bdaddr); + } + p_dev->prev_low = BTM_PM_STS_ACTIVE; +#endif + /* link to active mode, need to restart the timer for next low power mode if needed */ + bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); + bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART); + } + break; #if (BTM_SSR_INCLUDED == TRUE) - case BTM_PM_STS_PARK: - case BTM_PM_STS_HOLD: - /* save the previous low power mode - for SSR. - * SSR parameters are sent to controller on "conn open". - * the numbers stay good until park/hold/detach */ - if(p_dev->info & BTA_DM_DI_USE_SSR) - p_dev->prev_low = p_data->pm_status.status; - break; + case BTM_PM_STS_PARK: + case BTM_PM_STS_HOLD: + /* save the previous low power mode - for SSR. + * SSR parameters are sent to controller on "conn open". + * the numbers stay good until park/hold/detach */ + if (p_dev->info & BTA_DM_DI_USE_SSR) { + p_dev->prev_low = p_data->pm_status.status; + } + break; - case BTM_PM_STS_SSR: - if(p_data->pm_status.value) - p_dev->info |= BTA_DM_DI_USE_SSR; - else - p_dev->info &= ~BTA_DM_DI_USE_SSR; - break; + case BTM_PM_STS_SSR: + if (p_data->pm_status.value) { + p_dev->info |= BTA_DM_DI_USE_SSR; + } else { + p_dev->info &= ~BTA_DM_DI_USE_SSR; + } + break; #endif - case BTM_PM_STS_SNIFF: - if (p_data->pm_status.hci_status == 0) - { - /* Stop PM timer now if already active for - * particular device since link is already - * put in sniff mode by remote device, and - * PM timer sole purpose is to put the link - * in sniff mode from host side. - */ - bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); + case BTM_PM_STS_SNIFF: + if (p_data->pm_status.hci_status == 0) { + /* Stop PM timer now if already active for + * particular device since link is already + * put in sniff mode by remote device, and + * PM timer sole purpose is to put the link + * in sniff mode from host side. + */ + bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); + } else { + p_dev->info &= ~(BTA_DM_DI_SET_SNIFF | BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF); + if (info & BTA_DM_DI_SET_SNIFF) { + p_dev->info |= BTA_DM_DI_INT_SNIFF; + } else { + p_dev->info |= BTA_DM_DI_ACP_SNIFF; } - else - { - p_dev->info &= ~(BTA_DM_DI_SET_SNIFF | BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF); - if (info & BTA_DM_DI_SET_SNIFF) - p_dev->info |= BTA_DM_DI_INT_SNIFF; - else - p_dev->info |= BTA_DM_DI_ACP_SNIFF; - } - break; + } + break; - case BTM_PM_STS_ERROR: - p_dev->info &= ~BTA_DM_DI_SET_SNIFF; - break; + case BTM_PM_STS_ERROR: + p_dev->info &= ~BTA_DM_DI_SET_SNIFF; + break; - default: - break; + default: + break; } @@ -1100,14 +1024,12 @@ void bta_dm_pm_timer(tBTA_DM_MSG *p_data) ** Returns tBTA_DM_PEER_DEVICE ** *******************************************************************************/ -tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr) +tBTA_DM_PEER_DEVICE *bta_dm_find_peer_device(BD_ADDR peer_addr) { tBTA_DM_PEER_DEVICE *p_dev = NULL; - for (int i=0; ipeer_bdaddr); + } /* update device record and set link policy */ p_dev->link_policy = policy_setting; diff --git a/components/bt/bluedroid/bta/dm/bta_dm_sco.c b/components/bt/bluedroid/bta/dm/bta_dm_sco.c old mode 100755 new mode 100644 index 109140a4d..06e58e963 --- a/components/bt/bluedroid/bta/dm/bta_dm_sco.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_sco.c @@ -38,7 +38,7 @@ ** Constants *****************************************************************************/ -#define BTA_DM_PCM_OVERLAP_SIZE 48 +#define BTA_DM_PCM_OVERLAP_SIZE 48 #define BTA_DM_PCM_SMPL_RATE_44100 44100 #define BTA_DM_PCM_SMPL_RATE_22050 22050 @@ -49,11 +49,10 @@ *****************************************************************************/ typedef INT32 (*PCONVERT_TO_BT_FILTERED) (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, - UINT32 dwSrcSps,INT32 *pLastCurPos, UINT8 *pOverlapArea); + UINT32 dwSrcSps, INT32 *pLastCurPos, UINT8 *pOverlapArea); typedef INT32 (*PCONVERT_TO_BT_NOFILTER) (void *pSrc, void *pDst, UINT32 dwSrcSamples, - UINT32 dwSrcSps); -typedef struct -{ + UINT32 dwSrcSps); +typedef struct { UINT8 overlap_area[BTA_DM_PCM_OVERLAP_SIZE * 4]; UINT32 cur_pos; /* current position */ UINT32 src_sps; /* samples per second (source audio data) */ @@ -65,7 +64,7 @@ typedef struct UINT32 n_channels; /* number of channels (i.e. mono(1), stereo(2)...) */ UINT32 sample_size; UINT32 can_be_filtered; - UINT32 divisor; + UINT32 divisor; } tBTA_DM_PCM_RESAMPLE_CB; tBTA_DM_PCM_RESAMPLE_CB bta_dm_pcm_cb; @@ -240,7 +239,7 @@ tBTA_DM_PCM_RESAMPLE_CB bta_dm_pcm_cb; ** Local Function *****************************************************************************/ INT32 Convert_8M_ToBT_Filtered (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, - UINT32 dwSrcSps, INT32 *pLastCurPos, UINT8 *pOverlapArea) + UINT32 dwSrcSps, INT32 *pLastCurPos, UINT8 *pOverlapArea) { INT32 CurrentPos = *pLastCurPos; SRC_TYPE *pIn, *pInEnd; @@ -252,30 +251,25 @@ INT32 Convert_8M_ToBT_Filtered (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2); pOv = (SRC_TYPE *)(pOverlapArea + BTA_DM_PCM_OVERLAP_SIZE); - pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); + pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); pIn = (SRC_TYPE *)(pSrc + BTA_DM_PCM_OVERLAP_SIZE); - pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ - BTA_DM_PCM_OVERLAP_SIZE); + pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ + BTA_DM_PCM_OVERLAP_SIZE); - if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) - { + if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) { CONVERT_44100_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_44100_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) { CONVERT_22050_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_22050_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) { CONVERT_11025_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_11025_TO_BLUETOOTH(pIn, pInEnd); } memcpy (pOverlapArea, pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ - (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); + (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); *pLastCurPos = CurrentPos; @@ -293,14 +287,12 @@ INT32 Convert_8M_ToBT_NoFilter (void *pSrc, void *pDst, UINT32 dwSrcSamples, UIN // CurrentPos = (dwSrcSps >> 1); - while (dwSrcSamples--) - { + while (dwSrcSamples--) { CurrentPos -= 8000; - if (CurrentPos >= 0) + if (CurrentPos >= 0) { pbSrc++; - else - { + } else { sWorker = *pbSrc++; sWorker -= 0x80; sWorker <<= 8; @@ -336,29 +328,24 @@ INT32 Convert_16M_ToBT_Filtered (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2); pOv = (SRC_TYPE *)(pOverlapArea + BTA_DM_PCM_OVERLAP_SIZE); - pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); + pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); pIn = (SRC_TYPE *)(pSrc + BTA_DM_PCM_OVERLAP_SIZE); - pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); + pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); - if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) - { + if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) { CONVERT_44100_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_44100_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) { CONVERT_22050_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_22050_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) { CONVERT_11025_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_11025_TO_BLUETOOTH(pIn, pInEnd); } memcpy (pOverlapArea, pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ - (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); + (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); *pLastCurPos = CurrentPos; @@ -375,14 +362,12 @@ INT32 Convert_16M_ToBT_NoFilter (void *pSrc, void *pDst, UINT32 dwSrcSamples, UI // CurrentPos = (dwSrcSps >> 1); - while (dwSrcSamples--) - { + while (dwSrcSamples--) { CurrentPos -= 8000; - if (CurrentPos >= 0) + if (CurrentPos >= 0) { psSrc++; - else - { + } else { *psDst++ = *psSrc++; CurrentPos += dwSrcSps; @@ -413,34 +398,29 @@ INT32 Convert_8S_ToBT_Filtered (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, #if BTA_DM_SCO_DEBUG APPL_TRACE_DEBUG("Convert_8S_ToBT_Filtered CurrentPos %d, SRC_TYPE %d, SRC_CHANNELS %d, \ dwSrcSamples %d, dwSrcSps %d", CurrentPos, sizeof (SRC_TYPE), SRC_CHANNELS, \ - dwSrcSamples, dwSrcSps); + dwSrcSamples, dwSrcSps); #endif memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2); pOv = (SRC_TYPE *)(pOverlapArea + BTA_DM_PCM_OVERLAP_SIZE); - pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); + pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); pIn = (SRC_TYPE *)(pSrc + BTA_DM_PCM_OVERLAP_SIZE); - pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); + pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); - if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) - { + if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) { CONVERT_44100_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_44100_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) { CONVERT_22050_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_22050_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) { CONVERT_11025_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_11025_TO_BLUETOOTH(pIn, pInEnd); } memcpy (pOverlapArea, pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ - (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); + (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); *pLastCurPos = CurrentPos; @@ -458,14 +438,12 @@ INT32 Convert_8S_ToBT_NoFilter (void *pSrc, void *pDst, UINT32 dwSrcSamples, UIN // CurrentPos = (dwSrcSps >> 1); - while (dwSrcSamples--) - { + while (dwSrcSamples--) { CurrentPos -= 8000; - if (CurrentPos >= 0) + if (CurrentPos >= 0) { pbSrc += 2; - else - { + } else { sWorker = *(unsigned char *)pbSrc; sWorker -= 0x80; sWorker <<= 8; @@ -510,29 +488,24 @@ INT32 Convert_16S_ToBT_Filtered (UINT8 *pSrc, void *pDst, UINT32 dwSrcSamples, memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2); pOv = (SRC_TYPE *)(pOverlapArea + BTA_DM_PCM_OVERLAP_SIZE); - pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); + pOvEnd = (SRC_TYPE *)(pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 3)); pIn = (SRC_TYPE *)(pSrc + BTA_DM_PCM_OVERLAP_SIZE); - pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); + pInEnd = (SRC_TYPE *)(pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - BTA_DM_PCM_OVERLAP_SIZE); - if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) - { + if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_44100) { CONVERT_44100_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_44100_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_22050) { CONVERT_22050_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_22050_TO_BLUETOOTH(pIn, pInEnd); - } - else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) - { + } else if (dwSrcSps == BTA_DM_PCM_SMPL_RATE_11025) { CONVERT_11025_TO_BLUETOOTH(pOv, pOvEnd); CONVERT_11025_TO_BLUETOOTH(pIn, pInEnd); } memcpy (pOverlapArea, pSrc + (dwSrcSamples * SRC_CHANNELS * sizeof (SRC_TYPE)) - \ - (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); + (BTA_DM_PCM_OVERLAP_SIZE * 2), BTA_DM_PCM_OVERLAP_SIZE * 2); *pLastCurPos = CurrentPos; @@ -550,14 +523,12 @@ INT32 Convert_16S_ToBT_NoFilter (void *pSrc, void *pDst, UINT32 dwSrcSamples, UI // CurrentPos = (dwSrcSps >> 1); - while (dwSrcSamples--) - { + while (dwSrcSamples--) { CurrentPos -= 8000; - if (CurrentPos >= 0) + if (CurrentPos >= 0) { psSrc += 2; - else - { + } else { /* CR 82894, to avoid overflow, divide before add */ sWorker = ((*psSrc) >> 1 ); psSrc++; @@ -596,56 +567,48 @@ void BTA_DmPcmInitSamples (UINT32 src_sps, UINT32 bits, UINT32 n_channels) p_cb->bits = bits; p_cb->n_channels = n_channels; p_cb->sample_size = 2; - p_cb->divisor = 2; + p_cb->divisor = 2; memset(p_cb->overlap_area, 0, sizeof(p_cb->overlap_area) ); if ((src_sps == BTA_DM_PCM_SMPL_RATE_44100) || - (src_sps == BTA_DM_PCM_SMPL_RATE_22050) || - (src_sps == BTA_DM_PCM_SMPL_RATE_11025)) - p_cb->can_be_filtered = 1; - else - p_cb->can_be_filtered = 0; + (src_sps == BTA_DM_PCM_SMPL_RATE_22050) || + (src_sps == BTA_DM_PCM_SMPL_RATE_11025)) { + p_cb->can_be_filtered = 1; + } else { + p_cb->can_be_filtered = 0; + } #if BTA_DM_SCO_DEBUG APPL_TRACE_DEBUG("bta_dm_pcm_init_samples: n_channels = %d bits = %d", n_channels, bits); #endif - if(n_channels == 1) - { + if (n_channels == 1) { /* mono */ - if(bits == 8) - { + if (bits == 8) { p_cb->filter = (PCONVERT_TO_BT_FILTERED) Convert_8M_ToBT_Filtered; p_cb->nofilter = (PCONVERT_TO_BT_NOFILTER) Convert_8M_ToBT_NoFilter; - p_cb->divisor = 1; - } - else - { + p_cb->divisor = 1; + } else { p_cb->filter = (PCONVERT_TO_BT_FILTERED) Convert_16M_ToBT_Filtered; p_cb->nofilter = (PCONVERT_TO_BT_NOFILTER) Convert_16M_ToBT_NoFilter; } - } - else - { + } else { /* stereo */ - if(bits == 8) - { + if (bits == 8) { p_cb->filter = (PCONVERT_TO_BT_FILTERED) Convert_8S_ToBT_Filtered; p_cb->nofilter = (PCONVERT_TO_BT_NOFILTER) Convert_8S_ToBT_NoFilter; - } - else - { + } else { p_cb->filter = (PCONVERT_TO_BT_FILTERED) Convert_16S_ToBT_Filtered; p_cb->nofilter = (PCONVERT_TO_BT_NOFILTER) Convert_16S_ToBT_NoFilter; - p_cb->divisor = 4; + p_cb->divisor = 4; } } #if BTA_DM_SCO_DEBUG APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: cur_pos %d, src_sps %d", \ - p_cb->cur_pos, p_cb->src_sps); + p_cb->cur_pos, p_cb->src_sps); APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: bits %d, n_channels %d, sample_size %d, ", \ - p_cb->bits, p_cb->n_channels, p_cb->sample_size); + p_cb->bits, p_cb->n_channels, p_cb->sample_size); APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: can_be_filtered %d, n_channels: %d, \ divisor %d", p_cb->can_be_filtered, p_cb->n_channels, p_cb->divisor); #endif @@ -675,15 +638,12 @@ INT32 BTA_DmPcmResample (void *p_src, UINT32 in_bytes, void *p_dst) #if BTA_DM_SCO_DEBUG APPL_TRACE_DEBUG("bta_pcm_resample : insamples %d", (in_bytes / bta_dm_pcm_cb.divisor)); #endif - if(bta_dm_pcm_cb.can_be_filtered) - { + if (bta_dm_pcm_cb.can_be_filtered) { out_sample = (*bta_dm_pcm_cb.filter) (p_src, p_dst, (in_bytes / bta_dm_pcm_cb.divisor), - bta_dm_pcm_cb.src_sps, (INT32 *) &bta_dm_pcm_cb.cur_pos, bta_dm_pcm_cb.overlap_area); - } - else - { + bta_dm_pcm_cb.src_sps, (INT32 *) &bta_dm_pcm_cb.cur_pos, bta_dm_pcm_cb.overlap_area); + } else { out_sample = (*bta_dm_pcm_cb.nofilter) (p_src, p_dst, - (in_bytes / bta_dm_pcm_cb.divisor), bta_dm_pcm_cb.src_sps); + (in_bytes / bta_dm_pcm_cb.divisor), bta_dm_pcm_cb.src_sps); } #if BTA_DM_SCO_DEBUG diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c old mode 100755 new mode 100644 index c7546404e..f03b545e1 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c @@ -62,8 +62,7 @@ static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg); static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda); static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested); -static tGATT_CBACK bta_gattc_cl_cback = -{ +static tGATT_CBACK bta_gattc_cl_cback = { bta_gattc_conn_cback, bta_gattc_cmpl_cback, bta_gattc_disc_res_cback, @@ -74,8 +73,7 @@ static tGATT_CBACK bta_gattc_cl_cback = }; /* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */ -static UINT16 bta_gattc_opcode_to_int_evt[] = -{ +static UINT16 bta_gattc_opcode_to_int_evt[] = { BTA_GATTC_API_READ_EVT, BTA_GATTC_API_WRITE_EVT, BTA_GATTC_API_EXEC_EVT, @@ -83,8 +81,7 @@ static UINT16 bta_gattc_opcode_to_int_evt[] = }; #if (BT_TRACE_VERBOSE == TRUE) -static const char *bta_gattc_op_code_name[] = -{ +static const char *bta_gattc_op_code_name[] = { "Unknown", "Discovery", "Read", @@ -113,14 +110,11 @@ static void bta_gattc_enable(tBTA_GATTC_CB *p_cb) { APPL_TRACE_DEBUG("bta_gattc_enable"); - if (p_cb->state == BTA_GATTC_STATE_DISABLED) - { + if (p_cb->state == BTA_GATTC_STATE_DISABLED) { /* initialize control block */ memset(&bta_gattc_cb, 0, sizeof(tBTA_GATTC_CB)); p_cb->state = BTA_GATTC_STATE_ENABLED; - } - else - { + } else { APPL_TRACE_DEBUG("GATTC is arelady enabled"); } } @@ -142,16 +136,13 @@ void bta_gattc_disable(tBTA_GATTC_CB *p_cb) APPL_TRACE_DEBUG("bta_gattc_disable"); - if (p_cb->state != BTA_GATTC_STATE_ENABLED) - { + if (p_cb->state != BTA_GATTC_STATE_ENABLED) { APPL_TRACE_ERROR("not enabled or disable in pogress"); return; } - for (i = 0; i cl_rcb[i].in_use) - { + for (i = 0; i < BTA_GATTC_CL_MAX; i ++) { + if (p_cb->cl_rcb[i].in_use) { p_cb->state = BTA_GATTC_STATE_DISABLING; /* don't deregister HH GATT IF */ /* HH GATT IF will be deregistered by bta_hh_le_deregister when disable HH */ @@ -166,8 +157,7 @@ void bta_gattc_disable(tBTA_GATTC_CB *p_cb) } /* no registered apps, indicate disable completed */ - if (p_cb->state != BTA_GATTC_STATE_DISABLING) - { + if (p_cb->state != BTA_GATTC_STATE_DISABLING) { p_cb->state = BTA_GATTC_STATE_DISABLED; memset(p_cb, 0, sizeof(tBTA_GATTC_CB)); } @@ -191,27 +181,21 @@ void bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) tBTA_GATT_STATUS status = BTA_GATT_NO_RESOURCES; - APPL_TRACE_DEBUG("bta_gattc_register state %d",p_cb->state); + APPL_TRACE_DEBUG("bta_gattc_register state %d\n", p_cb->state); memset(&cb_data, 0, sizeof(cb_data)); cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES; - /* check if GATTC module is already enabled . Else enable */ - if (p_cb->state == BTA_GATTC_STATE_DISABLED) - { - bta_gattc_enable (p_cb); - } + /* check if GATTC module is already enabled . Else enable */ + if (p_cb->state == BTA_GATTC_STATE_DISABLED) { + bta_gattc_enable (p_cb); + } /* todo need to check duplicate uuid */ - for (i = 0; i < BTA_GATTC_CL_MAX; i ++) - { - if (!p_cb->cl_rcb[i].in_use) - { - if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0) - { - APPL_TRACE_ERROR("Register with GATT stack failed."); + for (i = 0; i < BTA_GATTC_CL_MAX; i ++) { + if (!p_cb->cl_rcb[i].in_use) { + if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0) { + APPL_TRACE_ERROR("Register with GATT stack failed.\n"); status = BTA_GATT_ERROR; - } - else - { + } else { p_cb->cl_rcb[i].in_use = TRUE; p_cb->cl_rcb[i].p_cback = p_data->api_reg.p_cback; memcpy(&p_cb->cl_rcb[i].app_uuid, p_app_uuid, sizeof(tBT_UUID)); @@ -219,16 +203,13 @@ void bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) /* BTA use the same client interface as BTE GATT statck */ cb_data.reg_oper.client_if = p_cb->cl_rcb[i].client_if; - if ((p_buf = (tBTA_GATTC_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTC_INT_START_IF))) != NULL) - { + if ((p_buf = (tBTA_GATTC_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTC_INT_START_IF))) != NULL) { p_buf->hdr.event = BTA_GATTC_INT_START_IF_EVT; p_buf->client_if = p_cb->cl_rcb[i].client_if; - + APPL_TRACE_DEBUG("GATTC getbuf sucess.\n"); bta_sys_sendmsg(p_buf); status = BTA_GATT_OK; - } - else - { + } else { GATT_Deregister(p_cb->cl_rcb[i].client_if); status = BTA_GATT_NO_RESOURCES; @@ -240,11 +221,10 @@ void bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data) } /* callback with register event */ - if (p_data->api_reg.p_cback) - { - if (p_app_uuid != NULL) - memcpy(&(cb_data.reg_oper.app_uuid),p_app_uuid,sizeof(tBT_UUID)); - + if (p_data->api_reg.p_cback) { + if (p_app_uuid != NULL) { + memcpy(&(cb_data.reg_oper.app_uuid), p_app_uuid, sizeof(tBT_UUID)); + } cb_data.reg_oper.status = status; (*p_data->api_reg.p_cback)(BTA_GATTC_REG_EVT, (tBTA_GATTC *)&cb_data); } @@ -262,13 +242,10 @@ void bta_gattc_start_if(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { UNUSED(p_cb); - if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) !=NULL ) - { + if (bta_gattc_cl_get_regcb(p_msg->int_start_if.client_if) != NULL ) { GATT_StartIf(p_msg->int_start_if.client_if); - } - else - { - APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if ); + } else { + APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d", p_msg->int_start_if.client_if ); } } @@ -286,32 +263,24 @@ void bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_RCB *p_clreg) UINT8 i; BT_HDR buf; - if (p_clreg != NULL) - { + if (p_clreg != NULL) { /* remove bg connection associated with this rcb */ - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++) - { - if (p_cb->bg_track[i].in_use) - { - if (p_cb->bg_track[i].cif_mask & (1 <<(p_clreg->client_if - 1))) - { + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++) { + if (p_cb->bg_track[i].in_use) { + if (p_cb->bg_track[i].cif_mask & (1 << (p_clreg->client_if - 1))) { bta_gattc_mark_bg_conn(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE, FALSE); GATT_CancelConnect(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE); } - if (p_cb->bg_track[i].cif_adv_mask & (1 <<(p_clreg->client_if - 1))) - { + if (p_cb->bg_track[i].cif_adv_mask & (1 << (p_clreg->client_if - 1))) { bta_gattc_mark_bg_conn(p_clreg->client_if, p_cb->bg_track[i].remote_bda, FALSE, TRUE); } } } - if (p_clreg->num_clcb > 0) - { + if (p_clreg->num_clcb > 0) { /* close all CLCB related to this app */ - for (i= 0; i < BTA_GATTC_CLCB_MAX; i ++) - { - if (p_cb->clcb[i].in_use && (p_cb->clcb[i].p_rcb == p_clreg)) - { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) { + if (p_cb->clcb[i].in_use && (p_cb->clcb[i].p_rcb == p_clreg)) { p_clreg->dereg_pending = TRUE; buf.event = BTA_GATTC_API_CLOSE_EVT; @@ -319,12 +288,10 @@ void bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_RCB *p_clreg) bta_gattc_close(&p_cb->clcb[i], (tBTA_GATTC_DATA *)&buf) ; } } - } - else + } else { bta_gattc_deregister_cmpl(p_clreg); - } - else - { + } + } else { APPL_TRACE_ERROR("bta_gattc_deregister Deregister Failedm unknown client cif"); } } @@ -337,25 +304,20 @@ void bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_RCB *p_clreg) ** Returns void ** *******************************************************************************/ -void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) +void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { UINT16 event = ((BT_HDR *)p_msg)->event; tBTA_GATTC_CLCB *p_clcb = NULL; tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if); UNUSED(p_cb); - if (p_clreg != NULL) - { - if (p_msg->api_conn.is_direct) - { + if (p_clreg != NULL) { + if (p_msg->api_conn.is_direct) { if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if, p_msg->api_conn.remote_bda, - p_msg->api_conn.transport)) != NULL) - { + p_msg->api_conn.transport)) != NULL) { bta_gattc_sm_execute(p_clcb, event, p_msg); - } - else - { + } else { APPL_TRACE_ERROR("No resources to open a new connection."); bta_gattc_send_open_cback(p_clreg, @@ -364,16 +326,12 @@ void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) BTA_GATT_INVALID_CONN_ID, p_msg->api_conn.transport, 0); } - } - else - { + } else { bta_gattc_init_bk_conn(&p_msg->api_conn, p_clreg); } - } - else - { + } else { APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d", - p_msg->api_conn.client_if); + p_msg->api_conn.client_if); } } /******************************************************************************* @@ -385,7 +343,7 @@ void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) ** Returns void ** *******************************************************************************/ -void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) +void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { UINT16 event = ((BT_HDR *)p_msg)->event; tBTA_GATTC_CLCB *p_clcb = NULL; @@ -393,29 +351,22 @@ void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p tBTA_GATTC cb_data; UNUSED(p_cb); - if (p_msg->api_cancel_conn.is_direct) - { + if (p_msg->api_cancel_conn.is_direct) { if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if, - p_msg->api_cancel_conn.remote_bda, - BTA_GATT_TRANSPORT_LE)) != NULL) - { + p_msg->api_cancel_conn.remote_bda, + BTA_GATT_TRANSPORT_LE)) != NULL) { bta_gattc_sm_execute(p_clcb, event, p_msg); - } - else - { + } else { APPL_TRACE_ERROR("No such connection need to be cancelled"); p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if); - if (p_clreg && p_clreg->p_cback) - { + if (p_clreg && p_clreg->p_cback) { cb_data.status = BTA_GATT_ERROR; (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data); } } - } - else - { + } else { bta_gattc_cancel_bk_conn(&p_msg->api_cancel_conn); } @@ -438,8 +389,7 @@ void bta_gattc_process_enc_cmpl(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) p_clreg = bta_gattc_cl_get_regcb(p_msg->enc_cmpl.client_if); - if (p_clreg && p_clreg->p_cback) - { + if (p_clreg && p_clreg->p_cback) { memset(&cb_data, 0, sizeof(tBTA_GATTC)); cb_data.enc_cmpl.client_if = p_msg->enc_cmpl.client_if; @@ -463,10 +413,11 @@ void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_dat tBTA_GATTC cb_data; UNUSED(p_data); - cb_data.status=BTA_GATT_ERROR; + cb_data.status = BTA_GATT_ERROR; - if ( p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback ) + if ( p_clcb && p_clcb->p_rcb && p_clcb->p_rcb->p_cback ) { (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data); + } } /******************************************************************************* @@ -529,20 +480,16 @@ void bta_gattc_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) /* open/hold a connection */ if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, - TRUE, p_data->api_conn.transport)) - { + TRUE, p_data->api_conn.transport)) { APPL_TRACE_ERROR("Connection open failure"); bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data); - } - else - { + } else { /* a connected remote device */ if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, &p_clcb->bta_conn_id, - p_data->api_conn.transport)) - { + p_data->api_conn.transport)) { gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id; bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data); @@ -566,30 +513,24 @@ void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg tBTA_GATTC_CLCB *p_clcb; tBTA_GATTC_DATA gattc_data; - if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE)) - { + if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE)) { /* always call open to hold a connection */ - if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE, p_data->transport)) - { + if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE, p_data->transport)) { uint8_t *bda = (uint8_t *)p_data->remote_bda; status = BTA_GATT_ERROR; APPL_TRACE_ERROR("%s unable to connect to remote bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); - } - else - { + } else { status = BTA_GATT_OK; /* if is a connected remote device */ if (GATT_GetConnIdIfConnected(p_data->client_if, p_data->remote_bda, &conn_id, - p_data->transport)) - { + p_data->transport)) { if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda, - BTA_GATT_TRANSPORT_LE)) != NULL) - { + BTA_GATT_TRANSPORT_LE)) != NULL) { gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id; /* open connection */ @@ -601,10 +542,9 @@ void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg } /* open failure, report OPEN_EVT */ - if (status != BTA_GATT_OK) - { + if (status != BTA_GATT_OK) { bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda, - BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE, 0); + BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE, 0); } } /******************************************************************************* @@ -623,21 +563,16 @@ void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data) cb_data.status = BTA_GATT_ERROR; /* remove the device from the bg connection mask */ - if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, FALSE, FALSE)) - { - if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, FALSE)) - { + if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, FALSE, FALSE)) { + if (GATT_CancelConnect(p_data->client_if, p_data->remote_bda, FALSE)) { cb_data.status = BTA_GATT_OK; - } - else - { + } else { APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed"); } } p_clreg = bta_gattc_cl_get_regcb(p_data->client_if); - if (p_clreg && p_clreg->p_cback) - { + if (p_clreg && p_clreg->p_cback) { (*p_clreg->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data); } @@ -656,8 +591,7 @@ void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tBTA_GATTC cb_data; UNUSED(p_data); - if ( p_clcb->p_rcb->p_cback ) - { + if ( p_clcb->p_rcb->p_cback ) { cb_data.status = BTA_GATT_OK; (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data); } @@ -677,14 +611,10 @@ void bta_gattc_cancel_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATTC cb_data; - if (GATT_CancelConnect(p_clcb->p_rcb->client_if, p_data->api_cancel_conn.remote_bda, TRUE)) - { + if (GATT_CancelConnect(p_clcb->p_rcb->client_if, p_data->api_cancel_conn.remote_bda, TRUE)) { bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, p_data); - } - else - { - if ( p_clcb->p_rcb->p_cback ) - { + } else { + if ( p_clcb->p_rcb->p_cback ) { cb_data.status = BTA_GATT_ERROR; (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CANCEL_OPEN_EVT, &cb_data); } @@ -702,51 +632,47 @@ void bta_gattc_cancel_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) void bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATTC_IF gatt_if; - APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state); + APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d", p_clcb->p_srcb->state); - if (p_data != NULL) - { - APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific); + if (p_data != NULL) { + APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d", p_data->hdr.layer_specific); p_clcb->bta_conn_id = p_data->int_conn.hdr.layer_specific; GATT_GetConnectionInfor(p_data->hdr.layer_specific, &gatt_if, p_clcb->bda, &p_clcb->transport); } - p_clcb->p_srcb->connected = TRUE; + p_clcb->p_srcb->connected = TRUE; - if (p_clcb->p_srcb->mtu == 0) - p_clcb->p_srcb->mtu = GATT_DEF_BLE_MTU_SIZE; + if (p_clcb->p_srcb->mtu == 0) { + p_clcb->p_srcb->mtu = GATT_DEF_BLE_MTU_SIZE; + } - /* start database cache if needed */ - if (p_clcb->p_srcb->p_srvc_cache == NULL || - p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE) - { - if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) - { - p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD; - bta_gattc_sm_execute(p_clcb, BTA_GATTC_START_CACHE_EVT, NULL); - } - else /* cache is building */ - p_clcb->state = BTA_GATTC_DISCOVER_ST; + /* start database cache if needed */ + if (p_clcb->p_srcb->p_srvc_cache == NULL || + p_clcb->p_srcb->state != BTA_GATTC_SERV_IDLE) { + if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) { + p_clcb->p_srcb->state = BTA_GATTC_SERV_LOAD; + bta_gattc_sm_execute(p_clcb, BTA_GATTC_START_CACHE_EVT, NULL); + } else { /* cache is building */ + p_clcb->state = BTA_GATTC_DISCOVER_ST; } + } - else - { - /* a pending service handle change indication */ - if (p_clcb->p_srcb->srvc_hdl_chg) - { - p_clcb->p_srcb->srvc_hdl_chg = FALSE; - /* start discovery */ - bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); - } + else { + /* a pending service handle change indication */ + if (p_clcb->p_srcb->srvc_hdl_chg) { + p_clcb->p_srcb->srvc_hdl_chg = FALSE; + /* start discovery */ + bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); } + } - if (p_clcb->p_rcb) - { + if (p_clcb->p_rcb) { /* there is no RM for GATT */ - if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) + if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) { bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda); + } bta_gattc_send_open_cback(p_clcb->p_rcb, BTA_GATT_OK, @@ -754,8 +680,8 @@ void bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) p_clcb->bta_conn_id, p_clcb->transport, p_clcb->p_srcb->mtu); - } } +} /******************************************************************************* ** ** Function bta_gattc_close_fail @@ -769,8 +695,7 @@ void bta_gattc_close_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATTC cb_data; - if ( p_clcb->p_rcb->p_cback ) - { + if ( p_clcb->p_rcb->p_cback ) { memset(&cb_data, 0, sizeof(tBTA_GATTC)); cb_data.close.client_if = p_clcb->p_rcb->client_if; cb_data.close.conn_id = p_data->hdr.layer_specific; @@ -797,7 +722,7 @@ void bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tBTA_GATTC_RCB *p_clreg = p_clcb->p_rcb; tBTA_GATTC cb_data; - APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id); + APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d", p_clcb->bta_conn_id); cb_data.close.client_if = p_clcb->p_rcb->client_if; cb_data.close.conn_id = p_clcb->bta_conn_id; @@ -805,26 +730,24 @@ void bta_gattc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) cb_data.close.status = p_clcb->status; bdcpy(cb_data.close.remote_bda, p_clcb->bda); - if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) - bta_sys_conn_close( BTA_ID_GATTC ,BTA_ALL_APP_ID, p_clcb->bda); + if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) { + bta_sys_conn_close( BTA_ID_GATTC , BTA_ALL_APP_ID, p_clcb->bda); + } bta_gattc_clcb_dealloc(p_clcb); - if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT) - { + if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT) { cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific); - } - else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT) - { + } else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT) { cb_data.close.status = p_data->int_conn.reason; cb_data.close.reason = p_data->int_conn.reason; } - if(p_cback) + if (p_cback) { (* p_cback)(BTA_GATTC_CLOSE_EVT, (tBTA_GATTC *)&cb_data); + } - if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending) - { + if (p_clreg->num_clcb == 0 && p_clreg->dereg_pending) { bta_gattc_deregister_cmpl(p_clreg); } } @@ -842,10 +765,8 @@ void bta_gattc_reset_discover_st(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_STATUS statu tBTA_GATTC_CB *p_cb = &bta_gattc_cb; UINT8 i; - for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) - { - if (p_cb->clcb[i].p_srcb == p_srcb) - { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) { + if (p_cb->clcb[i].p_srcb == p_srcb) { p_cb->clcb[i].status = status; bta_gattc_sm_execute(&p_cb->clcb[i], BTA_GATTC_DISCOVER_CMPL_EVT, NULL); } @@ -865,16 +786,16 @@ void bta_gattc_disc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) APPL_TRACE_DEBUG("%s: Discovery cancel conn_id=%d", __func__, p_clcb->bta_conn_id); - if (p_clcb->disc_active) + if (p_clcb->disc_active) { bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR); - else + } else { p_clcb->state = BTA_GATTC_CONN_ST; + } // This function only gets called as the result of a BTA_GATTC_API_CLOSE_EVT // while in the BTA_GATTC_DISCOVER_ST state. Once the state changes, the // connection itself still needs to be closed to resolve the original event. - if (p_clcb->state == BTA_GATTC_CONN_ST) - { + if (p_clcb->state == BTA_GATTC_CONN_ST) { APPL_TRACE_DEBUG("State is back to BTA_GATTC_CONN_ST. " "Trigger connection close"); bta_gattc_close(p_clcb, p_data); @@ -898,10 +819,8 @@ void bta_gattc_set_discover_st(tBTA_GATTC_SERV *p_srcb) #if BLE_INCLUDED == TRUE L2CA_EnableUpdateBleConnParams(p_srcb->server_bda, FALSE); #endif - for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) - { - if (p_cb->clcb[i].p_srcb == p_srcb) - { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++) { + if (p_cb->clcb[i].p_srcb == p_srcb) { p_cb->clcb[i].status = BTA_GATT_OK; p_cb->clcb[i].state = BTA_GATTC_DISCOVER_ST; } @@ -939,16 +858,15 @@ void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATT_STATUS status; - if (bta_gattc_enqueue(p_clcb, p_data)) - { + if (bta_gattc_enqueue(p_clcb, p_data)) { status = GATTC_ConfigureMTU (p_clcb->bta_conn_id, p_data->api_mtu.mtu); /* if failed, return callback here */ - if (status != GATT_SUCCESS && status != GATT_CMD_STARTED) - { + if (status != GATT_SUCCESS && status != GATT_CMD_STARTED) { /* Dequeue the data, if it was enqueued */ - if (p_clcb->p_q_cmd == p_data) + if (p_clcb->p_q_cmd == p_data) { p_clcb->p_q_cmd = NULL; + } bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_CONFIG, status, NULL); } @@ -968,53 +886,49 @@ void bta_gattc_start_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) UNUSED(p_data); APPL_TRACE_DEBUG("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ", - p_clcb->bta_conn_id, p_clcb->p_srcb->state); + p_clcb->bta_conn_id, p_clcb->p_srcb->state); if (((p_clcb->p_q_cmd == NULL || p_clcb->auto_update == BTA_GATTC_REQ_WAITING) && - p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) || - p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC) - /* no pending operation, start discovery right away */ + p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) || + p_clcb->p_srcb->state == BTA_GATTC_SERV_DISC) + /* no pending operation, start discovery right away */ { p_clcb->auto_update = BTA_GATTC_NO_SCHEDULE; - if (p_clcb->p_srcb != NULL) - { + if (p_clcb->p_srcb != NULL) { /* clear the service change mask */ p_clcb->p_srcb->srvc_hdl_chg = FALSE; p_clcb->p_srcb->update_count = 0; p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT; - if (p_clcb->transport == BTA_TRANSPORT_LE) + if (p_clcb->transport == BTA_TRANSPORT_LE) { L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, FALSE); + } /* set all srcb related clcb into discovery ST */ bta_gattc_set_discover_st(p_clcb->p_srcb); - if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK) - { + if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK) { p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id, - p_clcb->p_srcb, GATT_DISC_SRVC_ALL); + p_clcb->p_srcb, GATT_DISC_SRVC_ALL); } - if (p_clcb->status != BTA_GATT_OK) - { + if (p_clcb->status != BTA_GATT_OK) { APPL_TRACE_ERROR("discovery on server failed"); bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status); - } - else + } else { p_clcb->disc_active = TRUE; - } - else - { + } + } else { APPL_TRACE_ERROR("unknown device, can not start discovery"); } } /* pending operation, wait until it finishes */ - else - { + else { p_clcb->auto_update = BTA_GATTC_DISC_WAITING; - if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) - p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */ + if (p_clcb->p_srcb->state == BTA_GATTC_SERV_IDLE) { + p_clcb->state = BTA_GATTC_CONN_ST; /* set clcb state */ + } } } @@ -1032,22 +946,20 @@ void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd; UNUSED(p_data); - APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id); + APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d", p_clcb->bta_conn_id); #if BLE_INCLUDED == TRUE - if(p_clcb->transport == BTA_TRANSPORT_LE) + if (p_clcb->transport == BTA_TRANSPORT_LE) { L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE); + } #endif p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE; p_clcb->disc_active = FALSE; - if (p_clcb->status != GATT_SUCCESS) - { + if (p_clcb->status != GATT_SUCCESS) { /* clean up cache */ - if(p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) - { - while (!GKI_queue_is_empty(&p_clcb->p_srcb->cache_buffer)) - { + if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) { + while (!GKI_queue_is_empty(&p_clcb->p_srcb->cache_buffer)) { GKI_freebuf (GKI_dequeue (&p_clcb->p_srcb->cache_buffer)); } p_clcb->p_srcb->p_srvc_cache = NULL; @@ -1059,14 +971,12 @@ void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) /* release pending attribute list buffer */ utl_freebuf((void **)&p_clcb->p_srcb->p_srvc_list); - if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) - { + if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) { /* start discovery again */ bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); } /* get any queued command to proceed */ - else if (p_q_cmd != NULL) - { + else if (p_q_cmd != NULL) { p_clcb->p_q_cmd = NULL; bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd); @@ -1094,19 +1004,15 @@ void bta_gattc_read(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tGATT_READ_PARAM read_param; tBTA_GATT_STATUS status; - memset (&read_param, 0 ,sizeof(tGATT_READ_PARAM)); + memset (&read_param, 0 , sizeof(tGATT_READ_PARAM)); - if (bta_gattc_enqueue(p_clcb, p_data)) - { + if (bta_gattc_enqueue(p_clcb, p_data)) { if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, &p_data->api_read.srvc_id, &p_data->api_read.char_id, - p_data->api_read.p_descr_type)) == 0) - { + p_data->api_read.p_descr_type)) == 0) { status = BTA_GATT_ERROR; - } - else - { + } else { read_param.by_handle.handle = handle; read_param.by_handle.auth_req = p_data->api_read.auth_req; @@ -1114,11 +1020,11 @@ void bta_gattc_read(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) } /* read fail */ - if (status != BTA_GATT_OK) - { + if (status != BTA_GATT_OK) { /* Dequeue the data, if it was enqueued */ - if (p_clcb->p_q_cmd == p_data) + if (p_clcb->p_q_cmd == p_data) { p_clcb->p_q_cmd = NULL; + } bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status, NULL); } @@ -1139,43 +1045,34 @@ void bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tGATT_READ_PARAM read_param; tBTA_GATTC_ATTR_ID *p_id; - if (bta_gattc_enqueue(p_clcb, p_data)) - { + if (bta_gattc_enqueue(p_clcb, p_data)) { memset(&read_param, 0, sizeof(tGATT_READ_PARAM)); p_id = p_data->api_read_multi.p_id_list; - for (i = 0; i < p_data->api_read_multi.num_attr && p_id; i ++, p_id ++) - { + for (i = 0; i < p_data->api_read_multi.num_attr && p_id; i ++, p_id ++) { handle = 0; - if (p_id->id_type == BTA_GATT_TYPE_CHAR) - { + if (p_id->id_type == BTA_GATT_TYPE_CHAR) { handle = bta_gattc_id2handle(p_clcb->p_srcb, - &p_id->id_value.char_id.srvc_id, - &p_id->id_value.char_id.char_id, - NULL); - } - else if (p_id->id_type == BTA_GATT_TYPE_CHAR_DESCR) - { + &p_id->id_value.char_id.srvc_id, + &p_id->id_value.char_id.char_id, + NULL); + } else if (p_id->id_type == BTA_GATT_TYPE_CHAR_DESCR) { handle = bta_gattc_id2handle(p_clcb->p_srcb, - &p_id->id_value.char_descr_id.char_id.srvc_id, - &p_id->id_value.char_descr_id.char_id.char_id, - &p_id->id_value.char_descr_id.descr_id); - } - else - { + &p_id->id_value.char_descr_id.char_id.srvc_id, + &p_id->id_value.char_descr_id.char_id.char_id, + &p_id->id_value.char_descr_id.descr_id); + } else { APPL_TRACE_ERROR("invalud ID type: %d", p_id->id_type); } - if (handle == 0) - { + if (handle == 0) { status = BTA_GATT_ERROR; break; } } - if (status == BTA_GATT_OK) - { + if (status == BTA_GATT_OK) { read_param.read_multiple.num_handles = p_data->api_read_multi.num_attr; read_param.read_multiple.auth_req = p_data->api_read_multi.auth_req; @@ -1183,11 +1080,11 @@ void bta_gattc_read_multi(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) } /* read fail */ - if (status != BTA_GATT_OK) - { + if (status != BTA_GATT_OK) { /* Dequeue the data, if it was enqueued */ - if (p_clcb->p_q_cmd == p_data) + if (p_clcb->p_q_cmd == p_data) { p_clcb->p_q_cmd = NULL; + } bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_READ, status, NULL); } @@ -1208,34 +1105,31 @@ void bta_gattc_write(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) tGATT_VALUE attr = {0}; tBTA_GATT_STATUS status = BTA_GATT_OK; - if (bta_gattc_enqueue(p_clcb, p_data)) - { + if (bta_gattc_enqueue(p_clcb, p_data)) { if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, &p_data->api_write.srvc_id, &p_data->api_write.char_id, - p_data->api_write.p_descr_type)) == 0) - { + p_data->api_write.p_descr_type)) == 0) { status = BTA_GATT_ERROR; - } - else - { - attr.handle= handle; + } else { + attr.handle = handle; attr.offset = p_data->api_write.offset; attr.len = p_data->api_write.len; attr.auth_req = p_data->api_write.auth_req; - if (p_data->api_write.p_value) + if (p_data->api_write.p_value) { memcpy(attr.value, p_data->api_write.p_value, p_data->api_write.len); + } status = GATTC_Write(p_clcb->bta_conn_id, p_data->api_write.write_type, &attr); } /* write fail */ - if (status != BTA_GATT_OK) - { + if (status != BTA_GATT_OK) { /* Dequeue the data, if it was enqueued */ - if (p_clcb->p_q_cmd == p_data) + if (p_clcb->p_q_cmd == p_data) { p_clcb->p_q_cmd = NULL; + } bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_WRITE, status, NULL); } @@ -1253,15 +1147,14 @@ void bta_gattc_execute(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATT_STATUS status; - if (bta_gattc_enqueue(p_clcb, p_data)) - { + if (bta_gattc_enqueue(p_clcb, p_data)) { status = GATTC_ExecuteWrite(p_clcb->bta_conn_id, p_data->api_exec.is_execute); - if (status != BTA_GATT_OK) - { + if (status != BTA_GATT_OK) { /* Dequeue the data, if it was enqueued */ - if (p_clcb->p_q_cmd == p_data) + if (p_clcb->p_q_cmd == p_data) { p_clcb->p_q_cmd = NULL; + } bta_gattc_cmpl_sendmsg(p_clcb->bta_conn_id, GATTC_OPTYPE_EXE_WRITE, status, NULL); } @@ -1283,22 +1176,15 @@ void bta_gattc_confirm(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) if ((handle = bta_gattc_id2handle(p_clcb->p_srcb, &p_data->api_confirm.srvc_id, &p_data->api_confirm.char_id, - NULL)) == 0) - { + NULL)) == 0) { APPL_TRACE_ERROR("Can not map service/char ID into valid handle"); - } - else - { + } else { if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle) - != GATT_SUCCESS) - { + != GATT_SUCCESS) { APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle); - } - else - { + } else { /* if over BR_EDR, inform PM for mode change */ - if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) - { + if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) { bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda); bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda); } @@ -1325,29 +1211,23 @@ void bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) cb_data.read.status = p_data->status; - if (p_data->p_cmpl != NULL && p_data->status == BTA_GATT_OK) - { + if (p_data->p_cmpl != NULL && p_data->status == BTA_GATT_OK) { if (bta_gattc_handle2id(p_clcb->p_srcb, p_data->p_cmpl->att_value.handle, &cb_data.read.srvc_id, &cb_data.read.char_id, - &cb_data.read.descr_type) == FALSE) - { + &cb_data.read.descr_type) == FALSE) { cb_data.read.status = BTA_GATT_INTERNAL_ERROR; APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x", - p_data->p_cmpl->att_value.handle); - } - else - { + p_data->p_cmpl->att_value.handle); + } else { cb_data.read.status = bta_gattc_pack_read_cb_data(p_clcb->p_srcb, - &cb_data.read.descr_type.uuid, - &p_data->p_cmpl->att_value, - &read_value); + &cb_data.read.descr_type.uuid, + &p_data->p_cmpl->att_value, + &read_value); cb_data.read.p_value = &read_value; } - } - else - { + } else { cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id; cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id; if (p_clcb->p_q_cmd->api_read.p_descr_type) @@ -1356,7 +1236,7 @@ void bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) } event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ? - BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT; + BTA_GATTC_READ_CHAR_EVT : BTA_GATTC_READ_DESCR_EVT; cb_data.read.conn_id = p_clcb->bta_conn_id; utl_freebuf((void **)&p_clcb->p_q_cmd); @@ -1382,34 +1262,36 @@ void bta_gattc_write_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) cb_data.write.status = p_data->status; - if (p_data->p_cmpl != NULL) - { + if (p_data->p_cmpl != NULL) { bta_gattc_handle2id(p_clcb->p_srcb, p_data->p_cmpl->att_value.handle, &cb_data.write.srvc_id, &cb_data.write.char_id, &cb_data.write.descr_type); - } - else - { + } else { memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id, - sizeof(tBTA_GATT_SRVC_ID)); + sizeof(tBTA_GATT_SRVC_ID)); memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id, - sizeof(tBTA_GATT_ID)); + sizeof(tBTA_GATT_ID)); if (p_clcb->p_q_cmd->api_write.p_descr_type) memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type, sizeof(tBTA_GATT_ID)); } if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT && - p_clcb->p_q_cmd->api_write.write_type == BTA_GATTC_WRITE_PREPARE) + p_clcb->p_q_cmd->api_write.write_type == BTA_GATTC_WRITE_PREPARE) + { event = BTA_GATTC_PREP_WRITE_EVT; + } else if (p_clcb->p_q_cmd->api_write.p_descr_type == NULL) + { event = BTA_GATTC_WRITE_CHAR_EVT; + } - else + else { event = BTA_GATTC_WRITE_DESCR_EVT; + } utl_freebuf((void **)&p_clcb->p_q_cmd); cb_data.write.conn_id = p_clcb->bta_conn_id; @@ -1458,8 +1340,9 @@ void bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) utl_freebuf((void **)&p_clcb->p_q_cmd); - if (p_data->p_cmpl && p_data->status == BTA_GATT_OK) + if (p_data->p_cmpl && p_data->status == BTA_GATT_OK) { p_clcb->p_srcb->mtu = p_data->p_cmpl->mtu; + } /* configure MTU complete, callback */ p_clcb->status = p_data->status; @@ -1486,55 +1369,54 @@ void bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op); - if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION) - { + if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION) { APPL_TRACE_ERROR("unexpected operation, ignored"); - } - else if (op >= GATTC_OPTYPE_READ) - { - if (p_clcb->p_q_cmd == NULL) - { + } else if (op >= GATTC_OPTYPE_READ) { + if (p_clcb->p_q_cmd == NULL) { APPL_TRACE_ERROR("No pending command"); return; } - if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) - { + if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) { mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ; - if ( mapped_op > GATTC_OPTYPE_INDICATION) mapped_op = 0; + if ( mapped_op > GATTC_OPTYPE_INDICATION) { + mapped_op = 0; + } #if (BT_TRACE_VERBOSE == TRUE) APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).", - bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event, - bta_gattc_op_code_name[op]); + bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event, + bta_gattc_op_code_name[op]); #else APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).", - mapped_op , p_clcb->p_q_cmd->hdr.event, op); + mapped_op , p_clcb->p_q_cmd->hdr.event, op); #endif return; } /* discard responses if service change indication is received before operation completed */ - if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING && p_clcb->p_srcb->srvc_hdl_chg) - { + if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING && p_clcb->p_srcb->srvc_hdl_chg) { APPL_TRACE_DEBUG("Discard all responses when service change indication is received."); p_data->op_cmpl.status = GATT_ERROR; } /* service handle change void the response, discard it */ - if (op == GATTC_OPTYPE_READ) + if (op == GATTC_OPTYPE_READ) { bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl); + } - else if (op == GATTC_OPTYPE_WRITE) + else if (op == GATTC_OPTYPE_WRITE) { bta_gattc_write_cmpl(p_clcb, &p_data->op_cmpl); + } - else if (op == GATTC_OPTYPE_EXE_WRITE) + else if (op == GATTC_OPTYPE_EXE_WRITE) { bta_gattc_exec_cmpl(p_clcb, &p_data->op_cmpl); + } - else if (op == GATTC_OPTYPE_CONFIG) + else if (op == GATTC_OPTYPE_CONFIG) { bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl); + } - if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) - { + if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING) { p_clcb->auto_update = BTA_GATTC_REQ_WAITING; bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); } @@ -1571,9 +1453,8 @@ void bta_gattc_search(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { tBTA_GATT_STATUS status = GATT_INTERNAL_ERROR; tBTA_GATTC cb_data; - APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id); - if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) - { + APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d", p_clcb->bta_conn_id); + if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache) { status = BTA_GATT_OK; /* search the local cache of a server device */ bta_gattc_search_service(p_clcb, p_data->api_search.p_srvc_uuid); @@ -1613,7 +1494,7 @@ void bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) bta_gattc_set_discover_st(p_clcb->p_srcb); - APPL_TRACE_DEBUG("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id); + APPL_TRACE_DEBUG("bta_gattc_cache_open conn_id=%d", p_clcb->bta_conn_id); bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT, p_clcb->bta_conn_id, FALSE); } @@ -1629,35 +1510,27 @@ void bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) void bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { APPL_TRACE_DEBUG("bta_gattc_ci_open conn_id=%d server state=%d" , - p_clcb->bta_conn_id, p_clcb->p_srcb->state); - if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD) - { - if (p_data->ci_open.status == BTA_GATT_OK) - { + p_clcb->bta_conn_id, p_clcb->p_srcb->state); + if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD) { + if (p_data->ci_open.status == BTA_GATT_OK) { p_clcb->p_srcb->attr_index = 0; bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_LOAD_EVT, p_clcb->p_srcb->attr_index, p_clcb->bta_conn_id); - } - else - { + } else { p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC; /* cache open failure, start discovery */ bta_gattc_start_discover(p_clcb, NULL); } } - if (p_clcb->p_srcb->state == BTA_GATTC_SERV_SAVE) - { - if (p_data->ci_open.status == BTA_GATT_OK) - { - if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) - { + if (p_clcb->p_srcb->state == BTA_GATTC_SERV_SAVE) { + if (p_data->ci_open.status == BTA_GATT_OK) { + if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) { p_data->ci_open.status = BTA_GATT_ERROR; } } - if (p_data->ci_open.status != BTA_GATT_OK) - { + if (p_data->ci_open.status != BTA_GATT_OK) { p_clcb->p_srcb->attr_index = 0; bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, p_clcb->bta_conn_id); bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status); @@ -1678,23 +1551,19 @@ void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { APPL_TRACE_DEBUG("bta_gattc_ci_load conn_id=%d load status=%d", - p_clcb->bta_conn_id, p_data->ci_load.status); + p_clcb->bta_conn_id, p_data->ci_load.status); if (p_data->ci_load.status == BTA_GATT_OK || - p_data->ci_load.status == BTA_GATT_MORE) - { + p_data->ci_load.status == BTA_GATT_MORE) { if (p_data->ci_load.num_attr != 0) bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr, - p_data->ci_load.attr, p_clcb->p_srcb->attr_index); + p_data->ci_load.attr, p_clcb->p_srcb->attr_index); - if (p_data->ci_load.status == BTA_GATT_OK) - { + if (p_data->ci_load.status == BTA_GATT_OK) { p_clcb->p_srcb->attr_index = 0; bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK); bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0); - } - else /* load more */ - { + } else { /* load more */ p_clcb->p_srcb->attr_index += p_data->ci_load.num_attr; bta_gattc_co_cache_load(p_clcb->p_srcb->server_bda, @@ -1702,9 +1571,7 @@ void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) p_clcb->p_srcb->attr_index, p_clcb->bta_conn_id); } - } - else - { + } else { bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0); p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC; p_clcb->p_srcb->attr_index = 0; @@ -1726,10 +1593,9 @@ void bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) UNUSED(p_data); APPL_TRACE_DEBUG("bta_gattc_ci_save conn_id=%d " , - p_clcb->bta_conn_id ); + p_clcb->bta_conn_id ); - if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) - { + if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id)) { p_clcb->p_srcb->attr_index = 0; bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0); bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status); @@ -1748,8 +1614,7 @@ void bta_gattc_fail(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { UNUSED(p_data); - if (p_clcb->status == BTA_GATT_OK) - { + if (p_clcb->status == BTA_GATT_OK) { APPL_TRACE_ERROR("operation not supported at current state [%d]", p_clcb->state); } } @@ -1780,10 +1645,11 @@ static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg) if (p_cback) /* callback with de-register event */ - (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC *)&cb_data); - - if (bta_gattc_num_reg_app() == 0 && p_cb->state == BTA_GATTC_STATE_DISABLING) { + (*p_cback)(BTA_GATTC_DEREG_EVT, (tBTA_GATTC *)&cb_data); + } + + if (bta_gattc_num_reg_app() == 0 && p_cb->state == BTA_GATTC_STATE_DISABLING) { p_cb->state = BTA_GATTC_STATE_DISABLED; } } @@ -1802,10 +1668,9 @@ static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id, { tBTA_GATTC_DATA *p_buf; - if (reason != 0) - { + if (reason != 0) { APPL_TRACE_WARNING("%s() - cif=%d connected=%d conn_id=%d reason=0x%04x", - __FUNCTION__, gattc_if, connected, conn_id, reason); + __FUNCTION__, gattc_if, connected, conn_id, reason); } bt_bdaddr_t bdaddr; @@ -1816,12 +1681,11 @@ static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id, else btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason); */ - if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL) - { + if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_DATA)); - p_buf->int_conn.hdr.event = connected ? BTA_GATTC_INT_CONN_EVT: - BTA_GATTC_INT_DISCONN_EVT; + p_buf->int_conn.hdr.event = connected ? BTA_GATTC_INT_CONN_EVT : + BTA_GATTC_INT_DISCONN_EVT; p_buf->int_conn.hdr.layer_specific = conn_id; p_buf->int_conn.client_if = gattc_if; p_buf->int_conn.role = L2CA_GetBleConnRole(bda); @@ -1847,8 +1711,7 @@ static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda) tBTA_GATTC_DATA *p_buf; tBTA_GATTC_CLCB *p_clcb = NULL; - if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE)) == NULL) - { + if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE)) == NULL) { return; } @@ -1856,16 +1719,14 @@ static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda) /* filter this event just for BTA HH LE GATT client, In the future, if we want to enable encryption complete event for all GATT clients, we can remove this code */ - if (!bta_hh_le_is_hh_gatt_if(gattc_if)) - { + if (!bta_hh_le_is_hh_gatt_if(gattc_if)) { return; } #endif APPL_TRACE_DEBUG("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if); - if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL) - { + if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_DATA)); p_buf->enc_cmpl.hdr.event = BTA_GATTC_ENC_CMPL_EVT; @@ -1887,7 +1748,7 @@ static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda) ** Returns None. ** *******************************************************************************/ -void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) +void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda); tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0]; @@ -1895,30 +1756,25 @@ void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) UINT8 i; UNUSED(p_cb); - if (p_srvc_cb != NULL) - { + if (p_srvc_cb != NULL) { /* try to find a CLCB */ - if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0) - { - for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) - { - if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb) - { + if (p_srvc_cb->connected && p_srvc_cb->num_clcb != 0) { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) { + if (p_clcb->in_use && p_clcb->p_srcb == p_srvc_cb) { found = TRUE; break; } } - if (found) - { + if (found) { bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); return; } } /* in all other cases, mark it and delete the cache */ - if (p_srvc_cb->p_srvc_cache != NULL) - { - while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) + if (p_srvc_cb->p_srvc_cache != NULL) { + while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) { GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer)); + } p_srvc_cb->p_srvc_cache = NULL; } @@ -1954,26 +1810,21 @@ BOOLEAN bta_gattc_process_srvc_chg_ind(UINT16 conn_id, srvc_chg_uuid.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD; if (bta_gattc_uuid_compare(&p_notify->char_id.srvc_id.id.uuid, &gattp_uuid, TRUE) && - bta_gattc_uuid_compare(&p_notify->char_id.char_id.uuid, &srvc_chg_uuid, TRUE)) - { + bta_gattc_uuid_compare(&p_notify->char_id.char_id.uuid, &srvc_chg_uuid, TRUE)) { processed = TRUE; /* mark service handle change pending */ p_srcb->srvc_hdl_chg = TRUE; /* clear up all notification/indication registration */ bta_gattc_clear_notif_registration(conn_id); /* service change indication all received, do discovery update */ - if ( ++ p_srcb->update_count == bta_gattc_num_reg_app()) - { + if ( ++ p_srcb->update_count == bta_gattc_num_reg_app()) { /* not an opened connection; or connection busy */ /* search for first available clcb and start discovery */ - if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL)) - { - for (i = 0 ; i < BTA_GATTC_CLCB_MAX; i ++) - { + if (p_clcb == NULL || (p_clcb && p_clcb->p_q_cmd != NULL)) { + for (i = 0 ; i < BTA_GATTC_CLCB_MAX; i ++) { if (bta_gattc_cb.clcb[i].in_use && - bta_gattc_cb.clcb[i].p_srcb == p_srcb && - bta_gattc_cb.clcb[i].p_q_cmd == NULL) - { + bta_gattc_cb.clcb[i].p_srcb == p_srcb && + bta_gattc_cb.clcb[i].p_q_cmd == NULL) { p_clcb = &bta_gattc_cb.clcb[i]; break; } @@ -1983,13 +1834,13 @@ BOOLEAN bta_gattc_process_srvc_chg_ind(UINT16 conn_id, GATTC_SendHandleValueConfirm(conn_id, handle); /* if connection available, refresh cache by doing discovery now */ - if (p_clcb != NULL) + if (p_clcb != NULL) { bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL); + } } /* notify applicationf or service change */ - if (p_clrcb->p_cback != NULL) - { - (* p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT, (tBTA_GATTC *)p_srcb->server_bda); + if (p_clrcb->p_cback != NULL) { + (* p_clrcb->p_cback)(BTA_GATTC_SRVC_CHG_EVT, (tBTA_GATTC *)p_srcb->server_bda); } } @@ -2012,8 +1863,8 @@ void bta_gattc_proc_other_indication(tBTA_GATTC_CLCB *p_clcb, UINT8 op, { APPL_TRACE_DEBUG("bta_gattc_proc_other_indication check \ p_data->att_value.handle=%d p_data->handle=%d", - p_data->att_value.handle, p_data->handle); - APPL_TRACE_DEBUG("is_notify", p_notify->is_notify); + p_data->att_value.handle, p_data->handle); + APPL_TRACE_DEBUG("is_notify %d", p_notify->is_notify); p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE; p_notify->len = p_data->att_value.len; @@ -2021,8 +1872,9 @@ void bta_gattc_proc_other_indication(tBTA_GATTC_CLCB *p_clcb, UINT8 op, memcpy(p_notify->value, p_data->att_value.value, p_data->att_value.len); p_notify->conn_id = p_clcb->bta_conn_id; - if (p_clcb->p_rcb->p_cback) + if (p_clcb->p_rcb->p_cback) { (*p_clcb->p_rcb->p_cback)(BTA_GATTC_NOTIF_EVT, (tBTA_GATTC *)p_notify); + } } /******************************************************************************* @@ -2045,27 +1897,27 @@ void bta_gattc_process_indicate(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_CL_COMPL tBTA_GATTC_IF gatt_if; tBTA_TRANSPORT transport; - if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) - { + if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) { APPL_TRACE_ERROR("%s indication/notif for unknown app", __func__); - if (op == GATTC_OPTYPE_INDICATION) + if (op == GATTC_OPTYPE_INDICATION) { GATTC_SendHandleValueConfirm(conn_id, handle); + } return; } - if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL) - { + if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL) { APPL_TRACE_ERROR("%s indication/notif for unregistered app", __func__); - if (op == GATTC_OPTYPE_INDICATION) + if (op == GATTC_OPTYPE_INDICATION) { GATTC_SendHandleValueConfirm(conn_id, handle); + } return; } - if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) - { + if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) { APPL_TRACE_ERROR("%s indication/notif for unknown device, ignore", __func__); - if (op == GATTC_OPTYPE_INDICATION) + if (op == GATTC_OPTYPE_INDICATION) { GATTC_SendHandleValueConfirm(conn_id, handle); + } return; } @@ -2074,47 +1926,39 @@ void bta_gattc_process_indicate(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_CL_COMPL if (bta_gattc_handle2id(p_srcb, handle, ¬ify.char_id.srvc_id, ¬ify.char_id.char_id, - ¬ify.descr_type)) - { + ¬ify.descr_type)) { /* if non-service change indication/notification, forward to application */ - if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, ¬ify, handle)) - { + if (!bta_gattc_process_srvc_chg_ind(conn_id, p_clrcb, p_srcb, p_clcb, ¬ify, handle)) { /* if app registered for the notification */ - if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, ¬ify)) - { + if (bta_gattc_check_notif_registry(p_clrcb, p_srcb, ¬ify)) { /* connection not open yet */ - if (p_clcb == NULL) - { - if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport)) != NULL) - { + if (p_clcb == NULL) { + if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport)) != NULL) { p_clcb->bta_conn_id = conn_id; p_clcb->transport = transport; bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL); - } - else - { + } else { APPL_TRACE_ERROR("No resources"); } } - if (p_clcb != NULL) + if (p_clcb != NULL) { bta_gattc_proc_other_indication(p_clcb, op, p_data, ¬ify); + } } /* no one intersted and need ack? */ - else if (op == GATTC_OPTYPE_INDICATION) - { + else if (op == GATTC_OPTYPE_INDICATION) { APPL_TRACE_DEBUG("%s no one interested, ack now", __func__); GATTC_SendHandleValueConfirm(conn_id, handle); } } - } - else - { + } else { APPL_TRACE_ERROR("%s Indi/Notif for Unknown handle[0x%04x], can not find in local cache.", __func__, handle); - if (op == GATTC_OPTYPE_INDICATION) + if (op == GATTC_OPTYPE_INDICATION) { GATTC_SendHandleValueConfirm(conn_id, handle); + } } } /******************************************************************************* @@ -2131,24 +1975,21 @@ static void bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS { tBTA_GATTC_CLCB *p_clcb; APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d", - conn_id, op, status); + conn_id, op, status); /* notification and indication processed right away */ - if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION) - { + if (op == GATTC_OPTYPE_NOTIFICATION || op == GATTC_OPTYPE_INDICATION) { bta_gattc_process_indicate(conn_id, op, p_data); return; } /* for all other operation, not expected if w/o connection */ - else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL) - { + else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL) { APPL_TRACE_ERROR("bta_gattc_cmpl_cback unknown conn_id = %d, ignore data", conn_id); return; } /* if over BR_EDR, inform PM for mode change */ - if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) - { + if (p_clcb->transport == BTA_TRANSPORT_BR_EDR) { bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda); bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda); } @@ -2172,16 +2013,14 @@ static void bta_gattc_cmpl_sendmsg(UINT16 conn_id, tGATTC_OPTYPE op, const UINT16 len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE); tBTA_GATTC_OP_CMPL *p_buf = (tBTA_GATTC_OP_CMPL *) GKI_getbuf(len); - if (p_buf != NULL) - { + if (p_buf != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTC_OP_CMPL_EVT; p_buf->hdr.layer_specific = conn_id; p_buf->status = status; p_buf->op_code = op; - if (p_data != NULL) - { + if (p_data != NULL) { p_buf->p_cmpl = (tGATT_CL_COMPLETE *)(p_buf + 1); memcpy(p_buf->p_cmpl, p_data, sizeof(tGATT_CL_COMPLETE)); } @@ -2204,10 +2043,8 @@ static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested) tBTA_GATTC_CLCB *p_clcb; tBTA_GATTC cb_data; - if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL) - { - if (p_clcb->p_rcb->p_cback) - { + if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL) { + if (p_clcb->p_rcb->p_cback) { cb_data.congest.conn_id = conn_id; cb_data.congest.congested = congested; @@ -2233,15 +2070,13 @@ void bta_gattc_init_clcb_conn(UINT8 cif, BD_ADDR remote_bda) UINT16 conn_id; /* should always get the connection ID */ - if (GATT_GetConnIdIfConnected(cif, remote_bda, &conn_id, BTA_GATT_TRANSPORT_LE) == FALSE) - { + if (GATT_GetConnIdIfConnected(cif, remote_bda, &conn_id, BTA_GATT_TRANSPORT_LE) == FALSE) { APPL_TRACE_ERROR("bta_gattc_init_clcb_conn ERROR: not a connected device"); return; } /* initaite a new connection here */ - if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda, BTA_GATT_TRANSPORT_LE)) != NULL) - { + if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda, BTA_GATT_TRANSPORT_LE)) != NULL) { gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id; gattc_data.api_conn.client_if = cif; @@ -2249,9 +2084,7 @@ void bta_gattc_init_clcb_conn(UINT8 cif, BD_ADDR remote_bda) gattc_data.api_conn.is_direct = TRUE; bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_OPEN_EVT, &gattc_data); - } - else - { + } else { APPL_TRACE_ERROR("No resources"); } } @@ -2270,12 +2103,9 @@ void bta_gattc_process_listen_all(UINT8 cif) UINT8 i_conn = 0; tBTA_GATTC_CONN *p_conn = &bta_gattc_cb.conn_track[0]; - for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) - { - if (p_conn->in_use ) - { - if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda, BTA_GATT_TRANSPORT_LE) == NULL) - { + for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) { + if (p_conn->in_use ) { + if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda, BTA_GATT_TRANSPORT_LE) == NULL) { bta_gattc_init_clcb_conn(cif, p_conn->remote_bda); } /* else already connected */ @@ -2291,7 +2121,7 @@ void bta_gattc_process_listen_all(UINT8 cif) ** Returns void ** ********************************************************************************/ -void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) +void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if); tBTA_GATTC cb_data; @@ -2300,51 +2130,42 @@ void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) cb_data.reg_oper.status = BTA_GATT_ERROR; cb_data.reg_oper.client_if = p_msg->api_listen.client_if; - if (p_clreg == NULL) - { + if (p_clreg == NULL) { APPL_TRACE_ERROR("bta_gattc_listen failed, unknown client_if: %d", - p_msg->api_listen.client_if); + p_msg->api_listen.client_if); return; } /* mark bg conn record */ if (bta_gattc_mark_bg_conn(p_msg->api_listen.client_if, (BD_ADDR_PTR) p_msg->api_listen.remote_bda, p_msg->api_listen.start, - TRUE)) - { + TRUE)) { if (!GATT_Listen(p_msg->api_listen.client_if, p_msg->api_listen.start, - p_msg->api_listen.remote_bda)) - { + p_msg->api_listen.remote_bda)) { APPL_TRACE_ERROR("Listen failure"); (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data); - } - else - { + } else { cb_data.status = BTA_GATT_OK; (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data); - if (p_msg->api_listen.start) - { + if (p_msg->api_listen.start) { /* if listen to a specific target */ - if (p_msg->api_listen.remote_bda != NULL) - { + if (p_msg->api_listen.remote_bda != NULL) { /* if is a connected remote device */ if (L2CA_GetBleConnRole(p_msg->api_listen.remote_bda) == HCI_ROLE_SLAVE && - bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if, - p_msg->api_listen.remote_bda, - BTA_GATT_TRANSPORT_LE) == NULL) - { + bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if, + p_msg->api_listen.remote_bda, + BTA_GATT_TRANSPORT_LE) == NULL) { bta_gattc_init_clcb_conn(p_msg->api_listen.client_if, - p_msg->api_listen.remote_bda); + p_msg->api_listen.remote_bda); } } /* if listen to all */ - else - { + else { LOG_DEBUG("Listen For All now"); /* go through all connected device and send callback for all connected slave connection */ @@ -2364,7 +2185,7 @@ void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) ** Returns void ** ********************************************************************************/ -void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) +void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg) { tBTA_GATTC_RCB *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if); tBTA_GATTC cb_data; @@ -2373,8 +2194,9 @@ void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg) cb_data.reg_oper.client_if = p_msg->api_listen.client_if; cb_data.reg_oper.status = BTM_BleBroadcast(p_msg->api_listen.start); - if (p_clreg && p_clreg->p_cback) + if (p_clreg && p_clreg->p_cback) { (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data); + } } #endif #endif diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_api.c b/components/bt/bluedroid/bta/gatt/bta_gattc_api.c old mode 100755 new mode 100644 index 150b14a29..628b83b51 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_api.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_api.c @@ -36,8 +36,7 @@ ** Constants *****************************************************************************/ -static const tBTA_SYS_REG bta_gattc_reg = -{ +static const tBTA_SYS_REG bta_gattc_reg = { bta_gattc_hdl_event, BTA_GATTC_Disable }; @@ -58,13 +57,11 @@ void BTA_GATTC_Disable(void) { BT_HDR *p_buf; - if (bta_sys_is_register(BTA_ID_GATTC) == FALSE) - { + if (bta_sys_is_register(BTA_ID_GATTC) == FALSE) { APPL_TRACE_WARNING("GATTC Module not enabled/already disabled\n"); return; } - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTC_API_DISABLE_EVT; bta_sys_sendmsg(p_buf); } @@ -89,16 +86,15 @@ void BTA_GATTC_AppRegister(tBT_UUID *p_app_uuid, tBTA_GATTC_CBACK *p_client_cb) { tBTA_GATTC_API_REG *p_buf; - if (bta_sys_is_register(BTA_ID_GATTC) == FALSE) - { + if (bta_sys_is_register(BTA_ID_GATTC) == FALSE) { bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg); } - if ((p_buf = (tBTA_GATTC_API_REG *) GKI_getbuf(sizeof(tBTA_GATTC_API_REG))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_REG *) GKI_getbuf(sizeof(tBTA_GATTC_API_REG))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_REG_EVT; - if (p_app_uuid != NULL) + if (p_app_uuid != NULL) { memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID)); + } p_buf->p_cback = p_client_cb; bta_sys_sendmsg(p_buf); @@ -122,8 +118,7 @@ void BTA_GATTC_AppDeregister(tBTA_GATTC_IF client_if) { tBTA_GATTC_API_DEREG *p_buf; - if ((p_buf = (tBTA_GATTC_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTC_API_DEREG))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTC_API_DEREG))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_DEREG_EVT; p_buf->client_if = client_if; bta_sys_sendmsg(p_buf); @@ -151,8 +146,7 @@ void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, { tBTA_GATTC_API_OPEN *p_buf; - if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_OPEN_EVT; p_buf->client_if = client_if; @@ -184,8 +178,7 @@ void BTA_GATTC_CancelOpen(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN i { tBTA_GATTC_API_CANCEL_OPEN *p_buf; - if ((p_buf = (tBTA_GATTC_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_CANCEL_OPEN))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_CANCEL_OPEN))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_CANCEL_OPEN_EVT; p_buf->client_if = client_if; @@ -212,8 +205,7 @@ void BTA_GATTC_Close(UINT16 conn_id) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTC_API_CLOSE_EVT; p_buf->layer_specific = conn_id; @@ -240,8 +232,7 @@ void BTA_GATTC_ConfigureMTU (UINT16 conn_id, UINT16 mtu) { tBTA_GATTC_API_CFG_MTU *p_buf; - if ((p_buf = (tBTA_GATTC_API_CFG_MTU *) GKI_getbuf(sizeof(tBTA_GATTC_API_CFG_MTU))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_CFG_MTU *) GKI_getbuf(sizeof(tBTA_GATTC_API_CFG_MTU))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_CFG_MTU_EVT; p_buf->hdr.layer_specific = conn_id; @@ -272,20 +263,18 @@ void BTA_GATTC_ServiceSearchRequest (UINT16 conn_id, tBT_UUID *p_srvc_uuid) tBTA_GATTC_API_SEARCH *p_buf; UINT16 len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID); - if ((p_buf = (tBTA_GATTC_API_SEARCH *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_SEARCH *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTC_API_SEARCH_EVT; p_buf->hdr.layer_specific = conn_id; - if (p_srvc_uuid) - { + if (p_srvc_uuid) { p_buf->p_srvc_uuid = (tBT_UUID *)(p_buf + 1); memcpy(p_buf->p_srvc_uuid, p_srvc_uuid, sizeof(tBT_UUID)); - } - else + } else { p_buf->p_srvc_uuid = NULL; + } bta_sys_sendmsg(p_buf); } @@ -312,19 +301,19 @@ void BTA_GATTC_ServiceSearchRequest (UINT16 conn_id, tBT_UUID *p_srvc_uuid) ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetFirstChar (UINT16 conn_id, tBTA_GATT_SRVC_ID *p_srvc_id, - tBT_UUID *p_char_uuid_cond, - tBTA_GATTC_CHAR_ID *p_char_result, - tBTA_GATT_CHAR_PROP *p_property) + tBT_UUID *p_char_uuid_cond, + tBTA_GATTC_CHAR_ID *p_char_result, + tBTA_GATT_CHAR_PROP *p_property) { tBTA_GATT_STATUS status; - if (!p_srvc_id || !p_char_result) + if (!p_srvc_id || !p_char_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_CHAR, p_srvc_id, NULL, p_char_uuid_cond, &p_char_result->char_id, (void *)p_property)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_char_result->srvc_id, p_srvc_id, sizeof(tBTA_GATT_SRVC_ID)); } @@ -351,15 +340,16 @@ tBTA_GATT_STATUS BTA_GATTC_GetFirstChar (UINT16 conn_id, tBTA_GATT_SRVC_ID *p_s ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetNextChar (UINT16 conn_id, - tBTA_GATTC_CHAR_ID *p_start_char_id, - tBT_UUID *p_char_uuid_cond, - tBTA_GATTC_CHAR_ID *p_char_result, - tBTA_GATT_CHAR_PROP *p_property) + tBTA_GATTC_CHAR_ID *p_start_char_id, + tBT_UUID *p_char_uuid_cond, + tBTA_GATTC_CHAR_ID *p_char_result, + tBTA_GATT_CHAR_PROP *p_property) { tBTA_GATT_STATUS status; - if (!p_start_char_id || !p_char_result) + if (!p_start_char_id || !p_char_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_CHAR, &p_start_char_id->srvc_id, @@ -367,8 +357,7 @@ tBTA_GATT_STATUS BTA_GATTC_GetNextChar (UINT16 conn_id, p_char_uuid_cond, &p_char_result->char_id, (void *) p_property)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_char_result->srvc_id, &p_start_char_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID)); } @@ -393,13 +382,14 @@ tBTA_GATT_STATUS BTA_GATTC_GetNextChar (UINT16 conn_id, ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id, - tBT_UUID *p_descr_uuid_cond, - tBTA_GATTC_CHAR_DESCR_ID *p_descr_result) + tBT_UUID *p_descr_uuid_cond, + tBTA_GATTC_CHAR_DESCR_ID *p_descr_result) { tBTA_GATT_STATUS status; - if (!p_char_id || !p_descr_result) + if (!p_char_id || !p_descr_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } memset(p_descr_result, 0, sizeof(tBTA_GATTC_CHAR_DESCR_ID)); @@ -410,8 +400,7 @@ tBTA_GATT_STATUS BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC_CHAR_I p_descr_uuid_cond, &p_descr_result->char_id.char_id, NULL)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_descr_result->descr_id, &p_descr_result->char_id.char_id, sizeof(tBTA_GATT_ID)); memcpy(&p_descr_result->char_id, p_char_id, sizeof(tBTA_GATTC_CHAR_ID)); } @@ -437,14 +426,15 @@ tBTA_GATT_STATUS BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC_CHAR_I ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetNextCharDescr (UINT16 conn_id, - tBTA_GATTC_CHAR_DESCR_ID *p_start_descr_id, - tBT_UUID *p_descr_uuid_cond, - tBTA_GATTC_CHAR_DESCR_ID *p_descr_result) + tBTA_GATTC_CHAR_DESCR_ID *p_start_descr_id, + tBT_UUID *p_descr_uuid_cond, + tBTA_GATTC_CHAR_DESCR_ID *p_descr_result) { tBTA_GATT_STATUS status; - if (!p_start_descr_id || !p_descr_result) + if (!p_start_descr_id || !p_descr_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } memset(p_descr_result, 0, sizeof(tBTA_GATTC_CHAR_DESCR_ID)); @@ -454,8 +444,7 @@ tBTA_GATT_STATUS BTA_GATTC_GetNextCharDescr (UINT16 conn_id, p_descr_uuid_cond, &p_descr_result->char_id.char_id, (void *)&p_start_descr_id->descr_id)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_descr_result->descr_id, &p_descr_result->char_id.char_id, sizeof(tBTA_GATT_ID)); memcpy(&p_descr_result->char_id, p_start_descr_id, sizeof(tBTA_GATTC_CHAR_ID)); } @@ -482,12 +471,13 @@ tBTA_GATT_STATUS BTA_GATTC_GetNextCharDescr (UINT16 conn_id, ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, tBTA_GATT_SRVC_ID *p_srvc_id, - tBT_UUID *p_uuid_cond, tBTA_GATTC_INCL_SVC_ID *p_result) + tBT_UUID *p_uuid_cond, tBTA_GATTC_INCL_SVC_ID *p_result) { tBTA_GATT_STATUS status; - if (!p_srvc_id || !p_result) + if (!p_srvc_id || !p_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_INCL_SRVC, @@ -496,8 +486,7 @@ tBTA_GATT_STATUS BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, tBTA_GATT_SR p_uuid_cond, &p_result->incl_svc_id.id, (void *)&p_result->incl_svc_id.is_primary)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_result->srvc_id, p_srvc_id, sizeof(tBTA_GATT_SRVC_ID)); } @@ -522,14 +511,15 @@ tBTA_GATT_STATUS BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, tBTA_GATT_SR ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_GetNextIncludedService(UINT16 conn_id, - tBTA_GATTC_INCL_SVC_ID *p_start_id, - tBT_UUID *p_uuid_cond, - tBTA_GATTC_INCL_SVC_ID *p_result) + tBTA_GATTC_INCL_SVC_ID *p_start_id, + tBT_UUID *p_uuid_cond, + tBTA_GATTC_INCL_SVC_ID *p_result) { tBTA_GATT_STATUS status; - if (!p_start_id || !p_result) + if (!p_start_id || !p_result) { return BTA_GATT_ILLEGAL_PARAMETER; + } if ((status = bta_gattc_query_cache(conn_id, BTA_GATTC_ATTR_TYPE_INCL_SRVC, @@ -538,8 +528,7 @@ tBTA_GATT_STATUS BTA_GATTC_GetNextIncludedService(UINT16 conn_id, p_uuid_cond, &p_result->incl_svc_id.id, (void *)&p_result->incl_svc_id.is_primary)) - == BTA_GATT_OK) - { + == BTA_GATT_OK) { memcpy(&p_result->srvc_id, &p_start_id->srvc_id, sizeof(tBTA_GATT_SRVC_ID)); } @@ -564,8 +553,7 @@ void BTA_GATTC_ReadCharacteristic(UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id, { tBTA_GATTC_API_READ *p_buf; - if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(sizeof(tBTA_GATTC_API_READ))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(sizeof(tBTA_GATTC_API_READ))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_READ)); p_buf->hdr.event = BTA_GATTC_API_READ_EVT; @@ -600,8 +588,7 @@ void BTA_GATTC_ReadCharDescr (UINT16 conn_id, tBTA_GATTC_API_READ *p_buf; UINT16 len = (UINT16)(sizeof(tBTA_GATT_ID) + sizeof(tBTA_GATTC_API_READ)); - if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_READ *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_READ)); p_buf->hdr.event = BTA_GATTC_API_READ_EVT; @@ -641,8 +628,7 @@ void BTA_GATTC_ReadMultiple(UINT16 conn_id, tBTA_GATTC_MULTI *p_read_multi, p_read_multi->num_attr * sizeof(tBTA_GATTC_ATTR_ID)); UINT8 i; - if ((p_buf = (tBTA_GATTC_API_READ_MULTI *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_READ_MULTI *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTC_API_READ_MULTI_EVT; @@ -651,12 +637,10 @@ void BTA_GATTC_ReadMultiple(UINT16 conn_id, tBTA_GATTC_MULTI *p_read_multi, p_buf->num_attr = p_read_multi->num_attr; - if (p_buf->num_attr > 0) - { + if (p_buf->num_attr > 0) { p_buf->p_id_list = p_value = (tBTA_GATTC_ATTR_ID *)(p_buf + 1); - for (i = 0; i < p_buf->num_attr; i ++, p_value ++) - { + for (i = 0; i < p_buf->num_attr; i ++, p_value ++) { memcpy(p_value, &p_read_multi->id_list[i], sizeof(tBTA_GATTC_ATTR_ID)); } } @@ -690,8 +674,7 @@ void BTA_GATTC_WriteCharValue ( UINT16 conn_id, { tBTA_GATTC_API_WRITE *p_buf; - if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_WRITE) + len); p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT; @@ -704,8 +687,7 @@ void BTA_GATTC_WriteCharValue ( UINT16 conn_id, p_buf->write_type = write_type; p_buf->len = len; - if (p_value && len > 0) - { + if (p_value && len > 0) { p_buf->p_value = (UINT8 *)(p_buf + 1); memcpy(p_buf->p_value, p_value, len); } @@ -737,11 +719,11 @@ void BTA_GATTC_WriteCharDescr (UINT16 conn_id, tBTA_GATTC_API_WRITE *p_buf; UINT16 len = sizeof(tBTA_GATTC_API_WRITE) + sizeof(tBTA_GATT_ID); - if (p_data != NULL) + if (p_data != NULL) { len += p_data->len; + } - if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT; @@ -754,8 +736,7 @@ void BTA_GATTC_WriteCharDescr (UINT16 conn_id, memcpy(p_buf->p_descr_type, &p_char_descr_id->descr_id, sizeof(tBTA_GATT_ID)); p_buf->write_type = write_type; - if (p_data && p_data->len != 0) - { + if (p_data && p_data->len != 0) { p_buf->p_value = (UINT8 *)(p_buf->p_descr_type + 1); p_buf->len = p_data->len; /* pack the descr data */ @@ -788,8 +769,7 @@ void BTA_GATTC_PrepareWrite (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id, { tBTA_GATTC_API_WRITE *p_buf; - if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_WRITE *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_WRITE) + len))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_WRITE) + len); p_buf->hdr.event = BTA_GATTC_API_WRITE_EVT; @@ -803,8 +783,7 @@ void BTA_GATTC_PrepareWrite (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id, p_buf->offset = offset; p_buf->len = len; - if (p_value && len > 0) - { + if (p_value && len > 0) { p_buf->p_value = (UINT8 *)(p_buf + 1); memcpy(p_buf->p_value, p_value, len); } @@ -830,8 +809,7 @@ void BTA_GATTC_ExecuteWrite (UINT16 conn_id, BOOLEAN is_execute) { tBTA_GATTC_API_EXEC *p_buf; - if ((p_buf = (tBTA_GATTC_API_EXEC *) GKI_getbuf((UINT16)sizeof(tBTA_GATTC_API_EXEC))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_EXEC *) GKI_getbuf((UINT16)sizeof(tBTA_GATTC_API_EXEC))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_EXEC)); p_buf->hdr.event = BTA_GATTC_API_EXEC_EVT; @@ -861,10 +839,9 @@ void BTA_GATTC_SendIndConfirm (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id) tBTA_GATTC_API_CONFIRM *p_buf; APPL_TRACE_API("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x", - conn_id, p_char_id->srvc_id.id.uuid.uu.uuid16, p_char_id->char_id.uuid.uu.uuid16); + conn_id, p_char_id->srvc_id.id.uuid.uu.uuid16, p_char_id->char_id.uuid.uu.uuid16); - if ((p_buf = (tBTA_GATTC_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_GATTC_API_CONFIRM))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_GATTC_API_CONFIRM))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTC_API_CONFIRM)); p_buf->hdr.event = BTA_GATTC_API_CONFIRM_EVT; @@ -893,38 +870,31 @@ void BTA_GATTC_SendIndConfirm (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id) ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if, - BD_ADDR bda, - tBTA_GATTC_CHAR_ID *p_char_id) + BD_ADDR bda, + tBTA_GATTC_CHAR_ID *p_char_id) { tBTA_GATTC_RCB *p_clreg; tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; UINT8 i; - if (!p_char_id) - { + if (!p_char_id) { APPL_TRACE_ERROR("deregistration failed, unknow char id"); return status; } - if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL) - { - for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) - { + if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL) { + for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { if ( p_clreg->notif_reg[i].in_use && - !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) && - bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id)) - { + !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) && + bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id)) { APPL_TRACE_WARNING("notification already registered"); status = BTA_GATT_OK; break; } } - if (status != BTA_GATT_OK) - { - for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) - { - if (!p_clreg->notif_reg[i].in_use) - { + if (status != BTA_GATT_OK) { + for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { + if (!p_clreg->notif_reg[i].in_use) { memset((void *)&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG)); p_clreg->notif_reg[i].in_use = TRUE; @@ -938,15 +908,12 @@ tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if, break; } } - if (i == BTA_GATTC_NOTIF_REG_MAX) - { + if (i == BTA_GATTC_NOTIF_REG_MAX) { status = BTA_GATT_NO_RESOURCES; APPL_TRACE_ERROR("Max Notification Reached, registration failed."); } } - } - else - { + } else { APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if); } @@ -967,45 +934,38 @@ tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if, ** *******************************************************************************/ tBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications (tBTA_GATTC_IF client_if, - BD_ADDR bda, - tBTA_GATTC_CHAR_ID *p_char_id) + BD_ADDR bda, + tBTA_GATTC_CHAR_ID *p_char_id) { tBTA_GATTC_RCB *p_clreg; tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; UINT8 i; - if (!p_char_id) - { + if (!p_char_id) { APPL_TRACE_ERROR("%s deregistration failed, unknown char id", __func__); return status; } - if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL) - { - for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) - { + if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL) { + for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { if (p_clreg->notif_reg[i].in_use && - !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) && - bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id)) - { + !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) && + bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id)) { APPL_TRACE_DEBUG("%s deregistered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG)); status = BTA_GATT_OK; break; } } - if (i == BTA_GATTC_NOTIF_REG_MAX) - { + if (i == BTA_GATTC_NOTIF_REG_MAX) { status = BTA_GATT_ERROR; APPL_TRACE_ERROR("%s registration not found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + __func__, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); } - } - else - { + } else { APPL_TRACE_ERROR("%s client_if: %d not registered bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - __func__, client_if, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + __func__, client_if, bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); } return status; @@ -1026,8 +986,7 @@ void BTA_GATTC_Refresh(BD_ADDR remote_bda) { tBTA_GATTC_API_OPEN *p_buf; - if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTC_API_OPEN))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_REFRESH_EVT; memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN); @@ -1057,19 +1016,17 @@ void BTA_GATTC_Listen(tBTA_GATTC_IF client_if, BOOLEAN start, BD_ADDR_PTR target { tBTA_GATTC_API_LISTEN *p_buf; - if ((p_buf = (tBTA_GATTC_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_LISTEN_EVT; p_buf->client_if = client_if; p_buf->start = start; - if (target_bda) - { - p_buf->remote_bda = (UINT8*)(p_buf + 1); + if (target_bda) { + p_buf->remote_bda = (UINT8 *)(p_buf + 1); memcpy(p_buf->remote_bda, target_bda, BD_ADDR_LEN); - } - else + } else { p_buf->remote_bda = NULL; + } bta_sys_sendmsg(p_buf); } @@ -1092,8 +1049,7 @@ void BTA_GATTC_Broadcast(tBTA_GATTC_IF client_if, BOOLEAN start) { tBTA_GATTC_API_LISTEN *p_buf; - if ((p_buf = (tBTA_GATTC_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN))) != NULL) - { + if ((p_buf = (tBTA_GATTC_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTC_API_LISTEN) + BD_ADDR_LEN))) != NULL) { p_buf->hdr.event = BTA_GATTC_API_BROADCAST_EVT; p_buf->client_if = client_if; p_buf->start = start; diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_cache.c b/components/bt/bluedroid/bta/gatt/bta_gattc_cache.c old mode 100755 new mode 100644 index ed5c531f9..bd50064f1 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_cache.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_cache.c @@ -50,8 +50,7 @@ static tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SE *****************************************************************************/ #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) -static char *bta_gattc_attr_type[] = -{ +static char *bta_gattc_attr_type[] = { "I", /* Included Service */ "C", /* Characteristic */ "D" /* Characteristic Descriptor */ @@ -75,22 +74,20 @@ static void bta_gattc_display_cache_server(tBTA_GATTC_CACHE *p_cache) APPL_TRACE_ERROR("<================Start Server Cache =============>"); - while (p_cur_srvc) - { + while (p_cur_srvc) { APPL_TRACE_ERROR("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]", - i, p_cur_srvc->s_handle, p_cur_srvc->e_handle, - ((p_cur_srvc->service_uuid.id.uuid.len == 2) ? "uuid16" : "uuid128"), - p_cur_srvc->service_uuid.id.uuid.uu.uuid16, - p_cur_srvc->service_uuid.id.inst_id); + i, p_cur_srvc->s_handle, p_cur_srvc->e_handle, + ((p_cur_srvc->service_uuid.id.uuid.len == 2) ? "uuid16" : "uuid128"), + p_cur_srvc->service_uuid.id.uuid.uu.uuid16, + p_cur_srvc->service_uuid.id.inst_id); i ++; p_attr = p_cur_srvc->p_attr; - for (j = 0; p_attr; j ++ ) - { + for (j = 0; p_attr; j ++ ) { APPL_TRACE_ERROR("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]", - j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, - bta_gattc_attr_type[p_attr->attr_type], p_attr->property); + j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, + bta_gattc_attr_type[p_attr->attr_type], p_attr->property); p_attr = p_attr->p_next; } @@ -116,10 +113,9 @@ static void bta_gattc_display_explore_record(tBTA_GATTC_ATTR_REC *p_rec, UINT8 n tBTA_GATTC_ATTR_REC *pp = p_rec; APPL_TRACE_ERROR("<================Start Explore Queue =============>"); - for (i = 0; i < num_rec; i ++, pp ++) - { + for (i = 0; i < num_rec; i ++, pp ++) { APPL_TRACE_ERROR("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]", - i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary); + i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary); } APPL_TRACE_ERROR("<================ End Explore Queue =============>"); APPL_TRACE_ERROR(" "); @@ -141,14 +137,11 @@ BT_HDR *bta_gattc_alloc_cache_buf(tBTA_GATTC_SERV *p_srvc_cb) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL) { APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed."); utl_freebuf((void **)&p_srvc_cb->p_srvc_list); p_srvc_cb->free_byte = 0; - } - else - { + } else { memset(p_buf, 0, GKI_get_buf_size(p_buf)); p_srvc_cb->p_free = (UINT8 *) p_buf; p_srvc_cb->free_byte = GKI_get_buf_size(p_buf); @@ -174,29 +167,24 @@ tBTA_GATT_STATUS bta_gattc_init_cache(tBTA_GATTC_SERV *p_srvc_cb) { tBTA_GATT_STATUS status = BTA_GATT_OK; - while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) + while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) { GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer)); + } utl_freebuf((void **)&p_srvc_cb->p_srvc_list); - if ((p_srvc_cb->p_srvc_list = (tBTA_GATTC_ATTR_REC*)GKI_getbuf(BTA_GATTC_ATTR_LIST_SIZE)) == NULL) - { + if ((p_srvc_cb->p_srvc_list = (tBTA_GATTC_ATTR_REC *)GKI_getbuf(BTA_GATTC_ATTR_LIST_SIZE)) == NULL) { APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed."); status = GATT_NO_RESOURCES; - } - else - { + } else { p_srvc_cb->total_srvc = 0; p_srvc_cb->cur_srvc_idx = - p_srvc_cb->cur_char_idx = - p_srvc_cb->next_avail_idx = 0; + p_srvc_cb->cur_char_idx = + p_srvc_cb->next_avail_idx = 0; - if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) - { + if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) { status = GATT_NO_RESOURCES; - } - else - { + } else { p_srvc_cb->p_cur_srvc = p_srvc_cb->p_srvc_cache = NULL; } } @@ -218,13 +206,14 @@ static UINT8 bta_gattc_get_srvc_inst_id(tBTA_GATTC_SERV *p_srvc_cb, tBT_UUID uui tBTA_GATTC_ATTR_REC *p_srvc_rec; for (i = 0; i < p_srvc_cb->total_srvc; i ++) - /* - for (; i < p_srvc_cb->cur_srvc_idx; i ++)*/ + /* + for (; i < p_srvc_cb->cur_srvc_idx; i ++)*/ { p_srvc_rec = p_srvc_cb->p_srvc_list + i; - if (bta_gattc_uuid_compare(&p_srvc_rec->uuid, &uuid, TRUE)) + if (bta_gattc_uuid_compare(&p_srvc_rec->uuid, &uuid, TRUE)) { inst ++; + } } return inst ; } @@ -245,12 +234,12 @@ static UINT8 bta_gattc_get_char_inst_id(tBTA_GATTC_CACHE *p_service_cache, tBT_U p_attr = p_service_cache->p_attr; - while (p_attr) - { + while (p_attr) { bta_gattc_pack_attr_uuid(p_attr, &attr_uuid); - if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) + if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) { inst ++; + } p_attr = p_attr->p_next; } @@ -271,15 +260,16 @@ static UINT8 bta_gattc_get_char_descr_inst_id(tBTA_GATTC_CACHE_ATTR *p_char_attr UINT8 inst = 0; tBT_UUID attr_uuid; - if (p_char_attr != NULL) + if (p_char_attr != NULL) { p_char_attr = p_char_attr->p_next; + } - while (p_char_attr) - { + while (p_char_attr) { bta_gattc_pack_attr_uuid(p_char_attr, &attr_uuid); - if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) + if (bta_gattc_uuid_compare(&attr_uuid, p_uuid, TRUE)) { inst ++; + } p_char_attr = p_char_attr->p_next; } @@ -296,9 +286,9 @@ static UINT8 bta_gattc_get_char_descr_inst_id(tBTA_GATTC_CACHE_ATTR *p_char_attr ** *******************************************************************************/ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb, - UINT16 s_handle, UINT16 e_handle, - tBT_UUID *p_uuid, - BOOLEAN is_primary, UINT8 srvc_inst) + UINT16 s_handle, UINT16 e_handle, + tBT_UUID *p_uuid, + BOOLEAN is_primary, UINT8 srvc_inst) { tBTA_GATTC_CACHE *p_new_srvc = NULL; tBTA_GATT_STATUS status = BTA_GATT_OK; @@ -308,10 +298,10 @@ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb, APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE)) #endif - if (p_srvc_cb->free_byte < sizeof(tBTA_GATTC_CACHE)) - { - if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) + if (p_srvc_cb->free_byte < sizeof(tBTA_GATTC_CACHE)) { + if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) { return GATT_NO_RESOURCES; + } } p_new_srvc = (tBTA_GATTC_CACHE *)p_srvc_cb->p_free; @@ -323,14 +313,16 @@ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb, p_new_srvc->service_uuid.id.inst_id = srvc_inst; p_new_srvc->p_next = NULL; - if (p_srvc_cb->p_cur_srvc != NULL) + if (p_srvc_cb->p_cur_srvc != NULL) { p_srvc_cb->p_cur_srvc->p_next = p_new_srvc; + } p_srvc_cb->p_cur_srvc = p_new_srvc; p_srvc_cb->p_cur_srvc->p_cur_char = NULL; /* first service */ - if (p_srvc_cb->p_srvc_cache == NULL) + if (p_srvc_cb->p_srvc_cache == NULL) { p_srvc_cb->p_srvc_cache = p_new_srvc; + } /* update buffer managament info */ p_srvc_cb->p_free += sizeof(tBTA_GATTC_CACHE); @@ -349,10 +341,10 @@ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_cache(tBTA_GATTC_SERV *p_srvc_cb, ** *******************************************************************************/ static tBTA_GATT_STATUS bta_gattc_add_attr_to_cache(tBTA_GATTC_SERV *p_srvc_cb, - UINT16 handle, - tBT_UUID *p_uuid, - UINT8 property, - tBTA_GATTC_ATTR_TYPE type) + UINT16 handle, + tBT_UUID *p_uuid, + UINT8 property, + tBTA_GATTC_ATTR_TYPE type) { tBTA_GATTC_CACHE_ATTR *p_attr; tBTA_GATT_STATUS status = BTA_GATT_OK; @@ -365,16 +357,15 @@ static tBTA_GATT_STATUS bta_gattc_add_attr_to_cache(tBTA_GATTC_SERV *p_srvc_cb, APPL_TRACE_DEBUG("free byte = %d, req %d bytes.", p_srvc_cb->free_byte, len); #endif - if (p_srvc_cb->p_cur_srvc == NULL) - { + if (p_srvc_cb->p_cur_srvc == NULL) { APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc before adding a service!"); return GATT_WRONG_STATE; } - if (p_srvc_cb->free_byte < len) - { - if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) + if (p_srvc_cb->free_byte < len) { + if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) { return GATT_NO_RESOURCES; + } } p_attr = (tBTA_GATTC_CACHE_ATTR *)p_srvc_cb->p_free; @@ -388,36 +379,32 @@ static tBTA_GATT_STATUS bta_gattc_add_attr_to_cache(tBTA_GATTC_SERV *p_srvc_cb, pp = (UINT8 *)p_attr->p_uuid; - if (p_uuid->len == LEN_UUID_16) - { + if (p_uuid->len == LEN_UUID_16) { UINT16_TO_STREAM(pp, p_uuid->uu.uuid16); - } - else if (p_uuid->len == LEN_UUID_128) - { + } else if (p_uuid->len == LEN_UUID_128) { memcpy(pp, p_uuid->uu.uuid128, LEN_UUID_128); } - if (type == BTA_GATTC_ATTR_TYPE_CHAR) - { + if (type == BTA_GATTC_ATTR_TYPE_CHAR) { p_attr->inst_id = bta_gattc_get_char_inst_id(p_srvc_cb->p_cur_srvc, p_uuid); p_srvc_cb->p_cur_srvc->p_cur_char = p_attr; - } - else if (type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) + } else if (type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) { p_attr->inst_id = bta_gattc_get_char_descr_inst_id(p_srvc_cb->p_cur_srvc->p_cur_char, p_uuid); - else /* TODO: --->> temp treat included service as single instance */ + } else { /* TODO: --->> temp treat included service as single instance */ p_attr->inst_id = 0; + } /* update service information */ p_srvc_cb->p_free += len; p_srvc_cb->free_byte -= len; /* first attribute within the service, update the attribute pointer */ - if (p_srvc_cb->p_cur_srvc->p_attr == NULL) - { + if (p_srvc_cb->p_cur_srvc->p_attr == NULL) { p_srvc_cb->p_cur_srvc->p_attr = p_attr; } - if (p_srvc_cb->p_cur_srvc->p_last_attr != NULL) + if (p_srvc_cb->p_cur_srvc->p_last_attr != NULL) { p_srvc_cb->p_cur_srvc->p_last_attr->p_next = p_attr; + } p_srvc_cb->p_cur_srvc->p_last_attr = p_attr; @@ -437,20 +424,17 @@ void bta_gattc_get_disc_range(tBTA_GATTC_SERV *p_srvc_cb, UINT16 *p_s_hdl, UINT1 { tBTA_GATTC_ATTR_REC *p_rec = NULL; - if (is_srvc) - { + if (is_srvc) { p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx; *p_s_hdl = p_rec->s_handle; - } - else - { + } else { p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx; *p_s_hdl = p_rec->s_handle + 1; } *p_e_hdl = p_rec->e_handle; #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) - APPL_TRACE_DEBUG("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle); + APPL_TRACE_DEBUG("discover range [%d ~ %d]", p_rec->s_handle, p_rec->e_handle); #endif return; } @@ -464,17 +448,17 @@ void bta_gattc_get_disc_range(tBTA_GATTC_SERV *p_srvc_cb, UINT16 *p_s_hdl, UINT1 ** *******************************************************************************/ tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, - UINT8 disc_type) + UINT8 disc_type) { tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); tBTA_GATT_STATUS status = BTA_GATT_ERROR; - if (p_clcb) - { - if (p_clcb->transport == BTA_TRANSPORT_LE) + if (p_clcb) { + if (p_clcb->transport == BTA_TRANSPORT_LE) { status = bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type); - else + } else { status = bta_gattc_sdp_service_disc(conn_id, p_server_cb); + } } return status; @@ -489,27 +473,24 @@ tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV ** *******************************************************************************/ tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, - UINT8 disc_type) + UINT8 disc_type) { tGATT_DISC_PARAM param; BOOLEAN is_service = TRUE; memset(¶m, 0, sizeof(tGATT_DISC_PARAM)); - if (disc_type == GATT_DISC_SRVC_ALL || disc_type == GATT_DISC_SRVC_BY_UUID) - { + if (disc_type == GATT_DISC_SRVC_ALL || disc_type == GATT_DISC_SRVC_BY_UUID) { param.s_handle = 1; param.e_handle = 0xFFFF; - } - else - { - if (disc_type == GATT_DISC_CHAR_DSCPT) + } else { + if (disc_type == GATT_DISC_CHAR_DSCPT) { is_service = FALSE; + } bta_gattc_get_disc_range(p_server_cb, ¶m.s_handle, ¶m.e_handle, is_service); - if (param.s_handle > param.e_handle) - { + if (param.s_handle > param.e_handle) { return GATT_ERROR; } } @@ -557,8 +538,9 @@ void bta_gattc_start_disc_char_dscp(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) { APPL_TRACE_DEBUG("starting discover characteristics descriptor"); - if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0) + if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0) { bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb); + } } /******************************************************************************* @@ -579,29 +561,26 @@ static void bta_gattc_explore_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) p_srvc_cb->cur_char_idx = p_srvc_cb->next_avail_idx = p_srvc_cb->total_srvc; - if (p_clcb == NULL) - { + if (p_clcb == NULL) { APPL_TRACE_ERROR("unknown connection ID"); return; } /* start expore a service if there is service not been explored */ - if (p_srvc_cb->cur_srvc_idx < p_srvc_cb->total_srvc) - { + if (p_srvc_cb->cur_srvc_idx < p_srvc_cb->total_srvc) { /* add the first service into cache */ if (bta_gattc_add_srvc_to_cache (p_srvc_cb, p_rec->s_handle, p_rec->e_handle, &p_rec->uuid, p_rec->is_primary, - p_rec->srvc_inst_id) == 0) - { + p_rec->srvc_inst_id) == 0) { /* start discovering included services */ bta_gattc_start_disc_include_srvc(conn_id, p_srvc_cb); return; } } /* no service found at all, the end of server discovery*/ - LOG_WARN("%s no more services found", __func__); + LOG_DEBUG("%s no more services found", __func__); #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) bta_gattc_display_cache_server(p_srvc_cb->p_srvc_cache); @@ -641,8 +620,7 @@ static void bta_gattc_char_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_char_idx; /* if there are characteristic needs to be explored */ - if (p_srvc_cb->total_char > 0) - { + if (p_srvc_cb->total_char > 0) { /* add the first characteristic into cache */ bta_gattc_add_attr_to_cache (p_srvc_cb, p_rec->s_handle, @@ -652,9 +630,7 @@ static void bta_gattc_char_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb) /* start discoverying characteristic descriptor , if failed, disc for next char*/ bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb); - } - else /* otherwise start with next service */ - { + } else { /* otherwise start with next service */ p_srvc_cb->cur_srvc_idx ++; bta_gattc_explore_srvc (conn_id, p_srvc_cb); @@ -673,8 +649,7 @@ static void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_sr { tBTA_GATTC_ATTR_REC *p_rec = NULL; - if (-- p_srvc_cb->total_char > 0) - { + if (-- p_srvc_cb->total_char > 0) { p_rec = p_srvc_cb->p_srvc_list + (++ p_srvc_cb->cur_char_idx); /* add the next characteristic into cache */ bta_gattc_add_attr_to_cache (p_srvc_cb, @@ -685,9 +660,8 @@ static void bta_gattc_char_dscpt_disc_cmpl(UINT16 conn_id, tBTA_GATTC_SERV *p_sr /* start discoverying next characteristic for char descriptor */ bta_gattc_start_disc_char_dscp(conn_id, p_srvc_cb); - } - else - /* all characteristic has been explored, start with next service if any */ + } else + /* all characteristic has been explored, start with next service if any */ { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_ERROR("all char has been explored"); @@ -705,20 +679,15 @@ static BOOLEAN bta_gattc_srvc_in_list(tBTA_GATTC_SERV *p_srvc_cb, UINT16 s_handl BOOLEAN exist_srvc = FALSE; UNUSED(uuid); - if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle)) - { + if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle)) { APPL_TRACE_ERROR("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle); exist_srvc = TRUE; - } - else - { - for (i = 0; i < p_srvc_cb->next_avail_idx; i ++) - { + } else { + for (i = 0; i < p_srvc_cb->next_avail_idx; i ++) { p_rec = p_srvc_cb->p_srvc_list + i; /* a new service should not have any overlap with other service handle range */ - if (p_rec->s_handle == s_handle || p_rec->e_handle == e_handle) - { + if (p_rec->s_handle == s_handle || p_rec->e_handle == e_handle) { exist_srvc = TRUE; break; } @@ -736,18 +705,17 @@ static BOOLEAN bta_gattc_srvc_in_list(tBTA_GATTC_SERV *p_srvc_cb, UINT16 s_handl ** *******************************************************************************/ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_list(tBTA_GATTC_SERV *p_srvc_cb, - UINT16 s_handle, UINT16 e_handle, - tBT_UUID uuid, BOOLEAN is_primary) + UINT16 s_handle, UINT16 e_handle, + tBT_UUID uuid, BOOLEAN is_primary) { tBTA_GATTC_ATTR_REC *p_rec = NULL; tBTA_GATT_STATUS status = BTA_GATT_OK; - if (p_srvc_cb->p_srvc_list && p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) - { + if (p_srvc_cb->p_srvc_list && p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) { p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx; APPL_TRACE_DEBUG("%s handle=%d, service type=0x%04x", - __func__, s_handle, uuid.uu.uuid16); + __func__, s_handle, uuid.uu.uuid16); p_rec->s_handle = s_handle; p_rec->e_handle = e_handle; @@ -757,9 +725,8 @@ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_list(tBTA_GATTC_SERV *p_srvc_cb, p_srvc_cb->total_srvc ++; p_srvc_cb->next_avail_idx ++; - } - else - { /* allocate bigger buffer ?? */ + } else { + /* allocate bigger buffer ?? */ status = GATT_DB_FULL; APPL_TRACE_ERROR("service not added, no resources or wrong state"); @@ -776,19 +743,16 @@ static tBTA_GATT_STATUS bta_gattc_add_srvc_to_list(tBTA_GATTC_SERV *p_srvc_cb, ** *******************************************************************************/ static tBTA_GATT_STATUS bta_gattc_add_char_to_list(tBTA_GATTC_SERV *p_srvc_cb, - UINT16 decl_handle, UINT16 value_handle, - tBT_UUID uuid, UINT8 property) + UINT16 decl_handle, UINT16 value_handle, + tBT_UUID uuid, UINT8 property) { tBTA_GATTC_ATTR_REC *p_rec = NULL; tBTA_GATT_STATUS status = BTA_GATT_OK; - if (p_srvc_cb->p_srvc_list == NULL) - { + if (p_srvc_cb->p_srvc_list == NULL) { APPL_TRACE_ERROR("No service available, unexpected char discovery result"); status = BTA_GATT_INTERNAL_ERROR; - } - else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) - { + } else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR) { p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->next_avail_idx; @@ -800,15 +764,12 @@ static tBTA_GATT_STATUS bta_gattc_add_char_to_list(tBTA_GATTC_SERV *p_srvc_cb, memcpy(&p_rec->uuid, &uuid, sizeof(tBT_UUID)); /* update the endind handle of pervious characteristic if available */ - if (p_srvc_cb->total_char > 1) - { + if (p_srvc_cb->total_char > 1) { p_rec -= 1; p_rec->e_handle = decl_handle - 1; } p_srvc_cb->next_avail_idx ++; - } - else - { + } else { APPL_TRACE_ERROR("char not added, no resources"); /* allocate bigger buffer ?? */ status = BTA_GATT_DB_FULL; @@ -833,44 +794,36 @@ void bta_gattc_sdp_callback (UINT16 sdp_status) UINT16 start_handle = 0, end_handle = 0; tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_scb_by_cid(bta_gattc_cb.sdp_conn_id); - if(((sdp_status == SDP_SUCCESS) || (sdp_status == SDP_DB_FULL)) && p_srvc_cb != NULL) - { - do - { + if (((sdp_status == SDP_SUCCESS) || (sdp_status == SDP_DB_FULL)) && p_srvc_cb != NULL) { + do { /* find a service record, report it */ p_sdp_rec = SDP_FindServiceInDb(bta_gattc_cb.p_sdp_db, 0, p_sdp_rec); - if (p_sdp_rec) - { - if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) - { + if (p_sdp_rec) { + if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) { - if (SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_ATT, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_ATT, &pe)) { start_handle = (UINT16) pe.params[0]; end_handle = (UINT16) pe.params[1]; #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_EVENT("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]", - service_uuid.uu.uuid16, start_handle, end_handle); + service_uuid.uu.uuid16, start_handle, end_handle); #endif - if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle)&& - p_srvc_cb != NULL) - { + if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle) && + p_srvc_cb != NULL) { /* discover services result, add services into a service list */ bta_gattc_add_srvc_to_list(p_srvc_cb, start_handle, end_handle, service_uuid, TRUE); - } - else - { + } else { APPL_TRACE_ERROR("invalid start_handle = %d end_handle = %d", - start_handle, end_handle); + start_handle, end_handle); } - } + } } @@ -880,9 +833,9 @@ void bta_gattc_sdp_callback (UINT16 sdp_status) if ( p_srvc_cb != NULL) /* start discover primary service */ - bta_gattc_explore_srvc(bta_gattc_cb.sdp_conn_id, p_srvc_cb); - else { + bta_gattc_explore_srvc(bta_gattc_cb.sdp_conn_id, p_srvc_cb); + } else { APPL_TRACE_ERROR("GATT service discovery is done on unknown connection"); } @@ -911,27 +864,23 @@ static tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SE uuid.len = LEN_UUID_16; uuid.uu.uuid16 = UUID_PROTOCOL_ATT; - if((bta_gattc_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_GATT_SDP_DB_SIZE)) != NULL) - { + if ((bta_gattc_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_GATT_SDP_DB_SIZE)) != NULL) { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list); - if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda, - bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback)) - { + if (!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda, + bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback)) { GKI_freebuf(bta_gattc_cb.p_sdp_db); bta_gattc_cb.p_sdp_db = NULL; - } - else - { + } else { bta_gattc_cb.sdp_conn_id = conn_id; status = BTA_GATT_OK; } - } - return status; + } + return status; } /******************************************************************************* ** @@ -945,112 +894,108 @@ static tBTA_GATT_STATUS bta_gattc_sdp_service_disc(UINT16 conn_id, tBTA_GATTC_SE *******************************************************************************/ void bta_gattc_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data) { - tBTA_GATTC_SERV * p_srvc_cb = NULL; + tBTA_GATTC_SERV *p_srvc_cb = NULL; BOOLEAN pri_srvc; tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id); - if (p_srvc_cb != NULL && p_clcb != NULL && p_clcb->state == BTA_GATTC_DISCOVER_ST) - { - switch (disc_type) - { - case GATT_DISC_SRVC_ALL: - /* discover services result, add services into a service list */ + if (p_srvc_cb != NULL && p_clcb != NULL && p_clcb->state == BTA_GATTC_DISCOVER_ST) { + switch (disc_type) { + case GATT_DISC_SRVC_ALL: + /* discover services result, add services into a service list */ + bta_gattc_add_srvc_to_list(p_srvc_cb, + p_data->handle, + p_data->value.group_value.e_handle, + p_data->value.group_value.service_type, + TRUE); + + break; + case GATT_DISC_SRVC_BY_UUID: + bta_gattc_add_srvc_to_list(p_srvc_cb, + p_data->handle, + p_data->value.group_value.e_handle, + p_data->value.group_value.service_type, + TRUE); + break; + + case GATT_DISC_INC_SRVC: + /* add included service into service list if it's secondary or it never showed up + in the primary service search */ + pri_srvc = bta_gattc_srvc_in_list(p_srvc_cb, + p_data->value.incl_service.s_handle, + p_data->value.incl_service.e_handle, + p_data->value.incl_service.service_type); + + if (!pri_srvc) bta_gattc_add_srvc_to_list(p_srvc_cb, - p_data->handle, - p_data->value.group_value.e_handle, - p_data->value.group_value.service_type, - TRUE); + p_data->value.incl_service.s_handle, + p_data->value.incl_service.e_handle, + p_data->value.incl_service.service_type, + FALSE); + /* add into database */ + bta_gattc_add_attr_to_cache(p_srvc_cb, + p_data->handle, + &p_data->value.incl_service.service_type, + pri_srvc, + BTA_GATTC_ATTR_TYPE_INCL_SRVC); + break; - break; - case GATT_DISC_SRVC_BY_UUID: - bta_gattc_add_srvc_to_list(p_srvc_cb, - p_data->handle, - p_data->value.group_value.e_handle, - p_data->value.group_value.service_type, - TRUE); - break; + case GATT_DISC_CHAR: + /* add char value into database */ + bta_gattc_add_char_to_list(p_srvc_cb, + p_data->handle, + p_data->value.dclr_value.val_handle, + p_data->value.dclr_value.char_uuid, + p_data->value.dclr_value.char_prop); + break; - case GATT_DISC_INC_SRVC: - /* add included service into service list if it's secondary or it never showed up - in the primary service search */ - pri_srvc = bta_gattc_srvc_in_list(p_srvc_cb, - p_data->value.incl_service.s_handle, - p_data->value.incl_service.e_handle, - p_data->value.incl_service.service_type); - - if (!pri_srvc) - bta_gattc_add_srvc_to_list(p_srvc_cb, - p_data->value.incl_service.s_handle, - p_data->value.incl_service.e_handle, - p_data->value.incl_service.service_type, - FALSE); - /* add into database */ - bta_gattc_add_attr_to_cache(p_srvc_cb, - p_data->handle, - &p_data->value.incl_service.service_type, - pri_srvc, - BTA_GATTC_ATTR_TYPE_INCL_SRVC); - break; - - case GATT_DISC_CHAR: - /* add char value into database */ - bta_gattc_add_char_to_list(p_srvc_cb, - p_data->handle, - p_data->value.dclr_value.val_handle, - p_data->value.dclr_value.char_uuid, - p_data->value.dclr_value.char_prop); - break; - - case GATT_DISC_CHAR_DSCPT: - bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0, - BTA_GATTC_ATTR_TYPE_CHAR_DESCR); - break; + case GATT_DISC_CHAR_DSCPT: + bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0, + BTA_GATTC_ATTR_TYPE_CHAR_DESCR); + break; } } } void bta_gattc_disc_cmpl_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status) { - tBTA_GATTC_SERV * p_srvc_cb; + tBTA_GATTC_SERV *p_srvc_cb; tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); - if ( p_clcb && (status != GATT_SUCCESS || p_clcb->status != GATT_SUCCESS) ) - { - if (p_clcb->status == GATT_SUCCESS) + if ( p_clcb && (status != GATT_SUCCESS || p_clcb->status != GATT_SUCCESS) ) { + if (p_clcb->status == GATT_SUCCESS) { p_clcb->status = status; + } bta_gattc_sm_execute(p_clcb, BTA_GATTC_DISCOVER_CMPL_EVT, NULL); return; } p_srvc_cb = bta_gattc_find_scb_by_cid(conn_id); - if (p_srvc_cb != NULL) - { - switch (disc_type) - { - case GATT_DISC_SRVC_ALL: - case GATT_DISC_SRVC_BY_UUID: + if (p_srvc_cb != NULL) { + switch (disc_type) { + case GATT_DISC_SRVC_ALL: + case GATT_DISC_SRVC_BY_UUID: #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) - bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); + bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); #endif - bta_gattc_explore_srvc(conn_id, p_srvc_cb); - break; + bta_gattc_explore_srvc(conn_id, p_srvc_cb); + break; - case GATT_DISC_INC_SRVC: - bta_gattc_incl_srvc_disc_cmpl(conn_id, p_srvc_cb); + case GATT_DISC_INC_SRVC: + bta_gattc_incl_srvc_disc_cmpl(conn_id, p_srvc_cb); - break; + break; - case GATT_DISC_CHAR: + case GATT_DISC_CHAR: #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) - bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); + bta_gattc_display_explore_record(p_srvc_cb->p_srvc_list, p_srvc_cb->next_avail_idx); #endif - bta_gattc_char_disc_cmpl(conn_id, p_srvc_cb); - break; + bta_gattc_char_disc_cmpl(conn_id, p_srvc_cb); + break; - case GATT_DISC_CHAR_DSCPT: - bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb); - break; + case GATT_DISC_CHAR_DSCPT: + bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb); + break; } } } @@ -1073,70 +1018,55 @@ UINT16 bta_gattc_id2handle(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_SRVC_ID *p_service tBT_UUID attr_uuid; BOOLEAN char_map = FALSE, done = FALSE; - while (p_service_id && p_cache && !done) - { + while (p_service_id && p_cache && !done) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]", - p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, - p_cache->service_uuid.id.inst_id); + p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, + p_cache->service_uuid.id.inst_id); #endif p_attr = p_cache->p_attr; - if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) - { - for (j = 0; p_attr; j ++) - { + if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) { + for (j = 0; p_attr; j ++) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", - j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, - p_attr->inst_id, p_attr->attr_type); + j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, + p_attr->inst_id, p_attr->attr_type); #endif bta_gattc_pack_attr_uuid(p_attr, &attr_uuid); if (bta_gattc_uuid_compare(&p_char_id->uuid, &attr_uuid, TRUE) && - p_char_id->inst_id == p_attr->inst_id) - { - if (p_descr_uuid == NULL) - { + p_char_id->inst_id == p_attr->inst_id) { + if (p_descr_uuid == NULL) { handle = p_attr->attr_handle; done = TRUE; break; - } - else - { + } else { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("found matching characteristic for the descriptor"); #endif char_map = TRUE; } - } - else if (char_map == TRUE) - { - if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) - { + } else if (char_map == TRUE) { + if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) { if (p_descr_uuid != NULL && - bta_gattc_uuid_compare(&p_descr_uuid->uuid, &attr_uuid, TRUE) && - p_descr_uuid->inst_id == p_attr->inst_id) - { + bta_gattc_uuid_compare(&p_descr_uuid->uuid, &attr_uuid, TRUE) && + p_descr_uuid->inst_id == p_attr->inst_id) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("found descriptor!!"); #endif handle = p_attr->attr_handle; done = TRUE; break; - } - else - { + } else { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("descriptor UUID not matching"); #endif } - } - else /* another char */ - { + } else { /* another char */ #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) - APPL_TRACE_DEBUG("no matching descptr found!!start of next characteristic"); + APPL_TRACE_DEBUG("no matching descptr found!!start of next characteristic"); #endif char_map = FALSE; done = TRUE; @@ -1172,58 +1102,48 @@ BOOLEAN bta_gattc_handle2id(tBTA_GATTC_SERV *p_srcb, UINT16 handle, tBTA_GATT_SR memset(p_char_id, 0, sizeof(tBTA_GATT_ID)); memset(p_descr_type, 0, sizeof(tBTA_GATT_ID)); - while (p_cache) - { + while (p_cache) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]", - p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, - p_cache->service_uuid.id.inst_id); + p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16, + p_cache->service_uuid.id.inst_id); #endif /* a service found */ - if (p_cache->s_handle == handle) - { + if (p_cache->s_handle == handle) { memcpy(p_service_id, &p_cache->service_uuid, sizeof(tBTA_GATT_SRVC_ID)); return TRUE; - } - else /* start looking for attributes within the service */ - { + } else { /* start looking for attributes within the service */ p_attr = p_cache->p_attr; - for (j = 0; p_attr; j ++) - { + for (j = 0; p_attr; j ++) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", - j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, - p_attr->inst_id, p_attr->attr_type); + j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, + p_attr->inst_id, p_attr->attr_type); #endif - if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR) + if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR) { p_char = p_attr; + } - if (handle == p_attr->attr_handle) - { + if (handle == p_attr->attr_handle) { memcpy(p_service_id, &p_cache->service_uuid, sizeof(tBTA_GATT_SRVC_ID)); - if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) - { + if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) { bta_gattc_pack_attr_uuid(p_attr, &p_descr_type->uuid); p_descr_type->inst_id = p_attr->inst_id; - if (p_char != NULL) - { + if (p_char != NULL) { bta_gattc_pack_attr_uuid(p_char, &p_char_id->uuid); p_char_id->inst_id = p_char->inst_id; - } - else - { + } else { APPL_TRACE_ERROR("descptr does not belong to any chracteristic"); } - } - else - /* is a characterisitc value or included service */ + } else + /* is a characterisitc value or included service */ { bta_gattc_pack_attr_uuid(p_attr, &p_char_id->uuid); - p_char_id->inst_id =p_attr->inst_id; + p_char_id->inst_id = p_attr->inst_id; } return TRUE; } @@ -1251,23 +1171,20 @@ void bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid) tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; tBTA_GATTC cb_data; - while (p_cache) - { - if (bta_gattc_uuid_compare(p_uuid, &p_cache->service_uuid.id.uuid, FALSE)) - { + while (p_cache) { + if (bta_gattc_uuid_compare(p_uuid, &p_cache->service_uuid.id.uuid, FALSE)) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("found service [0x%04x], inst[%d] handle [%d]", - p_cache->service_uuid.id.uuid.uu.uuid16, - p_cache->service_uuid.id.inst_id, - p_cache->s_handle); + p_cache->service_uuid.id.uuid.uu.uuid16, + p_cache->service_uuid.id.inst_id, + p_cache->s_handle); #endif - if (p_clcb->p_rcb->p_cback) - { + if (p_clcb->p_rcb->p_cback) { memset(&cb_data, 0, sizeof(tBTA_GATTC)); cb_data.srvc_res.conn_id = p_clcb->bta_conn_id; memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid, - sizeof(tBTA_GATT_SRVC_ID)); + sizeof(tBTA_GATT_SRVC_ID)); (* p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_RES_EVT, &cb_data); } @@ -1288,12 +1205,12 @@ void bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid) ** *******************************************************************************/ static tBTA_GATT_STATUS bta_gattc_find_record(tBTA_GATTC_SERV *p_srcb, - tBTA_GATTC_ATTR_TYPE attr_type, - tBTA_GATT_SRVC_ID *p_service_id, - tBTA_GATT_ID *p_start_rec, - tBT_UUID * p_uuid_cond, - tBTA_GATT_ID *p_result, - void *p_param) + tBTA_GATTC_ATTR_TYPE attr_type, + tBTA_GATT_SRVC_ID *p_service_id, + tBTA_GATT_ID *p_start_rec, + tBT_UUID *p_uuid_cond, + tBTA_GATT_ID *p_result, + void *p_param) { tBTA_GATTC_CACHE *p_cache = p_srcb->p_srvc_cache; tBTA_GATT_STATUS status = BTA_GATT_ERROR; @@ -1302,90 +1219,69 @@ static tBTA_GATT_STATUS bta_gattc_find_record(tBTA_GATTC_SERV *p_srcb, BOOLEAN char_found = FALSE, descr_found = FALSE; tBTA_GATT_ID *p_descr_id = (tBTA_GATT_ID *)p_param;; - for (i = 0; p_cache && status != BTA_GATT_OK; i ++) - { - if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) - { + for (i = 0; p_cache && status != BTA_GATT_OK; i ++) { + if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid)) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("found matching service [0x%04x], inst[%d]", - p_cache->service_uuid.id.uuid.uu.uuid16, - p_cache->service_uuid.id.inst_id); + p_cache->service_uuid.id.uuid.uu.uuid16, + p_cache->service_uuid.id.inst_id); #endif p_attr = p_cache->p_attr; - for (j = 0; p_attr; j ++) - { + for (j = 0; p_attr; j ++) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]", - j + 1, p_attr->attr_handle, - p_attr->p_uuid->uuid16, - p_attr->inst_id, - p_attr->attr_type); + j + 1, p_attr->attr_handle, + p_attr->p_uuid->uuid16, + p_attr->inst_id, + p_attr->attr_type); #endif bta_gattc_pack_attr_uuid(p_attr, &p_result->uuid); - if (p_start_rec != NULL && char_found == FALSE) - { + if (p_start_rec != NULL && char_found == FALSE) { /* find the starting record first */ if (bta_gattc_uuid_compare(&p_start_rec->uuid, &p_result->uuid, FALSE) && - p_start_rec->inst_id == p_attr->inst_id && - (attr_type == p_attr->attr_type || - /* find descriptor would look for characteristic first */ - (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR && - p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR))) - { + p_start_rec->inst_id == p_attr->inst_id && + (attr_type == p_attr->attr_type || + /* find descriptor would look for characteristic first */ + (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR && + p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR))) { char_found = TRUE; } - } - else - { + } else { /* if looking for descriptor, here is the where the descrptor to be found */ - if (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) - { + if (attr_type == BTA_GATTC_ATTR_TYPE_CHAR_DESCR) { /* next characeteristic already, return error */ - if (p_attr->attr_type != BTA_GATTC_ATTR_TYPE_CHAR_DESCR) - { + if (p_attr->attr_type != BTA_GATTC_ATTR_TYPE_CHAR_DESCR) { break; - } - else - { + } else { /* find starting descriptor */ - if (p_descr_id != NULL && !descr_found) - { + if (p_descr_id != NULL && !descr_found) { if (bta_gattc_uuid_compare(&p_descr_id->uuid, &p_result->uuid, TRUE) - && p_descr_id->inst_id == p_attr->inst_id) - { + && p_descr_id->inst_id == p_attr->inst_id) { descr_found = TRUE; } - } - else - { + } else { /* with matching descriptor */ - if (bta_gattc_uuid_compare(p_uuid_cond, &p_result->uuid, FALSE)) - { + if (bta_gattc_uuid_compare(p_uuid_cond, &p_result->uuid, FALSE)) { p_result->inst_id = p_attr->inst_id; status = BTA_GATT_OK; break; } } } - } - else - { + } else { if (bta_gattc_uuid_compare(p_uuid_cond, &p_result->uuid, FALSE) && - attr_type == p_attr->attr_type) - { + attr_type == p_attr->attr_type) { #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) APPL_TRACE_DEBUG("found char handle mapping characteristic"); #endif p_result->inst_id = p_attr->inst_id; - if (p_param != NULL) - { + if (p_param != NULL) { if (attr_type == BTA_GATTC_ATTR_TYPE_CHAR || - attr_type == BTA_GATTC_ATTR_TYPE_INCL_SRVC) - { + attr_type == BTA_GATTC_ATTR_TYPE_INCL_SRVC) { *(tBTA_GATT_CHAR_PROP *)p_param = p_attr->property; } } @@ -1398,8 +1294,7 @@ static tBTA_GATT_STATUS bta_gattc_find_record(tBTA_GATTC_SERV *p_srcb, p_attr = p_attr->p_next; } #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE) - if (status) - { + if (status) { APPL_TRACE_ERROR("In the given service, can not find matching record"); } #endif @@ -1441,14 +1336,11 @@ tBTA_GATT_STATUS bta_gattc_query_cache(UINT16 conn_id, tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER; - if (p_clcb != NULL ) - { - if (p_clcb->state == BTA_GATTC_CONN_ST) - { + if (p_clcb != NULL ) { + if (p_clcb->state == BTA_GATTC_CONN_ST) { if (p_clcb->p_srcb && - !p_clcb->p_srcb->p_srvc_list && /* no active discovery */ - p_clcb->p_srcb->p_srvc_cache) - { + !p_clcb->p_srcb->p_srvc_list && /* no active discovery */ + p_clcb->p_srcb->p_srvc_cache) { status = bta_gattc_find_record(p_clcb->p_srcb, query_type, p_srvc_id, @@ -1456,22 +1348,16 @@ tBTA_GATT_STATUS bta_gattc_query_cache(UINT16 conn_id, p_uuid_cond, p_output, p_param); - } - else - { + } else { status = BTA_GATT_ERROR; APPL_TRACE_ERROR("No server cache available"); } - } - else - { + } else { APPL_TRACE_ERROR("server cache not available, CLCB state = %d", p_clcb->state); status = (p_clcb->state == BTA_GATTC_DISCOVER_ST) ? BTA_GATT_BUSY : BTA_GATT_ERROR; } - } - else - { + } else { APPL_TRACE_ERROR("Unknown conn ID: %d", conn_id); } @@ -1494,43 +1380,38 @@ void bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srvc_cb, UINT16 num_attr, { /* first attribute loading, initialize buffer */ APPL_TRACE_ERROR("bta_gattc_rebuild_cache"); - if (attr_index == 0) - { - while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) + if (attr_index == 0) { + while (!GKI_queue_is_empty(&p_srvc_cb->cache_buffer)) { GKI_freebuf (GKI_dequeue (&p_srvc_cb->cache_buffer)); - - if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) - { - APPL_TRACE_ERROR("allocate cache buffer failed, no resources"); } - else - { + + if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL) { + APPL_TRACE_ERROR("allocate cache buffer failed, no resources"); + } else { p_srvc_cb->p_cur_srvc = p_srvc_cb->p_srvc_cache = NULL; } } - while (num_attr > 0 && p_attr != NULL) - { - switch (p_attr->attr_type) - { - case BTA_GATTC_ATTR_TYPE_SRVC: - bta_gattc_add_srvc_to_cache(p_srvc_cb, - p_attr->s_handle, - p_attr->e_handle, - &p_attr->uuid, - p_attr->is_primary, - p_attr->id); - break; + while (num_attr > 0 && p_attr != NULL) { + switch (p_attr->attr_type) { + case BTA_GATTC_ATTR_TYPE_SRVC: + bta_gattc_add_srvc_to_cache(p_srvc_cb, + p_attr->s_handle, + p_attr->e_handle, + &p_attr->uuid, + p_attr->is_primary, + p_attr->id); + break; - case BTA_GATTC_ATTR_TYPE_CHAR: - case BTA_GATTC_ATTR_TYPE_CHAR_DESCR: - case BTA_GATTC_ATTR_TYPE_INCL_SRVC: - bta_gattc_add_attr_to_cache(p_srvc_cb, - p_attr->s_handle, - &p_attr->uuid, - p_attr->prop, - p_attr->attr_type); - break; + case BTA_GATTC_ATTR_TYPE_CHAR: + case BTA_GATTC_ATTR_TYPE_CHAR_DESCR: + case BTA_GATTC_ATTR_TYPE_INCL_SRVC: + bta_gattc_add_attr_to_cache(p_srvc_cb, + p_attr->s_handle, + &p_attr->uuid, + p_attr->prop, + p_attr->attr_type); + break; } p_attr ++; num_attr --; @@ -1577,10 +1458,8 @@ BOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id) tBTA_GATTC_CACHE_ATTR *p_attr; tBT_UUID uuid; - while (p_cur_srvc && i < BTA_GATTC_NV_LOAD_MAX) - { - if (offset ++ >= p_srvc_cb->attr_index) - { + while (p_cur_srvc && i < BTA_GATTC_NV_LOAD_MAX) { + if (offset ++ >= p_srvc_cb->attr_index) { bta_gattc_fill_nv_attr(&nv_attr[i++], BTA_GATTC_ATTR_TYPE_SRVC, p_cur_srvc->s_handle, @@ -1593,16 +1472,11 @@ BOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id) p_attr = p_cur_srvc->p_attr; - for (; p_attr && i < BTA_GATTC_NV_LOAD_MAX ; offset ++, p_attr = p_attr->p_next) - { - if (offset >= p_srvc_cb->attr_index) - { - if ((uuid.len = p_attr->uuid_len) == LEN_UUID_16) - { + for (; p_attr && i < BTA_GATTC_NV_LOAD_MAX ; offset ++, p_attr = p_attr->p_next) { + if (offset >= p_srvc_cb->attr_index) { + if ((uuid.len = p_attr->uuid_len) == LEN_UUID_16) { uuid.uu.uuid16 = p_attr->p_uuid->uuid16; - } - else - { + } else { memcpy(uuid.uu.uuid128, p_attr->p_uuid->uuid128, LEN_UUID_128); } @@ -1619,17 +1493,14 @@ BOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id) p_cur_srvc = p_cur_srvc->p_next; } - if (i > 0) - { + if (i > 0) { bta_gattc_co_cache_save(p_srvc_cb->server_bda, BTA_GATTC_CI_CACHE_SAVE_EVT, i, nv_attr, p_srvc_cb->attr_index, conn_id); p_srvc_cb->attr_index += i; return TRUE; - } - else - { + } else { return FALSE; } } diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_ci.c b/components/bt/bluedroid/bta/gatt/bta_gattc_ci.c old mode 100755 new mode 100644 index f6d9347a7..295c251bb --- a/components/bt/bluedroid/bta/gatt/bta_gattc_ci.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_ci.c @@ -54,8 +54,7 @@ void bta_gattc_ci_cache_open(BD_ADDR server_bda, UINT16 evt, tBTA_GATT_STATUS st tBTA_GATTC_CI_EVT *p_evt; UNUSED(server_bda); - if ((p_evt = (tBTA_GATTC_CI_EVT *) GKI_getbuf(sizeof(tBTA_GATTC_CI_EVT))) != NULL) - { + if ((p_evt = (tBTA_GATTC_CI_EVT *) GKI_getbuf(sizeof(tBTA_GATTC_CI_EVT))) != NULL) { p_evt->hdr.event = evt; p_evt->hdr.layer_specific = conn_id; @@ -87,8 +86,7 @@ void bta_gattc_ci_cache_load(BD_ADDR server_bda, UINT16 evt, UINT16 num_attr, tBTA_GATTC_CI_LOAD *p_evt; UNUSED(server_bda); - if ((p_evt = (tBTA_GATTC_CI_LOAD *) GKI_getbuf(sizeof(tBTA_GATTC_CI_LOAD))) != NULL) - { + if ((p_evt = (tBTA_GATTC_CI_LOAD *) GKI_getbuf(sizeof(tBTA_GATTC_CI_LOAD))) != NULL) { memset(p_evt, 0, sizeof(tBTA_GATTC_CI_LOAD)); p_evt->hdr.event = evt; @@ -97,8 +95,7 @@ void bta_gattc_ci_cache_load(BD_ADDR server_bda, UINT16 evt, UINT16 num_attr, p_evt->status = status; p_evt->num_attr = (num_attr > BTA_GATTC_NV_LOAD_MAX) ? BTA_GATTC_NV_LOAD_MAX : num_attr; - if (p_evt->num_attr > 0 && p_attr != NULL) - { + if (p_evt->num_attr > 0 && p_attr != NULL) { memcpy(p_evt->attr, p_attr, p_evt->num_attr * sizeof(tBTA_GATTC_NV_ATTR)); } @@ -128,8 +125,7 @@ void bta_gattc_ci_cache_save(BD_ADDR server_bda, UINT16 evt, tBTA_GATT_STATUS st tBTA_GATTC_CI_EVT *p_evt; UNUSED(server_bda); - if ((p_evt = (tBTA_GATTC_CI_EVT *) GKI_getbuf(sizeof(tBTA_GATTC_CI_EVT))) != NULL) - { + if ((p_evt = (tBTA_GATTC_CI_EVT *) GKI_getbuf(sizeof(tBTA_GATTC_CI_EVT))) != NULL) { p_evt->hdr.event = evt; p_evt->hdr.layer_specific = conn_id; diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_main.c b/components/bt/bluedroid/bta/gatt/bta_gattc_main.c old mode 100755 new mode 100644 index bb45445a4..f13e3f0a1 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_main.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_main.c @@ -38,8 +38,7 @@ /* state machine action enumeration list */ -enum -{ +enum { BTA_GATTC_OPEN, BTA_GATTC_OPEN_FAIL, BTA_GATTC_OPEN_ERROR, @@ -77,8 +76,7 @@ enum typedef void (*tBTA_GATTC_ACTION)(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); /* action function list */ -const tBTA_GATTC_ACTION bta_gattc_action[] = -{ +const tBTA_GATTC_ACTION bta_gattc_action[] = { bta_gattc_open, bta_gattc_open_fail, bta_gattc_open_error, @@ -118,149 +116,144 @@ const tBTA_GATTC_ACTION bta_gattc_action[] = #define BTA_GATTC_NUM_COLS 2 /* number of columns in state tables */ /* state table for idle state */ -static const UINT8 bta_gattc_st_idle[][BTA_GATTC_NUM_COLS] = -{ -/* Event Action 1 Next state */ -/* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, +static const UINT8 bta_gattc_st_idle[][BTA_GATTC_NUM_COLS] = { + /* Event Action 1 Next state */ + /* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CLOSE_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CLOSE_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* ===> for cache loading, saving */ -/* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST} + /* ===> for cache loading, saving */ + /* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_IDLE_ST} }; /* state table for wait for open state */ -static const UINT8 bta_gattc_st_w4_conn[][BTA_GATTC_NUM_COLS] = -{ -/* Event Action 1 Next state */ -/* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_OPEN_FAIL, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_CANCEL_OPEN_OK, BTA_GATTC_IDLE_ST}, +static const UINT8 bta_gattc_st_w4_conn[][BTA_GATTC_NUM_COLS] = { + /* Event Action 1 Next state */ + /* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_OPEN_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_CANCEL_OPEN_OK, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CANCEL_OPEN, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CANCEL_OPEN, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_OPEN_FAIL, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_OPEN_FAIL, BTA_GATTC_IDLE_ST}, -/* ===> for cache loading, saving */ -/* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, -/* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST} + /* ===> for cache loading, saving */ + /* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST}, + /* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_W4_CONN_ST} }; /* state table for open state */ -static const UINT8 bta_gattc_st_connected[][BTA_GATTC_NUM_COLS] = -{ -/* Event Action 1 Next state */ -/* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN_ERROR, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, +static const UINT8 bta_gattc_st_connected[][BTA_GATTC_NUM_COLS] = { + /* Event Action 1 Next state */ + /* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN_ERROR, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_READ, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_WRITE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_EXEC, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_CFG_MTU, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_READ, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_WRITE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_EXEC, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_CFG_MTU, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, -/* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_SEARCH, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_CONFIRM, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_READ_MULTI, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_SEARCH, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_CONFIRM, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_READ_MULTI, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_START_DISCOVER, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_OP_CMPL, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_START_DISCOVER, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_OP_CMPL, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, -/* ===> for cache loading, saving */ -/* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_CACHE_OPEN, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST} + /* ===> for cache loading, saving */ + /* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_CACHE_OPEN, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_CONN_ST} }; /* state table for discover state */ -static const UINT8 bta_gattc_st_discover[][BTA_GATTC_NUM_COLS] = -{ -/* Event Action 1 Next state */ -/* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN_ERROR, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_DISCOVER_ST}, +static const UINT8 bta_gattc_st_discover[][BTA_GATTC_NUM_COLS] = { + /* Event Action 1 Next state */ + /* BTA_GATTC_API_OPEN_EVT */ {BTA_GATTC_OPEN, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_INT_OPEN_FAIL_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_CANCEL_OPEN_EVT */ {BTA_GATTC_CANCEL_OPEN_ERROR, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_INT_CANCEL_OPEN_OK_EVT */ {BTA_GATTC_FAIL, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_READ_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_WRITE_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_EXEC_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_CFG_MTU_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_DISC_CLOSE, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_CLOSE_EVT */ {BTA_GATTC_DISC_CLOSE, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_CONFIRM, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_SEARCH_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_CONFIRM_EVT */ {BTA_GATTC_CONFIRM, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_READ_MULTI_EVT */ {BTA_GATTC_Q_CMD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_API_REFRESH_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_RESTART_DISCOVER, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_DISC_CMPL, BTA_GATTC_CONN_ST}, -/* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE_OP_CMPL, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, + /* BTA_GATTC_INT_CONN_EVT */ {BTA_GATTC_CONN, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_INT_DISCOVER_EVT */ {BTA_GATTC_RESTART_DISCOVER, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_DISCOVER_CMPL_EVT */ {BTA_GATTC_DISC_CMPL, BTA_GATTC_CONN_ST}, + /* BTA_GATTC_OP_CMPL_EVT */ {BTA_GATTC_IGNORE_OP_CMPL, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_INT_DISCONN_EVT */ {BTA_GATTC_CLOSE, BTA_GATTC_IDLE_ST}, -/* ===> for cache loading, saving */ -/* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_CI_OPEN, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_CI_LOAD, BTA_GATTC_DISCOVER_ST}, -/* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_CI_SAVE, BTA_GATTC_DISCOVER_ST} + /* ===> for cache loading, saving */ + /* BTA_GATTC_START_CACHE_EVT */ {BTA_GATTC_IGNORE, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_CI_CACHE_OPEN_EVT */ {BTA_GATTC_CI_OPEN, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_CI_CACHE_LOAD_EVT */ {BTA_GATTC_CI_LOAD, BTA_GATTC_DISCOVER_ST}, + /* BTA_GATTC_CI_CACHE_SAVE_EVT */ {BTA_GATTC_CI_SAVE, BTA_GATTC_DISCOVER_ST} }; /* type for state table */ typedef const UINT8 (*tBTA_GATTC_ST_TBL)[BTA_GATTC_NUM_COLS]; /* state table */ -const tBTA_GATTC_ST_TBL bta_gattc_st_tbl[] = -{ +const tBTA_GATTC_ST_TBL bta_gattc_st_tbl[] = { bta_gattc_st_idle, bta_gattc_st_w4_conn, bta_gattc_st_connected, @@ -302,9 +295,9 @@ BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_D tBTA_GATTC_STATE in_state = p_clcb->state; UINT16 in_event = event; APPL_TRACE_DEBUG("bta_gattc_sm_execute: State 0x%02x [%s], Event 0x%x[%s]", in_state, - gattc_state_code(in_state), - in_event, - gattc_evt_code(in_event)); + gattc_state_code(in_state), + in_event, + gattc_evt_code(in_event)); #endif @@ -317,10 +310,8 @@ BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_D p_clcb->state = state_table[event][BTA_GATTC_NEXT_STATE]; /* execute action functions */ - for (i = 0; i < BTA_GATTC_ACTIONS; i++) - { - if ((action = state_table[event][i]) != BTA_GATTC_IGNORE) - { + for (i = 0; i < BTA_GATTC_ACTIONS; i++) { + if ((action = state_table[event][i]) != BTA_GATTC_IGNORE) { (*bta_gattc_action[action])(p_clcb, p_data); if (p_clcb->p_q_cmd == p_data) { /* buffer is queued, don't free in the bta dispatcher. @@ -328,20 +319,17 @@ BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_D */ rt = FALSE; } - } - else - { + } else { break; } } #if BTA_GATT_DEBUG == TRUE - if (in_state != p_clcb->state) - { + if (in_state != p_clcb->state) { APPL_TRACE_DEBUG("GATTC State Change: [%s] -> [%s] after Event [%s]", - gattc_state_code(in_state), - gattc_state_code(p_clcb->state), - gattc_evt_code(in_event)); + gattc_state_code(in_state), + gattc_state_code(p_clcb->state), + gattc_evt_code(in_event)); } #endif return rt; @@ -366,68 +354,65 @@ BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg) #if BTA_GATT_DEBUG == TRUE APPL_TRACE_DEBUG("bta_gattc_hdl_event: Event [%s]\n", gattc_evt_code(p_msg->event)); #endif - switch (p_msg->event) - { - case BTA_GATTC_API_DISABLE_EVT: - bta_gattc_disable(p_cb); - break; + switch (p_msg->event) { + case BTA_GATTC_API_DISABLE_EVT: + bta_gattc_disable(p_cb); + break; - case BTA_GATTC_API_REG_EVT: - bta_gattc_register(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_API_REG_EVT: + bta_gattc_register(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; - case BTA_GATTC_INT_START_IF_EVT: - bta_gattc_start_if(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_INT_START_IF_EVT: + bta_gattc_start_if(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; - case BTA_GATTC_API_DEREG_EVT: - p_clreg = bta_gattc_cl_get_regcb(((tBTA_GATTC_DATA *)p_msg)->api_dereg.client_if); - bta_gattc_deregister(p_cb, p_clreg); - break; + case BTA_GATTC_API_DEREG_EVT: + p_clreg = bta_gattc_cl_get_regcb(((tBTA_GATTC_DATA *)p_msg)->api_dereg.client_if); + bta_gattc_deregister(p_cb, p_clreg); + break; - case BTA_GATTC_API_OPEN_EVT: - bta_gattc_process_api_open(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_API_OPEN_EVT: + bta_gattc_process_api_open(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; - case BTA_GATTC_API_CANCEL_OPEN_EVT: - bta_gattc_process_api_open_cancel(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_API_CANCEL_OPEN_EVT: + bta_gattc_process_api_open_cancel(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; - case BTA_GATTC_API_REFRESH_EVT: - bta_gattc_process_api_refresh(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_API_REFRESH_EVT: + bta_gattc_process_api_refresh(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; #if BLE_INCLUDED == TRUE - case BTA_GATTC_API_LISTEN_EVT: - bta_gattc_listen(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; - case BTA_GATTC_API_BROADCAST_EVT: - bta_gattc_broadcast(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_API_LISTEN_EVT: + bta_gattc_listen(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; + case BTA_GATTC_API_BROADCAST_EVT: + bta_gattc_broadcast(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; #endif - case BTA_GATTC_ENC_CMPL_EVT: - bta_gattc_process_enc_cmpl(p_cb, (tBTA_GATTC_DATA *) p_msg); - break; + case BTA_GATTC_ENC_CMPL_EVT: + bta_gattc_process_enc_cmpl(p_cb, (tBTA_GATTC_DATA *) p_msg); + break; - default: - if (p_msg->event == BTA_GATTC_INT_CONN_EVT) - p_clcb = bta_gattc_find_int_conn_clcb((tBTA_GATTC_DATA *) p_msg); - else if (p_msg->event == BTA_GATTC_INT_DISCONN_EVT) - p_clcb = bta_gattc_find_int_disconn_clcb((tBTA_GATTC_DATA *) p_msg); - else - p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->layer_specific); + default: + if (p_msg->event == BTA_GATTC_INT_CONN_EVT) { + p_clcb = bta_gattc_find_int_conn_clcb((tBTA_GATTC_DATA *) p_msg); + } else if (p_msg->event == BTA_GATTC_INT_DISCONN_EVT) { + p_clcb = bta_gattc_find_int_disconn_clcb((tBTA_GATTC_DATA *) p_msg); + } else { + p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->layer_specific); + } - if (p_clcb != NULL) - { - rt = bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg); - } - else - { - APPL_TRACE_DEBUG("Ignore unknown conn ID: %d\n", p_msg->layer_specific); - } + if (p_clcb != NULL) { + rt = bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg); + } else { + APPL_TRACE_DEBUG("Ignore unknown conn ID: %d\n", p_msg->layer_specific); + } - break; + break; } @@ -451,64 +436,63 @@ BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg) *******************************************************************************/ static char *gattc_evt_code(tBTA_GATTC_INT_EVT evt_code) { - switch (evt_code) - { - case BTA_GATTC_API_OPEN_EVT: - return "BTA_GATTC_API_OPEN_EVT"; - case BTA_GATTC_INT_OPEN_FAIL_EVT: - return "BTA_GATTC_INT_OPEN_FAIL_EVT"; - case BTA_GATTC_API_CANCEL_OPEN_EVT: - return "BTA_GATTC_API_CANCEL_OPEN_EVT"; - case BTA_GATTC_INT_CANCEL_OPEN_OK_EVT: - return "BTA_GATTC_INT_CANCEL_OPEN_OK_EVT"; - case BTA_GATTC_API_READ_EVT: - return "BTA_GATTC_API_READ_EVT"; - case BTA_GATTC_API_WRITE_EVT: - return "BTA_GATTC_API_WRITE_EVT"; - case BTA_GATTC_API_EXEC_EVT: - return "BTA_GATTC_API_EXEC_EVT"; - case BTA_GATTC_API_CLOSE_EVT: - return "BTA_GATTC_API_CLOSE_EVT"; - case BTA_GATTC_API_SEARCH_EVT: - return "BTA_GATTC_API_SEARCH_EVT"; - case BTA_GATTC_API_CONFIRM_EVT: - return "BTA_GATTC_API_CONFIRM_EVT"; - case BTA_GATTC_API_READ_MULTI_EVT: - return "BTA_GATTC_API_READ_MULTI_EVT"; - case BTA_GATTC_INT_CONN_EVT: - return "BTA_GATTC_INT_CONN_EVT"; - case BTA_GATTC_INT_DISCOVER_EVT: - return "BTA_GATTC_INT_DISCOVER_EVT"; - case BTA_GATTC_DISCOVER_CMPL_EVT: - return "BTA_GATTC_DISCOVER_CMPL_EVT"; - case BTA_GATTC_OP_CMPL_EVT: - return "BTA_GATTC_OP_CMPL_EVT"; - case BTA_GATTC_INT_DISCONN_EVT: - return "BTA_GATTC_INT_DISCONN_EVT"; - case BTA_GATTC_START_CACHE_EVT: - return "BTA_GATTC_START_CACHE_EVT"; - case BTA_GATTC_CI_CACHE_OPEN_EVT: - return "BTA_GATTC_CI_CACHE_OPEN_EVT"; - case BTA_GATTC_CI_CACHE_LOAD_EVT: - return "BTA_GATTC_CI_CACHE_LOAD_EVT"; - case BTA_GATTC_CI_CACHE_SAVE_EVT: - return "BTA_GATTC_CI_CACHE_SAVE_EVT"; - case BTA_GATTC_INT_START_IF_EVT: - return "BTA_GATTC_INT_START_IF_EVT"; - case BTA_GATTC_API_REG_EVT: - return "BTA_GATTC_API_REG_EVT"; - case BTA_GATTC_API_DEREG_EVT: - return "BTA_GATTC_API_DEREG_EVT"; - case BTA_GATTC_API_REFRESH_EVT: - return "BTA_GATTC_API_REFRESH_EVT"; - case BTA_GATTC_API_LISTEN_EVT: - return "BTA_GATTC_API_LISTEN_EVT"; - case BTA_GATTC_API_DISABLE_EVT: - return "BTA_GATTC_API_DISABLE_EVT"; - case BTA_GATTC_API_CFG_MTU_EVT: - return "BTA_GATTC_API_CFG_MTU_EVT"; - default: - return "unknown GATTC event code"; + switch (evt_code) { + case BTA_GATTC_API_OPEN_EVT: + return "BTA_GATTC_API_OPEN_EVT"; + case BTA_GATTC_INT_OPEN_FAIL_EVT: + return "BTA_GATTC_INT_OPEN_FAIL_EVT"; + case BTA_GATTC_API_CANCEL_OPEN_EVT: + return "BTA_GATTC_API_CANCEL_OPEN_EVT"; + case BTA_GATTC_INT_CANCEL_OPEN_OK_EVT: + return "BTA_GATTC_INT_CANCEL_OPEN_OK_EVT"; + case BTA_GATTC_API_READ_EVT: + return "BTA_GATTC_API_READ_EVT"; + case BTA_GATTC_API_WRITE_EVT: + return "BTA_GATTC_API_WRITE_EVT"; + case BTA_GATTC_API_EXEC_EVT: + return "BTA_GATTC_API_EXEC_EVT"; + case BTA_GATTC_API_CLOSE_EVT: + return "BTA_GATTC_API_CLOSE_EVT"; + case BTA_GATTC_API_SEARCH_EVT: + return "BTA_GATTC_API_SEARCH_EVT"; + case BTA_GATTC_API_CONFIRM_EVT: + return "BTA_GATTC_API_CONFIRM_EVT"; + case BTA_GATTC_API_READ_MULTI_EVT: + return "BTA_GATTC_API_READ_MULTI_EVT"; + case BTA_GATTC_INT_CONN_EVT: + return "BTA_GATTC_INT_CONN_EVT"; + case BTA_GATTC_INT_DISCOVER_EVT: + return "BTA_GATTC_INT_DISCOVER_EVT"; + case BTA_GATTC_DISCOVER_CMPL_EVT: + return "BTA_GATTC_DISCOVER_CMPL_EVT"; + case BTA_GATTC_OP_CMPL_EVT: + return "BTA_GATTC_OP_CMPL_EVT"; + case BTA_GATTC_INT_DISCONN_EVT: + return "BTA_GATTC_INT_DISCONN_EVT"; + case BTA_GATTC_START_CACHE_EVT: + return "BTA_GATTC_START_CACHE_EVT"; + case BTA_GATTC_CI_CACHE_OPEN_EVT: + return "BTA_GATTC_CI_CACHE_OPEN_EVT"; + case BTA_GATTC_CI_CACHE_LOAD_EVT: + return "BTA_GATTC_CI_CACHE_LOAD_EVT"; + case BTA_GATTC_CI_CACHE_SAVE_EVT: + return "BTA_GATTC_CI_CACHE_SAVE_EVT"; + case BTA_GATTC_INT_START_IF_EVT: + return "BTA_GATTC_INT_START_IF_EVT"; + case BTA_GATTC_API_REG_EVT: + return "BTA_GATTC_API_REG_EVT"; + case BTA_GATTC_API_DEREG_EVT: + return "BTA_GATTC_API_DEREG_EVT"; + case BTA_GATTC_API_REFRESH_EVT: + return "BTA_GATTC_API_REFRESH_EVT"; + case BTA_GATTC_API_LISTEN_EVT: + return "BTA_GATTC_API_LISTEN_EVT"; + case BTA_GATTC_API_DISABLE_EVT: + return "BTA_GATTC_API_DISABLE_EVT"; + case BTA_GATTC_API_CFG_MTU_EVT: + return "BTA_GATTC_API_CFG_MTU_EVT"; + default: + return "unknown GATTC event code"; } } @@ -523,18 +507,17 @@ static char *gattc_evt_code(tBTA_GATTC_INT_EVT evt_code) *******************************************************************************/ static char *gattc_state_code(tBTA_GATTC_STATE state_code) { - switch (state_code) - { - case BTA_GATTC_IDLE_ST: - return "GATTC_IDLE_ST"; - case BTA_GATTC_W4_CONN_ST: - return "GATTC_W4_CONN_ST"; - case BTA_GATTC_CONN_ST: - return "GATTC_CONN_ST"; - case BTA_GATTC_DISCOVER_ST: - return "GATTC_DISCOVER_ST"; - default: - return "unknown GATTC state code"; + switch (state_code) { + case BTA_GATTC_IDLE_ST: + return "GATTC_IDLE_ST"; + case BTA_GATTC_W4_CONN_ST: + return "GATTC_W4_CONN_ST"; + case BTA_GATTC_CONN_ST: + return "GATTC_CONN_ST"; + case BTA_GATTC_DISCOVER_ST: + return "GATTC_DISCOVER_ST"; + default: + return "unknown GATTC state code"; } } diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_utils.c b/components/bt/bluedroid/bta/gatt/bta_gattc_utils.c old mode 100755 new mode 100644 index 3d99f6e67..0a020d3d6 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_utils.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_utils.c @@ -43,9 +43,10 @@ static const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; -static const BD_ADDR dummy_bda = {0,0,0,0,0,0}; +static const BD_ADDR dummy_bda = {0, 0, 0, 0, 0, 0}; /******************************************************************************* ** @@ -79,40 +80,37 @@ BOOLEAN bta_gattc_uuid_compare (tBT_UUID *p_src, tBT_UUID *p_tar, BOOLEAN is_pre UINT8 *ps, *pt; /* any of the UUID is unspecified */ - if (p_src == 0 || p_tar == 0) - { - if (is_precise) + if (p_src == 0 || p_tar == 0) { + if (is_precise) { return FALSE; - else + } else { return TRUE; + } } /* If both are 16-bit, we can do a simple compare */ - if (p_src->len == 2 && p_tar->len == 2) - { + if (p_src->len == 2 && p_tar->len == 2) { return p_src->uu.uuid16 == p_tar->uu.uuid16; } /* One or both of the UUIDs is 128-bit */ - if (p_src->len == LEN_UUID_16) - { + if (p_src->len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ bta_gatt_convert_uuid16_to_uuid128(su, p_src->uu.uuid16); ps = su; - } - else + } else { ps = p_src->uu.uuid128; + } - if (p_tar->len == LEN_UUID_16) - { + if (p_tar->len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ bta_gatt_convert_uuid16_to_uuid128(tu, p_tar->uu.uuid16); pt = tu; - } - else + } else { pt = p_tar->uu.uuid128; + } - return(memcmp(ps, pt, LEN_UUID_128) == 0); + return (memcmp(ps, pt, LEN_UUID_128) == 0); } /******************************************************************************* @@ -124,16 +122,16 @@ BOOLEAN bta_gattc_uuid_compare (tBT_UUID *p_src, tBT_UUID *p_tar, BOOLEAN is_pre ** Returns pointer to the regcb ** *******************************************************************************/ -tBTA_GATTC_RCB * bta_gattc_cl_get_regcb(UINT8 client_if) +tBTA_GATTC_RCB *bta_gattc_cl_get_regcb(UINT8 client_if) { UINT8 i = 0; tBTA_GATTC_RCB *p_clrcb = &bta_gattc_cb.cl_rcb[0]; - for (i = 0; i < BTA_GATTC_CL_MAX; i ++, p_clrcb ++) - { + for (i = 0; i < BTA_GATTC_CL_MAX; i ++, p_clrcb ++) { if (p_clrcb->in_use && - p_clrcb->client_if == client_if) + p_clrcb->client_if == client_if) { return p_clrcb; + } } return NULL; } @@ -150,10 +148,10 @@ UINT8 bta_gattc_num_reg_app(void) { UINT8 i = 0, j = 0; - for (i = 0; i < BTA_GATTC_CL_MAX; i ++) - { - if (bta_gattc_cb.cl_rcb[i].in_use) + for (i = 0; i < BTA_GATTC_CL_MAX; i ++) { + if (bta_gattc_cb.cl_rcb[i].in_use) { j ++; + } } return j; } @@ -166,19 +164,19 @@ UINT8 bta_gattc_num_reg_app(void) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, - tBTA_TRANSPORT transport) +tBTA_GATTC_CLCB *bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, + tBTA_TRANSPORT transport) { tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0]; UINT8 i; - for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) - { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) { if (p_clcb->in_use && - p_clcb->p_rcb->client_if == client_if && - p_clcb->transport == transport && - bdcmp(p_clcb->bda, remote_bda) == 0) + p_clcb->p_rcb->client_if == client_if && + p_clcb->transport == transport && + bdcmp(p_clcb->bda, remote_bda) == 0) { return p_clcb; + } } return NULL; } @@ -191,16 +189,16 @@ tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bd ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id) +tBTA_GATTC_CLCB *bta_gattc_find_clcb_by_conn_id (UINT16 conn_id) { tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0]; UINT8 i; - for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) - { + for (i = 0; i < BTA_GATTC_CLCB_MAX; i ++, p_clcb ++) { if (p_clcb->in_use && - p_clcb->bta_conn_id == conn_id) + p_clcb->bta_conn_id == conn_id) { return p_clcb; + } } return NULL; } @@ -214,18 +212,16 @@ tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, - tBTA_TRANSPORT transport) +tBTA_GATTC_CLCB *bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, + tBTA_TRANSPORT transport) { UINT8 i_clcb = 0; tBTA_GATTC_CLCB *p_clcb = NULL; - for (i_clcb = 0; i_clcb < BTA_GATTC_CLCB_MAX; i_clcb++) - { - if (!bta_gattc_cb.clcb[i_clcb].in_use) - { + for (i_clcb = 0; i_clcb < BTA_GATTC_CLCB_MAX; i_clcb++) { + if (!bta_gattc_cb.clcb[i_clcb].in_use) { #if BTA_GATT_DEBUG == TRUE - APPL_TRACE_DEBUG("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb); + APPL_TRACE_DEBUG("bta_gattc_clcb_alloc: found clcb[%d] available", i_clcb); #endif p_clcb = &bta_gattc_cb.clcb[i_clcb]; p_clcb->in_use = TRUE; @@ -235,16 +231,14 @@ tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_b p_clcb->p_rcb = bta_gattc_cl_get_regcb(client_if); - if ((p_clcb->p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) + if ((p_clcb->p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL) { p_clcb->p_srcb = bta_gattc_srcb_alloc(remote_bda); + } - if (p_clcb->p_rcb != NULL && p_clcb->p_srcb != NULL) - { + if (p_clcb->p_rcb != NULL && p_clcb->p_srcb != NULL) { p_clcb->p_srcb->num_clcb ++; p_clcb->p_rcb->num_clcb ++; - } - else - { + } else { /* release this clcb if clcb or srcb allocation failed */ p_clcb->in_use = FALSE; p_clcb = NULL; @@ -264,12 +258,11 @@ tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_b ** *******************************************************************************/ tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, - tBTA_TRANSPORT transport) + tBTA_TRANSPORT transport) { tBTA_GATTC_CLCB *p_clcb ; - if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda, transport)) == NULL) - { + if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda, transport)) == NULL) { p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda, transport); } return p_clcb; @@ -288,18 +281,18 @@ void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb) { tBTA_GATTC_SERV *p_srcb = NULL; - if (p_clcb) - { + if (p_clcb) { p_srcb = p_clcb->p_srcb; - if (p_srcb->num_clcb) + if (p_srcb->num_clcb) { p_srcb->num_clcb --; + } - if (p_clcb->p_rcb->num_clcb) + if (p_clcb->p_rcb->num_clcb) { p_clcb->p_rcb->num_clcb --; + } /* if the srcb is no longer needed, reset the state */ - if ( p_srcb->num_clcb == 0) - { + if ( p_srcb->num_clcb == 0) { p_srcb->connected = FALSE; p_srcb->state = BTA_GATTC_SERV_IDLE; p_srcb->mtu = 0; @@ -308,9 +301,7 @@ void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb) utl_freebuf((void **)&p_clcb->p_q_cmd); memset(p_clcb, 0, sizeof(tBTA_GATTC_CLCB)); - } - else - { + } else { APPL_TRACE_ERROR("bta_gattc_clcb_dealloc p_clcb=NULL"); } } @@ -324,15 +315,15 @@ void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb) ** Returns pointer to the server cache. ** *******************************************************************************/ -tBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda) +tBTA_GATTC_SERV *bta_gattc_find_srcb(BD_ADDR bda) { tBTA_GATTC_SERV *p_srcb = &bta_gattc_cb.known_server[0]; UINT8 i; - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) - { - if (p_srcb->in_use && bdcmp(p_srcb->server_bda, bda) == 0) + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) { + if (p_srcb->in_use && bdcmp(p_srcb->server_bda, bda) == 0) { return p_srcb; + } } return NULL; } @@ -346,15 +337,15 @@ tBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda) ** Returns pointer to the server cache. ** *******************************************************************************/ -tBTA_GATTC_SERV * bta_gattc_find_srvr_cache(BD_ADDR bda) +tBTA_GATTC_SERV *bta_gattc_find_srvr_cache(BD_ADDR bda) { tBTA_GATTC_SERV *p_srcb = &bta_gattc_cb.known_server[0]; UINT8 i; - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) - { - if (bdcmp(p_srcb->server_bda, bda) == 0) + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_srcb ++) { + if (bdcmp(p_srcb->server_bda, bda) == 0) { return p_srcb; + } } return NULL; } @@ -367,14 +358,15 @@ tBTA_GATTC_SERV * bta_gattc_find_srvr_cache(BD_ADDR bda) ** Returns pointer to the server cache. ** *******************************************************************************/ -tBTA_GATTC_SERV * bta_gattc_find_scb_by_cid (UINT16 conn_id) +tBTA_GATTC_SERV *bta_gattc_find_scb_by_cid (UINT16 conn_id) { tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id); - if (p_clcb) + if (p_clcb) { return p_clcb->p_srcb; - else + } else { return NULL; + } } /******************************************************************************* ** @@ -385,36 +377,33 @@ tBTA_GATTC_SERV * bta_gattc_find_scb_by_cid (UINT16 conn_id) ** Returns pointer to the server cache. ** *******************************************************************************/ -tBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda) +tBTA_GATTC_SERV *bta_gattc_srcb_alloc(BD_ADDR bda) { tBTA_GATTC_SERV *p_tcb = &bta_gattc_cb.known_server[0], - *p_recycle = NULL; + *p_recycle = NULL; BOOLEAN found = FALSE; UINT8 i; - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_tcb ++) - { - if (!p_tcb->in_use) - { + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_tcb ++) { + if (!p_tcb->in_use) { found = TRUE; break; - } - else if (!p_tcb->connected) - { + } else if (!p_tcb->connected) { p_recycle = p_tcb; } } /* if not found, try to recycle one known device */ - if (!found && !p_recycle) + if (!found && !p_recycle) { p_tcb = NULL; - else if (!found && p_recycle) + } else if (!found && p_recycle) { p_tcb = p_recycle; + } - if (p_tcb != NULL) - { - while (!GKI_queue_is_empty(&p_tcb->cache_buffer)) + if (p_tcb != NULL) { + while (!GKI_queue_is_empty(&p_tcb->cache_buffer)) { GKI_freebuf (GKI_dequeue (&p_tcb->cache_buffer)); + } utl_freebuf((void **)&p_tcb->p_srvc_list); memset(p_tcb, 0 , sizeof(tBTA_GATTC_SERV)); @@ -436,16 +425,13 @@ tBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda) BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) { - if (p_clcb->p_q_cmd == NULL) - { - p_clcb->p_q_cmd = p_data; - } - else - { - APPL_TRACE_ERROR("already has a pending command!!"); - /* skip the callback now. ----- need to send callback ? */ - } - return (p_clcb->p_q_cmd != NULL) ? TRUE : FALSE; + if (p_clcb->p_q_cmd == NULL) { + p_clcb->p_q_cmd = p_data; + } else { + APPL_TRACE_ERROR("already has a pending command!!"); + /* skip the callback now. ----- need to send callback ? */ + } + return (p_clcb->p_q_cmd != NULL) ? TRUE : FALSE; } @@ -466,12 +452,9 @@ void bta_gattc_pack_attr_uuid(tBTA_GATTC_CACHE_ATTR *p_attr, tBT_UUID *p_uuid) p_uuid->len = p_attr->uuid_len; - if (p_attr->uuid_len == LEN_UUID_16) - { + if (p_attr->uuid_len == LEN_UUID_16) { STREAM_TO_UINT16(p_uuid->uu.uuid16, pp); - } - else - { + } else { memcpy(p_uuid->uu.uuid128, pp, LEN_UUID_128); } @@ -494,12 +477,9 @@ void bta_gattc_cpygattid(tBTA_GATT_ID *p_des, tBTA_GATT_ID *p_src) p_des->uuid.len = p_src->uuid.len; - if (p_des->uuid.len == LEN_UUID_16) - { + if (p_des->uuid.len == LEN_UUID_16) { p_des->uuid.uu.uuid16 = p_src->uuid.uu.uuid16; - } - else if (p_des->uuid.len == LEN_UUID_128) - { + } else if (p_des->uuid.len == LEN_UUID_128) { memcpy(p_des->uuid.uu.uuid128, p_src->uuid.uu.uuid128, LEN_UUID_128); } } @@ -515,10 +495,11 @@ void bta_gattc_cpygattid(tBTA_GATT_ID *p_des, tBTA_GATT_ID *p_src) BOOLEAN bta_gattc_gattid_compare(tBTA_GATT_ID *p_src, tBTA_GATT_ID *p_tar) { if (p_src->inst_id == p_tar->inst_id && - bta_gattc_uuid_compare (&p_src->uuid, &p_tar->uuid, TRUE )) + bta_gattc_uuid_compare (&p_src->uuid, &p_tar->uuid, TRUE )) { return TRUE; - else + } else { return FALSE; + } } /******************************************************************************* @@ -533,10 +514,11 @@ BOOLEAN bta_gattc_gattid_compare(tBTA_GATT_ID *p_src, tBTA_GATT_ID *p_tar) BOOLEAN bta_gattc_srvcid_compare(tBTA_GATT_SRVC_ID *p_src, tBTA_GATT_SRVC_ID *p_tar) { if (p_src->is_primary == p_tar->is_primary && - bta_gattc_gattid_compare (&p_src->id, &p_tar->id)) + bta_gattc_gattid_compare (&p_src->id, &p_tar->id)) { return TRUE; - else + } else { return FALSE; + } } /******************************************************************************* ** @@ -550,10 +532,11 @@ BOOLEAN bta_gattc_srvcid_compare(tBTA_GATT_SRVC_ID *p_src, tBTA_GATT_SRVC_ID *p_ BOOLEAN bta_gattc_charid_compare(tBTA_GATTC_CHAR_ID *p_src, tBTA_GATTC_CHAR_ID *p_tar) { if (bta_gattc_gattid_compare (&p_src->char_id, &p_tar->char_id) && - bta_gattc_srvcid_compare (&p_src->srvc_id, &p_tar->srvc_id)) + bta_gattc_srvcid_compare (&p_src->srvc_id, &p_tar->srvc_id)) { return TRUE; - else + } else { return FALSE; + } } /******************************************************************************* @@ -570,12 +553,10 @@ BOOLEAN bta_gattc_check_notif_registry(tBTA_GATTC_RCB *p_clreg, tBTA_GATTC_SERV { UINT8 i; - for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) - { + for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { if (p_clreg->notif_reg[i].in_use && - bdcmp(p_clreg->notif_reg[i].remote_bda, p_srcb->server_bda) == 0 && - bta_gattc_charid_compare (&p_clreg->notif_reg[i].char_id, &p_notify->char_id)) - { + bdcmp(p_clreg->notif_reg[i].remote_bda, p_srcb->server_bda) == 0 && + bta_gattc_charid_compare (&p_clreg->notif_reg[i].char_id, &p_notify->char_id)) { APPL_TRACE_DEBUG("Notification registered!"); return TRUE; } @@ -600,20 +581,16 @@ void bta_gattc_clear_notif_registration(UINT16 conn_id) UINT8 i; tGATT_TRANSPORT transport; - if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) - { - if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) != NULL) - { - for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) - { + if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport)) { + if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) != NULL) { + for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++) { if (p_clrcb->notif_reg[i].in_use && - !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda)) + !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda)) { memset(&p_clrcb->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG)); + } } } - } - else - { + } else { APPL_TRACE_ERROR("can not clear indication/notif registration for unknown app"); } return; @@ -629,9 +606,9 @@ void bta_gattc_clear_notif_registration(UINT16 conn_id) ** *******************************************************************************/ tBTA_GATT_STATUS bta_gattc_pack_read_cb_data(tBTA_GATTC_SERV *p_srcb, - tBT_UUID *p_descr_uuid, - tGATT_VALUE *p_attr, - tBTA_GATT_READ_VAL *p_value) + tBT_UUID *p_descr_uuid, + tGATT_VALUE *p_attr, + tBTA_GATT_READ_VAL *p_value) { UINT8 i = 0, *pp = p_attr->value; tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_CHAR_AGG_FORMAT}}; @@ -639,18 +616,15 @@ tBTA_GATT_STATUS bta_gattc_pack_read_cb_data(tBTA_GATTC_SERV *p_srcb, tBTA_GATT_STATUS status = BTA_GATT_OK; /* GATT_UUID_CHAR_AGG_FORMAT */ - if (bta_gattc_uuid_compare (&uuid, p_descr_uuid, TRUE)) - { - while (p_attr->len >= 2 && i < BTA_GATTC_MULTI_MAX) - { + if (bta_gattc_uuid_compare (&uuid, p_descr_uuid, TRUE)) { + while (p_attr->len >= 2 && i < BTA_GATTC_MULTI_MAX) { STREAM_TO_UINT16(handle, pp); if (bta_gattc_handle2id(p_srcb, handle, &p_value->aggre_value.pre_format[i].char_id.srvc_id, &p_value->aggre_value.pre_format[i].char_id.char_id, - &p_value->aggre_value.pre_format[i].descr_id) == FALSE) - { + &p_value->aggre_value.pre_format[i].descr_id) == FALSE) { status = BTA_GATT_INTERNAL_ERROR; APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x", handle); break; @@ -659,9 +633,7 @@ tBTA_GATT_STATUS bta_gattc_pack_read_cb_data(tBTA_GATTC_SERV *p_srcb, p_attr->len -= 2; } p_value->aggre_value.num_pres_fmt = i; - } - else - { + } else { /* all others, take as raw format */ p_value->unformat.len = p_attr->len; p_value->unformat.p_value = p_attr->value; @@ -685,59 +657,52 @@ BOOLEAN bta_gattc_mark_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR_PTR remote_bda UINT8 i = 0; tBTA_GATTC_CIF_MASK *p_cif_mask; - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) - { + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) { if (p_bg_tck->in_use && - ((remote_bda_ptr != NULL && bdcmp(p_bg_tck->remote_bda, remote_bda_ptr) == 0) || - (remote_bda_ptr == NULL && bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0))) - { - p_cif_mask = is_listen ? &p_bg_tck->cif_adv_mask : &p_bg_tck->cif_mask; + ((remote_bda_ptr != NULL && bdcmp(p_bg_tck->remote_bda, remote_bda_ptr) == 0) || + (remote_bda_ptr == NULL && bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0))) { + p_cif_mask = is_listen ? &p_bg_tck->cif_adv_mask : &p_bg_tck->cif_mask; if (add) /* mask on the cif bit */ - *p_cif_mask |= (1 <<(client_if - 1)); - else { - if (client_if != 0) - *p_cif_mask &= (~(1 <<(client_if - 1))); - else + *p_cif_mask |= (1 << (client_if - 1)); + } else { + if (client_if != 0) { + *p_cif_mask &= (~(1 << (client_if - 1))); + } else { *p_cif_mask = 0; + } } /* no BG connection for this device, make it available */ - if (p_bg_tck->cif_mask == 0 && p_bg_tck->cif_adv_mask == 0) - { + if (p_bg_tck->cif_mask == 0 && p_bg_tck->cif_adv_mask == 0) { memset(p_bg_tck, 0, sizeof(tBTA_GATTC_BG_TCK)); } return TRUE; } } - if (!add) - { - if (remote_bda_ptr) - { - // bdstr_t bdstr = {0}; - char bdstr[18] = {0}; + if (!add) { + if (remote_bda_ptr) { + // bdstr_t bdstr = {0}; + char bdstr[18] = {0}; APPL_TRACE_ERROR("%s unable to find the bg connection mask for: %s", __func__, - bdaddr_to_string((bt_bdaddr_t *)remote_bda_ptr, bdstr, sizeof(bdstr))); + bdaddr_to_string((bt_bdaddr_t *)remote_bda_ptr, bdstr, sizeof(bdstr))); } return FALSE; - } - else /* adding a new device mask */ - { + } else { /* adding a new device mask */ for (i = 0, p_bg_tck = &bta_gattc_cb.bg_track[0]; - i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) - { - if (!p_bg_tck->in_use) - { + i < BTA_GATTC_KNOWN_SR_MAX; i ++, p_bg_tck ++) { + if (!p_bg_tck->in_use) { p_bg_tck->in_use = TRUE; - if (remote_bda_ptr) + if (remote_bda_ptr) { bdcpy(p_bg_tck->remote_bda, remote_bda_ptr); - else + } else { bdcpy(p_bg_tck->remote_bda, dummy_bda); + } p_cif_mask = is_listen ? &p_bg_tck->cif_adv_mask : &p_bg_tck->cif_mask; - *p_cif_mask = (1 <<(client_if - 1)); + *p_cif_mask = (1 << (client_if - 1)); return TRUE; } } @@ -760,19 +725,19 @@ BOOLEAN bta_gattc_check_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR remote_bda, U UINT8 i = 0; BOOLEAN is_bg_conn = FALSE; - for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX && !is_bg_conn; i ++, p_bg_tck ++) - { + for (i = 0; i < BTA_GATTC_KNOWN_SR_MAX && !is_bg_conn; i ++, p_bg_tck ++) { if (p_bg_tck->in_use && - (bdcmp(p_bg_tck->remote_bda, remote_bda) == 0 || - bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0)) - { - if (((p_bg_tck->cif_mask &(1 <<(client_if - 1))) != 0) && - role == HCI_ROLE_MASTER) + (bdcmp(p_bg_tck->remote_bda, remote_bda) == 0 || + bdcmp(p_bg_tck->remote_bda, dummy_bda) == 0)) { + if (((p_bg_tck->cif_mask & (1 << (client_if - 1))) != 0) && + role == HCI_ROLE_MASTER) { is_bg_conn = TRUE; + } - if (((p_bg_tck->cif_adv_mask &(1 <<(client_if - 1))) != 0) && - role == HCI_ROLE_SLAVE) + if (((p_bg_tck->cif_adv_mask & (1 << (client_if - 1))) != 0) && + role == HCI_ROLE_SLAVE) { is_bg_conn = TRUE; + } } } return is_bg_conn; @@ -792,8 +757,7 @@ void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status { tBTA_GATTC cb_data; - if (p_clreg->p_cback) - { + if (p_clreg->p_cback) { memset(&cb_data, 0, sizeof(tBTA_GATTC)); cb_data.open.status = status; @@ -815,17 +779,15 @@ void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CONN * bta_gattc_conn_alloc(BD_ADDR remote_bda) +tBTA_GATTC_CONN *bta_gattc_conn_alloc(BD_ADDR remote_bda) { UINT8 i_conn = 0; tBTA_GATTC_CONN *p_conn = &bta_gattc_cb.conn_track[0]; - for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) - { - if (!p_conn->in_use) - { + for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) { + if (!p_conn->in_use) { #if BTA_GATT_DEBUG == TRUE - APPL_TRACE_DEBUG("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn); + APPL_TRACE_DEBUG("bta_gattc_conn_alloc: found conn_track[%d] available", i_conn); #endif p_conn->in_use = TRUE; bdcpy(p_conn->remote_bda, remote_bda); @@ -844,17 +806,15 @@ tBTA_GATTC_CONN * bta_gattc_conn_alloc(BD_ADDR remote_bda) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CONN * bta_gattc_conn_find(BD_ADDR remote_bda) +tBTA_GATTC_CONN *bta_gattc_conn_find(BD_ADDR remote_bda) { UINT8 i_conn = 0; tBTA_GATTC_CONN *p_conn = &bta_gattc_cb.conn_track[0]; - for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) - { - if (p_conn->in_use && bdcmp(remote_bda, p_conn->remote_bda) == 0) - { + for (i_conn = 0; i_conn < BTA_GATTC_CONN_MAX; i_conn++, p_conn ++) { + if (p_conn->in_use && bdcmp(remote_bda, p_conn->remote_bda) == 0) { #if BTA_GATT_DEBUG == TRUE - APPL_TRACE_DEBUG("bta_gattc_conn_find: found conn_track[%d] matched",i_conn); + APPL_TRACE_DEBUG("bta_gattc_conn_find: found conn_track[%d] matched", i_conn); #endif return p_conn; } @@ -872,12 +832,11 @@ tBTA_GATTC_CONN * bta_gattc_conn_find(BD_ADDR remote_bda) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CONN * bta_gattc_conn_find_alloc(BD_ADDR remote_bda) +tBTA_GATTC_CONN *bta_gattc_conn_find_alloc(BD_ADDR remote_bda) { tBTA_GATTC_CONN *p_conn = bta_gattc_conn_find (remote_bda); - if (p_conn == NULL) - { + if (p_conn == NULL) { p_conn = bta_gattc_conn_alloc(remote_bda); } return p_conn; @@ -896,8 +855,7 @@ BOOLEAN bta_gattc_conn_dealloc(BD_ADDR remote_bda) { tBTA_GATTC_CONN *p_conn = bta_gattc_conn_find (remote_bda); - if (p_conn != NULL) - { + if (p_conn != NULL) { p_conn->in_use = FALSE; memset(p_conn->remote_bda, 0, BD_ADDR_LEN); return TRUE; @@ -914,24 +872,23 @@ BOOLEAN bta_gattc_conn_dealloc(BD_ADDR remote_bda) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CLCB * bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg) +tBTA_GATTC_CLCB *bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg) { tBTA_GATTC_CLCB *p_clcb = NULL; - if (p_msg->int_conn.role == HCI_ROLE_SLAVE) + if (p_msg->int_conn.role == HCI_ROLE_SLAVE) { bta_gattc_conn_find_alloc(p_msg->int_conn.remote_bda); + } /* try to locate a logic channel */ if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if, - p_msg->int_conn.remote_bda, - p_msg->int_conn.transport)) == NULL) - { + p_msg->int_conn.remote_bda, + p_msg->int_conn.transport)) == NULL) { /* for a background connection or listening connection */ if (/*p_msg->int_conn.role == HCI_ROLE_SLAVE || */ bta_gattc_check_bg_conn(p_msg->int_conn.client_if, p_msg->int_conn.remote_bda, - p_msg->int_conn.role)) - { + p_msg->int_conn.role)) { /* allocate a new channel */ p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if, p_msg->int_conn.remote_bda, @@ -950,22 +907,20 @@ tBTA_GATTC_CLCB * bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg) ** Returns pointer to the clcb ** *******************************************************************************/ -tBTA_GATTC_CLCB * bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA *p_msg) +tBTA_GATTC_CLCB *bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA *p_msg) { tBTA_GATTC_CLCB *p_clcb = NULL; bta_gattc_conn_dealloc(p_msg->int_conn.remote_bda); - if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL) - { + if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL) { /* connection attempt failed, send connection callback event */ p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if, p_msg->int_conn.remote_bda, p_msg->int_conn.transport); } - if (p_clcb == NULL) - { + if (p_clcb == NULL) { APPL_TRACE_DEBUG(" disconnection ID: [%d] not used by BTA", - p_msg->int_conn.hdr.layer_specific); + p_msg->int_conn.hdr.layer_specific); } return p_clcb; } diff --git a/components/bt/bluedroid/bta/gatt/bta_gatts_act.c b/components/bt/bluedroid/bta/gatt/bta_gatts_act.c old mode 100755 new mode 100644 index 6e1e46fa9..719712022 --- a/components/bt/bluedroid/bta/gatt/bta_gatts_act.c +++ b/components/bt/bluedroid/bta/gatt/bta_gatts_act.c @@ -39,18 +39,17 @@ static void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range); static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, - tGATTS_SRV_CHG_RSP *p_rsp); + tGATTS_SRV_CHG_RSP *p_rsp); static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, - BOOLEAN connected, tGATT_DISCONN_REASON reason, - tGATT_TRANSPORT transport); + BOOLEAN connected, tGATT_DISCONN_REASON reason, + tGATT_TRANSPORT transport); static void bta_gatts_send_request_cback (UINT16 conn_id, - UINT32 trans_id, - tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data); + UINT32 trans_id, + tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data); static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested); -static tGATT_CBACK bta_gatts_cback = -{ +static tGATT_CBACK bta_gatts_cback = { bta_gatts_conn_cback, NULL, NULL, @@ -60,8 +59,7 @@ static tGATT_CBACK bta_gatts_cback = bta_gatts_cong_cback }; -tGATT_APPL_INFO bta_gatts_nv_cback = -{ +tGATT_APPL_INFO bta_gatts_nv_cback = { bta_gatts_nv_save_cback, bta_gatts_nv_srv_chg_cback }; @@ -93,7 +91,7 @@ static void bta_gatts_nv_save_cback(BOOLEAN is_add, tGATTS_HNDL_RANGE *p_hndl_ra ** *******************************************************************************/ static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, - tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp) + tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp) { return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd, (tBTA_GATTS_SRV_CHG_REQ *) p_req, @@ -112,21 +110,17 @@ static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, *******************************************************************************/ void bta_gatts_enable(tBTA_GATTS_CB *p_cb) { - UINT8 index=0; + UINT8 index = 0; tBTA_GATTS_HNDL_RANGE handle_range; - if (p_cb->enabled) - { + if (p_cb->enabled) { APPL_TRACE_DEBUG("GATTS already enabled."); - } - else - { + } else { memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); p_cb->enabled = TRUE; - while ( bta_gatts_co_load_handle_range(index, &handle_range)) - { + while ( bta_gatts_co_load_handle_range(index, &handle_range)) { GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range); memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE)); index++; @@ -134,8 +128,7 @@ void bta_gatts_enable(tBTA_GATTS_CB *p_cb) APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index); - if (!GATTS_NVRegister(&bta_gatts_nv_cback)) - { + if (!GATTS_NVRegister(&bta_gatts_nv_cback)) { APPL_TRACE_ERROR("BTA GATTS NV register failed."); } } @@ -154,19 +147,14 @@ void bta_gatts_api_disable(tBTA_GATTS_CB *p_cb) { UINT8 i; - if (p_cb->enabled) - { - for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) - { - if (p_cb->rcb[i].in_use) - { + if (p_cb->enabled) { + for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) { + if (p_cb->rcb[i].in_use) { GATT_Deregister(p_cb->rcb[i].gatt_if); } } memset(p_cb, 0, sizeof(tBTA_GATTS_CB)); - } - else - { + } else { APPL_TRACE_ERROR("GATTS not enabled"); } } @@ -187,17 +175,13 @@ void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) tBTA_GATT_STATUS status = BTA_GATT_OK; UINT8 i, first_unuse = 0xff; - if (p_cb->enabled == FALSE) - { + if (p_cb->enabled == FALSE) { bta_gatts_enable(p_cb); } - for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) - { - if (p_cb->rcb[i].in_use) - { - if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid)) - { + for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) { + if (p_cb->rcb[i].in_use) { + if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid)) { APPL_TRACE_ERROR("application already registered.\n"); status = BTA_GATT_DUP_REG; break; @@ -205,12 +189,9 @@ void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) } } - if (status == BTA_GATT_OK) - { - for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) - { - if (first_unuse == 0xff && !p_cb->rcb[i].in_use) - { + if (status == BTA_GATT_OK) { + for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) { + if (first_unuse == 0xff && !p_cb->rcb[i].in_use) { first_unuse = i; break; } @@ -220,48 +201,40 @@ void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) // btla-specific ++ memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); // btla-specific -- - if (first_unuse != 0xff) - { - APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse); + if (first_unuse != 0xff) { + APPL_TRACE_VERBOSE("register application first_unuse rcb_idx = %d", first_unuse); p_cb->rcb[first_unuse].in_use = TRUE; p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback; memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID)); cb_data.reg_oper.server_if = - p_cb->rcb[first_unuse].gatt_if = - GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback); - if ( !p_cb->rcb[first_unuse].gatt_if) - { + p_cb->rcb[first_unuse].gatt_if = + GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback); + if ( !p_cb->rcb[first_unuse].gatt_if) { status = BTA_GATT_NO_RESOURCES; - } - else - { + } else { if ((p_buf = - (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL) - { + (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL) { p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT; p_buf->server_if = p_cb->rcb[first_unuse].gatt_if; bta_sys_sendmsg(p_buf); - } - else - { + } else { status = BTA_GATT_NO_RESOURCES; memset( &p_cb->rcb[first_unuse], 0 , sizeof(tBTA_GATTS_RCB)); } } - } - else - { + } else { status = BTA_GATT_NO_RESOURCES; } } cb_data.reg_oper.status = status; - if (p_msg->api_reg.p_cback) + if (p_msg->api_reg.p_cback) { (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data); + } - LOG_ERROR("status=%x\n",status); + LOG_ERROR("status=%x\n", status); } @@ -278,14 +251,11 @@ void bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { UNUSED(p_cb); - if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) - { + if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if)) { GATT_StartIf(p_msg->int_start_if.server_if); - } - else - { + } else { APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d", - p_msg->int_start_if.server_if ); + p_msg->int_start_if.server_if ); } } /******************************************************************************* @@ -307,10 +277,8 @@ void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) cb_data.reg_oper.server_if = p_msg->api_dereg.server_if; cb_data.reg_oper.status = status; - for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) - { - if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) - { + for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) { + if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if) { p_cback = p_cb->rcb[i].p_cback; status = BTA_GATT_OK; @@ -324,12 +292,9 @@ void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) } } - if (p_cback) - { + if (p_cback) { (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data); - } - else - { + } else { APPL_TRACE_ERROR("application not registered."); } } @@ -342,7 +307,7 @@ void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { UINT8 rcb_idx; tBTA_GATTS cb_data; @@ -353,12 +318,10 @@ void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if); - APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx); + APPL_TRACE_DEBUG("create service rcb_idx = %d", rcb_idx); - if (rcb_idx != BTA_GATTS_INVALID_APP) - { - if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP) - { + if (rcb_idx != BTA_GATTS_INVALID_APP) { + if ((srvc_idx = bta_gatts_alloc_srvc_cb(p_cb, rcb_idx)) != BTA_GATTS_INVALID_APP) { /* create the service now */ service_id = GATTS_CreateService (p_cb->rcb[rcb_idx].gatt_if, &p_msg->api_create_svc.service_uuid, @@ -366,10 +329,9 @@ void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) p_msg->api_create_svc.num_handle, p_msg->api_create_svc.is_pri); - if (service_id != 0) - { + if (service_id != 0) { memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, - &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); + &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); p_cb->srvc_cb[srvc_idx].service_id = service_id; p_cb->srvc_cb[srvc_idx].inst_num = p_msg->api_create_svc.inst; p_cb->srvc_cb[srvc_idx].idx = srvc_idx; @@ -380,23 +342,20 @@ void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) cb_data.create.is_primary = p_msg->api_create_svc.is_pri; // btla-specific -- cb_data.create.server_if = p_cb->rcb[rcb_idx].gatt_if; - } - else - { + } else { cb_data.status = BTA_GATT_ERROR; memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB)); APPL_TRACE_ERROR("service creation failed."); } // btla-specific ++ memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID)); - cb_data.create.svc_instance= p_msg->api_create_svc.inst; + cb_data.create.svc_instance = p_msg->api_create_svc.inst; // btla-specific -- } - if (p_cb->rcb[rcb_idx].p_cback) + if (p_cb->rcb[rcb_idx].p_cback) { (* p_cb->rcb[rcb_idx].p_cback)(BTA_GATTS_CREATE_EVT, &cb_data); - } - else /* application not registered */ - { + } + } else { /* application not registered */ APPL_TRACE_ERROR("Application not registered"); } } @@ -409,7 +368,7 @@ void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * p_msg) +void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; UINT16 attr_id = 0; @@ -422,17 +381,15 @@ void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; cb_data.add_result.attr_id = attr_id; - if (attr_id) - { + if (attr_id) { cb_data.add_result.status = BTA_GATT_OK; - } - else - { + } else { cb_data.add_result.status = BTA_GATT_ERROR; } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_ADD_INCL_SRVC_EVT, &cb_data); + } } /******************************************************************************* ** @@ -443,7 +400,7 @@ void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb,tBTA_GATTS_DATA * ** Returns none. ** *******************************************************************************/ -void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; UINT16 attr_id = 0; @@ -460,17 +417,15 @@ void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char.char_uuid, sizeof(tBT_UUID)); // btla-specific -- - if (attr_id) - { + if (attr_id) { cb_data.add_result.status = BTA_GATT_OK; - } - else - { + } else { cb_data.add_result.status = BTA_GATT_ERROR; } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_EVT, &cb_data); + } } /******************************************************************************* ** @@ -481,15 +436,15 @@ void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; UINT16 attr_id = 0; tBTA_GATTS cb_data; attr_id = GATTS_AddCharDescriptor(p_msg->api_add_char_descr.hdr.layer_specific, - p_msg->api_add_char_descr.perm, - &p_msg->api_add_char_descr.descr_uuid); + p_msg->api_add_char_descr.perm, + &p_msg->api_add_char_descr.descr_uuid); cb_data.add_result.server_if = p_rcb->gatt_if; cb_data.add_result.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific; @@ -498,17 +453,15 @@ void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p memcpy(&cb_data.add_result.char_uuid, &p_msg->api_add_char_descr.descr_uuid, sizeof(tBT_UUID)); // btla-specific -- - if (attr_id) - { + if (attr_id) { cb_data.add_result.status = BTA_GATT_OK; - } - else - { + } else { cb_data.add_result.status = BTA_GATT_ERROR; } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_ADD_CHAR_DESCR_EVT, &cb_data); + } } /******************************************************************************* @@ -520,7 +473,7 @@ void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p ** Returns none. ** *******************************************************************************/ -void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; tBTA_GATTS cb_data; @@ -530,18 +483,16 @@ void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p if (GATTS_DeleteService(p_rcb->gatt_if, &p_srvc_cb->service_uuid, - p_srvc_cb->inst_num)) - { + p_srvc_cb->inst_num)) { cb_data.srvc_oper.status = BTA_GATT_OK; memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB)); - } - else - { + } else { cb_data.srvc_oper.status = BTA_GATT_ERROR; } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data); + } } /******************************************************************************* @@ -553,7 +504,7 @@ void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p ** Returns none. ** *******************************************************************************/ -void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; tBTA_GATTS cb_data; @@ -563,18 +514,16 @@ void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_ if (GATTS_StartService(p_rcb->gatt_if, p_srvc_cb->service_id, - p_msg->api_start.transport) == GATT_SUCCESS) - { + p_msg->api_start.transport) == GATT_SUCCESS) { APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id); cb_data.srvc_oper.status = BTA_GATT_OK; - } - else - { + } else { cb_data.srvc_oper.status = BTA_GATT_ERROR; } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_START_EVT, &cb_data); + } } /******************************************************************************* @@ -586,7 +535,7 @@ void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_ ** Returns none. ** *******************************************************************************/ -void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx]; tBTA_GATTS cb_data; @@ -598,8 +547,9 @@ void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_m cb_data.srvc_oper.status = BTA_GATT_OK; APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id); - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data); + } } /******************************************************************************* @@ -611,15 +561,14 @@ void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_m ** Returns none. ** *******************************************************************************/ -void bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { UNUSED(p_cb); if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific, - p_msg->api_rsp.trans_id, - p_msg->api_rsp.status, - (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) - { + p_msg->api_rsp.trans_id, + p_msg->api_rsp.status, + (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS) { APPL_TRACE_ERROR("Sending response failed\n"); } @@ -633,7 +582,7 @@ void bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_SRVC_CB *p_srvc_cb; tBTA_GATTS_RCB *p_rcb = NULL; @@ -645,11 +594,9 @@ void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id); - if (p_srvc_cb ) - { + if (p_srvc_cb ) { if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific, - &gatt_if, remote_bda, &transport)) - { + &gatt_if, remote_bda, &transport)) { p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); if (p_msg->api_indicate.need_confirm) @@ -665,31 +612,25 @@ void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) p_msg->api_indicate.value); /* if over BR_EDR, inform PM for mode change */ - if (transport == BTA_TRANSPORT_BR_EDR) - { + if (transport == BTA_TRANSPORT_BR_EDR) { bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda); } - } - else - { + } else { APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification", - p_msg->api_indicate.hdr.layer_specific); + p_msg->api_indicate.hdr.layer_specific); } if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) && - p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) - { + p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback) { cb_data.req_data.status = status; cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific; (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data); } - } - else - { + } else { APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x", - p_msg->api_indicate.attr_id); + p_msg->api_indicate.attr_id); } } @@ -703,35 +644,31 @@ void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { - tBTA_GATTS_RCB *p_rcb=NULL; - tBTA_GATT_STATUS status= BTA_GATT_ERROR; + tBTA_GATTS_RCB *p_rcb = NULL; + tBTA_GATT_STATUS status = BTA_GATT_ERROR; UINT16 conn_id; UNUSED(p_cb); - if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL) - { + if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL) { /* should always get the connection ID */ if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, - p_msg->api_open.is_direct, p_msg->api_open.transport)) - { + p_msg->api_open.is_direct, p_msg->api_open.transport)) { status = BTA_GATT_OK; if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda, - &conn_id, p_msg->api_open.transport)) - { + &conn_id, p_msg->api_open.transport)) { status = BTA_GATT_ALREADY_OPEN; } } - } - else - { + } else { APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if); } - if (p_rcb && p_rcb->p_cback) + if (p_rcb && p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT, (tBTA_GATTS *)&status); + } } /******************************************************************************* @@ -743,31 +680,26 @@ void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb; - tBTA_GATT_STATUS status= BTA_GATT_ERROR; + tBTA_GATT_STATUS status = BTA_GATT_ERROR; UNUSED(p_cb); - if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL) - { + if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL) { if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, - p_msg->api_cancel_open.is_direct)) - { + p_msg->api_cancel_open.is_direct)) { APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request"); + } else { + status = BTA_GATT_OK; } - else - { - status= BTA_GATT_OK; - } - } - else - { + } else { APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if); } - if (p_rcb && p_rcb->p_cback) + if (p_rcb && p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT, (tBTA_GATTS *)&status); + } } /******************************************************************************* ** @@ -778,39 +710,33 @@ void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb; - tBTA_GATT_STATUS status= BTA_GATT_ERROR; + tBTA_GATT_STATUS status = BTA_GATT_ERROR; tGATT_IF gatt_if; BD_ADDR remote_bda; tBTA_GATT_TRANSPORT transport; UNUSED(p_cb); - if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport)) - { - if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) - { + if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport)) { + if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS) { APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific); - } - else - { - status= BTA_GATT_OK; + } else { + status = BTA_GATT_OK; } p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); - if (p_rcb && p_rcb->p_cback) - { - if (transport == BTA_TRANSPORT_BR_EDR) - bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda); + if (p_rcb && p_rcb->p_cback) { + if (transport == BTA_TRANSPORT_BR_EDR) { + bta_sys_conn_close( BTA_ID_GATTS , BTA_ALL_APP_ID, remote_bda); + } (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT, (tBTA_GATTS *)&status); } - } - else - { + } else { APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific); } @@ -824,7 +750,7 @@ void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** Returns none. ** *******************************************************************************/ -void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) +void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg) { tBTA_GATTS_RCB *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if); tBTA_GATTS cb_data; @@ -833,22 +759,21 @@ void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) cb_data.reg_oper.status = BTA_GATT_OK; cb_data.reg_oper.server_if = p_msg->api_listen.server_if; - if (p_rcb == NULL) - { + if (p_rcb == NULL) { APPL_TRACE_ERROR("Unknown GATTS application"); return; } if (!GATT_Listen(p_msg->api_listen.server_if, p_msg->api_listen.start, - p_msg->api_listen.remote_bda)) - { + p_msg->api_listen.remote_bda)) { cb_data.status = BTA_GATT_ERROR; APPL_TRACE_ERROR("bta_gatts_listen Listen failed"); } - if (p_rcb->p_cback) + if (p_rcb->p_cback) { (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data); + } } /******************************************************************************* @@ -861,8 +786,8 @@ void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg) ** *******************************************************************************/ static void bta_gatts_send_request_cback (UINT16 conn_id, - UINT32 trans_id, - tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data) + UINT32 trans_id, + tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data) { tBTA_GATTS cb_data; tBTA_GATTS_RCB *p_rcb; @@ -871,18 +796,15 @@ static void bta_gatts_send_request_cback (UINT16 conn_id, memset(&cb_data, 0 , sizeof(tBTA_GATTS)); - if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) - { + if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) { p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", - conn_id, trans_id, req_type); + conn_id, trans_id, req_type); - if (p_rcb && p_rcb->p_cback) - { + if (p_rcb && p_rcb->p_cback) { /* if over BR_EDR, inform PM for mode change */ - if (transport == BTA_TRANSPORT_BR_EDR) - { + if (transport == BTA_TRANSPORT_BR_EDR) { bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda); } @@ -892,14 +814,10 @@ static void bta_gatts_send_request_cback (UINT16 conn_id, cb_data.req_data.p_data = (tBTA_GATTS_REQ_DATA *)p_data; (*p_rcb->p_cback)(req_type, &cb_data); - } - else - { + } else { APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if); } - } - else - { + } else { APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id); } } @@ -918,13 +836,13 @@ static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, tGATT_TRANSPORT transport) { tBTA_GATTS cb_data; - UINT8 evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT; + UINT8 evt = connected ? BTA_GATTS_CONNECT_EVT : BTA_GATTS_DISCONNECT_EVT; tBTA_GATTS_RCB *p_reg; APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d", - gatt_if, conn_id, connected, reason); + gatt_if, conn_id, connected, reason); APPL_TRACE_DEBUG("bta_gatts_conn_cback bda :%02x-%02x-%02x-%02x-%02x-%02x ", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); bt_bdaddr_t bdaddr; bdcpy(bdaddr.address, bda); @@ -936,15 +854,14 @@ static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, */ p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if); - if (p_reg && p_reg->p_cback) - { + if (p_reg && p_reg->p_cback) { /* there is no RM for GATT */ - if (transport == BTA_TRANSPORT_BR_EDR) - { - if (connected) + if (transport == BTA_TRANSPORT_BR_EDR) { + if (connected) { bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda); - else - bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda); + } else { + bta_sys_conn_close( BTA_ID_GATTS , BTA_ALL_APP_ID, bda); + } } cb_data.conn.conn_id = conn_id; @@ -953,10 +870,8 @@ static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, cb_data.conn.transport = transport; memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN); (*p_reg->p_cback)(evt, &cb_data); - } - else - { - APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if); + } else { + APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found", gatt_if); } } @@ -976,12 +891,10 @@ static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested) tBTA_GATT_TRANSPORT transport; tBTA_GATTS cb_data; - if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) - { + if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport)) { p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if); - if (p_rcb && p_rcb->p_cback) - { + if (p_rcb && p_rcb->p_cback) { cb_data.congest.conn_id = conn_id; cb_data.congest.congested = congested; diff --git a/components/bt/bluedroid/bta/gatt/bta_gatts_api.c b/components/bt/bluedroid/bta/gatt/bta_gatts_api.c old mode 100755 new mode 100644 index 7f0954e4f..757ab8ff0 --- a/components/bt/bluedroid/bta/gatt/bta_gatts_api.c +++ b/components/bt/bluedroid/bta/gatt/bta_gatts_api.c @@ -36,8 +36,7 @@ ** Constants *****************************************************************************/ -static const tBTA_SYS_REG bta_gatts_reg = -{ +static const tBTA_SYS_REG bta_gatts_reg = { bta_gatts_hdl_event, BTA_GATTS_Disable }; @@ -57,14 +56,12 @@ void BTA_GATTS_Disable(void) { BT_HDR *p_buf; - if (bta_sys_is_register(BTA_ID_GATTS) == FALSE) - { + if (bta_sys_is_register(BTA_ID_GATTS) == FALSE) { APPL_TRACE_WARNING("GATTS Module not enabled/already disabled"); return; } - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTS_API_DISABLE_EVT; bta_sys_sendmsg(p_buf); } @@ -90,17 +87,16 @@ void BTA_GATTS_AppRegister(tBT_UUID *p_app_uuid, tBTA_GATTS_CBACK *p_cback) tBTA_GATTS_API_REG *p_buf; /* register with BTA system manager */ - if (bta_sys_is_register(BTA_ID_GATTS) == FALSE) - { + if (bta_sys_is_register(BTA_ID_GATTS) == FALSE) { bta_sys_register(BTA_ID_GATTS, &bta_gatts_reg); } - if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_REG_EVT; - if (p_app_uuid != NULL) + if (p_app_uuid != NULL) { memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID)); + } p_buf->p_cback = p_cback; bta_sys_sendmsg(p_buf); @@ -125,8 +121,7 @@ void BTA_GATTS_AppDeregister(tBTA_GATTS_IF server_if) { tBTA_GATTS_API_DEREG *p_buf; - if ((p_buf = (tBTA_GATTS_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTS_API_DEREG))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTS_API_DEREG))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_DEREG_EVT; p_buf->server_if = server_if; @@ -159,15 +154,14 @@ void BTA_GATTS_CreateService(tBTA_GATTS_IF server_if, tBT_UUID *p_service_uuid, { tBTA_GATTS_API_CREATE_SRVC *p_buf; - if ((p_buf = (tBTA_GATTS_API_CREATE_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_CREATE_SRVC))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_CREATE_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_CREATE_SRVC))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_CREATE_SRVC_EVT; p_buf->server_if = server_if; p_buf->inst = inst; memcpy(&p_buf->service_uuid, p_service_uuid, sizeof(tBT_UUID)); p_buf->num_handle = num_handle; - p_buf->is_pri = is_primary; + p_buf->is_pri = is_primary; bta_sys_sendmsg(p_buf); } @@ -193,9 +187,8 @@ void BTA_GATTS_AddIncludeService(UINT16 service_id, UINT16 included_service_id) tBTA_GATTS_API_ADD_INCL_SRVC *p_buf; if ((p_buf = - (tBTA_GATTS_API_ADD_INCL_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_INCL_SRVC))) - != NULL) - { + (tBTA_GATTS_API_ADD_INCL_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_INCL_SRVC))) + != NULL) { p_buf->hdr.event = BTA_GATTS_API_ADD_INCL_SRVC_EVT; p_buf->hdr.layer_specific = service_id; @@ -226,8 +219,7 @@ void BTA_GATTS_AddCharacteristic (UINT16 service_id, tBT_UUID *p_char_uuid, { tBTA_GATTS_API_ADD_CHAR *p_buf; - if ((p_buf = (tBTA_GATTS_API_ADD_CHAR *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_CHAR))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_ADD_CHAR *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_CHAR))) != NULL) { memset(p_buf, 0, sizeof(tBTA_GATTS_API_ADD_CHAR)); p_buf->hdr.event = BTA_GATTS_API_ADD_CHAR_EVT; @@ -235,8 +227,7 @@ void BTA_GATTS_AddCharacteristic (UINT16 service_id, tBT_UUID *p_char_uuid, p_buf->perm = perm; p_buf->property = property; - if (p_char_uuid) - { + if (p_char_uuid) { memcpy(&p_buf->char_uuid, p_char_uuid, sizeof(tBT_UUID)); } bta_sys_sendmsg(p_buf); @@ -262,22 +253,20 @@ void BTA_GATTS_AddCharacteristic (UINT16 service_id, tBT_UUID *p_char_uuid, *******************************************************************************/ void BTA_GATTS_AddCharDescriptor (UINT16 service_id, tBTA_GATT_PERM perm, - tBT_UUID * p_descr_uuid) + tBT_UUID *p_descr_uuid) { tBTA_GATTS_API_ADD_DESCR *p_buf; UINT16 len = sizeof(tBTA_GATTS_API_ADD_DESCR); - if ((p_buf = (tBTA_GATTS_API_ADD_DESCR *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_ADD_DESCR *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTS_API_ADD_DESCR_EVT; p_buf->hdr.layer_specific = service_id; p_buf->perm = perm; - if (p_descr_uuid) - { + if (p_descr_uuid) { memcpy(&p_buf->descr_uuid, p_descr_uuid, sizeof(tBT_UUID)); } bta_sys_sendmsg(p_buf); @@ -302,8 +291,7 @@ void BTA_GATTS_DeleteService(UINT16 service_id) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTS_API_DEL_SRVC_EVT; p_buf->layer_specific = service_id; @@ -330,8 +318,7 @@ void BTA_GATTS_StartService(UINT16 service_id, tBTA_GATT_TRANSPORT sup_transpor { tBTA_GATTS_API_START *p_buf; - if ((p_buf = (tBTA_GATTS_API_START *) GKI_getbuf(sizeof(tBTA_GATTS_API_START))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_START *) GKI_getbuf(sizeof(tBTA_GATTS_API_START))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_START_SRVC_EVT; p_buf->hdr.layer_specific = service_id; @@ -357,8 +344,7 @@ void BTA_GATTS_StopService(UINT16 service_id) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTS_API_STOP_SRVC_EVT; p_buf->layer_specific = service_id; @@ -375,7 +361,7 @@ void BTA_GATTS_StopService(UINT16 service_id) ** Description This function is called to read a characteristics descriptor. ** ** Parameters bda - remote device bd address to indicate. -** attr_id - attribute ID to indicate. +** attr_id - attribute ID to indicate. ** data_len - indicate data length. ** p_data: data to indicate. ** need_confirm - if this indication expects a confirmation or not. @@ -389,8 +375,7 @@ void BTA_GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_id, UINT16 dat tBTA_GATTS_API_INDICATION *p_buf; UINT16 len = sizeof(tBTA_GATTS_API_INDICATION); - if ((p_buf = (tBTA_GATTS_API_INDICATION *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_INDICATION *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTS_API_INDICATION_EVT; @@ -398,8 +383,7 @@ void BTA_GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_id, UINT16 dat p_buf->attr_id = attr_id; p_buf->need_confirm = need_confirm; - if (data_len > 0 && p_data != NULL) - { + if (data_len > 0 && p_data != NULL) { p_buf->len = data_len; memcpy(p_buf->value, p_data, data_len); @@ -429,8 +413,7 @@ void BTA_GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id, tBTA_GATTS_API_RSP *p_buf; UINT16 len = sizeof(tBTA_GATTS_API_RSP) + sizeof(tBTA_GATTS_RSP); - if ((p_buf = (tBTA_GATTS_API_RSP *) GKI_getbuf(len)) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_RSP *) GKI_getbuf(len)) != NULL) { memset(p_buf, 0, len); p_buf->hdr.event = BTA_GATTS_API_RSP_EVT; @@ -438,8 +421,7 @@ void BTA_GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id, p_buf->trans_id = trans_id; p_buf->status = status; - if (p_msg != NULL) - { + if (p_msg != NULL) { p_buf->p_rsp = (tBTA_GATTS_RSP *)(p_buf + 1); memcpy(p_buf->p_rsp, p_msg, sizeof(tBTA_GATTS_RSP)); } @@ -472,8 +454,7 @@ void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_dire { tBTA_GATTS_API_OPEN *p_buf; - if ((p_buf = (tBTA_GATTS_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_OPEN))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_OPEN))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_OPEN_EVT; p_buf->server_if = server_if; p_buf->is_direct = is_direct; @@ -504,8 +485,7 @@ void BTA_GATTS_CancelOpen(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN i { tBTA_GATTS_API_CANCEL_OPEN *p_buf; - if ((p_buf = (tBTA_GATTS_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_CANCEL_OPEN))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_CANCEL_OPEN))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_CANCEL_OPEN_EVT; p_buf->server_if = server_if; p_buf->is_direct = is_direct; @@ -530,8 +510,7 @@ void BTA_GATTS_Close(UINT16 conn_id) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_GATTS_API_CLOSE_EVT; p_buf->layer_specific = conn_id; bta_sys_sendmsg(p_buf); @@ -558,20 +537,18 @@ void BTA_GATTS_Listen(tBTA_GATTS_IF server_if, BOOLEAN start, BD_ADDR_PTR target { tBTA_GATTS_API_LISTEN *p_buf; - if ((p_buf = (tBTA_GATTS_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTS_API_LISTEN) + BD_ADDR_LEN))) != NULL) - { + if ((p_buf = (tBTA_GATTS_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTS_API_LISTEN) + BD_ADDR_LEN))) != NULL) { p_buf->hdr.event = BTA_GATTS_API_LISTEN_EVT; p_buf->server_if = server_if; p_buf->start = start; - if (target_bda) - { - p_buf->remote_bda = (UINT8*)(p_buf + 1); + if (target_bda) { + p_buf->remote_bda = (UINT8 *)(p_buf + 1); memcpy(p_buf->remote_bda, target_bda, BD_ADDR_LEN); - } - else + } else { p_buf->remote_bda = NULL; + } bta_sys_sendmsg(p_buf); } diff --git a/components/bt/bluedroid/bta/gatt/bta_gatts_main.c b/components/bt/bluedroid/bta/gatt/bta_gatts_main.c old mode 100755 new mode 100644 index 716c7c94e..d59115d42 --- a/components/bt/bluedroid/bta/gatt/bta_gatts_main.c +++ b/components/bt/bluedroid/bta/gatt/bta_gatts_main.c @@ -35,8 +35,7 @@ typedef void (*tBTA_GATTS_SRVC_ACT)(tBTA_GATTS_SRVC_CB *p_rcb, tBTA_GATTS_DATA *p_data); /* service building action function list */ -const tBTA_GATTS_SRVC_ACT bta_gatts_srvc_build_act[] = -{ +const tBTA_GATTS_SRVC_ACT bta_gatts_srvc_build_act[] = { bta_gatts_add_include_srvc, bta_gatts_add_char, bta_gatts_add_char_descr, @@ -65,76 +64,71 @@ BOOLEAN bta_gatts_hdl_event(BT_HDR *p_msg) tBTA_GATTS_CB *p_cb = &bta_gatts_cb; tBTA_GATTS_SRVC_CB *p_srvc_cb = NULL; - switch (p_msg->event) - { - case BTA_GATTS_API_DISABLE_EVT: - bta_gatts_api_disable(p_cb); - break; + switch (p_msg->event) { + case BTA_GATTS_API_DISABLE_EVT: + bta_gatts_api_disable(p_cb); + break; - case BTA_GATTS_API_REG_EVT: - LOG_ERROR("bta_gatts_register\n"); - bta_gatts_register(p_cb, (tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_REG_EVT: + bta_gatts_register(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_INT_START_IF_EVT: - bta_gatts_start_if(p_cb, (tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_INT_START_IF_EVT: + bta_gatts_start_if(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_DEREG_EVT: - bta_gatts_deregister(p_cb, (tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_DEREG_EVT: + bta_gatts_deregister(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_CREATE_SRVC_EVT: - bta_gatts_create_srvc(p_cb, (tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_CREATE_SRVC_EVT: + bta_gatts_create_srvc(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_INDICATION_EVT: - bta_gatts_indicate_handle(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_INDICATION_EVT: + bta_gatts_indicate_handle(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_OPEN_EVT: - bta_gatts_open(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_OPEN_EVT: + bta_gatts_open(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_CANCEL_OPEN_EVT: - bta_gatts_cancel_open(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_CANCEL_OPEN_EVT: + bta_gatts_cancel_open(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_CLOSE_EVT: - bta_gatts_close(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_CLOSE_EVT: + bta_gatts_close(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_RSP_EVT: - bta_gatts_send_rsp(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_RSP_EVT: + bta_gatts_send_rsp(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_LISTEN_EVT: - bta_gatts_listen(p_cb,(tBTA_GATTS_DATA *) p_msg); - break; + case BTA_GATTS_API_LISTEN_EVT: + bta_gatts_listen(p_cb, (tBTA_GATTS_DATA *) p_msg); + break; - case BTA_GATTS_API_ADD_INCL_SRVC_EVT: - case BTA_GATTS_API_ADD_CHAR_EVT: - case BTA_GATTS_API_ADD_DESCR_EVT: - case BTA_GATTS_API_DEL_SRVC_EVT: - case BTA_GATTS_API_START_SRVC_EVT: - case BTA_GATTS_API_STOP_SRVC_EVT: + case BTA_GATTS_API_ADD_INCL_SRVC_EVT: + case BTA_GATTS_API_ADD_CHAR_EVT: + case BTA_GATTS_API_ADD_DESCR_EVT: + case BTA_GATTS_API_DEL_SRVC_EVT: + case BTA_GATTS_API_START_SRVC_EVT: + case BTA_GATTS_API_STOP_SRVC_EVT: - p_srvc_cb = bta_gatts_find_srvc_cb_by_srvc_id(p_cb, - ((tBTA_GATTS_DATA *)p_msg)->api_add_incl_srvc.hdr.layer_specific); + p_srvc_cb = bta_gatts_find_srvc_cb_by_srvc_id(p_cb, + ((tBTA_GATTS_DATA *)p_msg)->api_add_incl_srvc.hdr.layer_specific); - if (p_srvc_cb != NULL) - { - bta_gatts_srvc_build_act[p_msg->event - BTA_GATTS_API_ADD_INCL_SRVC_EVT](p_srvc_cb, (tBTA_GATTS_DATA *) p_msg); - } - else - { - APPL_TRACE_ERROR("service not created"); - } - break; + if (p_srvc_cb != NULL) { + bta_gatts_srvc_build_act[p_msg->event - BTA_GATTS_API_ADD_INCL_SRVC_EVT](p_srvc_cb, (tBTA_GATTS_DATA *) p_msg); + } else { + APPL_TRACE_ERROR("service not created"); + } + break; - default: - break; + default: + break; } diff --git a/components/bt/bluedroid/bta/gatt/bta_gatts_utils.c b/components/bt/bluedroid/bta/gatt/bta_gatts_utils.c old mode 100755 new mode 100644 index c5deef302..b79bdd0bc --- a/components/bt/bluedroid/bta/gatt/bta_gatts_utils.c +++ b/components/bt/bluedroid/bta/gatt/bta_gatts_utils.c @@ -33,7 +33,8 @@ #include "bta_gatts_int.h" static const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; /******************************************************************************* ** @@ -65,10 +66,8 @@ UINT8 bta_gatts_alloc_srvc_cb(tBTA_GATTS_CB *p_cb, UINT8 rcb_idx) { UINT8 i; - for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++) - { - if (!p_cb->srvc_cb[i].in_use) - { + for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++) { + if (!p_cb->srvc_cb[i].in_use) { p_cb->srvc_cb[i].in_use = TRUE; p_cb->srvc_cb[i].rcb_idx = rcb_idx; return i; @@ -91,10 +90,10 @@ tBTA_GATTS_RCB *bta_gatts_find_app_rcb_by_app_if(tBTA_GATTS_IF server_if) UINT8 i; tBTA_GATTS_RCB *p_reg; - for (i = 0, p_reg = bta_gatts_cb.rcb; i < BTA_GATTS_MAX_APP_NUM; i ++, p_reg++) - { - if (p_reg->in_use && p_reg->gatt_if == server_if) + for (i = 0, p_reg = bta_gatts_cb.rcb; i < BTA_GATTS_MAX_APP_NUM; i ++, p_reg++) { + if (p_reg->in_use && p_reg->gatt_if == server_if) { return p_reg; + } } return NULL; } @@ -113,10 +112,10 @@ UINT8 bta_gatts_find_app_rcb_idx_by_app_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_IF se { UINT8 i; - for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) - { - if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == server_if) + for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++) { + if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == server_if) { return i; + } } return BTA_GATTS_INVALID_APP; } @@ -129,15 +128,13 @@ UINT8 bta_gatts_find_app_rcb_idx_by_app_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_IF se ** Returns pointer to the rcb. ** *******************************************************************************/ -tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id) +tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id) { UINT8 i; APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id service_id=%d", service_id); - for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++) - { + for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++) { if (p_cb->srvc_cb[i].in_use && - p_cb->srvc_cb[i].service_id == service_id) - { + p_cb->srvc_cb[i].service_id == service_id) { APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id found service cb index =%d", i); return &p_cb->srvc_cb[i]; } @@ -153,12 +150,11 @@ tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT ** Returns pointer to the rcb. ** *******************************************************************************/ -tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT16 attr_id) +tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT16 attr_id) { UINT8 i; - for (i = 0; i < (BTA_GATTS_MAX_SRVC_NUM); i ++) - { + for (i = 0; i < (BTA_GATTS_MAX_SRVC_NUM); i ++) { if (/* middle service */ (i < (BTA_GATTS_MAX_SRVC_NUM - 1) && p_cb->srvc_cb[i].in_use && @@ -173,8 +169,7 @@ tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT /* last service incb */ (i == (BTA_GATTS_MAX_SRVC_NUM - 1) && attr_id >= p_cb->srvc_cb[i].service_id) - ) - { + ) { return &p_cb->srvc_cb[i]; } } @@ -195,37 +190,33 @@ BOOLEAN bta_gatts_uuid_compare(tBT_UUID tar, tBT_UUID src) UINT8 *ps, *pt; /* any of the UUID is unspecified */ - if (src.len == 0 || tar.len == 0) - { + if (src.len == 0 || tar.len == 0) { return TRUE; } /* If both are 16-bit, we can do a simple compare */ - if (src.len == 2 && tar.len == 2) - { + if (src.len == 2 && tar.len == 2) { return src.uu.uuid16 == tar.uu.uuid16; } /* One or both of the UUIDs is 128-bit */ - if (src.len == LEN_UUID_16) - { + if (src.len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ bta_gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16); ps = su; - } - else + } else { ps = src.uu.uuid128; + } - if (tar.len == LEN_UUID_16) - { + if (tar.len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ bta_gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16); pt = tu; - } - else + } else { pt = tar.uu.uuid128; + } - return(memcmp(ps, pt, LEN_UUID_128) == 0); + return (memcmp(ps, pt, LEN_UUID_128) == 0); } diff --git a/components/bt/bluedroid/bta/hh/bta_hh_act.c b/components/bt/bluedroid/bta/hh/bta_hh_act.c index fdcc99821..e874ed310 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_act.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_act.c @@ -44,12 +44,12 @@ ** Local Function prototypes *****************************************************************************/ static void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, - UINT32 data, BT_HDR *pdata); + UINT32 data, BT_HDR *pdata); static tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result); #if BTA_HH_DEBUG -static char* bta_hh_get_w4_event(UINT16 event); -static char * bta_hh_hid_event_name(UINT16 event); +static char *bta_hh_get_w4_event(UINT16 event); +static char *bta_hh_hid_event_name(UINT16 event); #endif /***************************************************************************** @@ -78,31 +78,28 @@ void bta_hh_api_enable(tBTA_HH_DATA *p_data) HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask); /* Register with L2CAP */ - if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS) - { + if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS) { /* store parameters */ bta_hh_cb.p_cback = p_data->api_enable.p_cback; status = BTA_HH_OK; /* initialize device CB */ - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) - { + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) { bta_hh_cb.kdev[xx].state = BTA_HH_IDLE_ST; bta_hh_cb.kdev[xx].hid_handle = BTA_HH_INVALID_HANDLE; bta_hh_cb.kdev[xx].index = xx; } /* initialize control block map */ - for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++) + for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++) { bta_hh_cb.cb_index[xx] = BTA_HH_IDX_INVALID; + } } #if (BTA_HH_LE_INCLUDED == TRUE) - if (status == BTA_HH_OK) - { + if (status == BTA_HH_OK) { bta_hh_le_enable(); - } - else + } else #endif /* signal BTA call back event */ (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); @@ -122,27 +119,23 @@ void bta_hh_api_disable(void) UINT8 xx; /* service is not enabled */ - if (bta_hh_cb.p_cback == NULL) + if (bta_hh_cb.p_cback == NULL) { return; + } /* no live connection, signal DISC_CMPL_EVT directly */ - if (!bta_hh_cb.cnt_num) - { + if (!bta_hh_cb.cnt_num) { bta_hh_disc_cmpl(); - } - else /* otherwise, disconnect all live connections */ - { + } else { /* otherwise, disconnect all live connections */ bta_hh_cb.w4_disable = TRUE; - for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) - { + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) { /* send API_CLOSE event to every connected device */ - if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST ) - { + if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST ) { /* disconnect all connected devices */ bta_hh_sm_execute(&bta_hh_cb.kdev[xx], - BTA_HH_API_CLOSE_EVT, - NULL); + BTA_HH_API_CLOSE_EVT, + NULL); } } } @@ -165,8 +158,9 @@ void bta_hh_disc_cmpl(void) tBTA_HH_STATUS status = BTA_HH_OK; /* Deregister with lower layer */ - if (HID_HostDeregister() != HID_SUCCESS) + if (HID_HostDeregister() != HID_SUCCESS) { status = BTA_HH_ERR; + } #if (BTA_HH_LE_INCLUDED == TRUE) bta_hh_le_deregister(); @@ -186,67 +180,59 @@ void bta_hh_disc_cmpl(void) ** *******************************************************************************/ static void bta_hh_sdp_cback(UINT16 result, UINT16 attr_mask, - tHID_DEV_SDP_INFO *sdp_rec ) + tHID_DEV_SDP_INFO *sdp_rec ) { tBTA_HH_DEV_CB *p_cb = bta_hh_cb.p_cur; UINT8 hdl = 0; tBTA_HH_STATUS status = BTA_HH_ERR_SDP; /* make sure sdp succeeded and hh has not been disabled */ - if ((result == SDP_SUCCESS) && (p_cb != NULL)) - { + if ((result == SDP_SUCCESS) && (p_cb != NULL)) { /* security is required for the connection, add attr_mask bit*/ - if (p_cb->sec_mask) + if (p_cb->sec_mask) { attr_mask |= HID_SEC_REQUIRED; + } #if BTA_HH_DEBUG APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \ attr_mask 0x%02x, handle %x", \ - p_cb, result, attr_mask,p_cb->hid_handle); + p_cb, result, attr_mask, p_cb->hid_handle); #endif /* check to see type of device is supported , and should not been added before */ - if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) - { + if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class)) { /* if not added before */ - if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) - { + if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { /* add device/update attr_mask information */ - if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) - { + if (HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS) { status = BTA_HH_OK; /* update cb_index[] map */ bta_hh_cb.cb_index[hdl] = p_cb->index; - } - else - { + } else { p_cb->app_id = 0; } - } - else - { + } else { hdl = p_cb->hid_handle; } /* else : incoming connection after SDP should update the SDP information as well */ - if (p_cb->app_id != 0) - { + if (p_cb->app_id != 0) { /* update cb information with attr_mask, dscp_info etc. */ bta_hh_add_device_to_list(p_cb, hdl, attr_mask, - &sdp_rec->dscp_info, - sdp_rec->sub_class, - sdp_rec->ssr_max_latency, - sdp_rec->ssr_min_tout, - p_cb->app_id); + &sdp_rec->dscp_info, + sdp_rec->sub_class, + sdp_rec->ssr_max_latency, + sdp_rec->ssr_min_tout, + p_cb->app_id); p_cb->dscp_info.ctry_code = sdp_rec->ctry_code; status = BTA_HH_OK; } - } - else /* type of device is not supported */ + } else { /* type of device is not supported */ status = BTA_HH_ERR_TOD_UNSPT; + } } /* free disc_db when SDP is completed */ @@ -280,41 +266,32 @@ static void bta_hh_di_sdp_cback(UINT16 result) * set to 0xffff and we will allow the connection to go through. Spec mandates that DI * record be set, but many HID devices do not set this. So for IOP purposes, we allow the * connection to go through and update the DI record to invalid DI entry.*/ - if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL)) - { - if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) - { + if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL)) { + if (result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) { /* always update information with primary DI record */ - if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) - { + if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) { bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0); } - } - else /* no DI recrod available */ - { + } else { /* no DI recrod available */ bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0); } if ((ret = HID_HostGetSDPRecord(p_cb->addr, - bta_hh_cb.p_disc_db, - p_bta_hh_cfg->sdp_db_size, - bta_hh_sdp_cback)) == HID_SUCCESS) - { + bta_hh_cb.p_disc_db, + p_bta_hh_cfg->sdp_db_size, + bta_hh_sdp_cback)) == HID_SUCCESS) { status = BTA_HH_OK; - } - else - { + } else { #if BTA_HH_DEBUG APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback: HID_HostGetSDPRecord failed: Status 0x%2x", - ret); + ret); #endif } } - if (status != BTA_HH_OK) - { + if (status != BTA_HH_OK) { utl_freebuf((void **)&bta_hh_cb.p_disc_db); /* send SDP_CMPL_EVT into state machine */ bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); @@ -346,25 +323,21 @@ void bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) bta_hh_cb.p_cur = p_cb; #if (BTA_HH_LE_INCLUDED == TRUE) - if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) - { + if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr); return; } #endif /* if previously virtually cabled device, skip SDP */ - if (p_cb->app_id) - { + if (p_cb->app_id) { status = BTA_HH_OK; #if BTA_HH_DEBUG APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices"); #endif - if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) - { + if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { if (HID_HostAddDev (p_cb->addr, p_cb->attr_mask, &hdl) \ - == HID_SUCCESS) - { + == HID_SUCCESS) { /* update device CB with newly register device handle */ bta_hh_add_device_to_list(p_cb, hdl, p_cb->attr_mask, NULL, p_cb->sub_class, @@ -373,46 +346,42 @@ void bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) p_cb->app_id); /* update cb_index[] map */ bta_hh_cb.cb_index[hdl] = p_cb->index; - } - else + } else { status = BTA_HH_ERR_NO_RES; + } } bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); return; } /* GetSDPRecord. at one time only one SDP precedure can be active */ - else if (!bta_hh_cb.p_disc_db) - { + else if (!bta_hh_cb.p_disc_db) { bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(p_bta_hh_cfg->sdp_db_size); - if (bta_hh_cb.p_disc_db == NULL) - { + if (bta_hh_cb.p_disc_db == NULL) { status = BTA_HH_ERR_NO_RES; - } - else - { + } else { bta_hh_cb.p_cur = p_cb; /* do DI discovery first */ if (SDP_DiDiscover(p_data->api_conn.bd_addr, - bta_hh_cb.p_disc_db, - p_bta_hh_cfg->sdp_db_size, - bta_hh_di_sdp_cback) != SDP_SUCCESS) - { + bta_hh_cb.p_disc_db, + p_bta_hh_cfg->sdp_db_size, + bta_hh_di_sdp_cback) != SDP_SUCCESS) { #if BTA_HH_DEBUG APPL_TRACE_DEBUG ("bta_hh_start_sdp: SDP_DiDiscover failed: \ - Status 0x%2X",status); + Status 0x%2X", status); #endif status = BTA_HH_ERR_SDP; utl_freebuf((void **)&bta_hh_cb.p_disc_db); - } - else + } else { status = BTA_HH_OK; + } } } - if (status != BTA_HH_OK) + if (status != BTA_HH_OK) { bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); + } return; @@ -434,7 +403,7 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) tBTA_HH_STATUS status = p_data->status; #if BTA_HH_DEBUG - APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X",p_data->status); + APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: status 0x%2X", p_data->status); #endif /* initialize call back data */ @@ -443,48 +412,39 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) bdcpy(conn_dat.bda, p_cb->addr); /* if SDP compl success */ - if ( status == BTA_HH_OK) - { + if ( status == BTA_HH_OK) { /* not incoming connection doing SDP, initiate a HID connection */ - if (!p_cb->incoming_conn) - { + if (!p_cb->incoming_conn) { tHID_STATUS ret; /* set security level */ HID_HostSetSecurityLevel("", p_cb->sec_mask); /* open HID connection */ - if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS) - { + if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS) { #if BTA_HH_DEBUG APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: HID_HostOpenDev failed: \ - Status 0x%2X",ret); + Status 0x%2X", ret); #endif /* open fail, remove device from management device list */ HID_HostRemoveDev( p_cb->hid_handle); status = BTA_HH_ERR; - } - else - { + } else { status = BTA_HH_OK; } - } - else /* incoming connection SDP finish */ - { + } else { /* incoming connection SDP finish */ bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); } } - if (status != BTA_HH_OK) - { + if (status != BTA_HH_OK) { /* Check if this was incoming connection request from an unknown device **and connection failed due to missing HID Device SDP UUID **In above condition, disconnect the link as well as remove the **device from list of HID devices*/ if ((status == BTA_HH_ERR_SDP) && - (p_cb->incoming_conn) &&(p_cb->app_id == 0)) - { + (p_cb->incoming_conn) && (p_cb->app_id == 0)) { APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for incoming conn :hndl %d", - p_cb->incoming_hid_handle); + p_cb->incoming_hid_handle); HID_HostRemoveDev( p_cb->incoming_hid_handle); } conn_dat.status = status; @@ -494,8 +454,7 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); /* if this is an outgoing connection to an unknown device, clean up cb */ - if (p_cb->app_id == 0 && !p_cb->incoming_conn) - { + if (p_cb->app_id == 0 && !p_cb->incoming_conn) { /* clean up device control block */ bta_hh_clean_up_kdev(p_cb); } @@ -522,19 +481,20 @@ void bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) tHID_STATUS status; #if BTA_HH_LE_INCLUDED == TRUE - if (p_cb->is_le_device) + if (p_cb->is_le_device) { bta_hh_le_api_disc_act(p_cb); - else + } else #endif { /* found an active connection */ - disc_dat.handle = p_data ?(UINT8)p_data->hdr.layer_specific :p_cb->hid_handle; + disc_dat.handle = p_data ? (UINT8)p_data->hdr.layer_specific : p_cb->hid_handle; disc_dat.status = BTA_HH_ERR; status = HID_HostCloseDev(disc_dat.handle); - if (status) + if (status) { (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); + } } return; @@ -554,7 +514,7 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { tBTA_HH_CONN conn ; UINT8 dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \ - p_cb->hid_handle; + p_cb->hid_handle; memset((void *)&conn, 0, sizeof (tBTA_HH_CONN)); conn.handle = dev_handle; @@ -565,7 +525,7 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) /* initialize device driver */ bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class, - p_cb->attr_mask, p_cb->app_id); + p_cb->attr_mask, p_cb->app_id); #if (BTA_HH_LE_INCLUDED == TRUE) conn.status = p_cb->status; @@ -576,32 +536,28 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) #endif { /* inform role manager */ - bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr); + bta_sys_conn_open( BTA_ID_HH , p_cb->app_id, p_cb->addr); } /* set protocol mode when not default report mode */ if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE #if (BTA_HH_LE_INCLUDED == TRUE) - && !p_cb->is_le_device + && !p_cb->is_le_device #endif - ) - { + ) { if ((HID_HostWriteDev(dev_handle, HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE, 0, - 0, NULL)) != HID_SUCCESS) - { + 0, NULL)) != HID_SUCCESS) { /* HID connection is up, while SET_PROTO fail */ conn.status = BTA_HH_ERR_PROTO; (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); - } - else - { + } else { conn.status = BTA_HH_OK; p_cb->w4_evt = BTA_HH_OPEN_EVT; } - } - else + } else { (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn); + } p_cb->incoming_conn = FALSE; p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE; @@ -622,20 +578,18 @@ void bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) tBTA_HH_API_CONN conn_data; UINT8 dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \ - p_cb->hid_handle; + p_cb->hid_handle; #if BTA_HH_DEBUG APPL_TRACE_EVENT ("bta_hh_open_act: Device[%d] connected", dev_handle); #endif /* SDP has been done */ - if (p_cb->app_id != 0) - { + if (p_cb->app_id != 0) { bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data); - } - else - /* app_id == 0 indicates an incoming conenction request arrives without SDP - performed, do it first */ + } else + /* app_id == 0 indicates an incoming conenction request arrives without SDP + performed, do it first */ { p_cb->incoming_conn = TRUE; /* store the handle here in case sdp fails - need to disconnect */ @@ -660,13 +614,13 @@ void bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) ** Returns void ** *******************************************************************************/ -void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) +void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { BT_HDR *pdata = p_data->hid_cback.p_data; UINT8 *p_rpt = (UINT8 *)(pdata + 1) + pdata->offset; bta_hh_co_data((UINT8)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len, - p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); + p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id); utl_freebuf((void **)&pdata); } @@ -682,7 +636,7 @@ void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) ** Returns void ** *******************************************************************************/ -void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) +void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { tBTA_HH_CBDATA cback_data ; tBTA_HH_HSDATA hs_data; @@ -690,55 +644,55 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) #if BTA_HH_DEBUG APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d", - bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); + bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data); #endif memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA)); memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA)); - switch (p_cb->w4_evt) - { - /* GET_ transsaction, handshake indicate unsupported request */ - case BTA_HH_GET_PROTO_EVT: - hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; - /* fall through */ - case BTA_HH_GET_RPT_EVT: - case BTA_HH_GET_IDLE_EVT : - hs_data.handle = p_cb->hid_handle; - /* if handshake gives an OK code for these transaction, fill in UNSUPT */ - if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK) - hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; + switch (p_cb->w4_evt) { + /* GET_ transsaction, handshake indicate unsupported request */ + case BTA_HH_GET_PROTO_EVT: + hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN; + /* fall through */ + case BTA_HH_GET_RPT_EVT: + case BTA_HH_GET_IDLE_EVT : + hs_data.handle = p_cb->hid_handle; + /* if handshake gives an OK code for these transaction, fill in UNSUPT */ + if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK) { + hs_data.status = BTA_HH_HS_TRANS_NOT_SPT; + } - (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); - p_cb->w4_evt = 0; - break; + (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data); + p_cb->w4_evt = 0; + break; - /* acknoledgement from HID device for SET_ transaction */ - case BTA_HH_SET_RPT_EVT: - case BTA_HH_SET_PROTO_EVT: - case BTA_HH_SET_IDLE_EVT : - cback_data.handle = p_cb->hid_handle; - cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); - (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data); - p_cb->w4_evt = 0; - break; + /* acknoledgement from HID device for SET_ transaction */ + case BTA_HH_SET_RPT_EVT: + case BTA_HH_SET_PROTO_EVT: + case BTA_HH_SET_IDLE_EVT : + cback_data.handle = p_cb->hid_handle; + cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data); + (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data); + p_cb->w4_evt = 0; + break; - /* SET_PROTOCOL when open connection */ - case BTA_HH_OPEN_EVT: - conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK; - conn.handle = p_cb->hid_handle; - bdcpy(conn.bda, p_cb->addr); - (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn); + /* SET_PROTOCOL when open connection */ + case BTA_HH_OPEN_EVT: + conn.status = p_data->hid_cback.data ? BTA_HH_ERR_PROTO : BTA_HH_OK; + conn.handle = p_cb->hid_handle; + bdcpy(conn.bda, p_cb->addr); + (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn); #if BTA_HH_DEBUG - bta_hh_trace_dev_db(); + bta_hh_trace_dev_db(); #endif - p_cb->w4_evt = 0; - break; + p_cb->w4_evt = 0; + break; - default: - /* unknow transaction handshake response */ - APPL_TRACE_DEBUG("unknown transaction type"); - break; + default: + /* unknow transaction handshake response */ + APPL_TRACE_DEBUG("unknown transaction type"); + break; } /* transaction achknoledgement received, inform PM for mode change */ @@ -755,7 +709,7 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) ** Returns void ** *******************************************************************************/ -void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) +void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { BT_HDR *pdata = p_data->hid_cback.p_data; UINT8 *data = (UINT8 *)(pdata + 1) + pdata->offset; @@ -763,13 +717,12 @@ void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) #if BTA_HH_DEBUG APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]", - bta_hh_get_w4_event(p_cb->w4_evt)); + bta_hh_get_w4_event(p_cb->w4_evt)); #endif hs_data.status = BTA_HH_OK; hs_data.handle = p_cb->hid_handle; - switch (p_cb->w4_evt) - { + switch (p_cb->w4_evt) { case BTA_HH_GET_IDLE_EVT: hs_data.rsp_data.idle_rate = *data; break; @@ -778,24 +731,24 @@ void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data) break; case BTA_HH_GET_PROTO_EVT: /* match up BTE/BTA report/boot mode def*/ - hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \ - BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; + hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT) ? \ + BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE; #if BTA_HH_DEBUG APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]", - (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); + (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report" : "Boot"); #endif break; /* should not expect control DATA for SET_ transaction */ case BTA_HH_SET_PROTO_EVT: - /* fall through */ + /* fall through */ case BTA_HH_SET_RPT_EVT: - /* fall through */ + /* fall through */ case BTA_HH_SET_IDLE_EVT : - /* fall through */ + /* fall through */ default: #if BTA_HH_DEBUG APPL_TRACE_DEBUG("invalid transaction type for DATA payload: 4_evt[%s]", - bta_hh_get_w4_event(p_cb->w4_evt)); + bta_hh_get_w4_event(p_cb->w4_evt)); #endif break; } @@ -828,14 +781,14 @@ void bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) UINT32 reason = p_data->hid_cback.data; /* Reason for closing (32-bit) */ memset(&conn_dat, 0, sizeof(tBTA_HH_CONN)); - conn_dat.handle = p_cb->hid_handle; - conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? - BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; - bdcpy(conn_dat.bda, p_cb->addr); - HID_HostCloseDev(p_cb->hid_handle); + conn_dat.handle = p_cb->hid_handle; + conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? + BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; + bdcpy(conn_dat.bda, p_cb->addr); + HID_HostCloseDev(p_cb->hid_handle); - /* Report OPEN fail event */ - (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); + /* Report OPEN fail event */ + (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); #if BTA_HH_DEBUG bta_hh_trace_dev_db(); @@ -845,8 +798,7 @@ void bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) p_cb->w4_evt = 0; /* if no connection is active and HH disable is signaled, disable service */ - if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) - { + if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) { bta_hh_disc_cmpl(); } @@ -875,10 +827,9 @@ void bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) disc_dat.status = p_data->hid_cback.data; /* Check reason for closing */ - if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */ - (reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ - (reason == HID_ERR_L2CAP_FAILED)) /* Failure creating l2cap connection */ - { + if ((reason & (HID_L2CAP_CONN_FAIL | HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */ + (reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */ + (reason == HID_ERR_L2CAP_FAILED)) { /* Failure creating l2cap connection */ /* Failure in opening connection */ conn_dat.handle = p_cb->hid_handle; conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR; @@ -894,23 +845,22 @@ void bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) return; } /* otherwise report CLOSE/VC_UNPLUG event */ - else - { + else { /* finaliza device driver */ bta_hh_co_close(p_cb->hid_handle, p_cb->app_id); /* inform role manager */ - bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr); + bta_sys_conn_close( BTA_ID_HH , p_cb->app_id, p_cb->addr); /* update total conn number */ bta_hh_cb.cnt_num --; - if (disc_dat.status) + if (disc_dat.status) { disc_dat.status = BTA_HH_ERR; + } (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat); /* if virtually unplug, remove device */ - if (p_cb->vp ) - { + if (p_cb->vp ) { HID_HostRemoveDev( p_cb->hid_handle); bta_hh_clean_up_kdev(p_cb); } @@ -925,8 +875,7 @@ void bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) p_cb->w4_evt = 0; /* if no connection is active and HH disable is signaled, disable service */ - if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) - { + if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) { bta_hh_disc_cmpl(); } @@ -948,13 +897,11 @@ void bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) UNUSED(p_data); #if (BTA_HH_LE_INCLUDED == TRUE) - if (p_cb->is_le_device) - { + if (p_cb->is_le_device) { bta_hh_le_get_dscp_act(p_cb); - } - else + } else #endif - (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); + (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); } /******************************************************************************* @@ -976,57 +923,50 @@ void bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) dev_info.status = BTA_HH_ERR; dev_info.handle = BTA_HH_INVALID_HANDLE; - switch (p_dev_info->sub_event) - { + switch (p_dev_info->sub_event) { case BTA_HH_ADD_DEV_EVT: /* add a device */ bdcpy(dev_info.bda, p_dev_info->bda); /* initialize callback data */ - if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) - { + if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE) { #if (BTA_HH_LE_INCLUDED == TRUE) - if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) - { + if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr)) { dev_info.handle = bta_hh_le_add_device(p_cb, p_dev_info); dev_info.status = BTA_HH_OK; - } - else + } else #endif - if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\ - == HID_SUCCESS) - { - dev_info.handle = dev_handle; - dev_info.status = BTA_HH_OK; + if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\ + == HID_SUCCESS) { + dev_info.handle = dev_handle; + dev_info.status = BTA_HH_OK; #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) - /* update DI information */ - bta_hh_update_di_info(p_cb, - p_dev_info->dscp_info.vendor_id, - p_dev_info->dscp_info.product_id, - p_dev_info->dscp_info.version, - p_dev_info->dscp_info.flag); + /* update DI information */ + bta_hh_update_di_info(p_cb, + p_dev_info->dscp_info.vendor_id, + p_dev_info->dscp_info.product_id, + p_dev_info->dscp_info.version, + p_dev_info->dscp_info.flag); #else - bta_hh_update_di_info(p_cb, - p_dev_info->dscp_info.vendor_id, - p_dev_info->dscp_info.product_id, - p_dev_info->dscp_info.version, - 0); + bta_hh_update_di_info(p_cb, + p_dev_info->dscp_info.vendor_id, + p_dev_info->dscp_info.product_id, + p_dev_info->dscp_info.version, + 0); #endif - /* add to BTA device list */ - bta_hh_add_device_to_list(p_cb, dev_handle, - p_dev_info->attr_mask, - &p_dev_info->dscp_info.descriptor, - p_dev_info->sub_class, - p_dev_info->dscp_info.ssr_max_latency, - p_dev_info->dscp_info.ssr_min_tout, - p_dev_info->app_id); - /* update cb_index[] map */ - bta_hh_cb.cb_index[dev_handle] = p_cb->index; - } - } - else /* device already been added */ - { + /* add to BTA device list */ + bta_hh_add_device_to_list(p_cb, dev_handle, + p_dev_info->attr_mask, + &p_dev_info->dscp_info.descriptor, + p_dev_info->sub_class, + p_dev_info->dscp_info.ssr_max_latency, + p_dev_info->dscp_info.ssr_min_tout, + p_dev_info->app_id); + /* update cb_index[] map */ + bta_hh_cb.cb_index[dev_handle] = p_cb->index; + } + } else { /* device already been added */ dev_info.handle = p_cb->hid_handle; dev_info.status = BTA_HH_OK; } @@ -1040,17 +980,14 @@ void bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) bdcpy(dev_info.bda, p_cb->addr); #if BTA_HH_LE_INCLUDED == TRUE - if (p_cb->is_le_device) - { + if (p_cb->is_le_device) { bta_hh_le_remove_dev_bg_conn(p_cb); bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL); bta_hh_clean_up_kdev(p_cb); - } - else + } else #endif { - if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS) - { + if (HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS) { dev_info.status = BTA_HH_OK; /* remove from known device list in BTA */ @@ -1079,91 +1016,83 @@ void bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { tBTA_HH_CBDATA cbdata = {BTA_HH_OK, 0}; UINT16 event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + - BTA_HH_FST_TRANS_CB_EVT; + BTA_HH_FST_TRANS_CB_EVT; #if BTA_HH_LE_INCLUDED == TRUE - if (p_cb->is_le_device) + if (p_cb->is_le_device) { bta_hh_le_write_dev_act(p_cb, p_data); - else + } else #endif { - cbdata.handle = p_cb->hid_handle; + cbdata.handle = p_cb->hid_handle; - /* match up BTE/BTA report/boot mode def */ - if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) - { - p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\ - HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE; - } - - if (HID_HostWriteDev (p_cb->hid_handle, - p_data->api_sndcmd.t_type, - p_data->api_sndcmd.param, - p_data->api_sndcmd.data, - p_data->api_sndcmd.rpt_id, - p_data->api_sndcmd.p_data) != HID_SUCCESS) - { - APPL_TRACE_ERROR("HID_HostWriteDev Error "); - cbdata.status = BTA_HH_ERR; - - if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && - p_data->api_sndcmd.t_type != HID_TRANS_DATA) - (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata); - else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) - (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata); - } - else - { - - switch(p_data->api_sndcmd.t_type) - { - case HID_TRANS_SET_PROTOCOL: - /* fall through */ - case HID_TRANS_GET_REPORT: - /* fall through */ - case HID_TRANS_SET_REPORT: - /* fall through */ - case HID_TRANS_GET_PROTOCOL: - /* fall through */ - case HID_TRANS_GET_IDLE: - /* fall through */ - case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */ - p_cb->w4_evt = event; - break; - case HID_TRANS_DATA: /* output report */ - /* fall through */ - case HID_TRANS_CONTROL: - /* no handshake event will be generated */ - /* if VC_UNPLUG is issued, set flag */ - if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) - p_cb->vp = TRUE; - - break; - /* currently not expected */ - case HID_TRANS_DATAC: - default: - APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d", - p_data->api_sndcmd.t_type); - break; + /* match up BTE/BTA report/boot mode def */ + if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL) { + p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ? \ + HID_PAR_PROTOCOL_REPORT : HID_PAR_PROTOCOL_BOOT_MODE; } - /* if not control type transaction, notify PM for energy control */ - if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) - { - /* inform PM for mode change */ - bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); - bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); + if (HID_HostWriteDev (p_cb->hid_handle, + p_data->api_sndcmd.t_type, + p_data->api_sndcmd.param, + p_data->api_sndcmd.data, + p_data->api_sndcmd.rpt_id, + p_data->api_sndcmd.p_data) != HID_SUCCESS) { + APPL_TRACE_ERROR("HID_HostWriteDev Error "); + cbdata.status = BTA_HH_ERR; + + if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL && + p_data->api_sndcmd.t_type != HID_TRANS_DATA) { + (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata); + } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) { + (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata); + } + } else { + + switch (p_data->api_sndcmd.t_type) { + case HID_TRANS_SET_PROTOCOL: + /* fall through */ + case HID_TRANS_GET_REPORT: + /* fall through */ + case HID_TRANS_SET_REPORT: + /* fall through */ + case HID_TRANS_GET_PROTOCOL: + /* fall through */ + case HID_TRANS_GET_IDLE: + /* fall through */ + case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */ + p_cb->w4_evt = event; + break; + case HID_TRANS_DATA: /* output report */ + /* fall through */ + case HID_TRANS_CONTROL: + /* no handshake event will be generated */ + /* if VC_UNPLUG is issued, set flag */ + if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) { + p_cb->vp = TRUE; + } + + break; + /* currently not expected */ + case HID_TRANS_DATAC: + default: + APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d", + p_data->api_sndcmd.t_type); + break; + } + + /* if not control type transaction, notify PM for energy control */ + if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) { + /* inform PM for mode change */ + bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); + bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr); + } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) { + bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); + } else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) { + bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); + } } - else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND) - { - bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr); - } - else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) - { - bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr); - } - } } return; @@ -1183,7 +1112,7 @@ void bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) ** *******************************************************************************/ static void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, - UINT32 data, BT_HDR *pdata) + UINT32 data, BT_HDR *pdata) { tBTA_HH_CBACK_DATA *p_buf = NULL; UINT16 sm_event = BTA_HH_INVALID_EVT; @@ -1193,8 +1122,7 @@ static void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event)); #endif - switch (event) - { + switch (event) { case HID_HDEV_EVT_OPEN: sm_event = BTA_HH_INT_OPEN_EVT; break; @@ -1218,21 +1146,18 @@ static void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, utl_freebuf((void **)&pdata); break; case HID_HDEV_EVT_VC_UNPLUG: - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) - { - if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) - { - bta_hh_cb.kdev[xx].vp = TRUE; - break; + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { + if (bta_hh_cb.kdev[xx].hid_handle == dev_handle) { + bta_hh_cb.kdev[xx].vp = TRUE; + break; } } break; } if (sm_event != BTA_HH_INVALID_EVT && - (p_buf = (tBTA_HH_CBACK_DATA *)GKI_getbuf(sizeof(tBTA_HH_CBACK_DATA) + - sizeof(BT_HDR))) != NULL) - { + (p_buf = (tBTA_HH_CBACK_DATA *)GKI_getbuf(sizeof(tBTA_HH_CBACK_DATA) + + sizeof(BT_HDR))) != NULL) { p_buf->hdr.event = sm_event; p_buf->hdr.layer_specific = (UINT16)dev_handle; p_buf->data = data; @@ -1253,8 +1178,7 @@ static void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event, *******************************************************************************/ static tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result) { - switch(result) - { + switch (result) { case HID_PAR_HANDSHAKE_RSP_SUCCESS : /* (0) */ return BTA_HH_OK; case HID_PAR_HANDSHAKE_RSP_NOT_READY : /* (1) */ @@ -1274,10 +1198,9 @@ static tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result) *****************************************************************************/ #if (defined BTA_HH_DEBUG && BTA_HH_DEBUG == TRUE) -static char* bta_hh_get_w4_event(UINT16 event) +static char *bta_hh_get_w4_event(UINT16 event) { - switch (event) - { + switch (event) { case BTA_HH_GET_RPT_EVT: return "BTA_HH_GET_RPT_EVT"; case BTA_HH_SET_RPT_EVT: @@ -1298,10 +1221,9 @@ static char* bta_hh_get_w4_event(UINT16 event) } -static char * bta_hh_hid_event_name(UINT16 event) +static char *bta_hh_hid_event_name(UINT16 event) { - switch (event) - { + switch (event) { case HID_HDEV_EVT_OPEN: return "HID_HDEV_EVT_OPEN"; case HID_HDEV_EVT_CLOSE: diff --git a/components/bt/bluedroid/bta/hh/bta_hh_api.c b/components/bt/bluedroid/bta/hh/bta_hh_api.c index 1fdbc2928..efc00561c 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_api.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_api.c @@ -42,8 +42,7 @@ ** Constants *****************************************************************************/ -static const tBTA_SYS_REG bta_hh_reg = -{ +static const tBTA_SYS_REG bta_hh_reg = { bta_hh_hdl_event, BTA_HhDisable }; @@ -71,8 +70,7 @@ void BTA_HhEnable(tBTA_SEC sec_mask, tBTA_HH_CBACK *p_cback) LOG_INFO("%s sec_mask:0x%x p_cback:%p", __func__, sec_mask, p_cback); p_buf = (tBTA_HH_API_ENABLE *)GKI_getbuf((UINT16)sizeof(tBTA_HH_API_ENABLE)); - if (p_buf != NULL) - { + if (p_buf != NULL) { memset(p_buf, 0, sizeof(tBTA_HH_API_ENABLE)); p_buf->hdr.event = BTA_HH_API_ENABLE_EVT; @@ -98,8 +96,7 @@ void BTA_HhDisable(void) BT_HDR *p_buf; bta_sys_deregister(BTA_ID_HH); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL) { p_buf->event = BTA_HH_API_DISABLE_EVT; bta_sys_sendmsg(p_buf); } @@ -118,8 +115,7 @@ void BTA_HhClose(UINT8 dev_handle) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)sizeof(BT_HDR))) != NULL) { memset(p_buf, 0, sizeof(BT_HDR)); p_buf->event = BTA_HH_API_CLOSE_EVT; p_buf->layer_specific = (UINT16) dev_handle; @@ -144,8 +140,7 @@ void BTA_HhOpen(BD_ADDR dev_bda, tBTA_HH_PROTO_MODE mode, tBTA_SEC sec_mask) p_buf = (tBTA_HH_API_CONN *)GKI_getbuf((UINT16)sizeof(tBTA_HH_API_CONN)); - if (p_buf!= NULL) - { + if (p_buf != NULL) { memset((void *)p_buf, 0, sizeof(tBTA_HH_API_CONN)); p_buf->hdr.event = BTA_HH_API_OPEN_EVT; @@ -155,9 +150,7 @@ void BTA_HhOpen(BD_ADDR dev_bda, tBTA_HH_PROTO_MODE mode, tBTA_SEC sec_mask) bdcpy(p_buf->bd_addr, dev_bda); bta_sys_sendmsg((void *)p_buf); - } - else - { + } else { APPL_TRACE_ERROR("No resource to send HID host Connect request."); } } @@ -173,8 +166,7 @@ static void bta_hh_snd_write_dev(UINT8 dev_handle, UINT8 t_type, UINT8 param, tBTA_HH_CMD_DATA *p_buf; UINT16 len = (UINT16) (sizeof(tBTA_HH_CMD_DATA) ); - if ((p_buf = (tBTA_HH_CMD_DATA *)GKI_getbuf(len))!= NULL) - { + if ((p_buf = (tBTA_HH_CMD_DATA *)GKI_getbuf(len)) != NULL) { memset(p_buf, 0, sizeof(tBTA_HH_CMD_DATA)); p_buf->hdr.event = BTA_HH_API_WRITE_DEV_EVT; @@ -218,7 +210,7 @@ void BTA_HhGetReport(UINT8 dev_handle, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id, UI UINT8 param = (buf_size) ? (r_type | 0x08) : r_type; bta_hh_snd_write_dev(dev_handle, HID_TRANS_GET_REPORT, param, - buf_size, rpt_id, NULL); + buf_size, rpt_id, NULL); } /******************************************************************************* ** @@ -232,7 +224,7 @@ void BTA_HhGetReport(UINT8 dev_handle, tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id, UI void BTA_HhSetProtoMode(UINT8 dev_handle, tBTA_HH_PROTO_MODE p_type) { bta_hh_snd_write_dev(dev_handle, HID_TRANS_SET_PROTOCOL, (UINT8)p_type, - 0, 0, NULL); + 0, 0, NULL); } /******************************************************************************* ** @@ -309,8 +301,7 @@ void BTA_HhSendData(UINT8 dev_handle, BD_ADDR dev_bda, BT_HDR *p_data) { UNUSED(dev_bda); #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) - if (p_data->layer_specific != BTA_HH_RPTT_OUTPUT) - { + if (p_data->layer_specific != BTA_HH_RPTT_OUTPUT) { APPL_TRACE_ERROR("ERROR! Wrong report type! Write Command only valid for output report!"); return; } @@ -331,8 +322,7 @@ void BTA_HhGetDscpInfo(UINT8 dev_handle) { BT_HDR *p_buf; - if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)sizeof(BT_HDR))) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)sizeof(BT_HDR))) != NULL) { memset(p_buf, 0, sizeof(BT_HDR)); p_buf->event = BTA_HH_API_GET_DSCP_EVT; p_buf->layer_specific = (UINT16) dev_handle; @@ -361,8 +351,7 @@ void BTA_HhAddDev(BD_ADDR bda, tBTA_HH_ATTR_MASK attr_mask, UINT8 sub_class, p_buf = (tBTA_HH_MAINT_DEV *)GKI_getbuf(len); - if (p_buf != NULL) - { + if (p_buf != NULL) { memset(p_buf, 0, sizeof(tBTA_HH_MAINT_DEV)); p_buf->hdr.event = BTA_HH_API_MAINT_DEV_EVT; @@ -375,14 +364,11 @@ void BTA_HhAddDev(BD_ADDR bda, tBTA_HH_ATTR_MASK attr_mask, UINT8 sub_class, bdcpy(p_buf->bda, bda); memcpy(&p_buf->dscp_info, &dscp_info, sizeof(tBTA_HH_DEV_DSCP_INFO)); - if ( dscp_info.descriptor.dl_len != 0 && dscp_info.descriptor.dsc_list) - { + if ( dscp_info.descriptor.dl_len != 0 && dscp_info.descriptor.dsc_list) { p_buf->dscp_info.descriptor.dl_len = dscp_info.descriptor.dl_len; p_buf->dscp_info.descriptor.dsc_list = (UINT8 *)(p_buf + 1); memcpy(p_buf->dscp_info.descriptor.dsc_list, dscp_info.descriptor.dsc_list, dscp_info.descriptor.dl_len); - } - else - { + } else { p_buf->dscp_info.descriptor.dsc_list = NULL; p_buf->dscp_info.descriptor.dl_len = 0; } @@ -405,8 +391,7 @@ void BTA_HhRemoveDev(UINT8 dev_handle ) p_buf = (tBTA_HH_MAINT_DEV *)GKI_getbuf((UINT16)sizeof(tBTA_HH_MAINT_DEV)); - if (p_buf != NULL) - { + if (p_buf != NULL) { memset(p_buf, 0, sizeof(tBTA_HH_MAINT_DEV)); p_buf->hdr.event = BTA_HH_API_MAINT_DEV_EVT; @@ -434,8 +419,7 @@ void BTA_HhUpdateLeScanParam(UINT8 dev_handle, UINT16 scan_int, UINT16 scan_win) p_buf = (tBTA_HH_SCPP_UPDATE *)GKI_getbuf((UINT16)sizeof(tBTA_HH_SCPP_UPDATE)); - if (p_buf != NULL) - { + if (p_buf != NULL) { memset(p_buf, 0, sizeof(tBTA_HH_SCPP_UPDATE)); p_buf->hdr.event = BTA_HH_API_SCPP_UPDATE_EVT; @@ -469,14 +453,12 @@ void BTA_HhParseBootRpt(tBTA_HH_BOOT_RPT *p_data, UINT8 *p_report, { p_data->dev_type = BTA_HH_DEVT_UNKNOWN; - if (p_report) - { + if (p_report) { /* first byte is report ID */ - switch (p_report[0]) - { + switch (p_report[0]) { case BTA_HH_KEYBD_RPT_ID: /* key board report ID */ p_data->dev_type = p_report[0]; - bta_hh_parse_keybd_rpt(p_data, p_report + 1, (UINT16)(report_len -1)); + bta_hh_parse_keybd_rpt(p_data, p_report + 1, (UINT16)(report_len - 1)); break; case BTA_HH_MOUSE_RPT_ID: /* mouse report ID */ diff --git a/components/bt/bluedroid/bta/hh/bta_hh_cfg.c b/components/bt/bluedroid/bta/hh/bta_hh_cfg.c index e3ffefe9b..5cdc0b728 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_cfg.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_cfg.c @@ -37,11 +37,10 @@ /* The type of devices supported by BTA HH and corresponding application ID */ -tBTA_HH_SPT_TOD p_devt_list[BTA_HH_MAX_DEVT_SPT] = -{ +tBTA_HH_SPT_TOD p_devt_list[BTA_HH_MAX_DEVT_SPT] = { {BTA_HH_DEVT_MIC, BTA_HH_APP_ID_MI}, {BTA_HH_DEVT_KBD, BTA_HH_APP_ID_KB}, - {BTA_HH_DEVT_KBD|BTA_HH_DEVT_MIC, BTA_HH_APP_ID_KB}, + {BTA_HH_DEVT_KBD | BTA_HH_DEVT_MIC, BTA_HH_APP_ID_KB}, {BTA_HH_DEVT_RMC, BTA_HH_APP_ID_RMC}, {BTA_HH_DEVT_RMC | BTA_HH_DEVT_KBD, BTA_HH_APP_ID_RMC}, {BTA_HH_DEVT_MIC | BTA_HH_DEVT_DGT, BTA_HH_APP_ID_MI}, @@ -51,12 +50,11 @@ tBTA_HH_SPT_TOD p_devt_list[BTA_HH_MAX_DEVT_SPT] = }; -const tBTA_HH_CFG bta_hh_cfg = -{ +const tBTA_HH_CFG bta_hh_cfg = { BTA_HH_MAX_DEVT_SPT, /* number of supported type of devices */ p_devt_list, /* ToD & AppID list */ BTA_HH_DISC_BUF_SIZE /* HH SDP discovery database size */ }; -tBTA_HH_CFG *p_bta_hh_cfg = (tBTA_HH_CFG *)&bta_hh_cfg; +tBTA_HH_CFG *p_bta_hh_cfg = (tBTA_HH_CFG *) &bta_hh_cfg; diff --git a/components/bt/bluedroid/bta/hh/bta_hh_int.h b/components/bt/bluedroid/bta/hh/bta_hh_int.h index c85b20fcb..a5374dac0 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_int.h +++ b/components/bt/bluedroid/bta/hh/bta_hh_int.h @@ -42,8 +42,7 @@ #endif /* state machine events, these events are handled by the state machine */ -enum -{ +enum { BTA_HH_API_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_HH), BTA_HH_API_CLOSE_EVT, BTA_HH_INT_OPEN_EVT, @@ -87,23 +86,21 @@ typedef UINT16 tBTA_HH_INT_EVT; /* HID host internal events */ #define BTA_HH_REMOVE_DEV 1 /* state machine states */ -enum -{ +enum { BTA_HH_NULL_ST, BTA_HH_IDLE_ST, BTA_HH_W4_CONN_ST, BTA_HH_CONN_ST #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) - ,BTA_HH_W4_SEC + , BTA_HH_W4_SEC #endif - ,BTA_HH_INVALID_ST /* Used to check invalid states before executing SM function */ + , BTA_HH_INVALID_ST /* Used to check invalid states before executing SM function */ }; typedef UINT8 tBTA_HH_STATE; /* data structure used to send a command/data to HID device */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 t_type; UINT8 param; @@ -113,36 +110,32 @@ typedef struct #endif UINT16 data; BT_HDR *p_data; -}tBTA_HH_CMD_DATA; +} tBTA_HH_CMD_DATA; /* data type for BTA_HH_API_ENABLE_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 sec_mask; - UINT8 service_name[BTA_SERVICE_NAME_LEN+1]; + UINT8 service_name[BTA_SERVICE_NAME_LEN + 1]; tBTA_HH_CBACK *p_cback; } tBTA_HH_API_ENABLE; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; UINT8 sec_mask; tBTA_HH_PROTO_MODE mode; -}tBTA_HH_API_CONN; +} tBTA_HH_API_CONN; /* internal event data from BTE HID callback */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR addr; UINT32 data; BT_HDR *p_data; -}tBTA_HH_CBACK_DATA; +} tBTA_HH_CBACK_DATA; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bda; UINT16 attr_mask; @@ -150,27 +143,24 @@ typedef struct UINT8 sub_class; UINT8 app_id; tBTA_HH_DEV_DSCP_INFO dscp_info; -}tBTA_HH_MAINT_DEV; +} tBTA_HH_MAINT_DEV; #if BTA_HH_LE_INCLUDED == TRUE -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 conn_id; tBTA_GATT_REASON reason; /* disconnect reason code, not useful when connect event is reported */ -}tBTA_HH_LE_CLOSE; +} tBTA_HH_LE_CLOSE; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 scan_int; UINT16 scan_win; -}tBTA_HH_SCPP_UPDATE; +} tBTA_HH_SCPP_UPDATE; #endif /* union of all event data types */ -typedef union -{ +typedef union { BT_HDR hdr; tBTA_HH_API_ENABLE api_enable; tBTA_HH_API_CONN api_conn; @@ -187,8 +177,7 @@ typedef union } tBTA_HH_DATA; #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) -typedef struct -{ +typedef struct { UINT8 index; BOOLEAN in_use; UINT8 inst_id; /* share service instance ID and report instance ID, as @@ -199,14 +188,13 @@ typedef struct UINT8 rpt_id; BOOLEAN client_cfg_exist; UINT16 client_cfg_value; -}tBTA_HH_LE_RPT; +} tBTA_HH_LE_RPT; #ifndef BTA_HH_LE_RPT_MAX #define BTA_HH_LE_RPT_MAX 20 #endif -typedef struct -{ +typedef struct { BOOLEAN in_use; tBTA_HH_LE_RPT report[BTA_HH_LE_RPT_MAX]; @@ -221,7 +209,7 @@ typedef struct UINT16 ext_rpt_ref; tBTA_HH_DEV_DESCR descriptor; -}tBTA_HH_LE_HID_SRVC; +} tBTA_HH_LE_HID_SRVC; #ifndef BTA_HH_LE_HID_SRVC_MAX #define BTA_HH_LE_HID_SRVC_MAX 1 @@ -237,8 +225,7 @@ typedef struct #endif /* device control block */ -typedef struct -{ +typedef struct { tBTA_HH_DEV_DSCP_INFO dscp_info; /* report descriptor and DI information */ BD_ADDR addr; /* BD-Addr of the HID device */ UINT16 attr_mask; /* attribute mask */ @@ -285,8 +272,7 @@ typedef struct } tBTA_HH_DEV_CB; /* key board parsing control block */ -typedef struct -{ +typedef struct { BOOLEAN mod_key[4]; /* ctrl, shift(upper), Alt, GUI */ BOOLEAN num_lock; BOOLEAN caps_lock; @@ -296,14 +282,13 @@ typedef struct /****************************************************************************** ** Main Control Block *******************************************************************************/ -typedef struct -{ +typedef struct { tBTA_HH_KB_CB kb_cb; /* key board control block, suppose BTA will connect to only one keyboard at the same time */ tBTA_HH_DEV_CB kdev[BTA_HH_MAX_DEVICE]; /* device control block */ - tBTA_HH_DEV_CB* p_cur; /* current device control + tBTA_HH_DEV_CB *p_cur; /* current device control block idx, used in sdp */ UINT8 cb_index[BTA_HH_MAX_KNOWN]; /* maintain a CB index map to dev handle */ @@ -312,7 +297,7 @@ typedef struct tBTA_GATTC_IF gatt_if; #endif tBTA_HH_CBACK *p_cback; /* Application callbacks */ - tSDP_DISCOVERY_DB* p_disc_db; + tSDP_DISCOVERY_DB *p_disc_db; UINT8 trace_level; /* tracing level */ UINT8 cnt_num; /* connected device number */ BOOLEAN w4_disable; /* w4 disable flag */ @@ -340,8 +325,8 @@ extern void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, extern void bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); extern void bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); extern void bta_hh_close_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); -extern void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data); -extern void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data); +extern void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); +extern void bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); extern void bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); extern void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); extern void bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); @@ -354,10 +339,10 @@ extern void bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); /* utility functions */ extern UINT8 bta_hh_find_cb(BD_ADDR bda); extern void bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, - UINT8 *p_report, UINT16 report_len); + UINT8 *p_report, UINT16 report_len); extern void bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT *p_kb_data, UINT8 *p_report, UINT16 report_len); -extern BOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb,UINT8 sub_class); +extern BOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb, UINT8 sub_class); extern void bta_hh_clean_up_kdev(tBTA_HH_DEV_CB *p_cb); extern void bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, UINT8 handle, @@ -365,7 +350,7 @@ extern void bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, UINT8 handle, tHID_DEV_DSCP_INFO *p_dscp_info, UINT8 sub_class, UINT16 max_latency, UINT16 min_tout, UINT8 app_id); extern void bta_hh_update_di_info(tBTA_HH_DEV_CB *p_cb, UINT16 vendor_id, UINT16 product_id, - UINT16 version, UINT8 flag); + UINT16 version, UINT8 flag); extern void bta_hh_cleanup_disable(tBTA_HH_STATUS status); extern UINT8 bta_hh_dev_handle_to_cb_idx(UINT8 dev_handle); diff --git a/components/bt/bluedroid/bta/hh/bta_hh_le.c b/components/bt/bluedroid/bta/hh/bta_hh_le.c index 48b061072..b8d8a4e6e 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_le.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_le.c @@ -53,8 +53,7 @@ #define BTA_HH_SCPP_INST_DEF 0 #define BTA_HH_LE_DISC_CHAR_NUM 8 -static const UINT16 bta_hh_le_disc_char_uuid[BTA_HH_LE_DISC_CHAR_NUM] = -{ +static const UINT16 bta_hh_le_disc_char_uuid[BTA_HH_LE_DISC_CHAR_NUM] = { GATT_UUID_HID_INFORMATION, GATT_UUID_HID_REPORT_MAP, GATT_UUID_HID_CONTROL_POINT, @@ -66,8 +65,7 @@ static const UINT16 bta_hh_le_disc_char_uuid[BTA_HH_LE_DISC_CHAR_NUM] = }; #define BTA_LE_HID_RTP_UUID_MAX 5 -static const UINT16 bta_hh_uuid_to_rtp_type[BTA_LE_HID_RTP_UUID_MAX][2] = -{ +static const UINT16 bta_hh_uuid_to_rtp_type[BTA_LE_HID_RTP_UUID_MAX][2] = { {GATT_UUID_HID_REPORT, BTA_HH_RPTT_INPUT}, {GATT_UUID_HID_BT_KB_INPUT, BTA_HH_RPTT_INPUT}, {GATT_UUID_HID_BT_KB_OUTPUT, BTA_HH_RPTT_OUTPUT}, @@ -91,8 +89,7 @@ static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb, #define BTA_HH_LE_SRVC_DEF 0 #if BTA_HH_DEBUG == TRUE -static const char *bta_hh_le_rpt_name[4] = -{ +static const char *bta_hh_le_rpt_name[4] = { "UNKNOWN", "INPUT", "OUTPUT", @@ -113,46 +110,46 @@ static void bta_hh_le_hid_report_dbg(tBTA_HH_DEV_CB *p_cb) { UINT8 i , j; tBTA_HH_LE_RPT *p_rpt; - char * rpt_name; + char *rpt_name; APPL_TRACE_DEBUG("HID Report DB"); - for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) - { - if (p_cb->hid_srvc[i].in_use) - { + for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) { + if (p_cb->hid_srvc[i].in_use) { p_rpt = &p_cb->hid_srvc[i].report[0]; APPL_TRACE_DEBUG("\t HID serivce inst: %d", i); - for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++) - { + for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++) { rpt_name = "Unknown"; - if (p_rpt->in_use) - { - if (p_rpt->uuid == GATT_UUID_HID_REPORT) + if (p_rpt->in_use) { + if (p_rpt->uuid == GATT_UUID_HID_REPORT) { rpt_name = "Report"; - if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT) + } + if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT) { rpt_name = "Boot KB Input"; - if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT) + } + if (p_rpt->uuid == GATT_UUID_HID_BT_KB_OUTPUT) { rpt_name = "Boot KB Output"; - if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) + } + if (p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) { rpt_name = "Boot MI Input"; + } APPL_TRACE_DEBUG("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d] [Clt_cfg: %d]", - rpt_name, - p_rpt->uuid , - ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"), - p_rpt->rpt_id, - p_rpt->inst_id, - p_rpt->client_cfg_value); - } - else + rpt_name, + p_rpt->uuid , + ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"), + p_rpt->rpt_id, + p_rpt->inst_id, + p_rpt->client_cfg_value); + } else { break; + } } - } - else + } else { break; + } } } @@ -167,32 +164,31 @@ static void bta_hh_le_hid_report_dbg(tBTA_HH_DEV_CB *p_cb) *******************************************************************************/ static char *bta_hh_uuid_to_str(UINT16 uuid) { - switch(uuid) - { - case GATT_UUID_HID_INFORMATION: - return "GATT_UUID_HID_INFORMATION"; - case GATT_UUID_HID_REPORT_MAP: - return "GATT_UUID_HID_REPORT_MAP"; - case GATT_UUID_HID_CONTROL_POINT: - return "GATT_UUID_HID_CONTROL_POINT"; - case GATT_UUID_HID_REPORT: - return "GATT_UUID_HID_REPORT"; - case GATT_UUID_HID_PROTO_MODE: - return "GATT_UUID_HID_PROTO_MODE"; - case GATT_UUID_HID_BT_KB_INPUT: - return "GATT_UUID_HID_BT_KB_INPUT"; - case GATT_UUID_HID_BT_KB_OUTPUT: - return "GATT_UUID_HID_BT_KB_OUTPUT"; - case GATT_UUID_HID_BT_MOUSE_INPUT: - return "GATT_UUID_HID_BT_MOUSE_INPUT"; - case GATT_UUID_CHAR_CLIENT_CONFIG: - return "GATT_UUID_CHAR_CLIENT_CONFIG"; - case GATT_UUID_EXT_RPT_REF_DESCR: - return "GATT_UUID_EXT_RPT_REF_DESCR"; - case GATT_UUID_RPT_REF_DESCR: - return "GATT_UUID_RPT_REF_DESCR"; - default: - return "Unknown UUID"; + switch (uuid) { + case GATT_UUID_HID_INFORMATION: + return "GATT_UUID_HID_INFORMATION"; + case GATT_UUID_HID_REPORT_MAP: + return "GATT_UUID_HID_REPORT_MAP"; + case GATT_UUID_HID_CONTROL_POINT: + return "GATT_UUID_HID_CONTROL_POINT"; + case GATT_UUID_HID_REPORT: + return "GATT_UUID_HID_REPORT"; + case GATT_UUID_HID_PROTO_MODE: + return "GATT_UUID_HID_PROTO_MODE"; + case GATT_UUID_HID_BT_KB_INPUT: + return "GATT_UUID_HID_BT_KB_INPUT"; + case GATT_UUID_HID_BT_KB_OUTPUT: + return "GATT_UUID_HID_BT_KB_OUTPUT"; + case GATT_UUID_HID_BT_MOUSE_INPUT: + return "GATT_UUID_HID_BT_MOUSE_INPUT"; + case GATT_UUID_CHAR_CLIENT_CONFIG: + return "GATT_UUID_CHAR_CLIENT_CONFIG"; + case GATT_UUID_EXT_RPT_REF_DESCR: + return "GATT_UUID_EXT_RPT_REF_DESCR"; + case GATT_UUID_RPT_REF_DESCR: + return "GATT_UUID_RPT_REF_DESCR"; + default: + return "Unknown UUID"; } } @@ -210,13 +206,14 @@ static char *bta_hh_uuid_to_str(UINT16 uuid) void bta_hh_le_enable(void) { char app_name[LEN_UUID_128 + 1]; - tBT_UUID app_uuid = {LEN_UUID_128,{0}}; + tBT_UUID app_uuid = {LEN_UUID_128, {0}}; UINT8 xx; bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF; - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) { bta_hh_cb.le_cb_index[xx] = BTA_HH_IDX_INVALID; + } memset (app_name, 0, LEN_UUID_128 + 1); strncpy(app_name, "BTA HH OVER LE", LEN_UUID_128); @@ -241,13 +238,12 @@ void bta_hh_le_register_cmpl(tBTA_GATTC_REG *p_reg) { tBTA_HH_STATUS status = BTA_HH_ERR; - if (p_reg->status == BTA_GATT_OK) - { + if (p_reg->status == BTA_GATT_OK) { bta_hh_cb.gatt_if = p_reg->client_if; status = BTA_HH_OK; - } - else + } else { bta_hh_cb.gatt_if = BTA_GATTS_INVALID_IF; + } /* signal BTA call back event */ (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status); @@ -312,13 +308,10 @@ BOOLEAN bta_hh_le_add_hid_srvc_entry(tBTA_HH_DEV_CB *p_dev_cb, UINT8 idx) { BOOLEAN added = FALSE; - if (idx < BTA_HH_LE_HID_SRVC_MAX) - { + if (idx < BTA_HH_LE_HID_SRVC_MAX) { p_dev_cb->hid_srvc[idx].in_use = TRUE; added = TRUE; - } - else - { + } else { APPL_TRACE_ERROR("DB full,max HID service entry!"); } return added; @@ -397,15 +390,15 @@ void bta_hh_le_fill_16bits_char_id(UINT8 inst_id, UINT16 char_uuid, ** Description Utility function find a device control block by connection ID. ** *******************************************************************************/ -tBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_conn_id(UINT16 conn_id) +tBTA_HH_DEV_CB *bta_hh_le_find_dev_cb_by_conn_id(UINT16 conn_id) { UINT8 i; tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0]; - for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) - { - if (p_dev_cb->in_use && p_dev_cb->conn_id == conn_id) + for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) { + if (p_dev_cb->in_use && p_dev_cb->conn_id == conn_id) { return p_dev_cb; + } } return NULL; } @@ -417,16 +410,16 @@ tBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_conn_id(UINT16 conn_id) ** Description Utility function find a device control block by BD address. ** *******************************************************************************/ -tBTA_HH_DEV_CB * bta_hh_le_find_dev_cb_by_bda(BD_ADDR bda) +tBTA_HH_DEV_CB *bta_hh_le_find_dev_cb_by_bda(BD_ADDR bda) { UINT8 i; tBTA_HH_DEV_CB *p_dev_cb = &bta_hh_cb.kdev[0]; - for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) - { + for (i = 0; i < BTA_HH_MAX_DEVICE; i ++, p_dev_cb ++) { if (p_dev_cb->in_use && - memcmp(p_dev_cb->addr, bda, BD_ADDR_LEN) == 0) + memcmp(p_dev_cb->addr, bda, BD_ADDR_LEN) == 0) { return p_dev_cb; + } } return NULL; } @@ -442,11 +435,9 @@ UINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 { UINT8 i; - for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) - { + for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) { if (p_cb->hid_srvc[i].in_use && - p_cb->hid_srvc[i].incl_srvc_inst == ba_inst_id) - { + p_cb->hid_srvc[i].incl_srvc_inst == ba_inst_id) { return i; } } @@ -461,30 +452,28 @@ UINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ** instance ID ** *******************************************************************************/ -tBTA_HH_LE_RPT * bta_hh_le_find_report_entry(tBTA_HH_DEV_CB *p_cb, - UINT8 srvc_inst_id, /* service instance ID */ - UINT16 rpt_uuid, - UINT8 char_inst_id) +tBTA_HH_LE_RPT *bta_hh_le_find_report_entry(tBTA_HH_DEV_CB *p_cb, + UINT8 srvc_inst_id, /* service instance ID */ + UINT16 rpt_uuid, + UINT8 char_inst_id) { UINT8 i; UINT8 hid_inst_id = srvc_inst_id; tBTA_HH_LE_RPT *p_rpt; - if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) - { + if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) { hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id); - if (hid_inst_id == BTA_HH_IDX_INVALID) + if (hid_inst_id == BTA_HH_IDX_INVALID) { return NULL; + } } p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0]; - for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) - { + for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) { if (p_rpt->uuid == rpt_uuid && - p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, char_inst_id)) - { + p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, char_inst_id)) { return p_rpt; } @@ -502,8 +491,8 @@ tBTA_HH_LE_RPT * bta_hh_le_find_report_entry(tBTA_HH_DEV_CB *p_cb, ** Returns void ** *******************************************************************************/ -tBTA_HH_LE_RPT * bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT*p_head, UINT8 mode, - tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id) +tBTA_HH_LE_RPT *bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT *p_head, UINT8 mode, + tBTA_HH_RPT_TYPE r_type, UINT8 rpt_id) { tBTA_HH_LE_RPT *p_rpt = p_head; UINT8 i; @@ -512,20 +501,21 @@ tBTA_HH_LE_RPT * bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT*p_head, UINT8 mode, APPL_TRACE_DEBUG("bta_hh_le_find_rpt_by_idtype: r_type: %d rpt_id: %d", r_type, rpt_id); #endif - for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++) - { - if (p_rpt->in_use && p_rpt->rpt_id == rpt_id && r_type == p_rpt->rpt_type) - { + for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++) { + if (p_rpt->in_use && p_rpt->rpt_id == rpt_id && r_type == p_rpt->rpt_type) { /* return battery report w/o condition */ - if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) + if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { return p_rpt; + } - if (mode == BTA_HH_PROTO_RPT_MODE && p_rpt->uuid == GATT_UUID_HID_REPORT) + if (mode == BTA_HH_PROTO_RPT_MODE && p_rpt->uuid == GATT_UUID_HID_REPORT) { return p_rpt; + } - if ( mode ==BTA_HH_PROTO_BOOT_MODE && - (p_rpt->uuid >= GATT_UUID_HID_BT_KB_INPUT && p_rpt->uuid <= GATT_UUID_HID_BT_MOUSE_INPUT)) + if ( mode == BTA_HH_PROTO_BOOT_MODE && + (p_rpt->uuid >= GATT_UUID_HID_BT_KB_INPUT && p_rpt->uuid <= GATT_UUID_HID_BT_MOUSE_INPUT)) { return p_rpt; + } } } return NULL; @@ -538,32 +528,29 @@ tBTA_HH_LE_RPT * bta_hh_le_find_rpt_by_idtype(tBTA_HH_LE_RPT*p_head, UINT8 mode, ** Description find or allocate a report entry in the HID service report list. ** *******************************************************************************/ -tBTA_HH_LE_RPT * bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb, - UINT8 srvc_inst_id, - UINT16 rpt_uuid, - UINT8 inst_id, - UINT8 prop) +tBTA_HH_LE_RPT *bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb, + UINT8 srvc_inst_id, + UINT16 rpt_uuid, + UINT8 inst_id, + UINT8 prop) { UINT8 i, hid_inst_id = srvc_inst_id; tBTA_HH_LE_RPT *p_rpt; - if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) - { + if (rpt_uuid == GATT_UUID_BATTERY_LEVEL) { hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_cb, srvc_inst_id); - if (hid_inst_id == BTA_HH_IDX_INVALID) + if (hid_inst_id == BTA_HH_IDX_INVALID) { return NULL; + } } p_rpt = &p_cb->hid_srvc[hid_inst_id].report[0]; - for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) - { + for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) { if (!p_rpt->in_use || - (p_rpt->uuid == rpt_uuid && - p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id))) - { - if (!p_rpt->in_use) - { + (p_rpt->uuid == rpt_uuid && + p_rpt->inst_id == BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id))) { + if (!p_rpt->in_use) { p_rpt->in_use = TRUE; p_rpt->index = i; p_rpt->inst_id = BTA_HH_LE_RPT_INST_ID_MAP(srvc_inst_id, inst_id); @@ -571,17 +558,17 @@ tBTA_HH_LE_RPT * bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb, p_rpt->uuid = rpt_uuid; /* assign report type */ - for (i = 0; i < BTA_LE_HID_RTP_UUID_MAX; i ++) - { - if (bta_hh_uuid_to_rtp_type[i][0] == rpt_uuid) - { + for (i = 0; i < BTA_LE_HID_RTP_UUID_MAX; i ++) { + if (bta_hh_uuid_to_rtp_type[i][0] == rpt_uuid) { p_rpt->rpt_type = (tBTA_HH_RPT_TYPE)bta_hh_uuid_to_rtp_type[i][1]; - if (rpt_uuid == GATT_UUID_HID_BT_KB_INPUT || rpt_uuid == GATT_UUID_HID_BT_KB_OUTPUT) + if (rpt_uuid == GATT_UUID_HID_BT_KB_INPUT || rpt_uuid == GATT_UUID_HID_BT_KB_OUTPUT) { p_rpt->rpt_id = BTA_HH_KEYBD_RPT_ID; + } - if (rpt_uuid == GATT_UUID_HID_BT_MOUSE_INPUT) + if (rpt_uuid == GATT_UUID_HID_BT_MOUSE_INPUT) { p_rpt->rpt_id = BTA_HH_MOUSE_RPT_ID; + } break; } @@ -601,7 +588,7 @@ tBTA_HH_LE_RPT * bta_hh_le_find_alloc_report_entry(tBTA_HH_DEV_CB *p_cb, ** *******************************************************************************/ tBTA_HH_STATUS bta_hh_le_read_char_dscrpt(tBTA_HH_DEV_CB *p_cb, UINT16 srvc_uuid, UINT8 srvc_inst_id, - UINT16 char_uuid, UINT8 char_inst_id, UINT16 char_descp_uuid) + UINT16 char_uuid, UINT8 char_inst_id, UINT16 char_descp_uuid) { tBTA_GATTC_CHAR_ID char_id; tBT_UUID descr_uuid; @@ -616,21 +603,18 @@ tBTA_HH_STATUS bta_hh_le_read_char_dscrpt(tBTA_HH_DEV_CB *p_cb, UINT16 srvc_uuid /* find the report reference descriptor */ if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, - &char_id, - &descr_uuid, - &descr_id) == BTA_GATT_OK) - { + &char_id, + &descr_uuid, + &descr_id) == BTA_GATT_OK) { BTA_GATTC_ReadCharDescr(p_cb->conn_id, &descr_id, BTA_GATT_AUTH_REQ_NONE); status = BTA_HH_OK; - } - else - { + } else { #if BTA_HH_DEBUG == TRUE - LOG_WARN("%s No descriptor exists: %s(0x%04x)", __func__, - bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid); + LOG_WARN("%s No descriptor exists: %s(0x%04x)", __func__, + bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid); #endif } return status; @@ -648,24 +632,20 @@ void bta_hh_le_read_rpt_ref_descr(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rp BOOLEAN started = FALSE; UINT16 srvc_uuid, char_uuid; - while (p_rpt != NULL) - { - if(!p_rpt->in_use) + while (p_rpt != NULL) { + if (!p_rpt->in_use) { break; + } - if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) - { + if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) { /* is battery report */ - if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) - { + if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("read battery level report reference descriptor"); #endif srvc_uuid = UUID_SERVCLASS_BATTERY; char_uuid = GATT_UUID_BATTERY_LEVEL; - } - else - { + } else { #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("read HID report reference descriptor"); #endif @@ -674,28 +654,27 @@ void bta_hh_le_read_rpt_ref_descr(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rp } if (bta_hh_le_read_char_dscrpt(p_dev_cb, - srvc_uuid, - BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), - char_uuid, - BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), - GATT_UUID_RPT_REF_DESCR) - == BTA_HH_OK) - { + srvc_uuid, + BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), + char_uuid, + BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), + GATT_UUID_RPT_REF_DESCR) + == BTA_HH_OK) { started = TRUE; break; } } - if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1) + if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1) { break; + } p_rpt ++; } /* if no report reference descriptor */ - if (!started) - { + if (!started) { /* explore next char */ bta_hh_le_search_hid_chars(p_dev_cb); } @@ -718,15 +697,15 @@ void bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt, /* if the length of the descriptor value is right, parse it */ if (p_data->status == BTA_GATT_OK && - p_data->p_value && p_data->p_value->unformat.len == 2) - { + p_data->p_value && p_data->p_value->unformat.len == 2) { pp = p_data->p_value->unformat.p_value; STREAM_TO_UINT8(p_rpt->rpt_id, pp); STREAM_TO_UINT8(p_rpt->rpt_type, pp); - if (p_rpt->rpt_type > BTA_HH_RPTT_FEATURE) /* invalid report type */ + if (p_rpt->rpt_type > BTA_HH_RPTT_FEATURE) { /* invalid report type */ p_rpt->rpt_type = BTA_HH_RPTT_RESRV; + } #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("report ID: %d", p_rpt->rpt_id); @@ -740,9 +719,7 @@ void bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt, bta_hh_le_co_rpt_info(p_dev_cb->addr, &rpt_entry, p_dev_cb->app_id); - } - else if (p_data->status == BTA_GATT_INSUF_AUTHENTICATION) - { + } else if (p_data->status == BTA_GATT_INSUF_AUTHENTICATION) { /* close connection right away */ p_dev_cb->status = BTA_HH_ERR_AUTH_FAILED; /* close the connection and report service discovery complete with error */ @@ -750,10 +727,11 @@ void bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT *p_rpt, return; } - if (p_rpt->index < BTA_HH_LE_RPT_MAX - 1) + if (p_rpt->index < BTA_HH_LE_RPT_MAX - 1) { p_rpt ++; - else + } else { p_rpt = NULL; + } /* read next report reference descriptor */ bta_hh_le_read_rpt_ref_descr(p_dev_cb, p_rpt); @@ -777,14 +755,13 @@ void bta_hh_le_save_ext_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, /* if the length of the descriptor value is right, parse it assume it's a 16 bits UUID */ if (p_data->status == BTA_GATT_OK && - p_data->p_value && p_data->p_value->unformat.len == 2) - { + p_data->p_value && p_data->p_value->unformat.len == 2) { pp = p_data->p_value->unformat.p_value; STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp); #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("External Report Reference UUID 0x%04x", - p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref); + p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref); #endif } bta_hh_le_search_hid_chars(p_dev_cb); @@ -813,60 +790,50 @@ void bta_hh_le_register_input_notif(tBTA_HH_DEV_CB *p_dev_cb, UINT8 srvc_inst, APPL_TRACE_DEBUG("bta_hh_le_register_input_notif mode: %d", proto_mode); #endif - for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) - { - if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) - { - if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) + for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++) { + if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) { + if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { srvc_uuid = UUID_SERVCLASS_BATTERY; - else + } else { srvc_uuid = UUID_SERVCLASS_LE_HID; + } bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), srvc_uuid, &char_id.srvc_id); bta_hh_le_fill_16bits_char_id(BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), p_rpt->uuid, &char_id.char_id); - if (register_ba && p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) - { + if (register_ba && p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, p_dev_cb->addr, &char_id); } /* boot mode, deregister report input notification */ - else if (proto_mode == BTA_HH_PROTO_BOOT_MODE) - { + else if (proto_mode == BTA_HH_PROTO_BOOT_MODE) { if (p_rpt->uuid == GATT_UUID_HID_REPORT && - p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) - { + p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) { APPL_TRACE_DEBUG("---> Deregister Report ID: %d", p_rpt->rpt_id); BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if, - p_dev_cb->addr, - &char_id); + p_dev_cb->addr, + &char_id); } /* register boot reports notification */ else if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || - p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) - { + p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) { APPL_TRACE_DEBUG("<--- Register Boot Report ID: %d", p_rpt->rpt_id); BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, p_dev_cb->addr, &char_id); } - } - else if (proto_mode == BTA_HH_PROTO_RPT_MODE) - { + } else if (proto_mode == BTA_HH_PROTO_RPT_MODE) { if ((p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || - p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) && - p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) - { + p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT) && + p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) { APPL_TRACE_DEBUG("---> Deregister Boot Report ID: %d", p_rpt->rpt_id); BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if, - p_dev_cb->addr, - &char_id); - } - else if (p_rpt->uuid == GATT_UUID_HID_REPORT && - p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) - { + p_dev_cb->addr, + &char_id); + } else if (p_rpt->uuid == GATT_UUID_HID_REPORT && + p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION) { APPL_TRACE_DEBUG("<--- Register Report ID: %d", p_rpt->rpt_id); BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if, p_dev_cb->addr, @@ -888,8 +855,7 @@ void bta_hh_le_register_input_notif(tBTA_HH_DEV_CB *p_dev_cb, UINT8 srvc_inst, *******************************************************************************/ void bta_hh_le_open_cmpl(tBTA_HH_DEV_CB *p_cb) { - if ( p_cb->disc_active == BTA_HH_LE_DISC_NONE) - { + if ( p_cb->disc_active == BTA_HH_LE_DISC_NONE) { #if BTA_HH_DEBUG bta_hh_le_hid_report_dbg(p_cb); #endif @@ -897,8 +863,7 @@ void bta_hh_le_open_cmpl(tBTA_HH_DEV_CB *p_cb) bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL); #if (BTA_HH_LE_RECONN == TRUE) - if (p_cb->status == BTA_HH_OK) - { + if (p_cb->status == BTA_HH_OK) { bta_hh_le_add_dev_bg_conn(p_cb, TRUE); } #endif @@ -938,13 +903,12 @@ BOOLEAN bta_hh_le_write_char_clt_cfg(tBTA_HH_DEV_CB *p_cb, if (BTA_GATTC_GetFirstCharDescr(p_cb->conn_id, &char_id, &descr_cond, - &descr_id) == BTA_GATT_OK) - { + &descr_id) == BTA_GATT_OK) { BTA_GATTC_WriteCharDescr(p_cb->conn_id, - &descr_id, - BTA_GATTC_TYPE_WRITE, - &value, - BTA_GATT_AUTH_REQ_NONE); + &descr_id, + BTA_GATTC_TYPE_WRITE, + &value, + BTA_GATT_AUTH_REQ_NONE); return TRUE; } @@ -965,24 +929,23 @@ BOOLEAN bta_hh_le_write_rpt_clt_cfg(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst_id) tBTA_HH_LE_RPT *p_rpt = &p_cb->hid_srvc[srvc_inst_id].report[p_cb->clt_cfg_idx]; UINT16 srvc_uuid; - for (i = p_cb->clt_cfg_idx; i < BTA_HH_LE_RPT_MAX && p_rpt->in_use; i ++, p_rpt ++) - { + for (i = p_cb->clt_cfg_idx; i < BTA_HH_LE_RPT_MAX && p_rpt->in_use; i ++, p_rpt ++) { /* enable notification for all input report, regardless mode */ if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT) { - if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) + if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { srvc_uuid = UUID_SERVCLASS_BATTERY; - else + } else { srvc_uuid = UUID_SERVCLASS_LE_HID; + } if (bta_hh_le_write_char_clt_cfg(p_cb, BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt->inst_id), srvc_uuid, BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt->inst_id), p_rpt->uuid, - BTA_GATT_CLT_CONFIG_NOTIFICATION)) - { + BTA_GATT_CLT_CONFIG_NOTIFICATION)) { p_cb->clt_cfg_idx = i; return TRUE; } @@ -992,8 +955,7 @@ BOOLEAN bta_hh_le_write_rpt_clt_cfg(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst_id) p_cb->clt_cfg_idx = 0; /* client configuration is completed, send open callback */ - if (p_cb->state == BTA_HH_W4_CONN_ST) - { + if (p_cb->state == BTA_HH_W4_CONN_ST) { p_cb->disc_active &= ~BTA_HH_LE_DISC_HIDS; /* discover scan parameter profile is act as report host */ @@ -1016,39 +978,32 @@ BOOLEAN bta_hh_le_set_protocol_mode(tBTA_HH_DEV_CB *p_cb, tBTA_HH_PROTO_MODE mod BOOLEAN exec = FALSE; APPL_TRACE_DEBUG("bta_hh_le_set_protocol_mode attempt mode: %s", - (mode == BTA_HH_PROTO_RPT_MODE)? "Report": "Boot"); + (mode == BTA_HH_PROTO_RPT_MODE) ? "Report" : "Boot"); cback_data.handle = p_cb->hid_handle; /* boot mode is not supported in the remote device */ - if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0) - { + if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0) { p_cb->mode = BTA_HH_PROTO_RPT_MODE; - if (mode == BTA_HH_PROTO_BOOT_MODE) - { + if (mode == BTA_HH_PROTO_BOOT_MODE) { APPL_TRACE_ERROR("Set Boot Mode failed!! No PROTO_MODE Char!"); cback_data.status = BTA_HH_ERR; - } - else - { + } else { /* if set to report mode, need to de-register all input report notification */ bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, FALSE); cback_data.status = BTA_HH_OK; } - if (p_cb->state == BTA_HH_W4_CONN_ST) - { - p_cb->status = (cback_data.status == BTA_HH_OK)? BTA_HH_OK: BTA_HH_ERR_PROTO; - } - else + if (p_cb->state == BTA_HH_W4_CONN_ST) { + p_cb->status = (cback_data.status == BTA_HH_OK) ? BTA_HH_OK : BTA_HH_ERR_PROTO; + } else { (* bta_hh_cb.p_cback)(BTA_HH_SET_PROTO_EVT, (tBTA_HH *)&cback_data); - } - else if (p_cb->mode != mode) - { + } + } else if (p_cb->mode != mode) { bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id); p_cb->mode = mode; - mode = (mode == BTA_HH_PROTO_BOOT_MODE)? BTA_HH_LE_PROTO_BOOT_MODE : BTA_HH_LE_PROTO_REPORT_MODE; + mode = (mode == BTA_HH_PROTO_BOOT_MODE) ? BTA_HH_LE_PROTO_BOOT_MODE : BTA_HH_LE_PROTO_REPORT_MODE; BTA_GATTC_WriteCharValue(p_cb->conn_id, &char_id, @@ -1077,23 +1032,20 @@ void bta_hh_le_get_protocol_mode(tBTA_HH_DEV_CB *p_cb) p_cb->w4_evt = BTA_HH_GET_PROTO_EVT; - for (i = 0; i< BTA_HH_LE_HID_SRVC_MAX; i ++) - { + for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) { if (p_cb->hid_srvc[i].in_use && - p_cb->hid_srvc[i].option_char & BTA_HH_LE_PROTO_MODE_BIT) - { + p_cb->hid_srvc[i].option_char & BTA_HH_LE_PROTO_MODE_BIT) { bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id); BTA_GATTC_ReadCharacteristic(p_cb->conn_id, - &char_id, - BTA_GATT_AUTH_REQ_NONE); + &char_id, + BTA_GATT_AUTH_REQ_NONE); break; } } /* no service support protocol_mode, by default report mode */ - if (i == BTA_HH_LE_HID_SRVC_MAX) - { + if (i == BTA_HH_LE_HID_SRVC_MAX) { hs_data.status = BTA_HH_OK; hs_data.handle = p_cb->hid_handle; hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE; @@ -1111,20 +1063,18 @@ void bta_hh_le_get_protocol_mode(tBTA_HH_DEV_CB *p_cb) ** *******************************************************************************/ void bta_hh_le_expl_rpt(tBTA_HH_DEV_CB *p_dev_cb, - tBTA_GATTC_CHAR_ID *p_char_id, - tBT_UUID *p_char_cond, - tBTA_GATT_CHAR_PROP prop) + tBTA_GATTC_CHAR_ID *p_char_id, + tBT_UUID *p_char_cond, + tBTA_GATT_CHAR_PROP prop) { tBTA_GATTC_CHAR_ID char_result; - do - { + do { if (bta_hh_le_find_alloc_report_entry(p_dev_cb, - p_dev_cb->cur_srvc_index, - GATT_UUID_HID_REPORT, - p_char_id->char_id.inst_id, - prop) == NULL) - { + p_dev_cb->cur_srvc_index, + GATT_UUID_HID_REPORT, + p_char_id->char_id.inst_id, + prop) == NULL) { APPL_TRACE_ERROR("Add report entry failed !!!"); break; } @@ -1132,15 +1082,15 @@ void bta_hh_le_expl_rpt(tBTA_HH_DEV_CB *p_dev_cb, APPL_TRACE_DEBUG("Find more REPORT"); if (BTA_GATTC_GetNextChar(p_dev_cb->conn_id, - p_char_id, - p_char_cond, - &char_result, - &prop) != BTA_GATT_OK) + p_char_id, + p_char_cond, + &char_result, + &prop) != BTA_GATT_OK) { break; + } p_char_id = &char_result; - } - while (1); + } while (1); LOG_INFO("%s all BLE reports searched", __func__); bta_hh_le_read_rpt_ref_descr(p_dev_cb, @@ -1158,13 +1108,13 @@ void bta_hh_le_expl_rpt(tBTA_HH_DEV_CB *p_dev_cb, ** *******************************************************************************/ void bta_hh_le_expl_boot_rpt(tBTA_HH_DEV_CB *p_dev_cb, UINT16 char_uuid, - tBTA_GATT_CHAR_PROP prop) + tBTA_GATT_CHAR_PROP prop) { if (bta_hh_le_find_alloc_report_entry(p_dev_cb, - p_dev_cb->cur_srvc_index, - char_uuid, - 0, - prop) == NULL) + p_dev_cb->cur_srvc_index, + char_uuid, + 0, + prop) == NULL) { APPL_TRACE_ERROR("Add report entry failed !!!"); @@ -1187,21 +1137,19 @@ void bta_hh_le_dis_cback(BD_ADDR addr, tDIS_VALUE *p_dis_value) tBTA_HH_DEV_CB *p_cb = bta_hh_le_find_dev_cb_by_bda(addr); - if (p_cb == NULL || p_dis_value == NULL) - { + if (p_cb == NULL || p_dis_value == NULL) { APPL_TRACE_ERROR("received unexpected/error DIS callback"); return; } p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS; /* plug in the PnP info for this device */ - if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT) - { + if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT) { #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x", - p_dis_value->pnp_id.product_id, - p_dis_value->pnp_id.vendor_id, - p_dis_value->pnp_id.product_version); + p_dis_value->pnp_id.product_id, + p_dis_value->pnp_id.vendor_id, + p_dis_value->pnp_id.product_version); #endif p_cb->dscp_info.product_id = p_dis_value->pnp_id.product_id; p_cb->dscp_info.vendor_id = p_dis_value->pnp_id.vendor_id; @@ -1226,11 +1174,10 @@ void bta_hh_le_pri_service_discovery(tBTA_HH_DEV_CB *p_cb) bta_hh_le_co_reset_rpt_cache(p_cb->addr, p_cb->app_id); - p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS); + p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS | BTA_HH_LE_DISC_DIS); /* read DIS info */ - if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback, DIS_ATTR_PNP_ID_BIT)) - { + if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback, DIS_ATTR_PNP_ID_BIT)) { APPL_TRACE_ERROR("read DIS failed"); p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS; } @@ -1253,17 +1200,16 @@ void bta_hh_le_pri_service_discovery(tBTA_HH_DEV_CB *p_cb) ** *******************************************************************************/ void bta_hh_le_encrypt_cback(BD_ADDR bd_addr, tBTA_GATT_TRANSPORT transport, - void *p_ref_data, tBTM_STATUS result) + void *p_ref_data, tBTM_STATUS result) { UINT8 idx = bta_hh_find_cb(bd_addr); tBTA_HH_DEV_CB *p_dev_cb; UNUSED(p_ref_data); UNUSED (transport); - if (idx != BTA_HH_IDX_INVALID) + if (idx != BTA_HH_IDX_INVALID) { p_dev_cb = &bta_hh_cb.kdev[idx]; - else - { + } else { APPL_TRACE_ERROR("unexpected encryption callback, ignore"); return; } @@ -1289,40 +1235,33 @@ void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) UINT8 num_rpt = 0; UNUSED(p_buf); - if (p_cb->status == BTA_HH_OK) - { + if (p_cb->status == BTA_HH_OK) { APPL_TRACE_DEBUG("bta_hh_security_cmpl OK"); - if (!p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use) - { + if (!p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use) { APPL_TRACE_DEBUG("bta_hh_security_cmpl no reports loaded, try to load"); /* start loading the cache if not in stack */ - if ((p_rpt_cache = bta_hh_le_co_cache_load(p_cb->addr, &num_rpt, p_cb->app_id)) != NULL) - { + if ((p_rpt_cache = bta_hh_le_co_cache_load(p_cb->addr, &num_rpt, p_cb->app_id)) != NULL) { bta_hh_process_cache_rpt(p_cb, p_rpt_cache, num_rpt); } } /* discovery has been done for HID service */ - if (p_cb->app_id != 0 && p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use) - { + if (p_cb->app_id != 0 && p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use) { /* configure protocol mode */ - if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE) - { + if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE) { APPL_TRACE_ERROR("bta_hh_security_cmpl"); bta_hh_le_open_cmpl(p_cb); } } /* start primary service discovery for HID service */ - else - { + else { bta_hh_le_pri_service_discovery(p_cb); } - } - else - { + } else { APPL_TRACE_ERROR("%s() - encryption failed; status=0x%04x, reason=0x%04x", - __FUNCTION__, p_cb->status, p_cb->reason); - if (!(p_cb->status == BTA_HH_ERR_SEC && p_cb->reason == BTM_ERR_PROCESSING)) + __FUNCTION__, p_cb->status, p_cb->reason); + if (!(p_cb->status == BTA_HH_ERR_SEC && p_cb->reason == BTM_ERR_PROCESSING)) { bta_hh_le_api_disc_act(p_cb); + } } } @@ -1338,8 +1277,7 @@ void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) void bta_hh_le_notify_enc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) { if (p_cb == NULL || p_cb->security_pending == FALSE || - p_buf == NULL || p_buf->le_enc_cmpl.client_if != bta_hh_cb.gatt_if) - { + p_buf == NULL || p_buf->le_enc_cmpl.client_if != bta_hh_cb.gatt_if) { return; } @@ -1365,8 +1303,7 @@ void bta_hh_clear_service_cache(tBTA_HH_DEV_CB *p_cb) p_cb->total_srvc = 0; p_cb->dscp_info.descriptor.dsc_list = NULL; - for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++) - { + for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++) { utl_freebuf((void **)&p_hid_srvc->rpt_map); memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC)); } @@ -1383,16 +1320,14 @@ void bta_hh_clear_service_cache(tBTA_HH_DEV_CB *p_cb) *******************************************************************************/ void bta_hh_start_security(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) { - UINT8 sec_flag=0; + UINT8 sec_flag = 0; tBTM_SEC_DEV_REC *p_dev_rec; UNUSED(p_buf); p_dev_rec = btm_find_dev(p_cb->addr); - if (p_dev_rec) - { + if (p_dev_rec) { if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || - p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) - { + p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { /* if security collision happened, wait for encryption done */ p_cb->security_pending = TRUE; return; @@ -1403,28 +1338,24 @@ void bta_hh_start_security(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE); /* if link has been encrypted */ - if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) - { + if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) { bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL); } /* if bonded and link not encrypted */ - else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) - { + else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) { sec_flag = BTM_BLE_SEC_ENCRYPT; p_cb->status = BTA_HH_ERR_AUTH_FAILED; BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag); } /* unbonded device, report security error here */ - else if (p_cb->sec_mask != BTA_SEC_NONE) - { + else if (p_cb->sec_mask != BTA_SEC_NONE) { sec_flag = BTM_BLE_SEC_ENCRYPT_NO_MITM; p_cb->status = BTA_HH_ERR_AUTH_FAILED; bta_hh_clear_service_cache(p_cb); BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag); } /* otherwise let it go through */ - else - { + else { bta_hh_sm_execute(p_cb, BTA_HH_ENC_CMPL_EVT, NULL); } @@ -1447,17 +1378,17 @@ void bta_hh_gatt_open(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) tHID_STATUS status = BTA_HH_ERR; /* if received invalid callback data , ignore it */ - if (p_cb == NULL || p_data == NULL) + if (p_cb == NULL || p_data == NULL) { return; + } p2 = p_data->remote_bda; APPL_TRACE_DEBUG("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d", - ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]), - ((p2[4])<<8)+ p2[5],p_data->status); + ((p2[0]) << 24) + ((p2[1]) << 16) + ((p2[2]) << 8) + (p2[3]), + ((p2[4]) << 8) + p2[5], p_data->status); - if (p_data->status == BTA_GATT_OK) - { + if (p_data->status == BTA_GATT_OK) { p_cb->is_le_device = TRUE; p_cb->in_use = TRUE; p_cb->conn_id = p_data->conn_id; @@ -1471,9 +1402,7 @@ void bta_hh_gatt_open(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) bta_hh_sm_execute(p_cb, BTA_HH_START_ENC_EVT, NULL); - } - else /* open failure */ - { + } else { /* open failure */ bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status); } @@ -1489,15 +1418,14 @@ void bta_hh_gatt_open(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf) ** Parameters: ** *******************************************************************************/ -void bta_hh_le_close(tBTA_GATTC_CLOSE * p_data) +void bta_hh_le_close(tBTA_GATTC_CLOSE *p_data) { tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->remote_bda); tBTA_HH_LE_CLOSE *p_buf = NULL; UINT16 sm_event = BTA_HH_GATT_CLOSE_EVT; if (p_dev_cb != NULL && - (p_buf = (tBTA_HH_LE_CLOSE *)GKI_getbuf(sizeof(tBTA_HH_LE_CLOSE))) != NULL) - { + (p_buf = (tBTA_HH_LE_CLOSE *)GKI_getbuf(sizeof(tBTA_HH_LE_CLOSE))) != NULL) { p_buf->hdr.event = sm_event; p_buf->hdr.layer_specific = (UINT16)p_dev_cb->hid_handle; p_buf->conn_id = p_data->conn_id; @@ -1522,17 +1450,15 @@ void bta_hh_le_search_result(tBTA_GATTC_SRVC_RES *p_srvc_result) { tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_srvc_result->conn_id); - if (p_dev_cb != NULL) - { - switch (p_srvc_result->service_uuid.id.uuid.uu.uuid16) - { + if (p_dev_cb != NULL) { + switch (p_srvc_result->service_uuid.id.uuid.uu.uuid16) { case UUID_SERVCLASS_LE_HID: - if (p_srvc_result->service_uuid.is_primary) - { + if (p_srvc_result->service_uuid.is_primary) { /* found HID primamry service */ /* TODO: proceed to find battery and device info */ - if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc)) + if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc)) { p_dev_cb->total_srvc ++; + } APPL_TRACE_DEBUG("num of hid service: %d", p_dev_cb->total_srvc); } break; @@ -1561,17 +1487,14 @@ void bta_hh_le_gatt_disc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_STATUS status) APPL_TRACE_DEBUG("bta_hh_le_gatt_disc_cmpl "); /* if open sucessful or protocol mode not desired, keep the connection open but inform app */ - if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO) - { + if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO) { /* assign a special APP ID temp, since device type unknown */ p_cb->app_id = BTA_HH_APP_ID_LE; /* set report notification configuration */ p_cb->clt_cfg_idx = 0; bta_hh_le_write_rpt_clt_cfg(p_cb, BTA_HH_LE_SRVC_DEF); - } - else /* error, close the GATT connection */ - { + } else { /* error, close the GATT connection */ /* close GATT connection if it's on */ bta_hh_le_api_disc_act(p_cb); } @@ -1590,25 +1513,22 @@ void bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb) { #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d", - p_dev_cb->cur_srvc_index, - p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use); + p_dev_cb->cur_srvc_index, + p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use); #endif if (p_dev_cb->cur_srvc_index < BTA_HH_LE_HID_SRVC_MAX && - p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use) - { + p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use) { if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc) /* explore included service first */ - bta_hh_le_search_hid_included(p_dev_cb); - else { + bta_hh_le_search_hid_included(p_dev_cb); + } else { /* explore characterisc */ p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0; bta_hh_le_search_hid_chars(p_dev_cb); } - } - else /* all service discvery finished */ - { + } else { /* all service discvery finished */ bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status); } } @@ -1627,30 +1547,26 @@ void bta_hh_le_srvc_search_cmpl(tBTA_GATTC_SEARCH_CMPL *p_data) tBTA_HH_DEV_CB *p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->conn_id); /* service search exception or no HID service is supported on remote */ - if (p_dev_cb == NULL) + if (p_dev_cb == NULL) { return; + } - if(p_data->status != BTA_GATT_OK || p_dev_cb->total_srvc == 0) - { + if (p_data->status != BTA_GATT_OK || p_dev_cb->total_srvc == 0) { p_dev_cb->status = BTA_HH_ERR_SDP; /* close the connection and report service discovery complete with error */ bta_hh_le_api_disc_act(p_dev_cb); } /* GATT service discovery sucessfully finished */ - else - { - if (p_dev_cb->disc_active & BTA_HH_LE_DISC_SCPS) - { + else { + if (p_dev_cb->disc_active & BTA_HH_LE_DISC_SCPS) { p_dev_cb->disc_active &= ~BTA_HH_LE_DISC_SCPS; bta_hh_le_open_cmpl(p_dev_cb); + } else { /* discover HID service */ + p_dev_cb->cur_srvc_index = 0; + bta_hh_le_srvc_expl_srvc(p_dev_cb); } - else /* discover HID service */ - { - p_dev_cb->cur_srvc_index = 0; - bta_hh_le_srvc_expl_srvc(p_dev_cb); } } -} /******************************************************************************* ** @@ -1675,10 +1591,9 @@ static void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb) srvc_cond.uu.uuid16 = UUID_SERVCLASS_BATTERY; if (BTA_GATTC_GetFirstIncludedService(p_dev_cb->conn_id, - &srvc_id, - &srvc_cond, - &inc_srvc_result) == BTA_GATT_OK) - { + &srvc_id, + &srvc_cond, + &inc_srvc_result) == BTA_GATT_OK) { /* read include service UUID */ p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id; @@ -1690,15 +1605,13 @@ static void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb) &inc_srvc_result.incl_svc_id, &char_cond, &char_result, - &prop) == BTA_GATT_OK) - { + &prop) == BTA_GATT_OK) { if (bta_hh_le_find_alloc_report_entry(p_dev_cb, char_result.srvc_id.id.inst_id, GATT_UUID_BATTERY_LEVEL, char_result.char_id.inst_id, - prop) == NULL) - { + prop) == NULL) { APPL_TRACE_ERROR("Add battery report entry failed !!!") } @@ -1709,9 +1622,7 @@ static void bta_hh_le_search_hid_included(tBTA_HH_DEV_CB *p_dev_cb) return; - } - else - { + } else { APPL_TRACE_ERROR("Remote device does not have battery level"); } } @@ -1759,8 +1670,7 @@ static void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb) tBTA_GATT_SRVC_ID srvc_id; if (p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx == BTA_HH_LE_DISC_CHAR_NUM || - (p_dev_cb->status != BTA_HH_OK && p_dev_cb->status != BTA_HH_ERR_PROTO)) - { + (p_dev_cb->status != BTA_HH_OK && p_dev_cb->status != BTA_HH_ERR_PROTO)) { p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].cur_expl_char_idx = 0; /* explore next service */ p_dev_cb->cur_srvc_index ++; @@ -1778,17 +1688,15 @@ static void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb) #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("bta_hh_le_search_hid_chars: looking for %s(0x%04x)", - bta_hh_uuid_to_str(char_uuid), char_uuid); + bta_hh_uuid_to_str(char_uuid), char_uuid); #endif if (BTA_GATTC_GetFirstChar( p_dev_cb->conn_id, - &srvc_id, - &char_cond, - &char_result, - &prop) == BTA_GATT_OK) - { - switch (char_uuid) - { + &srvc_id, + &char_cond, + &char_result, + &prop) == BTA_GATT_OK) { + switch (char_uuid) { case GATT_UUID_HID_CONTROL_POINT: p_dev_cb->hid_srvc[char_result.srvc_id.id.inst_id].option_char |= BTA_HH_LE_CP_BIT; next = TRUE; @@ -1797,8 +1705,8 @@ static void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb) case GATT_UUID_HID_REPORT_MAP: /* read the char value */ BTA_GATTC_ReadCharacteristic(p_dev_cb->conn_id, - &char_result, - BTA_GATT_AUTH_REQ_NONE); + &char_result, + BTA_GATT_AUTH_REQ_NONE); next = FALSE; break; @@ -1819,16 +1727,14 @@ static void bta_hh_le_search_hid_chars(tBTA_HH_DEV_CB *p_dev_cb) bta_hh_le_expl_boot_rpt(p_dev_cb, char_uuid, prop); break; } - } - else - { - if (char_uuid == GATT_UUID_HID_PROTO_MODE) + } else { + if (char_uuid == GATT_UUID_HID_PROTO_MODE) { next = !bta_hh_le_set_protocol_mode(p_dev_cb, p_dev_cb->mode); + } } - if (next == TRUE) - { + if (next == TRUE) { bta_hh_le_search_hid_chars(p_dev_cb); } } @@ -1850,14 +1756,15 @@ void bta_hh_le_save_rpt_map(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) pp = p_data->p_value->unformat.p_value; /* save report descriptor */ - if (p_srvc->rpt_map != NULL) - GKI_freebuf((void*)p_srvc->rpt_map); + if (p_srvc->rpt_map != NULL) { + GKI_freebuf((void *)p_srvc->rpt_map); + } - if (p_data->p_value->unformat.len > 0) + if (p_data->p_value->unformat.len > 0) { p_srvc->rpt_map = (UINT8 *)GKI_getbuf(p_data->p_value->unformat.len); + } - if (p_srvc->rpt_map != NULL) - { + if (p_srvc->rpt_map != NULL) { STREAM_TO_ARRAY(p_srvc->rpt_map, pp, p_data->p_value->unformat.len); p_srvc->descriptor.dl_len = p_data->p_value->unformat.len; p_srvc->descriptor.dsc_list = p_dev_cb->hid_srvc[p_data->srvc_id.id.inst_id].rpt_map; @@ -1865,11 +1772,10 @@ void bta_hh_le_save_rpt_map(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) if (bta_hh_le_read_char_dscrpt(p_dev_cb, UUID_SERVCLASS_LE_HID, - p_data->srvc_id.id.inst_id, - GATT_UUID_HID_REPORT_MAP, - p_data->char_id.inst_id, - GATT_UUID_EXT_RPT_REF_DESCR) != BTA_HH_OK) - { + p_data->srvc_id.id.inst_id, + GATT_UUID_HID_REPORT_MAP, + p_data->char_id.inst_id, + GATT_UUID_EXT_RPT_REF_DESCR) != BTA_HH_OK) { bta_hh_le_search_hid_chars(p_dev_cb); } } @@ -1891,8 +1797,7 @@ void bta_hh_le_proc_get_rpt_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_da tBTA_HH_HSDATA hs_data; UINT8 *pp ; - if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT) - { + if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT) { APPL_TRACE_ERROR("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt); return; } @@ -1901,17 +1806,15 @@ void bta_hh_le_proc_get_rpt_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_da hs_data.status = BTA_HH_ERR; hs_data.handle = p_dev_cb->hid_handle; - if (p_data->status == BTA_GATT_OK) - { + if (p_data->status == BTA_GATT_OK) { p_rpt = bta_hh_le_find_report_entry(p_dev_cb, p_data->srvc_id.id.inst_id,//BTA_HH_LE_SRVC_DEF, p_data->char_id.uuid.uu.uuid16, p_data->char_id.inst_id); if (p_rpt != NULL && - p_data->p_value != NULL && - (p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) +p_data->p_value->unformat.len + 1))) != NULL) - { + p_data->p_value != NULL && + (p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + p_data->p_value->unformat.len + 1))) != NULL) { /* pack data send to app */ hs_data.status = BTA_HH_OK; p_buf->len = p_data->p_value->unformat.len + 1; @@ -1919,11 +1822,11 @@ void bta_hh_le_proc_get_rpt_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_da p_buf->offset = 0; /* attach report ID as the first byte of the report before sending it to USB HID driver */ - pp = (UINT8*)(p_buf + 1); + pp = (UINT8 *)(p_buf + 1); UINT8_TO_STREAM(pp, p_rpt->rpt_id); memcpy(pp, p_data->p_value->unformat.p_value, p_data->p_value->unformat.len); - hs_data.rsp_data.p_rpt_data =p_buf; + hs_data.rsp_data.p_rpt_data = p_buf; } } @@ -1949,22 +1852,22 @@ void bta_hh_le_proc_read_proto_mode(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p hs_data.handle = p_dev_cb->hid_handle; hs_data.rsp_data.proto_mode = p_dev_cb->mode; - if (p_data->status == BTA_GATT_OK && p_data->p_value) - { + if (p_data->status == BTA_GATT_OK && p_data->p_value) { hs_data.status = BTA_HH_OK; /* match up BTE/BTA report/boot mode def*/ hs_data.rsp_data.proto_mode = *(p_data->p_value->unformat.p_value); /* LE repot mode is the opposite value of BR/EDR report mode, flip it here */ - if (hs_data.rsp_data.proto_mode == 0) + if (hs_data.rsp_data.proto_mode == 0) { hs_data.rsp_data.proto_mode = BTA_HH_PROTO_BOOT_MODE; - else + } else { hs_data.rsp_data.proto_mode = BTA_HH_PROTO_RPT_MODE; + } p_dev_cb->mode = hs_data.rsp_data.proto_mode; } #if BTA_HH_DEBUG APPL_TRACE_DEBUG("LE GET_PROTOCOL Mode = [%s]", - (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot"); + (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report" : "Boot"); #endif p_dev_cb->w4_evt = 0; @@ -1983,22 +1886,17 @@ void bta_hh_le_proc_read_proto_mode(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p *******************************************************************************/ void bta_hh_w4_le_read_char_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) { - tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; + tBTA_GATTC_READ *p_data = (tBTA_GATTC_READ *)p_buf; UINT8 *pp ; - if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_BATTERY_LEVEL) - { + if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_BATTERY_LEVEL) { bta_hh_read_battery_level_cmpl(p_data->status, p_dev_cb, p_data); - } - else - { - if (p_data->status == BTA_GATT_OK && p_data->p_value) - { + } else { + if (p_data->status == BTA_GATT_OK && p_data->p_value) { pp = p_data->p_value->unformat.p_value; - switch (p_data->char_id.uuid.uu.uuid16) - { - /* save device information */ + switch (p_data->char_id.uuid.uu.uuid16) { + /* save device information */ case GATT_UUID_HID_INFORMATION: STREAM_TO_UINT16(p_dev_cb->dscp_info.version, pp); STREAM_TO_UINT8(p_dev_cb->dscp_info.ctry_code, pp); @@ -2012,19 +1910,17 @@ void bta_hh_w4_le_read_char_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) default: #if BTA_HH_DEBUG == TRUE APPL_TRACE_ERROR("Unexpected read %s(0x%04x)", - bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), - p_data->char_id.uuid.uu.uuid16); + bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), + p_data->char_id.uuid.uu.uuid16); #endif break; } - } - else - { + } else { #if BTA_HH_DEBUG == TRUE APPL_TRACE_ERROR("read uuid %s[0x%04x] error: %d", - bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), - p_data->char_id.uuid.uu.uuid16, - p_data->status); + bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16), + p_data->char_id.uuid.uu.uuid16, + p_data->status); #else APPL_TRACE_ERROR("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status); #endif @@ -2045,10 +1941,9 @@ void bta_hh_w4_le_read_char_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) *******************************************************************************/ void bta_hh_le_read_char_cmpl (tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) { - tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; + tBTA_GATTC_READ *p_data = (tBTA_GATTC_READ *)p_buf; - switch (p_data->char_id.uuid.uu.uuid16) - { + switch (p_data->char_id.uuid.uu.uuid16) { /* GET_REPORT */ case GATT_UUID_HID_REPORT: case GATT_UUID_HID_BT_KB_INPUT: @@ -2081,17 +1976,15 @@ void bta_hh_le_read_char_cmpl (tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) void bta_hh_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) { tBTA_HH_LE_RPT *p_rpt; - tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; + tBTA_GATTC_READ *p_data = (tBTA_GATTC_READ *)p_buf; UINT8 *pp; /* if a report client configuration */ - if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { + if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, - BTA_HH_LE_SRVC_DEF, - p_data->char_id.uuid.uu.uuid16, - p_data->char_id.inst_id)) != NULL) - { + BTA_HH_LE_SRVC_DEF, + p_data->char_id.uuid.uu.uuid16, + p_data->char_id.inst_id)) != NULL) { pp = p_data->p_value->unformat.p_value; STREAM_TO_UINT16(p_rpt->client_cfg_value, pp); @@ -2109,23 +2002,21 @@ void bta_hh_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) ** Parameters: ** *******************************************************************************/ -void bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ * p_data) +void bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ *p_data) { tBTA_HH_LE_RPT *p_rpt; UINT16 descr_uuid = p_data->descr_type.uuid.uu.uuid16; /* read report reference descriptor for battery level is completed */ - if (descr_uuid == GATT_UUID_RPT_REF_DESCR) - { + if (descr_uuid == GATT_UUID_RPT_REF_DESCR) { if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, - p_data->srvc_id.id.inst_id, - GATT_UUID_BATTERY_LEVEL, - p_data->char_id.inst_id)) == NULL) - { + p_data->srvc_id.id.inst_id, + GATT_UUID_BATTERY_LEVEL, + p_data->char_id.inst_id)) == NULL) { bta_hh_le_search_hid_chars(p_dev_cb); - } - else + } else { bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data); + } } } @@ -2141,31 +2032,30 @@ void bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT void bta_hh_w4_le_read_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) { tBTA_HH_LE_RPT *p_rpt; - tBTA_GATTC_READ * p_data = (tBTA_GATTC_READ *)p_buf; + tBTA_GATTC_READ *p_data = (tBTA_GATTC_READ *)p_buf; UINT16 char_uuid16; - if (p_data == NULL) + if (p_data == NULL) { return; + } char_uuid16 = p_data->char_id.uuid.uu.uuid16; #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)", - bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), - p_data->descr_type.uuid.uu.uuid16); + bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), + p_data->descr_type.uuid.uu.uuid16); #endif - switch (char_uuid16) - { + switch (char_uuid16) { case GATT_UUID_HID_REPORT: if ((p_rpt = bta_hh_le_find_report_entry(p_dev_cb, - p_data->srvc_id.id.inst_id, - GATT_UUID_HID_REPORT, - p_data->char_id.inst_id)) == NULL) - { + p_data->srvc_id.id.inst_id, + GATT_UUID_HID_REPORT, + p_data->char_id.inst_id)) == NULL) { bta_hh_le_search_hid_chars(p_dev_cb); - } - else + } else { bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data); + } break; case GATT_UUID_HID_REPORT_MAP: @@ -2195,19 +2085,16 @@ void bta_hh_w4_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) { tBTA_GATTC_WRITE *p_data = (tBTA_GATTC_WRITE *)p_buf; - if (p_data == NULL) + if (p_data == NULL) { return; + } - if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_HID_PROTO_MODE) - { + if (p_data->char_id.uuid.uu.uuid16 == GATT_UUID_HID_PROTO_MODE) { p_dev_cb->status = (p_data->status == BTA_GATT_OK) ? BTA_HH_OK : BTA_HH_ERR_PROTO; - if ((p_dev_cb->disc_active & BTA_HH_LE_DISC_HIDS) != 0) - { + if ((p_dev_cb->disc_active & BTA_HH_LE_DISC_HIDS) != 0) { bta_hh_le_search_hid_chars(p_dev_cb); - } - else - { + } else { bta_hh_le_open_cmpl(p_dev_cb); } } @@ -2228,24 +2115,23 @@ void bta_hh_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) tBTA_HH_CBDATA cback_data ; UINT16 cb_evt = p_dev_cb->w4_evt; - if (p_data == NULL || cb_evt == 0) + if (p_data == NULL || cb_evt == 0) { return; + } #if BTA_HH_DEBUG APPL_TRACE_DEBUG("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt); #endif - switch (p_data->char_id.uuid.uu.uuid16) - { + switch (p_data->char_id.uuid.uu.uuid16) { /* Set protocol finished */ case GATT_UUID_HID_PROTO_MODE: cback_data.handle = p_dev_cb->hid_handle; - if (p_data->status == BTA_GATT_OK) - { + if (p_data->status == BTA_GATT_OK) { bta_hh_le_register_input_notif(p_dev_cb, p_data->srvc_id.id.inst_id, p_dev_cb->mode, FALSE); cback_data.status = BTA_HH_OK; - } - else + } else { cback_data.status = BTA_HH_ERR; + } p_dev_cb->w4_evt = 0; (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); break; @@ -2256,7 +2142,7 @@ void bta_hh_le_write_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) case GATT_UUID_HID_BT_MOUSE_INPUT: case GATT_UUID_HID_BT_KB_OUTPUT: cback_data.handle = p_dev_cb->hid_handle; - cback_data.status = (p_data->status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR; + cback_data.status = (p_data->status == BTA_GATT_OK) ? BTA_HH_OK : BTA_HH_ERR; p_dev_cb->w4_evt = 0; (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); break; @@ -2287,21 +2173,19 @@ void bta_hh_le_write_char_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_b UINT8 srvc_inst_id, hid_inst_id; /* only write client configuration possible */ - if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { + if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { srvc_inst_id = p_data->srvc_id.id.inst_id; hid_inst_id = srvc_inst_id; - switch (p_data->char_id.uuid.uu.uuid16) - { + switch (p_data->char_id.uuid.uu.uuid16) { case GATT_UUID_BATTERY_LEVEL: /* battery level clt cfg registered */ hid_inst_id = bta_hh_le_find_service_inst_by_battery_inst_id(p_dev_cb, srvc_inst_id); - /* fall through */ + /* fall through */ case GATT_UUID_HID_BT_KB_INPUT: case GATT_UUID_HID_BT_MOUSE_INPUT: case GATT_UUID_HID_REPORT: if (p_data->status == BTA_GATT_OK) p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx].client_cfg_value = - BTA_GATT_CLT_CONFIG_NOTIFICATION; + BTA_GATT_CLT_CONFIG_NOTIFICATION; p_dev_cb->clt_cfg_idx ++; bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id); @@ -2314,16 +2198,14 @@ void bta_hh_le_write_char_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_b default: APPL_TRACE_ERROR("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16); } - } - else - { + } else { #if BTA_HH_DEBUG == TRUE - APPL_TRACE_ERROR("Unexpected write to %s(0x%04x)", - bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), - p_data->descr_type.uuid.uu.uuid16); + APPL_TRACE_ERROR("Unexpected write to %s(0x%04x)", + bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16), + p_data->descr_type.uuid.uu.uuid16); #else - APPL_TRACE_ERROR("Unexpected write to (0x%04x)", - p_data->descr_type.uuid.uu.uuid16); + APPL_TRACE_ERROR("Unexpected write to (0x%04x)", + p_data->descr_type.uuid.uu.uuid16); #endif } @@ -2345,35 +2227,32 @@ void bta_hh_le_input_rpt_notify(tBTA_GATTC_NOTIFY *p_data) UINT8 *p_buf; tBTA_HH_LE_RPT *p_rpt; - if (p_dev_cb == NULL) - { + if (p_dev_cb == NULL) { APPL_TRACE_ERROR("notification received from Unknown device"); return; } - app_id= p_dev_cb->app_id; + app_id = p_dev_cb->app_id; p_rpt = bta_hh_le_find_report_entry(p_dev_cb, BTA_HH_LE_SRVC_DEF, p_data->char_id.char_id.uuid.uu.uuid16, p_data->char_id.char_id.inst_id); - if (p_rpt == NULL) - { + if (p_rpt == NULL) { APPL_TRACE_ERROR("notification received for Unknown Report"); return; } - if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_MOUSE_INPUT) + if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_MOUSE_INPUT) { app_id = BTA_HH_APP_ID_MI; - else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT) + } else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT) { app_id = BTA_HH_APP_ID_KB; + } APPL_TRACE_DEBUG("Notification received on report ID: %d", p_rpt->rpt_id); /* need to append report ID to the head of data */ - if (p_rpt->rpt_id != 0) - { - if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL) - { + if (p_rpt->rpt_id != 0) { + if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL) { APPL_TRACE_ERROR("No resources to send report data"); return; } @@ -2386,16 +2265,17 @@ void bta_hh_le_input_rpt_notify(tBTA_GATTC_NOTIFY *p_data) } bta_hh_co_data((UINT8)p_dev_cb->hid_handle, - p_buf, - p_data->len, - p_dev_cb->mode, - 0 , /* no sub class*/ - p_dev_cb->dscp_info.ctry_code, - p_dev_cb->addr, - app_id); + p_buf, + p_data->len, + p_dev_cb->mode, + 0 , /* no sub class*/ + p_dev_cb->dscp_info.ctry_code, + p_dev_cb->addr, + app_id); - if (p_buf != p_data->value) + if (p_buf != p_data->value) { GKI_freebuf(p_buf); + } } /******************************************************************************* @@ -2412,8 +2292,7 @@ void bta_hh_le_open_fail(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) tBTA_HH_CONN conn_dat ; /* open failure in the middle of service discovery, clear all services */ - if (p_cb->disc_active & BTA_HH_LE_DISC_HIDS) - { + if (p_cb->disc_active & BTA_HH_LE_DISC_HIDS) { bta_hh_clear_service_cache(p_cb); } @@ -2424,10 +2303,11 @@ void bta_hh_le_open_fail(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) conn_dat.le_hid = TRUE; conn_dat.scps_supported = p_cb->scps_supported; - if (p_cb->status == BTA_HH_OK) + if (p_cb->status == BTA_HH_OK) { conn_dat.status = (p_data->le_close.reason == BTA_GATT_CONN_UNKNOWN) ? p_cb->status : BTA_HH_ERR; - else + } else { conn_dat.status = p_cb->status; + } /* Report OPEN fail event */ (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat); @@ -2458,17 +2338,13 @@ void bta_hh_gatt_close(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) (*bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat); /* if no connection is active and HH disable is signaled, disable service */ - if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) - { + if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable) { bta_hh_disc_cmpl(); - } - else - { + } else { #if (BTA_HH_LE_RECONN == TRUE) - if (p_data->le_close.reason == BTA_GATT_CONN_TIMEOUT) - { - bta_hh_le_add_dev_bg_conn(p_cb, FALSE); - } + if (p_data->le_close.reason == BTA_GATT_CONN_TIMEOUT) { + bta_hh_le_add_dev_bg_conn(p_cb, FALSE); + } #endif } @@ -2487,8 +2363,7 @@ void bta_hh_gatt_close(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) *******************************************************************************/ void bta_hh_le_api_disc_act(tBTA_HH_DEV_CB *p_cb) { - if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID) - { + if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID) { BTA_GATTC_Close(p_cb->conn_id); /* remove device from background connection if intended to disconnect, do not allow reconnection */ @@ -2511,13 +2386,13 @@ void bta_hh_le_get_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, tBTA_HH_RPT_TYPE r tBTA_GATTC_CHAR_ID char_id; UINT16 srvc_uuid = UUID_SERVCLASS_LE_HID; - if (p_rpt == NULL) - { + if (p_rpt == NULL) { APPL_TRACE_ERROR("bta_hh_le_get_rpt: no matching report"); return; } - if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) + if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL) { srvc_uuid = UUID_SERVCLASS_BATTERY; + } p_cb->w4_evt = BTA_HH_GET_RPT_EVT; @@ -2547,8 +2422,7 @@ void bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, tBTA_GATTC_CHAR_ID char_id; UINT8 *p_value, rpt_id; - if (p_buf == NULL || p_buf->len == 0) - { + if (p_buf == NULL || p_buf->len == 0) { APPL_TRACE_ERROR("bta_hh_le_write_rpt: Illegal data"); return; } @@ -2560,8 +2434,7 @@ void bta_hh_le_write_rpt(tBTA_HH_DEV_CB *p_cb, UINT8 srvc_inst, p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[srvc_inst].report, p_cb->mode, r_type, rpt_id); - if (p_rpt == NULL) - { + if (p_rpt == NULL) { APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report"); GKI_freebuf(p_buf); return; @@ -2599,8 +2472,7 @@ void bta_hh_le_suspend(tBTA_HH_DEV_CB *p_cb, tBTA_HH_TRANS_CTRL_TYPE ctrl_type) ctrl_type -= BTA_HH_CTRL_SUSPEND; - for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) - { + for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++) { bta_hh_le_fill_16bits_srvc_id(TRUE, i, UUID_SERVCLASS_LE_HID, &char_id.srvc_id); bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_CONTROL_POINT, &char_id.char_id); @@ -2624,57 +2496,55 @@ void bta_hh_le_suspend(tBTA_HH_DEV_CB *p_cb, tBTA_HH_TRANS_CTRL_TYPE ctrl_type) *******************************************************************************/ void bta_hh_le_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data) { - switch(p_data->api_sndcmd.t_type) - { - case HID_TRANS_SET_PROTOCOL: - p_cb->w4_evt = BTA_HH_SET_PROTO_EVT; - bta_hh_le_set_protocol_mode(p_cb, p_data->api_sndcmd.param); - break; + switch (p_data->api_sndcmd.t_type) { + case HID_TRANS_SET_PROTOCOL: + p_cb->w4_evt = BTA_HH_SET_PROTO_EVT; + bta_hh_le_set_protocol_mode(p_cb, p_data->api_sndcmd.param); + break; - case HID_TRANS_GET_PROTOCOL: - bta_hh_le_get_protocol_mode(p_cb); - break; + case HID_TRANS_GET_PROTOCOL: + bta_hh_le_get_protocol_mode(p_cb); + break; - case HID_TRANS_GET_REPORT: - bta_hh_le_get_rpt(p_cb, - BTA_HH_LE_SRVC_DEF, - p_data->api_sndcmd.param, - p_data->api_sndcmd.rpt_id); - break; + case HID_TRANS_GET_REPORT: + bta_hh_le_get_rpt(p_cb, + BTA_HH_LE_SRVC_DEF, + p_data->api_sndcmd.param, + p_data->api_sndcmd.rpt_id); + break; - case HID_TRANS_SET_REPORT: - bta_hh_le_write_rpt(p_cb, - BTA_HH_LE_SRVC_DEF, - BTA_GATTC_TYPE_WRITE, - p_data->api_sndcmd.param, - p_data->api_sndcmd.p_data, - BTA_HH_SET_RPT_EVT); - break; + case HID_TRANS_SET_REPORT: + bta_hh_le_write_rpt(p_cb, + BTA_HH_LE_SRVC_DEF, + BTA_GATTC_TYPE_WRITE, + p_data->api_sndcmd.param, + p_data->api_sndcmd.p_data, + BTA_HH_SET_RPT_EVT); + break; - case HID_TRANS_DATA: /* output report */ + case HID_TRANS_DATA: /* output report */ - bta_hh_le_write_rpt(p_cb, - BTA_HH_LE_SRVC_DEF, - BTA_GATTC_TYPE_WRITE_NO_RSP, - p_data->api_sndcmd.param, - p_data->api_sndcmd.p_data, - BTA_HH_DATA_EVT); - break; + bta_hh_le_write_rpt(p_cb, + BTA_HH_LE_SRVC_DEF, + BTA_GATTC_TYPE_WRITE_NO_RSP, + p_data->api_sndcmd.param, + p_data->api_sndcmd.p_data, + BTA_HH_DATA_EVT); + break; - case HID_TRANS_CONTROL: - /* no handshake event will be generated */ - /* if VC_UNPLUG is issued, set flag */ - if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND || - p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) - { - bta_hh_le_suspend(p_cb, p_data->api_sndcmd.param); - } - break; + case HID_TRANS_CONTROL: + /* no handshake event will be generated */ + /* if VC_UNPLUG is issued, set flag */ + if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND || + p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND) { + bta_hh_le_suspend(p_cb, p_data->api_sndcmd.param); + } + break; - default: - APPL_TRACE_ERROR("%s unsupported transaction for BLE HID device: %d", - __func__, p_data->api_sndcmd.t_type); - break; + default: + APPL_TRACE_ERROR("%s unsupported transaction for BLE HID device: %d", + __func__, p_data->api_sndcmd.t_type); + break; } } @@ -2691,17 +2561,15 @@ void bta_hh_le_get_dscp_act(tBTA_HH_DEV_CB *p_cb) { UINT8 i; - for (i = 0 ;i < BTA_HH_LE_HID_SRVC_MAX; i ++) - { - if (p_cb->hid_srvc[i].in_use) - { + for (i = 0 ; i < BTA_HH_LE_HID_SRVC_MAX; i ++) { + if (p_cb->hid_srvc[i].in_use) { p_cb->dscp_info.descriptor.dl_len = p_cb->hid_srvc[i].descriptor.dl_len; p_cb->dscp_info.descriptor.dsc_list = p_cb->hid_srvc[i].descriptor.dsc_list; (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info); - } - else + } else { break; + } } } @@ -2716,22 +2584,21 @@ void bta_hh_le_get_dscp_act(tBTA_HH_DEV_CB *p_cb) *******************************************************************************/ static void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond) { - UINT8 sec_flag=0; + UINT8 sec_flag = 0; BOOLEAN to_add = TRUE; - if (check_bond) - { + if (check_bond) { /* start reconnection if remote is a bonded device */ /* verify bond */ BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE); - if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0) + if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0) { to_add = FALSE; + } } if (/*p_cb->dscp_info.flag & BTA_HH_LE_NORMAL_CONN &&*/ - !p_cb->in_bg_conn && to_add) - { + !p_cb->in_bg_conn && to_add) { /* add device into BG connection to accept remote initiated connection */ BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE, BTA_GATT_TRANSPORT_LE); p_cb->in_bg_conn = TRUE; @@ -2788,8 +2655,7 @@ UINT8 bta_hh_le_add_device(tBTA_HH_DEV_CB *p_cb, tBTA_HH_MAINT_DEV *p_dev_info) *******************************************************************************/ void bta_hh_le_remove_dev_bg_conn(tBTA_HH_DEV_CB *p_dev_cb) { - if (p_dev_cb->in_bg_conn) - { + if (p_dev_cb->in_bg_conn) { p_dev_cb->in_bg_conn = FALSE; BTA_GATTC_CancelOpen(bta_hh_cb.gatt_if, p_dev_cb->addr, FALSE); @@ -2813,9 +2679,8 @@ void bta_hh_le_update_scpp(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_DATA *p_buf) tBTA_HH_CBDATA cback_data ; if (!p_dev_cb->is_le_device || - p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE || - p_dev_cb->scps_supported == FALSE) - { + p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE || + p_dev_cb->scps_supported == FALSE) { APPL_TRACE_ERROR("Can not set ScPP scan paramter as boot host, or remote does not support ScPP "); cback_data.handle = p_dev_cb->hid_handle; @@ -2858,76 +2723,78 @@ static void bta_hh_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) #if BTA_HH_DEBUG APPL_TRACE_DEBUG("bta_hh_gattc_callback event = %d", event); #endif - if (p_data == NULL) + if (p_data == NULL) { return; + } - switch (event) - { - case BTA_GATTC_REG_EVT: /* 0 */ - bta_hh_le_register_cmpl(&p_data->reg_oper); - break; + switch (event) { + case BTA_GATTC_REG_EVT: /* 0 */ + bta_hh_le_register_cmpl(&p_data->reg_oper); + break; - case BTA_GATTC_DEREG_EVT: /* 1 */ - bta_hh_cleanup_disable(p_data->reg_oper.status); - break; + case BTA_GATTC_DEREG_EVT: /* 1 */ + bta_hh_cleanup_disable(p_data->reg_oper.status); + break; - case BTA_GATTC_OPEN_EVT: /* 2 */ - p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->open.remote_bda); - if (p_dev_cb) { - bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_OPEN_EVT, (tBTA_HH_DATA *)&p_data->open); - } - break; + case BTA_GATTC_OPEN_EVT: /* 2 */ + p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->open.remote_bda); + if (p_dev_cb) { + bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_OPEN_EVT, (tBTA_HH_DATA *)&p_data->open); + } + break; - case BTA_GATTC_READ_CHAR_EVT: /* 3 */ - case BTA_GATTC_READ_DESCR_EVT: /* 8 */ - p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->read.conn_id); - if (event == BTA_GATTC_READ_CHAR_EVT) - evt = BTA_HH_GATT_READ_CHAR_CMPL_EVT; - else - evt = BTA_HH_GATT_READ_DESCR_CMPL_EVT; + case BTA_GATTC_READ_CHAR_EVT: /* 3 */ + case BTA_GATTC_READ_DESCR_EVT: /* 8 */ + p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->read.conn_id); + if (event == BTA_GATTC_READ_CHAR_EVT) { + evt = BTA_HH_GATT_READ_CHAR_CMPL_EVT; + } else { + evt = BTA_HH_GATT_READ_DESCR_CMPL_EVT; + } - bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->read); - break; + bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->read); + break; - case BTA_GATTC_WRITE_DESCR_EVT: /* 9 */ - case BTA_GATTC_WRITE_CHAR_EVT: /* 4 */ - p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->write.conn_id); - if (event == BTA_GATTC_WRITE_CHAR_EVT) - evt = BTA_HH_GATT_WRITE_CHAR_CMPL_EVT; - else - evt = BTA_HH_GATT_WRITE_DESCR_CMPL_EVT; + case BTA_GATTC_WRITE_DESCR_EVT: /* 9 */ + case BTA_GATTC_WRITE_CHAR_EVT: /* 4 */ + p_dev_cb = bta_hh_le_find_dev_cb_by_conn_id(p_data->write.conn_id); + if (event == BTA_GATTC_WRITE_CHAR_EVT) { + evt = BTA_HH_GATT_WRITE_CHAR_CMPL_EVT; + } else { + evt = BTA_HH_GATT_WRITE_DESCR_CMPL_EVT; + } - bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->write); - break; + bta_hh_sm_execute(p_dev_cb, evt, (tBTA_HH_DATA *)&p_data->write); + break; - case BTA_GATTC_CLOSE_EVT: /* 5 */ - bta_hh_le_close(&p_data->close); - break; + case BTA_GATTC_CLOSE_EVT: /* 5 */ + bta_hh_le_close(&p_data->close); + break; - case BTA_GATTC_SEARCH_CMPL_EVT: /* 6 */ - bta_hh_le_srvc_search_cmpl(&p_data->search_cmpl); - break; + case BTA_GATTC_SEARCH_CMPL_EVT: /* 6 */ + bta_hh_le_srvc_search_cmpl(&p_data->search_cmpl); + break; - case BTA_GATTC_SEARCH_RES_EVT: /* 7 */ - bta_hh_le_search_result(&p_data->srvc_res); - break; + case BTA_GATTC_SEARCH_RES_EVT: /* 7 */ + bta_hh_le_search_result(&p_data->srvc_res); + break; - case BTA_GATTC_NOTIF_EVT: /* 10 */ - bta_hh_le_input_rpt_notify(&p_data->notify); - break; + case BTA_GATTC_NOTIF_EVT: /* 10 */ + bta_hh_le_input_rpt_notify(&p_data->notify); + break; - case BTA_GATTC_ENC_CMPL_CB_EVT: /* 17 */ - p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->enc_cmpl.remote_bda); - if (p_dev_cb) { - bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_ENC_CMPL_EVT, + case BTA_GATTC_ENC_CMPL_CB_EVT: /* 17 */ + p_dev_cb = bta_hh_le_find_dev_cb_by_bda(p_data->enc_cmpl.remote_bda); + if (p_dev_cb) { + bta_hh_sm_execute(p_dev_cb, BTA_HH_GATT_ENC_CMPL_EVT, (tBTA_HH_DATA *)&p_data->enc_cmpl); - } - break; + } + break; - default: - break; + default: + break; } } @@ -2947,8 +2814,7 @@ void bta_hh_le_hid_read_rpt_clt_cfg(BD_ADDR bd_addr, UINT8 rpt_id) UINT8 index = BTA_HH_IDX_INVALID; index = bta_hh_find_cb(bd_addr); - if ((index = bta_hh_find_cb(bd_addr))== BTA_HH_IDX_INVALID) - { + if ((index = bta_hh_find_cb(bd_addr)) == BTA_HH_IDX_INVALID) { APPL_TRACE_ERROR("unknown device"); return; } @@ -2957,8 +2823,7 @@ void bta_hh_le_hid_read_rpt_clt_cfg(BD_ADDR bd_addr, UINT8 rpt_id) p_rpt = bta_hh_le_find_rpt_by_idtype(p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].report, p_cb->mode, BTA_HH_RPTT_INPUT, rpt_id); - if (p_rpt == NULL) - { + if (p_rpt == NULL) { APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report"); return; } @@ -2989,17 +2854,16 @@ static void bta_hh_le_search_scps(tBTA_HH_DEV_CB *p_cb) { tBT_UUID pri_srvc; - if ( p_cb->mode == BTA_HH_PROTO_RPT_MODE) - { + if ( p_cb->mode == BTA_HH_PROTO_RPT_MODE) { p_cb->disc_active |= BTA_HH_LE_DISC_SCPS; /* start service discovery for Scan Parameter service */ pri_srvc.len = LEN_UUID_16; pri_srvc.uu.uuid16 = UUID_SERVCLASS_SCAN_PARAM; BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc); - } - else + } else { bta_hh_le_open_cmpl(p_cb); + } } /******************************************************************************* @@ -3029,12 +2893,12 @@ static void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb) &srvc_id, &char_cond, &char_result, - &prop) == BTA_GATT_OK) - { - if (prop & BTA_GATT_CHAR_PROP_BIT_NOTIFY) + &prop) == BTA_GATT_OK) { + if (prop & BTA_GATT_CHAR_PROP_BIT_NOTIFY) { p_cb->scps_notify |= BTA_HH_LE_SCPS_NOTIFY_SPT; - else + } else { p_cb->scps_notify = BTA_HH_LE_SCPS_NOTIFY_NONE; + } } } @@ -3051,25 +2915,22 @@ static void bta_hh_le_search_scps_chars(tBTA_HH_DEV_CB *p_cb) *******************************************************************************/ static void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status) { - UINT8 sec_flag=0; + UINT8 sec_flag = 0; tBTA_GATTC_CHAR_ID char_id; /* if write scan parameter sucessful */ /* if bonded and notification is not enabled, configure the client configuration */ if (status == BTA_GATT_OK && - (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 && - (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0) - { + (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 && + (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0) { BTM_GetSecurityFlagsByTransport(p_dev_cb->addr, &sec_flag, BT_TRANSPORT_LE); - if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) - { + if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) { if (bta_hh_le_write_char_clt_cfg (p_dev_cb, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_REFRESH, - BTA_GATT_CLT_CONFIG_NOTIFICATION)) - { + BTA_GATT_CLT_CONFIG_NOTIFICATION)) { bta_hh_le_fill_16bits_srvc_id(TRUE, BTA_HH_SCPP_INST_DEF, UUID_SERVCLASS_SCAN_PARAM, &char_id.srvc_id); bta_hh_le_fill_16bits_char_id(BTA_HH_SCPP_INST_DEF, GATT_UUID_SCAN_REFRESH, &char_id.char_id); @@ -3097,11 +2958,12 @@ static void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GA tBTA_HH_CBDATA cback_data ; UINT16 cb_evt = p_dev_cb->w4_evt; - if (status == BTA_GATT_OK) + if (status == BTA_GATT_OK) { p_dev_cb->scps_notify = (BTA_HH_LE_SCPS_NOTIFY_ENB | BTA_HH_LE_SCPS_NOTIFY_SPT); + } cback_data.handle = p_dev_cb->hid_handle; - cback_data.status = (status == BTA_GATT_OK)? BTA_HH_OK : BTA_HH_ERR; + cback_data.status = (status == BTA_GATT_OK) ? BTA_HH_OK : BTA_HH_ERR; p_dev_cb->w4_evt = 0; (* bta_hh_cb.p_cback)(cb_evt, (tBTA_HH *)&cback_data); @@ -3124,36 +2986,30 @@ static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb, UINT8 i = 0; tBTA_HH_LE_RPT *p_rpt; - if (num_rpt != 0) /* no cache is found */ - { + if (num_rpt != 0) { /* no cache is found */ p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].in_use = TRUE; /* set the descriptor info */ p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dl_len = - p_cb->dscp_info.descriptor.dl_len; + p_cb->dscp_info.descriptor.dl_len; p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dsc_list = - p_cb->dscp_info.descriptor.dsc_list; + p_cb->dscp_info.descriptor.dsc_list; - for (; i inst_id), - p_rpt_cache->rpt_uuid, - BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt_cache->inst_id), - p_rpt_cache->prop)) == NULL) - { + BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id), + p_rpt_cache->rpt_uuid, + BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt_cache->inst_id), + p_rpt_cache->prop)) == NULL) { APPL_TRACE_ERROR("bta_hh_process_cache_rpt: allocation report entry failure"); break; - } - else - { + } else { p_rpt->rpt_type = p_rpt_cache->rpt_type; p_rpt->rpt_id = p_rpt_cache->rpt_id; - if(p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || - p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT || - (p_rpt->uuid == GATT_UUID_HID_REPORT && p_rpt->rpt_type == BTA_HH_RPTT_INPUT)) - { + if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT || + p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT || + (p_rpt->uuid == GATT_UUID_HID_REPORT && p_rpt->rpt_type == BTA_HH_RPTT_INPUT)) { p_rpt->client_cfg_value = BTA_GATT_CLT_CONFIG_NOTIFICATION; } } diff --git a/components/bt/bluedroid/bta/hh/bta_hh_main.c b/components/bt/bluedroid/bta/hh/bta_hh_main.c index e5c353d62..7959b3977 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_main.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_main.c @@ -37,8 +37,7 @@ *****************************************************************************/ /* state machine action enumeration list */ -enum -{ +enum { BTA_HH_API_DISC_ACT, /* HID host process API close action */ BTA_HH_OPEN_ACT, /* HID host process BTA_HH_EVT_OPEN */ BTA_HH_CLOSE_ACT, /* HID host process BTA_HH_EVT_CLOSE */ @@ -77,8 +76,7 @@ enum typedef void (*tBTA_HH_ACTION)(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data); /* action functions */ -const tBTA_HH_ACTION bta_hh_action[] = -{ +const tBTA_HH_ACTION bta_hh_action[] = { bta_hh_api_disc_act, bta_hh_open_act, bta_hh_close_act, @@ -93,20 +91,20 @@ const tBTA_HH_ACTION bta_hh_action[] = bta_hh_open_cmpl_act, bta_hh_open_failure #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) - ,bta_hh_gatt_close - ,bta_hh_le_open_fail - ,bta_hh_gatt_open - ,bta_hh_w4_le_read_char_cmpl - ,bta_hh_le_read_char_cmpl - ,bta_hh_w4_le_read_descr_cmpl - ,bta_hh_le_read_descr_cmpl - ,bta_hh_w4_le_write_cmpl - ,bta_hh_le_write_cmpl - ,bta_hh_le_write_char_descr_cmpl - ,bta_hh_start_security - ,bta_hh_security_cmpl - ,bta_hh_le_update_scpp - ,bta_hh_le_notify_enc_cmpl + , bta_hh_gatt_close + , bta_hh_le_open_fail + , bta_hh_gatt_open + , bta_hh_w4_le_read_char_cmpl + , bta_hh_le_read_char_cmpl + , bta_hh_w4_le_read_descr_cmpl + , bta_hh_le_read_descr_cmpl + , bta_hh_w4_le_write_cmpl + , bta_hh_le_write_cmpl + , bta_hh_le_write_char_descr_cmpl + , bta_hh_start_security + , bta_hh_security_cmpl + , bta_hh_le_update_scpp + , bta_hh_le_notify_enc_cmpl #endif }; @@ -116,121 +114,117 @@ const tBTA_HH_ACTION bta_hh_action[] = #define BTA_HH_NUM_COLS 2 /* number of columns */ /* state table for idle state */ -const UINT8 bta_hh_st_idle[][BTA_HH_NUM_COLS] = -{ -/* Event Action Next state */ -/* BTA_HH_API_OPEN_EVT */ {BTA_HH_START_SDP, BTA_HH_W4_CONN_ST }, -/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST }, -/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST }, -/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST } +const UINT8 bta_hh_st_idle[][BTA_HH_NUM_COLS] = { + /* Event Action Next state */ + /* BTA_HH_API_OPEN_EVT */ {BTA_HH_START_SDP, BTA_HH_W4_CONN_ST }, + /* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST }, + /* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST }, + /* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST } #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) -/* BTA_HH_GATT_CLOSE_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* BTA_HH_GATT_OPEN_EVT */ ,{BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST } -/* BTA_HH_START_ENC_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* BTA_HH_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* READ_CHAR_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* BTA_HH_GATT_WRITE_CMPL_EVT*/ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* READ_DESCR_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* WRITE_DESCR_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* SCPP_UPDATE_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } -/* BTA_HH_GATT_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_CLOSE_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_OPEN_EVT */ , {BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST } + /* BTA_HH_START_ENC_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* BTA_HH_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* READ_CHAR_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_WRITE_CMPL_EVT*/ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* READ_DESCR_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* WRITE_DESCR_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* SCPP_UPDATE_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_IDLE_ST } #endif }; -const UINT8 bta_hh_st_w4_conn[][BTA_HH_NUM_COLS] = -{ -/* Event Action Next state */ -/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, -/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST }, -/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, -/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, -/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, -/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_SDP_CMPL, BTA_HH_W4_CONN_ST }, -/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_W4_CONN_ST }, -/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, -/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST }, -/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST } +const UINT8 bta_hh_st_w4_conn[][BTA_HH_NUM_COLS] = { + /* Event Action Next state */ + /* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, + /* BTA_HH_API_CLOSE_EVT */ {BTA_HH_IGNORE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_W4_CONN_ST }, + /* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, + /* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, + /* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, + /* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_SDP_CMPL, BTA_HH_W4_CONN_ST }, + /* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_W4_CONN_ST }, + /* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST }, + /* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_IDLE_ST }, + /* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_OPEN_CMPL_ACT, BTA_HH_CONN_ST } #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) -/* BTA_HH_GATT_CLOSE_EVT */ ,{BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST } -/* BTA_HH_GATT_OPEN_EVT */ ,{BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST } -/* BTA_HH_START_ENC_EVT */ ,{BTA_HH_START_SEC, BTA_HH_W4_SEC } -/* BTA_HH_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } -/* READ_CHAR_CMPL_EVT */ ,{BTA_HH_W4_LE_READ_CHAR, BTA_HH_W4_CONN_ST } -/* BTA_HH_GATT_WRITE_CMPL_EVT*/ ,{BTA_HH_W4_LE_WRITE, BTA_HH_W4_CONN_ST } -/* READ_DESCR_CMPL_EVT */ ,{BTA_HH_W4_LE_READ_DESCR, BTA_HH_W4_CONN_ST } -/* WRITE_DESCR_CMPL_EVT */ ,{BTA_HH_WRITE_DESCR, BTA_HH_W4_CONN_ST } -/* SCPP_UPDATE_EVT */ ,{BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } -/* BTA_HH_GATT_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } + /* BTA_HH_GATT_CLOSE_EVT */ , {BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_OPEN_EVT */ , {BTA_HH_GATT_OPEN, BTA_HH_W4_CONN_ST } + /* BTA_HH_START_ENC_EVT */ , {BTA_HH_START_SEC, BTA_HH_W4_SEC } + /* BTA_HH_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } + /* READ_CHAR_CMPL_EVT */ , {BTA_HH_W4_LE_READ_CHAR, BTA_HH_W4_CONN_ST } + /* BTA_HH_GATT_WRITE_CMPL_EVT*/ , {BTA_HH_W4_LE_WRITE, BTA_HH_W4_CONN_ST } + /* READ_DESCR_CMPL_EVT */ , {BTA_HH_W4_LE_READ_DESCR, BTA_HH_W4_CONN_ST } + /* WRITE_DESCR_CMPL_EVT */ , {BTA_HH_WRITE_DESCR, BTA_HH_W4_CONN_ST } + /* SCPP_UPDATE_EVT */ , {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } + /* BTA_HH_GATT_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_W4_CONN_ST } #endif }; -const UINT8 bta_hh_st_connected[][BTA_HH_NUM_COLS] = -{ -/* Event Action Next state */ -/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST }, -/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_DATA_EVT */ {BTA_HH_DATA_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_CTRL_DAT_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_HANDSK_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST }, -/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_GET_DSCP_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_CONN_ST }, -/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST } +const UINT8 bta_hh_st_connected[][BTA_HH_NUM_COLS] = { + /* Event Action Next state */ + /* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST }, + /* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_INT_OPEN_EVT */ {BTA_HH_OPEN_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_CLOSE_ACT, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_DATA_EVT */ {BTA_HH_DATA_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_INT_CTRL_DATA */ {BTA_HH_CTRL_DAT_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_HANDSK_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST }, + /* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_WRITE_DEV_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_GET_DSCP_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_CONN_ST }, + /* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_CONN_ST } #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) -/* BTA_HH_GATT_CLOSE_EVT */ ,{BTA_HH_GATT_CLOSE, BTA_HH_IDLE_ST } -/* BTA_HH_GATT_OPEN_EVT */ ,{BTA_HH_IGNORE, BTA_HH_CONN_ST } -/* BTA_HH_START_ENC_EVT */ ,{BTA_HH_IGNORE, BTA_HH_CONN_ST } -/* BTA_HH_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_CONN_ST } -/* READ_CHAR_CMPL_EVT */ ,{BTA_HH_LE_READ_CHAR, BTA_HH_CONN_ST } -/* WRITE_CHAR_CMPL_EVT*/ ,{BTA_HH_LE_WRITE, BTA_HH_CONN_ST } -/* READ_DESCR_CMPL_EVT */ ,{BTA_HH_LE_READ_DESCR, BTA_HH_CONN_ST } /* do not currently read any descr when connection up */ -/* WRITE_DESCR_CMPL_EVT */ ,{BTA_HH_WRITE_DESCR, BTA_HH_CONN_ST } /* do not currently write any descr when connection up */ -/* SCPP_UPDATE_EVT */ ,{BTA_HH_LE_UPDATE_SCPP, BTA_HH_CONN_ST } -/* BTA_HH_GATT_ENC_CMPL_EVT */ ,{BTA_HH_IGNORE, BTA_HH_CONN_ST } + /* BTA_HH_GATT_CLOSE_EVT */ , {BTA_HH_GATT_CLOSE, BTA_HH_IDLE_ST } + /* BTA_HH_GATT_OPEN_EVT */ , {BTA_HH_IGNORE, BTA_HH_CONN_ST } + /* BTA_HH_START_ENC_EVT */ , {BTA_HH_IGNORE, BTA_HH_CONN_ST } + /* BTA_HH_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_CONN_ST } + /* READ_CHAR_CMPL_EVT */ , {BTA_HH_LE_READ_CHAR, BTA_HH_CONN_ST } + /* WRITE_CHAR_CMPL_EVT*/ , {BTA_HH_LE_WRITE, BTA_HH_CONN_ST } + /* READ_DESCR_CMPL_EVT */ , {BTA_HH_LE_READ_DESCR, BTA_HH_CONN_ST } /* do not currently read any descr when connection up */ + /* WRITE_DESCR_CMPL_EVT */ , {BTA_HH_WRITE_DESCR, BTA_HH_CONN_ST } /* do not currently write any descr when connection up */ + /* SCPP_UPDATE_EVT */ , {BTA_HH_LE_UPDATE_SCPP, BTA_HH_CONN_ST } + /* BTA_HH_GATT_ENC_CMPL_EVT */ , {BTA_HH_IGNORE, BTA_HH_CONN_ST } #endif }; #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) -const UINT8 bta_hh_st_w4_sec[][BTA_HH_NUM_COLS] = -{ -/* Event Action Next state */ -/* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_W4_SEC }, -/* BTA_HH_INT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST }, -/* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE , BTA_HH_W4_SEC }, -/* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_W4_SEC }, -/* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_GATT_CLOSE_EVT */ {BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST }, -/* BTA_HH_GATT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_START_ENC_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_ENC_CMPL_EVT */ {BTA_HH_SEC_CMPL, BTA_HH_W4_CONN_ST }, -/* READ_CHAR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* BTA_HH_GATT_WRITE_CMPL_EVT*/ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* READ_DESCR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, -/* WRITE_DESCR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC } -/* SCPP_UPDATE_EVT */ ,{BTA_HH_IGNORE, BTA_HH_W4_SEC } -/* BTA_HH_GATT_ENC_CMPL_EVT */ ,{BTA_HH_GATT_ENC_CMPL, BTA_HH_W4_SEC } +const UINT8 bta_hh_st_w4_sec[][BTA_HH_NUM_COLS] = { + /* Event Action Next state */ + /* BTA_HH_API_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_API_CLOSE_EVT */ {BTA_HH_API_DISC_ACT, BTA_HH_W4_SEC }, + /* BTA_HH_INT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_INT_CLOSE_EVT */ {BTA_HH_OPEN_FAILURE, BTA_HH_IDLE_ST }, + /* BTA_HH_INT_DATA_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_INT_CTRL_DATA */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_INT_HANDSK_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_SDP_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_API_WRITE_DEV_EVT */ {BTA_HH_IGNORE , BTA_HH_W4_SEC }, + /* BTA_HH_API_GET_DSCP_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_API_MAINT_DEV_EVT */ {BTA_HH_MAINT_DEV_ACT, BTA_HH_W4_SEC }, + /* BTA_HH_OPEN_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_GATT_CLOSE_EVT */ {BTA_HH_LE_OPEN_FAIL, BTA_HH_IDLE_ST }, + /* BTA_HH_GATT_OPEN_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_START_ENC_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_ENC_CMPL_EVT */ {BTA_HH_SEC_CMPL, BTA_HH_W4_CONN_ST }, + /* READ_CHAR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* BTA_HH_GATT_WRITE_CMPL_EVT*/ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* READ_DESCR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC }, + /* WRITE_DESCR_CMPL_EVT */ {BTA_HH_IGNORE, BTA_HH_W4_SEC } + /* SCPP_UPDATE_EVT */ , {BTA_HH_IGNORE, BTA_HH_W4_SEC } + /* BTA_HH_GATT_ENC_CMPL_EVT */ , {BTA_HH_GATT_ENC_CMPL, BTA_HH_W4_SEC } }; #endif @@ -238,13 +232,12 @@ const UINT8 bta_hh_st_w4_sec[][BTA_HH_NUM_COLS] = typedef const UINT8 (*tBTA_HH_ST_TBL)[BTA_HH_NUM_COLS]; /* state table */ -const tBTA_HH_ST_TBL bta_hh_st_tbl[] = -{ +const tBTA_HH_ST_TBL bta_hh_st_tbl[] = { bta_hh_st_idle, bta_hh_st_w4_conn, bta_hh_st_connected #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE) - ,bta_hh_st_w4_sec + , bta_hh_st_w4_sec #endif }; @@ -272,7 +265,7 @@ static char *bta_hh_state_code(tBTA_HH_STATE state_code); ** Returns void ** *******************************************************************************/ -void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA * p_data) +void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA *p_data) { tBTA_HH_ST_TBL state_table; UINT8 action; @@ -286,13 +279,10 @@ void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA * p_data memset(&cback_data, 0, sizeof(tBTA_HH)); /* handle exception, no valid control block was found */ - if (!p_cb) - { + if (!p_cb) { /* BTA HH enabled already? otherwise ignore the event although it's bad*/ - if (bta_hh_cb.p_cback != NULL) - { - switch (event) - { + if (bta_hh_cb.p_cback != NULL) { + switch (event) { /* no control block available for new connection */ case BTA_HH_API_OPEN_EVT: cback_event = BTA_HH_OPEN_EVT; @@ -305,47 +295,38 @@ void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA * p_data case BTA_HH_API_MAINT_DEV_EVT: cback_event = p_data->api_maintdev.sub_event; - if (p_data->api_maintdev.sub_event == BTA_HH_ADD_DEV_EVT) - { + if (p_data->api_maintdev.sub_event == BTA_HH_ADD_DEV_EVT) { bdcpy(cback_data.dev_info.bda, p_data->api_maintdev.bda); cback_data.dev_info.status = BTA_HH_ERR_DB_FULL; cback_data.dev_info.handle = BTA_HH_INVALID_HANDLE; - } - else - { + } else { cback_data.dev_info.status = BTA_HH_ERR_HDL; cback_data.dev_info.handle = (UINT8)p_data->api_maintdev.hdr.layer_specific; } break; case BTA_HH_API_WRITE_DEV_EVT: cback_event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) + - BTA_HH_FST_TRANS_CB_EVT; - if (p_data->api_sndcmd.p_data != NULL) - { + BTA_HH_FST_TRANS_CB_EVT; + if (p_data->api_sndcmd.p_data != NULL) { GKI_freebuf(p_data->api_sndcmd.p_data); } if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL || - p_data->api_sndcmd.t_type == HID_TRANS_SET_REPORT || - p_data->api_sndcmd.t_type == HID_TRANS_SET_IDLE) - { + p_data->api_sndcmd.t_type == HID_TRANS_SET_REPORT || + p_data->api_sndcmd.t_type == HID_TRANS_SET_IDLE) { cback_data.dev_status.status = BTA_HH_ERR_HDL; cback_data.dev_status.handle = (UINT8)p_data->api_sndcmd.hdr.layer_specific; - } - else if (p_data->api_sndcmd.t_type != HID_TRANS_DATA && - p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) - { + } else if (p_data->api_sndcmd.t_type != HID_TRANS_DATA && + p_data->api_sndcmd.t_type != HID_TRANS_CONTROL) { cback_data.hs_data.handle = (UINT8)p_data->api_sndcmd.hdr.layer_specific; cback_data.hs_data.status = BTA_HH_ERR_HDL; /* hs_data.rsp_data will be all zero, which is not valid value */ - } - else if (p_data->api_sndcmd.t_type == HID_TRANS_CONTROL && - p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) - { + } else if (p_data->api_sndcmd.t_type == HID_TRANS_CONTROL && + p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG) { cback_data.status = BTA_HH_ERR_HDL; cback_event = BTA_HH_VC_UNPLUG_EVT; - } - else + } else { cback_event = 0; + } break; case BTA_HH_API_CLOSE_EVT: @@ -359,31 +340,29 @@ void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA * p_data /* invalid handle, call bad API event */ APPL_TRACE_ERROR("wrong device handle: [%d]", p_data->hdr.layer_specific); /* Free the callback buffer now */ - if (p_data != NULL && p_data->hid_cback.p_data != NULL) - { + if (p_data != NULL && p_data->hid_cback.p_data != NULL) { GKI_freebuf(p_data->hid_cback.p_data); p_data->hid_cback.p_data = NULL; } break; } - if (cback_event) - (* bta_hh_cb.p_cback)(cback_event, &cback_data); + if (cback_event) { + (* bta_hh_cb.p_cback)(cback_event, &cback_data); + } } } /* corresponding CB is found, go to state machine */ - else - { + else { #if BTA_HH_DEBUG == TRUE in_state = p_cb->state; APPL_TRACE_EVENT("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]", - in_state, bta_hh_state_code(in_state), - bta_hh_evt_code(debug_event)); + in_state, bta_hh_state_code(in_state), + bta_hh_evt_code(debug_event)); #endif - if ((p_cb->state == BTA_HH_NULL_ST) || (p_cb->state >= BTA_HH_INVALID_ST)) - { + if ((p_cb->state == BTA_HH_NULL_ST) || (p_cb->state >= BTA_HH_INVALID_ST)) { APPL_TRACE_ERROR("bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d", - p_cb->state,event); + p_cb->state, event); return; } state_table = bta_hh_st_tbl[p_cb->state - 1]; @@ -392,18 +371,16 @@ void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA * p_data p_cb->state = state_table[event][BTA_HH_NEXT_STATE] ; - if ((action = state_table[event][BTA_HH_ACTION]) != BTA_HH_IGNORE) - { + if ((action = state_table[event][BTA_HH_ACTION]) != BTA_HH_IGNORE) { (*bta_hh_action[action])(p_cb, p_data); } #if BTA_HH_DEBUG == TRUE - if (in_state != p_cb->state) - { + if (in_state != p_cb->state) { APPL_TRACE_DEBUG("HH State Change: [%s] -> [%s] after Event [%s]", - bta_hh_state_code(in_state), - bta_hh_state_code(p_cb->state), - bta_hh_evt_code(debug_event)); + bta_hh_state_code(in_state), + bta_hh_state_code(p_cb->state), + bta_hh_evt_code(debug_event)); } #endif } @@ -425,65 +402,57 @@ BOOLEAN bta_hh_hdl_event(BT_HDR *p_msg) UINT8 index = BTA_HH_IDX_INVALID; tBTA_HH_DEV_CB *p_cb = NULL; - switch (p_msg->event) - { - case BTA_HH_API_ENABLE_EVT: - bta_hh_api_enable((tBTA_HH_DATA *) p_msg); - break; + switch (p_msg->event) { + case BTA_HH_API_ENABLE_EVT: + bta_hh_api_enable((tBTA_HH_DATA *) p_msg); + break; - case BTA_HH_API_DISABLE_EVT: - bta_hh_api_disable(); - break; + case BTA_HH_API_DISABLE_EVT: + bta_hh_api_disable(); + break; - case BTA_HH_DISC_CMPL_EVT: /* disable complete */ - bta_hh_disc_cmpl(); - break; + case BTA_HH_DISC_CMPL_EVT: /* disable complete */ + bta_hh_disc_cmpl(); + break; - default: - /* all events processed in state machine need to find corresponding - CB before proceed */ - if (p_msg->event == BTA_HH_API_OPEN_EVT) - { - index = bta_hh_find_cb(((tBTA_HH_API_CONN *)p_msg)->bd_addr); - } - else if (p_msg->event == BTA_HH_API_MAINT_DEV_EVT) - { - /* if add device */ - if (((tBTA_HH_MAINT_DEV *)p_msg)->sub_event == BTA_HH_ADD_DEV_EVT) - { - index = bta_hh_find_cb(((tBTA_HH_MAINT_DEV *)p_msg)->bda); - } - else /* else remove device by handle */ - { - index = bta_hh_dev_handle_to_cb_idx((UINT8)p_msg->layer_specific); -// btla-specific ++ - /* If BT disable is done while the HID device is connected and Link_Key uses unauthenticated combination - * then we can get into a situation where remove_bonding is called with the index set to 0 (without getting - * cleaned up). Only when VIRTUAL_UNPLUG is called do we cleanup the index and make it MAX_KNOWN. - * So if REMOVE_DEVICE is called and in_use is FALSE then we should treat this as a NULL p_cb. Hence we - * force the index to be IDX_INVALID - */ - if ((index != BTA_HH_IDX_INVALID) && - (bta_hh_cb.kdev[index].in_use == FALSE)) { - index = BTA_HH_IDX_INVALID; - } -// btla-specific -- - } - } - else if (p_msg->event == BTA_HH_INT_OPEN_EVT) - { - index = bta_hh_find_cb(((tBTA_HH_CBACK_DATA *)p_msg)->addr); - } - else + default: + /* all events processed in state machine need to find corresponding + CB before proceed */ + if (p_msg->event == BTA_HH_API_OPEN_EVT) { + index = bta_hh_find_cb(((tBTA_HH_API_CONN *)p_msg)->bd_addr); + } else if (p_msg->event == BTA_HH_API_MAINT_DEV_EVT) { + /* if add device */ + if (((tBTA_HH_MAINT_DEV *)p_msg)->sub_event == BTA_HH_ADD_DEV_EVT) { + index = bta_hh_find_cb(((tBTA_HH_MAINT_DEV *)p_msg)->bda); + } else { /* else remove device by handle */ index = bta_hh_dev_handle_to_cb_idx((UINT8)p_msg->layer_specific); +// btla-specific ++ + /* If BT disable is done while the HID device is connected and Link_Key uses unauthenticated combination + * then we can get into a situation where remove_bonding is called with the index set to 0 (without getting + * cleaned up). Only when VIRTUAL_UNPLUG is called do we cleanup the index and make it MAX_KNOWN. + * So if REMOVE_DEVICE is called and in_use is FALSE then we should treat this as a NULL p_cb. Hence we + * force the index to be IDX_INVALID + */ + if ((index != BTA_HH_IDX_INVALID) && + (bta_hh_cb.kdev[index].in_use == FALSE)) { + index = BTA_HH_IDX_INVALID; + } +// btla-specific -- + } + } else if (p_msg->event == BTA_HH_INT_OPEN_EVT) { + index = bta_hh_find_cb(((tBTA_HH_CBACK_DATA *)p_msg)->addr); + } else { + index = bta_hh_dev_handle_to_cb_idx((UINT8)p_msg->layer_specific); + } - if (index != BTA_HH_IDX_INVALID) - p_cb = &bta_hh_cb.kdev[index]; + if (index != BTA_HH_IDX_INVALID) { + p_cb = &bta_hh_cb.kdev[index]; + } #if BTA_HH_DEBUG - APPL_TRACE_DEBUG("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index); + APPL_TRACE_DEBUG("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index); #endif - bta_hh_sm_execute(p_cb, p_msg->event, (tBTA_HH_DATA *) p_msg); + bta_hh_sm_execute(p_cb, p_msg->event, (tBTA_HH_DATA *) p_msg); } return (TRUE); } @@ -503,8 +472,7 @@ BOOLEAN bta_hh_hdl_event(BT_HDR *p_msg) *******************************************************************************/ static char *bta_hh_evt_code(tBTA_HH_INT_EVT evt_code) { - switch(evt_code) - { + switch (evt_code) { case BTA_HH_API_DISABLE_EVT: return "BTA_HH_API_DISABLE_EVT"; case BTA_HH_API_ENABLE_EVT: @@ -569,8 +537,7 @@ static char *bta_hh_evt_code(tBTA_HH_INT_EVT evt_code) *******************************************************************************/ static char *bta_hh_state_code(tBTA_HH_STATE state_code) { - switch (state_code) - { + switch (state_code) { case BTA_HH_NULL_ST: return"BTA_HH_NULL_ST"; case BTA_HH_IDLE_ST: diff --git a/components/bt/bluedroid/bta/hh/bta_hh_utils.c b/components/bt/bluedroid/bta/hh/bta_hh_utils.c index dc20a0d4a..d90f516e5 100644 --- a/components/bt/bluedroid/bta/hh/bta_hh_utils.c +++ b/components/bt/bluedroid/bta/hh/bta_hh_utils.c @@ -41,8 +41,7 @@ #define BTA_HH_MAX_RPT_CHARS 8 -static const UINT8 bta_hh_mod_key_mask[BTA_HH_MOD_MAX_KEY] = -{ +static const UINT8 bta_hh_mod_key_mask[BTA_HH_MOD_MAX_KEY] = { BTA_HH_KB_CTRL_MASK, BTA_HH_KB_SHIFT_MASK, BTA_HH_KB_ALT_MASK, @@ -65,32 +64,28 @@ UINT8 bta_hh_find_cb(BD_ADDR bda) UINT8 xx; /* See how many active devices there are. */ - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) - { + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { /* check if any active/known devices is a match */ if ((!bdcmp (bda, bta_hh_cb.kdev[xx].addr) && - bdcmp(bda, bd_addr_null) != 0) ) - { + bdcmp(bda, bd_addr_null) != 0) ) { #if BTA_HH_DEBUG APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx, - bta_hh_cb.kdev[xx].hid_handle) + bta_hh_cb.kdev[xx].hid_handle) #endif return xx; } #if BTA_HH_DEBUG else APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]", - bta_hh_cb.kdev[xx].in_use, xx, - bta_hh_cb.kdev[xx].hid_handle, - bta_hh_cb.kdev[xx].state); + bta_hh_cb.kdev[xx].in_use, xx, + bta_hh_cb.kdev[xx].hid_handle, + bta_hh_cb.kdev[xx].state); #endif } /* if no active device match, find a spot for it */ - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) - { - if (!bta_hh_cb.kdev[xx].in_use) - { + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { + if (!bta_hh_cb.kdev[xx].in_use) { bdcpy(bta_hh_cb.kdev[xx].addr, bda); break; } @@ -98,11 +93,12 @@ UINT8 bta_hh_find_cb(BD_ADDR bda) /* If device list full, report BTA_HH_IDX_INVALID */ #if BTA_HH_DEBUG APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d", - xx, BTA_HH_MAX_DEVICE); + xx, BTA_HH_MAX_DEVICE); #endif - if (xx == BTA_HH_MAX_DEVICE) + if (xx == BTA_HH_MAX_DEVICE) { xx = BTA_HH_IDX_INVALID; + } return xx; } @@ -121,12 +117,11 @@ void bta_hh_clean_up_kdev(tBTA_HH_DEV_CB *p_cb) { UINT8 index; - if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE ) - { + if (p_cb->hid_handle != BTA_HH_INVALID_HANDLE ) { #if BTA_HH_LE_INCLUDED == TRUE - if (p_cb->is_le_device) + if (p_cb->is_le_device) { bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = BTA_HH_IDX_INVALID; - else + } else #endif bta_hh_cb.cb_index[p_cb->hid_handle] = BTA_HH_IDX_INVALID; } @@ -158,7 +153,7 @@ void bta_hh_update_di_info(tBTA_HH_DEV_CB *p_cb, UINT16 vendor_id, UINT16 produc { #if BTA_HH_DEBUG APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x", - vendor_id, product_id, version); + vendor_id, product_id, version); #endif p_cb->dscp_info.vendor_id = vendor_id; p_cb->dscp_info.product_id = product_id; @@ -201,17 +196,15 @@ void bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, UINT8 handle, p_cb->dscp_info.ssr_min_tout = ssr_min_tout; /* store report descriptor info */ - if ( p_dscp_info) - { + if ( p_dscp_info) { utl_freebuf((void **)&p_cb->dscp_info.descriptor.dsc_list); if (p_dscp_info->dl_len && - (p_cb->dscp_info.descriptor.dsc_list = - (UINT8 *)GKI_getbuf(p_dscp_info->dl_len)) != NULL) - { + (p_cb->dscp_info.descriptor.dsc_list = + (UINT8 *)GKI_getbuf(p_dscp_info->dl_len)) != NULL) { p_cb->dscp_info.descriptor.dl_len = p_dscp_info->dl_len; memcpy(p_cb->dscp_info.descriptor.dsc_list, p_dscp_info->dsc_list, - p_dscp_info->dl_len); + p_dscp_info->dl_len); } } return; @@ -226,15 +219,13 @@ void bta_hh_add_device_to_list(tBTA_HH_DEV_CB *p_cb, UINT8 handle, ** Returns ** *******************************************************************************/ -BOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb,UINT8 sub_class) +BOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb, UINT8 sub_class) { UINT8 xx; UINT8 cod = (sub_class >> 2); /* lower two bits are reserved */ - for (xx = 0 ; xx < p_bta_hh_cfg->max_devt_spt; xx ++) - { - if (cod == (UINT8) p_bta_hh_cfg->p_devt_list[xx].tod) - { + for (xx = 0 ; xx < p_bta_hh_cfg->max_devt_spt; xx ++) { + if (cod == (UINT8) p_bta_hh_cfg->p_devt_list[xx].tod) { p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id; #if BTA_HH_DEBUG APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class); @@ -243,7 +234,7 @@ BOOLEAN bta_hh_tod_spt(tBTA_HH_DEV_CB *p_cb,UINT8 sub_class) } } #if BTA_HH_DEBUG - APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); + APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class); #endif return FALSE; } @@ -270,32 +261,30 @@ void bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, UINT8 *p_report, #if BTA_HH_DEBUG APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt: (report=%p, report_len=%d) called", - p_report, report_len); + p_report, report_len); #endif - if (report_len < 2) + if (report_len < 2) { return; + } ctl_shift = *p_report++; report_len--; - if (report_len > BTA_HH_MAX_RPT_CHARS) + if (report_len > BTA_HH_MAX_RPT_CHARS) { report_len = BTA_HH_MAX_RPT_CHARS; + } memset (this_report, 0, BTA_HH_MAX_RPT_CHARS); memset (p_data, 0, sizeof(tBTA_HH_KEYBD_RPT)); memcpy (this_report, p_report, report_len); /* Take care of shift, control, GUI and alt, modifier keys */ - for (xx = 0; xx < BTA_HH_MOD_MAX_KEY; xx ++ ) - { - if (ctl_shift & bta_hh_mod_key_mask[xx]) - { + for (xx = 0; xx < BTA_HH_MOD_MAX_KEY; xx ++ ) { + if (ctl_shift & bta_hh_mod_key_mask[xx]) { APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] ); p_kb->mod_key[xx] = TRUE; - } - else if (p_kb->mod_key[xx]) - { + } else if (p_kb->mod_key[xx]) { p_kb->mod_key[xx] = FALSE; } /* control key flag is set */ @@ -305,12 +294,9 @@ void bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, UINT8 *p_report, /***************************************************************************/ /* First step is to remove all characters we saw in the last report */ /***************************************************************************/ - for (xx = 0; xx < report_len; xx++) - { - for (yy = 0; yy < BTA_HH_MAX_RPT_CHARS; yy++) - { - if (this_report[xx] == p_kb->last_report[yy]) - { + for (xx = 0; xx < report_len; xx++) { + for (yy = 0; yy < BTA_HH_MAX_RPT_CHARS; yy++) { + if (this_report[xx] == p_kb->last_report[yy]) { this_report[xx] = 0; } } @@ -318,20 +304,21 @@ void bta_hh_parse_keybd_rpt(tBTA_HH_BOOT_RPT *p_kb_data, UINT8 *p_report, /***************************************************************************/ /* Now, process all the characters in the report, up to 6 keycodes */ /***************************************************************************/ - for (xx = 0; xx < report_len; xx++) - { + for (xx = 0; xx < report_len; xx++) { #if BTA_HH_DEBUG APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]); #endif - if ((this_char = this_report[xx]) == 0) + if ((this_char = this_report[xx]) == 0) { continue; + } /* take the key code as the report data */ - if (this_report[xx] == BTA_HH_KB_CAPS_LOCK) + if (this_report[xx] == BTA_HH_KB_CAPS_LOCK) { p_kb->caps_lock = p_kb->caps_lock ? FALSE : TRUE; - else if (this_report[xx] == BTA_HH_KB_NUM_LOCK) + } else if (this_report[xx] == BTA_HH_KB_NUM_LOCK) { p_kb->num_lock = p_kb->num_lock ? FALSE : TRUE; - else + } else { p_data->this_char[key_idx ++] = this_char; + } #if BTA_HH_DEBUG APPL_TRACE_DEBUG("found keycode %02x ", this_report[xx]); @@ -366,15 +353,16 @@ void bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT *p_mice_data, UINT8 *p_report, report_len=%d) called", p_report, report_len); #endif - if (report_len < 3) + if (report_len < 3) { return; + } - if (report_len > BTA_HH_MAX_RPT_CHARS) + if (report_len > BTA_HH_MAX_RPT_CHARS) { report_len = BTA_HH_MAX_RPT_CHARS; + } #if BTA_HH_DEBUG - for (xx = 0; xx < report_len; xx++) - { + for (xx = 0; xx < report_len; xx++) { APPL_TRACE_DEBUG("this_char = %02x", p_report[xx]); } #endif @@ -391,7 +379,7 @@ void bta_hh_parse_mice_rpt(tBTA_HH_BOOT_RPT *p_mice_data, UINT8 *p_report, #if BTA_HH_DEBUG APPL_TRACE_DEBUG("mice button: 0x%2x", p_data->mouse_button); APPL_TRACE_DEBUG("mice move: x = %d y = %d", p_data->delta_x, - p_data->delta_y ); + p_data->delta_y ); #endif return; @@ -413,15 +401,12 @@ tBTA_HH_STATUS bta_hh_read_ssr_param(BD_ADDR bd_addr, UINT16 *p_max_ssr_lat, UIN tBTA_HH_CB *p_cb = &bta_hh_cb; UINT8 i; UINT16 ssr_max_latency; - for (i = 0; i < BTA_HH_MAX_KNOWN; i ++) - { - if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0) - { + for (i = 0; i < BTA_HH_MAX_KNOWN; i ++) { + if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0) { /* if remote device does not have HIDSSRHostMaxLatency attribute in SDP, set SSR max latency default value here. */ - if (p_cb->kdev[i].dscp_info.ssr_max_latency == HID_SSR_PARAM_INVALID) - { + if (p_cb->kdev[i].dscp_info.ssr_max_latency == HID_SSR_PARAM_INVALID) { /* The default is calculated as half of link supervision timeout.*/ BTM_GetLinkSuperTout(p_cb->kdev[i].addr, &ssr_max_latency) ; @@ -429,18 +414,20 @@ tBTA_HH_STATUS bta_hh_read_ssr_param(BD_ADDR bd_addr, UINT16 *p_max_ssr_lat, UIN /* per 1.1 spec, if the newly calculated max latency is greater than BTA_HH_SSR_MAX_LATENCY_DEF which is 500ms, use BTA_HH_SSR_MAX_LATENCY_DEF */ - if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF) + if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF) { ssr_max_latency = BTA_HH_SSR_MAX_LATENCY_DEF; + } * p_max_ssr_lat = ssr_max_latency; - } - else + } else { * p_max_ssr_lat = p_cb->kdev[i].dscp_info.ssr_max_latency; + } - if (p_cb->kdev[i].dscp_info.ssr_min_tout == HID_SSR_PARAM_INVALID) + if (p_cb->kdev[i].dscp_info.ssr_min_tout == HID_SSR_PARAM_INVALID) { * p_min_ssr_tout = BTA_HH_SSR_MIN_TOUT_DEF; - else + } else { * p_min_ssr_tout = p_cb->kdev[i].dscp_info.ssr_min_tout; + } status = BTA_HH_OK; @@ -465,8 +452,7 @@ void bta_hh_cleanup_disable(tBTA_HH_STATUS status) { UINT8 xx; /* free buffer in CB holding report descriptors */ - for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) - { + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++) { utl_freebuf((void **)&bta_hh_cb.kdev[xx].dscp_info.descriptor.dsc_list); } utl_freebuf((void **)&bta_hh_cb.p_disc_db); @@ -491,19 +477,19 @@ UINT8 bta_hh_dev_handle_to_cb_idx(UINT8 dev_handle) UINT8 index = BTA_HH_IDX_INVALID; #if BTA_HH_LE_INCLUDED == TRUE - if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) - { - if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) + if (BTA_HH_IS_LE_DEV_HDL(dev_handle)) { + if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle)) { index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)]; + } #if BTA_HH_DEBUG == TRUE APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index); #endif - } - else + } else #endif /* regular HID device checking */ - if (dev_handle < BTA_HH_MAX_KNOWN ) - index = bta_hh_cb.cb_index[dev_handle]; + if (dev_handle < BTA_HH_MAX_KNOWN ) { + index = bta_hh_cb.cb_index[dev_handle]; + } return index; @@ -524,14 +510,13 @@ void bta_hh_trace_dev_db(void) APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************"); - for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) - { - APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ",xx, - bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); + for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++) { + APPL_TRACE_DEBUG("kdev[%d] in_use[%d] handle[%d] ", xx, + bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle); APPL_TRACE_DEBUG("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d", - bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, - bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); + bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state, + bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index); } APPL_TRACE_DEBUG("*********************************************************"); } diff --git a/components/bt/bluedroid/bta/include/bta_api.h b/components/bt/bluedroid/bta/include/bta_api.h old mode 100755 new mode 100644 index ea39475e1..9b8a40599 --- a/components/bt/bluedroid/bta/include/bta_api.h +++ b/components/bt/bluedroid/bta/include/bta_api.h @@ -157,12 +157,11 @@ typedef UINT8 tBTA_SERVICE_ID; typedef UINT32 tBTA_SERVICE_MASK; /* extended service mask, including mask with one or more GATT UUID */ -typedef struct -{ +typedef struct { tBTA_SERVICE_MASK srvc_mask; UINT8 num_uuid; tBT_UUID *p_uuid; -}tBTA_SERVICE_MASK_EXT; +} tBTA_SERVICE_MASK_EXT; /* Security Setting Mask */ #define BTA_SEC_NONE BTM_SEC_NONE /* No security. */ @@ -253,8 +252,7 @@ typedef UINT8 tBTA_AUTH_RESP; typedef UINT8 tBTA_PREF_ROLES; -enum -{ +enum { BTA_DM_NO_SCATTERNET, /* Device doesn't support scatternet, it might support "role switch during connection" for @@ -270,23 +268,20 @@ enum /* Inquiry filter device class condition */ -typedef struct -{ +typedef struct { DEV_CLASS dev_class; /* device class of interest */ DEV_CLASS dev_class_mask; /* mask to determine the bits of device class of interest */ } tBTA_DM_COD_COND; /* Inquiry Filter Condition */ -typedef union -{ +typedef union { BD_ADDR bd_addr; /* BD address of device to filter. */ tBTA_DM_COD_COND dev_class_cond; /* Device class filter condition */ } tBTA_DM_INQ_COND; /* Inquiry Parameters */ -typedef struct -{ +typedef struct { tBTA_DM_INQ_MODE mode; /* Inquiry mode, limited or general. */ UINT8 duration; /* Inquiry duration in 1.28 sec units. */ UINT8 max_resps; /* Maximum inquiry responses. Set to zero for unlimited responses. */ @@ -298,8 +293,7 @@ typedef struct #endif } tBTA_DM_INQ; -typedef struct -{ +typedef struct { UINT8 bta_dm_eir_min_name_len; /* minimum length of local name when it is shortened */ #if (BTA_EIR_CANNED_UUID_LIST == TRUE) UINT8 bta_dm_eir_uuid16_len; /* length of 16-bit UUIDs */ @@ -347,54 +341,47 @@ typedef struct typedef tBTM_BLE_AD_MASK tBTA_BLE_AD_MASK; /* slave preferred connection interval range */ -typedef struct -{ +typedef struct { UINT16 low; UINT16 hi; -}tBTA_BLE_INT_RANGE; +} tBTA_BLE_INT_RANGE; /* Service tag supported in the device */ -typedef struct -{ +typedef struct { UINT8 num_service; BOOLEAN list_cmpl; UINT16 *p_uuid; -}tBTA_BLE_SERVICE; +} tBTA_BLE_SERVICE; -typedef struct -{ +typedef struct { UINT8 len; UINT8 *p_val; -}tBTA_BLE_MANU; +} tBTA_BLE_MANU; -typedef struct -{ +typedef struct { UINT8 adv_type; UINT8 len; UINT8 *p_val; /* number of len byte */ -}tBTA_BLE_PROP_ELEM; +} tBTA_BLE_PROP_ELEM; /* vendor proprietary adv type */ -typedef struct -{ +typedef struct { UINT8 num_elem; tBTA_BLE_PROP_ELEM *p_elem; -}tBTA_BLE_PROPRIETARY; +} tBTA_BLE_PROPRIETARY; -typedef struct -{ +typedef struct { tBT_UUID service_uuid; UINT8 len; UINT8 *p_val; -}tBTA_BLE_SERVICE_DATA; +} tBTA_BLE_SERVICE_DATA; typedef tBTM_BLE_128SERVICE tBTA_BLE_128SERVICE; typedef tBTM_BLE_32SERVICE tBTA_BLE_32SERVICE; -typedef struct -{ +typedef struct { tBTA_BLE_INT_RANGE int_range; /* slave prefered conn interval range */ tBTA_BLE_MANU *p_manu; /* manufacturer data */ tBTA_BLE_SERVICE *p_services; /* 16 bits services */ @@ -408,7 +395,7 @@ typedef struct UINT16 appearance; /* appearance data */ UINT8 flag; UINT8 tx_power; -}tBTA_BLE_ADV_DATA; +} tBTA_BLE_ADV_DATA; typedef void (tBTA_SET_ADV_DATA_CMPL_CBACK) (tBTA_STATUS status); @@ -437,21 +424,19 @@ typedef UINT8 tBTA_BLE_ADV_EVT; typedef UINT8 tBTA_BLE_ADV_TX_POWER; /* advertising instance parameters */ -typedef struct -{ +typedef struct { UINT16 adv_int_min; /* minimum adv interval */ UINT16 adv_int_max; /* maximum adv interval */ tBTA_BLE_ADV_EVT adv_type; /* adv event type */ tBTA_BLE_ADV_CHNL_MAP channel_map; /* adv channel map */ tBTA_BLE_AFP adv_filter_policy; /* advertising filter policy */ tBTA_BLE_ADV_TX_POWER tx_power; /* adv tx power */ -}tBTA_BLE_ADV_PARAMS; +} tBTA_BLE_ADV_PARAMS; /* These are the fields returned in each device adv packet. It ** is returned in the results callback if registered. */ -typedef struct -{ +typedef struct { UINT8 conn_mode; tBTA_BLE_AD_MASK ad_mask; /* mask of the valid adv data field */ UINT8 flag; @@ -461,30 +446,26 @@ typedef struct tBTA_BLE_SERVICE service; } tBTA_BLE_INQ_DATA; -enum -{ +enum { BTA_BLE_BATCH_SCAN_MODE_PASS = 1, BTA_BLE_BATCH_SCAN_MODE_ACTI = 2, BTA_BLE_BATCH_SCAN_MODE_PASS_ACTI = 3 }; typedef UINT8 tBTA_BLE_BATCH_SCAN_MODE; -enum -{ - BTA_BLE_DISCARD_OLD_ITEMS=0, - BTA_BLE_DISCARD_LOWER_RSSI_ITEMS=1 +enum { + BTA_BLE_DISCARD_OLD_ITEMS = 0, + BTA_BLE_DISCARD_LOWER_RSSI_ITEMS = 1 }; typedef UINT8 tBTA_BLE_DISCARD_RULE; -enum -{ - BTA_BLE_ADV_SEEN_FIRST_TIME=0, - BTA_BLE_ADV_TRACKING_TIMEOUT=1 +enum { + BTA_BLE_ADV_SEEN_FIRST_TIME = 0, + BTA_BLE_ADV_TRACKING_TIMEOUT = 1 }; typedef UINT8 tBTA_BLE_ADV_CHANGE_REASON; -enum -{ +enum { BTA_BLE_BATCH_SCAN_ENB_EVT = 1, BTA_BLE_BATCH_SCAN_CFG_STRG_EVT = 2, BTA_BLE_BATCH_SCAN_DATA_EVT = 3, @@ -523,8 +504,7 @@ typedef void (tBTA_DM_BLE_RSSI_CBACK) (BD_ADDR bd_addr, tBTA_DM_BLE_RSSI_ALERT_T #define BTA_DM_BLE_PF_LOGIC_AND 1 typedef UINT8 tBTA_DM_BLE_PF_LOGIC_TYPE; -enum -{ +enum { BTA_DM_BLE_SCAN_COND_ADD, BTA_DM_BLE_SCAN_COND_DELETE, BTA_DM_BLE_SCAN_COND_CLEAR = 2 @@ -532,8 +512,7 @@ enum typedef UINT8 tBTA_DM_BLE_SCAN_COND_OP; /* ADV payload filtering vendor specific call event */ -enum -{ +enum { BTA_BLE_SCAN_PF_ENABLE_EVT = 7, BTA_BLE_SCAN_PF_COND_EVT }; @@ -550,55 +529,49 @@ enum #define BTA_DM_BLE_PF_TYPE_MAX BTM_BLE_PF_TYPE_MAX typedef UINT8 tBTA_DM_BLE_PF_COND_TYPE; -typedef union -{ - UINT16 uuid16_mask; - UINT32 uuid32_mask; - UINT8 uuid128_mask[LEN_UUID_128]; -}tBTA_DM_BLE_PF_COND_MASK; +typedef union { + UINT16 uuid16_mask; + UINT32 uuid32_mask; + UINT8 uuid128_mask[LEN_UUID_128]; +} tBTA_DM_BLE_PF_COND_MASK; -typedef struct -{ +typedef struct { tBLE_BD_ADDR *p_target_addr; /* target address, if NULL, generic UUID filter */ tBT_UUID uuid; /* UUID condition */ tBTA_DM_BLE_PF_LOGIC_TYPE cond_logic; /* AND/OR */ tBTA_DM_BLE_PF_COND_MASK *p_uuid_mask; /* UUID condition mask, if NULL, match exact as UUID condition */ -}tBTA_DM_BLE_PF_UUID_COND; +} tBTA_DM_BLE_PF_UUID_COND; -typedef struct -{ +typedef struct { UINT8 data_len; /* <= 20 bytes */ UINT8 *p_data; -}tBTA_DM_BLE_PF_LOCAL_NAME_COND; +} tBTA_DM_BLE_PF_LOCAL_NAME_COND; -typedef struct -{ +typedef struct { UINT16 company_id; /* company ID */ UINT8 data_len; /* <= 20 bytes */ UINT8 *p_pattern; UINT16 company_id_mask; /* UUID value mask */ UINT8 *p_pattern_mask; /* Manufacturer data matching mask, same length as data pattern, set to all 0xff, match exact data */ -}tBTA_DM_BLE_PF_MANU_COND; +} tBTA_DM_BLE_PF_MANU_COND; -typedef struct -{ +typedef struct { UINT16 uuid; /* service ID */ UINT8 data_len; /* <= 20 bytes */ UINT8 *p_pattern; UINT8 *p_pattern_mask; /* Service data matching mask, same length as data pattern, set to all 0xff, match exact data */ -}tBTA_DM_BLE_PF_SRVC_PATTERN_COND; +} tBTA_DM_BLE_PF_SRVC_PATTERN_COND; -typedef union -{ +typedef union { tBLE_BD_ADDR target_addr; tBTA_DM_BLE_PF_LOCAL_NAME_COND local_name; /* lcoal name filtering */ tBTA_DM_BLE_PF_MANU_COND manu_data; /* manufactuer data filtering */ tBTA_DM_BLE_PF_UUID_COND srvc_uuid; /* service UUID filtering */ tBTA_DM_BLE_PF_UUID_COND solicitate_uuid; /* solicitated service UUID filtering */ tBTA_DM_BLE_PF_SRVC_PATTERN_COND srvc_data; /* service data pattern */ -}tBTA_DM_BLE_PF_COND_PARAM; +} tBTA_DM_BLE_PF_COND_PARAM; typedef UINT8 tBTA_DM_BLE_PF_FILT_INDEX; typedef UINT8 tBTA_DM_BLE_PF_AVBL_SPACE; @@ -645,14 +618,12 @@ typedef UINT8 tBTA_SIG_STRENGTH_MASK; typedef UINT8 tBTA_DM_SEC_EVT; /* Structure associated with BTA_DM_ENABLE_EVT */ -typedef struct -{ +typedef struct { tBTA_STATUS status; } tBTA_DM_ENABLE; /* Structure associated with BTA_DM_PIN_REQ_EVT */ -typedef struct -{ +typedef struct { /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */ BD_ADDR bd_addr; /* BD address peer device. */ DEV_CLASS dev_class; /* Class of Device */ @@ -710,26 +681,24 @@ typedef tBTM_LE_LENC_KEYS tBTA_LE_LENC_KEYS ; typedef tBTM_LE_LCSRK_KEYS tBTA_LE_LCSRK_KEYS ; typedef tBTM_LE_PID_KEYS tBTA_LE_PID_KEYS ; -typedef union -{ +typedef union { tBTA_LE_PENC_KEYS penc_key; /* received peer encryption key */ tBTA_LE_PCSRK_KEYS psrk_key; /* received peer device SRK */ tBTA_LE_PID_KEYS pid_key; /* peer device ID key */ tBTA_LE_LENC_KEYS lenc_key; /* local encryption reproduction keys LTK = = d1(ER,DIV,0)*/ tBTA_LE_LCSRK_KEYS lcsrk_key; /* local device CSRK = d1(ER,DIV,1)*/ tBTA_LE_PID_KEYS lid_key; /* local device ID key for the particular remote */ -}tBTA_LE_KEY_VALUE; +} tBTA_LE_KEY_VALUE; #define BTA_BLE_LOCAL_KEY_TYPE_ID 1 #define BTA_BLE_LOCAL_KEY_TYPE_ER 2 typedef UINT8 tBTA_DM_BLE_LOCAL_KEY_MASK; -typedef struct -{ +typedef struct { BT_OCTET16 ir; BT_OCTET16 irk; BT_OCTET16 dhk; -}tBTA_BLE_LOCAL_ID_KEYS; +} tBTA_BLE_LOCAL_ID_KEYS; #define BTA_DM_SEC_GRANTED BTA_SUCCESS #define BTA_DM_SEC_PAIR_NOT_SPT BTA_DM_AUTH_SMP_PAIR_NOT_SUPPORT @@ -745,22 +714,19 @@ typedef UINT8 tBTA_DM_BLE_CONN_TYPE; typedef BOOLEAN (tBTA_DM_BLE_SEL_CBACK)(BD_ADDR random_bda, UINT8 *p_remote_name); /* Structure associated with BTA_DM_BLE_SEC_REQ_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ BD_NAME bd_name; /* peer device name */ } tBTA_DM_BLE_SEC_REQ; -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ tBTM_LE_KEY_TYPE key_type; tBTM_LE_KEY_VALUE *p_key_value; -}tBTA_DM_BLE_KEY; +} tBTA_DM_BLE_KEY; /* Structure associated with BTA_DM_AUTH_CMPL_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ BD_NAME bd_name; /* Name of peer device. */ BOOLEAN key_present; /* Valid link key value in key element */ @@ -774,8 +740,7 @@ typedef struct /* Structure associated with BTA_DM_AUTHORIZE_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ BD_NAME bd_name; /* Name of peer device. */ tBTA_SERVICE_ID service; /* Service ID to authorize. */ @@ -785,8 +750,7 @@ typedef struct } tBTA_DM_AUTHORIZE; /* Structure associated with BTA_DM_LINK_UP_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ #if BLE_INCLUDED == TRUE tBTA_TRANSPORT link_type; @@ -794,8 +758,7 @@ typedef struct } tBTA_DM_LINK_UP; /* Structure associated with BTA_DM_LINK_DOWN_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ UINT8 status; /* connection open/closed */ BOOLEAN is_removed; /* TRUE if device is removed when link is down */ @@ -805,15 +768,13 @@ typedef struct } tBTA_DM_LINK_DOWN; /* Structure associated with BTA_DM_ROLE_CHG_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ UINT8 new_role; /* the new connection role */ } tBTA_DM_ROLE_CHG; /* Structure associated with BTA_DM_BUSY_LEVEL_EVT */ -typedef struct -{ +typedef struct { UINT8 level; /* when paging or inquiring, level is 10. Otherwise, the number of ACL links */ UINT8 level_flags; /* indicates individual flags */ @@ -864,8 +825,7 @@ typedef tBTM_LE_AUTH_REQ tBTA_LE_AUTH_REQ; /* combination of the abo typedef tBTM_OOB_DATA tBTA_OOB_DATA; /* Structure associated with BTA_DM_SP_CFM_REQ_EVT */ -typedef struct -{ +typedef struct { /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */ BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ @@ -878,8 +838,7 @@ typedef struct tBTA_AUTH_REQ rmt_io_caps; /* IO Capabilities of remote device */ } tBTA_DM_SP_CFM_REQ; -enum -{ +enum { BTA_SP_KEY_STARTED, /* passkey entry started */ BTA_SP_KEY_ENTERED, /* passkey digit entered */ BTA_SP_KEY_ERASED, /* passkey digit erased */ @@ -889,15 +848,13 @@ enum typedef UINT8 tBTA_SP_KEY_TYPE; /* Structure associated with BTA_DM_SP_KEYPRESS_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ tBTA_SP_KEY_TYPE notif_type; -}tBTA_DM_SP_KEY_PRESS; +} tBTA_DM_SP_KEY_PRESS; /* Structure associated with BTA_DM_SP_KEY_NOTIF_EVT */ -typedef struct -{ +typedef struct { /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */ BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ @@ -906,8 +863,7 @@ typedef struct } tBTA_DM_SP_KEY_NOTIF; /* Structure associated with BTA_DM_SP_RMT_OOB_EVT */ -typedef struct -{ +typedef struct { /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */ BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ @@ -915,14 +871,12 @@ typedef struct } tBTA_DM_SP_RMT_OOB; /* Structure associated with BTA_DM_BOND_CANCEL_CMPL_EVT */ -typedef struct -{ +typedef struct { tBTA_STATUS result; /* TRUE of bond cancel succeeded, FALSE if failed. */ } tBTA_DM_BOND_CANCEL_CMPL; /* Union of all security callback structures */ - typedef union -{ +typedef union { tBTA_DM_ENABLE enable; /* BTA enabled */ tBTA_DM_PIN_REQ pin_req; /* PIN request. */ tBTA_DM_AUTH_CMPL auth_cmpl; /* Authentication complete indication. */ @@ -970,16 +924,16 @@ typedef UINT8 tBTA_DM_BLE_PF_ACTION; /* Config callback */ typedef void (tBTA_DM_BLE_PF_CFG_CBACK) (tBTA_DM_BLE_PF_ACTION action, - tBTA_DM_BLE_PF_COND_TYPE cfg_cond, - tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_PF_COND_TYPE cfg_cond, + tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status, + tBTA_DM_BLE_REF_VALUE ref_value); /* Param callback */ typedef void (tBTA_DM_BLE_PF_PARAM_CBACK) (UINT8 action_type, tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, - tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status); + tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status); /* Status callback */ typedef void (tBTA_DM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTA_STATUS status, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_REF_VALUE ref_value); #define BTA_DM_BLE_PF_BRDCAST_ADDR_FILT 1 @@ -1005,8 +959,7 @@ typedef UINT16 tBTA_DM_BLE_PF_TIMEOUT; typedef UINT8 tBTA_DM_BLE_PF_TIMEOUT_CNT; typedef UINT16 tBTA_DM_BLE_PF_ADV_TRACK_ENTRIES; -typedef struct -{ +typedef struct { tBTA_DM_BLE_PF_FEAT_SEL feat_seln; tBTA_DM_BLE_PF_LIST_LOGIC_TYPE list_logic_type; tBTA_DM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type; @@ -1033,12 +986,11 @@ typedef UINT8 tBTA_DM_SEARCH_EVT; #define BTA_DM_INQ_RES_IGNORE_RSSI BTM_INQ_RES_IGNORE_RSSI /* 0x7f RSSI value not supplied (ignore it) */ /* Structure associated with BTA_DM_INQ_RES_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ DEV_CLASS dev_class; /* Device class of peer device. */ BOOLEAN remt_name_not_required; /* Application sets this flag if it already knows the name of the device */ - /* If the device name is known to application BTA skips the remote name request */ + /* If the device name is known to application BTA skips the remote name request */ BOOLEAN is_limited; /* TRUE, if the limited inquiry bit is set in the CoD */ INT8 rssi; /* The rssi value */ UINT8 *p_eir; /* received EIR */ @@ -1053,27 +1005,24 @@ typedef struct } tBTA_DM_INQ_RES; /* Structure associated with BTA_DM_INQ_CMPL_EVT */ -typedef struct -{ +typedef struct { UINT8 num_resps; /* Number of inquiry responses. */ } tBTA_DM_INQ_CMPL; /* Structure associated with BTA_DM_DI_DISC_CMPL_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ UINT8 num_record; /* Number of DI record */ tBTA_STATUS result; } tBTA_DM_DI_DISC_CMPL; /* Structure associated with BTA_DM_DISC_RES_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ BD_NAME bd_name; /* Name of peer device. */ tBTA_SERVICE_MASK services; /* Services found on peer device. */ // btla-specific ++ - UINT8 * p_raw_data; /* Raw data for discovery DB */ + UINT8 *p_raw_data; /* Raw data for discovery DB */ UINT32 raw_data_size; /* size of raw data */ tBT_DEVICE_TYPE device_type; /* device type in case it is BLE device */ UINT32 num_uuids; @@ -1083,8 +1032,7 @@ typedef struct } tBTA_DM_DISC_RES; /* Structure associated with tBTA_DM_DISC_BLE_RES */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* BD address peer device. */ BD_NAME bd_name; /* Name of peer device. */ tBT_UUID service; /* GATT based Services UUID found on peer device. */ @@ -1092,8 +1040,7 @@ typedef struct /* Union of all search callback structures */ -typedef union -{ +typedef union { tBTA_DM_INQ_RES inq_res; /* Inquiry result for a peer device. */ tBTA_DM_INQ_CMPL inq_cmpl; /* Inquiry complete. */ tBTA_DM_DISC_RES disc_res; /* Discovery result for a peer device. */ @@ -1106,7 +1053,7 @@ typedef union typedef void (tBTA_DM_SEARCH_CBACK)(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data); /* Execute call back */ -typedef void (tBTA_DM_EXEC_CBACK) (void * p_param); +typedef void (tBTA_DM_EXEC_CBACK) (void *p_param); /* Encryption callback*/ typedef void (tBTA_DM_ENCRYPT_CBACK) (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result); @@ -1141,24 +1088,24 @@ typedef void (tBTA_BLE_SCAN_THRESHOLD_CBACK)(tBTA_DM_BLE_REF_VALUE ref_value); typedef void (tBTA_BLE_SCAN_REP_CBACK) (tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format, UINT8 num_records, UINT16 data_len, - UINT8* p_rep_data, tBTA_STATUS status); + UINT8 *p_rep_data, tBTA_STATUS status); typedef void (tBTA_BLE_SCAN_SETUP_CBACK) (tBTA_BLE_BATCH_SCAN_EVT evt, - tBTA_DM_BLE_REF_VALUE ref_value, - tBTA_STATUS status); + tBTA_DM_BLE_REF_VALUE ref_value, + tBTA_STATUS status); typedef void (tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status, - tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, + tBTA_DM_BLE_REF_VALUE ref_value); typedef void (tBTA_BLE_TRACK_ADV_CBACK)(tBTA_DM_BLE_TRACK_ADV_DATA *p_adv_data); typedef void (tBTA_BLE_ENERGY_INFO_CBACK)(tBTA_DM_BLE_TX_TIME_MS tx_time, - tBTA_DM_BLE_RX_TIME_MS rx_time, - tBTA_DM_BLE_IDLE_TIME_MS idle_time, - tBTA_DM_BLE_ENERGY_USED energy_used, - tBTA_DM_CONTRL_STATE ctrl_state, - tBTA_STATUS status); + tBTA_DM_BLE_RX_TIME_MS rx_time, + tBTA_DM_BLE_IDLE_TIME_MS idle_time, + tBTA_DM_BLE_ENERGY_USED energy_used, + tBTA_DM_CONTRL_STATE ctrl_state, + tBTA_STATUS status); #else typedef UINT8 tBTA_DM_BLE_SEC_ACT; @@ -1674,7 +1621,7 @@ extern UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr ); ** *******************************************************************************/ extern tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info, - UINT32 *p_handle ); + UINT32 *p_handle ); /******************************************************************************* ** @@ -1705,7 +1652,7 @@ extern void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT t ** Returns void ** *******************************************************************************/ -extern void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param); +extern void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK *p_callback, void *p_param); #if (BTM_SCO_HCI_INCLUDED == TRUE) /******************************************************************************* @@ -1918,8 +1865,8 @@ extern void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval, ** *******************************************************************************/ extern void BTA_DmSetBleScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, - UINT32 scan_window, tBLE_SCAN_MODE scan_mode, UINT8 scan_fil_poilcy, - UINT8 addr_type_own, tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback); + UINT32 scan_window, tBLE_SCAN_MODE scan_mode, UINT8 scan_fil_poilcy, + UINT8 addr_type_own, tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback); /******************************************************************************* @@ -1941,9 +1888,9 @@ extern void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max, tBLE_BD_ADDR *p_dir_bda); extern void BTA_DmSetBleAdvParamsAll (UINT16 adv_int_min, UINT16 adv_int_max, - UINT8 adv_type, tBLE_ADDR_TYPE addr_type_own, - tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP adv_fil_pol, - tBLE_BD_ADDR *p_dir_bda); + UINT8 adv_type, tBLE_ADDR_TYPE addr_type_own, + tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP adv_fil_pol, + tBLE_BD_ADDR *p_dir_bda); /******************************************************************************* @@ -2145,7 +2092,7 @@ extern void BTA_DmBleBroadcast (BOOLEAN start); ** *******************************************************************************/ extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params, - tBTA_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref); + tBTA_BLE_MULTI_ADV_CBACK *p_cback, void *p_ref); /******************************************************************************* ** @@ -2160,7 +2107,7 @@ extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params, ** *******************************************************************************/ extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id, - tBTA_BLE_ADV_PARAMS *p_params); + tBTA_BLE_ADV_PARAMS *p_params); /******************************************************************************* ** @@ -2175,7 +2122,7 @@ extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id, ** *******************************************************************************/ extern void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, - tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data); + tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data); /******************************************************************************* ** @@ -2206,7 +2153,7 @@ extern void BTA_BleDisableAdvInstance(UINT8 inst_id); ** *******************************************************************************/ extern void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, - UINT16 max_int, UINT16 latency, UINT16 timeout); + UINT16 max_int, UINT16 latency, UINT16 timeout); /******************************************************************************* ** @@ -2238,12 +2185,12 @@ extern void BTA_DmBleSetDataLength(BD_ADDR remote_device, UINT16 tx_data_length) ** *******************************************************************************/ extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max, - UINT8 batch_scan_trunc_max, - UINT8 batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, - tBTA_DM_BLE_REF_VALUE ref_value); + UINT8 batch_scan_trunc_max, + UINT8 batch_scan_notify_threshold, + tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback, + tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, + tBTA_BLE_SCAN_REP_CBACK *p_rep_cback, + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -2262,10 +2209,10 @@ extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max, ** *******************************************************************************/ extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - UINT32 scan_interval, UINT32 scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTA_DM_BLE_REF_VALUE ref_value); + UINT32 scan_interval, UINT32 scan_window, + tBTA_BLE_DISCARD_RULE discard_rule, + tBLE_ADDR_TYPE addr_type, + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -2280,7 +2227,7 @@ extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, ** *******************************************************************************/ extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -2309,8 +2256,8 @@ extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value); ** *******************************************************************************/ extern void BTA_DmEnableScanFilter(UINT8 action, - tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback, + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -2329,11 +2276,11 @@ extern void BTA_DmEnableScanFilter(UINT8 action, ** *******************************************************************************/ extern void BTA_DmBleScanFilterSetup(UINT8 action, - tBTA_DM_BLE_PF_FILT_INDEX filt_index, - tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params, - tBLE_BD_ADDR *p_target, - tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_PF_FILT_INDEX filt_index, + tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params, + tBLE_BD_ADDR *p_target, + tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback, + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -2353,11 +2300,11 @@ extern void BTA_DmBleScanFilterSetup(UINT8 action, ** *******************************************************************************/ extern void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, - tBTA_DM_BLE_PF_COND_TYPE cond_type, - tBTA_DM_BLE_PF_FILT_INDEX filt_index, - tBTA_DM_BLE_PF_COND_PARAM *p_cond, - tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback, - tBTA_DM_BLE_REF_VALUE ref_value); + tBTA_DM_BLE_PF_COND_TYPE cond_type, + tBTA_DM_BLE_PF_FILT_INDEX filt_index, + tBTA_DM_BLE_PF_COND_PARAM *p_cond, + tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback, + tBTA_DM_BLE_REF_VALUE ref_value); /******************************************************************************* @@ -2373,7 +2320,7 @@ extern void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value, - tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback); + tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_dm_ci.h b/components/bt/bluedroid/bta/include/bta_dm_ci.h old mode 100755 new mode 100644 index 5593b9ec4..9f8a87437 --- a/components/bt/bluedroid/bta/include/bta_dm_ci.h +++ b/components/bt/bluedroid/bta/include/bta_dm_ci.h @@ -46,7 +46,7 @@ extern "C" ** *******************************************************************************/ extern void bta_dm_ci_io_req(BD_ADDR bd_addr, tBTA_IO_CAP io_cap, - tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req); + tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_dm_co.h b/components/bt/bluedroid/bta/include/bta_dm_co.h old mode 100755 new mode 100644 index c00a59cf1..c32024967 --- a/components/bt/bluedroid/bta/include/bta_dm_co.h +++ b/components/bt/bluedroid/bta/include/bta_dm_co.h @@ -28,7 +28,7 @@ #ifndef BTA_SCO_OUT_PKT_SIZE - #define BTA_SCO_OUT_PKT_SIZE BTM_SCO_DATA_SIZE_MAX +#define BTA_SCO_OUT_PKT_SIZE BTM_SCO_DATA_SIZE_MAX #endif #define BTA_SCO_CODEC_PCM 0 /* used for regular SCO */ @@ -39,13 +39,12 @@ typedef UINT8 tBTA_SCO_CODEC_TYPE; #define BTA_DM_SCO_SAMP_RATE_16K 16000 /* SCO codec information */ -typedef struct -{ +typedef struct { tBTA_SCO_CODEC_TYPE codec_type; -}tBTA_CODEC_INFO; +} tBTA_CODEC_INFO; -#define BTA_DM_SCO_ROUTE_PCM BTM_SCO_ROUTE_PCM -#define BTA_DM_SCO_ROUTE_HCI BTM_SCO_ROUTE_HCI +#define BTA_DM_SCO_ROUTE_PCM BTM_SCO_ROUTE_PCM +#define BTA_DM_SCO_ROUTE_HCI BTM_SCO_ROUTE_HCI typedef tBTM_SCO_ROUTE_TYPE tBTA_DM_SCO_ROUTE_TYPE; @@ -152,7 +151,7 @@ extern void bta_dm_co_rmt_oob(BD_ADDR bd_addr); ** *******************************************************************************/ extern tBTA_DM_SCO_ROUTE_TYPE bta_dm_sco_co_init(UINT32 rx_bw, UINT32 tx_bw, - tBTA_CODEC_INFO *p_codec_info, UINT8 app_id); + tBTA_CODEC_INFO *p_codec_info, UINT8 app_id); /******************************************************************************* @@ -242,7 +241,7 @@ extern void bta_dm_co_ble_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, ** *******************************************************************************/ extern void bta_dm_co_ble_load_local_keys (tBTA_DM_BLE_LOCAL_KEY_MASK *p_key_mask, BT_OCTET16 er, - tBTA_BLE_LOCAL_ID_KEYS *p_id_keys); + tBTA_BLE_LOCAL_ID_KEYS *p_id_keys); // btla-specific ++ /******************************************************************************* diff --git a/components/bt/bluedroid/bta/include/bta_gatt_api.h b/components/bt/bluedroid/bta/include/bta_gatt_api.h old mode 100755 new mode 100644 index 668f23c16..446c4bb3a --- a/components/bt/bluedroid/bta/include/bta_gatt_api.h +++ b/components/bt/bluedroid/bta/include/bta_gatt_api.h @@ -50,8 +50,7 @@ ** Common Definitions ***************************/ /* GATT ID */ -typedef struct -{ +typedef struct { tBT_UUID uuid; /* uuid of the attribute */ UINT8 inst_id; /* instance ID */ } __attribute__((packed)) tBTA_GATT_ID; @@ -99,7 +98,7 @@ typedef struct #define BTA_GATT_ALREADY_OPEN 0x91 /* 0x91 */ #define BTA_GATT_CANCEL 0x92 /* 0x92 */ - /* 0xE0 ~ 0xFC reserved for future use */ +/* 0xE0 ~ 0xFC reserved for future use */ #define BTA_GATT_CCC_CFG_ERR GATT_CCC_CFG_ERR /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */ #define BTA_GATT_PRC_IN_PROGRESS GATT_PRC_IN_PROGRESS /* 0xFE Procedure Already in progress */ #define BTA_GATT_OUT_OF_RANGE GATT_OUT_OF_RANGE /* 0xFFAttribute value out of range */ @@ -150,14 +149,13 @@ typedef UINT8 tBTA_GATTC_EVT; typedef tGATT_IF tBTA_GATTC_IF; -typedef struct -{ +typedef struct { UINT16 unit; /* as UUIUD defined by SIG */ UINT16 descr; /* as UUID as defined by SIG */ tGATT_FORMAT format; INT8 exp; UINT8 name_spc; /* The name space of the description */ -}tBTA_GATT_CHAR_PRES; +} tBTA_GATT_CHAR_PRES; #define BTA_GATT_CLT_CONFIG_NONE GATT_CLT_CONFIG_NONE /* 0x0000 */ #define BTA_GATT_CLT_CONFIG_NOTIFICATION GATT_CLT_CONFIG_NOTIFICATION /* 0x0001 */ @@ -173,18 +171,16 @@ typedef UINT16 tBTA_GATT_SVR_CHAR_CONFIG; /* Characteristic Aggregate Format attribute value */ #define BTA_GATT_AGGR_HANDLE_NUM_MAX 10 -typedef struct -{ +typedef struct { UINT8 num_handle; UINT16 handle_list[BTA_GATT_AGGR_HANDLE_NUM_MAX]; } tBTA_GATT_CHAR_AGGRE; typedef tGATT_VALID_RANGE tBTA_GATT_VALID_RANGE; -typedef struct -{ +typedef struct { UINT16 len; UINT8 *p_value; -}tBTA_GATT_UNFMT; +} tBTA_GATT_UNFMT; #define BTA_GATT_MAX_ATTR_LEN GATT_MAX_ATTR_LEN @@ -203,53 +199,46 @@ typedef UINT8 tBTA_GATTC_WRITE_TYPE; #define BTA_GATT_CONN_NONE 0x0101 /* 0x0101 no connection to cancel */ typedef UINT16 tBTA_GATT_REASON; -typedef struct -{ +typedef struct { tBTA_GATT_ID id; BOOLEAN is_primary; -}tBTA_GATT_SRVC_ID; +} tBTA_GATT_SRVC_ID; -typedef struct -{ +typedef struct { tBTA_GATT_SRVC_ID srvc_id; tBTA_GATT_ID char_id; -}tBTA_GATTC_CHAR_ID; +} tBTA_GATTC_CHAR_ID; -typedef struct -{ +typedef struct { tBTA_GATTC_CHAR_ID char_id; tBTA_GATT_ID descr_id; -}tBTA_GATTC_CHAR_DESCR_ID; +} tBTA_GATTC_CHAR_DESCR_ID; -typedef struct -{ +typedef struct { tBTA_GATT_SRVC_ID srvc_id; tBTA_GATT_SRVC_ID incl_svc_id; -}tBTA_GATTC_INCL_SVC_ID; +} tBTA_GATTC_INCL_SVC_ID; #define BTA_GATT_TYPE_CHAR 0 #define BTA_GATT_TYPE_CHAR_DESCR 1 typedef UINT8 tBTA_GATT_ID_TYPE; -typedef struct -{ +typedef struct { tBTA_GATT_ID_TYPE id_type; - union - { + union { tBTA_GATTC_CHAR_ID char_id; tBTA_GATTC_CHAR_DESCR_ID char_descr_id; } id_value; -}tBTA_GATTC_ATTR_ID; +} tBTA_GATTC_ATTR_ID; #define BTA_GATTC_MULTI_MAX GATT_MAX_READ_MULTI_HANDLES -typedef struct -{ +typedef struct { UINT8 num_attr; tBTA_GATTC_ATTR_ID id_list[BTA_GATTC_MULTI_MAX]; -}tBTA_GATTC_MULTI; +} tBTA_GATTC_MULTI; #define BTA_GATT_AUTH_REQ_NONE GATT_AUTH_REQ_NONE #define BTA_GATT_AUTH_REQ_NO_MITM GATT_AUTH_REQ_NO_MITM /* unauthenticated encryption */ @@ -259,8 +248,7 @@ typedef struct typedef tGATT_AUTH_REQ tBTA_GATT_AUTH_REQ; -enum -{ +enum { BTA_GATTC_ATTR_TYPE_INCL_SRVC, BTA_GATTC_ATTR_TYPE_CHAR, BTA_GATTC_ATTR_TYPE_CHAR_DESCR, @@ -269,8 +257,7 @@ enum typedef UINT8 tBTA_GATTC_ATTR_TYPE; -typedef struct -{ +typedef struct { tBT_UUID uuid; UINT16 s_handle; UINT16 e_handle; /* used for service only */ @@ -278,96 +265,84 @@ typedef struct UINT8 id; UINT8 prop; /* used when attribute type is characteristic */ BOOLEAN is_primary; /* used when attribute type is service */ -}tBTA_GATTC_NV_ATTR; +} tBTA_GATTC_NV_ATTR; /* callback data structure */ -typedef struct -{ +typedef struct { tBTA_GATT_STATUS status; tBTA_GATTC_IF client_if; // btla-specific ++ tBT_UUID app_uuid; // btla-specific -- -}tBTA_GATTC_REG; +} tBTA_GATTC_REG; -typedef struct -{ +typedef struct { UINT8 num_pres_fmt; /* number of presentation format aggregated*/ tBTA_GATTC_CHAR_DESCR_ID pre_format[BTA_GATTC_MULTI_MAX]; -}tBTA_GATT_CHAR_AGGRE_VALUE; +} tBTA_GATT_CHAR_AGGRE_VALUE; -typedef union -{ +typedef union { tBTA_GATT_CHAR_AGGRE_VALUE aggre_value; tBTA_GATT_UNFMT unformat; -}tBTA_GATT_READ_VAL; +} tBTA_GATT_READ_VAL; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_STATUS status; tBTA_GATT_SRVC_ID srvc_id; tBTA_GATT_ID char_id; tBTA_GATT_ID descr_type; tBTA_GATT_READ_VAL *p_value; -}tBTA_GATTC_READ; +} tBTA_GATTC_READ; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_STATUS status; tBTA_GATT_SRVC_ID srvc_id; tBTA_GATT_ID char_id; tBTA_GATT_ID descr_type; -}tBTA_GATTC_WRITE; +} tBTA_GATTC_WRITE; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_STATUS status; -}tBTA_GATTC_EXEC_CMPL; +} tBTA_GATTC_EXEC_CMPL; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_STATUS status; -}tBTA_GATTC_SEARCH_CMPL; +} tBTA_GATTC_SEARCH_CMPL; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_SRVC_ID service_uuid; -}tBTA_GATTC_SRVC_RES; +} tBTA_GATTC_SRVC_RES; -typedef struct -{ +typedef struct { UINT16 conn_id; tBTA_GATT_STATUS status; UINT16 mtu; -}tBTA_GATTC_CFG_MTU; +} tBTA_GATTC_CFG_MTU; -typedef struct -{ +typedef struct { tBTA_GATT_STATUS status; UINT16 conn_id; tBTA_GATTC_IF client_if; BD_ADDR remote_bda; tBTA_TRANSPORT transport; UINT16 mtu; -}tBTA_GATTC_OPEN; +} tBTA_GATTC_OPEN; -typedef struct -{ +typedef struct { tBTA_GATT_STATUS status; UINT16 conn_id; tBTA_GATTC_IF client_if; BD_ADDR remote_bda; tBTA_GATT_REASON reason; /* disconnect reason code, not useful when connect event is reported */ -}tBTA_GATTC_CLOSE; +} tBTA_GATTC_CLOSE; -typedef struct -{ +typedef struct { UINT16 conn_id; BD_ADDR bda; tBTA_GATTC_CHAR_ID char_id; @@ -375,32 +350,28 @@ typedef struct UINT16 len; UINT8 value[BTA_GATT_MAX_ATTR_LEN]; BOOLEAN is_notify; -}tBTA_GATTC_NOTIFY; +} tBTA_GATTC_NOTIFY; -typedef struct -{ +typedef struct { UINT16 conn_id; BOOLEAN congested; /* congestion indicator */ -}tBTA_GATTC_CONGEST; +} tBTA_GATTC_CONGEST; // btla-specific ++ -typedef struct -{ +typedef struct { tBTA_GATT_STATUS status; tBTA_GATTC_IF client_if; UINT16 conn_id; BD_ADDR remote_bda; -}tBTA_GATTC_OPEN_CLOSE; +} tBTA_GATTC_OPEN_CLOSE; // btla-specific -- -typedef struct -{ +typedef struct { tBTA_GATTC_IF client_if; BD_ADDR remote_bda; -}tBTA_GATTC_ENC_CMPL_CB; +} tBTA_GATTC_ENC_CMPL_CB; -typedef union -{ +typedef union { tBTA_GATT_STATUS status; tBTA_GATTC_SEARCH_CMPL search_cmpl; /* discovery complete */ @@ -485,8 +456,7 @@ typedef UINT8 tBTA_GATT_CHAR_PROP; /*********************** NV callback Data Definitions ********************** */ -typedef struct -{ +typedef struct { tBT_UUID app_uuid128; tBT_UUID svc_uuid; UINT16 svc_inst; @@ -531,27 +501,24 @@ typedef tGATT_WRITE_REQ tBTA_GATT_WRITE_REQ; /* callback data for server access request from client */ typedef tGATTS_DATA tBTA_GATTS_REQ_DATA; -typedef struct -{ +typedef struct { tBTA_GATT_STATUS status; BD_ADDR remote_bda; UINT32 trans_id; UINT16 conn_id; tBTA_GATTS_REQ_DATA *p_data; -}tBTA_GATTS_REQ; +} tBTA_GATTS_REQ; -typedef struct -{ +typedef struct { tBTA_GATTS_IF server_if; tBTA_GATT_STATUS status; // btla-specific ++ tBT_UUID uuid; // btla-specific -- -}tBTA_GATTS_REG_OPER; +} tBTA_GATTS_REG_OPER; -typedef struct -{ +typedef struct { tBTA_GATTS_IF server_if; UINT16 service_id; // btla-specific ++ @@ -560,10 +527,9 @@ typedef struct tBTA_GATT_STATUS status; tBT_UUID uuid; // btla-specific -- -}tBTA_GATTS_CREATE; +} tBTA_GATTS_CREATE; -typedef struct -{ +typedef struct { tBTA_GATTS_IF server_if; UINT16 service_id; UINT16 attr_id; @@ -571,40 +537,35 @@ typedef struct // btla-specific ++ tBT_UUID char_uuid; // btla-specific -- -}tBTA_GATTS_ADD_RESULT; +} tBTA_GATTS_ADD_RESULT; -typedef struct -{ +typedef struct { tBTA_GATTS_IF server_if; UINT16 service_id; tBTA_GATT_STATUS status; -}tBTA_GATTS_SRVC_OPER; +} tBTA_GATTS_SRVC_OPER; -typedef struct -{ +typedef struct { tBTA_GATTS_IF server_if; BD_ADDR remote_bda; UINT16 conn_id; tBTA_GATT_REASON reason; /* report disconnect reason */ tBTA_GATT_TRANSPORT transport; -}tBTA_GATTS_CONN; +} tBTA_GATTS_CONN; -typedef struct -{ +typedef struct { UINT16 conn_id; BOOLEAN congested; /* report channel congestion indicator */ -}tBTA_GATTS_CONGEST; +} tBTA_GATTS_CONGEST; -typedef struct -{ +typedef struct { UINT16 conn_id; /* connection ID */ tBTA_GATT_STATUS status; /* notification/indication status */ -}tBTA_GATTS_CONF; +} tBTA_GATTS_CONF; /* GATTS callback data */ -typedef union -{ +typedef union { tBTA_GATTS_REG_OPER reg_oper; tBTA_GATTS_CREATE create; tBTA_GATTS_SRVC_OPER srvc_oper; @@ -616,7 +577,7 @@ typedef union tBTA_GATTS_CONN conn; /* BTA_GATTS_CONN_EVT */ tBTA_GATTS_CONGEST congest; /* BTA_GATTS_CONGEST_EVT callback data */ tBTA_GATTS_CONF confirm; /* BTA_GATTS_CONF_EVT callback data */ -}tBTA_GATTS; +} tBTA_GATTS; /* GATTS enable callback function */ typedef void (tBTA_GATTS_ENB_CBACK)(tBTA_GATT_STATUS status); @@ -762,10 +723,10 @@ extern void BTA_GATTC_ServiceSearchRequest(UINT16 conn_id, tBT_UUID *p_srvc_uuid ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstChar (UINT16 conn_id, - tBTA_GATT_SRVC_ID *p_srvc_id, - tBT_UUID *p_char_uuid_cond, - tBTA_GATTC_CHAR_ID *p_char_result, - tBTA_GATT_CHAR_PROP *p_property); + tBTA_GATT_SRVC_ID *p_srvc_id, + tBT_UUID *p_char_uuid_cond, + tBTA_GATTC_CHAR_ID *p_char_result, + tBTA_GATT_CHAR_PROP *p_property); /******************************************************************************* ** @@ -787,10 +748,10 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstChar (UINT16 conn_id, ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetNextChar (UINT16 conn_id, - tBTA_GATTC_CHAR_ID *p_start_char_id, - tBT_UUID *p_char_uuid_cond, - tBTA_GATTC_CHAR_ID *p_char_result, - tBTA_GATT_CHAR_PROP *p_property); + tBTA_GATTC_CHAR_ID *p_start_char_id, + tBT_UUID *p_char_uuid_cond, + tBTA_GATTC_CHAR_ID *p_char_result, + tBTA_GATT_CHAR_PROP *p_property); /******************************************************************************* ** @@ -810,8 +771,8 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetNextChar (UINT16 conn_id, ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char_id, - tBT_UUID *p_descr_uuid_cond, - tBTA_GATTC_CHAR_DESCR_ID *p_descr_result); + tBT_UUID *p_descr_uuid_cond, + tBTA_GATTC_CHAR_DESCR_ID *p_descr_result); /******************************************************************************* ** @@ -832,9 +793,9 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstCharDescr (UINT16 conn_id, tBTA_GATTC ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetNextCharDescr (UINT16 conn_id, - tBTA_GATTC_CHAR_DESCR_ID *p_start_descr_id, - tBT_UUID *p_descr_uuid_cond, - tBTA_GATTC_CHAR_DESCR_ID *p_descr_result); + tBTA_GATTC_CHAR_DESCR_ID *p_start_descr_id, + tBT_UUID *p_descr_uuid_cond, + tBTA_GATTC_CHAR_DESCR_ID *p_descr_result); /******************************************************************************* @@ -855,9 +816,9 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetNextCharDescr (UINT16 conn_id, ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, - tBTA_GATT_SRVC_ID *p_srvc_id, - tBT_UUID *p_uuid_cond, - tBTA_GATTC_INCL_SVC_ID *p_result); + tBTA_GATT_SRVC_ID *p_srvc_id, + tBT_UUID *p_uuid_cond, + tBTA_GATTC_INCL_SVC_ID *p_result); /******************************************************************************* ** @@ -878,9 +839,9 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetFirstIncludedService(UINT16 conn_id, ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_GetNextIncludedService(UINT16 conn_id, - tBTA_GATTC_INCL_SVC_ID *p_start_id, - tBT_UUID *p_uuid_cond, - tBTA_GATTC_INCL_SVC_ID *p_result); + tBTA_GATTC_INCL_SVC_ID *p_start_id, + tBT_UUID *p_uuid_cond, + tBTA_GATTC_INCL_SVC_ID *p_result); /******************************************************************************* ** @@ -896,8 +857,8 @@ extern tBTA_GATT_STATUS BTA_GATTC_GetNextIncludedService(UINT16 conn_id, ** *******************************************************************************/ extern void BTA_GATTC_ReadCharacteristic (UINT16 conn_id, - tBTA_GATTC_CHAR_ID *p_char_id, - tBTA_GATT_AUTH_REQ auth_req); + tBTA_GATTC_CHAR_ID *p_char_id, + tBTA_GATT_AUTH_REQ auth_req); /******************************************************************************* ** @@ -985,8 +946,8 @@ extern void BTA_GATTC_SendIndConfirm (UINT16 conn_id, tBTA_GATTC_CHAR_ID *p_char ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF client_if, - BD_ADDR remote_bda, - tBTA_GATTC_CHAR_ID *p_char_id); + BD_ADDR remote_bda, + tBTA_GATTC_CHAR_ID *p_char_id); /******************************************************************************* @@ -1003,8 +964,8 @@ extern tBTA_GATT_STATUS BTA_GATTC_RegisterForNotifications (tBTA_GATTC_IF c ** *******************************************************************************/ extern tBTA_GATT_STATUS BTA_GATTC_DeregisterForNotifications (tBTA_GATTC_IF client_if, - BD_ADDR remote_bda, - tBTA_GATTC_CHAR_ID *p_char_id); + BD_ADDR remote_bda, + tBTA_GATTC_CHAR_ID *p_char_id); /******************************************************************************* ** @@ -1233,7 +1194,7 @@ extern void BTA_GATTS_AddIncludeService(UINT16 service_id, UINT16 included_servi ** *******************************************************************************/ extern void BTA_GATTS_AddCharacteristic (UINT16 service_id, tBT_UUID *p_char_uuid, - tBTA_GATT_PERM perm, tBTA_GATT_CHAR_PROP property); + tBTA_GATT_PERM perm, tBTA_GATT_CHAR_PROP property); /******************************************************************************* ** @@ -1253,8 +1214,8 @@ extern void BTA_GATTS_AddCharacteristic (UINT16 service_id, tBT_UUID *p_char_ ** *******************************************************************************/ extern void BTA_GATTS_AddCharDescriptor (UINT16 service_id, - tBTA_GATT_PERM perm, - tBT_UUID * p_descr_uuid); + tBTA_GATT_PERM perm, + tBT_UUID *p_descr_uuid); /******************************************************************************* ** @@ -1304,7 +1265,7 @@ extern void BTA_GATTS_StopService(UINT16 service_id); ** Description This function is called to read a characteristics descriptor. ** ** Parameters conn_id - connection identifier. -** attr_id - attribute ID to indicate. +** attr_id - attribute ID to indicate. ** data_len - indicate data length. ** p_data: data to indicate. ** need_confirm - if this indication expects a confirmation or not. @@ -1313,9 +1274,9 @@ extern void BTA_GATTS_StopService(UINT16 service_id); ** *******************************************************************************/ extern void BTA_GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_id, - UINT16 data_len, - UINT8 *p_data, - BOOLEAN need_confirm); + UINT16 data_len, + UINT8 *p_data, + BOOLEAN need_confirm); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_gattc_ci.h b/components/bt/bluedroid/bta/include/bta_gattc_ci.h old mode 100755 new mode 100644 index a64bf89b0..12b3a4217 --- a/components/bt/bluedroid/bta/include/bta_gattc_ci.h +++ b/components/bt/bluedroid/bta/include/bta_gattc_ci.h @@ -31,8 +31,7 @@ *****************************************************************************/ /* Open Complete Event */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_STATUS status; } tBTA_GATTC_CI_EVT; @@ -40,8 +39,7 @@ typedef struct #define BTA_GATTC_NV_LOAD_MAX 10 /* Read Ready Event */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_STATUS status; UINT16 num_attr; @@ -72,7 +70,7 @@ extern "C" ** *******************************************************************************/ extern void bta_gattc_ci_cache_open(BD_ADDR server_bda, UINT16 evt, - tBTA_GATT_STATUS status, UINT16 conn_id); + tBTA_GATT_STATUS status, UINT16 conn_id); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_gattc_co.h b/components/bt/bluedroid/bta/include/bta_gattc_co.h old mode 100755 new mode 100644 index b96ebf3b5..f84f9d354 --- a/components/bt/bluedroid/bta/include/bta_gattc_co.h +++ b/components/bt/bluedroid/bta/include/bta_gattc_co.h @@ -42,7 +42,7 @@ ** *******************************************************************************/ extern void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, - UINT16 conn_id, BOOLEAN to_save); + UINT16 conn_id, BOOLEAN to_save); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_gattc_int.h b/components/bt/bluedroid/bta/include/bta_gattc_int.h old mode 100755 new mode 100644 index aac408312..b915005ba --- a/components/bt/bluedroid/bta/include/bta_gattc_int.h +++ b/components/bt/bluedroid/bta/include/bta_gattc_int.h @@ -35,8 +35,7 @@ /***************************************************************************** ** Constants and data types *****************************************************************************/ -enum -{ +enum { BTA_GATTC_API_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_GATTC), BTA_GATTC_INT_OPEN_FAIL_EVT, BTA_GATTC_API_CANCEL_OPEN_EVT, @@ -89,31 +88,28 @@ typedef UINT16 tBTA_GATTC_INT_EVT; #define BTA_GATTC_CONN_MAX GATT_MAX_PHY_CHANNEL #ifndef BTA_GATTC_CLCB_MAX - #define BTA_GATTC_CLCB_MAX GATT_CL_MAX_LCB +#define BTA_GATTC_CLCB_MAX GATT_CL_MAX_LCB #endif #define BTA_GATTC_WRITE_PREPARE GATT_WRITE_PREPARE /* internal strucutre for GATTC register API */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBT_UUID app_uuid; tBTA_GATTC_CBACK *p_cback; -}tBTA_GATTC_API_REG; +} tBTA_GATTC_API_REG; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATTC_IF client_if; -}tBTA_GATTC_INT_START_IF; +} tBTA_GATTC_INT_START_IF; typedef tBTA_GATTC_INT_START_IF tBTA_GATTC_API_DEREG; typedef tBTA_GATTC_INT_START_IF tBTA_GATTC_INT_DEREG; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR remote_bda; tBTA_GATTC_IF client_if; @@ -123,8 +119,7 @@ typedef struct typedef tBTA_GATTC_API_OPEN tBTA_GATTC_API_CANCEL_OPEN; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_AUTH_REQ auth_req; tBTA_GATT_SRVC_ID srvc_id; @@ -132,8 +127,7 @@ typedef struct tBTA_GATT_ID *p_descr_type; } tBTA_GATTC_API_READ; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_AUTH_REQ auth_req; tBTA_GATT_SRVC_ID srvc_id; @@ -143,16 +137,14 @@ typedef struct UINT16 offset; UINT16 len; UINT8 *p_value; -}tBTA_GATTC_API_WRITE; +} tBTA_GATTC_API_WRITE; -typedef struct -{ +typedef struct { BT_HDR hdr; BOOLEAN is_execute; -}tBTA_GATTC_API_EXEC; +} tBTA_GATTC_API_EXEC; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_SRVC_ID srvc_id; tBTA_GATT_ID char_id; @@ -160,30 +152,26 @@ typedef struct typedef tGATT_CL_COMPLETE tBTA_GATTC_CMPL; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT8 op_code; tGATT_STATUS status; tBTA_GATTC_CMPL *p_cmpl; -}tBTA_GATTC_OP_CMPL; +} tBTA_GATTC_OP_CMPL; -typedef struct -{ +typedef struct { BT_HDR hdr; tBT_UUID *p_srvc_uuid; -}tBTA_GATTC_API_SEARCH; +} tBTA_GATTC_API_SEARCH; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_AUTH_REQ auth_req; UINT8 num_attr; tBTA_GATTC_ATTR_ID *p_id_list; -}tBTA_GATTC_API_READ_MULTI; +} tBTA_GATTC_API_READ_MULTI; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR_PTR remote_bda; tBTA_GATTC_IF client_if; @@ -191,31 +179,27 @@ typedef struct } tBTA_GATTC_API_LISTEN; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 mtu; -}tBTA_GATTC_API_CFG_MTU; +} tBTA_GATTC_API_CFG_MTU; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR remote_bda; tBTA_GATTC_IF client_if; UINT8 role; tBT_TRANSPORT transport; tGATT_DISCONN_REASON reason; -}tBTA_GATTC_INT_CONN; +} tBTA_GATTC_INT_CONN; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR remote_bda; tBTA_GATTC_IF client_if; -}tBTA_GATTC_ENC_CMPL; +} tBTA_GATTC_ENC_CMPL; -typedef union -{ +typedef union { BT_HDR hdr; tBTA_GATTC_API_REG api_reg; tBTA_GATTC_API_DEREG api_dereg; @@ -244,14 +228,12 @@ typedef union /* GATT server cache on the client */ -typedef union -{ +typedef union { UINT8 uuid128[LEN_UUID_128]; UINT16 uuid16; -}tBTA_GATTC_UUID; +} tBTA_GATTC_UUID; -typedef struct gattc_attr_cache -{ +typedef struct gattc_attr_cache { tBTA_GATTC_UUID *p_uuid; struct gattc_attr_cache *p_next; UINT16 uuid_len; @@ -265,8 +247,7 @@ typedef struct gattc_attr_cache } __attribute__((packed)) tBTA_GATTC_CACHE_ATTR; // btla-specific -- -typedef struct gattc_svc_cache -{ +typedef struct gattc_svc_cache { tBTA_GATT_SRVC_ID service_uuid; tBTA_GATTC_CACHE_ATTR *p_attr; tBTA_GATTC_CACHE_ATTR *p_last_attr; @@ -278,26 +259,24 @@ typedef struct gattc_svc_cache } __attribute__((packed)) tBTA_GATTC_CACHE; // btla-specific -- -typedef struct -{ +typedef struct { tBT_UUID uuid; UINT16 s_handle; UINT16 e_handle; BOOLEAN is_primary; UINT8 srvc_inst_id; tBTA_GATT_CHAR_PROP property; -}tBTA_GATTC_ATTR_REC; +} tBTA_GATTC_ATTR_REC; #define BTA_GATTC_MAX_CACHE_CHAR 40 #define BTA_GATTC_ATTR_LIST_SIZE (BTA_GATTC_MAX_CACHE_CHAR * sizeof(tBTA_GATTC_ATTR_REC)) #ifndef BTA_GATTC_CACHE_SRVR_SIZE - #define BTA_GATTC_CACHE_SRVR_SIZE 600 +#define BTA_GATTC_CACHE_SRVR_SIZE 600 #endif -enum -{ +enum { BTA_GATTC_IDLE_ST = 0, /* Idle */ BTA_GATTC_W4_CONN_ST, /* Wait for connection - (optional) */ BTA_GATTC_CONN_ST, /* connected state */ @@ -305,8 +284,7 @@ enum }; typedef UINT8 tBTA_GATTC_STATE; -typedef struct -{ +typedef struct { BOOLEAN in_use; BD_ADDR server_bda; BOOLEAN connected; @@ -345,15 +323,13 @@ typedef struct #define BTA_GATTC_NOTIF_REG_MAX 15 #endif -typedef struct -{ +typedef struct { BOOLEAN in_use; BD_ADDR remote_bda; tBTA_GATTC_CHAR_ID char_id; -}tBTA_GATTC_NOTIF_REG; +} tBTA_GATTC_NOTIF_REG; -typedef struct -{ +typedef struct { tBTA_GATTC_CBACK *p_cback; BOOLEAN in_use; tBTA_GATTC_IF client_if; /* client interface with BTE stack for this application */ @@ -361,11 +337,10 @@ typedef struct BOOLEAN dereg_pending; tBT_UUID app_uuid; tBTA_GATTC_NOTIF_REG notif_reg[BTA_GATTC_NOTIF_REG_MAX]; -}tBTA_GATTC_RCB; +} tBTA_GATTC_RCB; /* client channel is a mapping between a BTA client(cl_id) and a remote BD address */ -typedef struct -{ +typedef struct { UINT16 bta_conn_id; /* client channel ID, unique for clcb */ BD_ADDR bda; tBTA_TRANSPORT transport; /* channel transport */ @@ -394,31 +369,27 @@ typedef UINT16 tBTA_GATTC_CIF_MASK; typedef UINT32 tBTA_GATTC_CIF_MASK; #endif -typedef struct -{ +typedef struct { BOOLEAN in_use; BD_ADDR remote_bda; tBTA_GATTC_CIF_MASK cif_mask; tBTA_GATTC_CIF_MASK cif_adv_mask; -}tBTA_GATTC_BG_TCK; +} tBTA_GATTC_BG_TCK; -typedef struct -{ +typedef struct { BOOLEAN in_use; BD_ADDR remote_bda; -}tBTA_GATTC_CONN; +} tBTA_GATTC_CONN; -enum -{ - BTA_GATTC_STATE_DISABLED, - BTA_GATTC_STATE_ENABLING, - BTA_GATTC_STATE_ENABLED, - BTA_GATTC_STATE_DISABLING +enum { + BTA_GATTC_STATE_DISABLED, + BTA_GATTC_STATE_ENABLING, + BTA_GATTC_STATE_ENABLED, + BTA_GATTC_STATE_DISABLING }; -typedef struct -{ +typedef struct { UINT8 state; tBTA_GATTC_CONN conn_track[BTA_GATTC_CONN_MAX]; @@ -430,7 +401,7 @@ typedef struct tSDP_DISCOVERY_DB *p_sdp_db; UINT16 sdp_conn_id; -}tBTA_GATTC_CB; +} tBTA_GATTC_CB; /***************************************************************************** ** Global data @@ -454,8 +425,8 @@ extern BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_ extern void bta_gattc_disable(tBTA_GATTC_CB *p_cb); extern void bta_gattc_register(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data); extern void bta_gattc_start_if(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_data); -extern void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg); -extern void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg); +extern void bta_gattc_process_api_open (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); +extern void bta_gattc_process_api_open_cancel (tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); extern void bta_gattc_deregister(tBTA_GATTC_CB *p_cb, tBTA_GATTC_RCB *p_clreg); extern void bta_gattc_process_enc_cmpl(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); @@ -491,29 +462,29 @@ extern void bta_gattc_ci_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) extern void bta_gattc_ci_save(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); extern void bta_gattc_cache_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); extern void bta_gattc_ignore_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); -extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA * p_msg); +extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_msg); extern void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg); extern void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data); extern void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status, BD_ADDR remote_bda, UINT16 conn_id, tBTA_TRANSPORT transport, UINT16 mtu); -extern void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg); +extern void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); #if BLE_INCLUDED == TRUE -extern void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg); -extern void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg); +extern void bta_gattc_listen(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); +extern void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg); #endif /* utility functions */ -extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); -extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id); -extern tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); +extern tBTA_GATTC_CLCB *bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); +extern tBTA_GATTC_CLCB *bta_gattc_find_clcb_by_conn_id (UINT16 conn_id); +extern tBTA_GATTC_CLCB *bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); extern void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb); -extern tBTA_GATTC_CLCB * bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); -extern tBTA_GATTC_RCB * bta_gattc_cl_get_regcb(UINT8 client_if); -extern tBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda); -extern tBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda); -extern tBTA_GATTC_SERV * bta_gattc_find_scb_by_cid (UINT16 conn_id); -extern tBTA_GATTC_CLCB * bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg); -extern tBTA_GATTC_CLCB * bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA *p_msg); +extern tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport); +extern tBTA_GATTC_RCB *bta_gattc_cl_get_regcb(UINT8 client_if); +extern tBTA_GATTC_SERV *bta_gattc_find_srcb(BD_ADDR bda); +extern tBTA_GATTC_SERV *bta_gattc_srcb_alloc(BD_ADDR bda); +extern tBTA_GATTC_SERV *bta_gattc_find_scb_by_cid (UINT16 conn_id); +extern tBTA_GATTC_CLCB *bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA *p_msg); +extern tBTA_GATTC_CLCB *bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA *p_msg); extern BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data); @@ -527,7 +498,7 @@ extern BOOLEAN bta_gattc_mark_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR_PTR rem extern BOOLEAN bta_gattc_check_bg_conn (tBTA_GATTC_IF client_if, BD_ADDR remote_bda, UINT8 role); extern UINT8 bta_gattc_num_reg_app(void); extern void bta_gattc_clear_notif_registration(UINT16 conn_id); -extern tBTA_GATTC_SERV * bta_gattc_find_srvr_cache(BD_ADDR bda); +extern tBTA_GATTC_SERV *bta_gattc_find_srvr_cache(BD_ADDR bda); extern BOOLEAN bta_gattc_charid_compare(tBTA_GATTC_CHAR_ID *p_src, tBTA_GATTC_CHAR_ID *p_tar); extern BOOLEAN bta_gattc_srvcid_compare(tBTA_GATT_SRVC_ID *p_src, tBTA_GATT_SRVC_ID *p_tar); extern void bta_gattc_cpygattid(tBTA_GATT_ID *p_des, tBTA_GATT_ID *p_src); @@ -539,16 +510,16 @@ extern tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_ extern tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type); extern void bta_gattc_search_service(tBTA_GATTC_CLCB *p_clcb, tBT_UUID *p_uuid); extern tBTA_GATT_STATUS bta_gattc_query_cache(UINT16 conn_id, UINT8 query_type, tBTA_GATT_SRVC_ID *p_srvc_id, - tBTA_GATT_ID *p_start_rec,tBT_UUID *p_uuid_cond, - tBTA_GATT_ID *p_output, void *p_param); + tBTA_GATT_ID *p_start_rec, tBT_UUID *p_uuid_cond, + tBTA_GATT_ID *p_output, void *p_param); extern tBTA_GATT_STATUS bta_gattc_init_cache(tBTA_GATTC_SERV *p_srvc_cb); extern void bta_gattc_rebuild_cache(tBTA_GATTC_SERV *p_srcv, UINT16 num_attr, tBTA_GATTC_NV_ATTR *p_attr, UINT16 attr_index); extern BOOLEAN bta_gattc_cache_save(tBTA_GATTC_SERV *p_srvc_cb, UINT16 conn_id); -extern tBTA_GATTC_CONN * bta_gattc_conn_alloc(BD_ADDR remote_bda); -extern tBTA_GATTC_CONN * bta_gattc_conn_find(BD_ADDR remote_bda); -extern tBTA_GATTC_CONN * bta_gattc_conn_find_alloc(BD_ADDR remote_bda); +extern tBTA_GATTC_CONN *bta_gattc_conn_alloc(BD_ADDR remote_bda); +extern tBTA_GATTC_CONN *bta_gattc_conn_find(BD_ADDR remote_bda); +extern tBTA_GATTC_CONN *bta_gattc_conn_find_alloc(BD_ADDR remote_bda); extern BOOLEAN bta_gattc_conn_dealloc(BD_ADDR remote_bda); #endif /* BTA_GATTC_INT_H */ diff --git a/components/bt/bluedroid/bta/include/bta_gatts_co.h b/components/bt/bluedroid/bta/include/bta_gatts_co.h old mode 100755 new mode 100644 index b3ee99b0a..78e001b76 --- a/components/bt/bluedroid/bta/include/bta_gatts_co.h +++ b/components/bt/bluedroid/bta/include/bta_gatts_co.h @@ -75,7 +75,7 @@ extern BOOLEAN bta_gatts_co_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd, ** *******************************************************************************/ extern BOOLEAN bta_gatts_co_load_handle_range(UINT8 index, - tBTA_GATTS_HNDL_RANGE *p_handle); + tBTA_GATTS_HNDL_RANGE *p_handle); #endif /* BTA_GATTS_CO_H */ diff --git a/components/bt/bluedroid/bta/include/bta_gatts_int.h b/components/bt/bluedroid/bta/include/bta_gatts_int.h old mode 100755 new mode 100644 index 9a12dfd27..f934c4ac6 --- a/components/bt/bluedroid/bta/include/bta_gatts_int.h +++ b/components/bt/bluedroid/bta/include/bta_gatts_int.h @@ -34,8 +34,7 @@ /***************************************************************************** ** Constants and data types *****************************************************************************/ -enum -{ +enum { BTA_GATTS_API_REG_EVT = BTA_SYS_EVT_START(BTA_ID_GATTS), BTA_GATTS_INT_START_IF_EVT, BTA_GATTS_API_DEREG_EVT, @@ -64,23 +63,20 @@ typedef UINT16 tBTA_GATTS_INT_EVT; #define BTA_GATTS_MAX_SRVC_NUM GATT_MAX_SR_PROFILES /* internal strucutre for GATTC register API */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBT_UUID app_uuid; tBTA_GATTS_CBACK *p_cback; -}tBTA_GATTS_API_REG; +} tBTA_GATTS_API_REG; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATTS_IF server_if; -}tBTA_GATTS_INT_START_IF; +} tBTA_GATTS_INT_START_IF; typedef tBTA_GATTS_INT_START_IF tBTA_GATTS_API_DEREG; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATTS_IF server_if; tBT_UUID service_uuid; @@ -90,75 +86,66 @@ typedef struct } tBTA_GATTS_API_CREATE_SRVC; -typedef struct -{ +typedef struct { BT_HDR hdr; tBT_UUID char_uuid; tBTA_GATT_PERM perm; tBTA_GATT_CHAR_PROP property; -}tBTA_GATTS_API_ADD_CHAR; +} tBTA_GATTS_API_ADD_CHAR; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 included_service_id; -}tBTA_GATTS_API_ADD_INCL_SRVC; +} tBTA_GATTS_API_ADD_INCL_SRVC; -typedef struct -{ +typedef struct { BT_HDR hdr; tBT_UUID descr_uuid; tBTA_GATT_PERM perm; -}tBTA_GATTS_API_ADD_DESCR; +} tBTA_GATTS_API_ADD_DESCR; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT16 attr_id; UINT16 len; BOOLEAN need_confirm; UINT8 value[BTA_GATT_MAX_ATTR_LEN]; -}tBTA_GATTS_API_INDICATION; +} tBTA_GATTS_API_INDICATION; -typedef struct -{ +typedef struct { BT_HDR hdr; UINT32 trans_id; tBTA_GATT_STATUS status; tBTA_GATTS_RSP *p_rsp; -}tBTA_GATTS_API_RSP; +} tBTA_GATTS_API_RSP; -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_GATT_TRANSPORT transport; -}tBTA_GATTS_API_START; +} tBTA_GATTS_API_START; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR remote_bda; tBTA_GATTS_IF server_if; BOOLEAN is_direct; tBTA_GATT_TRANSPORT transport; -}tBTA_GATTS_API_OPEN; +} tBTA_GATTS_API_OPEN; typedef tBTA_GATTS_API_OPEN tBTA_GATTS_API_CANCEL_OPEN; -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR_PTR remote_bda; tBTA_GATTS_IF server_if; BOOLEAN start; } tBTA_GATTS_API_LISTEN; -typedef union -{ +typedef union { BT_HDR hdr; tBTA_GATTS_API_REG api_reg; tBTA_GATTS_API_DEREG api_dereg; @@ -178,17 +165,15 @@ typedef union } tBTA_GATTS_DATA; /* application registration control block */ -typedef struct -{ +typedef struct { BOOLEAN in_use; tBT_UUID app_uuid; tBTA_GATTS_CBACK *p_cback; tBTA_GATTS_IF gatt_if; -}tBTA_GATTS_RCB; +} tBTA_GATTS_RCB; /* service registration control block */ -typedef struct -{ +typedef struct { tBT_UUID service_uuid; /* service UUID */ UINT16 service_id; /* service handle */ UINT8 inst_num; /* instance ID */ @@ -196,16 +181,15 @@ typedef struct UINT8 idx; /* self index of serviec CB */ BOOLEAN in_use; -}tBTA_GATTS_SRVC_CB; +} tBTA_GATTS_SRVC_CB; /* GATT server control block */ -typedef struct -{ +typedef struct { BOOLEAN enabled; tBTA_GATTS_RCB rcb[BTA_GATTS_MAX_APP_NUM]; tBTA_GATTS_SRVC_CB srvc_cb[BTA_GATTS_MAX_SRVC_NUM]; -}tBTA_GATTS_CB; +} tBTA_GATTS_CB; @@ -218,7 +202,7 @@ typedef struct extern tBTA_GATTS_CB bta_gatts_cb; #else extern tBTA_GATTS_CB *bta_gatts_cb_ptr; - #define bta_gatts_cb (*bta_gatts_cb_ptr) +#define bta_gatts_cb (*bta_gatts_cb_ptr) #endif /***************************************************************************** @@ -231,29 +215,29 @@ extern void bta_gatts_api_enable(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_data); extern void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); extern void bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); extern void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); -extern void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg); +extern void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg); -extern void bta_gatts_send_rsp(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); +extern void bta_gatts_send_rsp(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); -extern void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); -extern void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg); +extern void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); +extern void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg); extern BOOLEAN bta_gatts_uuid_compare(tBT_UUID tar, tBT_UUID src); extern tBTA_GATTS_RCB *bta_gatts_find_app_rcb_by_app_if(tBTA_GATTS_IF server_if); extern UINT8 bta_gatts_find_app_rcb_idx_by_app_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_IF server_if); extern UINT8 bta_gatts_alloc_srvc_cb(tBTA_GATTS_CB *p_cb, UINT8 rcb_idx); -extern tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id); -extern tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT16 attr_id); +extern tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id); +extern tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT16 attr_id); #endif /* BTA_GATTS_INT_H */ diff --git a/components/bt/bluedroid/bta/include/bta_hh_api.h b/components/bt/bluedroid/bta/include/bta_hh_api.h index d43e492b6..d6b317404 100644 --- a/components/bt/bluedroid/bta/include/bta_hh_api.h +++ b/components/bt/bluedroid/bta/include/bta_hh_api.h @@ -93,8 +93,7 @@ typedef UINT16 tBTA_HH_EVT; #define BTA_HH_PROTO_UNKNOWN (0xff) typedef UINT8 tBTA_HH_PROTO_MODE; -enum -{ +enum { BTA_HH_KEYBD_RPT_ID = 1, BTA_HH_MOUSE_RPT_ID }; @@ -114,8 +113,7 @@ typedef UINT8 tBTA_HH_BOOT_RPT_ID; #define BTA_HH_DEVT_OTHER 0x80 typedef UINT8 tBTA_HH_DEVT; -enum -{ +enum { BTA_HH_OK, BTA_HH_HS_HID_NOT_READY, /* handshake error : device not ready */ BTA_HH_HS_INVALID_RPT_ID, /* handshake error : invalid report ID */ @@ -149,22 +147,19 @@ typedef UINT8 tBTA_HH_STATUS; typedef UINT16 tBTA_HH_ATTR_MASK; /* supported type of device and corresponding application ID */ -typedef struct -{ +typedef struct { tBTA_HH_DEVT tod; /* type of device */ UINT8 app_id; /* corresponding application ID */ -}tBTA_HH_SPT_TOD; +} tBTA_HH_SPT_TOD; /* configuration struct */ -typedef struct -{ +typedef struct { UINT8 max_devt_spt; /* max number of types of devices spt */ tBTA_HH_SPT_TOD *p_devt_list; /* supported types of device list */ UINT16 sdp_db_size; -}tBTA_HH_CFG; +} tBTA_HH_CFG; -enum -{ +enum { BTA_HH_RPTT_RESRV, /* reserved */ BTA_HH_RPTT_INPUT, /* input report */ BTA_HH_RPTT_OUTPUT, /* output report */ @@ -174,8 +169,7 @@ typedef UINT8 tBTA_HH_RPT_TYPE; /* HID_CONTROL operation code used in BTA_HhSendCtrl() */ -enum -{ +enum { BTA_HH_CTRL_NOP = 0 + HID_PAR_CONTROL_NOP ,/* mapping from BTE */ BTA_HH_CTRL_HARD_RESET, /* hard reset */ BTA_HH_CTRL_SOFT_RESET, /* soft reset */ @@ -194,8 +188,7 @@ typedef tHID_DEV_DSCP_INFO tBTA_HH_DEV_DESCR; /* report descriptor information */ -typedef struct -{ +typedef struct { UINT16 vendor_id; /* vendor ID */ UINT16 product_id; /* product ID */ UINT16 version; /* version */ @@ -209,11 +202,10 @@ typedef struct UINT8 flag; #endif tBTA_HH_DEV_DESCR descriptor; -}tBTA_HH_DEV_DSCP_INFO; +} tBTA_HH_DEV_DSCP_INFO; /* callback event data for BTA_HH_OPEN_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bda; /* HID device bd address */ tBTA_HH_STATUS status; /* operation status */ UINT8 handle; /* device handle */ @@ -227,14 +219,12 @@ typedef struct typedef tBTA_HH_CONN tBTA_HH_DEV_INFO; /* callback event data */ -typedef struct -{ +typedef struct { tBTA_HH_STATUS status; /* operation status */ UINT8 handle; /* device handle */ } tBTA_HH_CBDATA; -enum -{ +enum { BTA_HH_MOD_CTRL_KEY, BTA_HH_MOD_SHFT_KEY, BTA_HH_MOD_ALT_KEY, @@ -243,55 +233,48 @@ enum }; /* parsed boot mode keyboard report */ -typedef struct -{ +typedef struct { UINT8 this_char[6]; /* virtual key code */ BOOLEAN mod_key[BTA_HH_MOD_MAX_KEY]; - /* ctrl, shift, Alt, GUI */ - /* modifier key: is Shift key pressed */ - /* modifier key: is Ctrl key pressed */ - /* modifier key: is Alt key pressed */ - /* modifier key: GUI up/down */ + /* ctrl, shift, Alt, GUI */ + /* modifier key: is Shift key pressed */ + /* modifier key: is Ctrl key pressed */ + /* modifier key: is Alt key pressed */ + /* modifier key: GUI up/down */ BOOLEAN caps_lock; /* is caps locked */ BOOLEAN num_lock; /* is Num key pressed */ } tBTA_HH_KEYBD_RPT; /* parsed boot mode mouse report */ -typedef struct -{ +typedef struct { UINT8 mouse_button; /* mouse button is clicked */ INT8 delta_x; /* displacement x */ INT8 delta_y; /* displacement y */ -}tBTA_HH_MICE_RPT; +} tBTA_HH_MICE_RPT; /* parsed Boot report */ -typedef struct -{ +typedef struct { tBTA_HH_BOOT_RPT_ID dev_type; /* type of device report */ - union - { + union { tBTA_HH_KEYBD_RPT keybd_rpt; /* keyboard report */ tBTA_HH_MICE_RPT mice_rpt; /* mouse report */ } data_rpt; } tBTA_HH_BOOT_RPT; /* handshake data */ -typedef struct -{ +typedef struct { tBTA_HH_STATUS status; /* handshake status */ UINT8 handle; /* device handle */ - union - { + union { tBTA_HH_PROTO_MODE proto_mode; /* GET_PROTO_EVT :protocol mode */ BT_HDR *p_rpt_data; /* GET_RPT_EVT : report data */ UINT8 idle_rate; /* GET_IDLE_EVT : idle rate */ } rsp_data; -}tBTA_HH_HSDATA; +} tBTA_HH_HSDATA; /* union of data associated with HD callback */ -typedef union -{ +typedef union { tBTA_HH_DEV_INFO dev_info; /* BTA_HH_ADD_DEV_EVT, BTA_HH_RMV_DEV_EVT */ tBTA_HH_CONN conn; /* BTA_HH_OPEN_EVT */ tBTA_HH_CBDATA dev_status; /* BTA_HH_CLOSE_EVT, diff --git a/components/bt/bluedroid/bta/include/bta_hh_co.h b/components/bt/bluedroid/bta/include/bta_hh_co.h index 09cb565ea..9cbb15502 100644 --- a/components/bt/bluedroid/bta/include/bta_hh_co.h +++ b/components/bt/bluedroid/bta/include/bta_hh_co.h @@ -26,14 +26,13 @@ #include "bta_hh_api.h" -typedef struct -{ +typedef struct { UINT16 rpt_uuid; UINT8 rpt_id; tBTA_HH_RPT_TYPE rpt_type; UINT8 inst_id; UINT8 prop; -}tBTA_HH_RPT_CACHE_ENTRY; +} tBTA_HH_RPT_CACHE_ENTRY; /******************************************************************************* ** @@ -94,8 +93,8 @@ extern void bta_hh_co_close(UINT8 dev_handle, UINT8 app_id); ** *******************************************************************************/ extern void bta_hh_le_co_rpt_info(BD_ADDR remote_bda, - tBTA_HH_RPT_CACHE_ENTRY *p_entry, - UINT8 app_id); + tBTA_HH_RPT_CACHE_ENTRY *p_entry, + UINT8 app_id); /******************************************************************************* ** @@ -113,8 +112,8 @@ extern void bta_hh_le_co_rpt_info(BD_ADDR remote_bda, ** *******************************************************************************/ extern tBTA_HH_RPT_CACHE_ENTRY *bta_hh_le_co_cache_load (BD_ADDR remote_bda, - UINT8 *p_num_rpt, - UINT8 app_id); + UINT8 *p_num_rpt, + UINT8 app_id); /******************************************************************************* ** diff --git a/components/bt/bluedroid/bta/include/bta_sdp_api.h b/components/bt/bluedroid/bta/include/bta_sdp_api.h old mode 100755 new mode 100644 index 11a7edc9f..c2df4bb95 --- a/components/bt/bluedroid/bta/include/bta_sdp_api.h +++ b/components/bt/bluedroid/bta/include/bta_sdp_api.h @@ -51,8 +51,7 @@ typedef UINT8 tBTA_SDP_STATUS; typedef UINT16 tBTA_SDP_EVT; /* data associated with BTA_SDP_DISCOVERY_COMP_EVT */ -typedef struct -{ +typedef struct { tBTA_SDP_STATUS status; BD_ADDR remote_addr; tBT_UUID uuid; @@ -60,18 +59,16 @@ typedef struct bluetooth_sdp_record records[BTA_SDP_MAX_RECORDS]; } tBTA_SDP_SEARCH_COMP; -typedef union -{ +typedef union { tBTA_SDP_STATUS status; /* BTA_SDP_SEARCH_EVT */ tBTA_SDP_SEARCH_COMP sdp_search_comp; /* BTA_SDP_SEARCH_COMP_EVT */ } tBTA_SDP; /* SDP DM Interface callback */ -typedef void (tBTA_SDP_DM_CBACK)(tBTA_SDP_EVT event, tBTA_SDP *p_data, void * user_data); +typedef void (tBTA_SDP_DM_CBACK)(tBTA_SDP_EVT event, tBTA_SDP *p_data, void *user_data); /* MCE configuration structure */ -typedef struct -{ +typedef struct { UINT16 sdp_db_size; /* The size of p_sdp_db */ tSDP_DISCOVERY_DB *p_sdp_db; /* The data buffer to keep SDP database */ } tBTA_SDP_CFG; @@ -108,7 +105,7 @@ extern tBTA_SDP_STATUS BTA_SdpEnable(tBTA_SDP_DM_CBACK *p_cback); ** BTA_SDP_FAIL if internal failure. ** *******************************************************************************/ -extern tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr,tSDP_UUID *uuid); +extern tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr, tSDP_UUID *uuid); /******************************************************************************* ** @@ -122,7 +119,7 @@ extern tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr,tSDP_UUID *uuid); ** BTA_SDP_FAILURE, otherwise. ** *******************************************************************************/ -extern tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void* user_data); +extern tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void *user_data); /******************************************************************************* ** @@ -136,7 +133,7 @@ extern tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void* user_data); ** BTA_SDP_FAILURE, otherwise. ** *******************************************************************************/ -extern tBTA_SDP_STATUS BTA_SdpRemoveRecordByUser(void* user_data); +extern tBTA_SDP_STATUS BTA_SdpRemoveRecordByUser(void *user_data); #ifdef __cplusplus } diff --git a/components/bt/bluedroid/bta/include/bta_sys.h b/components/bt/bluedroid/bta/include/bta_sys.h index 8eacd3a9c..808edbb4c 100644 --- a/components/bt/bluedroid/bta/include/bta_sys.h +++ b/components/bt/bluedroid/bta/include/bta_sys.h @@ -42,8 +42,7 @@ typedef void (tBTA_SYS_DISABLE)(void); /* HW modules */ -enum -{ +enum { BTA_SYS_HW_BLUETOOTH, BTA_SYS_HW_RT, @@ -137,7 +136,7 @@ typedef UINT8 tBTA_SYS_CONN_STATUS; typedef UINT8 tBTA_SYS_PREF_ROLES; /* conn callback for role / low power manager*/ -typedef void (tBTA_SYS_CONN_CBACK)(tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr); +typedef void (tBTA_SYS_CONN_CBACK)(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); /* conn callback for role / low power manager*/ typedef void (tBTA_SYS_SSR_CFG_CBACK)(UINT8 id, UINT8 app_id, UINT16 latency, UINT16 tout); @@ -148,15 +147,13 @@ typedef void (tBTA_SYS_EIR_CBACK)(UINT16 uuid16, BOOLEAN adding); #endif /* registration structure */ -typedef struct -{ +typedef struct { tBTA_SYS_EVT_HDLR *evt_hdlr; tBTA_SYS_DISABLE *disable; } tBTA_SYS_REG; /* data type to send events to BTA SYS HW manager */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_SYS_HW_MODULE hw_module; } tBTA_SYS_HW_MSG; @@ -180,8 +177,7 @@ extern UINT8 appl_trace_level; *****************************************************************************/ /* events sent to SYS HW manager - must be kept synchronized with tables in bta_sys_main.c */ -enum -{ +enum { /* device manager local device API events */ BTA_SYS_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_SYS), BTA_SYS_EVT_ENABLED_EVT, @@ -196,8 +192,7 @@ enum /* SYS HW status events - returned by SYS HW manager to other modules. */ -enum -{ +enum { BTA_SYS_HW_OFF_EVT, BTA_SYS_HW_ON_EVT, BTA_SYS_HW_STARTING_EVT, @@ -236,11 +231,11 @@ extern void bta_sys_hw_register( tBTA_SYS_HW_MODULE module, tBTA_SYS_HW_CBACK *c extern void bta_sys_hw_unregister( tBTA_SYS_HW_MODULE module ); -extern void bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback); -extern void bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback); +extern void bta_sys_rm_register(tBTA_SYS_CONN_CBACK *p_cback); +extern void bta_sys_pm_register(tBTA_SYS_CONN_CBACK *p_cback); -extern void bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback); -extern void bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback); +extern void bta_sys_policy_register(tBTA_SYS_CONN_CBACK *p_cback); +extern void bta_sys_sco_register(tBTA_SYS_CONN_CBACK *p_cback); extern void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr); @@ -255,17 +250,17 @@ extern void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr); extern void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr); #if (BTM_SSR_INCLUDED == TRUE) -extern void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback); +extern void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK *p_cback); extern void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout); #endif -extern void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback); +extern void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK *p_cback); extern void bta_sys_notify_role_chg(BD_ADDR_PTR p_bda, UINT8 new_role, UINT8 hci_status); extern void bta_sys_collision_register(UINT8 bta_id, tBTA_SYS_CONN_CBACK *p_cback); extern void bta_sys_notify_collision (BD_ADDR_PTR p_bda); #if (BTA_EIR_CANNED_UUID_LIST != TRUE) -extern void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback); +extern void bta_sys_eir_register(tBTA_SYS_EIR_CBACK *p_cback); extern void bta_sys_add_uuid(UINT16 uuid16); extern void bta_sys_remove_uuid(UINT16 uuid16); #else diff --git a/components/bt/bluedroid/bta/include/utl.h b/components/bt/bluedroid/bta/include/utl.h old mode 100755 new mode 100644 index efae0678b..39dbe297d --- a/components/bt/bluedroid/bta/include/utl.h +++ b/components/bt/bluedroid/bta/include/utl.h @@ -42,8 +42,7 @@ *****************************************************************************/ /** for utl_set_device_class() **/ -typedef struct -{ +typedef struct { UINT8 minor; UINT8 major; UINT16 service; diff --git a/components/bt/bluedroid/bta/sdp/bta_sdp.c b/components/bt/bluedroid/bta/sdp/bta_sdp.c old mode 100755 new mode 100644 index 88a68a5f9..9d6c9b0a2 --- a/components/bt/bluedroid/bta/sdp/bta_sdp.c +++ b/components/bt/bluedroid/bta/sdp/bta_sdp.c @@ -44,8 +44,7 @@ tBTA_SDP_CB bta_sdp_cb; typedef void (*tBTA_SDP_ACTION)(tBTA_SDP_MSG *p_data); /* action function list */ -const tBTA_SDP_ACTION bta_sdp_action[] = -{ +const tBTA_SDP_ACTION bta_sdp_action[] = { bta_sdp_enable, /* BTA_SDP_API_ENABLE_EVT */ bta_sdp_search, /* BTA_SDP_API_SEARCH_EVT */ bta_sdp_create_record, /* BTA_SDP_API_CREATE_RECORD_USER_EVT */ @@ -61,17 +60,18 @@ const tBTA_SDP_ACTION bta_sdp_action[] = *******************************************************************************/ BOOLEAN bta_sdp_sm_execute(BT_HDR *p_msg) { - if(p_msg == NULL) return FALSE; + if (p_msg == NULL) { + return FALSE; + } BOOLEAN ret = FALSE; UINT16 action = (p_msg->event & 0x00ff); /* execute action functions */ - if(action < BTA_SDP_NUM_ACTIONS) - { - (*bta_sdp_action[action])((tBTA_SDP_MSG*)p_msg); + if (action < BTA_SDP_NUM_ACTIONS) { + (*bta_sdp_action[action])((tBTA_SDP_MSG *)p_msg); ret = TRUE; } - return(ret); + return (ret); } diff --git a/components/bt/bluedroid/bta/sdp/bta_sdp_act.c b/components/bt/bluedroid/bta/sdp/bta_sdp_act.c old mode 100755 new mode 100644 index ee337343c..944a3ee21 --- a/components/bt/bluedroid/bta/sdp/bta_sdp_act.c +++ b/components/bt/bluedroid/bta/sdp/bta_sdp_act.c @@ -44,17 +44,23 @@ *****************************************************************************/ static const uint8_t UUID_OBEX_OBJECT_PUSH[] = {0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; static const uint8_t UUID_PBAP_PSE[] = {0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; static const uint8_t UUID_MAP_MAS[] = {0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; static const uint8_t UUID_MAP_MNS[] = {0x00, 0x00, 0x11, 0x33, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; static const uint8_t UUID_SPP[] = {0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; static const uint8_t UUID_SAP[] = {0x00, 0x00, 0x11, 0x2D, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; // TODO: // Both the fact that the UUIDs are declared in multiple places, plus the fact // that there is a mess of UUID comparison and shortening methods will have to @@ -64,22 +70,24 @@ static const uint8_t UUID_SAP[] = {0x00, 0x00, 0x11, 0x2D, 0x00, 0x00, 0x10, 0x #define UUID_MAX_LENGTH 16 #define IS_UUID(u1,u2) !memcmp(u1,u2,UUID_MAX_LENGTH) -static inline tBT_UUID shorten_sdp_uuid(const tBT_UUID* u) +static inline tBT_UUID shorten_sdp_uuid(const tBT_UUID *u) { static uint8_t bt_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB }; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; APPL_TRACE_DEBUG("%s() - uuid len:%d\n", __func__, u->len); - if(u->len != 16) + if (u->len != 16) { return *u; + } - if(memcmp(&u->uu.uuid128[4], &bt_base_uuid[4], 12) != 0) + if (memcmp(&u->uu.uuid128[4], &bt_base_uuid[4], 12) != 0) { return *u; + } tBT_UUID su; memset(&su, 0, sizeof(su)); - if(u->uu.uuid128[0] == 0 && u->uu.uuid128[1] == 0) - { + if (u->uu.uuid128[0] == 0 && u->uu.uuid128[1] == 0) { su.len = 2; uint16_t u16; memcpy(&u16, &u->uu.uuid128[2], sizeof(u16)); @@ -106,29 +114,24 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->mns.hdr.profile_version = 0; record->mns.supported_features = 0x0000001F; //default value if not found - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES)) != NULL) { record->mns.supported_features = p_attr->attr_value.v.u32; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->mns.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mns.hdr.service_name = (char *)p_attr->attr_value.v.array; } - if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) - { + if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) { record->mns.hdr.profile_version = pversion; } - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->mns.hdr.rfcomm_channel_number = pe.params[0]; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) { record->mns.hdr.l2cap_psm = p_attr->attr_value.v.u16; } } @@ -149,39 +152,32 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->mas.supported_features = 0x0000001F; record->mas.supported_message_types = 0; - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID)) != NULL) { record->mas.mas_instance_id = p_attr->attr_value.v.u8; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE)) != NULL) { record->mas.supported_message_types = p_attr->attr_value.v.u8; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES)) != NULL) { record->mas.supported_features = p_attr->attr_value.v.u32; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->mas.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->mas.hdr.service_name = (char *)p_attr->attr_value.v.array; } - if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) - { + if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) { record->mas.hdr.profile_version = pversion; } - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->mas.hdr.rfcomm_channel_number = pe.params[0]; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) { record->mas.hdr.l2cap_psm = p_attr->attr_value.v.u16; } } @@ -201,33 +197,27 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->pse.supported_features = 0x00000003; record->pse.supported_repositories = 0; - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES)) != NULL) { record->pse.supported_repositories = p_attr->attr_value.v.u8; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES)) != NULL) { record->pse.supported_features = p_attr->attr_value.v.u32; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->pse.hdr.service_name = (char *)p_attr->attr_value.v.array; } - if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS, &pversion)) - { + if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS, &pversion)) { record->pse.hdr.profile_version = pversion; } - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->pse.hdr.rfcomm_channel_number = pe.params[0]; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) { record->pse.hdr.l2cap_psm = p_attr->attr_value.v.u16; } } @@ -246,48 +236,41 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->ops.hdr.profile_version = 0; record->ops.supported_formats_list_len = 0; - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->ops.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->ops.hdr.service_name = (char *)p_attr->attr_value.v.array; } - if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH, &pversion)) - { + if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH, &pversion)) { record->ops.hdr.profile_version = pversion; } - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->ops.hdr.rfcomm_channel_number = pe.params[0]; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM)) != NULL) { record->ops.hdr.l2cap_psm = p_attr->attr_value.v.u16; } - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST)) != NULL) { /* Safety check - each entry should itself be a sequence */ if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) { record->ops.supported_formats_list_len = 0; APPL_TRACE_ERROR("%s() - supported_formats_list - wrong attribute length/type:" - " 0x%02x - expected 0x06", __func__, p_attr->attr_len_type); + " 0x%02x - expected 0x06", __func__, p_attr->attr_len_type); } else { int count = 0; /* 1 byte for type/length 1 byte for value */ - record->ops.supported_formats_list_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type)/2; + record->ops.supported_formats_list_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type) / 2; /* Extract each value into */ for (p_sattr = p_attr->attr_value.v.p_sub_attr; - p_sattr != NULL; p_sattr = p_sattr->p_next_attr) - { + p_sattr != NULL; p_sattr = p_sattr->p_next_attr) { if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UINT_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 1)) - { + && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 1)) { if (count == sizeof(record->ops.supported_formats_list)) { APPL_TRACE_ERROR("%s() - supported_formats_list - count overflow - " - "too many sub attributes!!\n", __func__); + "too many sub attributes!!\n", __func__); /* If you hit this, new formats have been added, * update SDP_OPP_SUPPORTED_FORMATS_MAX_LENGTH */ break; @@ -296,16 +279,16 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE count++; } else { APPL_TRACE_ERROR("%s() - supported_formats_list - wrong sub attribute " - "length/type: 0x%02x - expected 0x80", __func__, - p_sattr->attr_len_type); + "length/type: 0x%02x - expected 0x80", __func__, + p_sattr->attr_len_type); break; } } if (record->ops.supported_formats_list_len != count) { APPL_TRACE_WARNING("%s() - supported_formats_list - Length of attribute different " - "from the actual number of sub-attributes in the sequence " - "att-length: %d - number of elements: %d\n", __func__, - record->ops.supported_formats_list_len , count); + "from the actual number of sub-attributes in the sequence " + "att-length: %d - number of elements: %d\n", __func__, + record->ops.supported_formats_list_len , count); } record->ops.supported_formats_list_len = count; @@ -327,19 +310,16 @@ static void bta_create_sap_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->sap.hdr.l2cap_psm = -1; record->sap.hdr.profile_version = 0; - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->sap.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->sap.hdr.service_name = (char *)p_attr->attr_value.v.array; } - if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) - { + if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) { record->sap.hdr.profile_version = pversion; } - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->sap.hdr.rfcomm_channel_number = pe.params[0]; } } @@ -357,15 +337,13 @@ static void bta_create_raw_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE record->hdr.profile_version = -1; /* Try to extract a service name */ - if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) - { + if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) { record->pse.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); record->pse.hdr.service_name = (char *)p_attr->attr_value.v.array; } /* Try to extract an RFCOMM channel */ - if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) - { + if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) { record->pse.hdr.rfcomm_channel_number = pe.params[0]; } record->hdr.user1_ptr_len = p_bta_sdp_cfg->p_sdp_db->raw_size; @@ -382,7 +360,7 @@ static void bta_create_raw_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE ** Returns void ** *******************************************************************************/ -static void bta_sdp_search_cback(UINT16 result, void * user_data) +static void bta_sdp_search_cback(UINT16 result, void *user_data) { tSDP_DISC_REC *p_rec = NULL; tBTA_SDP_SEARCH_COMP evt_data = {0}; // We need to zero-initialize @@ -393,33 +371,34 @@ static void bta_sdp_search_cback(UINT16 result, void * user_data) bta_sdp_cb.sdp_active = BTA_SDP_ACTIVE_NONE; - if (bta_sdp_cb.p_dm_cback == NULL) return; + if (bta_sdp_cb.p_dm_cback == NULL) { + return; + } bdcpy(evt_data.remote_addr, bta_sdp_cb.remote_addr); - tBT_UUID *uuid = (tBT_UUID*)user_data; + tBT_UUID *uuid = (tBT_UUID *)user_data; memcpy(&evt_data.uuid, uuid, sizeof(tBT_UUID)); su = shorten_sdp_uuid(uuid); - if (result == SDP_SUCCESS || result == SDP_DB_FULL) - { + if (result == SDP_SUCCESS || result == SDP_DB_FULL) { do { p_rec = SDP_FindServiceUUIDInDb(p_bta_sdp_cfg->p_sdp_db, &su, p_rec); /* generate the matching record data pointer */ - if(p_rec != NULL){ + if (p_rec != NULL) { status = BTA_SDP_SUCCESS; - if (IS_UUID(UUID_MAP_MAS,uuid->uu.uuid128)) { + if (IS_UUID(UUID_MAP_MAS, uuid->uu.uuid128)) { APPL_TRACE_DEBUG("%s() - found MAP (MAS) uuid\n", __func__); bta_create_mas_sdp_record(&evt_data.records[count], p_rec); - } else if (IS_UUID(UUID_MAP_MNS,uuid->uu.uuid128)) { + } else if (IS_UUID(UUID_MAP_MNS, uuid->uu.uuid128)) { APPL_TRACE_DEBUG("%s() - found MAP (MNS) uuid\n", __func__); bta_create_mns_sdp_record(&evt_data.records[count], p_rec); - } else if (IS_UUID(UUID_PBAP_PSE,uuid->uu.uuid128)){ + } else if (IS_UUID(UUID_PBAP_PSE, uuid->uu.uuid128)) { APPL_TRACE_DEBUG("%s() - found PBAP (PSE) uuid\n", __func__); bta_create_pse_sdp_record(&evt_data.records[count], p_rec); - } else if (IS_UUID(UUID_OBEX_OBJECT_PUSH,uuid->uu.uuid128)){ + } else if (IS_UUID(UUID_OBEX_OBJECT_PUSH, uuid->uu.uuid128)) { APPL_TRACE_DEBUG("%s() - found Object Push Server (OPS) uuid\n", __func__); bta_create_ops_sdp_record(&evt_data.records[count], p_rec); - } else if (IS_UUID(UUID_SAP,uuid->uu.uuid128)) { + } else if (IS_UUID(UUID_SAP, uuid->uu.uuid128)) { APPL_TRACE_DEBUG("%s() - found SAP uuid\n", __func__); bta_create_sap_sdp_record(&evt_data.records[count], p_rec); } else { @@ -444,7 +423,7 @@ static void bta_sdp_search_cback(UINT16 result, void * user_data) } evt_data.status = status; - bta_sdp_cb.p_dm_cback(BTA_SDP_SEARCH_COMP_EVT, (tBTA_SDP*) &evt_data, (void*)&uuid->uu.uuid128); + bta_sdp_cb.p_dm_cback(BTA_SDP_SEARCH_COMP_EVT, (tBTA_SDP *) &evt_data, (void *)&uuid->uu.uuid128); osi_free(user_data); // We no longer need the user data to track the search } @@ -476,11 +455,10 @@ void bta_sdp_enable(tBTA_SDP_MSG *p_data) *******************************************************************************/ void bta_sdp_search(tBTA_SDP_MSG *p_data) { - int x=0; + int x = 0; // TODO: Leaks!!! but needed as user-data pointer tBT_UUID *bta_sdp_search_uuid = osi_malloc(sizeof(tBT_UUID)); - if(p_data == NULL) - { + if (p_data == NULL) { APPL_TRACE_DEBUG("SDP control block handle is null\n"); return; } @@ -488,11 +466,10 @@ void bta_sdp_search(tBTA_SDP_MSG *p_data) APPL_TRACE_DEBUG("%s in, sdp_active:%d\n", __func__, bta_sdp_cb.sdp_active); - if (bta_sdp_cb.sdp_active != BTA_SDP_ACTIVE_NONE) - { + if (bta_sdp_cb.sdp_active != BTA_SDP_ACTIVE_NONE) { /* SDP is still in progress */ status = BTA_SDP_BUSY; - if(bta_sdp_cb.p_dm_cback) { + if (bta_sdp_cb.p_dm_cback) { tBTA_SDP_SEARCH_COMP result = {0}; result.uuid = p_data->get_search.uuid; bdcpy(result.remote_addr, p_data->get_search.bd_addr); @@ -505,20 +482,19 @@ void bta_sdp_search(tBTA_SDP_MSG *p_data) bta_sdp_cb.sdp_active = BTA_SDP_ACTIVE_YES; bdcpy(bta_sdp_cb.remote_addr, p_data->get_search.bd_addr); /* set the uuid used in the search */ - memcpy(bta_sdp_search_uuid, &(p_data->get_search.uuid),sizeof(tBT_UUID)); + memcpy(bta_sdp_search_uuid, &(p_data->get_search.uuid), sizeof(tBT_UUID)); /* initialize the search for the uuid */ APPL_TRACE_DEBUG("%s init discovery with UUID(len: %d):\n", - __func__, bta_sdp_search_uuid->len); - for(x = 0; xlen;x++){ - APPL_TRACE_DEBUG("%X",bta_sdp_search_uuid->uu.uuid128[x]); + __func__, bta_sdp_search_uuid->len); + for (x = 0; x < bta_sdp_search_uuid->len; x++) { + APPL_TRACE_DEBUG("%X", bta_sdp_search_uuid->uu.uuid128[x]); } SDP_InitDiscoveryDb (p_bta_sdp_cfg->p_sdp_db, p_bta_sdp_cfg->sdp_db_size, 1, - bta_sdp_search_uuid, 0, NULL); + bta_sdp_search_uuid, 0, NULL); if (!SDP_ServiceSearchAttributeRequest2(p_data->get_search.bd_addr, p_bta_sdp_cfg->p_sdp_db, - bta_sdp_search_cback, (void*)bta_sdp_search_uuid)) - { + bta_sdp_search_cback, (void *)bta_sdp_search_uuid)) { bta_sdp_cb.sdp_active = BTA_SDP_ACTIVE_NONE; /* failed to start SDP. report the failure right away */ @@ -547,8 +523,9 @@ void bta_sdp_search(tBTA_SDP_MSG *p_data) void bta_sdp_create_record(tBTA_SDP_MSG *p_data) { APPL_TRACE_DEBUG("%s() event: %d\n", __func__, p_data->record.hdr.event); - if (bta_sdp_cb.p_dm_cback) + if (bta_sdp_cb.p_dm_cback) { bta_sdp_cb.p_dm_cback(BTA_SDP_CREATE_RECORD_USER_EVT, NULL, p_data->record.user_data); + } } /******************************************************************************* @@ -563,6 +540,7 @@ void bta_sdp_create_record(tBTA_SDP_MSG *p_data) void bta_sdp_remove_record(tBTA_SDP_MSG *p_data) { APPL_TRACE_DEBUG("%s() event: %d\n", __func__, p_data->record.hdr.event); - if (bta_sdp_cb.p_dm_cback) + if (bta_sdp_cb.p_dm_cback) { bta_sdp_cb.p_dm_cback(BTA_SDP_REMOVE_RECORD_USER_EVT, NULL, p_data->record.user_data); + } } diff --git a/components/bt/bluedroid/bta/sdp/bta_sdp_api.c b/components/bt/bluedroid/bta/sdp/bta_sdp_api.c old mode 100755 new mode 100644 index e6a640f70..e69451197 --- a/components/bt/bluedroid/bta/sdp/bta_sdp_api.c +++ b/components/bt/bluedroid/bta/sdp/bta_sdp_api.c @@ -35,8 +35,7 @@ ** Constants *****************************************************************************/ -static const tBTA_SYS_REG bta_sdp_reg = -{ +static const tBTA_SYS_REG bta_sdp_reg = { bta_sdp_sm_execute, NULL }; @@ -61,23 +60,21 @@ tBTA_SDP_STATUS BTA_SdpEnable(tBTA_SDP_DM_CBACK *p_cback) tBTA_SDP_API_ENABLE *p_buf; APPL_TRACE_API(__FUNCTION__); - if(p_cback && FALSE == bta_sys_is_register(BTA_ID_SDP)) - { + if (p_cback && FALSE == bta_sys_is_register(BTA_ID_SDP)) { memset(&bta_sdp_cb, 0, sizeof(tBTA_SDP_CB)); /* register with BTA system manager */ bta_sys_register(BTA_ID_SDP, &bta_sdp_reg); if (p_cback && - (p_buf = (tBTA_SDP_API_ENABLE *) GKI_getbuf(sizeof(tBTA_SDP_API_ENABLE))) != NULL) - { + (p_buf = (tBTA_SDP_API_ENABLE *) GKI_getbuf(sizeof(tBTA_SDP_API_ENABLE))) != NULL) { p_buf->hdr.event = BTA_SDP_API_ENABLE_EVT; p_buf->p_cback = p_cback; bta_sys_sendmsg(p_buf); status = BTA_SDP_SUCCESS; } } - return(status); + return (status); } /******************************************************************************* @@ -99,8 +96,7 @@ tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr, tSDP_UUID *uuid) tBTA_SDP_API_SEARCH *p_msg; APPL_TRACE_API(__FUNCTION__); - if ((p_msg = (tBTA_SDP_API_SEARCH *)GKI_getbuf(sizeof(tBTA_SDP_API_SEARCH))) != NULL) - { + if ((p_msg = (tBTA_SDP_API_SEARCH *)GKI_getbuf(sizeof(tBTA_SDP_API_SEARCH))) != NULL) { p_msg->hdr.event = BTA_SDP_API_SEARCH_EVT; bdcpy(p_msg->bd_addr, bd_addr); //p_msg->uuid = uuid; @@ -109,7 +105,7 @@ tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr, tSDP_UUID *uuid) ret = BTA_SDP_SUCCESS; } - return(ret); + return (ret); } /******************************************************************************* @@ -124,21 +120,20 @@ tBTA_SDP_STATUS BTA_SdpSearch(BD_ADDR bd_addr, tSDP_UUID *uuid) ** BTA_SDP_FAILURE, otherwise. ** *******************************************************************************/ -tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void* user_data) +tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void *user_data) { tBTA_SDP_STATUS ret = BTA_SDP_FAILURE; tBTA_SDP_API_RECORD_USER *p_msg; APPL_TRACE_API(__FUNCTION__); - if ((p_msg = (tBTA_SDP_API_RECORD_USER *)GKI_getbuf(sizeof(tBTA_SDP_API_RECORD_USER))) != NULL) - { + if ((p_msg = (tBTA_SDP_API_RECORD_USER *)GKI_getbuf(sizeof(tBTA_SDP_API_RECORD_USER))) != NULL) { p_msg->hdr.event = BTA_SDP_API_CREATE_RECORD_USER_EVT; p_msg->user_data = user_data; bta_sys_sendmsg(p_msg); ret = BTA_SDP_SUCCESS; } - return(ret); + return (ret); } /******************************************************************************* @@ -153,21 +148,20 @@ tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void* user_data) ** BTA_SDP_FAILURE, otherwise. ** *******************************************************************************/ -tBTA_SDP_STATUS BTA_SdpRemoveRecordByUser(void* user_data) +tBTA_SDP_STATUS BTA_SdpRemoveRecordByUser(void *user_data) { tBTA_SDP_STATUS ret = BTA_SDP_FAILURE; tBTA_SDP_API_RECORD_USER *p_msg; APPL_TRACE_API(__FUNCTION__); - if ((p_msg = (tBTA_SDP_API_RECORD_USER *)GKI_getbuf(sizeof(tBTA_SDP_API_RECORD_USER))) != NULL) - { + if ((p_msg = (tBTA_SDP_API_RECORD_USER *)GKI_getbuf(sizeof(tBTA_SDP_API_RECORD_USER))) != NULL) { p_msg->hdr.event = BTA_SDP_API_REMOVE_RECORD_USER_EVT; p_msg->user_data = user_data; bta_sys_sendmsg(p_msg); ret = BTA_SDP_SUCCESS; } - return(ret); + return (ret); } diff --git a/components/bt/bluedroid/bta/sdp/bta_sdp_cfg.c b/components/bt/bluedroid/bta/sdp/bta_sdp_cfg.c old mode 100755 new mode 100644 index 038183c6d..bfd02d279 --- a/components/bt/bluedroid/bta/sdp/bta_sdp_cfg.c +++ b/components/bt/bluedroid/bta/sdp/bta_sdp_cfg.c @@ -31,8 +31,7 @@ static UINT8 __attribute__ ((aligned(4))) bta_sdp_db_data[BTA_SDP_DB_SIZE]; /* SDP configuration structure */ -const tBTA_SDP_CFG bta_sdp_cfg = -{ +const tBTA_SDP_CFG bta_sdp_cfg = { BTA_SDP_DB_SIZE, (tSDP_DISCOVERY_DB *)bta_sdp_db_data /* The data buffer to keep SDP database */ }; diff --git a/components/bt/bluedroid/bta/sdp/bta_sdp_int.h b/components/bt/bluedroid/bta/sdp/bta_sdp_int.h old mode 100755 new mode 100644 index 4f3f6a53d..21be47e06 --- a/components/bt/bluedroid/bta/sdp/bta_sdp_int.h +++ b/components/bt/bluedroid/bta/sdp/bta_sdp_int.h @@ -35,8 +35,7 @@ ** Constants *****************************************************************************/ -enum -{ +enum { /* these events are handled by the state machine */ BTA_SDP_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_SDP), BTA_SDP_API_SEARCH_EVT, @@ -45,8 +44,7 @@ enum BTA_SDP_MAX_INT_EVT }; -enum -{ +enum { BTA_SDP_ACTIVE_NONE = 0, BTA_SDP_ACTIVE_YES /* waiting for SDP result */ }; @@ -54,30 +52,26 @@ enum /* data type for BTA_SDP_API_ENABLE_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; tBTA_SDP_DM_CBACK *p_cback; } tBTA_SDP_API_ENABLE; /* data type for BTA_SDP_API_SEARCH_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; BD_ADDR bd_addr; tSDP_UUID uuid; } tBTA_SDP_API_SEARCH; /* data type for BTA_SDP_API_SEARCH_EVT */ -typedef struct -{ +typedef struct { BT_HDR hdr; - void* user_data; + void *user_data; } tBTA_SDP_API_RECORD_USER; /* union of all data types */ -typedef union -{ +typedef union { /* GKI event buffer header */ BT_HDR hdr; tBTA_SDP_API_ENABLE enable; @@ -86,8 +80,7 @@ typedef union } tBTA_SDP_MSG; /* SDP control block */ -typedef struct -{ +typedef struct { UINT8 sdp_active; /* see BTA_SDP_SDP_ACT_* */ BD_ADDR remote_addr; tBTA_SDP_DM_CBACK *p_dm_cback; diff --git a/components/bt/bluedroid/bta/sys/bta_sys_conn.c b/components/bt/bluedroid/bta/sys/bta_sys_conn.c old mode 100755 new mode 100644 index 087a9ff75..6d671be98 --- a/components/bt/bluedroid/bta/sys/bta_sys_conn.c +++ b/components/bt/bluedroid/bta/sys/bta_sys_conn.c @@ -39,7 +39,7 @@ ** Returns void ** *******************************************************************************/ -void bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback) +void bta_sys_rm_register(tBTA_SYS_CONN_CBACK *p_cback) { bta_sys_cb.prm_cb = p_cback; } @@ -55,7 +55,7 @@ void bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback) ** Returns void ** *******************************************************************************/ -void bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback) +void bta_sys_policy_register(tBTA_SYS_CONN_CBACK *p_cback) { bta_sys_cb.p_policy_cb = p_cback; } @@ -70,7 +70,7 @@ void bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback) ** Returns void ** *******************************************************************************/ -void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback) +void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK *p_cback) { bta_sys_cb.p_role_cb = p_cback; } @@ -85,7 +85,7 @@ void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback) ** *******************************************************************************/ #if (BTM_SSR_INCLUDED == TRUE) -void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback) +void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK *p_cback) { bta_sys_cb.p_ssr_cb = p_cback; } @@ -102,8 +102,7 @@ void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback) *******************************************************************************/ void bta_sys_notify_role_chg(BD_ADDR_PTR p_bda, UINT8 new_role, UINT8 hci_status) { - if (bta_sys_cb.p_role_cb) - { + if (bta_sys_cb.p_role_cb) { bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda); } } @@ -122,11 +121,9 @@ void bta_sys_collision_register(UINT8 bta_id, tBTA_SYS_CONN_CBACK *p_cback) { UINT8 index; - for (index = 0; index < MAX_COLLISION_REG; index++) - { + for (index = 0; index < MAX_COLLISION_REG; index++) { if ((bta_sys_cb.colli_reg.id[index] == bta_id) || - (bta_sys_cb.colli_reg.id[index] == 0)) - { + (bta_sys_cb.colli_reg.id[index] == 0)) { bta_sys_cb.colli_reg.id[index] = bta_id; bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback; return; @@ -148,11 +145,9 @@ void bta_sys_notify_collision (BD_ADDR_PTR p_bda) { UINT8 index; - for (index = 0; index < MAX_COLLISION_REG; index++) - { + for (index = 0; index < MAX_COLLISION_REG; index++) { if ((bta_sys_cb.colli_reg.id[index] != 0) && - (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) - { + (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) { bta_sys_cb.colli_reg.p_coll_cback[index] (0, BTA_ID_SYS, 0, p_bda); } } @@ -168,7 +163,7 @@ void bta_sys_notify_collision (BD_ADDR_PTR p_bda) ** Returns void ** *******************************************************************************/ -void bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback) +void bta_sys_sco_register(tBTA_SYS_CONN_CBACK *p_cback) { bta_sys_cb.p_sco_cb = p_cback; } @@ -183,7 +178,7 @@ void bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback) ** Returns void ** *******************************************************************************/ -void bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback) +void bta_sys_pm_register(tBTA_SYS_CONN_CBACK *p_cback) { bta_sys_cb.ppm_cb = p_cback; } @@ -201,15 +196,13 @@ void bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback) *******************************************************************************/ void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.prm_cb) - { + if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); @@ -231,15 +224,13 @@ void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_conn_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.prm_cb) - { + if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); @@ -260,8 +251,7 @@ void bta_sys_conn_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_app_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr); } } @@ -280,8 +270,7 @@ void bta_sys_app_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_app_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr); } } @@ -300,14 +289,12 @@ void bta_sys_app_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) void bta_sys_sco_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { /* AG triggers p_sco_cb by bta_sys_sco_use. */ - if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) - { + if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) { /* without querying BTM_GetNumScoLinks() */ bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr); } } @@ -326,14 +313,12 @@ void bta_sys_sco_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { UINT8 num_sco_links; - if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) - { + if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) { num_sco_links = BTM_GetNumScoLinks(); bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr); } } @@ -353,8 +338,7 @@ void bta_sys_sco_use(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) UNUSED(id); /* AV streaming need to be suspended before SCO is connected. */ - if(bta_sys_cb.p_sco_cb) - { + if (bta_sys_cb.p_sco_cb) { /* without querying BTM_GetNumScoLinks() */ bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); } @@ -375,8 +359,7 @@ void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) UINT8 num_sco_links; UNUSED(id); - if((bta_sys_cb.p_sco_cb)) - { + if ((bta_sys_cb.p_sco_cb)) { num_sco_links = BTM_GetNumScoLinks(); bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); } @@ -394,8 +377,7 @@ void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) #if (BTM_SSR_INCLUDED == TRUE) void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout) { - if(bta_sys_cb.p_ssr_cb) - { + if (bta_sys_cb.p_ssr_cb) { bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout); } } @@ -412,8 +394,7 @@ void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 *******************************************************************************/ void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) { - if(bta_sys_cb.p_policy_cb) - { + if (bta_sys_cb.p_policy_cb) { bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr); } } @@ -430,8 +411,7 @@ void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) { - if(bta_sys_cb.p_policy_cb) - { + if (bta_sys_cb.p_policy_cb) { bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr); } } @@ -448,8 +428,7 @@ void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_set_default_policy (UINT8 id, UINT8 policy) { - if(bta_sys_cb.p_policy_cb) - { + if (bta_sys_cb.p_policy_cb) { bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy, NULL); } } @@ -466,8 +445,7 @@ void bta_sys_set_default_policy (UINT8 id, UINT8 policy) *******************************************************************************/ void bta_sys_clear_default_policy (UINT8 id, UINT8 policy) { - if(bta_sys_cb.p_policy_cb) - { + if (bta_sys_cb.p_policy_cb) { bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy, NULL); } } @@ -485,15 +463,13 @@ void bta_sys_clear_default_policy (UINT8 id, UINT8 policy) void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.prm_cb) - { + if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); } @@ -511,15 +487,13 @@ void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) *******************************************************************************/ void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) { - if(bta_sys_cb.prm_cb) - { + if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); } - if(bta_sys_cb.ppm_cb) - { + if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); @@ -537,7 +511,7 @@ void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) ** Returns void ** *******************************************************************************/ -void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback) +void bta_sys_eir_register(tBTA_SYS_EIR_CBACK *p_cback) { bta_sys_cb.eir_cb = p_cback; } @@ -554,8 +528,7 @@ void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback) *******************************************************************************/ void bta_sys_add_uuid(UINT16 uuid16) { - if(bta_sys_cb.eir_cb) - { + if (bta_sys_cb.eir_cb) { bta_sys_cb.eir_cb(uuid16, TRUE ); } } @@ -572,8 +545,7 @@ void bta_sys_add_uuid(UINT16 uuid16) *******************************************************************************/ void bta_sys_remove_uuid(UINT16 uuid16) { - if(bta_sys_cb.eir_cb) - { + if (bta_sys_cb.eir_cb) { bta_sys_cb.eir_cb(uuid16, FALSE); } } @@ -590,8 +562,9 @@ void bta_sys_remove_uuid(UINT16 uuid16) *******************************************************************************/ BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p) { - if (bta_sys_cb.p_vs_evt_hdlr) + if (bta_sys_cb.p_vs_evt_hdlr) { return (*bta_sys_cb.p_vs_evt_hdlr)(evt, p); + } return FALSE; } diff --git a/components/bt/bluedroid/bta/sys/bta_sys_main.c b/components/bt/bluedroid/bta/sys/bta_sys_main.c old mode 100755 new mode 100644 index 5a9c414f6..ca8e26ad0 --- a/components/bt/bluedroid/bta/sys/bta_sys_main.c +++ b/components/bt/bluedroid/bta/sys/bta_sys_main.c @@ -66,8 +66,7 @@ UINT8 btif_trace_level = BT_TRACE_LEVEL_NONE; extern fixed_queue_t *btu_bta_msg_queue; void btu_bta_alarm_ready(fixed_queue_t *queue); -static const tBTA_SYS_REG bta_sys_hw_reg = -{ +static const tBTA_SYS_REG bta_sys_hw_reg = { bta_sys_sm_execute, NULL }; @@ -77,8 +76,7 @@ static const tBTA_SYS_REG bta_sys_hw_reg = typedef void (*tBTA_SYS_ACTION)(tBTA_SYS_HW_MSG *p_data); /* action function list */ -const tBTA_SYS_ACTION bta_sys_action[] = -{ +const tBTA_SYS_ACTION bta_sys_action[] = { /* device manager local device API events - cf bta_sys.h for events */ bta_sys_hw_api_enable, /* 0 BTA_SYS_HW_API_ENABLE_EVT */ bta_sys_hw_evt_enabled, /* 1 BTA_SYS_HW_EVT_ENABLED_EVT */ @@ -89,8 +87,7 @@ const tBTA_SYS_ACTION bta_sys_action[] = }; /* state machine action enumeration list */ -enum -{ +enum { /* device manager local device API events */ BTA_SYS_HW_API_ENABLE, BTA_SYS_HW_EVT_ENABLED, @@ -110,48 +107,44 @@ enum /* state table for OFF state */ -const UINT8 bta_sys_hw_off[][BTA_SYS_NUM_COLS] = -{ -/* Event Action 1 Action 2 Next State */ -/* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, -/* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, -/* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* API_DISABLE */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, -/* EVT_DISABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, -/* EVT_ERROR */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF} +const UINT8 bta_sys_hw_off[][BTA_SYS_NUM_COLS] = { + /* Event Action 1 Action 2 Next State */ + /* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, + /* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, + /* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* API_DISABLE */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, + /* EVT_DISABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, + /* EVT_ERROR */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF} }; -const UINT8 bta_sys_hw_starting[][BTA_SYS_NUM_COLS] = -{ -/* Event Action 1 Action 2 Next State */ -/* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* wait for completion event */ -/* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, -/* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive disable/enable: change state wait for completion to disable */ -/* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_HW_API_ENABLE, BTA_SYS_HW_STARTING}, /* successive enable/disable: notify, then restart HW */ -/* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON} +const UINT8 bta_sys_hw_starting[][BTA_SYS_NUM_COLS] = { + /* Event Action 1 Action 2 Next State */ + /* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* wait for completion event */ + /* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, + /* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive disable/enable: change state wait for completion to disable */ + /* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_HW_API_ENABLE, BTA_SYS_HW_STARTING}, /* successive enable/disable: notify, then restart HW */ + /* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON} }; -const UINT8 bta_sys_hw_on[][BTA_SYS_NUM_COLS] = -{ -/* Event Action 1 Action 2 Next State */ -/* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* API_DISABLE */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, /* don't change the state here, as some other modules might be active */ -/* EVT_DISABLED */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, -/* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON} +const UINT8 bta_sys_hw_on[][BTA_SYS_NUM_COLS] = { + /* Event Action 1 Action 2 Next State */ + /* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* API_DISABLE */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, /* don't change the state here, as some other modules might be active */ + /* EVT_DISABLED */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, + /* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON} }; -const UINT8 bta_sys_hw_stopping[][BTA_SYS_NUM_COLS] = -{ -/* Event Action 1 Action 2 Next State */ -/* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* change state, and wait for completion event to enable */ -/* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: finish the enable before disabling */ -/* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_HW_API_DISABLE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: notify, then stop */ -/* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* wait for completion event */ -/* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, -/* EVT_ERROR */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING} +const UINT8 bta_sys_hw_stopping[][BTA_SYS_NUM_COLS] = { + /* Event Action 1 Action 2 Next State */ + /* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* change state, and wait for completion event to enable */ + /* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: finish the enable before disabling */ + /* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_HW_API_DISABLE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: notify, then stop */ + /* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* wait for completion event */ + /* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}, + /* EVT_ERROR */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING} }; typedef const UINT8 (*tBTA_SYS_ST_TBL)[BTA_SYS_NUM_COLS]; @@ -177,15 +170,15 @@ const tBTA_SYS_ST_TBL bta_sys_st_tbl[] = { void bta_sys_init(void) { memset(&bta_sys_cb, 0, sizeof(tBTA_SYS_CB)); - + pthread_mutex_init(&bta_alarm_lock, NULL); bta_alarm_hash_map = hash_map_new(BTA_ALARM_HASH_MAP_SIZE, - hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); + hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); btu_bta_alarm_queue = fixed_queue_new(SIZE_MAX); fixed_queue_register_dequeue(btu_bta_alarm_queue, - btu_bta_alarm_ready); + btu_bta_alarm_ready); appl_trace_level = APPL_INITIAL_TRACE_LEVEL; @@ -193,7 +186,7 @@ void bta_sys_init(void) bta_sys_register( BTA_ID_SYS, &bta_sys_hw_reg); /* register for BTM notifications */ - BTM_RegisterForDeviceStatusNotif ((tBTM_DEV_STATUS_CB*)&bta_sys_hw_btm_cback ); + BTM_RegisterForDeviceStatusNotif ((tBTM_DEV_STATUS_CB *)&bta_sys_hw_btm_cback ); #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) bta_ar_init(); @@ -201,7 +194,8 @@ void bta_sys_init(void) } -void bta_sys_free(void) { +void bta_sys_free(void) +{ fixed_queue_free(btu_bta_alarm_queue, NULL); hash_map_free(bta_alarm_hash_map); pthread_mutex_destroy(&bta_alarm_lock); @@ -232,14 +226,10 @@ BOOLEAN bta_sys_sm_execute(BT_HDR *p_msg) bta_sys_cb.state = state_table[p_msg->event & 0x00ff][BTA_SYS_NEXT_STATE]; /* execute action functions */ - for (i = 0; i < BTA_SYS_ACTIONS; i++) - { - if ((action = state_table[p_msg->event & 0x00ff][i]) != BTA_SYS_IGNORE) - { - (*bta_sys_action[action])( (tBTA_SYS_HW_MSG*) p_msg); - } - else - { + for (i = 0; i < BTA_SYS_ACTIONS; i++) { + if ((action = state_table[p_msg->event & 0x00ff][i]) != BTA_SYS_IGNORE) { + (*bta_sys_action[action])( (tBTA_SYS_HW_MSG *) p_msg); + } else { break; } } @@ -250,13 +240,13 @@ BOOLEAN bta_sys_sm_execute(BT_HDR *p_msg) void bta_sys_hw_register( tBTA_SYS_HW_MODULE module, tBTA_SYS_HW_CBACK *cback) { - bta_sys_cb.sys_hw_cback[module]=cback; + bta_sys_cb.sys_hw_cback[module] = cback; } void bta_sys_hw_unregister( tBTA_SYS_HW_MODULE module ) { - bta_sys_cb.sys_hw_cback[module]=NULL; + bta_sys_cb.sys_hw_cback[module] = NULL; } /******************************************************************************* @@ -277,26 +267,21 @@ void bta_sys_hw_btm_cback( tBTM_DEV_STATUS status ) APPL_TRACE_DEBUG(" bta_sys_hw_btm_cback was called with parameter: %i" , status ); /* send a message to BTA SYS */ - if ((sys_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) - { - if (status == BTM_DEV_STATUS_UP) + if ((sys_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) { + if (status == BTM_DEV_STATUS_UP) { sys_event->hdr.event = BTA_SYS_EVT_STACK_ENABLED_EVT; - else if (status == BTM_DEV_STATUS_DOWN) + } else if (status == BTM_DEV_STATUS_DOWN) { sys_event->hdr.event = BTA_SYS_ERROR_EVT; - else - { + } else { /* BTM_DEV_STATUS_CMD_TOUT is ignored for now. */ GKI_freebuf (sys_event); sys_event = NULL; } - if (sys_event) - { + if (sys_event) { bta_sys_sendmsg(sys_event); } - } - else - { + } else { APPL_TRACE_DEBUG("ERROR bta_sys_hw_btm_cback couldn't send msg" ); } } @@ -320,20 +305,19 @@ void bta_sys_hw_error(tBTA_SYS_HW_MSG *p_sys_hw_msg) APPL_TRACE_DEBUG("%s\n", __FUNCTION__); - for (module_index = 0; module_index < BTA_SYS_MAX_HW_MODULES; module_index++) - { - if( bta_sys_cb.sys_hw_module_active & ((UINT32)1 << module_index )) { - switch( module_index) - { - case BTA_SYS_HW_BLUETOOTH: - /* Send BTA_SYS_HW_ERROR_EVT to DM */ - if (bta_sys_cb.sys_hw_cback[module_index] != NULL) - bta_sys_cb.sys_hw_cback[module_index] (BTA_SYS_HW_ERROR_EVT); - break; - default: - /* not yet supported */ - break; + for (module_index = 0; module_index < BTA_SYS_MAX_HW_MODULES; module_index++) { + if ( bta_sys_cb.sys_hw_module_active & ((UINT32)1 << module_index )) { + switch ( module_index) { + case BTA_SYS_HW_BLUETOOTH: + /* Send BTA_SYS_HW_ERROR_EVT to DM */ + if (bta_sys_cb.sys_hw_cback[module_index] != NULL) { + bta_sys_cb.sys_hw_cback[module_index] (BTA_SYS_HW_ERROR_EVT); } + break; + default: + /* not yet supported */ + break; + } } } } @@ -353,32 +337,29 @@ void bta_sys_hw_error(tBTA_SYS_HW_MSG *p_sys_hw_msg) void bta_sys_hw_api_enable( tBTA_SYS_HW_MSG *p_sys_hw_msg ) { - if ((!bta_sys_cb.sys_hw_module_active) && (bta_sys_cb.state != BTA_SYS_HW_ON)) - { + if ((!bta_sys_cb.sys_hw_module_active) && (bta_sys_cb.state != BTA_SYS_HW_ON)) { /* register which HW module was turned on */ bta_sys_cb.sys_hw_module_active |= ((UINT32)1 << p_sys_hw_msg->hw_module ); tBTA_SYS_HW_MSG *p_msg; - if ((p_msg = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) - { + if ((p_msg = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) { p_msg->hdr.event = BTA_SYS_EVT_ENABLED_EVT; p_msg->hw_module = p_sys_hw_msg->hw_module; bta_sys_sendmsg(p_msg); } - } - else - { + } else { /* register which HW module was turned on */ bta_sys_cb.sys_hw_module_active |= ((UINT32)1 << p_sys_hw_msg->hw_module ); /* HW already in use, so directly notify the caller */ - if (bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]!= NULL ) + if (bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ] != NULL ) { bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]( BTA_SYS_HW_ON_EVT ); + } } APPL_TRACE_EVENT ("bta_sys_hw_api_enable for %d, active modules 0x%04X\n", - p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active); + p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active); } @@ -395,7 +376,7 @@ void bta_sys_hw_api_enable( tBTA_SYS_HW_MSG *p_sys_hw_msg ) void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg) { APPL_TRACE_DEBUG("bta_sys_hw_api_disable for %d, active modules: 0x%04X\n", - p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active ); + p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active ); /* make sure the related SW blocks were stopped */ bta_sys_disable( p_sys_hw_msg->hw_module ); @@ -406,20 +387,17 @@ void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg) /* if there are still some SW modules using the HW, just provide an answer to the calling */ - if( bta_sys_cb.sys_hw_module_active != 0 ) - { + if ( bta_sys_cb.sys_hw_module_active != 0 ) { /* if there are still some SW modules using the HW, directly notify the caller */ - if( bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]!= NULL ) + if ( bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ] != NULL ) { bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]( BTA_SYS_HW_OFF_EVT ); - } - else - { + } + } else { /* manually update the state of our system */ bta_sys_cb.state = BTA_SYS_HW_STOPPING; tBTA_SYS_HW_MSG *p_msg; - if ((p_msg = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) - { + if ((p_msg = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) { p_msg->hdr.event = BTA_SYS_EVT_DISABLED_EVT; p_msg->hw_module = p_sys_hw_msg->hw_module; @@ -463,10 +441,10 @@ void bta_sys_hw_evt_disabled(tBTA_SYS_HW_MSG *p_sys_hw_msg) APPL_TRACE_DEBUG("bta_sys_hw_evt_disabled - module 0x%X\n", p_sys_hw_msg->hw_module); - for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++) - { - if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) + for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++) { + if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) { bta_sys_cb.sys_hw_cback[hw_module_index] (BTA_SYS_HW_OFF_EVT); + } } } @@ -487,10 +465,10 @@ void bta_sys_hw_evt_stack_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg) APPL_TRACE_DEBUG(" bta_sys_hw_evt_stack_enabled!notify the callers\n"); - for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++ ) - { - if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) + for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++ ) { + if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) { bta_sys_cb.sys_hw_cback[hw_module_index] (BTA_SYS_HW_ON_EVT); + } } } @@ -518,17 +496,13 @@ void bta_sys_event(BT_HDR *p_msg) id = (UINT8) (p_msg->event >> 8); /* verify id and call subsystem event handler */ - if ((id < BTA_ID_MAX) && (bta_sys_cb.reg[id] != NULL)) - { + if ((id < BTA_ID_MAX) && (bta_sys_cb.reg[id] != NULL)) { freebuf = (*bta_sys_cb.reg[id]->evt_hdlr)(p_msg); - } - else - { + } else { APPL_TRACE_WARNING("BTA got unregistered event id %d\n", id); } - if (freebuf) - { + if (freebuf) { GKI_freebuf(p_msg); } @@ -618,40 +592,42 @@ void bta_sys_sendmsg(void *p_msg) ** Returns void ** *******************************************************************************/ -void bta_alarm_cb(void *data) { - assert(data != NULL); - TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; +void bta_alarm_cb(void *data) +{ + assert(data != NULL); + TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; - fixed_queue_enqueue(btu_bta_alarm_queue, p_tle); + fixed_queue_enqueue(btu_bta_alarm_queue, p_tle); } -void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms) { - assert(p_tle != NULL); +void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms) +{ + assert(p_tle != NULL); - // Get the alarm for this p_tle. - pthread_mutex_lock(&bta_alarm_lock); - if (!hash_map_has_key(bta_alarm_hash_map, p_tle)) { - hash_map_set(bta_alarm_hash_map, p_tle, osi_alarm_new("bta_sys", bta_alarm_cb, p_tle, 0, false)); - } - pthread_mutex_unlock(&bta_alarm_lock); + // Get the alarm for this p_tle. + pthread_mutex_lock(&bta_alarm_lock); + if (!hash_map_has_key(bta_alarm_hash_map, p_tle)) { + hash_map_set(bta_alarm_hash_map, p_tle, osi_alarm_new("bta_sys", bta_alarm_cb, p_tle, 0, false)); + } + pthread_mutex_unlock(&bta_alarm_lock); - osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_ERROR("%s unable to create alarm.", __func__); - return; - } + osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_ERROR("%s unable to create alarm.", __func__); + return; + } - p_tle->event = type; - p_tle->ticks = timeout_ms; - //osi_alarm_set(alarm, (period_ms_t)timeout_ms, bta_alarm_cb, p_tle); - osi_alarm_set(alarm, (period_ms_t)timeout_ms); + p_tle->event = type; + p_tle->ticks = timeout_ms; + //osi_alarm_set(alarm, (period_ms_t)timeout_ms, bta_alarm_cb, p_tle); + osi_alarm_set(alarm, (period_ms_t)timeout_ms); } bool hash_iter_ro_cb(hash_map_entry_t *hash_map_entry, void *context) { - osi_alarm_t *alarm = (osi_alarm_t *)hash_map_entry->data; - period_ms_t *p_remaining_ms = (period_ms_t*)context; - *p_remaining_ms +=osi_alarm_get_remaining_ms(alarm); + osi_alarm_t *alarm = (osi_alarm_t *)hash_map_entry->data; + period_ms_t *p_remaining_ms = (period_ms_t *)context; + *p_remaining_ms += osi_alarm_get_remaining_ms(alarm); return true; } @@ -675,15 +651,16 @@ UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle) ** Returns void ** *******************************************************************************/ -void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle) { - assert(p_tle != NULL); +void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); - osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_DEBUG("%s expected alarm was not in bta alarm hash map.", __func__); - return; - } - osi_alarm_cancel(alarm); + osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_DEBUG("%s expected alarm was not in bta alarm hash map.", __func__); + return; + } + osi_alarm_cancel(alarm); } /******************************************************************************* @@ -702,23 +679,19 @@ void bta_sys_disable(tBTA_SYS_HW_MODULE module) APPL_TRACE_DEBUG("bta_sys_disable: module %i", module); - switch( module ) - { - case BTA_SYS_HW_BLUETOOTH: - bta_id = BTA_ID_DM; - bta_id_max = BTA_ID_BLUETOOTH_MAX; - break; - default: - APPL_TRACE_WARNING("bta_sys_disable: unkown module"); - return; + switch ( module ) { + case BTA_SYS_HW_BLUETOOTH: + bta_id = BTA_ID_DM; + bta_id_max = BTA_ID_BLUETOOTH_MAX; + break; + default: + APPL_TRACE_WARNING("bta_sys_disable: unkown module"); + return; } - for ( ; bta_id <= bta_id_max; bta_id++) - { - if (bta_sys_cb.reg[bta_id] != NULL) - { - if (bta_sys_cb.is_reg[bta_id] == TRUE && bta_sys_cb.reg[bta_id]->disable != NULL) - { + for ( ; bta_id <= bta_id_max; bta_id++) { + if (bta_sys_cb.reg[bta_id] != NULL) { + if (bta_sys_cb.is_reg[bta_id] == TRUE && bta_sys_cb.reg[bta_id]->disable != NULL) { (*bta_sys_cb.reg[bta_id]->disable)(); } } diff --git a/components/bt/bluedroid/bta/sys/include/bta_sys_int.h b/components/bt/bluedroid/bta/sys/include/bta_sys_int.h old mode 100755 new mode 100644 index e9c192988..aa2596d96 --- a/components/bt/bluedroid/bta/sys/include/bta_sys_int.h +++ b/components/bt/bluedroid/bta/sys/include/bta_sys_int.h @@ -33,8 +33,7 @@ *****************************************************************************/ /* SYS HW state */ -enum -{ +enum { BTA_SYS_HW_OFF, BTA_SYS_HW_STARTING, BTA_SYS_HW_ON, @@ -45,15 +44,13 @@ typedef UINT8 tBTA_SYS_HW_STATE; /* Collision callback */ #define MAX_COLLISION_REG 5 -typedef struct -{ +typedef struct { UINT8 id[MAX_COLLISION_REG]; tBTA_SYS_CONN_CBACK *p_coll_cback[MAX_COLLISION_REG]; } tBTA_SYS_COLLISION; /* system manager control block */ -typedef struct -{ +typedef struct { tBTA_SYS_REG *reg[BTA_ID_MAX]; /* registration structures */ BOOLEAN is_reg[BTA_ID_MAX]; /* registration structures */ tBTA_SYS_HW_STATE state; diff --git a/components/bt/bluedroid/bta/sys/utl.c b/components/bt/bluedroid/bta/sys/utl.c old mode 100755 new mode 100644 index 064992492..6cc6728df --- a/components/bt/bluedroid/bta/sys/utl.c +++ b/components/bt/bluedroid/bta/sys/utl.c @@ -43,24 +43,26 @@ INT16 utl_str2int(const char *p_s) { INT32 val = 0; - for (;*p_s == ' ' && *p_s != 0; p_s++); + for (; *p_s == ' ' && *p_s != 0; p_s++); - if (*p_s == 0) return -1; + if (*p_s == 0) { + return -1; + } - for (;;) - { - if ((*p_s < '0') || (*p_s > '9')) return -1; + for (;;) { + if ((*p_s < '0') || (*p_s > '9')) { + return -1; + } val += (INT32) (*p_s++ - '0'); - if (val > 32767) return -1; - - if (*p_s == 0) - { - return (INT16) val; + if (val > 32767) { + return -1; } - else - { + + if (*p_s == 0) { + return (INT16) val; + } else { val *= 10; } } @@ -83,26 +85,21 @@ int utl_strucmp(const char *p_s, const char *p_t) { char c; - while (*p_s && *p_t) - { + while (*p_s && *p_t) { c = *p_t++; - if (c >= 'a' && c <= 'z') - { + if (c >= 'a' && c <= 'z') { c -= 0x20; } - if (*p_s++ != c) - { + if (*p_s++ != c) { return -1; } } /* if p_t hit null first, no match */ - if (*p_t == 0 && *p_s != 0) - { + if (*p_t == 0 && *p_s != 0) { return 1; } /* else p_s hit null first, count as match */ - else - { + else { return 0; } } @@ -125,21 +122,16 @@ UINT8 utl_itoa(UINT16 i, char *p_s) char *p = p_s; BOOLEAN fill = FALSE; - if (i == 0) - { + if (i == 0) { /* take care of zero case */ *p++ = '0'; - } - else - { - for(j = 10000; j > 0; j /= 10) - { + } else { + for (j = 10000; j > 0; j /= 10) { k = i / j; i %= j; - if (k > 0 || fill) - { - *p++ = k + '0'; - fill = TRUE; + if (k > 0 || fill) { + *p++ = k + '0'; + fill = TRUE; } } } @@ -161,8 +153,7 @@ UINT8 utl_itoa(UINT16 i, char *p_s) *******************************************************************************/ void utl_freebuf(void **p) { - if (*p != NULL) - { + if (*p != NULL) { GKI_freebuf(*p); *p = NULL; } @@ -200,8 +191,7 @@ BOOLEAN utl_set_device_class(tBTA_UTL_COD *p_cod, UINT8 cmd) BTM_COD_MINOR_CLASS(minor, dev ); BTM_COD_MAJOR_CLASS(major, dev ); - switch(cmd) - { + switch (cmd) { case BTA_UTL_SET_COD_MAJOR_MINOR: minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK; major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK; @@ -238,8 +228,9 @@ BOOLEAN utl_set_device_class(tBTA_UTL_COD *p_cod, UINT8 cmd) /* convert the fields into the device class type */ FIELDS_TO_COD(dev_class, minor, major, service); - if (BTM_SetDeviceClass(dev_class) == BTM_SUCCESS) + if (BTM_SetDeviceClass(dev_class) == BTM_SUCCESS) { return TRUE; + } return FALSE; } @@ -259,10 +250,10 @@ BOOLEAN utl_isintstr(const char *p_s) { UINT16 i = 0; - for(i=0; p_s[i] != 0; i++) - { - if(((p_s[i] < '0') || (p_s[i] > '9')) && (p_s[i] != ';')) + for (i = 0; p_s[i] != 0; i++) { + if (((p_s[i] < '0') || (p_s[i] > '9')) && (p_s[i] != ';')) { return FALSE; + } } return TRUE; @@ -283,14 +274,14 @@ BOOLEAN utl_isdialstr(const char *p_s) { UINT16 i = 0; - for(i=0; p_s[i] != 0; i++) - { - if(!(((p_s[i] >= '0') && (p_s[i] <= '9')) - || (p_s[i] == '*') || (p_s[i] == '+') || (p_s[i] == '#') || (p_s[i] == ';') - || ((p_s[i] >= 'A') && (p_s[i] <= 'C')) - || ((p_s[i] == 'p') || (p_s[i] == 'P') - || (p_s[i] == 'w') || (p_s[i] == 'W')))) + for (i = 0; p_s[i] != 0; i++) { + if (!(((p_s[i] >= '0') && (p_s[i] <= '9')) + || (p_s[i] == '*') || (p_s[i] == '+') || (p_s[i] == '#') || (p_s[i] == ';') + || ((p_s[i] >= 'A') && (p_s[i] <= 'C')) + || ((p_s[i] == 'p') || (p_s[i] == 'P') + || (p_s[i] == 'w') || (p_s[i] == 'W')))) { return FALSE; + } } return TRUE; diff --git a/components/bt/bluedroid/btc/core/btc_main.c b/components/bt/bluedroid/btc/core/btc_main.c new file mode 100644 index 000000000..2ca4b5b39 --- /dev/null +++ b/components/bt/bluedroid/btc/core/btc_main.c @@ -0,0 +1,91 @@ +// Copyright 2015-2016 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. + +#include "btc_task.h" +#include "btc_main.h" +#include "future.h" +#include "esp_err.h" + +static future_t *main_future[BTC_MAIN_FUTURE_NUM]; + +extern int bte_main_boot_entry(void *cb); +extern int bte_main_shutdown(void); + +future_t **btc_main_get_future_p(btc_main_future_type_t type) +{ + return &main_future[type]; +} + +static void btc_sec_callback(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data) +{ + switch (event) { + case BTA_DM_ENABLE_EVT: + future_ready(*btc_main_get_future_p(BTC_MAIN_ENABLE_FUTURE), FUTURE_SUCCESS); + break; + case BTA_DM_DISABLE_EVT: + future_ready(*btc_main_get_future_p(BTC_MAIN_DISABLE_FUTURE), FUTURE_SUCCESS); + break; + } +} + +static bt_status_t btc_enable_bluetooth(void) +{ + BTA_EnableBluetooth(btc_sec_callback); +} + +static bt_status_t btc_disable_bluetooth(void) +{ + BTA_DisableBluetooth(); +} + +void btc_init_callback(void) +{ + future_ready(*btc_main_get_future_p(BTC_MAIN_INIT_FUTURE), FUTURE_SUCCESS); +} + +static bt_status_t btc_init_bluetooth(void) +{ + bte_main_boot_entry(btc_init_callback); +} + + +static void btc_deinit_bluetooth(void) +{ + bte_main_shutdown(); + future_ready(*btc_main_get_future_p(BTC_MAIN_DEINIT_FUTURE), FUTURE_SUCCESS); +} + +void btc_main_call_handler(btc_msg_t *msg) +{ + LOG_DEBUG("%s act %d\n", __func__, msg->act); + + switch (msg->act) { + case BTC_MAIN_ACT_INIT: + btc_init_bluetooth(); + break; + case BTC_MAIN_ACT_DEINIT: + btc_deinit_bluetooth(); + break; + case BTC_MAIN_ACT_ENABLE: + btc_enable_bluetooth(); + break; + case BTC_MAIN_ACT_DISABLE: + btc_disable_bluetooth(); + break; + default: + LOG_ERROR("%s UNKNOWN ACT %d\n", __func__, msg->act); + break; + } +} + diff --git a/components/bt/bluedroid/btc/core/btc_manage.c b/components/bt/bluedroid/btc/core/btc_manage.c new file mode 100644 index 000000000..46d20dc2d --- /dev/null +++ b/components/bt/bluedroid/btc/core/btc_manage.c @@ -0,0 +1,54 @@ +// Copyright 2015-2016 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. + + +#include "btc_task.h" +#include "bt_trace.h" +#include "thread.h" +#include "gki.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" + +static esp_profile_cb_t btc_profile_cb_tab[BTC_PID_NUM] = {}; + +void esp_profile_cb_reset(void) +{ + int i; + + for (i = 0; i < BTC_PID_NUM; i++) { + btc_profile_cb_tab[i] = NULL; + } +} + +int btc_profile_cb_set(btc_pid_t profile_id, esp_profile_cb_t cb) +{ + if (profile_id < 0 || profile_id >= BTC_PID_NUM) { + return -1; + } + + btc_profile_cb_tab[profile_id] = cb; + + return 0; +} + +esp_profile_cb_t btc_profile_cb_get(btc_pid_t profile_id) +{ + if (profile_id < 0 || profile_id >= BTC_PID_NUM) { + return NULL; + } + + return btc_profile_cb_tab[profile_id]; +} + + diff --git a/components/nvs_flash/test/sdkconfig.h b/components/bt/bluedroid/btc/core/btc_sec.c similarity index 100% rename from components/nvs_flash/test/sdkconfig.h rename to components/bt/bluedroid/btc/core/btc_sec.c diff --git a/components/bt/bluedroid/btc/core/btc_task.c b/components/bt/bluedroid/btc/core/btc_task.c new file mode 100644 index 000000000..842fdd10f --- /dev/null +++ b/components/bt/bluedroid/btc/core/btc_task.c @@ -0,0 +1,137 @@ +// Copyright 2015-2016 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. + +#include +#include +#include "btc_task.h" +#include "bt_trace.h" +#include "thread.h" +#include "gki.h" +#include "bt_defs.h" +#include "btc_main.h" +#include "btc_gatts.h" +#include "btc_gattc.h" +#include "btc_gap_ble.h" +#include "btc_blufi_prf.h" +#include "bta_gatt_api.h" + + +static xTaskHandle xBtcTaskHandle = NULL; +static xQueueHandle xBtcQueue = 0; + +static btc_func_t profile_tab[BTC_PID_NUM] = { + [BTC_PID_MAIN_INIT] = {btc_main_call_handler, NULL }, + [BTC_PID_GATTS] = {btc_gatts_call_handler, btc_gatts_cb_handler }, + [BTC_PID_GATTC] = {btc_gattc_call_handler, btc_gattc_cb_handler }, + [BTC_PID_GAP_BLE] = {btc_gap_ble_call_handler, btc_gap_ble_cb_handler }, + [BTC_PID_GAP_BT] = {NULL, NULL}, // {btc_gap_bt_call_handler, btc_gap_bt_cb_handler }, + [BTC_PID_SDP] = {NULL, NULL}, + [BTC_PID_BLE_HID] = {NULL, NULL}, + [BTC_PID_BT_HID] = {NULL, NULL}, + [BTC_PID_SPP] = {NULL, NULL}, + [BTC_PID_SPPLIKE] = {NULL, NULL}, + [BTC_PID_BLUFI] = {btc_blufi_call_handler, btc_blufi_cb_handler }, +}; + +/***************************************************************************** +** +** Function btc_task +** +** Description Process profile Task Thread. +******************************************************************************/ +static void btc_task(void *arg) +{ + btc_msg_t msg; + + for (;;) { + if (pdTRUE == xQueueReceive(xBtcQueue, &msg, (portTickType)portMAX_DELAY)) { + LOG_DEBUG("%s msg %u %u %u %08x\n", __func__, msg.sig, msg.pid, msg.act, msg.arg); + switch (msg.sig) { + case BTC_SIG_API_CALL: + profile_tab[msg.pid].btc_call(&msg); + break; + case BTC_SIG_API_CB: + profile_tab[msg.pid].btc_cb(&msg); + break; + default: + break; + } + if (msg.arg) { + GKI_freebuf(msg.arg); + } + } + } +} + +static bt_status_t btc_task_post(btc_msg_t *msg) +{ + if (msg == NULL) { + return BT_STATUS_PARM_INVALID; + } + + if (xQueueSend(xBtcQueue, msg, 10 / portTICK_RATE_MS) != pdTRUE) { + LOG_ERROR("Btc Post failed\n"); + return BT_STATUS_BUSY; + } + + return BT_STATUS_SUCCESS; +} + +bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg_deep_copy_t copy_func) +{ + btc_msg_t lmsg; + + if (msg == NULL) { + return BT_STATUS_PARM_INVALID; + } + + LOG_DEBUG("%s msg %u %u %u %p\n", __func__, msg->sig, msg->pid, msg->act, arg); + + memcpy(&lmsg, msg, sizeof(btc_msg_t)); + if (arg) { + lmsg.arg = (void *)GKI_getbuf(arg_len); + memset(lmsg.arg, 0x00, arg_len); //important, avoid arg which have no length + if (lmsg.arg == NULL) { + return BT_STATUS_NOMEM; + } + memcpy(lmsg.arg, arg, arg_len); + if (copy_func) { + copy_func(&lmsg, lmsg.arg, arg); + } + } else { + lmsg.arg = NULL; + } + + return btc_task_post(&lmsg); +} + + +int btc_init(void) +{ + xBtcQueue = xQueueCreate(BTC_TASK_QUEUE_NUM, sizeof(btc_msg_t)); + xTaskCreate(btc_task, "Btc_task", BTC_TASK_STACK_SIZE, NULL, BTC_TASK_PRIO, &xBtcTaskHandle); + + /* TODO: initial the profile_tab */ + + return BT_STATUS_SUCCESS; +} + +void btc_deinit(void) +{ + vTaskDelete(xBtcTaskHandle); + vQueueDelete(xBtcQueue); + + xBtcTaskHandle = NULL; + xBtcQueue = 0; +} diff --git a/components/bt/bluedroid/btc/include/btc_main.h b/components/bt/bluedroid/btc/include/btc_main.h new file mode 100644 index 000000000..b95ae0bbe --- /dev/null +++ b/components/bt/bluedroid/btc/include/btc_main.h @@ -0,0 +1,64 @@ +// Copyright 2015-2016 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 __BTC_BT_MAIN_H__ +#define __BTC_BT_MAIN_H__ + +#include "future.h" +#include "bt_types.h" +#include "bta_api.h" +#include "btc_main.h" +#include "btc_task.h" + +typedef enum { + BTC_MAIN_ACT_INIT = 0, + BTC_MAIN_ACT_DEINIT, + BTC_MAIN_ACT_ENABLE, + BTC_MAIN_ACT_DISABLE, +} btc_main_act_t; + +typedef enum { + BTC_MAIN_INIT_FUTURE = 0, + BTC_MAIN_DEINIT_FUTURE, + BTC_MAIN_ENABLE_FUTURE, + BTC_MAIN_DISABLE_FUTURE, + BTC_MAIN_FUTURE_NUM, +} btc_main_future_type_t; + +future_t **btc_main_get_future_p(btc_main_future_type_t type); + +#if 0 +typedef union { + struct btc_main_init_args { + future_t *future; + } init; + struct btc_main_deinit_args { + future_t *future; + } deinit; + struct btc_main_init_args { + future_t *future; + } enable; + struct btc_main_init_args { + future_t *future; + } disable; +} btc_main_args_t; + +bt_status_t btc_enable_bluetooth(future_t *future); +void btc_disable_bluetooth(future_t *future); +bt_status_t btc_init_bluetooth(future_t *future); +void btc_deinit_bluetooth(future_t *future); +#endif + +void btc_main_call_handler(btc_msg_t *msg); +#endif /* __BTC_BT_MAIN_H__ */ diff --git a/components/bt/bluedroid/btc/include/btc_manage.h b/components/bt/bluedroid/btc/include/btc_manage.h new file mode 100644 index 000000000..e8591caa8 --- /dev/null +++ b/components/bt/bluedroid/btc/include/btc_manage.h @@ -0,0 +1,28 @@ +// Copyright 2015-2016 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 __BTC_MANAGE_H__ +#define __BTC_MANAGE_H__ + +#include "bta_api.h" +#include "btc_task.h" +#include "esp_bt_defs.h" + +/* reset gatt callback table */ +void esp_profile_cb_reset(void); + +int btc_profile_cb_set(btc_pid_t profile_id, esp_profile_cb_t cb); +esp_profile_cb_t btc_profile_cb_get(btc_pid_t profile_id); + +#endif /* __BTC_MANAGE_H__ */ diff --git a/components/bt/bluedroid/btc/include/btc_task.h b/components/bt/bluedroid/btc/include/btc_task.h new file mode 100644 index 000000000..923b8b84e --- /dev/null +++ b/components/bt/bluedroid/btc/include/btc_task.h @@ -0,0 +1,67 @@ +// Copyright 2015-2016 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 __BTC_TASK_H__ +#define __BTC_TASK_H__ + +#include +#include "bt_defs.h" + +#define BTC_TASK_QUEUE_NUM 20 +#define BTC_TASK_STACK_SIZE 4096 +#define BTC_TASK_NAME "btcT" +#define BTC_TASK_PRIO (configMAX_PRIORITIES - 5) + +typedef struct btc_msg { + uint8_t sig; //event signal + uint8_t aid; //application id + uint8_t pid; //profile id + uint8_t act; //profile action, defined in seprerate header files + void *arg; //param for btc function or function param +} btc_msg_t; + +typedef enum { + BTC_SIG_API_CALL = 0, // APP TO STACK + BTC_SIG_API_CB, // STACK TO APP + BTC_SIG_NUM, +} btc_sig_t; //btc message type + +typedef enum { + BTC_PID_MAIN_INIT = 0, + BTC_PID_GATTS, + BTC_PID_GATTC, + BTC_PID_GAP_BLE, + BTC_PID_GAP_BT, + BTC_PID_SDP, + BTC_PID_BLE_HID, + BTC_PID_BT_HID, + BTC_PID_SPP, + BTC_PID_SPPLIKE, + BTC_PID_BLUFI, + BTC_PID_NUM, +} btc_pid_t; //btc profile id + +typedef struct { + void (* btc_call)(btc_msg_t *msg); + void (* btc_cb)(btc_msg_t *msg); +} btc_func_t; + +typedef void (* btc_arg_deep_copy_t)(btc_msg_t *msg, void *dst, void *src); + +bt_status_t btc_transfer_context(btc_msg_t *msg, void *arg, int arg_len, btc_arg_deep_copy_t copy_func); + +int btc_init(void); +void btc_deinit(void); + +#endif /* __BTC_TASK_H__ */ diff --git a/components/bt/bluedroid/btc/profile/esp/ble_button/button_pro.c b/components/bt/bluedroid/btc/profile/esp/ble_button/button_pro.c new file mode 100644 index 000000000..74d496c3e --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/ble_button/button_pro.c @@ -0,0 +1,342 @@ +// Copyright 2015-2016 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. + +#include + +#include +#include +#include + + +#include "bt_target.h" +#include "bt_trace.h" +#include "bt_types.h" +#include "gatt_api.h" +#include "bta_api.h" +#include "bta_gatt_api.h" +#include "bta_gatts_int.h" +#include "button_pro.h" + +#include "prf_defs.h" + +#if (BUT_PROFILE_CFG) + + +#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) + +button_env_cb_t button_cb_env; + + + + +/***************************************************************************** +** Constants +*****************************************************************************/ +static void button_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); + + +/******************************************************************************* +** +** Function button_profile_cb +** +** Description the callback function after the profile has been register to the BTA manager module +** +** Returns NULL +** +*******************************************************************************/ +static void button_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) +{ + esp_gatts_rsp_t rsp; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; + but_inst_t *p_inst = &button_cb_env.button_inst; + uint8_t net_event = 0xff; + uint8_t len = 0; + uint8_t *p_rec_data = NULL; + //LOG_ERROR("p_data->status = %x\n",p_data->status); + //if(p_data->status != BTA_GATT_OK){ + // LOG_ERROR("button profile register failed\n"); + // return; + //} + LOG_ERROR("button profile cb event = %x\n", event); + switch (event) { + case ESP_GATTS_REG_EVT: + + LOG_ERROR("p_data->reg_oper.status = %x\n", p_data->reg_oper.status); + LOG_ERROR("(p_data->reg_oper.uuid.uu.uuid16=%x\n", p_data->reg_oper.uuid.uu.uuid16); + if (p_data->reg_oper.status != BTA_GATT_OK) { + LOG_ERROR("button profile register failed\n"); + } + button_cb_env.gatt_if = p_data->reg_oper.server_if; + button_cb_env.enabled = true; + //button_cb_env.button_inst.app_id = p_data->reg_oper.uuid; + //create the button service to the service data base. + if (p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_BUTTON) { + Button_CreateService(); + } + break; + case ESP_GATTS_READ_EVT: + //tBTA_GATTS_RSP rsp; + memset(&rsp, 0, sizeof(tBTA_GATTS_API_RSP)); + rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; + rsp.attr_value.len = 2; + esp_ble_gatts_send_rsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, &rsp); + break; + case ESP_GATTS_WRITE_EVT: + esp_ble_gatts_send_rsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, NULL); + LOG_ERROR("Received button data:"); + for (int i = 0; i < p_data->req_data.p_data->write_req.len; i++) { + LOG_ERROR("%x", p_data->req_data.p_data->write_req.value[i]); + } + LOG_ERROR("\n"); + if (p_data->req_data.p_data->write_req.handle == button_cb_env.button_inst.but_wirt_hdl) { + + p_rec_data = &p_data->req_data.p_data->write_req.value[0]; + // button_msg_notify(len,p_rec_data); + (*p_inst->p_cback)(button_cb_env.button_inst.app_id, net_event, len, p_rec_data); + + } + break; + case ESP_GATTS_CFM_EVT: + + break; + case ESP_GATTS_CREATE_EVT: + //tBT_UUID uuid_butt_write; + uuid.uu.uuid16 = ATT_CHAR_BUTTON_WIT; + //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_READ); + //tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE); + //uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; + button_cb_env.clcb.cur_srvc_id = p_data->create.service_id; + button_cb_env.is_primery = p_data->create.is_primary; + //uuid = {LEN_UUID_16, {ATT_CHAR_BUTTON_WIT}}; + //start the button service after created + esp_ble_gatts_start_srvc(p_data->create.service_id); + //add the frist button characteristic --> write characteristic + esp_ble_gatts_add_char(button_cb_env.clcb.cur_srvc_id, &uuid, + (GATT_PERM_WRITE | GATT_PERM_READ), + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE)); + break; + + case ESP_GATTS_ADD_CHAR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_BUTTON_WIT) { + uuid.uu.uuid16 = ATT_CHAR_BUTTON_NTF; + //tBTA_GATT_PERM perm = GATT_PERM_READ; + tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_NOTIFY); + //save the att handle to the env + button_cb_env.button_inst.but_wirt_hdl = p_data->add_result.attr_id; + //add the frist button characteristic --> Notify characteristic + esp_ble_gatts_add_char(button_cb_env.clcb.cur_srvc_id, &uuid, + GATT_PERM_READ, (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_NOTIFY)); + } else if (p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_BUTTON_NTF) { // add the gattc config descriptor to the notify charateristic + //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); + uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + button_cb_env.button_inst.but_ntf_hdl = p_data->add_result.attr_id; + esp_ble_gatts_add_char_descr (button_cb_env.clcb.cur_srvc_id, + (GATT_PERM_WRITE | GATT_PERM_WRITE), + &uuid); + } + + break; + case ESP_GATTS_ADD_CHAR_DESCR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { + button_cb_env.button_inst.but_cfg_hdl = p_data->add_result.attr_id; + } + ///Start advertising + LOG_ERROR("\n*******Start sent the ADV.*************\n"); + //esp_ble_start_advertising (&adv_params); + //BTA_GATTS_Listen(button_cb_env.gatt_if, true, NULL); + break; + case ESP_GATTS_CONNECT_EVT: + LOG_ERROR("############BUTTON CONNCET EVT################\n"); + //esp_ble_stop_advertising(); + //set the connection flag to true + button_env_clcb_alloc(p_data->conn.conn_id, p_data->conn.remote_bda); + break; + case ESP_GATTS_DISCONNECT_EVT: + //set the connection flag to true + button_cb_env.clcb.connected = false; + break; + case ESP_GATTS_OPEN_EVT: + ///stop the advertising after connected + + break; + case ESP_GATTS_CLOSE_EVT: + if (button_cb_env.clcb.connected && (button_cb_env.clcb.conn_id == p_data->conn.conn_id)) { + //set the connection channal congested flag to true + button_cb_env.clcb.congest = p_data->congest.congested; + } + break; + case ESP_GATTS_CONGEST_EVT: + break; + default: + break; + } +} + + +/******************************************************************************* +** +** Function Button_CreateService +** +** Description Create a Service for the button profile +** +** Returns NULL +** +*******************************************************************************/ +void Button_CreateService(void) +{ + esp_gatts_if_t server_if ; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; + uint16_t num_handle = KEY_IDX_NB; + uint8_t inst = 0x00; + server_if = button_cb_env.gatt_if; + button_cb_env.inst_id = inst; + //if(!button_cb_env.enabled) + //{ + // LOG_ERROR("button service added error."); + //} + esp_ble_gatts_create_srvc(server_if, &uuid, inst, num_handle, true); + +} + +/******************************************************************************* +** +** Function button_env_clcb_alloc +** +** Description The function allocates a GATT profile connection link control block +** +** Returns NULL if not found. Otherwise pointer to the connection link block. +** +*******************************************************************************/ +but_clcb_t *button_env_clcb_alloc (uint16_t conn_id, BD_ADDR remote_bda) +{ + but_clcb_t *p_clcb = NULL; + p_clcb = &button_cb_env.clcb; + + if (!p_clcb->in_use) { + p_clcb->in_use = TRUE; + p_clcb->conn_id = conn_id; + LOG_ERROR("p_clcb->conn_id = %x\n", conn_id); + p_clcb->connected = TRUE; + memcpy(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN); + } + + return p_clcb; +} + +/******************************************************************************* +** +** Function button_env_find_conn_id_by_bd_adddr +** +** Description The function searches all LCB with macthing bd address +** +** Returns total number of clcb found. +** +*******************************************************************************/ +uint16_t button_env_find_conn_id_by_bd_adddr(BD_ADDR remote_bda) +{ + uint8_t i_clcb; + but_clcb_t *p_clcb = NULL; + + for (i_clcb = 0, p_clcb = &button_cb_env.clcb; i_clcb < BUTT_MAX_APPS; i_clcb++, p_clcb++) { + if (p_clcb->in_use && p_clcb->connected && memcmp(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN)) { + return p_clcb->conn_id; + } + } + + return GATT_INVALID_CONN_ID; +} + +/******************************************************************************* +** +** Function button_env_clcb_dealloc +** +** Description The function deallocates a GATT profile connection link control block +** +** Returns True the deallocation is successful +** +*******************************************************************************/ + +BOOLEAN button_env_clcb_dealloc(uint16_t conn_id) +{ + uint16_t i_clcb = 0; + but_clcb_t *p_clcb = NULL; + + for (i_clcb = 0, p_clcb = &button_cb_env.clcb; i_clcb < 1; i_clcb++, p_clcb++) { + if (p_clcb->in_use && p_clcb->connected && (p_clcb->conn_id == conn_id)) { + memset(p_clcb, 0, sizeof(but_clcb_t)); + return TRUE; + } + } + + return FALSE; +} + +/******************************************************************************* +** +** Function button_init +** +** Description Initializa the GATT Service for button profiles. +** +*******************************************************************************/ +esp_gatt_status_t button_init (but_prf_cb_t call_back) +{ + tBT_UUID app_uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; + + LOG_ERROR("\n=============================button_init==============================================\n"); + if (button_cb_env.enabled) { + LOG_ERROR("button svc already initaliezd\n"); + return ESP_GATT_ERROR; + } else { + memset(&button_cb_env, 0, sizeof(button_env_cb_t)); + } + + + if (call_back != NULL) { + button_cb_env.button_inst.p_cback = call_back; + } + + + /* register the button profile to the BTA_GATTS module*/ + esp_ble_gatts_app_register(&app_uuid, button_profile_cb); + + button_cb_env.enabled = TRUE; + + return ESP_GATT_OK; +} + +void button_disable(uint16_t connid) +{ + button_env_clcb_dealloc(connid); +} + + +void button_msg_notify(uint16_t len, uint8_t *button_msg) +{ + BOOLEAN conn_status = button_cb_env.clcb.connected; + uint16_t conn_id = button_cb_env.clcb.conn_id; + uint16_t attr_id = button_cb_env.button_inst.but_ntf_hdl; + //notify rsp==false; indicate rsp==true. + BOOLEAN rsp = false; + if (!conn_status && button_cb_env.clcb.congest) { + LOG_ERROR("the conneciton for button profile has been loss\n"); + return; + } + + esp_ble_gatts_hdl_val_indica (conn_id, attr_id, len, + button_msg, rsp); +} + +#endif ///BUT_PROFILE_CFG diff --git a/components/bt/bluedroid/btc/profile/esp/blufi/blufi_adv.c b/components/bt/bluedroid/btc/profile/esp/blufi/blufi_adv.c new file mode 100644 index 000000000..fcd20821f --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/blufi/blufi_adv.c @@ -0,0 +1,164 @@ +// Copyright 2015-2016 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. + +#include "blufi_adv.h" + + +/******************************************************************************* +** +** Function BlufiConfigadvData +** +** Description This function is called to override the BTA default ADV parameters. +** +** adv_data: Pointer to User defined ADV data structure. This +** memory space can not be freed until p_adv_data_cback +** is received. +** p_adv_data_cback: set adv data complete callback. +** +** Returns None +** +*******************************************************************************/ +void BlufiBleConfigadvData(tBLUFI_BLE_ADV_DATA *adv_data, + tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback) +{ + tBTA_BLE_AD_MASK data_mask = 0; + if (adv_data->adv_name != NULL) { + data_mask |= BTM_BLE_AD_BIT_DEV_NAME; + BTA_DmSetDeviceName(adv_data->adv_name); + } + if (adv_data->ble_adv_data.int_range.low != 0 || + adv_data->ble_adv_data.int_range.hi != 0) { + data_mask |= BTM_BLE_AD_BIT_INT_RANGE; + } + + if (adv_data->ble_adv_data.p_manu != NULL) { + data_mask |= BTM_BLE_AD_BIT_MANU; + } + + if (adv_data->ble_adv_data.p_services != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE; + } + + if (adv_data->ble_adv_data.p_service_32b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_32; + } + + if (adv_data->ble_adv_data.p_services_128b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_128; + } + + if (adv_data->ble_adv_data.p_sol_services != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; + } + + if (adv_data->ble_adv_data.p_sol_service_32b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_32SOL; + } + + if (adv_data->ble_adv_data.p_sol_service_128b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; + } + + if (adv_data->ble_adv_data.p_service_data != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_DATA; + } + + if (adv_data->ble_adv_data.appearance != 0) { + data_mask |= BTM_BLE_AD_BIT_APPEARANCE; + } + + if (adv_data->ble_adv_data.p_proprietary != NULL) { + data_mask |= BTM_BLE_AD_BIT_PROPRIETARY; + } + + if (adv_data->ble_adv_data.tx_power != 0) { + data_mask |= BTM_BLE_AD_BIT_TX_PWR; + } + + BTA_DmBleSetAdvConfig(data_mask, &(adv_data->ble_adv_data), p_adv_data_cback); +} + + +/******************************************************************************* +** +** Function BLUFI_BleSetScanRsp +** +** Description This function is called to override the app scan response. +** +** Parameters Pointer to User defined ADV data structure +** +** Returns None +** +*******************************************************************************/ +void BlufiBleSetScanRsp(tBLUFI_BLE_ADV_DATA *scan_rsp_data, + tBTA_SET_ADV_DATA_CMPL_CBACK *p_scan_rsp_data_cback) +{ + tBTA_BLE_AD_MASK data_mask = 0; + if (scan_rsp_data->adv_name != NULL) { + data_mask |= BTM_BLE_AD_BIT_DEV_NAME; + BTA_DmSetDeviceName(scan_rsp_data->adv_name); + } + if (scan_rsp_data->ble_adv_data.int_range.low != 0 || + scan_rsp_data->ble_adv_data.int_range.hi != 0) { + data_mask |= BTM_BLE_AD_BIT_INT_RANGE; + } + + if (scan_rsp_data->ble_adv_data.p_manu != NULL) { + data_mask |= BTM_BLE_AD_BIT_MANU; + } + + if (scan_rsp_data->ble_adv_data.p_services != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE; + } + + if (scan_rsp_data->ble_adv_data.p_service_32b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_32; + } + + if (scan_rsp_data->ble_adv_data.p_services_128b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_128; + } + + if (scan_rsp_data->ble_adv_data.p_sol_services != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; + } + + if (scan_rsp_data->ble_adv_data.p_sol_service_32b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_32SOL; + } + + if (scan_rsp_data->ble_adv_data.p_sol_service_128b != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; + } + + if (scan_rsp_data->ble_adv_data.p_service_data != NULL) { + data_mask |= BTM_BLE_AD_BIT_SERVICE_DATA; + } + + if (scan_rsp_data->ble_adv_data.appearance != 0) { + data_mask |= BTM_BLE_AD_BIT_APPEARANCE; + } + + if (scan_rsp_data->ble_adv_data.p_proprietary != NULL) { + data_mask |= BTM_BLE_AD_BIT_PROPRIETARY; + } + + if (scan_rsp_data->ble_adv_data.tx_power != 0) { + data_mask |= BTM_BLE_AD_BIT_TX_PWR; + } + + BTA_DmBleSetScanRsp(data_mask, &(scan_rsp_data->ble_adv_data), p_scan_rsp_data_cback); +} + + diff --git a/components/bt/bluedroid/btc/profile/esp/blufi/blufi_prf.c b/components/bt/bluedroid/btc/profile/esp/blufi/blufi_prf.c new file mode 100644 index 000000000..c869c0b0f --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/blufi/blufi_prf.c @@ -0,0 +1,380 @@ +// Copyright 2015-2016 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. + +#include + +#include +#include +#include + + +#include "bt_target.h" +#include "bt_trace.h" +#include "bt_types.h" +#include "gatt_api.h" +#include "bta_api.h" +#include "bta_gatt_api.h" +#include "bta_gatts_int.h" + +#include "btc_blufi_prf.h" +#include "btc_task.h" +#include "btc_manage.h" + +#include "blufi_adv.h" +#include "blufi_int.h" + +static uint8_t *success_msg = "BLUFI_CONFIG_OK"; +static uint8_t *failed_msg = "BLUFI_CONFIG_FAILED"; + +#define BTC_BLUFI_CB_TO_APP(_event, _param) ((esp_profile_cb_t)btc_profile_cb_get(BTC_PID_BLUFI))(_event, _param) + +#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" +#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] + + +UINT16 esp32_uuid = SVC_BLUFI_UUID; +UINT8 esp32_manu[17] = {0xff, 0x20, 0x14, 0x07, 0x22, 0x00, 0x02, 0x5B, 0x00, 0x33, 0x49, 0x31, 0x30, 0x4a, 0x30, 0x30, 0x31}; +tBTA_BLE_MANU p_esp32_manu = {sizeof(esp32_manu), esp32_manu}; /* manufacturer data */ + +tBTA_BLE_SERVICE esp32_service = { + 0x01, //only one service in the ijiazu button profile + false, + &esp32_uuid +}; /* 16 bits services */ + + +tBLUFI_BLE_ADV_DATA esp32_adv_data[ADV_SCAN_IDX_MAX] = { + [BLE_ADV_DATA_IDX] = { + .adv_name = "Espressif_008", + { + {0, 0}, + NULL, //no manufature data to be setting in the esp32 adervetisiing datas + &esp32_service, + NULL, //the 128 bits service uuid set to null(not used) + NULL, //the 32 bits Service UUID set to null(not used) + NULL, //16 bits services Solicitation UUIDs set to null(not used) + NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) + NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) + NULL, //proprietary data set to null(not used) + NULL, //service data set not null(no service data to be sent) + 0x0200, //device type : generic display + BTA_DM_GENERAL_DISC, // General discoverable. + 0xFE //the tx power value,defult value is 0 + }, + }, + + [BLE_SCAN_RSP_DATA_IDX] = { + .adv_name = NULL, + { + {0, 0}, + &p_esp32_manu, + NULL, + NULL, //the 128 bits service uuid set to null(not used) + NULL, //the 32 bits Service UUID set to null(not used) + NULL, //16 bits services Solicitation UUIDs set to null(not used) + NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) + NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) + NULL, //proprietary data set to null(not used) + NULL, //service data set not null(no service data to be sent) + 0x0000, //device type : generic display + 0x00, // General discoverable. + 0x00 + }, //the tx power value,defult value is 0 + } +}; + + + +static tBLUFI_CB_ENV blufi_cb_env; + + + +/***************************************************************************** +** Constants +*****************************************************************************/ +static void blufi_profile_cb(tBTA_GATTS_EVT event, tBTA_GATTS *p_data); + + +/******************************************************************************* +** +** Function blufi_create_service +** +** Description Create a Service for the blufi profile +** +** Returns NULL +** +*******************************************************************************/ +static void blufi_create_service(void) +{ + tBTA_GATTS_IF server_if ; + tBT_UUID uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; + UINT16 num_handle = BLUFI_HDL_NUM; + UINT8 inst = 0x00; + server_if = blufi_cb_env.gatt_if; + blufi_cb_env.inst_id = inst; + if (!blufi_cb_env.enabled) { + LOG_ERROR("blufi service added error."); + return; + } + BTA_GATTS_CreateService(server_if, &uuid, inst, num_handle, true); + +} + + +/******************************************************************************* +** +** Function blufi_profile_cb +** +** Description the callback function after the profile has been register to the BTA manager module +** +** Returns NULL +** +*******************************************************************************/ +static void blufi_profile_cb(tBTA_GATTS_EVT event, tBTA_GATTS *p_data) +{ + tBTA_GATTS_RSP rsp; + tBT_UUID uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; + UINT8 len = 0; + UINT8 *p_rec_data = NULL; + tBTA_GATT_STATUS status; + + LOG_DEBUG("blufi profile cb event = %x\n", event); + switch (event) { + case BTA_GATTS_REG_EVT: + status = p_data->reg_oper.status; + + LOG_DEBUG("p_data->reg_oper.status = %x\n", p_data->reg_oper.status); + LOG_DEBUG("(p_data->reg_oper.uuid.uu.uuid16=%x\n", p_data->reg_oper.uuid.uu.uuid16); + if (p_data->reg_oper.status != BTA_GATT_OK) { + LOG_ERROR("blufi profile register failed\n"); + return; + } + + blufi_cb_env.gatt_if = p_data->reg_oper.server_if; + blufi_cb_env.enabled = true; + LOG_DEBUG("register complete: event=%d, status=%d, server_if=%d\n", + event, status, blufi_cb_env.gatt_if); + + LOG_DEBUG("set advertising parameters\n"); + //set the advertising data to the btm layer + BlufiBleConfigadvData(&esp32_adv_data[BLE_ADV_DATA_IDX], NULL); + //set the adversting data to the btm layer + BlufiBleSetScanRsp(&esp32_adv_data[BLE_SCAN_RSP_DATA_IDX], NULL); + BTA_GATTS_Listen(blufi_cb_env.gatt_if, true, NULL); + + //create the blufi service to the service data base. + if (p_data->reg_oper.uuid.uu.uuid16 == SVC_BLUFI_UUID) { + blufi_create_service(); + } + break; + case BTA_GATTS_READ_EVT: + memset(&rsp, 0, sizeof(tBTA_GATTS_API_RSP)); + rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; + rsp.attr_value.len = 2; + //rsp.attr_value.value[0] = 0xde; + //rsp.attr_value.value[1] = 0xed; + //rsp.attr_value.value[2] = 0xbe; + //rsp.attr_value.value[3] = 0xef; + BTA_GATTS_SendRsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, &rsp); + break; + case BTA_GATTS_WRITE_EVT: + BTA_GATTS_SendRsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, NULL); + + LOG_DEBUG("Received blufi data:"); + for (int i = 0; i < p_data->req_data.p_data->write_req.len; i++) { + LOG_DEBUG("%x", p_data->req_data.p_data->write_req.value[i]); + } + LOG_DEBUG("\n"); + + if (p_data->req_data.p_data->write_req.handle == blufi_cb_env.blufi_inst.blufi_hdl) { + btc_msg_t msg; + struct blufi_recv_evt_param recv_data; + + memset(&recv_data, 0x00, sizeof(struct blufi_recv_evt_param)); + + p_rec_data = &p_data->req_data.p_data->write_req.value[0]; + recv_data.data_len = p_data->req_data.p_data->write_req.len; + memcpy(recv_data.data, p_rec_data, recv_data.data_len); + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_BLUFI; + msg.act = BTC_BLUFI_CB_ACT_RECV_DATA; + + btc_transfer_context(&msg, &recv_data, sizeof(struct blufi_recv_evt_param), NULL); + } + break; + case BTA_GATTS_CONF_EVT: + /* Nothing */ + break; + case BTA_GATTS_CREATE_EVT: + uuid.uu.uuid16 = CHAR_BLUFI_UUID; + blufi_cb_env.cur_srvc_id = p_data->create.service_id; + blufi_cb_env.is_primery = p_data->create.is_primary; + //start the blufi service after created + BTA_GATTS_StartService(p_data->create.service_id, BTA_GATT_TRANSPORT_LE); + //add the frist blufi characteristic --> write characteristic + BTA_GATTS_AddCharacteristic(blufi_cb_env.cur_srvc_id, &uuid, + (GATT_PERM_WRITE | GATT_PERM_READ), + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE | GATT_CHAR_PROP_BIT_NOTIFY)); + break; + case BTA_GATTS_ADD_CHAR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == CHAR_BLUFI_UUID) { + //save the att handle to the env + blufi_cb_env.blufi_inst.blufi_hdl = p_data->add_result.attr_id; + + uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + BTA_GATTS_AddCharDescriptor (blufi_cb_env.cur_srvc_id, + (GATT_PERM_WRITE | GATT_PERM_WRITE), + &uuid); + } + break; + case BTA_GATTS_ADD_CHAR_DESCR_EVT: { + /* call init finish */ + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_BLUFI; + msg.act = BTC_BLUFI_CB_ACT_INIT_FINISH; + btc_transfer_context(&msg, NULL, 0, NULL); + break; + } + case BTA_GATTS_CONNECT_EVT: + //set the connection flag to true + LOG_ERROR("\ndevice is connected "BT_BD_ADDR_STR", server_if=%d,reason=0x%x,connect_id=%d\n", + BT_BD_ADDR_HEX(p_data->conn.remote_bda), p_data->conn.server_if, + p_data->conn.reason, p_data->conn.conn_id); + + blufi_cb_env.conn_id = p_data->conn.conn_id; + + /*return whether the remote device is currently connected*/ + int is_connected = BTA_DmGetConnectionState(p_data->conn.remote_bda); + LOG_DEBUG("is_connected=%d\n", is_connected); + BTA_DmBleBroadcast(0); //stop adv + break; + case BTA_GATTS_DISCONNECT_EVT: + //set the connection flag to true + blufi_cb_env.connected = false; + break; + case BTA_GATTS_OPEN_EVT: + break; + case BTA_GATTS_CLOSE_EVT: + if (blufi_cb_env.connected && (blufi_cb_env.conn_id == p_data->conn.conn_id)) { + //set the connection channal congested flag to true + blufi_cb_env.congest = p_data->congest.congested; + } + break; + case BTA_GATTS_LISTEN_EVT: + break; + case BTA_GATTS_CONGEST_EVT: + break; + default: + break; + } +} + +static tGATT_STATUS btc_blufi_profile_init(void) +{ + tBT_UUID app_uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; + + + if (blufi_cb_env.enabled) { + LOG_ERROR("blufi svc already initaliezd"); + return GATT_ERROR; + } else { + memset(&blufi_cb_env, 0, sizeof(tBLUFI_CB_ENV)); + } + + + /* register the blufi profile to the BTA_GATTS module*/ + BTA_GATTS_AppRegister(&app_uuid, blufi_profile_cb); + + return GATT_SUCCESS; +} + +static void blufi_msg_notify(UINT8 *blufi_msg, UINT8 len) +{ + BOOLEAN conn_status = blufi_cb_env.connected; + UINT16 conn_id = blufi_cb_env.conn_id; + UINT16 attr_id = blufi_cb_env.blufi_inst.blufi_hdl; + //notify rsp==false; indicate rsp==true. + BOOLEAN rsp = false; + if (!conn_status && blufi_cb_env.congest) { + LOG_ERROR("the conneciton for blufi profile has been loss"); + return; + } + + BTA_GATTS_HandleValueIndication (conn_id, attr_id, len, + blufi_msg, rsp); +} + +static void btc_blufi_config_success(void) +{ + LOG_DEBUG("config success\n"); + blufi_msg_notify(success_msg, strlen(success_msg)); +} + +static void btc_blufi_config_failed(void) +{ + LOG_DEBUG("config faield\n"); + blufi_msg_notify(failed_msg, strlen(failed_msg)); +} + +void btc_blufi_cb_handler(btc_msg_t *msg) +{ + esp_blufi_cb_param_t param; + + switch (msg->act) { + case BTC_BLUFI_CB_ACT_INIT_FINISH: + param.init_finish.state = ESP_BLUFI_INIT_OK; + BTC_BLUFI_CB_TO_APP(ESP_BLUFI_EVENT_INIT_FINISH, ¶m); + break; + case BTC_BLUFI_CB_ACT_DEINIT_FINISH: + /* TODO: but now nothing */ + break; + case BTC_BLUFI_CB_ACT_RECV_DATA: + memcpy(¶m.recv_data, msg->arg, sizeof(struct blufi_recv_evt_param)); + + BTC_BLUFI_CB_TO_APP(ESP_BLUFI_EVENT_RECV_DATA, ¶m); + break; + default: + LOG_ERROR("%s UNKNOWN %d\n", __func__, msg->act); + break; + } +} + +void btc_blufi_call_handler(btc_msg_t *msg) +{ + btc_blufi_args_t *arg = (btc_blufi_args_t *)msg->arg; + + switch (msg->act) { + case BTC_BLUFI_ACT_INIT: + btc_blufi_profile_init(); + break; + case BTC_BLUFI_ACT_DEINIT: + /* TODO: but now nothing */ + break; + case BTC_BLUFI_ACT_SEND_CFG_STATE: + if (arg->cfg_state.state == ESP_BLUFI_CONFIG_OK) { + btc_blufi_config_success(); + } else { + btc_blufi_config_failed(); + } + break; + default: + LOG_ERROR("%s UNKNOWN %d\n", __func__, msg->act); + break; + } +} diff --git a/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_adv.h b/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_adv.h new file mode 100644 index 000000000..39869ec9e --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_adv.h @@ -0,0 +1,39 @@ +// Copyright 2015-2016 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 __BLUFI_ADV_H__ +#define __BLUFI_ADV_H__ + +#include "bta_api.h" +#include "btm_ble_api.h" +#include "esp_bt_defs.h" + +typedef enum { + BLE_ADV_DATA_IDX = 0, + BLE_SCAN_RSP_DATA_IDX = 1, + ADV_SCAN_IDX_MAX, +} ADV_SCAN_IDX_t; + +typedef struct { + char *adv_name; //set the device name to be sent on the advertising + tBTA_BLE_ADV_DATA ble_adv_data; +} tBLUFI_BLE_ADV_DATA; + +extern void BlufiBleConfigadvData(tBLUFI_BLE_ADV_DATA *adv_data, + tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback); + +extern void BlufiBleSetScanRsp(tBLUFI_BLE_ADV_DATA *scan_rsp_data, + tBTA_SET_ADV_DATA_CMPL_CBACK *p_scan_rsp_data_cback); + +#endif /* __BLUFI_ADV_H__ */ diff --git a/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_int.h b/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_int.h new file mode 100644 index 000000000..f46a41a2e --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_int.h @@ -0,0 +1,52 @@ +// Copyright 2015-2016 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 __BLUFI_INT_H__ +#define __BLUFI_INT_H__ + +//define the blufi serivce uuid +#define SVC_BLUFI_UUID 0xFFFF +//define the blufi Char uuid +#define CHAR_BLUFI_UUID 0xFF01 + +#define BLUFI_HDL_NUM 4 + +#define BLUFI_VAL_MAX_LEN (128) + +#define BLUFI_MAX_STRING_DATA 128 + + +typedef struct { + UINT8 app_id; + UINT16 blufi_hdl; +} tBLUFI_INST; + + +/* service engine control block */ +typedef struct { + BOOLEAN enabled; + BOOLEAN is_primery; + UINT8 inst_id; + tGATT_IF gatt_if; + tBLUFI_INST blufi_inst; + BOOLEAN in_use; + BOOLEAN congest; + UINT16 conn_id; + BOOLEAN connected; + BD_ADDR remote_bda; + UINT32 trans_id; + UINT8 cur_srvc_id; +} tBLUFI_CB_ENV; + +#endif /* __BLUFI_INT_H__ */ diff --git a/components/bt/bluedroid/btc/profile/esp/include/btc_blufi_prf.h b/components/bt/bluedroid/btc/profile/esp/include/btc_blufi_prf.h new file mode 100644 index 000000000..27096408c --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/include/btc_blufi_prf.h @@ -0,0 +1,52 @@ +// Copyright 2015-2016 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 __BTC_BLUFI_PRF_H__ +#define __BTC_BLUFI_PRF_H__ + +#include "bt_target.h" +#include "btc_task.h" +#include "esp_blufi_api.h" + +typedef enum { + BTC_BLUFI_ACT_INIT = 0, + BTC_BLUFI_ACT_DEINIT, + BTC_BLUFI_ACT_SEND_CFG_STATE, +} btc_blufi_act_t; + +typedef enum { + BTC_BLUFI_CB_ACT_INIT_FINISH = 0, + BTC_BLUFI_CB_ACT_DEINIT_FINISH, + BTC_BLUFI_CB_ACT_RECV_DATA, +} btc_blufi_cb_act_t; + +typedef union { +#if 0 + //BTC_BLUFI_ACT_INIT = 0, + struct blufi_init_param { + } init; + //BTC_BLUFI_ACT_DEINIT, + struct blufi_deinit_param { + } deinit; +#endif + //BTC_BLUFI_ACT_SEND_CFG_STATE, + struct blufi_send_cfg_state_pram { + esp_blufi_config_state_t state; + } cfg_state; +} btc_blufi_args_t; + +void btc_blufi_cb_handler(btc_msg_t *msg); +void btc_blufi_call_handler(btc_msg_t *msg); + +#endif /* __BTC_BLUFI_PRF_H__ */ diff --git a/components/bt/bluedroid/profiles/esp/include/button_pro.h b/components/bt/bluedroid/btc/profile/esp/include/button_pro.h similarity index 77% rename from components/bt/bluedroid/profiles/esp/include/button_pro.h rename to components/bt/bluedroid/btc/profile/esp/include/button_pro.h index f6397f253..cbc2d68d5 100644 --- a/components/bt/bluedroid/profiles/esp/include/button_pro.h +++ b/components/bt/bluedroid/btc/profile/esp/include/button_pro.h @@ -25,14 +25,14 @@ #define KEY_NO_RESOURCES GATT_NO_RESOURCES //define the key serivce uuid -#define ATT_SVC_BUTTON 0xFFFF +#define ATT_SVC_BUTTON 0xFFFF //define the key Char uuid -#define ATT_CHAR_BUTTON_WIT 0xFF01 -#define ATT_CHAR_BUTTON_NTF 0xFF02 +#define ATT_CHAR_BUTTON_WIT 0xFF01 +#define ATT_CHAR_BUTTON_NTF 0xFF02 -#define BUTTON_PRESS_NTF_CFG 0x01 +#define BUTTON_PRESS_NTF_CFG 0x01 -#define BUTTON_VAL_MAX_LEN (10) +#define BUTTON_VAL_MAX_LEN (10) #define BUTT_MAX_APPS GATT_CL_MAX_LCB @@ -44,18 +44,16 @@ typedef void (*but_prf_cb_t)(uint8_t app_id, uint8_t event, uint16_t len, uint8_ #define BUT_MAX_INT_NUM 4 #endif -enum -{ - RECEIVE_NET_PASSWD_EVT, - RECEIVE_NET_SSD_EVT, - RECEIVE_EVT_MAX +enum { + RECEIVE_NET_PASSWD_EVT, + RECEIVE_NET_SSD_EVT, + RECEIVE_EVT_MAX }; /// button Service Attributes Indexes -enum -{ +enum { KEY_IDX_SVC, - KEY_IDX_BUTTON_WIT_CHAR, + KEY_IDX_BUTTON_WIT_CHAR, KEY_IDX_BUTTON_WIT_VAL, KEY_IDX_BUTTON_NTF_CHAR, KEY_IDX_BUTTON_NTF_VAL, @@ -64,48 +62,44 @@ enum KEY_IDX_NB, }; -typedef struct -{ - BD_ADDR remote_bda; - BOOLEAN need_rsp; - uint16_t clt_cfg; -}but_write_data_t; +typedef struct { + BD_ADDR remote_bda; + BOOLEAN need_rsp; + uint16_t clt_cfg; +} but_write_data_t; -typedef struct -{ +typedef struct { BOOLEAN in_use; - BOOLEAN congest; + BOOLEAN congest; uint16_t conn_id; BOOLEAN connected; BD_ADDR remote_bda; uint32_t trans_id; uint8_t cur_srvc_id; -}but_clcb_t; +} but_clcb_t; -typedef struct -{ +typedef struct { uint8_t app_id; uint16_t but_wirt_hdl; uint16_t but_ntf_hdl; uint16_t but_cfg_hdl; - + but_prf_cb_t p_cback; -}but_inst_t; +} but_inst_t; /* service engine control block */ -typedef struct -{ - but_clcb_t clcb; /* connection link*/ +typedef struct { + but_clcb_t clcb; /* connection link*/ esp_gatt_if_t gatt_if; BOOLEAN enabled; - BOOLEAN is_primery; - but_inst_t button_inst; + BOOLEAN is_primery; + but_inst_t button_inst; uint8_t inst_id; -}button_env_cb_t; +} button_env_cb_t; void Button_CreateService(void); diff --git a/components/bt/bluedroid/profiles/esp/include/wx_airsync_prf.h b/components/bt/bluedroid/btc/profile/esp/include/wx_airsync_prf.h similarity index 61% rename from components/bt/bluedroid/profiles/esp/include/wx_airsync_prf.h rename to components/bt/bluedroid/btc/profile/esp/include/wx_airsync_prf.h index 89d65282d..f008ce643 100644 --- a/components/bt/bluedroid/profiles/esp/include/wx_airsync_prf.h +++ b/components/bt/bluedroid/btc/profile/esp/include/wx_airsync_prf.h @@ -13,8 +13,8 @@ // limitations under the License. #include "prf_defs.h" - -#if (WX_AIRSYNC_CFG) + +#if (WX_AIRSYNC_CFG) #include "bt_target.h" #include "gatt_api.h" @@ -25,23 +25,22 @@ /// Maximum Transmission Unit #define ATT_DEFAULT_MTU (23) -#define BLE_WECHAT_MAX_DATA_LEN (ATT_DEFAULT_MTU - 3) +#define BLE_WECHAT_MAX_DATA_LEN (ATT_DEFAULT_MTU - 3) - - //define the key serivce uuid -#define ATT_SVC_AIRSYNC 0xFEE7 - //define the airsync Char uuid -#define ATT_CHAR_AIRSYNC_WIT 0xFEC7 -#define ATT_CHAR_AIRSYBC_NTF 0xFEC8 -#define ATT_CHAR_AIRSYNC_READ 0xFEC9 + +//define the key serivce uuid +#define ATT_SVC_AIRSYNC 0xFEE7 +//define the airsync Char uuid +#define ATT_CHAR_AIRSYNC_WIT 0xFEC7 +#define ATT_CHAR_AIRSYBC_NTF 0xFEC8 +#define ATT_CHAR_AIRSYNC_READ 0xFEC9 typedef void (tAIRSYNC_CBACK)(UINT8 app_id, UINT8 event, UINT8 len, UINT8 *data); /// WX AirSync Service Attributes Indexes -enum -{ +enum { WX_IDX_SVC, WX_IDX_AIRSYNC_WIT_CHAR, WX_IDX_AIRSYNC_WIT_VAL, @@ -54,49 +53,45 @@ enum WX_IDX_NB, }; -typedef struct -{ +typedef struct { BD_ADDR remote_bda; BOOLEAN need_rsp; UINT16 clt_cfg; -}tAirSync_WRITE_DATA; +} tAirSync_WRITE_DATA; -typedef struct -{ - BOOLEAN in_use; - BOOLEAN congest; - UINT16 conn_id; - BOOLEAN connected; - BD_ADDR remote_bda; - UINT32 trans_id; - UINT8 cur_srvc_id; +typedef struct { + BOOLEAN in_use; + BOOLEAN congest; + UINT16 conn_id; + BOOLEAN connected; + BD_ADDR remote_bda; + UINT32 trans_id; + UINT8 cur_srvc_id; -}tAirSync_CLCB; +} tAirSync_CLCB; -typedef struct -{ - UINT8 app_id; - UINT16 airsync_wirt_hdl; - UINT16 airsync_ntf_hdl; - UINT16 airsync_read_hdl; - UINT16 airsync_cfg_hdl; - - tAIRSYNC_CBACK *p_cback; +typedef struct { + UINT8 app_id; + UINT16 airsync_wirt_hdl; + UINT16 airsync_ntf_hdl; + UINT16 airsync_read_hdl; + UINT16 airsync_cfg_hdl; -}tAirSync_INST; + tAIRSYNC_CBACK *p_cback; + +} tAirSync_INST; /* service engine control block */ -typedef struct -{ - tAirSync_CLCB clcb; /* connection link*/ - tGATT_IF gatt_if; - BOOLEAN enabled; - BOOLEAN is_primery; - tAirSync_INST airsync_inst; - UINT8 inst_id; -}tAIRSYNC_CB_ENV; +typedef struct { + tAirSync_CLCB clcb; /* connection link*/ + tGATT_IF gatt_if; + BOOLEAN enabled; + BOOLEAN is_primery; + tAirSync_INST airsync_inst; + UINT8 inst_id; +} tAIRSYNC_CB_ENV; void AirSync_CreateService(void); @@ -111,5 +106,5 @@ tGATT_STATUS AirSync_Init(tAIRSYNC_CBACK *call_back); void AirSync_msg_notify(UINT8 len, UINT8 *button_msg); extern tAIRSYNC_CB_ENV airsync_cb_env; - -#endif ///WX_AIRSYNC_CFG + +#endif ///WX_AIRSYNC_CFG diff --git a/components/bt/bluedroid/btc/profile/esp/wechat_AirSync/wx_airsync_prf.c b/components/bt/bluedroid/btc/profile/esp/wechat_AirSync/wx_airsync_prf.c new file mode 100644 index 000000000..06d159aa3 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/esp/wechat_AirSync/wx_airsync_prf.c @@ -0,0 +1,271 @@ +#include "wx_airsync_prf.h" +// Copyright 2015-2016 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. + + +#if (WX_AIRSYNC_CFG) + +#include + +#include +#include +#include + +#include "bt_target.h" +#include "bt_trace.h" +#include "bt_types.h" +#include "gatt_api.h" +#include "bta_api.h" +#include "bta_gatt_api.h" +#include "bta_gatts_int.h" + + + +tAIRSYNC_CB_ENV airsync_cb_env; + + +/***************************************************************************** +** Constants +*****************************************************************************/ +static void airsync_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); + + +/******************************************************************************* +** +** Function airsync_profile_cb +** +** Description the callback function after the profile has been register to the BTA manager module +** +** Returns NULL +** +*******************************************************************************/ +static void airsync_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) +{ + esp_gatts_rsp_t rsp; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_AIRSYNC}}; + tAirSync_INST *p_inst = &airsync_cb_env.airsync_inst; + + + LOG_ERROR("airsync profile cb event = %x\n", event); + switch (event) { + case ESP_GATTS_REG_EVT: + + if (p_data->reg_oper.status != BTA_GATT_OK) { + LOG_ERROR("button profile register failed\n"); + } + airsync_cb_env.gatt_if = p_data->reg_oper.server_if; + airsync_cb_env.enabled = true; + + if (p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_AIRSYNC) { + AirSync_CreateService(); + } + break; + case ESP_GATTS_READ_EVT: + + if (airsync_cb_env.clcb.connected && airsync_cb_env.enabled) { + //tBTA_GATTS_RSP rsp; + memset(&rsp, 0, sizeof(tBTA_GATTS_API_RSP)); + rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; + rsp.attr_value.len = 2; + esp_ble_gatts_send_rsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, &rsp); + } + break; + case ESP_GATTS_WRITE_EVT: + if (airsync_cb_env.clcb.connected && airsync_cb_env.enabled) { + esp_ble_gatts_send_rsp(p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, NULL); + + } + break; + case ESP_GATTS_CFM_EVT: + + break; + case ESP_GATTS_CREATE_EVT: + uuid.uu.uuid16 = ATT_CHAR_AIRSYNC_WIT; + + airsync_cb_env.clcb.cur_srvc_id = p_data->create.service_id; + airsync_cb_env.is_primery = p_data->create.is_primary; + //start the airsync service after created + esp_ble_gatts_start_srvc(p_data->create.service_id); + //add the frist airsync characteristic --> write characteristic + esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id, &uuid, + (GATT_PERM_WRITE | GATT_PERM_READ), + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE)); + break; + + case ESP_GATTS_ADD_CHAR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYNC_WIT) { + uuid.uu.uuid16 = ATT_CHAR_AIRSYBC_NTF; + //tBTA_GATT_PERM perm = GATT_PERM_READ; + //tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY); + //save the att handle to the env + airsync_cb_env.airsync_inst.airsync_wirt_hdl = p_data->add_result.attr_id; + //add the second airsync characteristic --> Notify characteristic + esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id, &uuid, + GATT_PERM_READ, (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_INDICATE)); + } else if (p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYBC_NTF) { + //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); + uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + airsync_cb_env.airsync_inst.airsync_ntf_hdl = p_data->add_result.attr_id; + esp_ble_gatts_add_char_descr (airsync_cb_env.clcb.cur_srvc_id, + (GATT_PERM_WRITE | GATT_PERM_WRITE), + &uuid); + + uuid.uu.uuid16 = ATT_CHAR_AIRSYNC_READ; + //add the third airsync characteristic --> Read characteristic + esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id, &uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ); + } else if (p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYNC_READ) { + airsync_cb_env.airsync_inst.airsync_read_hdl = p_data->add_result.attr_id; + } + + break; + case ESP_GATTS_ADD_CHAR_DESCR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { + airsync_cb_env.airsync_inst.airsync_cfg_hdl = p_data->add_result.attr_id; + } + break; + case ESP_GATTS_CONNECT_EVT: + //set the connection flag to true + airsync_env_clcb_alloc(p_data->conn.conn_id, p_data->conn.remote_bda); + break; + case ESP_GATTS_DISCONNECT_EVT: + //set the connection flag to true + airsync_cb_env.clcb.connected = false; + break; + case ESP_GATTS_OPEN_EVT: + break; + case ESP_GATTS_CLOSE_EVT: + if (airsync_cb_env.clcb.connected && (airsync_cb_env.clcb.conn_id == p_data->conn.conn_id)) { + //set the connection channal congested flag to true + airsync_cb_env.clcb.congest = p_data->congest.congested; + } + break; + case ESP_GATTS_CONGEST_EVT: + //set the congest flag + airsync_cb_env.clcb.congest = p_data->congest.congested; + break; + default: + break; + } +} + + +/******************************************************************************* +** +** Function AirSync_CreateService +** +** Description Create a Service for the airsync profile +** +** Returns NULL +** +*******************************************************************************/ +void AirSync_CreateService(void) +{ + esp_gatts_if_t server_if ; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_AIRSYNC}}; + UINT16 num_handle = WX_IDX_NB; + UINT8 inst = 0x00; + server_if = airsync_cb_env.gatt_if; + airsync_cb_env.inst_id = inst; + + esp_ble_gatts_create_srvc(server_if, &uuid, inst, num_handle, true); + +} + +/******************************************************************************* +** +** Function airsync_env_clcb_alloc +** +** Description The function allocates a GATT profile connection link control block +** +** Returns NULL if not found. Otherwise pointer to the connection link block. +** +*******************************************************************************/ +tAirSync_CLCB *airsync_env_clcb_alloc (UINT16 conn_id, BD_ADDR remote_bda) +{ + tAirSync_CLCB *p_clcb = NULL; + p_clcb = &airsync_cb_env.clcb; + + if (!p_clcb->in_use) { + p_clcb->in_use = TRUE; + p_clcb->conn_id = conn_id; + LOG_ERROR("p_clcb->conn_id = %x\n", conn_id); + p_clcb->connected = TRUE; + memcpy(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN); + } + + return p_clcb; +} + +/******************************************************************************* +** +** Function airsync_env_find_conn_id_by_bd_adddr +** +** Description The function searches all LCB with macthing bd address +** +** Returns total number of clcb found. +** +*******************************************************************************/ +UINT16 airsync_env_find_conn_id_by_bd_adddr(BD_ADDR remote_bda) +{ + UINT8 i_clcb; + tAirSync_CLCB *p_clcb = NULL; + + for (i_clcb = 0, p_clcb = &airsync_cb_env.clcb; i_clcb < 1; i_clcb++, p_clcb++) { + if (p_clcb->in_use && p_clcb->connected && memcmp(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN)) { + return p_clcb->conn_id; + } + } + + return GATT_INVALID_CONN_ID; +} + + +/******************************************************************************* +** +** Function airsync_init +** +** Description Initializa the GATT Service for airsync profiles. +** +*******************************************************************************/ +tGATT_STATUS AirSync_Init(tAIRSYNC_CBACK *call_back) +{ + esp_bt_uuid_t app_uuid = {LEN_UUID_16, {ATT_SVC_AIRSYNC}}; + + + if (airsync_cb_env.enabled) { + LOG_ERROR("airsync svc already initaliezd\n"); + return ESP_GATT_ERROR; + } else { + memset(&airsync_cb_env, 0, sizeof(tAIRSYNC_CB_ENV)); + } + + + if (call_back != NULL) { + airsync_cb_env.airsync_inst.p_cback = call_back; + } + + + /* register the airsync profile to the BTA_GATTS module*/ + esp_ble_gatts_app_register(&app_uuid, airsync_profile_cb); + + airsync_cb_env.enabled = TRUE; + + return ESP_GATT_OK; +} + +#endif ///WX_AIRSYNC_CFG diff --git a/components/bt/bluedroid/btc/profile/std/battery/battery_prf.c b/components/bt/bluedroid/btc/profile/std/battery/battery_prf.c new file mode 100644 index 000000000..63558cd62 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/battery/battery_prf.c @@ -0,0 +1,602 @@ +#include +// Copyright 2015-2016 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. + +#include +#include +#include + +//#include "bluedroid_test.h" +#include "bta_api.h" +#include "bta_gatt_api.h" +#include "controller.h" + +#include "gatt_int.h" +#include "bt_trace.h" +#include "btm_api.h" +#include "bt_types.h" +#include "dis_api.h" + +#if BLE_INCLUDED == true + +#define BA_MAX_CHAR_NUM 1 +#define BA_MAX_ATTR_NUM (BA_MAX_CHAR_NUM * 5 + 1) +/*max 3 descriptors, 1 desclaration and 1 value*/ + +#ifndef BATTER_LEVEL_PROP +#define BATTER_LEVEL_PROP (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY) +#endif + +#ifndef BATTER_LEVEL_PERM +#define BATTER_LEVEL_PERM (GATT_PERM_READ) +#endif + +#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" +#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] +esp_gatts_if_t server_if; + +tBATTERY_CB battery_cb; +tGATT_CHAR_PROP prop = GATT_CHAR_PROP_BIT_READ; +tBA_REG_INFO ba_reg_info; +UINT8 attr_handle_bit = 0x00; + +extern tDIS_CB dis_cb; +esp_bt_uuid_t bas_uuid = {LEN_UUID_16, {UUID_SERVCLASS_BATTERY}}; +/****************************************************************************** +** Function bas_gatts_callback +** +** Description battery service register callback function +*******************************************************************************/ +static void bas_gatts_callback(esp_gatts_evt_t event, tBTA_GATTS *p_data) +{ + switch (event) { + case ESP_GATTS_REG_EVT: { + esp_gatt_status_t status = p_data->reg_oper.status; + server_if = p_data->reg_oper.server_if; + LOG_ERROR("BAS register completed: event=%d, status=%d, server_if=%d\n", + event, status, server_if); + + UINT8 app_id = 0xff; + bas_init(server_if, app_id); + + tDIS_ATTR_MASK mask = 0x01ff; + DIS_Init(server_if, mask); + } + break; + + /*connect callback*/ + case ESP_GATTS_CONNECT_EVT: { + LOG_ERROR("\ndevice is connected "BT_BD_ADDR_STR", server_if=%d,reason=0x%x,connect_id=%d\n", + BT_BD_ADDR_HEX(p_data->conn.remote_bda), p_data->conn.server_if, + p_data->conn.reason, p_data->conn.conn_id); + /*return whether the remote device is currently connected*/ + int is_connected = BTA_DmGetConnectionState(p_data->conn.remote_bda); + LOG_ERROR("is_connected=%d\n", is_connected); + } + break; + + /*create service callback*/ + case ESP_GATTS_CREATE_EVT: { + LOG_ERROR("create service:server_if=%d,service_id=0x%x,service_uuid=0x%x\n", + p_data->create.server_if, p_data->create.service_id, + p_data->create.uuid.uu.uuid16); + UINT16 service_uuid = p_data->create.uuid.uu.uuid16; + UINT16 service_id = p_data->create.service_id; + if (service_uuid == 0x180f) { + tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_BATTERY_LEVEL}}; + bas_AddChar(service_id, &uuid); + } + if (service_uuid == 0x180a) { + dis_cb.service_handle = service_id; + dis_cb.max_handle = service_id + DIS_MAX_ATTR_NUM; + dis_AddChar(service_id); + } + + } + break; + + case ESP_GATTS_ADD_CHAR_EVT: { + LOG_ERROR("create characteristic:server_if=%d,service_id=0x%x,char_uuid=0x%x\n", + p_data->add_result.server_if, p_data->add_result.service_id, + p_data->add_result.char_uuid.uu.uuid16); + UINT16 char_uuid = p_data->add_result.char_uuid.uu.uuid16; + UINT16 service_id = p_data->add_result.service_id; + if (char_uuid == GATT_UUID_BATTERY_LEVEL) { + bas_AddCharDescr(service_id, p_data->add_result.attr_id); + } + if (char_uuid == GATT_UUID_SYSTEM_ID | GATT_UUID_MODEL_NUMBER_STR | GATT_UUID_PNP_ID | + GATT_UUID_SERIAL_NUMBER_STR | GATT_UUID_FW_VERSION_STR | GATT_UUID_HW_VERSION_STR | + GATT_UUID_SW_VERSION_STR | GATT_UUID_MANU_NAME | GATT_UUID_IEEE_DATA) { + switch (char_uuid) { + case GATT_UUID_SYSTEM_ID: + dis_cb.dis_attr[0].handle = service_id; break; + case GATT_UUID_MODEL_NUMBER_STR: + dis_cb.dis_attr[1].handle = service_id; break; + case GATT_UUID_SERIAL_NUMBER_STR: + dis_cb.dis_attr[2].handle = service_id; break; + case GATT_UUID_FW_VERSION_STR: + dis_cb.dis_attr[3].handle = service_id; break; + case GATT_UUID_HW_VERSION_STR: + dis_cb.dis_attr[4].handle = service_id; break; + case GATT_UUID_SW_VERSION_STR: + dis_cb.dis_attr[5].handle = service_id; break; + case GATT_UUID_MANU_NAME: + dis_cb.dis_attr[6].handle = service_id; break; + case GATT_UUID_IEEE_DATA: + dis_cb.dis_attr[7].handle = service_id; break; + case GATT_UUID_PNP_ID: + dis_cb.dis_attr[8].handle = service_id; break; + } + } + } + break; + + case ESP_GATTS_ADD_CHAR_DESCR_EVT: { + + LOG_ERROR("create descriptor:server_if=%d,service_id=0x%x,attr_id=0x%x,char_uuid=0x%x\n", + p_data->add_result.server_if, p_data->add_result.service_id, + p_data->add_result.attr_id, p_data->add_result.char_uuid.uu.uuid16); + bas_AddCharDescr(p_data->add_result.service_id, p_data->add_result.attr_id); + } + break; + + case ESP_GATTS_START_EVT: { + LOG_ERROR("start service:server_if=%d,service_id=0x%x\n", p_data->srvc_oper.server_if, + p_data->srvc_oper.service_id); + bas_service_cmpl(p_data->srvc_oper.service_id, p_data->srvc_oper.status); + + /*start advertising*/ + //if(p_data->srvc_oper.status == GATT_SUCCESS) + // BTA_GATTS_Listen(server_if, true, NULL); + // BTA_GATTC_Broadcast(client_if, true); //non-connectable + } + break; + + case ESP_GATTS_READ_EVT: { + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + UINT16 handle = p_data->req_data.p_data->read_req.handle; + bool is_long = p_data->req_data.p_data->read_req.is_long; + LOG_ERROR("read request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", + event, handle, trans_id, conn_id); + + if (dis_valid_handle_range(handle)) { + tGATT_VALUE p_value; + p_value.handle = handle; + p_value.conn_id = conn_id; + p_value.offset = p_data->req_data.p_data->read_req.offset; + dis_s_read_attr_value(p_data->req_data.p_data, &p_value, trans_id, conn_id); + } else { + bas_s_read_attr_value(p_data->req_data.p_data, trans_id, conn_id); + } + } + break; + + case ESP_GATTS_WRITE_EVT: { + + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + UINT16 handle = p_data->req_data.p_data->write_req.handle; + LOG_ERROR("write request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", + event, handle, trans_id, conn_id); + bas_s_write_attr_value(p_data->req_data.p_data, trans_id, conn_id, + p_data->req_data.remote_bda); + } + break; + + case ESP_GATTS_EXEC_WRITE_EVT: { + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + UINT8 exec_write = p_data->req_data.p_data->exec_write; + LOG_ERROR("execute write request:event=0x%x,exce_write=0x%x,trans_id=0x%x,conn_id=0x%x\n", + event, exec_write, trans_id, conn_id); + } + break; + + case ESP_GATTS_MTU_EVT: { + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + UINT16 mtu = p_data->req_data.p_data->mtu; + LOG_ERROR("exchange mtu request:event=0x%x,mtu=0x%x,trans_id=0x%x,conn_id=0x%x\n", + event, mtu, trans_id, conn_id); + } + break; + + case ESP_GATTS_CFM_EVT: { + + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + LOG_ERROR("configue request:trans_id=0x%x,conn_id=0x%x\n", + trans_id, conn_id); + } + break; + + default: + LOG_ERROR("unsettled event: %d\n", event); + break; + } + +} +/****************************************************************************** +** Function bas_callback +** +** Description battery service callback for client request +*******************************************************************************/ +static void bas_callback(UINT32 trans_id, UINT16 conn_id, UINT8 app_id, + UINT8 event, tBA_WRITE_DATA *p_data) +{ + tBA_RSP_DATA p_rsp; + tGATT_STATUS st = ESP_GATT_OK; + switch (event) { + case BA_READ_LEVEL_REQ : { + LOG_ERROR("read battery level\n"); + p_rsp.ba_level = 60; //battery level + Battery_Rsp(trans_id, conn_id, app_id, st, event, &p_rsp); + } + break; + + case BA_READ_PRE_FMT_REQ : { + LOG_ERROR("read presentation format\n"); + } + break; + + case BA_READ_CLT_CFG_REQ : { + LOG_ERROR("read client characteristic configuration request\n"); + p_rsp.clt_cfg = 0x0001; //notification + Battery_Rsp(trans_id, conn_id, app_id, st, event, &p_rsp); + } + break; + + case BA_READ_RPT_REF_REQ : { + LOG_ERROR("read report reference descriptor\n"); + } + break; + + /*battery level notify*/ + case BA_WRITE_CLT_CFG_REQ : { + LOG_ERROR("write client characteristic configuration request\n"); + Battery_Rsp(trans_id, conn_id, app_id, st, event, NULL); + + int battery_level = 50; + Battery_Notify(conn_id, app_id, p_data->remote_bda, battery_level); + } + break; + + default: + break; + } + + return; +} +/***************************************************************************** +** Function bas_s_read_attr_value +** +** Description it will be called when client sends a read request +******************************************************************************/ +void bas_s_read_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, UINT16 conn_id) +{ + + tBA_INST *p_inst = &battery_cb.battery_inst[0]; + UINT8 i; + esp_gatt_status_t st = ESP_GATT_NOT_FOUND; + UINT16 handle = p_data->read_req.handle; + + + for (i = 0; i < BA_MAX_INT_NUM; i ++, p_inst ++) { + // read battery level + if (handle == p_inst->ba_level_hdl || + handle == p_inst->clt_cfg_hdl || + handle == p_inst->rpt_ref_hdl || + handle == p_inst->pres_fmt_hdl) { + if (p_data->read_req.is_long) { + st = ESP_GATT_NOT_LONG; + } + + if (p_inst->p_cback) { + if (handle == p_inst->ba_level_hdl) { + p_inst->pending_evt = BA_READ_LEVEL_REQ; + } + if (handle == p_inst->clt_cfg_hdl) { + p_inst->pending_evt = BA_READ_CLT_CFG_REQ; + } + if (handle == p_inst->pres_fmt_hdl) { + p_inst->pending_evt = BA_READ_PRE_FMT_REQ; + } + if (handle == p_inst->rpt_ref_hdl) { + p_inst->pending_evt = BA_READ_RPT_REF_REQ ; + } + + // p_inst->pending_clcb_idx = clcb_idx; + p_inst->pending_handle = handle; + //act = SRVC_ACT_PENDING; + (*p_inst->p_cback)(trans_id, conn_id, p_inst->app_id, p_inst->pending_evt, NULL); + } else { /* application is not registered */ + st = ESP_GATT_ERR_UNLIKELY; + } + break; + } + /* else attribute not found */ + } +} + +/***************************************************************************** +** Function bas_s_write_attr_value +** +** Description it will be called when client sends a write request +******************************************************************************/ +void bas_s_write_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, UINT16 conn_id, BD_ADDR bd_addr) +{ + tBA_WRITE_DATA cfg; + UINT8 *p = p_data->write_req.value; + tBA_INST *p_inst = &battery_cb.battery_inst[0]; + UINT8 i; + esp_gatt_status_t st = ESP_GATT_NOT_FOUND; + UINT16 handle = p_data->write_req.handle; + + + for (i = 0; i < BA_MAX_INT_NUM; i ++, p_inst ++) { + if (handle == p_inst->clt_cfg_hdl) { + memcpy(cfg.remote_bda, bd_addr, BD_ADDR_LEN); + STREAM_TO_UINT16(cfg.clt_cfg, p); + + if (p_inst->p_cback) { + p_inst->pending_evt = BA_WRITE_CLT_CFG_REQ; + p_inst->pending_handle = handle; + cfg.need_rsp = p_data->write_req.need_rsp; + (*p_inst->p_cback)(trans_id, conn_id, p_inst->app_id, p_inst->pending_evt, &cfg); + } else { /* all other handle is not writable */ + st = ESP_GATT_WRITE_NOT_PERMIT; + } + break; + } + + } +} +/*************************************************************** +** +** Function bas_register +** +** Description register app for battery service +** +****************************************************************/ +void bas_register(void) +{ + esp_ble_gatts_app_register(&bas_uuid, bas_gatts_callback); + +} +/*************************************************************** +** +** Function bas_init +** +** Description register battery service +** +****************************************************************/ +void bas_init(tBTA_GATTS_IF gatt_if, UINT16 app_id) +{ + + tBA_INST *p_inst; + + ba_reg_info.is_pri = true; + ba_reg_info.ba_level_descr = BA_LEVEL_NOTIFY; + ba_reg_info.transport = GATT_TRANSPORT_LE; + ba_reg_info.p_cback = bas_callback; + if (battery_cb.inst_id == BA_MAX_INT_NUM) { + GATT_TRACE_ERROR("MAX battery service has been reached\n"); + return; + } + + p_inst = &battery_cb.battery_inst[battery_cb.inst_id]; + + LOG_ERROR("create battery service\n"); + LOG_ERROR("inst_id=%d\n", battery_cb.inst_id); + esp_ble_gatts_create_srvc (gatt_if, &bas_uuid, battery_cb.inst_id , + BA_MAX_ATTR_NUM, ba_reg_info.is_pri); + + battery_cb.inst_id ++; + + p_inst->app_id = app_id; + p_inst->p_cback = ba_reg_info.p_cback; + +} + +/*************************************************************** +** +** Function bas_AddChar +** +** Description add characteristic for battery service +** +****************************************************************/ +void bas_AddChar(UINT16 service_id, tBT_UUID *char_uuid) +{ + if (ba_reg_info.ba_level_descr & BA_LEVEL_NOTIFY) { + prop |= GATT_CHAR_PROP_BIT_NOTIFY; + } + attr_handle_bit = 0x01; + esp_ble_gatts_add_char(service_id, char_uuid, BATTER_LEVEL_PERM, prop); + +} + +/*************************************************************** +** +** Function bas_AddCharDescr +** +** Description add descriptor for battery service if needed +** +****************************************************************/ +void bas_AddCharDescr(UINT16 service_id, UINT16 attr_id) +{ + tBT_UUID uuid; + uuid.len = LEN_UUID_16; + + battery_cb.inst_id --; + tBA_INST *p_inst = &battery_cb.battery_inst[battery_cb.inst_id++]; + /*store the attribute handles*/ + if (attr_handle_bit == 0x01) { + p_inst->ba_level_hdl = attr_id; + } else if (attr_handle_bit == 0x02) { + p_inst->clt_cfg_hdl = attr_id; + } else if (attr_handle_bit == 0x04) { + p_inst->pres_fmt_hdl = attr_id; + } else if (attr_handle_bit == 0x08) { + p_inst->rpt_ref_hdl = attr_id; + } + + + if (ba_reg_info.ba_level_descr != 0) { + if (ba_reg_info.ba_level_descr & BA_LEVEL_NOTIFY) { + uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + ba_reg_info.ba_level_descr &= 0xfe; + attr_handle_bit = 0x02; + esp_ble_gatts_add_char_descr(service_id, (GATT_PERM_READ | GATT_PERM_WRITE), &uuid); + return; + } + + /* need presentation format descriptor? */ + if (ba_reg_info.ba_level_descr & BA_LEVEL_PRE_FMT) { + uuid.uu.uuid16 = GATT_UUID_CHAR_PRESENT_FORMAT; + esp_ble_gatts_add_char_descr(service_id, GATT_PERM_READ, &uuid); + ba_reg_info.ba_level_descr &= 0xfd; + attr_handle_bit = 0x04; + return; + } + /* need report reference format descriptor? */ + if (ba_reg_info.ba_level_descr & BA_LEVEL_RPT_REF) { + uuid.uu.uuid16 = GATT_UUID_RPT_REF_DESCR; + ba_reg_info.ba_level_descr &= 0xfb; + esp_ble_gatts_add_char_descr(service_id, GATT_PERM_READ, &uuid); + attr_handle_bit = 0x08; + return; + } + } + + else { + esp_ble_gatts_start_srvc(service_id); + } + +} + +/*************************************************************** +** +** Function bas_service_cmpl +** +** Description create battery service complete +** +****************************************************************/ +void bas_service_cmpl(UINT16 service_id, esp_gatt_status_t status) +{ + if (status != ESP_GATT_OK) { + battery_cb.inst_id --; + esp_ble_gatts_dele_srvc(service_id); + } + +} +/******************************************************************************* +** +** Function Battery_Rsp +** +** Description Respond to a battery service request +** +*******************************************************************************/ +void Battery_Rsp (UINT32 trans_id, UINT16 conn_id, UINT8 app_id, + esp_gatt_status_t st, UINT8 event, tBA_RSP_DATA *p_rsp) +{ + tBA_INST *p_inst = &battery_cb.battery_inst[0]; + tGATTS_RSP rsp; + UINT8 *pp; + + UINT8 i = 0; + while (i < BA_MAX_INT_NUM) { + if (p_inst->app_id == app_id && p_inst->ba_level_hdl != 0) { + break; + } + i ++; + } + + if (i == BA_MAX_INT_NUM) { + return; + } + + memset(&rsp, 0, sizeof(tGATTS_RSP)); + + if (p_inst->pending_evt == event) { + switch (event) { + case BA_READ_CLT_CFG_REQ: + rsp.attr_value.handle = p_inst->pending_handle; + rsp.attr_value.len = 2; + pp = rsp.attr_value.value; + UINT16_TO_STREAM(pp, p_rsp->clt_cfg); + esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); + //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); + break; + + case BA_READ_LEVEL_REQ: + rsp.attr_value.handle = p_inst->pending_handle; + rsp.attr_value.len = 1; + pp = rsp.attr_value.value; + UINT8_TO_STREAM(pp, p_rsp->ba_level); + esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); + //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); + break; + + case BA_WRITE_CLT_CFG_REQ: + esp_ble_gatts_send_rsp(conn_id, trans_id, st, NULL); + //srvc_sr_rsp(p_inst->pending_clcb_idx, st, NULL); + break; + + case BA_READ_RPT_REF_REQ: + rsp.attr_value.handle = p_inst->pending_handle; + rsp.attr_value.len = 2; + pp = rsp.attr_value.value; + UINT8_TO_STREAM(pp, p_rsp->rpt_ref.rpt_id); + UINT8_TO_STREAM(pp, p_rsp->rpt_ref.rpt_type); + esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); + //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); + break; + + default: + break; + } + // p_inst->pending_clcb_idx = 0; + p_inst->pending_evt = 0; + p_inst->pending_handle = 0; + } + return; +} +/******************************************************************************* +** +** Function Battery_Notify +** +** Description Send battery level notification +** +*******************************************************************************/ +void Battery_Notify (UINT16 conn_id, UINT8 app_id, BD_ADDR remote_bda, UINT8 battery_level) +{ + tBA_INST *p_inst = &battery_cb.battery_inst[0]; + UINT8 i = 0; + + while (i < BA_MAX_INT_NUM) { + if (p_inst->app_id == app_id && p_inst->ba_level_hdl != 0) { + break; + } + i ++; + } + + if (i == BA_MAX_INT_NUM || p_inst->clt_cfg_hdl == 0) { + return; + } + esp_ble_gatts_hdl_val_indica(conn_id, p_inst->ba_level_hdl, 1, &battery_level, false); + //srvc_sr_notify(remote_bda, p_inst->ba_level_hdl, 1, &battery_level); + +} +#endif diff --git a/components/bt/bluedroid/profiles/std/battery/include/srvc_battery_int.h b/components/bt/bluedroid/btc/profile/std/battery/include/srvc_battery_int.h similarity index 90% rename from components/bt/bluedroid/profiles/std/battery/include/srvc_battery_int.h rename to components/bt/bluedroid/btc/profile/std/battery/include/srvc_battery_int.h index a9f81ae2e..4979f101e 100644 --- a/components/bt/bluedroid/profiles/std/battery/include/srvc_battery_int.h +++ b/components/bt/bluedroid/btc/profile/std/battery/include/srvc_battery_int.h @@ -30,8 +30,7 @@ #define BATTERY_LEVEL_SIZE 1 -typedef struct -{ +typedef struct { UINT8 app_id; UINT16 ba_level_hdl; UINT16 clt_cfg_hdl; @@ -44,15 +43,14 @@ typedef struct UINT8 pending_clcb_idx; UINT8 pending_evt; -}tBA_INST; +} tBA_INST; -typedef struct -{ +typedef struct { tBA_INST battery_inst[BA_MAX_INT_NUM]; UINT8 inst_id; BOOLEAN enabled; -}tBATTERY_CB; +} tBATTERY_CB; #ifdef __cplusplus extern "C" { @@ -69,9 +67,9 @@ extern tBATTERY_CB *battery_cb_ptr; extern BOOLEAN battery_valid_handle_range(UINT16 handle); -extern UINT8 battery_s_write_attr_value(UINT8 clcb_idx, tGATT_WRITE_REQ * p_value, - tGATT_STATUS *p_status); -extern UINT8 battery_s_read_attr_value (UINT8 clcb_idx, UINT16 handle, tGATT_VALUE *p_value, BOOLEAN is_long, tGATT_STATUS* p_status); +extern UINT8 battery_s_write_attr_value(UINT8 clcb_idx, tGATT_WRITE_REQ *p_value, + tGATT_STATUS *p_status); +extern UINT8 battery_s_read_attr_value (UINT8 clcb_idx, UINT16 handle, tGATT_VALUE *p_value, BOOLEAN is_long, tGATT_STATUS *p_status); diff --git a/components/bt/bluedroid/profiles/std/dis/dis_profile.c b/components/bt/bluedroid/btc/profile/std/dis/dis_profile.c similarity index 64% rename from components/bt/bluedroid/profiles/std/dis/dis_profile.c rename to components/bt/bluedroid/btc/profile/std/dis/dis_profile.c index f5b076caa..357db6eb7 100644 --- a/components/bt/bluedroid/profiles/std/dis/dis_profile.c +++ b/components/bt/bluedroid/btc/profile/std/dis/dis_profile.c @@ -29,7 +29,7 @@ #include "bta_api.h" #include "bta_gatt_api.h" #include "controller.h" - + #include "gatt_int.h" #include "bt_trace.h" #include "btm_api.h" @@ -45,10 +45,9 @@ + ((((UINT64)(*((p) + 4)))) << 32) + ((((UINT64)(*((p) + 5)))) << 40) + ((((UINT64)(*((p) + 6)))) << 48) + ((((UINT64)(*((p) + 7)))) << 56)); (p) += 8;} esp_bt_uuid_t uuid = {LEN_UUID_16, {UUID_SERVCLASS_DEVICE_INFO}}; -UINT16 i = 0; -tDIS_ATTR_MASK dis_mask; -static const UINT16 dis_attr_uuid[DIS_MAX_CHAR_NUM] = -{ +UINT16 i = 0; +tDIS_ATTR_MASK dis_mask; +static const UINT16 dis_attr_uuid[DIS_MAX_CHAR_NUM] = { GATT_UUID_SYSTEM_ID, GATT_UUID_MODEL_NUMBER_STR, GATT_UUID_SERIAL_NUMBER_STR, @@ -64,28 +63,27 @@ tDIS_CB dis_cb; static tDIS_ATTR_MASK dis_uuid_to_attr(UINT16 uuid) { - switch (uuid) - { - case GATT_UUID_SYSTEM_ID: - return DIS_ATTR_SYS_ID_BIT; - case GATT_UUID_MODEL_NUMBER_STR: - return DIS_ATTR_MODEL_NUM_BIT; - case GATT_UUID_SERIAL_NUMBER_STR: - return DIS_ATTR_SERIAL_NUM_BIT; - case GATT_UUID_FW_VERSION_STR: - return DIS_ATTR_FW_NUM_BIT; - case GATT_UUID_HW_VERSION_STR: - return DIS_ATTR_HW_NUM_BIT; - case GATT_UUID_SW_VERSION_STR: - return DIS_ATTR_SW_NUM_BIT; - case GATT_UUID_MANU_NAME: - return DIS_ATTR_MANU_NAME_BIT; - case GATT_UUID_IEEE_DATA: - return DIS_ATTR_IEEE_DATA_BIT; - case GATT_UUID_PNP_ID: - return DIS_ATTR_PNP_ID_BIT; - default: - return 0; + switch (uuid) { + case GATT_UUID_SYSTEM_ID: + return DIS_ATTR_SYS_ID_BIT; + case GATT_UUID_MODEL_NUMBER_STR: + return DIS_ATTR_MODEL_NUM_BIT; + case GATT_UUID_SERIAL_NUMBER_STR: + return DIS_ATTR_SERIAL_NUM_BIT; + case GATT_UUID_FW_VERSION_STR: + return DIS_ATTR_FW_NUM_BIT; + case GATT_UUID_HW_VERSION_STR: + return DIS_ATTR_HW_NUM_BIT; + case GATT_UUID_SW_VERSION_STR: + return DIS_ATTR_SW_NUM_BIT; + case GATT_UUID_MANU_NAME: + return DIS_ATTR_MANU_NAME_BIT; + case GATT_UUID_IEEE_DATA: + return DIS_ATTR_IEEE_DATA_BIT; + case GATT_UUID_PNP_ID: + return DIS_ATTR_PNP_ID_BIT; + default: + return 0; }; } @@ -96,17 +94,18 @@ static tDIS_ATTR_MASK dis_uuid_to_attr(UINT16 uuid) *******************************************************************************/ BOOLEAN dis_valid_handle_range(UINT16 handle) { - if (handle >= dis_cb.service_handle && handle <= dis_cb.max_handle) + if (handle >= dis_cb.service_handle && handle <= dis_cb.max_handle) { return TRUE; - else + } else { return FALSE; + } } /******************************************************************************* ** dis_write_attr_value ** ** Process write DIS attribute request. *******************************************************************************/ -UINT8 dis_write_attr_value(tGATT_WRITE_REQ * p_data, esp_gatt_status_t *p_status) +UINT8 dis_write_attr_value(tGATT_WRITE_REQ *p_data, esp_gatt_status_t *p_status) { UNUSED(p_data); @@ -131,65 +130,58 @@ void dis_s_read_attr_value (tGATTS_DATA *p_data, tGATT_VALUE *p_value, UINT32 tr UINT16 handle = p_data->read_req.handle; bool is_long = p_data->read_req.is_long; - for (i = 0; i < DIS_MAX_CHAR_NUM; i ++, p_db_attr ++) - { - if (handle == p_db_attr->handle) - { - if ((p_db_attr->uuid == GATT_UUID_PNP_ID || p_db_attr->uuid == GATT_UUID_SYSTEM_ID)&& - is_long == TRUE) - { + for (i = 0; i < DIS_MAX_CHAR_NUM; i ++, p_db_attr ++) { + if (handle == p_db_attr->handle) { + if ((p_db_attr->uuid == GATT_UUID_PNP_ID || p_db_attr->uuid == GATT_UUID_SYSTEM_ID) && + is_long == TRUE) { st = ESP_GATT_NOT_LONG; break; } st = ESP_GATT_NOT_FOUND; - switch (p_db_attr->uuid) - { - case GATT_UUID_MANU_NAME: - case GATT_UUID_MODEL_NUMBER_STR: - case GATT_UUID_SERIAL_NUMBER_STR: - case GATT_UUID_FW_VERSION_STR: - case GATT_UUID_HW_VERSION_STR: - case GATT_UUID_SW_VERSION_STR: - case GATT_UUID_IEEE_DATA: - pp = dis_cb.dis_value.data_string[p_db_attr->uuid - GATT_UUID_MODEL_NUMBER_STR]; - if (pp != NULL) - { - if (strlen ((char *)pp) > GATT_MAX_ATTR_LEN) - p_value->len = GATT_MAX_ATTR_LEN; - else - p_value->len = (UINT16)strlen ((char *)pp); + switch (p_db_attr->uuid) { + case GATT_UUID_MANU_NAME: + case GATT_UUID_MODEL_NUMBER_STR: + case GATT_UUID_SERIAL_NUMBER_STR: + case GATT_UUID_FW_VERSION_STR: + case GATT_UUID_HW_VERSION_STR: + case GATT_UUID_SW_VERSION_STR: + case GATT_UUID_IEEE_DATA: + pp = dis_cb.dis_value.data_string[p_db_attr->uuid - GATT_UUID_MODEL_NUMBER_STR]; + if (pp != NULL) { + if (strlen ((char *)pp) > GATT_MAX_ATTR_LEN) { + p_value->len = GATT_MAX_ATTR_LEN; + } else { + p_value->len = (UINT16)strlen ((char *)pp); } - else - p_value->len = 0; + } else { + p_value->len = 0; + } - if (offset > p_value->len) - { - st = ESP_GATT_INVALID_OFFSET; - break; - } - else - { - p_value->len -= offset; - pp += offset; - ARRAY_TO_STREAM(p, pp, p_value->len); - GATT_TRACE_EVENT("GATT_UUID_MANU_NAME len=0x%04x", p_value->len); - } + if (offset > p_value->len) { + st = ESP_GATT_INVALID_OFFSET; break; + } else { + p_value->len -= offset; + pp += offset; + ARRAY_TO_STREAM(p, pp, p_value->len); + GATT_TRACE_EVENT("GATT_UUID_MANU_NAME len=0x%04x", p_value->len); + } + break; - case GATT_UUID_SYSTEM_ID: - UINT64_TO_STREAM(p, dis_cb.dis_value.system_id); /* int_min */ - p_value->len = DIS_SYSTEM_ID_SIZE; - break; + case GATT_UUID_SYSTEM_ID: + UINT64_TO_STREAM(p, dis_cb.dis_value.system_id); /* int_min */ + p_value->len = DIS_SYSTEM_ID_SIZE; + break; - case GATT_UUID_PNP_ID: - UINT8_TO_STREAM(p, dis_cb.dis_value.pnp_id.vendor_id_src); - UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.vendor_id); - UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.product_id); - UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.product_version); - p_value->len = DIS_PNP_ID_SIZE; - break; + case GATT_UUID_PNP_ID: + UINT8_TO_STREAM(p, dis_cb.dis_value.pnp_id.vendor_id_src); + UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.vendor_id); + UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.product_id); + UINT16_TO_STREAM(p, dis_cb.dis_value.pnp_id.product_version); + p_value->len = DIS_PNP_ID_SIZE; + break; } break; @@ -198,7 +190,7 @@ void dis_s_read_attr_value (tGATTS_DATA *p_data, tGATT_VALUE *p_value, UINT32 tr tGATTS_RSP rsp; rsp.attr_value = *p_value; esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); - + } @@ -214,14 +206,13 @@ void DIS_Init (esp_gatts_if_t gatt_if, tDIS_ATTR_MASK dis_attr_mask) tGATT_STATUS status; dis_mask = dis_attr_mask; - if (dis_cb.enabled) - { + if (dis_cb.enabled) { GATT_TRACE_ERROR("DIS already initalized"); return; } memset(&dis_cb, 0, sizeof(tDIS_CB)); - + esp_ble_gatts_create_srvc (gatt_if , &uuid, 0, DIS_MAX_ATTR_NUM, TRUE); } @@ -238,11 +229,10 @@ void dis_AddChar(UINT16 service_id) //dis_cb.service_handle = service_id; //dis_cb.max_handle = service_id + DIS_MAX_ATTR_NUM; tDIS_DB_ENTRY *p_db_attr = &dis_cb.dis_attr[0]; - while(dis_mask != 0 && i < DIS_MAX_CHAR_NUM) - { + while (dis_mask != 0 && i < DIS_MAX_CHAR_NUM) { uuid.uu.uuid16 = p_db_attr->uuid = dis_attr_uuid[i]; - esp_ble_gatts_add_char(dis_cb.service_handle, &uuid, GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ); + esp_ble_gatts_add_char(dis_cb.service_handle, &uuid, GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ); p_db_attr ++; i ++; dis_mask >>= 1; @@ -263,40 +253,33 @@ tDIS_STATUS DIS_SrUpdate(tDIS_ATTR_BIT dis_attr_bit, tDIS_ATTR *p_info) UINT8 i = 1; tDIS_STATUS st = DIS_SUCCESS; - if (dis_attr_bit & DIS_ATTR_SYS_ID_BIT) - { + if (dis_attr_bit & DIS_ATTR_SYS_ID_BIT) { dis_cb.dis_value.system_id = p_info->system_id; - } - else if (dis_attr_bit & DIS_ATTR_PNP_ID_BIT) - { + } else if (dis_attr_bit & DIS_ATTR_PNP_ID_BIT) { dis_cb.dis_value.pnp_id.vendor_id = p_info->pnp_id.vendor_id; dis_cb.dis_value.pnp_id.vendor_id_src = p_info->pnp_id.vendor_id_src; dis_cb.dis_value.pnp_id.product_id = p_info->pnp_id.product_id; dis_cb.dis_value.pnp_id.product_version = p_info->pnp_id.product_version; - } - else - { + } else { st = DIS_ILLEGAL_PARAM; - while (dis_attr_bit && i < (DIS_MAX_CHAR_NUM -1 )) - { - if (dis_attr_bit & (UINT16)(1 << i)) - { - if (dis_cb.dis_value.data_string[i - 1] != NULL) + while (dis_attr_bit && i < (DIS_MAX_CHAR_NUM - 1 )) { + if (dis_attr_bit & (UINT16)(1 << i)) { + if (dis_cb.dis_value.data_string[i - 1] != NULL) { GKI_freebuf(dis_cb.dis_value.data_string[i - 1]); -/* coverity[OVERRUN-STATIC] False-positive : when i = 8, (1 << i) == DIS_ATTR_PNP_ID_BIT, and it will never come down here -CID 49902: Out-of-bounds read (OVERRUN_STATIC) -Overrunning static array "dis_cb.dis_value.data_string", with 7 elements, at position 7 with index variable "i". -*/ - if ((dis_cb.dis_value.data_string[i - 1] = (UINT8 *)GKI_getbuf((UINT16)(p_info->data_str.len + 1))) != NULL) - { + } + /* coverity[OVERRUN-STATIC] False-positive : when i = 8, (1 << i) == DIS_ATTR_PNP_ID_BIT, and it will never come down here + CID 49902: Out-of-bounds read (OVERRUN_STATIC) + Overrunning static array "dis_cb.dis_value.data_string", with 7 elements, at position 7 with index variable "i". + */ + if ((dis_cb.dis_value.data_string[i - 1] = (UINT8 *)GKI_getbuf((UINT16)(p_info->data_str.len + 1))) != NULL) { memcpy(dis_cb.dis_value.data_string[i - 1], p_info->data_str.p_data, p_info->data_str.len); dis_cb.dis_value.data_string[i - 1][p_info->data_str.len] = 0; /* make sure null terminate */ st = DIS_SUCCESS; - } - else + } else { st = DIS_NO_RESOURCES; + } break; } diff --git a/components/bt/bluedroid/profiles/std/dis/include/srvc_dis_int.h b/components/bt/bluedroid/btc/profile/std/dis/include/srvc_dis_int.h similarity index 86% rename from components/bt/bluedroid/profiles/std/dis/include/srvc_dis_int.h rename to components/bt/bluedroid/btc/profile/std/dis/include/srvc_dis_int.h index 74573195d..5da32d1e4 100644 --- a/components/bt/bluedroid/profiles/std/dis/include/srvc_dis_int.h +++ b/components/bt/bluedroid/btc/profile/std/dis/include/srvc_dis_int.h @@ -26,19 +26,17 @@ #define DIS_MAX_CHAR_NUM 9 -typedef struct -{ +typedef struct { UINT16 uuid; UINT16 handle; -}tDIS_DB_ENTRY; +} tDIS_DB_ENTRY; #define DIS_SYSTEM_ID_SIZE 8 #define DIS_PNP_ID_SIZE 7 -typedef struct -{ +typedef struct { tDIS_DB_ENTRY dis_attr[DIS_MAX_CHAR_NUM]; tDIS_VALUE dis_value; @@ -52,7 +50,7 @@ typedef struct UINT8 dis_read_uuid_idx; tDIS_ATTR_MASK request_mask; -}tDIS_CB; +} tDIS_CB; @@ -71,11 +69,11 @@ extern tDIS_CB *dis_cb_ptr; extern BOOLEAN dis_valid_handle_range(UINT16 handle); extern UINT8 dis_read_attr_value (UINT8 clcb_idx, UINT16 handle, tGATT_VALUE *p_value, - BOOLEAN is_long, tGATT_STATUS *p_status); -extern UINT8 dis_write_attr_value(tGATT_WRITE_REQ * p_data, tGATT_STATUS *p_status); + BOOLEAN is_long, tGATT_STATUS *p_status); +extern UINT8 dis_write_attr_value(tGATT_WRITE_REQ *p_data, tGATT_STATUS *p_status); extern void dis_c_cmpl_cback (tSRVC_CLCB *p_clcb, tGATTC_OPTYPE op, - tGATT_STATUS status, tGATT_CL_COMPLETE *p_data); + tGATT_STATUS status, tGATT_CL_COMPLETE *p_data); #ifdef __cplusplus diff --git a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c new file mode 100644 index 000000000..3c879984e --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -0,0 +1,687 @@ +// Copyright 2015-2016 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. + +#include + +#include "bt_types.h" +#include "bta_api.h" +#include "btc_task.h" +#include "btc_manage.h" +#include "btc_gap_ble.h" +#include "btc_gatt_util.h" +#include "esp_bt_defs.h" +#include "esp_gap_ble_api.h" + +static tBTA_BLE_ADV_DATA gl_bta_adv_data; +static tBTA_BLE_ADV_DATA gl_bta_scan_rsp_data; + +#define BTC_GAP_BLE_CB_TO_APP(_event, _param) ((esp_profile_cb_t )btc_profile_cb_get(BTC_PID_GAP_BLE))(_event, _param) + + +static void btc_gap_adv_point_cleanup(void **buf) +{ + if (NULL == *buf) { + return; + } + GKI_freebuf(*buf); + *buf = NULL; +} + + +static void btc_cleanup_adv_data(tBTA_BLE_ADV_DATA *bta_adv_data) +{ + if (bta_adv_data == NULL) { + return; + } + + // Manufacturer data cleanup + if (bta_adv_data->p_manu != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_manu->p_val); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_manu); + } + + // Proprietary data cleanup + if (bta_adv_data->p_proprietary != NULL) { + int i = 0; + tBTA_BLE_PROP_ELEM *p_elem = bta_adv_data->p_proprietary->p_elem; + while (i++ != bta_adv_data->p_proprietary->num_elem + && p_elem) { + btc_gap_adv_point_cleanup((void **) &p_elem->p_val); + ++p_elem; + } + + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_proprietary->p_elem); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_proprietary); + } + + // Service list cleanup + if (bta_adv_data->p_services != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_services->p_uuid); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_services); + } + + // Service data cleanup + if (bta_adv_data->p_service_data != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_service_data->p_val); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_service_data); + } + + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_services_128b); + + if (bta_adv_data->p_service_32b != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_service_32b->p_uuid); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_service_32b); + } + + if (bta_adv_data->p_sol_services != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_services->p_uuid); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_services); + } + + if (bta_adv_data->p_sol_service_32b != NULL) { + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_service_32b->p_uuid); + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_service_32b); + } + + btc_gap_adv_point_cleanup((void **) &bta_adv_data->p_sol_service_128b); +} + + +static void btc_to_bta_adv_data(esp_ble_adv_data_t *p_adv_data, tBTA_BLE_ADV_DATA *bta_adv_data, uint32_t *data_mask) +{ + uint32_t mask; + + btc_cleanup_adv_data(bta_adv_data); + + memset(bta_adv_data, 0, sizeof(tBTA_BLE_ADV_DATA)); + mask = 0; + + if (p_adv_data->flag != 0) { + mask = BTM_BLE_AD_BIT_FLAGS; + } + + if (p_adv_data->include_name) { + mask |= BTM_BLE_AD_BIT_DEV_NAME; + } + + if (p_adv_data->include_txpower) { + mask |= BTM_BLE_AD_BIT_TX_PWR; + } + + if (p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 && + p_adv_data->max_interval >= p_adv_data->min_interval) { + mask |= BTM_BLE_AD_BIT_INT_RANGE; + bta_adv_data->int_range.low = p_adv_data->min_interval; + bta_adv_data->int_range.hi = p_adv_data->max_interval; + } + + if (p_adv_data->include_txpower) { + //TODO + } + + if (p_adv_data->appearance != 0) { + mask |= BTM_BLE_AD_BIT_APPEARANCE; + bta_adv_data->appearance = p_adv_data->appearance; + } + + if (p_adv_data->manufacturer_len > 0 && p_adv_data->p_manufacturer_data != NULL) { + bta_adv_data->p_manu = GKI_getbuf(sizeof(tBTA_BLE_MANU)); + if (bta_adv_data->p_manu != NULL) { + bta_adv_data->p_manu->p_val = GKI_getbuf(p_adv_data->manufacturer_len); + if (bta_adv_data->p_manu->p_val != NULL) { + mask |= BTM_BLE_AD_BIT_MANU; + bta_adv_data->p_manu->len = p_adv_data->manufacturer_len; + memcpy(bta_adv_data->p_manu->p_val, p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len); + } + } + } + + tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL; + if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL) { + p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM)); + if (p_elem_service_data != NULL) { + p_elem_service_data->p_val = GKI_getbuf(p_adv_data->service_data_len); + if (p_elem_service_data->p_val != NULL) { + p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA; + p_elem_service_data->len = p_adv_data->service_data_len; + memcpy(p_elem_service_data->p_val, p_adv_data->p_service_data, + p_adv_data->service_data_len); + } else { + GKI_freebuf(p_elem_service_data); + p_elem_service_data = NULL; + } + } + } + + if (NULL != p_elem_service_data) { + bta_adv_data->p_proprietary = GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY)); + if (NULL != bta_adv_data->p_proprietary) { + tBTA_BLE_PROP_ELEM *p_elem = NULL; + tBTA_BLE_PROPRIETARY *p_prop = bta_adv_data->p_proprietary; + p_prop->num_elem = 0; + mask |= BTM_BLE_AD_BIT_PROPRIETARY; + p_prop->num_elem = 1; + p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem); + p_elem = p_prop->p_elem; + if (NULL != p_elem) { + memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM)); + } + GKI_freebuf(p_elem_service_data); + } + } + + if (p_adv_data->service_uuid_len && p_adv_data->p_service_uuid) { + UINT16 *p_uuid_out16 = NULL; + UINT32 *p_uuid_out32 = NULL; + for (int position = 0; position < p_adv_data->service_uuid_len; position += LEN_UUID_128) { + tBT_UUID bt_uuid; + + btc128_to_bta_uuid(&bt_uuid, p_adv_data->p_service_uuid + position); + + switch (bt_uuid.len) { + case (LEN_UUID_16): { + if (NULL == bta_adv_data->p_services) { + bta_adv_data->p_services = GKI_getbuf(sizeof(tBTA_BLE_SERVICE)); + bta_adv_data->p_services->list_cmpl = FALSE; + bta_adv_data->p_services->num_service = 0; + bta_adv_data->p_services->p_uuid = GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16); + p_uuid_out16 = bta_adv_data->p_services->p_uuid; + } + + if (NULL != bta_adv_data->p_services->p_uuid) { + LOG_ERROR("%s - In 16-UUID_data", __FUNCTION__); + mask |= BTM_BLE_AD_BIT_SERVICE; + ++bta_adv_data->p_services->num_service; + *p_uuid_out16++ = bt_uuid.uu.uuid16; + } + break; + } + + case (LEN_UUID_32): { + if (NULL == bta_adv_data->p_service_32b) { + bta_adv_data->p_service_32b = + GKI_getbuf(sizeof(tBTA_BLE_32SERVICE)); + bta_adv_data->p_service_32b->list_cmpl = FALSE; + bta_adv_data->p_service_32b->num_service = 0; + bta_adv_data->p_service_32b->p_uuid = + GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_32); + p_uuid_out32 = bta_adv_data->p_service_32b->p_uuid; + } + + if (NULL != bta_adv_data->p_service_32b->p_uuid) { + LOG_ERROR("%s - In 32-UUID_data", __FUNCTION__); + mask |= BTM_BLE_AD_BIT_SERVICE_32; + ++bta_adv_data->p_service_32b->num_service; + *p_uuid_out32++ = bt_uuid.uu.uuid32; + } + break; + } + + case (LEN_UUID_128): { + /* Currently, only one 128-bit UUID is supported */ + if (NULL == bta_adv_data->p_services_128b) { + bta_adv_data->p_services_128b = + GKI_getbuf(sizeof(tBTA_BLE_128SERVICE)); + if (NULL != bta_adv_data->p_services_128b) { + LOG_ERROR("%s - In 128-UUID_data", __FUNCTION__); + mask |= BTM_BLE_AD_BIT_SERVICE_128; + memcpy(bta_adv_data->p_services_128b->uuid128, + bt_uuid.uu.uuid128, LEN_UUID_128); + LOG_DEBUG("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x", bt_uuid.uu.uuid128[0], + bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3], + bt_uuid.uu.uuid128[4], bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[6], + bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[8], bt_uuid.uu.uuid128[9], + bt_uuid.uu.uuid128[10], bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[12], + bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[14], bt_uuid.uu.uuid128[15]); + bta_adv_data->p_services_128b->list_cmpl = TRUE; + } + } + break; + } + + default: + break; + } + } + } + + *data_mask = mask; +} + +static void btc_adv_data_callback(tBTA_STATUS status) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT; + param.adv_data_cmpl.status = status; + + ret = btc_transfer_context(&msg, ¶m, + sizeof(esp_ble_gap_cb_param_t), NULL); + + if (ret != BT_STATUS_SUCCESS) { + LOG_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + +static void btc_scan_rsp_data_callback(tBTA_STATUS status) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT; + param.adv_data_cmpl.status = status; + + ret = btc_transfer_context(&msg, ¶m, + sizeof(esp_ble_gap_cb_param_t), NULL); + + if (ret != BT_STATUS_SUCCESS) { + LOG_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + +static void btc_set_scan_param_callback(tGATT_IF client_if, tBTA_STATUS status ) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT; + param.adv_data_cmpl.status = status; + + ret = btc_transfer_context(&msg, ¶m, + sizeof(esp_ble_gap_cb_param_t), NULL); + + if (ret != BT_STATUS_SUCCESS) { + LOG_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + + + +static void btc_ble_set_adv_data(esp_ble_adv_data_t *adv_data, + tBTA_SET_ADV_DATA_CMPL_CBACK p_adv_data_cback) +{ + tBTA_BLE_AD_MASK data_mask = 0; + + btc_to_bta_adv_data(adv_data, &gl_bta_adv_data, &data_mask); + + if (!adv_data->set_scan_rsp) { + BTA_DmBleSetAdvConfig(data_mask, &gl_bta_adv_data, p_adv_data_cback); + } else { + BTA_DmBleSetScanRsp(data_mask, &gl_bta_adv_data, p_adv_data_cback); + } +} + + +static void btc_ble_set_scan_param(esp_ble_scan_params_t *ble_scan_params, + tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) +{ + //tBTA_BLE_AD_MASK data_mask = 0; + BTA_DmSetBleScanParams (ESP_DEFAULT_GATT_IF, + ble_scan_params->scan_interval, + ble_scan_params->scan_window, + ble_scan_params->scan_type, + scan_param_setup_cback); + //btc_to_bta_adv_data(scan_rsp_data, &gl_bta_scan_rsp_data, &data_mask); + //BTA_DmBleSetScanRsp(data_mask, &gl_bta_scan_rsp_data, p_scan_rsp_data_cback); +} + +void btc_ble_start_advertising (esp_ble_adv_params_t *ble_adv_params) +{ + tBTA_DM_DISC disc_mode = 0; + tBTA_DM_CONN conn_mode = 0; + tBLE_BD_ADDR peer_addr; + + if (ble_adv_params->adv_type == ADV_TYPE_NONCONN_IND) { + conn_mode = BTA_DM_BLE_NON_CONNECTABLE; + } else { + conn_mode = BTA_DM_BLE_CONNECTABLE; + } + + if (ble_adv_params->adv_filter_policy == ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY) { + disc_mode = BTA_DM_BLE_GENERAL_DISCOVERABLE; + } else if (ble_adv_params->adv_filter_policy == ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY + || ble_adv_params->adv_filter_policy == ADV_FILTER_ALLOW_SCAN_ANY_CON_WLST) { + disc_mode = BTA_DM_BLE_LIMITED_DISCOVERABLE; + } else if (ble_adv_params->adv_filter_policy == ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST) { + disc_mode = BTA_DM_BLE_NON_DISCOVERABLE; + } + + if (!API_BLE_ISVALID_PARAM(ble_adv_params->adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) || + !API_BLE_ISVALID_PARAM(ble_adv_params->adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) { + LOG_ERROR("Invalid advertisting interval parameters.\n"); + return ; + } + + if ((ble_adv_params->adv_type < ADV_TYPE_IND) && + (ble_adv_params->adv_type > ADV_TYPE_DIRECT_IND_LOW) ) { + LOG_ERROR("Invalid advertisting type parameters.\n"); + return; + } + + if ((ble_adv_params->adv_filter_policy < ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY) && + (ble_adv_params->adv_filter_policy > ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST) ) { + LOG_ERROR("Invalid advertisting type parameters.\n"); + return; + } + LOG_DEBUG("API_Ble_AppStartAdvertising\n"); + + /// + memcpy(peer_addr.bda, ble_adv_params->peer_addr, ESP_BD_ADDR_LEN); + peer_addr.type = ble_adv_params->peer_addr_type; + BTA_DmSetBleAdvParamsAll(ble_adv_params->adv_int_min, + ble_adv_params->adv_int_max, + ble_adv_params->adv_type, + ble_adv_params->own_addr_type, + ble_adv_params->channel_map, + ble_adv_params->adv_filter_policy, + &peer_addr); + + /*set connectable,discoverable, pairable and paired only modes of local device*/ + BTA_DmSetVisibility(disc_mode, conn_mode, (UINT8)BTA_DM_NON_PAIRABLE, (UINT8)BTA_DM_CONN_ALL); +} + + +static void btc_scan_params_callback(tGATT_IF gatt_if, tBTM_STATUS status) +{ + esp_ble_gap_cb_param_t param; + bt_status_t ret; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT; + param.scan_param_cmpl.status = status; + + ret = btc_transfer_context(&msg, ¶m, + sizeof(esp_ble_gap_cb_param_t), NULL); + + if (ret != BT_STATUS_SUCCESS) { + LOG_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + +static void btc_ble_set_scan_params(esp_ble_scan_params_t *scan_params, + tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) +{ + if (API_BLE_ISVALID_PARAM(scan_params->scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) && + API_BLE_ISVALID_PARAM(scan_params->scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) && + (scan_params->scan_type == BTM_BLE_SCAN_MODE_ACTI || scan_params->scan_type == BTM_BLE_SCAN_MODE_PASS)) { + BTA_DmSetBleScanFilterParams(0 /*client_if*/, + scan_params->scan_interval, + scan_params->scan_window, + scan_params->scan_type, + scan_params->own_addr_type, + scan_params->scan_filter_policy, + scan_param_setup_cback); + } +} + +static void btc_search_callback(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data) +{ + esp_ble_gap_cb_param_t param; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GAP_BLE; + msg.act = ESP_GAP_BLE_SCAN_RESULT_EVT; + + param.scan_rst.search_evt = event; + switch (event) { + case BTA_DM_INQ_RES_EVT: { + bdcpy(param.scan_rst.bda, p_data->inq_res.bd_addr); + param.scan_rst.dev_type = p_data->inq_res.device_type; + param.scan_rst.rssi = p_data->inq_res.rssi; + param.scan_rst.ble_addr_type = p_data->inq_res.ble_addr_type; + param.scan_rst.flag = p_data->inq_res.flag; + memcpy(param.scan_rst.ble_adv, p_data->inq_res.p_eir, + ESP_BLE_ADV_DATA_LEN_MAX); + break; + } + case BTA_DM_INQ_CMPL_EVT: { + param.scan_rst.num_resps = p_data->inq_cmpl.num_resps; + LOG_ERROR("%s BLE observe complete. Num Resp %d\n", __FUNCTION__, p_data->inq_cmpl.num_resps); + break; + } + case BTA_DM_DISC_RES_EVT: + LOG_ERROR("BTA_DM_DISC_RES_EVT\n"); + break; + case BTA_DM_DISC_BLE_RES_EVT: + LOG_ERROR("BTA_DM_DISC_BLE_RES_EVT\n"); + break; + case BTA_DM_DISC_CMPL_EVT: + LOG_ERROR("BTA_DM_DISC_CMPL_EVT\n"); + break; + case BTA_DM_DI_DISC_CMPL_EVT: + LOG_ERROR("BTA_DM_DI_DISC_CMPL_EVT\n"); + break; + case BTA_DM_SEARCH_CANCEL_CMPL_EVT: + LOG_ERROR("BTA_DM_SEARCH_CANCEL_CMPL_EVT\n"); + break; + default: + LOG_ERROR("%s : Unknown event 0x%x\n", __FUNCTION__, event); + return; + } + btc_transfer_context(&msg, ¶m, sizeof(esp_ble_gap_cb_param_t), NULL); +} + + +static void btc_ble_start_scanning(uint8_t duration, tBTA_DM_SEARCH_CBACK *results_cb) +{ + if ((duration != 0) && (results_cb != NULL)) { + ///Start scan the device + BTA_DmBleObserve(true, duration, results_cb); + } else { + LOG_ERROR("The scan duration or p_results_cb invalid\n"); + } +} + +static void btc_ble_stop_scanning(void) +{ + uint8_t duration = 0; + BTA_DmBleObserve(false, duration, NULL); +} + + +static void btc_ble_stop_advertising(void) +{ + bool stop_adv = false; + + BTA_DmBleBroadcast(stop_adv); +} + +static void btc_ble_update_conn_params(BD_ADDR bd_addr, uint16_t min_int, + uint16_t max_int, uint16_t latency, uint16_t timeout) +{ + if (min_int > max_int) { + min_int = max_int; + } + + if (min_int < BTM_BLE_CONN_INT_MIN || max_int > BTM_BLE_CONN_INT_MAX) { + LOG_ERROR("Invalid interval value.\n"); + } + + BTA_DmBleUpdateConnectionParams(bd_addr, min_int, max_int, + latency, timeout); +} + +static void btc_ble_set_pkt_data_len(BD_ADDR remote_device, uint16_t tx_data_length) +{ + if (tx_data_length > BTM_BLE_DATA_SIZE_MAX) { + tx_data_length = BTM_BLE_DATA_SIZE_MAX; + } else if (tx_data_length < BTM_BLE_DATA_SIZE_MIN) { + tx_data_length = BTM_BLE_DATA_SIZE_MIN; + } + + BTA_DmBleSetDataLength(remote_device, tx_data_length); +} + +static void btc_ble_set_rand_addr (BD_ADDR rand_addr) +{ + if (rand_addr != NULL) { + BTA_DmSetRandAddress(rand_addr); + } else { + LOG_ERROR("Invalid randrom address.\n"); + } +} + +static void btc_ble_config_local_privacy(bool privacy_enable) +{ + BTA_DmBleConfigLocalPrivacy(privacy_enable); +} + + +void btc_gap_ble_cb_handler(btc_msg_t *msg) +{ + esp_ble_gap_cb_param_t *param = (esp_ble_gap_cb_param_t *)msg->arg; + + switch (msg->act) { + case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: + BTC_GAP_BLE_CB_TO_APP(ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT, param); + break; + case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT : + BTC_GAP_BLE_CB_TO_APP(ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT, param); + break; + case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: + BTC_GAP_BLE_CB_TO_APP(ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT, param); + break; + case ESP_GAP_BLE_SCAN_RESULT_EVT: + BTC_GAP_BLE_CB_TO_APP(ESP_GAP_BLE_SCAN_RESULT_EVT, param); + break; + default: + break; + + } + +} + +void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) +{ + switch (msg->act) { + case BTC_GAP_BLE_ACT_CFG_ADV_DATA: { + btc_ble_gap_args_t *src = (btc_ble_gap_args_t *)p_src; + btc_ble_gap_args_t *dst = (btc_ble_gap_args_t *) p_dest; + + if (src->cfg_adv_data.adv_data.p_manufacturer_data) { + dst->cfg_adv_data.adv_data.p_manufacturer_data = GKI_getbuf(src->cfg_adv_data.adv_data.manufacturer_len); + memcpy(dst->cfg_adv_data.adv_data.p_manufacturer_data, src->cfg_adv_data.adv_data.p_manufacturer_data, + src->cfg_adv_data.adv_data.manufacturer_len); + } + + if (src->cfg_adv_data.adv_data.p_service_data) { + dst->cfg_adv_data.adv_data.p_service_data = GKI_getbuf(src->cfg_adv_data.adv_data.service_data_len); + memcpy(dst->cfg_adv_data.adv_data.p_service_data, src->cfg_adv_data.adv_data.p_service_data, src->cfg_adv_data.adv_data.service_data_len); + } + + if (src->cfg_adv_data.adv_data.p_service_uuid) { + dst->cfg_adv_data.adv_data.p_service_uuid = GKI_getbuf(src->cfg_adv_data.adv_data.service_uuid_len); + memcpy(dst->cfg_adv_data.adv_data.p_service_uuid, src->cfg_adv_data.adv_data.p_service_uuid, src->cfg_adv_data.adv_data.service_uuid_len); + } + break; + } + default: + LOG_ERROR("Unhandled deep copy %d\n", msg->act); + break; + } +} + +static void btc_gap_ble_arg_deep_free(btc_msg_t *msg) +{ + LOG_DEBUG("%s \n", __func__); + switch (msg->act) { + case BTC_GAP_BLE_ACT_CFG_ADV_DATA: { + esp_ble_adv_data_t *adv = &((btc_ble_gap_args_t *)msg->arg)->cfg_adv_data.adv_data; + if (adv->p_service_data) { + GKI_freebuf(adv->p_service_data); + } + + if (adv->p_service_uuid) { + GKI_freebuf(adv->p_service_uuid); + } + + if (adv->p_manufacturer_data) { + GKI_freebuf(adv->p_manufacturer_data); + } + break; + } + default: + LOG_DEBUG("Unhandled deep free %d\n", msg->act); + break; + } +} + +void btc_gap_ble_call_handler(btc_msg_t *msg) +{ + btc_ble_gap_args_t *arg = (btc_ble_gap_args_t *)msg->arg; + + LOG_DEBUG("%s act %d\n", __FUNCTION__, msg->act); + + switch (msg->act) { + case BTC_GAP_BLE_ACT_CFG_ADV_DATA: { + if (arg->cfg_adv_data.adv_data.set_scan_rsp == false) { + btc_ble_set_adv_data(&arg->cfg_adv_data.adv_data, btc_adv_data_callback); + } else { + btc_ble_set_adv_data(&arg->cfg_adv_data.adv_data, btc_scan_rsp_data_callback); + } + break; + } + case BTC_GAP_BLE_ACT_SET_SCAN_PARAM: + btc_ble_set_scan_param(&arg->set_scan_param.scan_params, btc_set_scan_param_callback); + break; + case BTC_GAP_BLE_ACT_START_SCAN: + btc_ble_start_scanning(arg->start_scan.duration, btc_search_callback); + break; + case BTC_GAP_BLE_ACT_STOP_SCAN: + btc_ble_stop_scanning(); + break; + case BTC_GAP_BLE_ACT_START_ADV: + btc_ble_start_advertising(&arg->start_adv.adv_params); + break; + case BTC_GAP_BLE_ACT_STOP_ADV: + btc_ble_stop_advertising(); + break; + case BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM: + btc_ble_update_conn_params(arg->conn_update_params.conn_params.bda, + arg->conn_update_params.conn_params.min_int, + arg->conn_update_params.conn_params.max_int, + arg->conn_update_params.conn_params.latency, + arg->conn_update_params.conn_params.timeout); + break; + case BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN: + btc_ble_set_pkt_data_len(arg->set_pkt_data_len.remote_device, arg->set_pkt_data_len.tx_data_length); + break; + case BTC_GAP_BLE_ACT_SET_RAND_ADDRESS: + btc_ble_set_rand_addr(arg->set_rand_addr.rand_addr); + break; + case BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY: + btc_ble_config_local_privacy(arg->cfg_local_privacy.privacy_enable); + break; + case BTC_GAP_BLE_ACT_SET_DEV_NAME: + BTA_DmSetDeviceName(arg->set_dev_name.device_name); + break; + default: + break; + } + + btc_gap_ble_arg_deep_free(msg); +} diff --git a/components/bt/bluedroid/api/esp_gap_api.c b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_bt.c similarity index 96% rename from components/bt/bluedroid/api/esp_gap_api.c rename to components/bt/bluedroid/btc/profile/std/gap/btc_gap_bt.c index 7313e4a17..52551ec0e 100644 --- a/components/bt/bluedroid/api/esp_gap_api.c +++ b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_bt.c @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "esp_gap_api.h" +#include "esp_gap_bt_api.h" #include "bta_api.h" #include "bt_trace.h" @@ -21,7 +21,7 @@ esp_err_t esp_bt_gap_set_scan_mode(bt_scan_mode_t mode) tBTA_DM_DISC disc_mode; tBTA_DM_CONN conn_mode; - switch(mode) { + switch (mode) { case BT_SCAN_MODE_NONE: disc_mode = BTA_DM_NON_DISC; conn_mode = BTA_DM_NON_CONN; @@ -44,6 +44,6 @@ esp_err_t esp_bt_gap_set_scan_mode(bt_scan_mode_t mode) // BTIF_TRACE_EVENT("set property scan mode : %x", mode); BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE); - + return ESP_OK; } diff --git a/components/bt/bluedroid/btc/profile/std/gatt/btc_gatt_util.c b/components/bt/bluedroid/btc/profile/std/gatt/btc_gatt_util.c new file mode 100644 index 000000000..c19ace2f7 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/gatt/btc_gatt_util.c @@ -0,0 +1,209 @@ +// Copyright 2015-2016 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. + +#include +#include +#include +#include "btc_gatt_util.h" + +#define GATTC_READ_VALUE_TYPE_VALUE 0x0000 /* Attribute value itself */ +#define GATTC_READ_VALUE_TYPE_AGG_FORMAT 0x2905 /* Characteristic Aggregate Format*/ + +static unsigned char BASE_UUID[16] = { + 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/******************************************************************************* + * BTIF -> BTA conversion functions + *******************************************************************************/ +int uuidType(unsigned char *p_uuid) +{ + int i = 0; + int match = 0; + int all_zero = 1; + + for (i = 0; i != 16; ++i) { + if (i == 12 || i == 13) { + continue; + } + + if (p_uuid[i] == BASE_UUID[i]) { + ++match; + } + + if (p_uuid[i] != 0) { + all_zero = 0; + } + } + if (all_zero) { + return 0; + } + if (match == 12) { + return LEN_UUID_32; + } + if (match == 14) { + return LEN_UUID_16; + } + return LEN_UUID_128; +} + +int btc128_to_bta_uuid(tBT_UUID *p_dest, uint8_t *p_src) +{ + int i = 0; + + p_dest->len = uuidType(p_src); + + switch (p_dest->len) { + case LEN_UUID_16: + p_dest->uu.uuid16 = (p_src[13] << 8) + p_src[12]; + break; + + case LEN_UUID_32: + p_dest->uu.uuid32 = (p_src[13] << 8) + p_src[12]; + p_dest->uu.uuid32 += (p_src[15] << 24) + (p_src[14] << 16); + break; + + case LEN_UUID_128: + for (i = 0; i != 16; ++i) { + p_dest->uu.uuid128[i] = p_src[i]; + } + break; + + default: + LOG_ERROR("%s: Unknown UUID length %d!", __FUNCTION__, p_dest->len); + break; + } +} + +/******************************************************************************* + * BTC -> BTA conversion functions + *******************************************************************************/ + +void btc_to_bta_uuid(tBT_UUID *p_dest, esp_bt_uuid_t *p_src) +{ + p_dest->len = p_src->len; + if (p_src->len == LEN_UUID_16) { + p_dest->uu.uuid16 = p_src->uuid.uuid16; + } else if (p_src->len == LEN_UUID_32) { + p_dest->uu.uuid32 = p_src->uuid.uuid32; + } else if (p_src->len == LEN_UUID_128) { + memcpy(&p_dest->uu.uuid128, p_src->uuid.uuid128, p_dest->len); + } else { + LOG_ERROR("%s UUID len is invalid %d\n", __func__, p_dest->len); + } +} + +void btc_to_bta_gatt_id(tBTA_GATT_ID *p_dest, esp_gatt_id_t *p_src) +{ + p_dest->inst_id = p_src->inst_id; + btc_to_bta_uuid(&p_dest->uuid, &p_src->uuid); +} + +void btc_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, esp_gatt_srvc_id_t *p_src) +{ + p_dest->is_primary = p_src->is_primary; + btc_to_bta_gatt_id(&p_dest->id, &p_src->id); +} + + +/******************************************************************************* + * BTA -> BTC conversion functions + *******************************************************************************/ +void bta_to_btc_uuid(esp_bt_uuid_t *p_dest, tBT_UUID *p_src) +{ + p_dest->len = p_src->len; + if (p_src->len == LEN_UUID_16) { + p_dest->uuid.uuid16 = p_src->uu.uuid16; + } else if (p_src->len == LEN_UUID_32) { + p_dest->uuid.uuid32 = p_src->uu.uuid32; + } else if (p_src->len == LEN_UUID_128) { + memcpy(&p_dest->uuid.uuid128, p_src->uu.uuid128, p_dest->len); + } else { + LOG_ERROR("%s UUID len is invalid %d\n", __func__, p_dest->len); + } +} + +void bta_to_btc_gatt_id(esp_gatt_id_t *p_dest, tBTA_GATT_ID *p_src) +{ + p_dest->inst_id = p_src->inst_id; + bta_to_btc_uuid(&p_dest->uuid, &p_src->uuid); +} + +void bta_to_btc_srvc_id(esp_gatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src) +{ + p_dest->is_primary = p_src->is_primary; + bta_to_btc_gatt_id(&p_dest->id, &p_src->id); +} + +void btc_to_bta_response(tBTA_GATTS_RSP *p_dest, esp_gatt_rsp_t *p_src) +{ + p_dest->attr_value.auth_req = p_src->attr_value.auth_req; + p_dest->attr_value.handle = p_src->attr_value.handle; + p_dest->attr_value.len = p_src->attr_value.len; + p_dest->attr_value.offset = p_src->attr_value.offset; + memcpy(p_dest->attr_value.value, p_src->attr_value.value, ESP_GATT_MAX_ATTR_LEN); +} + +uint16_t get_uuid16(tBT_UUID *p_uuid) +{ + if (p_uuid->len == LEN_UUID_16) { + return p_uuid->uu.uuid16; + } else if (p_uuid->len == LEN_UUID_128) { + UINT16 u16; + UINT8 *p = &p_uuid->uu.uuid128[LEN_UUID_128 - 4]; + STREAM_TO_UINT16(u16, p); + return u16; + } else { /* p_uuid->len == LEN_UUID_32 */ + return (UINT16) p_uuid->uu.uuid32; + } +} +uint16_t set_read_value(esp_ble_gattc_cb_param_t *p_dest, tBTA_GATTC_READ *p_src) +{ + uint16_t descr_type = 0; + uint16_t len = 0; + + p_dest->read.status = p_src->status; + p_dest->read.conn_id = p_src->conn_id; + bta_to_btc_srvc_id(&p_dest->read.srvc_id, &p_src->srvc_id); + bta_to_btc_gatt_id(&p_dest->read.char_id, &p_src->char_id); + bta_to_btc_gatt_id(&p_dest->read.descr_id, &p_src->descr_type); + + descr_type = get_uuid16(&p_src->descr_type.uuid); + + switch (descr_type) { + case GATT_UUID_CHAR_AGG_FORMAT: + /* not supported */ + p_dest->read.value_type = GATTC_READ_VALUE_TYPE_AGG_FORMAT; + p_dest->read.value_len = 0; + break; + + default: + if (( p_src->status == BTA_GATT_OK ) && (p_src->p_value != NULL)) { + LOG_INFO("%s unformat.len = %d ", __FUNCTION__, p_src->p_value->unformat.len); + p_dest->read.value_len = p_src->p_value->unformat.len; + if ( p_src->p_value->unformat.len > 0 && p_src->p_value->unformat.p_value != NULL ) { + p_dest->read.value = p_src->p_value->unformat.p_value; + } + len += p_src->p_value->unformat.len; + } else { + p_dest->read.value_len = 0; + } + + p_dest->read.value_type = GATTC_READ_VALUE_TYPE_VALUE; + break; + } + + return len; +} diff --git a/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c new file mode 100644 index 000000000..8fe99c5e6 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c @@ -0,0 +1,664 @@ +// Copyright 2015-2016 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. + +#include + +#include "btm_ble_api.h" +#include "btc_gattc.h" +#include "btc_gatt_util.h" +#include "btc_manage.h" +#include "bta_gatt_api.h" +#include "bt_trace.h" +#include "esp_gattc_api.h" + +#define BTC_GATTC_CB_TO_APP(_event, _param) ((esp_profile_cb_t )btc_profile_cb_get(BTC_PID_GATTC))(_event, _param) + +void btc_gattc_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) +{ + btc_ble_gattc_args_t *dst = (btc_ble_gattc_args_t *) p_dest; + btc_ble_gattc_args_t *src = (btc_ble_gattc_args_t *)p_src; + + switch (msg->act) { + case BTC_GATTC_ACT_WRITE_CHAR: { + dst->write_char.value = (uint8_t *)GKI_getbuf(src->write_char.value_len); + if (dst->write_char.value) { + memcpy(dst->write_char.value, src->write_char.value, src->write_char.value_len); + } else { + LOG_ERROR("%s %d no mem\n", __func__, msg->act); + } + break; + } + case BTC_GATTC_ACT_WRITE_CHAR_DESCR: { + dst->write_descr.value = (uint8_t *)GKI_getbuf(src->write_descr.value_len); + if (dst->write_descr.value) { + memcpy(dst->write_descr.value, src->write_descr.value, src->write_descr.value_len); + } else { + LOG_ERROR("%s %d no mem\n", __func__, msg->act); + } + break; + } + case BTC_GATTC_ACT_PREPARE_WRITE: { + dst->prep_write.value = (uint8_t *)GKI_getbuf(src->prep_write.value_len); + if (dst->prep_write.value) { + memcpy(dst->prep_write.value, src->prep_write.value, src->prep_write.value_len); + } else { + LOG_ERROR("%s %d no mem\n", __func__, msg->act); + } + break; + } + default: + LOG_DEBUG("%s Unhandled deep copy %d\n", __func__, msg->act); + break; + } +} + +void btc_gattc_arg_deep_free(btc_msg_t *msg) +{ + btc_ble_gattc_args_t *arg = (btc_ble_gattc_args_t *)msg->arg; + + switch (msg->act) { + case BTC_GATTC_ACT_WRITE_CHAR: { + if (arg->write_char.value) { + GKI_freebuf(arg->write_char.value); + } + break; + } + case BTC_GATTC_ACT_WRITE_CHAR_DESCR: { + if (arg->write_descr.value) { + GKI_freebuf(arg->write_descr.value); + } + break; + } + case BTC_GATTC_ACT_PREPARE_WRITE: { + if (arg->prep_write.value) { + GKI_freebuf(arg->prep_write.value); + } + break; + } + default: + LOG_DEBUG("%s Unhandled deep free %d\n", __func__, msg->act); + break; + } + +} + +// TODO: to be finished, used in deep-copying data from lower layer +static void btc_gattc_copy_req_data(btc_msg_t *msg, void *p_dest, void *p_src) +{ + tBTA_GATTC *p_dest_data = (tBTA_GATTC *) p_dest; + tBTA_GATTC *p_src_data = (tBTA_GATTC *) p_src; + + if (!p_src_data || !p_dest_data) { + return; + } + + // Allocate buffer for request data if necessary + switch (msg->act) { + default: + break; + } +} + +// TODO: to be finished, used to free deep-copied data allocated using btc_gattc_copy_req_data() +static void btc_gattc_free_req_data(btc_msg_t *msg) +{ + return; +} + +static void btc_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) +{ + bt_status_t ret; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GATTC; + msg.act = (uint8_t) event; + ret = btc_transfer_context(&msg, p_data, sizeof(tBTA_GATTC), btc_gattc_copy_req_data); + + if (ret) { + LOG_ERROR("%s transfer failed\n", __func__); + } +} + +static void btc_gattc_app_register(btc_ble_gattc_args_t *arg) +{ + tBT_UUID app_uuid; + app_uuid.len = 2; + app_uuid.uu.uuid16 = arg->app_reg.app_id; + BTA_GATTC_AppRegister(&app_uuid, btc_gattc_cback); +} + +static void btc_gattc_app_unregister(btc_ble_gattc_args_t *arg) +{ + BTA_GATTC_AppDeregister(arg->app_unreg.gatt_if); +} + +static void btc_gattc_open(btc_ble_gattc_args_t *arg) +{ + tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; + BTA_GATTC_Open(arg->open.gatt_if, arg->open.remote_bda, arg->open.is_direct, transport); +} + +static void btc_gattc_close(btc_ble_gattc_args_t *arg) +{ + // TODO; Review this call of BTA_API, check the usage of BTA_GATTC_CancelOpen + BTA_GATTC_Close(arg->close.conn_id); +} + +static void btc_gattc_cfg_mtu(btc_ble_gattc_args_t *arg) +{ + BTA_GATTC_ConfigureMTU (arg->cfg_mtu.conn_id, arg->cfg_mtu.mtu); +} + +static void btc_gattc_search_service(btc_ble_gattc_args_t *arg) +{ + tBT_UUID srvc_uuid; + + if (arg->search_srvc.filter_uuid_enable) { + btc_to_bta_uuid(&srvc_uuid, &arg->search_srvc.filter_uuid); + BTA_GATTC_ServiceSearchRequest(arg->search_srvc.conn_id, &srvc_uuid); + } else { + BTA_GATTC_ServiceSearchRequest(arg->search_srvc.conn_id, NULL); + } +} + +static void btc_gattc_get_first_char(btc_ble_gattc_args_t *arg) +{ + esp_gatt_id_t char_id; + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_ID out_char_id; + tBTA_GATT_CHAR_PROP out_char_prop; + tBTA_GATT_SRVC_ID srvc_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&srvc_id, &arg->get_first_char.service_id); + status = BTA_GATTC_GetFirstChar(arg->get_first_char.conn_id, &srvc_id, NULL, + &out_char_id, &out_char_prop); + if (status == 0) { + bta_to_btc_gatt_id(&char_id, &out_char_id.char_id); + } + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_char.conn_id = arg->get_first_char.conn_id; + param.get_char.status = status; + memcpy(¶m.get_char.srvc_id, &arg->get_first_char.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_char.char_id, &char_id, sizeof(esp_gatt_id_t)); + param.get_char.char_prop = out_char_prop; + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_CHAR_EVT, ¶m); +} + +static void btc_gattc_get_next_char(btc_ble_gattc_args_t *arg) +{ + esp_gatt_id_t char_id; + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_ID in_char_id; + tBTA_GATTC_CHAR_ID out_char_id; + tBTA_GATT_CHAR_PROP out_char_prop; + esp_ble_gattc_cb_param_t param; + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->get_next_char.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->get_next_char.char_id); + + status = BTA_GATTC_GetNextChar(arg->get_next_char.conn_id, &in_char_id, NULL, + &out_char_id, &out_char_prop); + + if (status == 0) { + bta_to_btc_gatt_id(&char_id, &out_char_id.char_id); + } + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_char.conn_id = arg->get_next_char.conn_id; + param.get_char.status = status; + memcpy(¶m.get_char.srvc_id, &arg->get_next_char.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_char.char_id, &char_id, sizeof(esp_gatt_id_t)); + param.get_char.char_prop = out_char_prop; + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_CHAR_EVT, ¶m); +} + +static void btc_gattc_get_first_descr(btc_ble_gattc_args_t *arg) +{ + esp_gatt_id_t descr_id; + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_ID in_char_id; + tBTA_GATTC_CHAR_DESCR_ID out_char_descr_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->get_first_descr.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->get_first_descr.char_id); + + status = BTA_GATTC_GetFirstCharDescr(arg->get_first_descr.conn_id, &in_char_id, NULL, + &out_char_descr_id); + + if (status == 0) { + bta_to_btc_gatt_id(&descr_id, &out_char_descr_id.descr_id); + } + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_descr.conn_id = arg->get_first_descr.conn_id; + param.get_descr.status = status; + memcpy(¶m.get_descr.srvc_id, &arg->get_first_descr.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_descr.char_id, &arg->get_first_descr.char_id, sizeof(esp_gatt_id_t)); + memcpy(¶m.get_descr.descr_id, &descr_id, sizeof(esp_gatt_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_DESCR_EVT, ¶m); +} + +static void btc_gattc_get_next_descr(btc_ble_gattc_args_t *arg) +{ + esp_gatt_id_t descr_id; + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_DESCR_ID in_char_descr_id; + tBTA_GATTC_CHAR_DESCR_ID out_char_descr_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &arg->get_next_descr.service_id); + btc_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &arg->get_next_descr.char_id); + btc_to_bta_gatt_id(&in_char_descr_id.descr_id, &arg->get_next_descr.descr_id); + + status = BTA_GATTC_GetNextCharDescr(arg->get_next_descr.conn_id, &in_char_descr_id + , NULL, &out_char_descr_id); + if (status == 0) { + bta_to_btc_gatt_id(&descr_id, &out_char_descr_id.descr_id); + } + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_descr.conn_id = arg->get_next_descr.conn_id; + param.get_descr.status = status; + memcpy(¶m.get_descr.srvc_id, &arg->get_next_descr.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_descr.char_id, &arg->get_next_descr.char_id, sizeof(esp_gatt_id_t)); + memcpy(¶m.get_descr.descr_id, &descr_id, sizeof(esp_gatt_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_DESCR_EVT, ¶m); +} + +static void btc_gattc_get_first_incl_service(btc_ble_gattc_args_t *arg) +{ + esp_gatt_srvc_id_t incl_srvc_id; + tBTA_GATT_STATUS status; + tBTA_GATT_SRVC_ID srvc_id; + tBTA_GATTC_INCL_SVC_ID out_incl_svc_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&srvc_id, &arg->get_first_incl_srvc.service_id); + + status = BTA_GATTC_GetFirstIncludedService(arg->get_first_incl_srvc.conn_id, &srvc_id, + NULL, &out_incl_svc_id); + + bta_to_btc_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id); + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_incl_srvc.conn_id = arg->get_first_incl_srvc.conn_id; + param.get_incl_srvc.status = status; + memcpy(¶m.get_incl_srvc.srvc_id, &arg->get_first_incl_srvc.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_incl_srvc.incl_srvc_id, &incl_srvc_id, sizeof(esp_gatt_srvc_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_INCL_SRVC_EVT, ¶m); +} + +static void btc_gattc_get_next_incl_service(btc_ble_gattc_args_t *arg) +{ + esp_gatt_srvc_id_t incl_srvc_id; + tBTA_GATT_STATUS status; + tBTA_GATTC_INCL_SVC_ID in_incl_svc_id; + tBTA_GATTC_INCL_SVC_ID out_incl_svc_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&in_incl_svc_id.srvc_id, &arg->get_next_incl_srvc.service_id); + btc_to_bta_srvc_id(&in_incl_svc_id.incl_svc_id, &arg->get_next_incl_srvc.start_service_id); + + status = BTA_GATTC_GetNextIncludedService(arg->get_next_incl_srvc.conn_id, &in_incl_svc_id, + NULL, &out_incl_svc_id); + + bta_to_btc_srvc_id(&incl_srvc_id, &out_incl_svc_id.incl_svc_id); + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.get_incl_srvc.conn_id = arg->get_next_incl_srvc.conn_id; + param.get_incl_srvc.status = status; + memcpy(¶m.get_incl_srvc.srvc_id, &arg->get_next_incl_srvc.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.get_incl_srvc.incl_srvc_id, &incl_srvc_id, sizeof(esp_gatt_srvc_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_GET_INCL_SRVC_EVT, ¶m); +} + +static void btc_gattc_read_char(btc_ble_gattc_args_t *arg) +{ + tBTA_GATTC_CHAR_ID in_char_id; + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->read_char.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->read_char.char_id); + BTA_GATTC_ReadCharacteristic(arg->read_char.conn_id, &in_char_id, arg->read_char.auth_req); +} + +static void btc_gattc_read_char_descr(btc_ble_gattc_args_t *arg) +{ + tBTA_GATTC_CHAR_DESCR_ID in_char_descr_id; + btc_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &arg->read_descr.service_id); + btc_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &arg->read_descr.char_id); + btc_to_bta_gatt_id(&in_char_descr_id.descr_id, &arg->read_descr.descr_id); + + BTA_GATTC_ReadCharDescr(arg->read_descr.conn_id, &in_char_descr_id, arg->read_descr.auth_req); +} + +static void btc_gattc_write_char(btc_ble_gattc_args_t *arg) +{ + //TODO: check the write type + tBTA_GATTC_CHAR_ID in_char_id; + tBTA_GATTC_WRITE_TYPE write_type = BTA_GATTC_TYPE_WRITE; + + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->write_char.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->write_char.char_id); + + BTA_GATTC_WriteCharValue(arg->write_char.conn_id, &in_char_id, + write_type, + arg->write_char.value_len, + arg->write_char.value, + arg->write_char.auth_req); +} + +static void btc_gattc_write_char_descr(btc_ble_gattc_args_t *arg) +{ + //TODO: check the write type + tBTA_GATTC_CHAR_DESCR_ID in_char_descr_id; + tBTA_GATT_UNFMT descr_val; + tBTA_GATTC_WRITE_TYPE write_type = BTA_GATTC_TYPE_WRITE; + btc_to_bta_srvc_id(&in_char_descr_id.char_id.srvc_id, &arg->write_descr.service_id); + btc_to_bta_gatt_id(&in_char_descr_id.char_id.char_id, &arg->write_descr.char_id); + btc_to_bta_gatt_id(&in_char_descr_id.descr_id, &arg->write_descr.descr_id); + + descr_val.len = arg->write_descr.value_len; + descr_val.p_value = arg->write_descr.value; + + BTA_GATTC_WriteCharDescr(arg->write_descr.conn_id, &in_char_descr_id, + write_type, &descr_val, + arg->write_descr.auth_req); +} + +static void btc_gattc_prepare_write(btc_ble_gattc_args_t *arg) +{ + tBTA_GATTC_CHAR_ID in_char_id; + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->prep_write.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->prep_write.char_id); + + BTA_GATTC_PrepareWrite(arg->prep_write.conn_id, + &in_char_id, + arg->prep_write.offset, + arg->prep_write.value_len, + arg->prep_write.value, + arg->prep_write.auth_req); +} + +static void btc_gattc_execute_wrtie(btc_ble_gattc_args_t *arg) +{ + BTA_GATTC_ExecuteWrite(arg->exec_write.conn_id, arg->exec_write.is_execute); +} + +static void btc_gattc_reg_for_notify(btc_ble_gattc_args_t *arg) +{ + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_ID in_char_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->reg_for_notify.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->reg_for_notify.char_id); + + status = BTA_GATTC_RegisterForNotifications(arg->reg_for_notify.gatt_if, + arg->reg_for_notify.remote_bda, + &in_char_id); + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.reg_for_notify.status = status; + memcpy(¶m.reg_for_notify.srvc_id, &arg->reg_for_notify.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.reg_for_notify.char_id, &arg->reg_for_notify.service_id, sizeof(esp_gatt_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_REG_FOR_NOTIFY_EVT, ¶m); +} + +static void btc_gattc_unreg_for_notify(btc_ble_gattc_args_t *arg) +{ + tBTA_GATT_STATUS status; + tBTA_GATTC_CHAR_ID in_char_id; + esp_ble_gattc_cb_param_t param; + + btc_to_bta_srvc_id(&in_char_id.srvc_id, &arg->unreg_for_notify.service_id); + btc_to_bta_gatt_id(&in_char_id.char_id, &arg->unreg_for_notify.char_id); + + status = BTA_GATTC_DeregisterForNotifications(arg->unreg_for_notify.gatt_if, + arg->unreg_for_notify.remote_bda, + &in_char_id); + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + param.unreg_for_notify.status = status; + memcpy(¶m.unreg_for_notify.srvc_id, &arg->unreg_for_notify.service_id, sizeof(esp_gatt_srvc_id_t)); + memcpy(¶m.unreg_for_notify.char_id, &arg->unreg_for_notify.service_id, sizeof(esp_gatt_id_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_UNREG_FOR_NOTIFY_EVT, ¶m); +} + +void btc_gattc_call_handler(btc_msg_t *msg) +{ + btc_ble_gattc_args_t *arg = (btc_ble_gattc_args_t *)(msg->arg); + switch (msg->act) { + case BTC_GATTC_ACT_APP_REGISTER: + btc_gattc_app_register(arg); + break; + case BTC_GATTC_ACT_APP_UNREGISTER: + btc_gattc_app_unregister(arg); + break; + case BTC_GATTC_ACT_OPEN: + btc_gattc_open(arg); + break; + case BTC_GATTC_ACT_CLOSE: + btc_gattc_close(arg); + break; + case BTC_GATTC_ACT_CFG_MTU: + btc_gattc_cfg_mtu(arg); + break; + case BTC_GATTC_ACT_SEARCH_SERVICE: + btc_gattc_search_service(arg); + break; + case BTC_GATTC_ACT_GET_FIRST_CHAR: + btc_gattc_get_first_char(arg); + break; + case BTC_GATTC_ACT_GET_NEXT_CHAR: + btc_gattc_get_next_char(arg); + break; + case BTC_GATTC_ACT_GET_FIRST_DESCR: + btc_gattc_get_first_descr(arg); + break; + case BTC_GATTC_ACT_GET_NEXT_DESCR: + btc_gattc_get_next_descr(arg); + break; + case BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE: + btc_gattc_get_first_incl_service(arg); + break; + case BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE: + btc_gattc_get_next_incl_service(arg); + break; + case BTC_GATTC_ACT_READ_CHAR: + btc_gattc_read_char(arg); + break; + case BTC_GATTC_ACT_READ_CHAR_DESCR: + btc_gattc_read_char_descr(arg); + break; + case BTC_GATTC_ACT_WRITE_CHAR: + btc_gattc_write_char(arg); + break; + case BTC_GATTC_ACT_WRITE_CHAR_DESCR: + btc_gattc_write_char_descr(arg); + break; + case BTC_GATTC_ACT_PREPARE_WRITE: + btc_gattc_prepare_write(arg); + break; + case BTC_GATTC_ACT_EXECUTE_WRITE: + btc_gattc_execute_wrtie(arg); + break; + case BTC_GATTC_ACT_REG_FOR_NOTIFY: + btc_gattc_reg_for_notify(arg); + break; + case BTC_GATTC_ACT_UNREG_FOR_NOTIFY: + btc_gattc_unreg_for_notify(arg); + break; + default: + LOG_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act); + break; + } + + btc_gattc_arg_deep_free(msg); +} + +void btc_gattc_cb_handler(btc_msg_t *msg) +{ + tBTA_GATTC *arg = (tBTA_GATTC *)(msg->arg); + esp_ble_gattc_cb_param_t param; + + memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); + + switch (msg->act) { + case BTA_GATTC_REG_EVT: { + tBTA_GATTC_REG *reg_oper = &arg->reg_oper; + param.reg.status = reg_oper->status; + param.reg.gatt_if = reg_oper->client_if; + memcpy(¶m.reg.uuid, ®_oper->app_uuid, sizeof(esp_bt_uuid_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_REG_EVT, ¶m); + break; + } + case BTA_GATTC_DEREG_EVT: { + BTC_GATTC_CB_TO_APP(ESP_GATTC_UNREG_EVT, NULL); + break; + } + case BTA_GATTC_READ_CHAR_EVT: { + set_read_value(¶m, &arg->read); + BTC_GATTC_CB_TO_APP(ESP_GATTC_READ_CHAR_EVT, ¶m); + break; + } + + case BTA_GATTC_WRITE_CHAR_EVT: + case BTA_GATTC_PREP_WRITE_EVT: { + tBTA_GATTC_WRITE *write = &arg->write; + uint32_t ret_evt = (msg->act == BTA_GATTC_WRITE_CHAR_EVT) ? + ESP_GATTC_WRITE_CHAR_EVT : ESP_GATTC_PREP_WRITE_EVT; + param.write.conn_id = write->conn_id; + param.write.status = write->status; + bta_to_btc_srvc_id(¶m.write.srvc_id, &write->srvc_id); + bta_to_btc_gatt_id(¶m.write.char_id, &write->char_id); + BTC_GATTC_CB_TO_APP(ret_evt, ¶m); + break; + } + + case BTA_GATTC_EXEC_EVT: { + tBTA_GATTC_EXEC_CMPL *exec_cmpl = &arg->exec_cmpl; + param.exec_cmpl.conn_id = exec_cmpl->conn_id; + param.exec_cmpl.status = exec_cmpl->status; + BTC_GATTC_CB_TO_APP(ESP_GATTC_EXEC_EVT, ¶m); + break; + } + + case BTA_GATTC_SEARCH_CMPL_EVT: { + tBTA_GATTC_SEARCH_CMPL *search_cmpl = &arg->search_cmpl; + param.search_cmpl.conn_id = search_cmpl->conn_id; + param.search_cmpl.status = search_cmpl->status; + BTC_GATTC_CB_TO_APP(ESP_GATTC_SEARCH_CMPL_EVT, ¶m); + break; + } + case BTA_GATTC_SEARCH_RES_EVT: { + tBTA_GATTC_SRVC_RES *srvc_res = &arg->srvc_res; + param.search_res.conn_id = srvc_res->conn_id; + bta_to_btc_srvc_id(¶m.search_res.service_id, &srvc_res->service_uuid); + BTC_GATTC_CB_TO_APP(ESP_GATTC_SEARCH_RES_EVT, ¶m); + break; + } + case BTA_GATTC_READ_DESCR_EVT: { + set_read_value(¶m, &arg->read); + BTC_GATTC_CB_TO_APP(ESP_GATTC_READ_DESCR_EVT, ¶m); + break; + } + case BTA_GATTC_WRITE_DESCR_EVT: { + tBTA_GATTC_WRITE *write = &arg->write; + param.write.conn_id = write->conn_id; + param.write.status = write->status; + bta_to_btc_srvc_id(¶m.write.srvc_id, &write->srvc_id); + bta_to_btc_gatt_id(¶m.write.char_id, &write->char_id); + bta_to_btc_gatt_id(¶m.write.descr_id, &write->descr_type); + BTC_GATTC_CB_TO_APP(ESP_GATTC_WRITE_DESCR_EVT, ¶m); + break; + } + case BTA_GATTC_NOTIF_EVT: { + tBTA_GATTC_NOTIFY *notify = &arg->notify; + param.notify.conn_id = notify->conn_id; + memcpy(¶m.notify.bda, ¬ify->bda, sizeof(esp_bd_addr_t)); + bta_to_btc_srvc_id(¶m.notify.srvc_id, ¬ify->char_id.srvc_id); + bta_to_btc_gatt_id(¶m.notify.char_id, ¬ify->char_id.char_id); + bta_to_btc_gatt_id(¶m.notify.descr_id, ¬ify->descr_type); + param.notify.is_notify = (notify->is_notify == TRUE) ? true : false; + param.notify.value_len = (notify->len > ESP_GATT_MAX_ATTR_LEN) ? \ + ESP_GATT_MAX_ATTR_LEN : notify->len; + param.notify.value = notify->value; + + if (notify->is_notify == FALSE) { + BTA_GATTC_SendIndConfirm(notify->conn_id, ¬ify->char_id); + } + + BTC_GATTC_CB_TO_APP(ESP_GATTC_NOTIFY_EVT, ¶m); + break; + } + case BTA_GATTC_OPEN_EVT: { + tBTA_GATTC_OPEN *open = &arg->open; + param.open.status = open->status; + param.open.conn_id = open->conn_id; + param.open.gatt_if = open->client_if; + memcpy(¶m.open.remote_bda, &open->remote_bda, sizeof(esp_bd_addr_t)); + param.open.mtu = open->mtu; + BTC_GATTC_CB_TO_APP(ESP_GATTC_OPEN_EVT, ¶m); + break; + } + case BTA_GATTC_CLOSE_EVT: { + tBTA_GATTC_CLOSE *close = &arg->close; + param.close.status = close->status; + param.close.conn_id = close->conn_id; + param.close.gatt_if = close->client_if; + memcpy(¶m.close.remote_bda, &close->remote_bda, sizeof(esp_bd_addr_t)); + param.close.reason = close->reason; + BTC_GATTC_CB_TO_APP(ESP_GATTC_CLOSE_EVT, ¶m); + break; + } + + case BTA_GATTC_CFG_MTU_EVT: { + tBTA_GATTC_CFG_MTU *cfg_mtu = &arg->cfg_mtu; + param.cfg_mtu.conn_id = cfg_mtu->conn_id; + param.cfg_mtu.status = cfg_mtu->status; + param.cfg_mtu.mtu = cfg_mtu->mtu; + BTC_GATTC_CB_TO_APP(ESP_GATTC_CFG_MTU_EVT, ¶m); + break; + } + + case BTA_GATTC_ACL_EVT: { + BTC_GATTC_CB_TO_APP(ESP_GATTC_ACL_EVT, NULL); + break; + } + case BTA_GATTC_CANCEL_OPEN_EVT: { + BTC_GATTC_CB_TO_APP(ESP_GATTC_CANCEL_OPEN_EVT, NULL); + break; + } + case BTA_GATTC_CONGEST_EVT: { + tBTA_GATTC_CONGEST *congest = &arg->congest; + param.congest.conn_id = congest->conn_id; + param.congest.congested = (congest->congested == TRUE) ? true : false; + BTC_GATTC_CB_TO_APP(ESP_GATTC_CONGEST_EVT, ¶m); + break; + } + case BTA_GATTC_SRVC_CHG_EVT: { + memcpy(¶m.srvc_chg.remote_bda, &arg->remote_bda, sizeof(esp_bd_addr_t)); + BTC_GATTC_CB_TO_APP(ESP_GATTC_SRVC_CHG_EVT, ¶m); + break; + } + default: + LOG_ERROR("%s: Unhandled event (%d)!", __FUNCTION__, msg->act); + break; + } + + // free the deep-copied data + btc_gattc_free_req_data(msg); +} diff --git a/components/bt/bluedroid/btc/profile/std/gatt/btc_gatts.c b/components/bt/bluedroid/btc/profile/std/gatt/btc_gatts.c new file mode 100644 index 000000000..39e5f7936 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/gatt/btc_gatts.c @@ -0,0 +1,443 @@ +// Copyright 2015-2016 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. + +#include + +#include "bta_gatt_api.h" + +#include "btc_task.h" +#include "btc_manage.h" +#include "btc_gatts.h" +#include "btc_gatt_util.h" + +#include "esp_gatts_api.h" + +#define BTC_GATTS_CB_TO_APP(_event, _param) ((esp_profile_cb_t)btc_profile_cb_get(BTC_PID_GATTS))(_event, _param) + +#define A2C_GATTS_EVT(_bta_event) (_bta_event) //BTA TO BTC EVT +#define C2A_GATTS_EVT(_btc_event) (_btc_event) //BTC TO BTA EVT + +void btc_gatts_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src) +{ + btc_ble_gatts_args_t *dst = (btc_ble_gatts_args_t *) p_dest; + btc_ble_gatts_args_t *src = (btc_ble_gatts_args_t *)p_src; + + switch (msg->act) { + case BTC_GATTS_ACT_SEND_INDICATE: { + dst->send_ind.value = (uint8_t *)GKI_getbuf(src->send_ind.value_len); + if (dst->send_ind.value) { + memcpy(dst->send_ind.value, src->send_ind.value, src->send_ind.value_len); + } else { + LOG_ERROR("%s %d no mem\n", __func__, msg->act); + } + break; + } + case BTC_GATTS_ACT_SEND_RESPONSE: { + if (src->send_rsp.rsp) { + dst->send_rsp.rsp = (esp_gatt_rsp_t *)GKI_getbuf(sizeof(esp_gatt_rsp_t)); + if (dst->send_rsp.rsp) { + memcpy(dst->send_rsp.rsp, src->send_rsp.rsp, sizeof(esp_gatt_rsp_t)); + } else { + LOG_ERROR("%s %d no mem\n", __func__, msg->act); + } + } + break; + } + default: + LOG_DEBUG("%s Unhandled deep copy %d\n", __func__, msg->act); + break; + } + +} + +void btc_gatts_arg_deep_free(btc_msg_t *msg) +{ + btc_ble_gatts_args_t *arg = (btc_ble_gatts_args_t *)msg->arg; + + switch (msg->act) { + case BTC_GATTS_ACT_SEND_INDICATE: { + if (arg->send_ind.value) { + GKI_freebuf(arg->send_ind.value); + } + break; + } + case BTC_GATTS_ACT_SEND_RESPONSE: { + if (arg->send_rsp.rsp) { + GKI_freebuf(arg->send_rsp.rsp); + } + break; + } + default: + LOG_DEBUG("%s Unhandled deep free %d\n", __func__, msg->act); + break; + } + +} + + +static void btc_gatts_cb_param_copy_req(btc_msg_t *msg, void *p_dest, void *p_src) +{ + uint16_t event = msg->act; + + tBTA_GATTS *p_dest_data = (tBTA_GATTS *) p_dest; + tBTA_GATTS *p_src_data = (tBTA_GATTS *) p_src; + + if (!p_src_data || !p_dest_data) { + return; + } + + // Copy basic structure first + memcpy(p_dest_data, p_src_data, sizeof(tBTA_GATTS)); + + // Allocate buffer for request data if necessary + switch (event) { + case BTA_GATTS_READ_EVT: + case BTA_GATTS_WRITE_EVT: + case BTA_GATTS_EXEC_WRITE_EVT: + case BTA_GATTS_MTU_EVT: + p_dest_data->req_data.p_data = GKI_getbuf(sizeof(tBTA_GATTS_REQ_DATA)); + if (p_dest_data->req_data.p_data != NULL) { + memcpy(p_dest_data->req_data.p_data, p_src_data->req_data.p_data, + sizeof(tBTA_GATTS_REQ_DATA)); + } + break; + + default: + break; + } +} + +static void btc_gatts_cb_param_copy_free(btc_msg_t *msg, tBTA_GATTS *p_data) +{ + uint16_t event = msg->act; + + switch (event) { + case BTA_GATTS_READ_EVT: + case BTA_GATTS_WRITE_EVT: + case BTA_GATTS_EXEC_WRITE_EVT: + case BTA_GATTS_MTU_EVT: + if (p_data && p_data->req_data.p_data) { + GKI_freebuf(p_data->req_data.p_data); + } + break; + + default: + break; + } +} + + +static void btc_gatts_inter_cb(tBTA_GATTS_EVT event, tBTA_GATTS *p_data) +{ + bt_status_t status; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CB; + msg.pid = BTC_PID_GATTS; + msg.act = event; + + status = btc_transfer_context(&msg, p_data, + sizeof(tBTA_GATTS), btc_gatts_cb_param_copy_req); + + if (status != BT_STATUS_SUCCESS) { + LOG_ERROR("%s btc_transfer_context failed\n", __func__); + } +} + +void btc_gatts_call_handler(btc_msg_t *msg) +{ + btc_ble_gatts_args_t *arg = (btc_ble_gatts_args_t *)msg->arg; + + switch (msg->act) { + case BTC_GATTS_ACT_APP_REGISTER: { + tBT_UUID uuid; + + uuid.len = LEN_UUID_16; + uuid.uu.uuid16 = arg->app_reg.app_id; + + BTA_GATTS_AppRegister(&uuid, btc_gatts_inter_cb); + + break; + } + case BTC_GATTS_ACT_APP_UNREGISTER: + BTA_GATTS_AppDeregister(arg->app_unreg.gatt_if); + break; + case BTC_GATTS_ACT_CREATE_SERVICE: { + tBTA_GATT_SRVC_ID srvc_id; + btc_to_bta_srvc_id(&srvc_id, &arg->create_srvc.service_id); + BTA_GATTS_CreateService(arg->create_srvc.gatt_if, &srvc_id.id.uuid, + srvc_id.id.inst_id, arg->create_srvc.num_handle, + srvc_id.is_primary); + break; + } + case BTC_GATTS_ACT_DELETE_SERVICE: + BTA_GATTS_DeleteService(arg->delete_srvc.service_handle); + break; + case BTC_GATTS_ACT_START_SERVICE: + BTA_GATTS_StartService(arg->start_srvc.service_handle, BTA_GATT_TRANSPORT_LE); + break; + case BTC_GATTS_ACT_STOP_SERVICE: + BTA_GATTS_StopService(arg->stop_srvc.service_handle); + break; + case BTC_GATTS_ACT_ADD_INCLUDE_SERVICE: + BTA_GATTS_AddIncludeService(arg->add_incl_srvc.service_handle, arg->add_incl_srvc.included_service_handle); + break; + case BTC_GATTS_ACT_ADD_CHAR: { + tBT_UUID uuid; + btc_to_bta_uuid(&uuid, &arg->add_char.char_uuid); + + BTA_GATTS_AddCharacteristic(arg->add_char.service_handle, &uuid, + arg->add_char.perm, arg->add_char.property); + break; + } + case BTC_GATTS_ACT_ADD_CHAR_DESCR: { + tBT_UUID uuid; + btc_to_bta_uuid(&uuid, &arg->add_descr.descr_uuid); + BTA_GATTS_AddCharDescriptor(arg->add_descr.service_handle, arg->add_descr.perm, &uuid); + break; + } + case BTC_GATTS_ACT_SEND_INDICATE: + BTA_GATTS_HandleValueIndication(arg->send_ind.conn_id, arg->send_ind.attr_handle, + arg->send_ind.value_len, arg->send_ind.value, arg->send_ind.need_confirm); + break; + case BTC_GATTS_ACT_SEND_RESPONSE: { + esp_ble_gatts_cb_param_t param; + esp_gatt_rsp_t *p_rsp = arg->send_rsp.rsp; + + if (p_rsp) { + tBTA_GATTS_RSP rsp_struct; + btc_to_bta_response(&rsp_struct, p_rsp); + BTA_GATTS_SendRsp(arg->send_rsp.conn_id, arg->send_rsp.trans_id, + arg->send_rsp.status, &rsp_struct); + param.rsp.handle = rsp_struct.attr_value.handle; + } else { + BTA_GATTS_SendRsp(arg->send_rsp.conn_id, arg->send_rsp.trans_id, + arg->send_rsp.status, NULL); + } + + param.rsp.status = 0; + BTC_GATTS_CB_TO_APP(ESP_GATTS_RESPONSE_EVT, ¶m); + break; + } + case BTC_GATTS_ACT_OPEN: { + // Ensure device is in inquiry database + int addr_type = 0; + int device_type = 0; + tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; + + //TODO : implement address type and device type +#if 0 + if (_get_address_type(arg->remote_bda, &addr_type) && + btif_get_device_type(arg->remote_bda, &device_type) && + device_type != BT_DEVICE_TYPE_BREDR) { + BTA_DmAddBleDevice(p_cb->bd_addr.address, addr_type, device_type); + } +#else + //BTA_DmAddBleDevice(p_cb->bd_addr.address, addr_type, device_type); +#endif + // Mark background connections + if (!arg->open.is_direct) { + BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL); + } + + transport = BTA_GATT_TRANSPORT_LE; + + // Connect! + BTA_GATTS_Open(arg->open.gatt_if, arg->open.remote_bda, + arg->open.is_direct, transport); + break; + } + case BTC_GATTS_ACT_CLOSE: + // TODO : implement cancel open + // Cancel pending foreground/background connections + //BTA_GATTS_CancelOpen(p_cb->server_if, p_cb->bd_addr.address, TRUE); + //BTA_GATTS_CancelOpen(p_cb->server_if, p_cb->bd_addr.address, FALSE); + + // Close active connection + if (arg->close.conn_id != 0) { + BTA_GATTS_Close(arg->close.conn_id); + } + + break; + default: + break; + } + btc_gatts_arg_deep_free(msg); +} + +void btc_gatts_cb_handler(btc_msg_t *msg) +{ + esp_ble_gatts_cb_param_t param; + + tBTA_GATTS *p_data = (tBTA_GATTS *)msg->arg; + + switch (msg->act) { + case BTA_GATTS_REG_EVT: { + param.reg.status = p_data->reg_oper.status; + param.reg.gatt_if = p_data->reg_oper.server_if; + param.reg.app_id = p_data->reg_oper.uuid.uu.uuid16; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_REG_EVT, ¶m); + break; + } + case BTA_GATTS_DEREG_EVT: + // do nothing + break; + case BTA_GATTS_READ_EVT: { + param.read.conn_id = p_data->req_data.conn_id; + param.read.trans_id = p_data->req_data.trans_id; + memcpy(param.read.bda, p_data->req_data.remote_bda, ESP_BD_ADDR_LEN); + param.read.handle = p_data->req_data.p_data->read_req.handle, + param.read.offset = p_data->req_data.p_data->read_req.offset, + param.read.is_long = p_data->req_data.p_data->read_req.is_long, + + BTC_GATTS_CB_TO_APP(ESP_GATTS_READ_EVT, ¶m); + break; + } + case BTA_GATTS_WRITE_EVT: { + param.write.conn_id = p_data->req_data.conn_id; + param.write.trans_id = p_data->req_data.trans_id; + memcpy(param.write.bda, p_data->req_data.remote_bda, ESP_BD_ADDR_LEN); + param.write.handle = p_data->req_data.p_data->write_req.handle; + param.write.offset = p_data->req_data.p_data->write_req.offset; + param.write.need_rsp = p_data->req_data.p_data->write_req.need_rsp; + param.write.is_prep = p_data->req_data.p_data->write_req.is_prep; + param.write.len = p_data->req_data.p_data->write_req.len; + param.write.value = p_data->req_data.p_data->write_req.value; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_WRITE_EVT, ¶m); + + break; + } + case BTA_GATTS_EXEC_WRITE_EVT: { + param.exec_write.conn_id = p_data->req_data.conn_id; + param.exec_write.trans_id = p_data->req_data.trans_id; + memcpy(param.exec_write.bda, p_data->req_data.remote_bda, ESP_BD_ADDR_LEN); + param.exec_write.exec_write_flag = p_data->req_data.p_data->exec_write; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_EXEC_WRITE_EVT, ¶m); + + break; + } + case BTA_GATTS_MTU_EVT: + param.mtu.conn_id = p_data->req_data.conn_id; + param.mtu.mtu = p_data->req_data.p_data->mtu; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_MTU_EVT, ¶m); + break; + case BTA_GATTS_CONF_EVT: + param.conf.conn_id = p_data->req_data.conn_id; + param.conf.status = p_data->req_data.status; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_CONF_EVT, ¶m); + break; + case BTA_GATTS_CREATE_EVT: + param.create.status = p_data->create.status; + param.create.gatt_if = p_data->create.server_if; + param.create.service_handle = p_data->create.service_id; + param.create.service_id.is_primary = p_data->create.is_primary; + param.create.service_id.id.inst_id = p_data->create.svc_instance; + bta_to_btc_uuid(¶m.create.service_id.id.uuid, &p_data->create.uuid); + BTC_GATTS_CB_TO_APP(ESP_GATTS_CREATE_EVT, ¶m); + break; + case BTA_GATTS_ADD_INCL_SRVC_EVT: + param.add_incl_srvc.status = p_data->add_result.status; + param.add_incl_srvc.gatt_if = p_data->add_result.server_if; + param.add_incl_srvc.attr_handle = p_data->add_result.attr_id; + param.add_incl_srvc.service_handle = p_data->add_result.service_id; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_ADD_INCL_SRVC_EVT, ¶m); + break; + case BTA_GATTS_ADD_CHAR_EVT: + param.add_char.status = p_data->add_result.status; + param.add_char.gatt_if = p_data->add_result.server_if; + param.add_char.attr_handle = p_data->add_result.attr_id; + param.add_char.service_handle = p_data->add_result.service_id; + bta_to_btc_uuid(¶m.add_char.char_uuid, &p_data->add_result.char_uuid); + + BTC_GATTS_CB_TO_APP(ESP_GATTS_ADD_CHAR_EVT, ¶m); + break; + case BTA_GATTS_ADD_CHAR_DESCR_EVT: + param.add_char_descr.status = p_data->add_result.status; + param.add_char_descr.gatt_if = p_data->add_result.server_if; + param.add_char_descr.attr_handle = p_data->add_result.attr_id; + param.add_char_descr.service_handle = p_data->add_result.service_id; + bta_to_btc_uuid(¶m.add_char_descr.char_uuid, &p_data->add_result.char_uuid); + + BTC_GATTS_CB_TO_APP(ESP_GATTS_ADD_CHAR_DESCR_EVT, ¶m); + break; + case BTA_GATTS_DELELTE_EVT: + param.del.status = p_data->srvc_oper.status; + param.del.gatt_if = p_data->srvc_oper.server_if; + param.del.service_handle = p_data->srvc_oper.service_id; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_DELELTE_EVT, ¶m); + break; + case BTA_GATTS_START_EVT: + param.start.status = p_data->srvc_oper.status; + param.start.gatt_if = p_data->srvc_oper.server_if; + param.start.service_handle = p_data->srvc_oper.service_id; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_START_EVT, ¶m); + break; + case BTA_GATTS_STOP_EVT: + param.stop.status = p_data->srvc_oper.status; + param.stop.gatt_if = p_data->srvc_oper.server_if; + param.stop.service_handle = p_data->srvc_oper.service_id; + + BTC_GATTS_CB_TO_APP(ESP_GATTS_STOP_EVT, ¶m); + break; + case BTA_GATTS_CONNECT_EVT: + param.connect.conn_id = p_data->conn.conn_id; + param.connect.gatt_if = p_data->conn.server_if; + param.connect.is_connected = true; + memcpy(param.connect.remote_bda, p_data->conn.remote_bda, ESP_BD_ADDR_LEN); + + BTC_GATTS_CB_TO_APP(ESP_GATTS_CONNECT_EVT, ¶m); + break; + case BTA_GATTS_DISCONNECT_EVT: + param.connect.conn_id = p_data->conn.conn_id; + param.connect.gatt_if = p_data->conn.server_if; + param.connect.is_connected = false; + memcpy(param.connect.remote_bda, p_data->conn.remote_bda, ESP_BD_ADDR_LEN); + + BTC_GATTS_CB_TO_APP(ESP_GATTS_DISCONNECT_EVT, ¶m); + break; + case BTA_GATTS_OPEN_EVT: + // do nothing + case BTA_GATTS_CANCEL_OPEN_EVT: + // do nothing + case BTA_GATTS_CLOSE_EVT: + // do nothing + case BTA_GATTS_LISTEN_EVT: + // do nothing + break; + case BTA_GATTS_CONGEST_EVT: + param.congest.conn_id = p_data->congest.conn_id; + param.congest.congested = p_data->congest.congested; + break; + default: + // do nothing + break; + } + + btc_gatts_cb_param_copy_free(msg, p_data); + + //ets_printf("yyy\n"); +} + + + + + diff --git a/components/bt/bluedroid/btc/profile/std/gatt/include/btc_gatt_util.h b/components/bt/bluedroid/btc/profile/std/gatt/include/btc_gatt_util.h new file mode 100644 index 000000000..1fa7b59f5 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/gatt/include/btc_gatt_util.h @@ -0,0 +1,36 @@ +// Copyright 2015-2016 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 __BTC_GATT_UTIL_H__ +#define __BTC_GATT_UTIL_H__ + +#include "bt_types.h" +#include "bta_gatt_api.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "esp_gattc_api.h" + +int btc128_to_bta_uuid(tBT_UUID *p_dest, uint8_t *p_src); +void btc_to_bta_uuid(tBT_UUID *p_dest, esp_bt_uuid_t *p_src); +void btc_to_bta_gatt_id(tBTA_GATT_ID *p_dest, esp_gatt_id_t *p_src); +void btc_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, esp_gatt_srvc_id_t *p_src); +void btc_to_bta_response(tBTA_GATTS_RSP *rsp_struct, esp_gatt_rsp_t *p_rsp); + +void bta_to_btc_uuid(esp_bt_uuid_t *p_dest, tBT_UUID *p_src); +void bta_to_btc_gatt_id(esp_gatt_id_t *p_dest, tBTA_GATT_ID *p_src); +void bta_to_btc_srvc_id(esp_gatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src); + +uint16_t set_read_value(esp_ble_gattc_cb_param_t *p_dest, tBTA_GATTC_READ *p_src); + +#endif /* __BTC_GATT_UTIL_H__*/ diff --git a/components/bt/bluedroid/profiles/std/hid/include/hid_conn.h b/components/bt/bluedroid/btc/profile/std/hid/include/hid_conn.h old mode 100755 new mode 100644 similarity index 98% rename from components/bt/bluedroid/profiles/std/hid/include/hid_conn.h rename to components/bt/bluedroid/btc/profile/std/hid/include/hid_conn.h index 79bb496b4..220ae9a5b --- a/components/bt/bluedroid/profiles/std/hid/include/hid_conn.h +++ b/components/bt/bluedroid/btc/profile/std/hid/include/hid_conn.h @@ -28,8 +28,7 @@ /* Define the HID Connection Block */ -typedef struct hid_conn -{ +typedef struct hid_conn { #define HID_CONN_STATE_UNUSED (0) #define HID_CONN_STATE_CONNECTING_CTRL (1) #define HID_CONN_STATE_CONNECTING_INTR (2) diff --git a/components/bt/bluedroid/profiles/std/hid/include/hidh_int.h b/components/bt/bluedroid/btc/profile/std/hid/include/hidh_int.h old mode 100755 new mode 100644 similarity index 93% rename from components/bt/bluedroid/profiles/std/hid/include/hidh_int.h rename to components/bt/bluedroid/btc/profile/std/hid/include/hidh_int.h index 3fedea2b1..afdb9308e --- a/components/bt/bluedroid/profiles/std/hid/include/hidh_int.h +++ b/components/bt/bluedroid/btc/profile/std/hid/include/hidh_int.h @@ -34,12 +34,11 @@ enum { HID_DEV_CONNECTED }; -typedef struct per_device_ctb -{ +typedef struct per_device_ctb { BOOLEAN in_use; BD_ADDR addr; /* BD-Addr of the host device */ UINT16 attr_mask; /* 0x01- virtual_cable; 0x02- normally_connectable; 0x03- reconn_initiate; - 0x04- sdp_disable; */ + 0x04- sdp_disable; */ UINT8 state; /* Device state if in HOST-KNOWN mode */ UINT8 conn_substate; UINT8 conn_tries; /* Remembers to the number of connection attempts while CONNECTING */ @@ -47,8 +46,7 @@ typedef struct per_device_ctb tHID_CONN conn; /* L2CAP channel info */ } tHID_HOST_DEV_CTB; -typedef struct host_ctb -{ +typedef struct host_ctb { tHID_HOST_DEV_CTB devices[HID_HOST_MAX_DEVICES]; tHID_HOST_DEV_CALLBACK *callback; /* Application callbacks */ tL2CAP_CFG_INFO l2cap_cfg; @@ -64,7 +62,7 @@ typedef struct host_ctb } tHID_HOST_CTB; extern tHID_STATUS hidh_conn_snd_data(UINT8 dhandle, UINT8 trans_type, UINT8 param, \ - UINT16 data,UINT8 rpt_id, BT_HDR *buf); + UINT16 data, UINT8 rpt_id, BT_HDR *buf); extern tHID_STATUS hidh_conn_reg (void); extern void hidh_conn_dereg( void ); extern tHID_STATUS hidh_conn_disconnect (UINT8 dhandle); diff --git a/components/bt/bluedroid/btc/profile/std/hid_le/hid_le_prf.c b/components/bt/bluedroid/btc/profile/std/hid_le/hid_le_prf.c new file mode 100644 index 000000000..06a882a73 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/hid_le/hid_le_prf.c @@ -0,0 +1,638 @@ +#include +// Copyright 2015-2016 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. + +#include "hid_le_prf.h" +#include "prf_defs.h" + +#if (HIDD_LE_PROFILE_CFG) +hidd_le_env_t hidd_le_env; + +#define HI_UINT16(a) (((a) >> 8) & 0xFF) +#define LO_UINT16(a) ((a) & 0xFF) + + +// HID Information characteristic value +static const uint8_t hidInfo[HID_INFORMATION_LEN] = { + LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) + 0x00, // bCountryCode + HID_KBD_FLAGS // Flags +}; + +// HID Report Map characteristic value +// Keyboard report descriptor (using format for Boot interface descriptor) +static const uint8_t hidReportMap[] = { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report Id (1) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Buttons) + 0x19, 0x01, // Usage Minimum (01) - Button 1 + 0x29, 0x03, // Usage Maximum (03) - Button 3 + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x03, // Report Count (3) + 0x81, 0x02, // Input (Data, Variable, Absolute) - Button states + 0x75, 0x05, // Report Size (5) + 0x95, 0x01, // Report Count (1) + 0x81, 0x01, // Input (Constant) - Padding or Reserved bits + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x38, // Usage (Wheel) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x03, // Report Count (3) + 0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate + 0xC0, // End Collection + 0xC0, // End Collection + + 0x05, 0x01, // Usage Pg (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection: (Application) + 0x85, 0x02, // Report Id (2) + // + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0xE0, // Usage Min (224) + 0x29, 0xE7, // Usage Max (231) + 0x15, 0x00, // Log Min (0) + 0x25, 0x01, // Log Max (1) + // + // Modifier byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input: (Data, Variable, Absolute) + // + // Reserved byte + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input: (Constant) + // + // LED report + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Pg (LEDs) + 0x19, 0x01, // Usage Min (1) + 0x29, 0x05, // Usage Max (5) + 0x91, 0x02, // Output: (Data, Variable, Absolute) + // + // LED report padding + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output: (Constant) + // + // Key arrays (6 bytes) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Log Min (0) + 0x25, 0x65, // Log Max (101) + 0x05, 0x07, // Usage Pg (Key Codes) + 0x19, 0x00, // Usage Min (0) + 0x29, 0x65, // Usage Max (101) + 0x81, 0x00, // Input: (Data, Array) + // + 0xC0, // End Collection + // + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x01, // Usage (Consumer Control) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x03, // Report Id (3) + 0x09, 0x02, // Usage (Numeric Key Pad) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x0A, // Usage Max (Button 10) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0A, // Logical Max (10) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x05, 0x0C, // Usage Pg (Consumer Devices) + 0x09, 0x86, // Usage (Channel) + 0x15, 0xFF, // Logical Min (-1) + 0x25, 0x01, // Logical Max (1) + 0x75, 0x02, // Report Size (2) + 0x95, 0x01, // Report Count (1) + 0x81, 0x46, // Input (Data, Var, Rel, Null) + 0x09, 0xE9, // Usage (Volume Up) + 0x09, 0xEA, // Usage (Volume Down) + 0x15, 0x00, // Logical Min (0) + 0x75, 0x01, // Report Size (1) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data, Var, Abs) + 0x09, 0xE2, // Usage (Mute) + 0x09, 0x30, // Usage (Power) + 0x09, 0x83, // Usage (Recall Last) + 0x09, 0x81, // Usage (Assign Selection) + 0x09, 0xB0, // Usage (Play) + 0x09, 0xB1, // Usage (Pause) + 0x09, 0xB2, // Usage (Record) + 0x09, 0xB3, // Usage (Fast Forward) + 0x09, 0xB4, // Usage (Rewind) + 0x09, 0xB5, // Usage (Scan Next) + 0x09, 0xB6, // Usage (Scan Prev) + 0x09, 0xB7, // Usage (Stop) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x0C, // Logical Max (12) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0x09, 0x80, // Usage (Selection) + 0xA1, 0x02, // Collection (Logical) + 0x05, 0x09, // Usage Pg (Button) + 0x19, 0x01, // Usage Min (Button 1) + 0x29, 0x03, // Usage Max (Button 3) + 0x15, 0x01, // Logical Min (1) + 0x25, 0x03, // Logical Max (3) + 0x75, 0x02, // Report Size (2) + 0x81, 0x00, // Input (Data, Ary, Abs) + 0xC0, // End Collection + 0x81, 0x03, // Input (Const, Var, Abs) + 0xC0 // End Collection +}; + +// HID report map length +uint8_t hidReportMapLen = sizeof(hidReportMap); + +uint8_t hidProtocolMode = HID_PROTOCOL_MODE_REPORT; + +// HID report mapping table +static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; + + +esp_bt_uuid_t char_info_uuid = {LEN_UUID_16, {CHAR_HID_INFO_UUID}}; +esp_bt_uuid_t char_ctnl_pt_uuid = {LEN_UUID_16, {CHAR_HID_CTNL_PT_UUID}}; +esp_bt_uuid_t char_report_map_uuid = {LEN_UUID_16, {CHAR_REPORT_MAP_UUID}}; +esp_bt_uuid_t char_report_uuid = {LEN_UUID_16, {CHAR_REPORT_UUID}}; +esp_bt_uuid_t char_proto_mode_uuid = {LEN_UUID_16, {CHAR_PROTOCOL_MODE_UUID}}; +esp_bt_uuid_t char_kb_in_report_uuid = {LEN_UUID_16, {CHAR_BOOT_KB_IN_REPORT_UUID}}; +esp_bt_uuid_t char_kb_out_report_uuid = {LEN_UUID_16, {CHAR_BOOT_KB_OUT_REPORT_UUID}}; +esp_bt_uuid_t char_mouse_in_report_uuid = {LEN_UUID_16, {CHAR_BOOT_MOUSE_IN_REPORT_UUID}}; + + + +/// Full HID device Database Description - Used to add attributes into the database +const char_desc_t hids_char_db[HIDD_LE_CHAR_MAX] = { + // HID Information Characteristic Value + [HIDD_LE_INFO_CHAR] = { + &char_info_uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ + }, + + // HID Control Point Characteristic Value + [HIDD_LE_CTNL_PT_CHAR] = { + &char_ctnl_pt_uuid, + GATT_PERM_WRITE, + GATT_CHAR_PROP_BIT_WRITE_NR + }, + + // Report Map Characteristic Value + [HIDD_LE_REPORT_MAP_CHAR] = { + &char_report_map_uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ + }, + // Report Characteristic Value + [HIDD_LE_REPORT_CHAR] = { + &char_report_uuid, + (GATT_PERM_READ | GATT_PERM_WRITE), + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE | GATT_CHAR_PROP_BIT_WRITE_NR) + }, + // Protocol Mode Characteristic Declaration + [HIDD_LE_PROTO_MODE_CHAR] = { + &char_proto_mode_uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ, + }, + + // Boot Keyboard Input Report Characteristic Value + [HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = { + &char_kb_in_report_uuid, + GATT_PERM_READ, + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_NOTIFY), + + }, + + // Boot Keyboard Output Report Characteristic Value + [HIDD_LE_BOOT_KB_OUT_REPORT_CHAR] = { + &char_kb_out_report_uuid, + GATT_PERM_READ, + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE | GATT_CHAR_PROP_BIT_WRITE_NR) + }, + + // Boot Mouse Input Report Characteristic Value + [HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR] = { + &char_mouse_in_report_uuid, + GATT_PERM_READ, + (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_NOTIFY), + }, +}; + +static void hidd_add_characterisitc(const char_desc_t *char_desc); + +/***************************************************************************** +** Constants +*****************************************************************************/ +static void hidd_le_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); + +/******************************************************************************* +** +** Function hidd_add_characterisitc +** +** Description the callback function after the hid device profile has been register to the BTA manager module +** +** Returns NULL +** +*******************************************************************************/ +static void hidd_add_characterisitc(const char_desc_t *char_desc) +{ + uint16_t service_id; + if (char_desc == NULL) { + LOG_ERROR("Invalid hid characteristic\n"); + return; + } + //check the hid device serivce has been register to the data base or not + if (!hidd_le_env.enabled) { + LOG_ERROR("The hid device didn't register yet\n"); + return; + } + //get the service id from the env whitch has been register + service_id = hidd_le_env.hidd_clcb.cur_srvc_id; + if (char_desc->char_uuid != 0x00) { + // start added the charact to the data base + esp_ble_gatts_add_char (service_id, + char_desc->char_uuid, + char_desc->perm, + char_desc->prop); + } +} + + +/******************************************************************************* +** +** Function hidd_le_profile_cb +** +** Description the callback function after the hid device profile has been register to the BTA manager module +** +** Returns NULL +** +*******************************************************************************/ +static void hidd_le_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) +{ + esp_gatts_rsp_t rsp; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_HID}}; + static uint8_t hid_char_idx; + hidd_clcb_t *p_clcb = NULL; + uint8_t app_id = 0xff; + + switch (event) { + case ESP_GATTS_REG_EVT: + //check the register of the hid device profile has been succeess or not + if (p_data->reg_oper.status != ESP_GATT_OK) { + LOG_ERROR("hidd profile register failed\n"); + } + hidd_le_env.hidd_inst.app_id = app_id; + //save the gatt interface in the hid device ENV + hidd_le_env.gatt_if = p_data->reg_oper.server_if; + //set the env flag to enable + hidd_le_env.enabled = true; + //create the hid device service to the service data base. + if (p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_HID) { + hidd_le_create_service(true); + } + break; + case ESP_GATTS_CREATE_EVT: + if (p_data->create.uuid.uu.uuid16 == ATT_SVC_HID) { + ///store the service id to the env + hidd_le_env.hidd_clcb.cur_srvc_id = p_data->create.service_id; + //start the button service after created + esp_ble_gatts_start_srvc(p_data->create.service_id); + hid_char_idx = HIDD_LE_INFO_CHAR; + //added the info character to the data base. + hidd_add_characterisitc(&hids_char_db[hid_char_idx]); + hid_char_idx++; + } + + break; + case ESP_GATTS_ADD_INCL_SRVC_EVT: + + break; + case ESP_GATTS_ADD_CHAR_EVT: + //save the charateristic handle to the env + hidd_le_env.hidd_inst.att_tbl[hid_char_idx - 1] = p_data->add_result.attr_id; + LOG_ERROR("hanlder = %x, p_data->add_result.char_uuid.uu.uuid16 = %x\n", p_data->add_result.attr_id, + p_data->add_result.char_uuid.uu.uuid16); + LOG_ERROR("hid_char_idx=%x\n", hid_char_idx); + if (hid_char_idx <= HIDD_LE_CHAR_MAX) { //added the characteristic until the index overflow + + if ((p_data->add_result.char_uuid.uu.uuid16 == CHAR_BOOT_KB_IN_REPORT_UUID) || + (p_data->add_result.char_uuid.uu.uuid16 == CHAR_BOOT_MOUSE_IN_REPORT_UUID)) { + // add the gattc config descriptor to the notify charateristic + //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); + uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + LOG_ERROR("p_data->add_result.char_uuid.uu.uuid16 = %x\n", + p_data->add_result.char_uuid.uu.uuid16); + esp_ble_gatts_add_char_descr (hidd_le_env.hidd_clcb.cur_srvc_id, + GATT_PERM_WRITE, + &uuid); + + + break; + } + hidd_add_characterisitc(&hids_char_db[hid_char_idx]); + } + hid_char_idx++; + break; + case ESP_GATTS_ADD_CHAR_DESCR_EVT: + if (p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { + uuid.uu.uuid16 = GATT_UUID_RPT_REF_DESCR; + BTA_GATTS_AddCharDescriptor (hidd_le_env.hidd_clcb.cur_srvc_id, + GATT_PERM_READ, + &uuid); + LOG_ERROR("p_data->add_result.char_uuid.uu.uuid16 = %x\n", + p_data->add_result.char_uuid.uu.uuid16); + } + if (p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_RPT_REF_DESCR) { + if (hid_char_idx < HIDD_LE_CHAR_MAX) { + hidd_add_characterisitc(&hids_char_db[hid_char_idx]); + hid_char_idx++; + } + } + break; + case ESP_GATTS_READ_EVT: { + LOG_ERROR("Hidd profile BTA_GATTS_READ_EVT\n"); + UINT32 trans_id = p_data->req_data.trans_id; + UINT16 conn_id = p_data->req_data.conn_id; + UINT16 handle = p_data->req_data.p_data->read_req.handle; + bool is_long = p_data->req_data.p_data->read_req.is_long; + LOG_ERROR("read request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", + event, handle, trans_id, conn_id); + + hidd_read_attr_value(p_data->req_data.p_data, trans_id); + } + break; + case ESP_GATTS_WRITE_EVT: + esp_ble_gatts_send_rsp (p_data->req_data.conn_id, p_data->req_data.trans_id, + p_data->req_data.status, NULL); + break; + case ESP_GATTS_CONNECT_EVT: + p_clcb = &hidd_le_env.hidd_clcb; + + if (!p_clcb->in_use) { + p_clcb->in_use = TRUE; + p_clcb->conn_id = p_data->conn.conn_id;; + LOG_ERROR("hidd->conn_id = %x\n", p_data->conn.conn_id); + p_clcb->connected = TRUE; + memcpy(p_clcb->remote_bda, p_data->conn.remote_bda, BD_ADDR_LEN); + } + break; + case ESP_GATTS_DISCONNECT_EVT: + p_clcb = &hidd_le_env.hidd_clcb; + //set the connection flag to true + p_clcb->connected = false; + p_clcb->in_use = TRUE; + memset(p_clcb->remote_bda, 0, BD_ADDR_LEN); + break; + case ESP_GATTS_START_EVT: + break; + case ESP_GATTS_CONGEST_EVT: + if (hidd_le_env.hidd_clcb.connected && (hidd_le_env.hidd_clcb.conn_id == p_data->conn.conn_id)) { + //set the connection channal congested flag to true + hidd_le_env.hidd_clcb.congest = p_data->congest.congested; + } + break; + default: + break; + } +} + +/******************************************************************************* +** +** Function hidd_le_create_service +** +** Description Create a Service for the hid device profile +** +** Parameters is_primary: this service is the primary service or not,true is the primary service +** false is not the primary service +** p_service_uuid: service UUID. +** +** Returns NULL +** +*******************************************************************************/ +void hidd_le_create_service(BOOLEAN is_primary) +{ + esp_gatts_if_t server_if ; + esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_HID}}; + //the number of the hid device attributes in the hid service. + UINT16 num_handle = HIDD_LE_IDX_NB; + UINT8 inst = 0x00; + server_if = hidd_le_env.gatt_if; + hidd_le_env.inst_id = inst; + //start create the hid device service + esp_ble_gatts_create_srvc (server_if, &uuid, inst, num_handle, is_primary); +} + + +/***************************************************************************** +** Function hidd_read_attr_value +** +** Description it will be called when client sends a read request +******************************************************************************/ +void hidd_read_attr_value(tGATTS_DATA *p_data, uint32_t trans_id) +{ + hidd_inst_t *p_inst = &hidd_le_env.hidd_inst; + uint8_t i; + uint8_t status = ESP_GATT_OK; + uint8_t app_id = hidd_le_env.hidd_inst.app_id; + + esp_gatt_status_t st = ESP_GATT_NOT_FOUND; + uint16_t handle = p_data->read_req.handle; + uint16_t conn_id = hidd_le_env.hidd_clcb.conn_id; + + if (handle == p_inst->att_tbl[HIDD_LE_INFO_CHAR]) { + //read hid device info evt + p_inst->pending_evt = HIDD_LE_READ_INFO_EVT; + + } else if (handle == p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]) { + //read hid device contol point evt + p_inst->pending_evt = HIDD_LE_READ_CTNL_PT_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]) { + //read hid device report map value evt + p_inst->pending_evt = HIDD_LE_READ_REPORT_MAP_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_REPORT_CHAR]) { + //read hid device report evt + p_inst->pending_evt = HIDD_LE_READ_REPORT_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]) { + //read hid device mode evt + p_inst->pending_evt = HIDD_LE_READ_PROTO_MODE_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]) { + //read hid boot keyboard in report evt + p_inst->pending_evt = HIDD_LE_BOOT_KB_IN_REPORT_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_BOOT_KB_OUT_REPORT_CHAR]) { + //read hid boot keyboard out report evt + p_inst->pending_evt = HIDD_LE_BOOT_KB_OUT_REPORT_EVT; + } else if (handle == p_inst->att_tbl[HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR]) { + //read hid device boot mouse in report evt + p_inst->pending_evt = HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT; + } + + //start build the rsp message + hidd_rsp(trans_id, conn_id, app_id, status, p_inst->pending_evt, p_data); +} + +/******************************************************************************* +** +** Function hidd_rsp +** +** Description Respond to a hid device service request +** +*******************************************************************************/ +void hidd_rsp (uint32_t trans_id, uint16_t conn_id, uint8_t app_id, + esp_gatt_status_t status, uint8_t event, tGATTS_DATA *p_rsp) +{ + hidd_inst_t *p_inst = &hidd_le_env.hidd_inst; + tGATTS_RSP rsp; + uint8_t *pp; + LOG_ERROR("conn_id = %x, trans_id = %x, event = %x\n", + conn_id, trans_id, event); + + if (p_inst->app_id == app_id) { + return ; + } + + memset(&rsp, 0, sizeof(tGATTS_RSP)); + + if (p_inst->pending_evt == event) { + switch (event) { + case HIDD_LE_READ_INFO_EVT: + LOG_ERROR(" p_inst->att_tbl[HIDD_LE_INFO_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_INFO_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_INFO_CHAR]; + rsp.attr_value.len = HID_INFORMATION_LEN; + //copy the infomation value to the att value to sent to the peer device + memcpy(rsp.attr_value.value, hidInfo, HID_INFORMATION_LEN); + //start send the rsp to the peer device + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + + case HIDD_LE_READ_CTNL_PT_EVT: + LOG_ERROR(" p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]; + rsp.attr_value.len = 0; + //start send the rsp to the peer device + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + + case HIDD_LE_READ_REPORT_MAP_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]; + rsp.attr_value.len = hidReportMapLen; + //copy the infomation value to the att value to sent to the peer device + memcpy(rsp.attr_value.value, hidReportMap, hidReportMapLen); + //start send the rsp to the peer device + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + case HIDD_LE_READ_REPORT_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; + rsp.attr_value.len = 0; + + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + case HIDD_LE_READ_PROTO_MODE_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]; + rsp.attr_value.len = 1; + pp = rsp.attr_value.value; + //copy the infomation value to the att value to sent to the peer device + memcpy(rsp.attr_value.value, &hidProtocolMode, rsp.attr_value.len); + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + case HIDD_LE_BOOT_KB_IN_REPORT_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; + rsp.attr_value.len = 0; + + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + case HIDD_LE_BOOT_KB_OUT_REPORT_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; + rsp.attr_value.len = 0; + + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + case HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT: + LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", + p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); + rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; + rsp.attr_value.len = 0; + + esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); + break; + default: + break; + } + // p_inst->pending_clcb_idx = 0; + p_inst->pending_evt = 0; + p_inst->pending_hal = 0; + } + return; +} + + +/******************************************************************************* +** +** Function hidd_le_init +** +** Description Initializa the GATT Service for button profiles. +** Returns NULL +*******************************************************************************/ +esp_gatt_status_t hidd_le_init (void) +{ + tBT_UUID app_uuid = {LEN_UUID_16, {ATT_SVC_HID}}; + + if (hidd_le_env.enabled) { + LOG_ERROR("hid device svc already initaliezd\n"); + return ESP_GATT_ERROR; + } else { + memset(&hidd_le_env, 0, sizeof(hidd_le_env_t)); + } + + + /* + register the hid deivce profile to the BTA_GATTS module*/ + esp_ble_gatts_app_register(&app_uuid, hidd_le_profile_cb); + + hidd_le_env.enabled = TRUE; + + return ESP_GATT_OK; +} + + +#endif ///HIDD_LE_PROFILE_CFG + + diff --git a/components/bt/bluedroid/profiles/std/include/bt_sdp.h b/components/bt/bluedroid/btc/profile/std/include/bt_sdp.h similarity index 100% rename from components/bt/bluedroid/profiles/std/include/bt_sdp.h rename to components/bt/bluedroid/btc/profile/std/include/bt_sdp.h diff --git a/components/bt/bluedroid/btc/profile/std/include/btc_gap_ble.h b/components/bt/bluedroid/btc/profile/std/include/btc_gap_ble.h new file mode 100644 index 000000000..64f1ff324 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/include/btc_gap_ble.h @@ -0,0 +1,84 @@ +// Copyright 2015-2016 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 __BTC_GAP_BLE_H__ +#define __BTC_GAP_BLE_H__ + +#include "esp_bt_defs.h" +#include "esp_gap_ble_api.h" + +typedef enum { + BTC_GAP_BLE_ACT_CFG_ADV_DATA = 0, + BTC_GAP_BLE_ACT_SET_SCAN_PARAM, + BTC_GAP_BLE_ACT_START_SCAN, + BTC_GAP_BLE_ACT_STOP_SCAN, + BTC_GAP_BLE_ACT_START_ADV, + BTC_GAP_BLE_ACT_STOP_ADV, + BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM, + BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN, + BTC_GAP_BLE_ACT_SET_RAND_ADDRESS, + BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY, + BTC_GAP_BLE_ACT_SET_DEV_NAME, +} btc_gap_ble_act_t; + +/* btc_ble_gap_args_t */ +typedef union { + //BTC_GAP_BLE_ACT_CFG_ADV_DATA = 0, + struct config_adv_data_args { + esp_ble_adv_data_t adv_data; + } cfg_adv_data; + //BTC_GAP_BLE_ACT_SET_SCAN_PARAM, + struct set_scan_params_args { + esp_ble_scan_params_t scan_params; + } set_scan_param; + //BTC_GAP_BLE_ACT_START_SCAN, + struct start_scan_args { + uint32_t duration; + } start_scan; + //BTC_GAP_BLE_ACT_STOP_SCAN, no args + //BTC_GAP_BLE_ACT_START_ADV, + struct start_adv_args { + esp_ble_adv_params_t adv_params; + } start_adv; + //BTC_GAP_BLE_ACT_STOP_ADV, no args + //BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM, + struct conn_update_params_args { + esp_ble_conn_update_params_t conn_params; + } conn_update_params; + //BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN + struct set_pkt_data_len_args { + esp_bd_addr_t remote_device; + uint16_t tx_data_length; + } set_pkt_data_len; + //BTC_GAP_BLE_ACT_SET_RAND_ADDRESS, + struct set_rand_addr_args { + esp_bd_addr_t rand_addr; + } set_rand_addr; + //BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY, + struct cfg_local_privacy_args { + bool privacy_enable; + } cfg_local_privacy; + //BTC_GAP_BLE_ACT_SET_DEV_NAME, + struct set_dev_name_args { +#define ESP_GAP_DEVICE_NAME_MAX (32) + char device_name[ESP_GAP_DEVICE_NAME_MAX + 1]; + } set_dev_name; +} btc_ble_gap_args_t; + +void btc_gap_ble_call_handler(btc_msg_t *msg); +void btc_gap_ble_cb_handler(btc_msg_t *msg); + +void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src); + +#endif /* __BTC_GAP_BLE_H__ */ diff --git a/components/bt/bluedroid/btc/profile/std/include/btc_gap_bt.h b/components/bt/bluedroid/btc/profile/std/include/btc_gap_bt.h new file mode 100644 index 000000000..d6f2e5b53 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/include/btc_gap_bt.h @@ -0,0 +1,22 @@ +// Copyright 2015-2016 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 __BTC_GAP_BT_H__ +#define __BTC_GAP_BT_H__ + + + + + +#define /* __BTC_GAP_BT_H__ */ diff --git a/components/bt/bluedroid/btc/profile/std/include/btc_gattc.h b/components/bt/bluedroid/btc/profile/std/include/btc_gattc.h new file mode 100644 index 000000000..0768b1d0a --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/include/btc_gattc.h @@ -0,0 +1,181 @@ +// Copyright 2015-2016 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 __BTC_GATTC_H__ +#define __BTC_GATTC_H__ + +#include "btc_task.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "esp_gattc_api.h" + +typedef enum { + BTC_GATTC_ACT_APP_REGISTER = 0, + BTC_GATTC_ACT_APP_UNREGISTER, + BTC_GATTC_ACT_OPEN, + BTC_GATTC_ACT_CLOSE, + BTC_GATTC_ACT_CFG_MTU, + BTC_GATTC_ACT_SEARCH_SERVICE, + BTC_GATTC_ACT_GET_FIRST_CHAR, + BTC_GATTC_ACT_GET_NEXT_CHAR, + BTC_GATTC_ACT_GET_FIRST_DESCR, + BTC_GATTC_ACT_GET_NEXT_DESCR, + BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE, + BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE, + BTC_GATTC_ACT_READ_CHAR, + BTC_GATTC_ACT_READ_CHAR_DESCR, + BTC_GATTC_ACT_WRITE_CHAR, + BTC_GATTC_ACT_WRITE_CHAR_DESCR, + BTC_GATTC_ACT_PREPARE_WRITE, + BTC_GATTC_ACT_EXECUTE_WRITE, + BTC_GATTC_ACT_REG_FOR_NOTIFY, + BTC_GATTC_ACT_UNREG_FOR_NOTIFY +} btc_gattc_act_t; + +/* btc_ble_gattc_args_t */ +typedef union { + //BTC_GATTC_ACT_APP_REGISTER, + struct app_reg_arg { + uint16_t app_id; + } app_reg; + //BTC_GATTC_ACT_APP_UNREGISTER, + struct app_unreg_arg { + esp_gatt_if_t gatt_if; + } app_unreg; + //BTC_GATTC_ACT_OPEN, + struct open_arg { + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + bool is_direct; + } open; + //BTC_GATTC_ACT_CLOSE, + struct close_arg { + uint16_t conn_id; + } close; + //BTC_GATTC_ACT_CFG_MTU, + struct cfg_mtu_arg { + uint16_t conn_id; + uint16_t mtu; + } cfg_mtu; + //BTC_GATTC_ACT_SEARCH_SERVICE, + struct search_srvc_arg { + uint16_t conn_id; + bool filter_uuid_enable; + esp_bt_uuid_t filter_uuid; + } search_srvc; + //BTC_GATTC_ACT_GET_FIRST_CHAR, + struct get_first_char_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + } get_first_char; + //BTC_GATTC_ACT_GET_NEXT_CHAR, + struct get_next_char_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + } get_next_char; + //BTC_GATTC_ACT_GET_FIRST_DESCR, + struct get_first_descr_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + } get_first_descr; + //BTC_GATTC_ACT_GET_NEXT_DESCR, + struct get_next_descr_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + } get_next_descr; + //BTC_GATTC_ACT_GET_FIRST_INCL_SERVICE, + struct get_first_incl_srvc_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + } get_first_incl_srvc; + //BTC_GATTC_ACT_GET_NEXT_INCL_SERVICE, + struct get_next_incl_srvc_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_srvc_id_t start_service_id; + } get_next_incl_srvc; + //BTC_GATTC_ACT_READ_CHAR, + struct read_char_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + esp_gatt_auth_req_t auth_req; + } read_char; + //BTC_GATTC_ACT_READ_CHAR_DESCR, + struct read_descr_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + esp_gatt_auth_req_t auth_req; + } read_descr; + //BTC_GATTC_ACT_WRITE_CHAR, + struct write_char_arg { + uint16_t conn_id; + uint16_t value_len; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + uint8_t *value; + esp_gatt_auth_req_t auth_req; + } write_char; + //BTC_GATTC_ACT_WRITE_CHAR_DESCR, + struct write_descr_arg { + uint16_t conn_id; + uint16_t value_len; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + esp_gatt_id_t descr_id; + uint8_t *value; + esp_gatt_auth_req_t auth_req; + } write_descr; + //BTC_GATTC_ACT_PREPARE_WRITE, + struct prep_write_arg { + uint16_t conn_id; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + uint16_t offset; + uint16_t value_len; + uint8_t *value; + esp_gatt_auth_req_t auth_req; + } prep_write; + //BTC_GATTC_ACT_EXECUTE_WRITE, + struct exec_write_arg { + uint16_t conn_id; + bool is_execute; + } exec_write; + //BTC_GATTC_ACT_REG_FOR_NOTIFY, + struct reg_for_notify_arg { + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + } reg_for_notify; + //BTC_GATTC_ACT_UNREG_FOR_NOTIFY + struct unreg_for_notify_arg { + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + esp_gatt_srvc_id_t service_id; + esp_gatt_id_t char_id; + } unreg_for_notify; +} btc_ble_gattc_args_t; + +void btc_gattc_call_handler(btc_msg_t *msg); +void btc_gattc_cb_handler(btc_msg_t *msg); +void btc_gattc_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src); + +#endif /* __BTC_GATTC_H__ */ diff --git a/components/bt/bluedroid/btc/profile/std/include/btc_gatts.h b/components/bt/bluedroid/btc/profile/std/include/btc_gatts.h new file mode 100644 index 000000000..0ba0f8869 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/include/btc_gatts.h @@ -0,0 +1,117 @@ +// Copyright 2015-2016 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 __BTC_GATTS_H__ +#define __BTC_GATTS_H__ + +#include "btc_task.h" +#include "esp_bt_defs.h" +#include "esp_gatt_defs.h" +#include "esp_gatts_api.h" + +typedef enum { + BTC_GATTS_ACT_APP_REGISTER = 0, + BTC_GATTS_ACT_APP_UNREGISTER, + BTC_GATTS_ACT_CREATE_SERVICE, + BTC_GATTS_ACT_DELETE_SERVICE, + BTC_GATTS_ACT_START_SERVICE, + BTC_GATTS_ACT_STOP_SERVICE, + BTC_GATTS_ACT_ADD_INCLUDE_SERVICE, + BTC_GATTS_ACT_ADD_CHAR, + BTC_GATTS_ACT_ADD_CHAR_DESCR, + BTC_GATTS_ACT_SEND_INDICATE, + BTC_GATTS_ACT_SEND_RESPONSE, + BTC_GATTS_ACT_OPEN, + BTC_GATTS_ACT_CLOSE, +} btc_gatts_act_t; + +/* btc_ble_gatts_args_t */ +typedef union { + //BTC_GATTS_ACT_APP_REGISTER = 0, + struct app_reg_args { + uint16_t app_id; + } app_reg; + //BTC_GATTS_ACT_APP_UNREGISTER, + struct app_unreg_args { + esp_gatt_if_t gatt_if; + } app_unreg; + //BTC_GATTS_ACT_CREATE_SERVICE, + struct create_srvc_args { + esp_gatt_if_t gatt_if; + esp_gatt_srvc_id_t service_id; + uint16_t num_handle; + } create_srvc; + //BTC_GATTS_ACT_DELETE_SERVICE, + struct delete_srvc_args { + uint16_t service_handle; + } delete_srvc; + //BTC_GATTS_ACT_START_SERVICE, + struct start_srvc_args { + uint16_t service_handle; + } start_srvc; + //BTC_GATTS_ACT_STOP_SERVICE, + struct stop_srvc_args { + uint16_t service_handle; + } stop_srvc; + //BTC_GATTS_ACT_ADD_INCLUDE_SERVICE, + struct add_incl_srvc_args { + uint16_t service_handle; + uint16_t included_service_handle; + } add_incl_srvc; + //BTC_GATTS_ACT_ADD_CHAR, + struct add_char_args { + uint16_t service_handle; + esp_bt_uuid_t char_uuid; + esp_gatt_perm_t perm; + esp_gatt_char_prop_t property; + } add_char; + //BTC_GATTS_ACT_ADD_CHAR_DESCR, + struct add_descr_args { + uint16_t service_handle; + esp_bt_uuid_t descr_uuid; + esp_gatt_perm_t perm; + } add_descr; + //BTC_GATTS_ACT_SEND_INDICATE, + struct send_indicate_args { + uint16_t conn_id; + uint16_t attr_handle; + bool need_confirm; + uint16_t value_len; + uint8_t *value; + } send_ind; + //BTC_GATTS_ACT_SEND_RESPONSE, + struct send_rsp_args { + uint16_t conn_id; + uint32_t trans_id; + esp_gatt_status_t status; + esp_gatt_rsp_t *rsp; + } send_rsp; + //BTC_GATTS_ACT_OPEN, + struct open_args { + esp_gatt_if_t gatt_if; + esp_bd_addr_t remote_bda; + bool is_direct; + } open; + //BTC_GATTS_ACT_CLOSE, + struct close_args { + uint16_t conn_id; + } close; +} btc_ble_gatts_args_t; + + +void btc_gatts_call_handler(btc_msg_t *msg); +void btc_gatts_cb_handler(btc_msg_t *msg); +void btc_gatts_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src); + +#endif /* __BTC_GATTS_H__ */ diff --git a/components/bt/bluedroid/profiles/std/include/dis_api.h b/components/bt/bluedroid/btc/profile/std/include/dis_api.h similarity index 93% rename from components/bt/bluedroid/profiles/std/include/dis_api.h rename to components/bt/bluedroid/btc/profile/std/include/dis_api.h index 95bf24ac5..5b8cfc5f7 100644 --- a/components/bt/bluedroid/profiles/std/include/dis_api.h +++ b/components/bt/bluedroid/btc/profile/std/include/dis_api.h @@ -28,7 +28,7 @@ #include "bt_target.h" #include "gatt_api.h" #include "gattdefs.h" -#include "esp_gatt_api.h" +#include "esp_gatts_api.h" #define DIS_SUCCESS GATT_SUCCESS #define DIS_ILLEGAL_PARAM GATT_ILLEGAL_PARAMETER @@ -67,51 +67,45 @@ typedef tDIS_ATTR_MASK tDIS_ATTR_BIT ; #define DIS_PNP_ID_SIZE 7 -typedef struct -{ +typedef struct { UINT16 uuid; UINT16 handle; -}tDIS_DB_ENTRY; +} tDIS_DB_ENTRY; -typedef struct -{ +typedef struct { UINT16 len; UINT8 *p_data; -}tDIS_STRING; +} tDIS_STRING; -typedef struct -{ +typedef struct { UINT16 vendor_id; UINT16 product_id; UINT16 product_version; UINT8 vendor_id_src; -}tDIS_PNP_ID; +} tDIS_PNP_ID; -typedef union -{ +typedef union { UINT64 system_id; tDIS_PNP_ID pnp_id; tDIS_STRING data_str; -}tDIS_ATTR; +} tDIS_ATTR; #define DIS_MAX_STRING_DATA 7 -typedef struct -{ +typedef struct { UINT16 attr_mask; UINT64 system_id; tDIS_PNP_ID pnp_id; UINT8 *data_string[DIS_MAX_STRING_DATA]; -}tDIS_VALUE; +} tDIS_VALUE; //typedef void (tDIS_READ_CBACK)(BD_ADDR addr, tDIS_VALUE *p_dis_value); -typedef struct -{ +typedef struct { tDIS_DB_ENTRY dis_attr[DIS_MAX_CHAR_NUM]; tDIS_VALUE dis_value; - + // tDIS_READ_CBACK *p_read_dis_cback; UINT16 service_handle; @@ -119,9 +113,9 @@ typedef struct bool enabled; - // UINT8 dis_read_uuid_idx; - // tDIS_ATTR_MASK request_mask; -}tDIS_CB; + // UINT8 dis_read_uuid_idx; + // tDIS_ATTR_MASK request_mask; +} tDIS_CB; /***************************************************************************** ** Data structure used by Battery Service @@ -133,12 +127,11 @@ typedef struct #define BATTERY_LEVEL_SIZE 1 -typedef struct -{ +typedef struct { BD_ADDR remote_bda; BOOLEAN need_rsp; UINT16 clt_cfg; -}tBA_WRITE_DATA; +} tBA_WRITE_DATA; #define BA_READ_CLT_CFG_REQ 1 #define BA_READ_PRE_FMT_REQ 2 @@ -153,25 +146,22 @@ typedef void (tBA_CBACK)(UINT32 trans_id, UINT16 conn_id, UINT8 app_id, UINT8 ev #define BA_LEVEL_RPT_REF 0x04 typedef UINT8 tBA_LEVEL_DESCR; -typedef struct -{ +typedef struct { BOOLEAN is_pri; tBA_LEVEL_DESCR ba_level_descr; tGATT_TRANSPORT transport; tBA_CBACK *p_cback; -}tBA_REG_INFO; +} tBA_REG_INFO; -typedef union -{ +typedef union { UINT8 ba_level; UINT16 clt_cfg; tGATT_CHAR_RPT_REF rpt_ref; tGATT_CHAR_PRES pres_fmt; -}tBA_RSP_DATA; +} tBA_RSP_DATA; -typedef struct -{ +typedef struct { UINT8 app_id; UINT16 ba_level_hdl; UINT16 clt_cfg_hdl; @@ -183,14 +173,13 @@ typedef struct UINT16 pending_handle; //UINT8 pending_clcb_idx; UINT8 pending_evt; -}tBA_INST; +} tBA_INST; -typedef struct -{ +typedef struct { tBA_INST battery_inst[BA_MAX_INT_NUM]; UINT8 inst_id; bool enabled; -}tBATTERY_CB; +} tBATTERY_CB; /***************************************************************************** ** External Function Declarations *****************************************************************************/ @@ -247,8 +236,8 @@ extern void dis_AddChar(UINT16 service_id); ** Process read DIS attribute request. *******************************************************************************/ -extern void dis_s_read_attr_value (tGATTS_DATA *p_data, tGATT_VALUE *p_value, - UINT32 trans_id, UINT16 conn_id); +extern void dis_s_read_attr_value (tGATTS_DATA *p_data, tGATT_VALUE *p_value, + UINT32 trans_id, UINT16 conn_id); /***************************************************************************** ** DIS Client Function *****************************************************************************/ @@ -262,7 +251,7 @@ extern void dis_s_read_attr_value (tGATTS_DATA *p_data, tGATT_VALUE *p_value, ** *******************************************************************************/ //extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback, - // tDIS_ATTR_MASK mask); +// tDIS_ATTR_MASK mask); /******************************************************************************* ** BATTERY SERVICE API @@ -315,8 +304,8 @@ extern void bas_service_cmpl(UINT16 service_id, tBTA_GATT_STATUS status); ** Description Respond to a battery service request ** *******************************************************************************/ -extern void Battery_Rsp (UINT32 trans_id, UINT16 conn_id, UINT8 app_id, - tGATT_STATUS st, UINT8 event, tBA_RSP_DATA *p_rsp); +extern void Battery_Rsp (UINT32 trans_id, UINT16 conn_id, UINT8 app_id, + tGATT_STATUS st, UINT8 event, tBA_RSP_DATA *p_rsp); /******************************************************************************* ** ** Function Battery_Notify @@ -337,8 +326,8 @@ extern void bas_s_read_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, UINT16 c ** ** Description it will be called when client send a write request ******************************************************************************/ -extern void bas_s_write_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, - UINT16 conn_id, BD_ADDR bd_addr); +extern void bas_s_write_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, + UINT16 conn_id, BD_ADDR bd_addr); extern void gatts_server_test(void); #ifdef __cplusplus diff --git a/components/bt/bluedroid/profiles/std/include/hid_le_prf.h b/components/bt/bluedroid/btc/profile/std/include/hid_le_prf.h similarity index 71% rename from components/bt/bluedroid/profiles/std/include/hid_le_prf.h rename to components/bt/bluedroid/btc/profile/std/include/hid_le_prf.h index 15591ed1a..6436573f8 100644 --- a/components/bt/bluedroid/profiles/std/include/hid_le_prf.h +++ b/components/bt/bluedroid/btc/profile/std/include/hid_le_prf.h @@ -32,7 +32,7 @@ #define HID_NUM_REPORTS 9 -#define ATT_SVC_HID 0x1812 +#define ATT_SVC_HID 0x1812 /// Maximal number of Report Char. that can be added in the DB for one HIDS - Up to 11 #define HIDD_LE_NB_REPORT_INST_MAX (5) @@ -76,8 +76,7 @@ /// HID Service Attributes Indexes -enum -{ +enum { HIDD_LE_IDX_SVC, // Included Service @@ -125,8 +124,7 @@ enum /// Attribute Table Indexes -enum -{ +enum { HIDD_LE_INFO_CHAR, HIDD_LE_CTNL_PT_CHAR, HIDD_LE_REPORT_MAP_CHAR, @@ -139,23 +137,21 @@ enum }; ///att read event table Indexs -enum -{ - HIDD_LE_READ_INFO_EVT, - HIDD_LE_READ_CTNL_PT_EVT, - HIDD_LE_READ_REPORT_MAP_EVT, - HIDD_LE_READ_REPORT_EVT, - HIDD_LE_READ_PROTO_MODE_EVT, - HIDD_LE_BOOT_KB_IN_REPORT_EVT, - HIDD_LE_BOOT_KB_OUT_REPORT_EVT, - HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT, +enum { + HIDD_LE_READ_INFO_EVT, + HIDD_LE_READ_CTNL_PT_EVT, + HIDD_LE_READ_REPORT_MAP_EVT, + HIDD_LE_READ_REPORT_EVT, + HIDD_LE_READ_PROTO_MODE_EVT, + HIDD_LE_BOOT_KB_IN_REPORT_EVT, + HIDD_LE_BOOT_KB_OUT_REPORT_EVT, + HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT, - HID_LE_EVT_MAX + HID_LE_EVT_MAX }; /// Client Characteristic Configuration Codes -enum -{ +enum { HIDD_LE_DESC_MASK = 0x10, HIDD_LE_BOOT_KB_IN_REPORT_CFG = HIDD_LE_BOOT_KB_IN_REPORT_CHAR | HIDD_LE_DESC_MASK, @@ -164,8 +160,7 @@ enum }; /// Features Flag Values -enum -{ +enum { HIDD_LE_CFG_KEYBOARD = 0x01, HIDD_LE_CFG_MOUSE = 0x02, HIDD_LE_CFG_PROTO_MODE = 0x04, @@ -175,8 +170,7 @@ enum }; /// Report Char. Configuration Flag Values -enum -{ +enum { HIDD_LE_CFG_REPORT_IN = 0x01, HIDD_LE_CFG_REPORT_OUT = 0x02, //HOGPD_CFG_REPORT_FEAT can be used as a mask to check Report type @@ -192,85 +186,80 @@ enum **************************************************************************************** */ - /// HIDD Features structure - typedef struct - { - /// Service Features - uint8_t svc_features; - /// Number of Report Char. instances to add in the database - uint8_t report_nb; - /// Report Char. Configuration - uint8_t report_char_cfg[HIDD_LE_NB_REPORT_INST_MAX]; - }hidd_feature_t; +/// HIDD Features structure +typedef struct { + /// Service Features + uint8_t svc_features; + /// Number of Report Char. instances to add in the database + uint8_t report_nb; + /// Report Char. Configuration + uint8_t report_char_cfg[HIDD_LE_NB_REPORT_INST_MAX]; +} hidd_feature_t; - typedef struct - { - BOOLEAN in_use; - BOOLEAN congest; - uint16_t conn_id; - BOOLEAN connected; - BD_ADDR remote_bda; - uint32_t trans_id; - uint8_t cur_srvc_id; - - }hidd_clcb_t; +typedef struct { + BOOLEAN in_use; + BOOLEAN congest; + uint16_t conn_id; + BOOLEAN connected; + BD_ADDR remote_bda; + uint32_t trans_id; + uint8_t cur_srvc_id; - // HID report mapping table -typedef struct -{ - uint16_t handle; // Handle of report characteristic - uint16_t cccdHandle; // Handle of CCCD for report characteristic - uint8_t id; // Report ID - uint8_t type; // Report type - uint8_t mode; // Protocol mode (report or boot) +} hidd_clcb_t; + +// HID report mapping table +typedef struct { + uint16_t handle; // Handle of report characteristic + uint16_t cccdHandle; // Handle of CCCD for report characteristic + uint8_t id; // Report ID + uint8_t type; // Report type + uint8_t mode; // Protocol mode (report or boot) } hidRptMap_t; - typedef struct - { - /// hidd profile id - uint8_t app_id; - /// Notified handle +typedef struct { + /// hidd profile id + uint8_t app_id; + /// Notified handle uint16_t ntf_handle; - ///Attribute handle Table + ///Attribute handle Table uint16_t att_tbl[HIDD_LE_CHAR_MAX]; - /// Supported Features - hidd_feature_t hidd_feature[HIDD_LE_NB_HIDS_INST_MAX]; - /// Current Protocol Mode + /// Supported Features + hidd_feature_t hidd_feature[HIDD_LE_NB_HIDS_INST_MAX]; + /// Current Protocol Mode uint8_t proto_mode[HIDD_LE_NB_HIDS_INST_MAX]; /// Number of HIDS added in the database uint8_t hids_nb; - uint8_t pending_evt; - uint16_t pending_hal; - }hidd_inst_t; + uint8_t pending_evt; + uint16_t pending_hal; +} hidd_inst_t; - /* service engine control block */ - typedef struct - { - hidd_clcb_t hidd_clcb; /* connection link*/ - esp_gatt_if_t gatt_if; - BOOLEAN enabled; - BOOLEAN is_primery; - hidd_inst_t hidd_inst; - uint8_t inst_id; - }hidd_le_env_t; +/* service engine control block */ +typedef struct { + hidd_clcb_t hidd_clcb; /* connection link*/ + esp_gatt_if_t gatt_if; + BOOLEAN enabled; + BOOLEAN is_primery; + hidd_inst_t hidd_inst; + uint8_t inst_id; +} hidd_le_env_t; - extern hidd_le_env_t hidd_le_env; +extern hidd_le_env_t hidd_le_env; - void hidd_le_create_service(BOOLEAN is_primary); +void hidd_le_create_service(BOOLEAN is_primary); - void hidd_rsp (uint32_t trans_id, uint16_t conn_id, uint8_t app_id, - esp_gatt_status_t status, uint8_t event, tGATTS_DATA *p_rsp); +void hidd_rsp (uint32_t trans_id, uint16_t conn_id, uint8_t app_id, + esp_gatt_status_t status, uint8_t event, tGATTS_DATA *p_rsp); - void hidd_read_attr_value(tGATTS_DATA *p_data, uint32_t trans_id); - - - tGATT_STATUS hidd_le_init (void); +void hidd_read_attr_value(tGATTS_DATA *p_data, uint32_t trans_id); -#endif ///HIDD_LE_PROFILE_CFG - +tGATT_STATUS hidd_le_init (void); + + +#endif ///HIDD_LE_PROFILE_CFG + diff --git a/components/bt/bluedroid/profiles/std/include/srvc_api.h b/components/bt/bluedroid/btc/profile/std/include/srvc_api.h similarity index 96% rename from components/bt/bluedroid/profiles/std/include/srvc_api.h rename to components/bt/bluedroid/btc/profile/std/include/srvc_api.h index 09c5b3e4b..a7a46b8e8 100644 --- a/components/bt/bluedroid/profiles/std/include/srvc_api.h +++ b/components/bt/bluedroid/btc/profile/std/include/srvc_api.h @@ -48,37 +48,33 @@ typedef UINT16 tDIS_ATTR_MASK; typedef tDIS_ATTR_MASK tDIS_ATTR_BIT ; -typedef struct -{ +typedef struct { UINT16 len; UINT8 *p_data; -}tDIS_STRING; +} tDIS_STRING; -typedef struct -{ +typedef struct { UINT16 vendor_id; UINT16 product_id; UINT16 product_version; UINT8 vendor_id_src; -}tDIS_PNP_ID; +} tDIS_PNP_ID; -typedef union -{ +typedef union { UINT64 system_id; tDIS_PNP_ID pnp_id; tDIS_STRING data_str; -}tDIS_ATTR; +} tDIS_ATTR; #define DIS_MAX_STRING_DATA 7 -typedef struct -{ +typedef struct { UINT16 attr_mask; UINT64 system_id; tDIS_PNP_ID pnp_id; UINT8 *data_string[DIS_MAX_STRING_DATA]; -}tDIS_VALUE; +} tDIS_VALUE; typedef void (tDIS_READ_CBACK)(BD_ADDR addr, tDIS_VALUE *p_dis_value); @@ -86,12 +82,11 @@ typedef void (tDIS_READ_CBACK)(BD_ADDR addr, tDIS_VALUE *p_dis_value); /***************************************************************************** ** Data structure used by Battery Service *****************************************************************************/ -typedef struct -{ +typedef struct { BD_ADDR remote_bda; BOOLEAN need_rsp; UINT16 clt_cfg; -}tBA_WRITE_DATA; +} tBA_WRITE_DATA; #define BA_READ_CLT_CFG_REQ 1 #define BA_READ_PRE_FMT_REQ 2 @@ -106,22 +101,20 @@ typedef void (tBA_CBACK)(UINT8 app_id, UINT8 event, tBA_WRITE_DATA *p_data); #define BA_LEVEL_RPT_REF 0x04 typedef UINT8 tBA_LEVEL_DESCR; -typedef struct -{ +typedef struct { BOOLEAN is_pri; tBA_LEVEL_DESCR ba_level_descr; tGATT_TRANSPORT transport; tBA_CBACK *p_cback; -}tBA_REG_INFO; +} tBA_REG_INFO; -typedef union -{ +typedef union { UINT8 ba_level; UINT16 clt_cfg; tGATT_CHAR_RPT_REF rpt_ref; tGATT_CHAR_PRES pres_fmt; -}tBA_RSP_DATA; +} tBA_RSP_DATA; /***************************************************************************** ** External Function Declarations diff --git a/components/bt/bluedroid/btc/profile/std/sdp/btc_sdp.c b/components/bt/bluedroid/btc/profile/std/sdp/btc_sdp.c new file mode 100644 index 000000000..382f6dc02 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/sdp/btc_sdp.c @@ -0,0 +1,125 @@ +// Copyright 2015-2016 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. + +#include "esp_sdp_api.h" + + +esp_err_t esp_bt_sdp_enable(bt_sdp_cb_t *cback) +{ + tBTA_SDP_STATUS status = BTA_SdpEnable((tBTA_SDP_DM_CBACK *)cback); + + return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t *uuid) +{ + tBTA_SDP_STATUS status = BTA_SdpSearch(bd_addr, (tSDP_UUID *)uuid); + return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_bt_sdp_create_record_by_user(void *user_data) +{ + tBTA_SDP_STATUS status = BTA_SdpCreateRecordByUser(user_data); + return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_bt_sdp_remove_record_by_user(void *user_data) +{ + tBTA_SDP_STATUS status = BTA_SdpRemoveRecordByUser(user_data); + return (status == BTA_SDP_SUCCESS) ? ESP_OK : ESP_FAIL; +} + + +/**********************************************************************************************/ +/**********************************************************************************************/ +/* API into SDP for local service database updates */ +/* these APIs are indended to be called in callback function in the context of stack task, + * to handle BT_SDP_CREATE_RECORD_USER_EVT and BT_SDP_REMOVE_RECORD_USER_EVT + */ +uint32_t esp_bt_sdp_create_record(void) +{ + return SDP_CreateRecord(); +} + +bool esp_bt_sdp_delete_record(uint32_t handle) +{ + return SDP_DeleteRecord(handle); +} + +int32_t esp_bt_sdp_read_record(uint32_t handle, uint8_t *data, int32_t *data_len) +{ + return SDP_ReadRecord(handle, data, data_len); +} + +bool esp_bt_sdp_add_attribute (uint32_t handle, uint16_t attr_id, + uint8_t attr_type, uint32_t attr_len, + uint8_t *p_val) +{ + return SDP_AddAttribute(handle, attr_id, attr_type, attr_len, p_val); +} + +bool esp_bt_sdp_add_sequence (uint32_t handle, uint16_t attr_id, + uint16_t num_elem, uint8_t type[], + uint8_t len[], uint8_t *p_val[]) +{ + return SDP_AddSequence(handle, attr_id, num_elem, type, len, p_val); +} + +bool esp_bt_sdp_add_uuid_sequence (uint32_t handle, uint16_t attr_id, + uint16_t num_uuids, uint16_t *p_uuids) +{ + return SDP_AddUuidSequence(handle, attr_id, num_uuids, p_uuids); +} + + +bool esp_bt_sdp_add_protocol_list (uint32_t handle, uint16_t num_elem, + sdp_proto_elem_t *p_elem_list) +{ + return SDP_AddProtocolList(handle, num_elem, (tSDP_PROTOCOL_ELEM *)p_elem_list); +} + +bool esp_bt_sdp_add_addition_protocol_lists(uint32_t handle, uint16_t num_elem, + sdp_proto_list_elem_t *p_proto_list) +{ + return SDP_AddAdditionProtoLists(handle, num_elem, (tSDP_PROTO_LIST_ELEM *)p_proto_list); +} + +bool esp_bt_sdp_add_profile_dscp_list (uint32_t handle, + uint16_t profile_uuid, + uint16_t version) +{ + return SDP_AddProfileDescriptorList(handle, profile_uuid, version); +} + +bool esp_bt_sdp_add_lang_base_attr_id_list(uint32_t handle, + uint16_t lang, uint16_t char_enc, + uint16_t base_id) +{ + return SDP_AddLanguageBaseAttrIDList(handle, lang, char_enc, base_id); +} + +bool esp_bt_sdp_add_service_class_id_list(uint32_t handle, + uint16_t num_services, + uint16_t *p_service_uuids) +{ + return SDP_AddServiceClassIdList(handle, num_services, p_service_uuids); +} + +bool esp_bt_sdp_delete_attribute(uint32_t handle, uint16_t attr_id) +{ + return SDP_DeleteAttribute(handle, attr_id); +} + +/**********************************************************************************************/ +/**********************************************************************************************/ diff --git a/components/bt/bluedroid/btc/profile/std/sdp/include/btc_sdp.h b/components/bt/bluedroid/btc/profile/std/sdp/include/btc_sdp.h new file mode 100644 index 000000000..db7984b9b --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/sdp/include/btc_sdp.h @@ -0,0 +1,129 @@ +// Copyright 2015-2016 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_SDP_API_H__ +#define __ESP_SDP_API_H__ + +#include +#include "esp_err.h" +#include "esp_bt_common.h" +#include "bta_sdp_api.h" +#include "bt_sdp.h" + +#define BT_SDP_STAT_SUCCESS BTA_SDP_SUCCESS +#define BT_SDP_STAT_FAILURE BTA_SDP_FAILURE +#define BT_SDP_STAT_BUSY BTA_SDP_BUSY + +#define BT_SDP_ENABLE_EVT BTA_SDP_ENABLE_EVT +#define BT_SDP_SEARCH_EVT BTA_SDP_SEARCH_EVT +#define BT_SDP_SEARCH_COMP_EVT BTA_SDP_SEARCH_COMP_EVT +#define BT_SDP_CREATE_RECORD_USER_EVT BTA_SDP_CREATE_RECORD_USER_EVT +#define BT_SDP_REMOVE_RECORD_USER_EVT BTA_SDP_REMOVE_RECORD_USER_EVT +#define BT_SDP_MAX_EVT BTA_SDP_MAX_EVT + +#define BT_SDP_MAX_RECORDS BTA_SDP_MAX_RECORDS + +typedef tBTA_SDP_STATUS bt_sdp_status_t; + +typedef tBTA_SDP_EVT bt_sdp_evt_t; + +typedef bluetooth_sdp_record bt_sdp_record_t; + +/* tBTA_SEARCH_COMP, bta_sdp_api.h */ +typedef struct { + bt_sdp_status_t status; + esp_bd_addr_t remote_addr; + esp_bt_uuid_t uuid; + int record_count; + bt_sdp_record_t records[BT_SDP_MAX_RECORDS]; +} bt_sdp_search_comp_t; + +/* tBTA_SDP, bta_sdp_api.h */ +typedef union { + bt_sdp_status_t status; + bt_sdp_search_comp_t sdp_search_comp; +} bt_sdp_t; + +typedef void (bt_sdp_cb_t)(bt_sdp_evt_t event, bt_sdp_t *p_data, void *user_data); + +esp_err_t esp_bt_sdp_enable(bt_sdp_cb_t *cback); + +esp_err_t esp_bt_sdp_search(esp_bd_addr_t bd_addr, esp_bt_uuid_t *uuid); + +esp_err_t esp_bt_sdp_create_record_by_user(void *user_data); + +esp_err_t esp_bt_sdp_remove_record_by_user(void *user_data); + + +/**********************************************************************************************/ +/**********************************************************************************************/ +/* API into SDP for local service database updates + * these APIs are indended to be called in callback function in the context of stack task, + * to handle BT_SDP_CREATE_RECORD_USER_EVT and BT_SDP_REMOVE_RECORD_USER_EVT + */ + +/* This structure is used to add protocol lists and find protocol elements */ +#define ESP_BT_SDP_MAX_PROTOCOL_PARAMS SDP_MAX_PROTOCOL_PARAMS // bt_target.h +typedef struct { + uint16_t protocol_uuid; + uint16_t num_params; + uint16_t params[ESP_BT_SDP_MAX_PROTOCOL_PARAMS]; +} sdp_proto_elem_t; // tSDP_PROTOCOL_ELEM, sdp_api.h + +#define ESP_BT_SDP_MAX_LIST_ELEMS SDP_MAX_LIST_ELEMS // sdp_api.h +typedef struct { + uint16_t num_elems; + sdp_proto_elem_t list_elem[ESP_BT_SDP_MAX_LIST_ELEMS]; +} sdp_proto_list_elem_t; // tSDP_PROTO_LIST_ELEM, sdp_api.h + + +uint32_t esp_bt_sdp_create_record(void); + +bool esp_bt_sdp_delete_record(uint32_t handle); + +int32_t esp_bt_sdp_read_record(uint32_t handle, uint8_t *data, int32_t *data_len); + +bool esp_bt_sdp_add_attribute (uint32_t handle, uint16_t attr_id, + uint8_t attr_type, uint32_t attr_len, + uint8_t *p_val); + +bool esp_bt_sdp_add_sequence (uint32_t handle, uint16_t attr_id, + uint16_t num_elem, uint8_t type[], + uint8_t len[], uint8_t *p_val[]); + +bool esp_bt_sdp_add_uuid_sequence (uint32_t handle, uint16_t attr_id, + uint16_t num_uuids, uint16_t *p_uuids); + + +bool esp_bt_sdp_add_protocol_list (uint32_t handle, uint16_t num_elem, + sdp_proto_elem_t *p_elem_list); + +bool esp_bt_sdp_add_addition_protocol_lists(uint32_t handle, uint16_t num_elem, + sdp_proto_list_elem_t *p_proto_list); + +bool esp_bt_sdp_add_profile_dscp_list (uint32_t handle, + uint16_t profile_uuid, + uint16_t version); + +bool esp_bt_sdp_add_lang_base_attr_id_list(uint32_t handle, + uint16_t lang, uint16_t char_enc, + uint16_t base_id); + +bool esp_bt_sdp_add_service_class_id_list(uint32_t handle, + uint16_t num_services, + uint16_t *p_service_uuids); + +bool esp_bt_sdp_delete_attribute(uint32_t handle, uint16_t attr_id); + +#endif /* __ESP_SDP_API_H__ */ diff --git a/components/bt/bluedroid/btc/profile/std/smp/esp_app_sec.c b/components/bt/bluedroid/btc/profile/std/smp/esp_app_sec.c new file mode 100644 index 000000000..e1ec079b4 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/smp/esp_app_sec.c @@ -0,0 +1,106 @@ +// Copyright 2015-2016 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. + +#include // standard library +#include + +#include "esp_sec_api.h" + + +extern void srand (unsigned int seed); +extern int random (void); + +/// Application Security Environment Structure +tAPP_SEC_ENV app_sec_env; + + +/******************************************************************************* +** +** Function app_ble_sec_gen_tk +** +** Description This function is called to generate the ble tk +** +** Returns the generate tk value +** +*******************************************************************************/ +UINT32 app_ble_sec_gen_tk(void) +{ + // Generate a PIN Code (Between 100000 and 999999) + return (100000 + (random() % 900000)); +} + +/******************************************************************************* +** +** Function app_ble_sec_gen_ltk +** +** Description This function is called to generate the ble ltk +** +** Returns NULL +** +*******************************************************************************/ +void app_ble_sec_gen_ltk(UINT8 key_size) +{ + // Counter + UINT8 i; + app_sec_env.key_size = key_size; + + // Randomly generate the LTK and the Random Number + for (i = 0; i < RAND_NB_LEN; i++) { + app_sec_env.rand_nb.nb[i] = random() % 256; + } + + // Randomly generate the end of the LTK + for (i = 0; i < SEC_KEY_LEN; i++) { + app_sec_env.ltk.key[i] = (((key_size) < (16 - i)) ? 0 : random() % 256); + } + + // Randomly generate the EDIV + app_sec_env.ediv = random() % 65536; +} + + +/******************************************************************************* +** +** Function app_ble_sec_init +** +** Description This function is init the security env and function +** +** Returns NULL +** +*******************************************************************************/ +void app_ble_sec_init() +{ + // Reset Security Environment + memset(&app_sec_env, 0, sizeof(app_sec_env)); +} + + +/******************************************************************************* +** +** Function app_ble_security_start +** +** Description This function is called by the slave when the seurity start +** +** Returns NULL +** +*******************************************************************************/ +void app_ble_security_start(void) +{ + +} + + + + + diff --git a/components/bt/bluedroid/btc/profile/std/smp/include/esp_sec_api.h b/components/bt/bluedroid/btc/profile/std/smp/include/esp_sec_api.h new file mode 100644 index 000000000..f9b0f9ec1 --- /dev/null +++ b/components/bt/bluedroid/btc/profile/std/smp/include/esp_sec_api.h @@ -0,0 +1,79 @@ +// Copyright 2015-2016 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_SEC_API_H__ +#define __ESP_SEC_API_H__ + +#include "bt_types.h" + +#define APP_SEC_IRK_FLAG (0) +#define RAND_NB_LEN 0x08 +#define SEC_KEY_LEN 0x10 + +/* + * STRUCTURES DEFINITIONS + **************************************************************************************** + */ + + +/// Generic Security key structure +typedef struct { + /// Key value MSB -> LSB + UINT8 key[SEC_KEY_LEN]; +} smp_sec_key; + +///Random number structure +typedef struct { + ///8-byte array for random number + UINT8 nb[RAND_NB_LEN]; +} rand_nb; + +typedef struct { + // LTK + smp_sec_key ltk; + // Random Number + rand_nb rand_nb; + // EDIV + UINT16 ediv; + // LTK key size + UINT8 key_size; + + // Last paired peer address type + UINT8 peer_addr_type; + // Last paired peer address + BD_ADDR peer_addr; + + // authentication level + UINT8 auth; + +} tAPP_SEC_ENV; + +extern tAPP_SEC_ENV app_sec_env; + +/* +* GLOBAL FUNCTIONS DECLARATIONS +**************************************************************************************** +*/ + +void app_ble_sec_init(void); + +void app_ble_sec_pairing_cmp_evt_send(UINT8); + +UINT32 app_ble_sec_gen_tk(void); + +void app_ble_sec_gen_ltk(UINT8 key_size); + +void app_ble_security_start(void); + +#endif /* __ESP_SEC_API_H__ */ diff --git a/components/bt/bluedroid/btcore/bdaddr.c b/components/bt/bluedroid/btcore/bdaddr.c old mode 100755 new mode 100644 index 0f0c68ef9..e69bb53e1 --- a/components/bt/bluedroid/btcore/bdaddr.c +++ b/components/bt/bluedroid/btcore/bdaddr.c @@ -21,87 +21,103 @@ #include "bt_trace.h" #include "bdaddr.h" -static inline bool ets_isxdigit(char c) { - if ((c >= '0') && (c <= '9')) +static inline bool ets_isxdigit(char c) +{ + if ((c >= '0') && (c <= '9')) { + return true; + } + if ((c >= 'a') && (c <= 'f')) { + return true; + } + return ((c >= 'A') && (c <= 'F')); +} + +bool bdaddr_is_empty(const bt_bdaddr_t *addr) +{ + assert(addr != NULL); + + uint8_t zero[sizeof(bt_bdaddr_t)] = { 0 }; + return memcmp(addr, &zero, sizeof(bt_bdaddr_t)) == 0; +} + +bool bdaddr_equals(const bt_bdaddr_t *first, const bt_bdaddr_t *second) +{ + assert(first != NULL); + assert(second != NULL); + + return memcmp(first, second, sizeof(bt_bdaddr_t)) == 0; +} + +bt_bdaddr_t *bdaddr_copy(bt_bdaddr_t *dest, const bt_bdaddr_t *src) +{ + assert(dest != NULL); + assert(src != NULL); + + return (bt_bdaddr_t *)memcpy(dest, src, sizeof(bt_bdaddr_t)); +} + +const char *bdaddr_to_string(const bt_bdaddr_t *addr, char *string, size_t size) +{ + assert(addr != NULL); + assert(string != NULL); + + if (size < 18) { + return NULL; + } + + const uint8_t *ptr = addr->address; + sprintf(string, "%02x:%02x:%02x:%02x:%02x:%02x", + ptr[0], ptr[1], ptr[2], + ptr[3], ptr[4], ptr[5]); + return string; +} + +bool string_is_bdaddr(const char *string) +{ + assert(string != NULL); + + size_t len = strlen(string); + if (len != 17) { + return false; + } + + for (size_t i = 0; i < len; ++i) { + // Every 3rd char must be ':'. + if (((i + 1) % 3) == 0 && string[i] != ':') { + return false; + } + + // All other chars must be a hex digit. + if (((i + 1) % 3) != 0 && !ets_isxdigit(string[i])) { + return false; + } + } return true; - if ((c >= 'a') && (c <= 'f')) - return true; - return ((c >= 'A') && (c <= 'F')); } -bool bdaddr_is_empty(const bt_bdaddr_t *addr) { - assert(addr != NULL); +bool string_to_bdaddr(const char *string, bt_bdaddr_t *addr) +{ + assert(string != NULL); + assert(addr != NULL); - uint8_t zero[sizeof(bt_bdaddr_t)] = { 0 }; - return memcmp(addr, &zero, sizeof(bt_bdaddr_t)) == 0; + bt_bdaddr_t new_addr; + uint8_t *ptr = new_addr.address; + bool ret = sscanf(string, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", + &ptr[0], &ptr[1], &ptr[2], &ptr[3], &ptr[4], &ptr[5]) == 6; + + if (ret) { + memcpy(addr, &new_addr, sizeof(bt_bdaddr_t)); + } + + return ret; } -bool bdaddr_equals(const bt_bdaddr_t *first, const bt_bdaddr_t *second) { - assert(first != NULL); - assert(second != NULL); - - return memcmp(first, second, sizeof(bt_bdaddr_t)) == 0; -} - -bt_bdaddr_t *bdaddr_copy(bt_bdaddr_t *dest, const bt_bdaddr_t *src) { - assert(dest != NULL); - assert(src != NULL); - - return (bt_bdaddr_t *)memcpy(dest, src, sizeof(bt_bdaddr_t)); -} - -const char *bdaddr_to_string(const bt_bdaddr_t *addr, char *string, size_t size) { - assert(addr != NULL); - assert(string != NULL); - - if (size < 18) - return NULL; - - const uint8_t *ptr = addr->address; - sprintf(string, "%02x:%02x:%02x:%02x:%02x:%02x", - ptr[0], ptr[1], ptr[2], - ptr[3], ptr[4], ptr[5]); - return string; -} - -bool string_is_bdaddr(const char *string) { - assert(string != NULL); - - size_t len = strlen(string); - if (len != 17) - return false; - - for (size_t i = 0; i < len; ++i) { - // Every 3rd char must be ':'. - if (((i + 1) % 3) == 0 && string[i] != ':') - return false; - - // All other chars must be a hex digit. - if (((i + 1) % 3) != 0 && !ets_isxdigit(string[i])) - return false; - } - return true; -} - -bool string_to_bdaddr(const char *string, bt_bdaddr_t *addr) { - assert(string != NULL); - assert(addr != NULL); - - bt_bdaddr_t new_addr; - uint8_t *ptr = new_addr.address; - bool ret = sscanf(string, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", - &ptr[0], &ptr[1], &ptr[2], &ptr[3], &ptr[4], &ptr[5]) == 6; - - if (ret) - memcpy(addr, &new_addr, sizeof(bt_bdaddr_t)); - - return ret; -} - -hash_index_t hash_function_bdaddr(const void *key) { - hash_index_t hash = 5381; - const char *bytes = (const char *)key; - for (size_t i = 0; i < sizeof(bt_bdaddr_t); ++i) - hash = ((hash << 5) + hash) + bytes[i]; - return hash; +hash_index_t hash_function_bdaddr(const void *key) +{ + hash_index_t hash = 5381; + const char *bytes = (const char *)key; + for (size_t i = 0; i < sizeof(bt_bdaddr_t); ++i) { + hash = ((hash << 5) + hash) + bytes[i]; + } + return hash; } diff --git a/components/bt/bluedroid/btcore/include/device_features.h b/components/bt/bluedroid/btcore/include/device_features.h old mode 100755 new mode 100644 index e501a0b57..360d3768d --- a/components/bt/bluedroid/btcore/include/device_features.h +++ b/components/bt/bluedroid/btcore/include/device_features.h @@ -23,7 +23,7 @@ // Represents a page of device feature enabled/disabled bits returned // by the local controller. See the bluetooth spec for bit indexes. typedef struct { - uint8_t as_array[8]; + uint8_t as_array[8]; } bt_device_features_t; #endif /*_DEVICE_FEATURES_H_*/ diff --git a/components/bt/bluedroid/btcore/include/event_mask.h b/components/bt/bluedroid/btcore/include/event_mask.h old mode 100755 new mode 100644 index 6226676cb..d4d036d56 --- a/components/bt/bluedroid/btcore/include/event_mask.h +++ b/components/bt/bluedroid/btcore/include/event_mask.h @@ -24,7 +24,7 @@ // HCI events the stack wishes to be informed about. See the bluetooth // spec for more information on what each bit means. typedef struct { - uint8_t as_array[8]; + uint8_t as_array[8]; } bt_event_mask_t; #endif /*_EVENT_MASK_H_*/ diff --git a/components/bt/bluedroid/btcore/include/version.h b/components/bt/bluedroid/btcore/include/version.h old mode 100755 new mode 100644 index 9d92a8f21..c63b03bd2 --- a/components/bt/bluedroid/btcore/include/version.h +++ b/components/bt/bluedroid/btcore/include/version.h @@ -21,11 +21,11 @@ #include typedef struct { - uint8_t hci_version; - uint16_t hci_revision; - uint8_t lmp_version; - uint16_t manufacturer; - uint16_t lmp_subversion; + uint8_t hci_version; + uint16_t hci_revision; + uint8_t lmp_version; + uint16_t manufacturer; + uint16_t lmp_subversion; } bt_version_t; #endif /*_VERSION_H_*/ diff --git a/components/bt/bluedroid/btif/bta_dm_co.c b/components/bt/bluedroid/btif/bta_dm_co.c old mode 100755 new mode 100644 index a31f5b71a..9edad8c0c --- a/components/bt/bluedroid/btif/bta_dm_co.c +++ b/components/bt/bluedroid/btif/bta_dm_co.c @@ -31,8 +31,7 @@ #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) #include "bte_appl.h" -tBTE_APPL_CFG bte_appl_cfg = -{ +tBTE_APPL_CFG bte_appl_cfg = { #if SMP_INCLUDED == TRUE BTA_LE_AUTH_REQ_SC_MITM_BOND, // Authentication requirements #else @@ -197,7 +196,7 @@ void bta_dm_co_rmt_oob(BD_ADDR bd_addr) #endif /* #if (defined(BTIF_INCLUDED) && BTIF_INCLUDED == TRUE) */ #endif - BTIF_TRACE_DEBUG("bta_dm_co_rmt_oob: result=%d",result); + BTIF_TRACE_DEBUG("bta_dm_co_rmt_oob: result=%d", result); bta_dm_ci_rmt_oob(result, bd_addr, p_c, p_r); } @@ -235,7 +234,7 @@ static void btui_sco_codec_callback(UINT16 event, UINT16 sco_handle) ** *******************************************************************************/ tBTA_DM_SCO_ROUTE_TYPE bta_dm_sco_co_init(UINT32 rx_bw, UINT32 tx_bw, - tBTA_CODEC_INFO * p_codec_type, UINT8 app_id) + tBTA_CODEC_INFO *p_codec_type, UINT8 app_id) { tBTM_SCO_ROUTE_TYPE route = BTA_DM_SCO_ROUTE_PCM; @@ -246,19 +245,16 @@ tBTA_DM_SCO_ROUTE_TYPE bta_dm_sco_co_init(UINT32 rx_bw, UINT32 tx_bw, /* HS invoke this call-out */ if ( #if (BTA_HS_INCLUDED == TRUE ) && (BTA_HS_INCLUDED == TRUE) - (app_id == BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.hs_sco_over_hci) || + (app_id == BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.hs_sco_over_hci) || #endif - /* AG invoke this call-out */ - (app_id != BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.ag_sco_over_hci )) - { + /* AG invoke this call-out */ + (app_id != BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.ag_sco_over_hci )) { route = btui_cb.sco_hci = BTA_DM_SCO_ROUTE_HCI; } /* no codec is is used for the SCO data */ - if (p_codec_type->codec_type == BTA_SCO_CODEC_PCM && route == BTA_DM_SCO_ROUTE_HCI) - { + if (p_codec_type->codec_type == BTA_SCO_CODEC_PCM && route == BTA_DM_SCO_ROUTE_HCI) { /* initialize SCO codec */ - if (!btui_sco_codec_init(rx_bw, tx_bw)) - { + if (!btui_sco_codec_init(rx_bw, tx_bw)) { BTIF_TRACE_ERROR("codec initialization exception!"); } } @@ -282,8 +278,7 @@ void bta_dm_sco_co_open(UINT16 handle, UINT8 pkt_size, UINT16 event) { tBTUI_SCO_CODEC_CFG cfg; - if (btui_cb.sco_hci) - { + if (btui_cb.sco_hci) { BTIF_TRACE_DEBUG("bta_dm_sco_co_open handle:%d pkt_size:%d", handle, pkt_size); /* use dedicated SCO buffer pool for SCO TX data */ cfg.pool_id = HCI_SCO_POOL_ID; @@ -308,8 +303,7 @@ void bta_dm_sco_co_open(UINT16 handle, UINT8 pkt_size, UINT16 event) *******************************************************************************/ void bta_dm_sco_co_close(void) { - if (btui_cb.sco_hci) - { + if (btui_cb.sco_hci) { BTIF_TRACE_DEBUG("bta_dm_sco_co_close close codec"); /* close sco codec */ btui_sco_codec_close(); @@ -329,10 +323,11 @@ void bta_dm_sco_co_close(void) *******************************************************************************/ void bta_dm_sco_co_in_data(BT_HDR *p_buf) { - if (btui_cfg.sco_use_mic) + if (btui_cfg.sco_use_mic) { btui_sco_codec_inqdata (p_buf); - else + } else { GKI_freebuf(p_buf); + } } /******************************************************************************* @@ -379,7 +374,7 @@ void bta_dm_co_le_io_key_req(BD_ADDR bd_addr, UINT8 *p_max_key_size, BTIF_TRACE_ERROR("##################################"); *p_max_key_size = 16; *p_init_key = *p_resp_key = - (BTA_LE_KEY_PENC|BTA_LE_KEY_PID|BTA_LE_KEY_PCSRK|BTA_LE_KEY_LENC|BTA_LE_KEY_LID|BTA_LE_KEY_LCSRK); + (BTA_LE_KEY_PENC | BTA_LE_KEY_PID | BTA_LE_KEY_PCSRK | BTA_LE_KEY_LENC | BTA_LE_KEY_LID | BTA_LE_KEY_LCSRK); } @@ -404,7 +399,7 @@ void bta_dm_co_ble_load_local_keys(tBTA_DM_BLE_LOCAL_KEY_MASK *p_key_mask, BT_OC BTIF_TRACE_DEBUG("##################################"); btif_dm_get_ble_local_keys( p_key_mask, er, p_id_keys); #else - LOG_ERROR("bta_dm_co_ble_load_local_keys: func not ported\n"); + LOG_WARN("bta_dm_co_ble_load_local_keys: func not ported\n"); #endif } @@ -443,20 +438,25 @@ void bta_dm_co_ble_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, /* *p_auth_req by default is FALSE for devices with NoInputNoOutput; TRUE for other devices. */ - if (bte_appl_cfg.ble_auth_req) + if (bte_appl_cfg.ble_auth_req) { *p_auth_req = bte_appl_cfg.ble_auth_req | (bte_appl_cfg.ble_auth_req & 0x04) | ((*p_auth_req) & 0x04); + } - if (bte_appl_cfg.ble_io_cap <=4) + if (bte_appl_cfg.ble_io_cap <= 4) { *p_io_cap = bte_appl_cfg.ble_io_cap; + } - if (bte_appl_cfg.ble_init_key <= BTM_BLE_INITIATOR_KEY_SIZE) + if (bte_appl_cfg.ble_init_key <= BTM_BLE_INITIATOR_KEY_SIZE) { *p_init_key = bte_appl_cfg.ble_init_key; + } - if (bte_appl_cfg.ble_resp_key <= BTM_BLE_RESPONDER_KEY_SIZE) + if (bte_appl_cfg.ble_resp_key <= BTM_BLE_RESPONDER_KEY_SIZE) { *p_resp_key = bte_appl_cfg.ble_resp_key; + } - if (bte_appl_cfg.ble_max_key_size > 7 && bte_appl_cfg.ble_max_key_size <= 16) + if (bte_appl_cfg.ble_max_key_size > 7 && bte_appl_cfg.ble_max_key_size <= 16) { *p_max_key_size = bte_appl_cfg.ble_max_key_size; + } } diff --git a/components/bt/bluedroid/btif/bta_gattc_co.c b/components/bt/bluedroid/btif/bta_gattc_co.c old mode 100755 new mode 100644 index 3d0acd9e7..2a255885a --- a/components/bt/bluedroid/btif/bta_gattc_co.c +++ b/components/bt/bluedroid/btif/bta_gattc_co.c @@ -32,18 +32,17 @@ #define GATT_CACHE_PREFIX "/data/misc/bluedroid/gatt_cache_" #ifdef BT_SUPPORT_NVM -static FILE* sCacheFD = 0; +static FILE *sCacheFD = 0; static void getFilename(char *buffer, BD_ADDR bda) { sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX - , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); } static void cacheClose() { - if (sCacheFD != 0) - { + if (sCacheFD != 0) { fclose(sCacheFD); sCacheFD = 0; } @@ -92,8 +91,9 @@ void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, UINT16 conn_id, BOO #ifdef BT_SUPPORT_NVM /* open NV cache and send call in */ tBTA_GATT_STATUS status = BTA_GATT_OK; - if (!btm_sec_is_a_bonded_dev(server_bda) || !cacheOpen(server_bda, to_save)) + if (!btm_sec_is_a_bonded_dev(server_bda) || !cacheOpen(server_bda, to_save)) { status = BTA_GATT_ERROR; + } BTIF_TRACE_DEBUG("%s() - status=%d", __FUNCTION__, status); bta_gattc_ci_cache_open(server_bda, evt, status, conn_id); @@ -123,13 +123,12 @@ void bta_gattc_co_cache_load(BD_ADDR server_bda, UINT16 evt, UINT16 start_index, tBTA_GATTC_NV_ATTR attr[BTA_GATTC_NV_LOAD_MAX]; tBTA_GATT_STATUS status = BTA_GATT_ERROR; #ifdef BT_SUPPORT_NVM - if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET))) - { + if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET))) { num_attr = fread(attr, sizeof(tBTA_GATTC_NV_ATTR), BTA_GATTC_NV_LOAD_MAX, sCacheFD); status = (num_attr < BTA_GATTC_NV_LOAD_MAX ? BTA_GATT_OK : BTA_GATT_MORE); } BTIF_TRACE_DEBUG("%s() - sCacheFD=%p, start_index=%d, read=%d, status=%d", - __FUNCTION__, sCacheFD, start_index, num_attr, status); + __FUNCTION__, sCacheFD, start_index, num_attr, status); #endif /* BT_SUPPORT_NVM */ bta_gattc_ci_cache_load(server_bda, evt, num_attr, attr, status, conn_id); @@ -157,8 +156,7 @@ void bta_gattc_co_cache_save (BD_ADDR server_bda, UINT16 evt, UINT16 num_attr, tBTA_GATT_STATUS status = BTA_GATT_OK; UNUSED(attr_index); #ifdef BT_SUPPORT_NVM - if (sCacheFD != 0) - { + if (sCacheFD != 0) { int num = fwrite(p_attr_list, sizeof(tBTA_GATTC_NV_ATTR), num_attr, sCacheFD); BTIF_TRACE_DEBUG("%s() wrote %d", __FUNCTION__, num); } diff --git a/components/bt/bluedroid/btif/bta_gatts_co.c b/components/bt/bluedroid/btif/bta_gatts_co.c old mode 100755 new mode 100644 index 160c1ed47..d6f0ca731 --- a/components/bt/bluedroid/btif/bta_gatts_co.c +++ b/components/bt/bluedroid/btif/bta_gatts_co.c @@ -34,8 +34,7 @@ #define BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE 50 -typedef struct -{ +typedef struct { BOOLEAN enable; UINT8 num_clients; tBTA_GATTS_SRV_CHG srv_chg[BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE]; @@ -53,12 +52,11 @@ static btif_gatts_srv_chg_cb_t btif_gatts_srv_chg_cb; static void btif_gatts_check_init(void) { - btif_gatts_srv_chg_cb_t *p_cb= &btif_gatts_srv_chg_cb; + btif_gatts_srv_chg_cb_t *p_cb = &btif_gatts_srv_chg_cb; - if (!p_cb->enable) - { - memset(p_cb, 0, sizeof(btif_gatts_srv_chg_cb_t)); - p_cb->enable = TRUE; + if (!p_cb->enable) { + memset(p_cb, 0, sizeof(btif_gatts_srv_chg_cb_t)); + p_cb->enable = TRUE; } } @@ -68,25 +66,21 @@ static void btif_gatts_check_init(void) void btif_gatts_add_bonded_dev_from_nv(BD_ADDR bda) { - btif_gatts_srv_chg_cb_t *p_cb= &btif_gatts_srv_chg_cb; + btif_gatts_srv_chg_cb_t *p_cb = &btif_gatts_srv_chg_cb; BOOLEAN found = FALSE; UINT8 i; btif_gatts_check_init(); - for (i=0; i != p_cb->num_clients; ++i) - { - if (!memcmp(p_cb->srv_chg[i].bda, bda, sizeof(BD_ADDR))) - { + for (i = 0; i != p_cb->num_clients; ++i) { + if (!memcmp(p_cb->srv_chg[i].bda, bda, sizeof(BD_ADDR))) { found = TRUE; break; } } - if (!found) - { - if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE) - { + if (!found) { + if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE) { bdcpy(p_cb->srv_chg[p_cb->num_clients].bda, bda); p_cb->srv_chg[p_cb->num_clients].srv_changed = FALSE; p_cb->num_clients++; diff --git a/components/bt/bluedroid/device/controller.c b/components/bt/bluedroid/device/controller.c old mode 100755 new mode 100644 index 2d928b305..c7fc98d6c --- a/components/bt/bluedroid/device/controller.c +++ b/components/bt/bluedroid/device/controller.c @@ -76,386 +76,419 @@ static bool secure_connections_supported; // Module lifecycle functions -static void start_up(void) { - BT_HDR *response; +static void start_up(void) +{ + BT_HDR *response; - // Send the initial reset command - response = AWAIT_COMMAND(packet_factory->make_reset()); - packet_parser->parse_generic_command_complete(response); - - // Request the classic buffer size next - response = AWAIT_COMMAND(packet_factory->make_read_buffer_size()); - packet_parser->parse_read_buffer_size_response( - response, &acl_data_size_classic, &acl_buffer_count_classic); - - // Tell the controller about our buffer sizes and buffer counts next - // TODO(zachoverflow): factor this out. eww l2cap contamination. And why just a hardcoded 10? - response = AWAIT_COMMAND( - packet_factory->make_host_buffer_size( - L2CAP_MTU_SIZE, - SCO_HOST_BUFFER_SIZE, - L2CAP_HOST_FC_ACL_BUFS, - 10 - ) - ); - - packet_parser->parse_generic_command_complete(response); - - // Read the local version info off the controller next, including - // information such as manufacturer and supported HCI version - response = AWAIT_COMMAND(packet_factory->make_read_local_version_info()); - packet_parser->parse_read_local_version_info_response(response, &bt_version); - - // Read the bluetooth address off the controller next - response = AWAIT_COMMAND(packet_factory->make_read_bd_addr()); - packet_parser->parse_read_bd_addr_response(response, &address); - - // Request the controller's supported commands next - response = AWAIT_COMMAND(packet_factory->make_read_local_supported_commands()); - packet_parser->parse_read_local_supported_commands_response( - response, - supported_commands, - HCI_SUPPORTED_COMMANDS_ARRAY_SIZE - ); - - // Read page 0 of the controller features next - uint8_t page_number = 0; - response = AWAIT_COMMAND(packet_factory->make_read_local_extended_features(page_number)); - packet_parser->parse_read_local_extended_features_response( - response, - &page_number, - &last_features_classic_page_index, - features_classic, - MAX_FEATURES_CLASSIC_PAGE_COUNT - ); - - assert(page_number == 0); - page_number++; - - // Inform the controller what page 0 features we support, based on what - // it told us it supports. We need to do this first before we request the - // next page, because the controller's response for page 1 may be - // dependent on what we configure from page 0 - simple_pairing_supported = HCI_SIMPLE_PAIRING_SUPPORTED(features_classic[0].as_array); - if (simple_pairing_supported) { - response = AWAIT_COMMAND(packet_factory->make_write_simple_pairing_mode(HCI_SP_MODE_ENABLED)); + // Send the initial reset command + response = AWAIT_COMMAND(packet_factory->make_reset()); packet_parser->parse_generic_command_complete(response); - } -#if (BLE_INCLUDED == TRUE) - if (HCI_LE_SPT_SUPPORTED(features_classic[0].as_array)) { - uint8_t simultaneous_le_host = HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array) ? BTM_BLE_SIMULTANEOUS_HOST : 0; + // Request the classic buffer size next + response = AWAIT_COMMAND(packet_factory->make_read_buffer_size()); + packet_parser->parse_read_buffer_size_response( + response, &acl_data_size_classic, &acl_buffer_count_classic); + + // Tell the controller about our buffer sizes and buffer counts next + // TODO(zachoverflow): factor this out. eww l2cap contamination. And why just a hardcoded 10? response = AWAIT_COMMAND( - packet_factory->make_ble_write_host_support(BTM_BLE_HOST_SUPPORT, simultaneous_le_host) + packet_factory->make_host_buffer_size( + L2CAP_MTU_SIZE, + SCO_HOST_BUFFER_SIZE, + L2CAP_HOST_FC_ACL_BUFS, + 10 + ) + ); + + packet_parser->parse_generic_command_complete(response); + + // Read the local version info off the controller next, including + // information such as manufacturer and supported HCI version + response = AWAIT_COMMAND(packet_factory->make_read_local_version_info()); + packet_parser->parse_read_local_version_info_response(response, &bt_version); + + // Read the bluetooth address off the controller next + response = AWAIT_COMMAND(packet_factory->make_read_bd_addr()); + packet_parser->parse_read_bd_addr_response(response, &address); + + // Request the controller's supported commands next + response = AWAIT_COMMAND(packet_factory->make_read_local_supported_commands()); + packet_parser->parse_read_local_supported_commands_response( + response, + supported_commands, + HCI_SUPPORTED_COMMANDS_ARRAY_SIZE ); - packet_parser->parse_generic_command_complete(response); - } -#endif - - // Done telling the controller about what page 0 features we support - // Request the remaining feature pages - while (page_number <= last_features_classic_page_index && - page_number < MAX_FEATURES_CLASSIC_PAGE_COUNT) { + // Read page 0 of the controller features next + uint8_t page_number = 0; response = AWAIT_COMMAND(packet_factory->make_read_local_extended_features(page_number)); packet_parser->parse_read_local_extended_features_response( - response, - &page_number, - &last_features_classic_page_index, - features_classic, - MAX_FEATURES_CLASSIC_PAGE_COUNT + response, + &page_number, + &last_features_classic_page_index, + features_classic, + MAX_FEATURES_CLASSIC_PAGE_COUNT ); + assert(page_number == 0); page_number++; - } + + // Inform the controller what page 0 features we support, based on what + // it told us it supports. We need to do this first before we request the + // next page, because the controller's response for page 1 may be + // dependent on what we configure from page 0 + simple_pairing_supported = HCI_SIMPLE_PAIRING_SUPPORTED(features_classic[0].as_array); + if (simple_pairing_supported) { + response = AWAIT_COMMAND(packet_factory->make_write_simple_pairing_mode(HCI_SP_MODE_ENABLED)); + packet_parser->parse_generic_command_complete(response); + } + +#if (BLE_INCLUDED == TRUE) + if (HCI_LE_SPT_SUPPORTED(features_classic[0].as_array)) { + uint8_t simultaneous_le_host = HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array) ? BTM_BLE_SIMULTANEOUS_HOST : 0; + response = AWAIT_COMMAND( + packet_factory->make_ble_write_host_support(BTM_BLE_HOST_SUPPORT, simultaneous_le_host) + ); + + packet_parser->parse_generic_command_complete(response); + } +#endif + + // Done telling the controller about what page 0 features we support + // Request the remaining feature pages + while (page_number <= last_features_classic_page_index && + page_number < MAX_FEATURES_CLASSIC_PAGE_COUNT) { + response = AWAIT_COMMAND(packet_factory->make_read_local_extended_features(page_number)); + packet_parser->parse_read_local_extended_features_response( + response, + &page_number, + &last_features_classic_page_index, + features_classic, + MAX_FEATURES_CLASSIC_PAGE_COUNT + ); + + page_number++; + } #if (SC_MODE_INCLUDED == TRUE) - secure_connections_supported = HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array); - if (secure_connections_supported) { - response = AWAIT_COMMAND(packet_factory->make_write_secure_connections_host_support(HCI_SC_MODE_ENABLED)); - packet_parser->parse_generic_command_complete(response); - } + secure_connections_supported = HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array); + if (secure_connections_supported) { + response = AWAIT_COMMAND(packet_factory->make_write_secure_connections_host_support(HCI_SC_MODE_ENABLED)); + packet_parser->parse_generic_command_complete(response); + } #endif #if (BLE_INCLUDED == TRUE) - ble_supported = last_features_classic_page_index >= 1 && HCI_LE_HOST_SUPPORTED(features_classic[1].as_array); - if (ble_supported) { - // Request the ble white list size next - response = AWAIT_COMMAND(packet_factory->make_ble_read_white_list_size()); - packet_parser->parse_ble_read_white_list_size_response(response, &ble_white_list_size); + ble_supported = last_features_classic_page_index >= 1 && HCI_LE_HOST_SUPPORTED(features_classic[1].as_array); + if (ble_supported) { + // Request the ble white list size next + response = AWAIT_COMMAND(packet_factory->make_ble_read_white_list_size()); + packet_parser->parse_ble_read_white_list_size_response(response, &ble_white_list_size); - // Request the ble buffer size next - response = AWAIT_COMMAND(packet_factory->make_ble_read_buffer_size()); - packet_parser->parse_ble_read_buffer_size_response( - response, - &acl_data_size_ble, - &acl_buffer_count_ble - ); - - // Response of 0 indicates ble has the same buffer size as classic - if (acl_data_size_ble == 0) - acl_data_size_ble = acl_data_size_classic; - - // Request the ble supported states next - response = AWAIT_COMMAND(packet_factory->make_ble_read_supported_states()); - packet_parser->parse_ble_read_supported_states_response( - response, - ble_supported_states, - sizeof(ble_supported_states) - ); - - // Request the ble supported features next - response = AWAIT_COMMAND(packet_factory->make_ble_read_local_supported_features()); - packet_parser->parse_ble_read_local_supported_features_response( - response, - &features_ble - ); - - if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array)) { - response = AWAIT_COMMAND(packet_factory->make_ble_read_resolving_list_size()); - packet_parser->parse_ble_read_resolving_list_size_response( + // Request the ble buffer size next + response = AWAIT_COMMAND(packet_factory->make_ble_read_buffer_size()); + packet_parser->parse_ble_read_buffer_size_response( response, - &ble_resolving_list_max_size); - } + &acl_data_size_ble, + &acl_buffer_count_ble + ); - if (HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array)) { - response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length()); - packet_parser->parse_ble_read_suggested_default_data_length_response( + // Response of 0 indicates ble has the same buffer size as classic + if (acl_data_size_ble == 0) { + acl_data_size_ble = acl_data_size_classic; + } + + // Request the ble supported states next + response = AWAIT_COMMAND(packet_factory->make_ble_read_supported_states()); + packet_parser->parse_ble_read_supported_states_response( response, - &ble_suggested_default_data_length); - } + ble_supported_states, + sizeof(ble_supported_states) + ); - // Set the ble event mask next - response = AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK)); - packet_parser->parse_generic_command_complete(response); - } + // Request the ble supported features next + response = AWAIT_COMMAND(packet_factory->make_ble_read_local_supported_features()); + packet_parser->parse_ble_read_local_supported_features_response( + response, + &features_ble + ); + + if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array)) { + response = AWAIT_COMMAND(packet_factory->make_ble_read_resolving_list_size()); + packet_parser->parse_ble_read_resolving_list_size_response( + response, + &ble_resolving_list_max_size); + } + + if (HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array)) { + response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length()); + packet_parser->parse_ble_read_suggested_default_data_length_response( + response, + &ble_suggested_default_data_length); + } + + // Set the ble event mask next + response = AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK)); + packet_parser->parse_generic_command_complete(response); + } #endif - if (simple_pairing_supported) { - response = AWAIT_COMMAND(packet_factory->make_set_event_mask(&CLASSIC_EVENT_MASK)); - packet_parser->parse_generic_command_complete(response); - } + if (simple_pairing_supported) { + response = AWAIT_COMMAND(packet_factory->make_set_event_mask(&CLASSIC_EVENT_MASK)); + packet_parser->parse_generic_command_complete(response); + } - readable = true; - // return future_new_immediate(FUTURE_SUCCESS); - return; + readable = true; + // return future_new_immediate(FUTURE_SUCCESS); + return; } -static void shut_down(void) { - readable = false; +static void shut_down(void) +{ + readable = false; } -static bool get_is_ready(void) { - return readable; +static bool get_is_ready(void) +{ + return readable; } -static const bt_bdaddr_t *get_address(void) { - assert(readable); - return &address; +static const bt_bdaddr_t *get_address(void) +{ + assert(readable); + return &address; } -static const bt_version_t *get_bt_version(void) { - assert(readable); - return &bt_version; +static const bt_version_t *get_bt_version(void) +{ + assert(readable); + return &bt_version; } // TODO(zachoverflow): hide inside, move decoder inside too -static const bt_device_features_t *get_features_classic(int index) { - assert(readable); - assert(index < MAX_FEATURES_CLASSIC_PAGE_COUNT); - return &features_classic[index]; +static const bt_device_features_t *get_features_classic(int index) +{ + assert(readable); + assert(index < MAX_FEATURES_CLASSIC_PAGE_COUNT); + return &features_classic[index]; } -static uint8_t get_last_features_classic_index(void) { - assert(readable); - return last_features_classic_page_index; +static uint8_t get_last_features_classic_index(void) +{ + assert(readable); + return last_features_classic_page_index; } -static const bt_device_features_t *get_features_ble(void) { - assert(readable); - assert(ble_supported); - return &features_ble; +static const bt_device_features_t *get_features_ble(void) +{ + assert(readable); + assert(ble_supported); + return &features_ble; } -static const uint8_t *get_ble_supported_states(void) { - assert(readable); - assert(ble_supported); - return ble_supported_states; +static const uint8_t *get_ble_supported_states(void) +{ + assert(readable); + assert(ble_supported); + return ble_supported_states; } -static bool supports_simple_pairing(void) { - assert(readable); - return simple_pairing_supported; +static bool supports_simple_pairing(void) +{ + assert(readable); + return simple_pairing_supported; } -static bool supports_secure_connections(void) { - assert(readable); - return secure_connections_supported; +static bool supports_secure_connections(void) +{ + assert(readable); + return secure_connections_supported; } -static bool supports_simultaneous_le_bredr(void) { - assert(readable); - return HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array); +static bool supports_simultaneous_le_bredr(void) +{ + assert(readable); + return HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array); } -static bool supports_reading_remote_extended_features(void) { - assert(readable); - return HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(supported_commands); +static bool supports_reading_remote_extended_features(void) +{ + assert(readable); + return HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(supported_commands); } -static bool supports_interlaced_inquiry_scan(void) { - assert(readable); - return HCI_LMP_INTERLACED_INQ_SCAN_SUPPORTED(features_classic[0].as_array); +static bool supports_interlaced_inquiry_scan(void) +{ + assert(readable); + return HCI_LMP_INTERLACED_INQ_SCAN_SUPPORTED(features_classic[0].as_array); } -static bool supports_rssi_with_inquiry_results(void) { - assert(readable); - return HCI_LMP_INQ_RSSI_SUPPORTED(features_classic[0].as_array); +static bool supports_rssi_with_inquiry_results(void) +{ + assert(readable); + return HCI_LMP_INQ_RSSI_SUPPORTED(features_classic[0].as_array); } -static bool supports_extended_inquiry_response(void) { - assert(readable); - return HCI_EXT_INQ_RSP_SUPPORTED(features_classic[0].as_array); +static bool supports_extended_inquiry_response(void) +{ + assert(readable); + return HCI_EXT_INQ_RSP_SUPPORTED(features_classic[0].as_array); } -static bool supports_master_slave_role_switch(void) { - assert(readable); - return HCI_SWITCH_SUPPORTED(features_classic[0].as_array); +static bool supports_master_slave_role_switch(void) +{ + assert(readable); + return HCI_SWITCH_SUPPORTED(features_classic[0].as_array); } -static bool supports_ble(void) { - assert(readable); - return ble_supported; +static bool supports_ble(void) +{ + assert(readable); + return ble_supported; } -static bool supports_ble_privacy(void) { - assert(readable); - assert(ble_supported); - return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array); +static bool supports_ble_privacy(void) +{ + assert(readable); + assert(ble_supported); + return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array); } -static bool supports_ble_packet_extension(void) { - assert(readable); - assert(ble_supported); - return HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array); +static bool supports_ble_packet_extension(void) +{ + assert(readable); + assert(ble_supported); + return HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array); } -static bool supports_ble_connection_parameters_request(void) { - assert(readable); - assert(ble_supported); - return HCI_LE_CONN_PARAM_REQ_SUPPORTED(features_ble.as_array); +static bool supports_ble_connection_parameters_request(void) +{ + assert(readable); + assert(ble_supported); + return HCI_LE_CONN_PARAM_REQ_SUPPORTED(features_ble.as_array); } -static uint16_t get_acl_data_size_classic(void) { - assert(readable); - return acl_data_size_classic; +static uint16_t get_acl_data_size_classic(void) +{ + assert(readable); + return acl_data_size_classic; } -static uint16_t get_acl_data_size_ble(void) { - assert(readable); - assert(ble_supported); - return acl_data_size_ble; +static uint16_t get_acl_data_size_ble(void) +{ + assert(readable); + assert(ble_supported); + return acl_data_size_ble; } -static uint16_t get_acl_packet_size_classic(void) { - assert(readable); - return acl_data_size_classic + HCI_DATA_PREAMBLE_SIZE; +static uint16_t get_acl_packet_size_classic(void) +{ + assert(readable); + return acl_data_size_classic + HCI_DATA_PREAMBLE_SIZE; } -static uint16_t get_acl_packet_size_ble(void) { - assert(readable); - return acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE; +static uint16_t get_acl_packet_size_ble(void) +{ + assert(readable); + return acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE; } -static uint16_t get_ble_suggested_default_data_length(void) { - assert(readable); - assert(ble_supported); - return ble_suggested_default_data_length; +static uint16_t get_ble_suggested_default_data_length(void) +{ + assert(readable); + assert(ble_supported); + return ble_suggested_default_data_length; } -static uint16_t get_acl_buffer_count_classic(void) { - assert(readable); - return acl_buffer_count_classic; +static uint16_t get_acl_buffer_count_classic(void) +{ + assert(readable); + return acl_buffer_count_classic; } -static uint8_t get_acl_buffer_count_ble(void) { - assert(readable); - assert(ble_supported); - return acl_buffer_count_ble; +static uint8_t get_acl_buffer_count_ble(void) +{ + assert(readable); + assert(ble_supported); + return acl_buffer_count_ble; } -static uint8_t get_ble_white_list_size(void) { - assert(readable); - assert(ble_supported); - return ble_white_list_size; +static uint8_t get_ble_white_list_size(void) +{ + assert(readable); + assert(ble_supported); + return ble_white_list_size; } -static uint8_t get_ble_resolving_list_max_size(void) { - assert(readable); - assert(ble_supported); - return ble_resolving_list_max_size; +static uint8_t get_ble_resolving_list_max_size(void) +{ + assert(readable); + assert(ble_supported); + return ble_resolving_list_max_size; } -static void set_ble_resolving_list_max_size(int resolving_list_max_size) { - assert(readable); - assert(ble_supported); - ble_resolving_list_max_size = resolving_list_max_size; +static void set_ble_resolving_list_max_size(int resolving_list_max_size) +{ + assert(readable); + assert(ble_supported); + ble_resolving_list_max_size = resolving_list_max_size; } static const controller_t interface = { - start_up, - shut_down, - get_is_ready, + start_up, + shut_down, + get_is_ready, - get_address, - get_bt_version, + get_address, + get_bt_version, - get_features_classic, - get_last_features_classic_index, + get_features_classic, + get_last_features_classic_index, - get_features_ble, - get_ble_supported_states, + get_features_ble, + get_ble_supported_states, - supports_simple_pairing, - supports_secure_connections, - supports_simultaneous_le_bredr, - supports_reading_remote_extended_features, - supports_interlaced_inquiry_scan, - supports_rssi_with_inquiry_results, - supports_extended_inquiry_response, - supports_master_slave_role_switch, + supports_simple_pairing, + supports_secure_connections, + supports_simultaneous_le_bredr, + supports_reading_remote_extended_features, + supports_interlaced_inquiry_scan, + supports_rssi_with_inquiry_results, + supports_extended_inquiry_response, + supports_master_slave_role_switch, - supports_ble, - supports_ble_packet_extension, - supports_ble_connection_parameters_request, - supports_ble_privacy, + supports_ble, + supports_ble_packet_extension, + supports_ble_connection_parameters_request, + supports_ble_privacy, - get_acl_data_size_classic, - get_acl_data_size_ble, + get_acl_data_size_classic, + get_acl_data_size_ble, - get_acl_packet_size_classic, - get_acl_packet_size_ble, - get_ble_suggested_default_data_length, + get_acl_packet_size_classic, + get_acl_packet_size_ble, + get_ble_suggested_default_data_length, - get_acl_buffer_count_classic, - get_acl_buffer_count_ble, + get_acl_buffer_count_classic, + get_acl_buffer_count_ble, - get_ble_white_list_size, + get_ble_white_list_size, - get_ble_resolving_list_max_size, - set_ble_resolving_list_max_size + get_ble_resolving_list_max_size, + set_ble_resolving_list_max_size }; -const controller_t *controller_get_interface() { - static bool loaded = false; - if (!loaded) { - loaded = true; +const controller_t *controller_get_interface() +{ + static bool loaded = false; + if (!loaded) { + loaded = true; - hci = hci_layer_get_interface(); - packet_factory = hci_packet_factory_get_interface(); - packet_parser = hci_packet_parser_get_interface(); - } + hci = hci_layer_get_interface(); + packet_factory = hci_packet_factory_get_interface(); + packet_parser = hci_packet_parser_get_interface(); + } - return &interface; + return &interface; } diff --git a/components/bt/bluedroid/device/include/controller.h b/components/bt/bluedroid/device/include/controller.h old mode 100755 new mode 100644 index 03a63c0fc..6d6e5a8ca --- a/components/bt/bluedroid/device/include/controller.h +++ b/components/bt/bluedroid/device/include/controller.h @@ -30,54 +30,54 @@ #include "hci_packet_parser.h" typedef struct controller_t { - void (*start_up)(void); - void (*shut_down)(void); - bool (*get_is_ready)(void); + void (*start_up)(void); + void (*shut_down)(void); + bool (*get_is_ready)(void); - const bt_bdaddr_t *(*get_address)(void); - const bt_version_t *(*get_bt_version)(void); + const bt_bdaddr_t *(*get_address)(void); + const bt_version_t *(*get_bt_version)(void); - const bt_device_features_t *(*get_features_classic)(int index); + const bt_device_features_t *(*get_features_classic)(int index); - uint8_t (*get_last_features_classic_index)(void); + uint8_t (*get_last_features_classic_index)(void); - const bt_device_features_t *(*get_features_ble)(void); - const uint8_t *(*get_ble_supported_states)(void); + const bt_device_features_t *(*get_features_ble)(void); + const uint8_t *(*get_ble_supported_states)(void); - bool (*supports_simple_pairing)(void); - bool (*supports_secure_connections)(void); - bool (*supports_simultaneous_le_bredr)(void); - bool (*supports_reading_remote_extended_features)(void); - bool (*supports_interlaced_inquiry_scan)(void); - bool (*supports_rssi_with_inquiry_results)(void); - bool (*supports_extended_inquiry_response)(void); - bool (*supports_master_slave_role_switch)(void); + bool (*supports_simple_pairing)(void); + bool (*supports_secure_connections)(void); + bool (*supports_simultaneous_le_bredr)(void); + bool (*supports_reading_remote_extended_features)(void); + bool (*supports_interlaced_inquiry_scan)(void); + bool (*supports_rssi_with_inquiry_results)(void); + bool (*supports_extended_inquiry_response)(void); + bool (*supports_master_slave_role_switch)(void); - bool (*supports_ble)(void); - bool (*supports_ble_packet_extension)(void); - bool (*supports_ble_connection_parameters_request)(void); - bool (*supports_ble_privacy)(void); + bool (*supports_ble)(void); + bool (*supports_ble_packet_extension)(void); + bool (*supports_ble_connection_parameters_request)(void); + bool (*supports_ble_privacy)(void); - // Get the cached acl data sizes for the controller. - uint16_t (*get_acl_data_size_classic)(void); - uint16_t (*get_acl_data_size_ble)(void); + // Get the cached acl data sizes for the controller. + uint16_t (*get_acl_data_size_classic)(void); + uint16_t (*get_acl_data_size_ble)(void); - // Get the cached acl packet sizes for the controller. - // This is a convenience function for the respective - // acl data size + size of the acl header. - uint16_t (*get_acl_packet_size_classic)(void); - uint16_t (*get_acl_packet_size_ble)(void); + // Get the cached acl packet sizes for the controller. + // This is a convenience function for the respective + // acl data size + size of the acl header. + uint16_t (*get_acl_packet_size_classic)(void); + uint16_t (*get_acl_packet_size_ble)(void); - uint16_t (*get_ble_default_data_packet_length)(void); + uint16_t (*get_ble_default_data_packet_length)(void); - // Get the number of acl packets the controller can buffer. - uint16_t (*get_acl_buffer_count_classic)(void); - uint8_t (*get_acl_buffer_count_ble)(void); + // Get the number of acl packets the controller can buffer. + uint16_t (*get_acl_buffer_count_classic)(void); + uint8_t (*get_acl_buffer_count_ble)(void); - uint8_t (*get_ble_white_list_size)(void); + uint8_t (*get_ble_white_list_size)(void); - uint8_t (*get_ble_resolving_list_max_size)(void); - void (*set_ble_resolving_list_max_size)(int resolving_list_max_size); + uint8_t (*get_ble_resolving_list_max_size)(void); + void (*set_ble_resolving_list_max_size)(int resolving_list_max_size); } controller_t; const controller_t *controller_get_interface(); diff --git a/components/bt/bluedroid/device/include/interop.h b/components/bt/bluedroid/device/include/interop.h old mode 100755 new mode 100644 index 76ba93ad5..74394d95d --- a/components/bt/bluedroid/device/include/interop.h +++ b/components/bt/bluedroid/device/include/interop.h @@ -23,16 +23,16 @@ #include "bt_defs.h" typedef enum { - // Disable secure connections - // This is for pre BT 4.1/2 devices that do not handle secure mode - // very well. - INTEROP_DISABLE_LE_SECURE_CONNECTIONS, + // Disable secure connections + // This is for pre BT 4.1/2 devices that do not handle secure mode + // very well. + INTEROP_DISABLE_LE_SECURE_CONNECTIONS, - // Some devices have proven problematic during the pairing process, often - // requiring multiple retries to complete pairing. To avoid degrading the user - // experience for those devices, automatically re-try pairing if page - // timeouts are received during pairing. - INTEROP_AUTO_RETRY_PAIRING + // Some devices have proven problematic during the pairing process, often + // requiring multiple retries to complete pairing. To avoid degrading the user + // experience for those devices, automatically re-try pairing if page + // timeouts are received during pairing. + INTEROP_AUTO_RETRY_PAIRING } interop_feature_t; // Check if a given |addr| matches a known interoperability workaround as identified diff --git a/components/bt/bluedroid/device/include/interop_database.h b/components/bt/bluedroid/device/include/interop_database.h old mode 100755 new mode 100644 index 1619c7ba2..7bc2e8875 --- a/components/bt/bluedroid/device/include/interop_database.h +++ b/components/bt/bluedroid/device/include/interop_database.h @@ -22,29 +22,29 @@ #include "interop.h" typedef struct { - bt_bdaddr_t addr; - uint8_t len; - interop_feature_t feature; + bt_bdaddr_t addr; + uint8_t len; + interop_feature_t feature; } interop_entry_t; static const interop_entry_t interop_database[] = { - // Nexus Remote (Spike) - // Note: May affect other Asus brand devices - {{0x08, 0x62, 0x66, 0,0,0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - {{0x38, 0x2c, 0x4a, 0xc9, 0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - {{0x38, 0x2c, 0x4a, 0xe6, 0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - {{0x54, 0xa0, 0x50, 0xd9, 0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - {{0xac, 0x9e, 0x17, 0,0,0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - {{0xf0, 0x79, 0x59, 0,0,0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + // Nexus Remote (Spike) + // Note: May affect other Asus brand devices + {{0x08, 0x62, 0x66, 0, 0, 0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + {{0x38, 0x2c, 0x4a, 0xc9, 0, 0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + {{0x38, 0x2c, 0x4a, 0xe6, 0, 0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + {{0x54, 0xa0, 0x50, 0xd9, 0, 0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + {{0xac, 0x9e, 0x17, 0, 0, 0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + {{0xf0, 0x79, 0x59, 0, 0, 0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - // Motorola Key Link - {{0x1c, 0x96, 0x5a, 0,0,0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + // Motorola Key Link + {{0x1c, 0x96, 0x5a, 0, 0, 0}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - // Flic smart button - {{0x80, 0xe4, 0xda, 0x70, 0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + // Flic smart button + {{0x80, 0xe4, 0xda, 0x70, 0, 0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, - // BMW car kits (Harman/Becker) - {{0x9c, 0xdf, 0x03, 0,0,0}, 3, INTEROP_AUTO_RETRY_PAIRING} + // BMW car kits (Harman/Becker) + {{0x9c, 0xdf, 0x03, 0, 0, 0}, 3, INTEROP_AUTO_RETRY_PAIRING} }; #endif /*_INTEROP_DATABASE_H_*/ diff --git a/components/bt/bluedroid/device/interop.c b/components/bt/bluedroid/device/interop.c old mode 100755 new mode 100644 index ff3c9704f..ffcbc0fe7 --- a/components/bt/bluedroid/device/interop.c +++ b/components/bt/bluedroid/device/interop.c @@ -26,31 +26,33 @@ #define CASE_RETURN_STR(const) case const: return #const; -static const char* interop_feature_string(const interop_feature_t feature) { - switch (feature) { - CASE_RETURN_STR(INTEROP_DISABLE_LE_SECURE_CONNECTIONS) - CASE_RETURN_STR(INTEROP_AUTO_RETRY_PAIRING) - } +static const char *interop_feature_string(const interop_feature_t feature) +{ + switch (feature) { + CASE_RETURN_STR(INTEROP_DISABLE_LE_SECURE_CONNECTIONS) + CASE_RETURN_STR(INTEROP_AUTO_RETRY_PAIRING) + } - return "UNKNOWN"; + return "UNKNOWN"; } // Interface functions -bool interop_match(const interop_feature_t feature, const bt_bdaddr_t *addr) { - assert(addr); +bool interop_match(const interop_feature_t feature, const bt_bdaddr_t *addr) +{ + assert(addr); - const size_t db_size = sizeof(interop_database) / sizeof(interop_entry_t); + const size_t db_size = sizeof(interop_database) / sizeof(interop_entry_t); - for (size_t i = 0; i != db_size; ++i) { - if (feature == interop_database[i].feature && - memcmp(addr, &interop_database[i].addr, interop_database[i].len) == 0) { - char bdstr[20] = {0}; - LOG_WARN("%s() Device %s is a match for interop workaround %s", __func__, - bdaddr_to_string(addr, bdstr, sizeof(bdstr)), interop_feature_string(feature)); - return true; + for (size_t i = 0; i != db_size; ++i) { + if (feature == interop_database[i].feature && + memcmp(addr, &interop_database[i].addr, interop_database[i].len) == 0) { + char bdstr[20] = {0}; + LOG_WARN("%s() Device %s is a match for interop workaround %s", __func__, + bdaddr_to_string(addr, bdstr, sizeof(bdstr)), interop_feature_string(feature)); + return true; + } } - } - return false; + return false; } diff --git a/components/bt/bluedroid/gki/gki_buffer.c b/components/bt/bluedroid/gki/gki_buffer.c old mode 100755 new mode 100644 index 7a6031adc..9ae20df90 --- a/components/bt/bluedroid/gki/gki_buffer.c +++ b/components/bt/bluedroid/gki/gki_buffer.c @@ -54,8 +54,7 @@ static void gki_init_free_queue (UINT8 id, UINT16 size, UINT16 total, void *p_me act_size = (UINT16)(tempsize + BUFFER_PADDING_SIZE); /* Remember pool start and end addresses */ - if(p_mem) - { + if (p_mem) { p_cb->pool_start[id] = (UINT8 *)p_mem; p_cb->pool_end[id] = (UINT8 *)p_mem + (act_size * total); } @@ -68,12 +67,10 @@ static void gki_init_free_queue (UINT8 id, UINT16 size, UINT16 total, void *p_me p_cb->freeq[id].max_cnt = 0; /* Initialize index table */ - if(p_mem) - { + if (p_mem) { hdr = (BUFFER_HDR_T *)p_mem; p_cb->freeq[id]._p_first = hdr; - for (i = 0; i < total; i++) - { + for (i = 0; i < total; i++) { hdr->q_id = id; hdr->status = BUF_STATUS_FREE; magic = (UINT32 *)((UINT8 *)hdr + BUFFER_HDR_SIZE + tempsize); @@ -92,10 +89,8 @@ void gki_buffer_cleanup(void) UINT8 i; tGKI_COM_CB *p_cb = &gki_cb.com; - for (i=0; i < GKI_NUM_FIXED_BUF_POOLS; i++) - { - if ( 0 < p_cb->freeq[i].max_cnt ) - { + for (i = 0; i < GKI_NUM_FIXED_BUF_POOLS; i++) { + if ( 0 < p_cb->freeq[i].max_cnt ) { osi_free(p_cb->pool_start[i]); p_cb->freeq[i].cur_cnt = 0; @@ -123,25 +118,24 @@ void gki_buffer_cleanup(void) void gki_buffer_init(void) { static const struct { - uint16_t size; - uint16_t count; + uint16_t size; + uint16_t count; } buffer_info[GKI_NUM_FIXED_BUF_POOLS] = { - { GKI_BUF0_SIZE, GKI_BUF0_MAX }, - { GKI_BUF1_SIZE, GKI_BUF1_MAX }, - { GKI_BUF2_SIZE, GKI_BUF2_MAX }, - { GKI_BUF3_SIZE, GKI_BUF3_MAX }, - { GKI_BUF4_SIZE, GKI_BUF4_MAX }, - { GKI_BUF5_SIZE, GKI_BUF5_MAX }, - { GKI_BUF6_SIZE, GKI_BUF6_MAX }, - { GKI_BUF7_SIZE, GKI_BUF7_MAX }, - { GKI_BUF8_SIZE, GKI_BUF8_MAX }, - { GKI_BUF9_SIZE, GKI_BUF9_MAX }, + { GKI_BUF0_SIZE, GKI_BUF0_MAX }, + { GKI_BUF1_SIZE, GKI_BUF1_MAX }, + { GKI_BUF2_SIZE, GKI_BUF2_MAX }, + { GKI_BUF3_SIZE, GKI_BUF3_MAX }, + { GKI_BUF4_SIZE, GKI_BUF4_MAX }, + { GKI_BUF5_SIZE, GKI_BUF5_MAX }, + { GKI_BUF6_SIZE, GKI_BUF6_MAX }, + { GKI_BUF7_SIZE, GKI_BUF7_MAX }, + { GKI_BUF8_SIZE, GKI_BUF8_MAX }, + { GKI_BUF9_SIZE, GKI_BUF9_MAX }, }; tGKI_COM_CB *p_cb = &gki_cb.com; - for (int i = 0; i < GKI_NUM_TOTAL_BUF_POOLS; i++) - { + for (int i = 0; i < GKI_NUM_TOTAL_BUF_POOLS; i++) { p_cb->pool_start[i] = NULL; p_cb->pool_end[i] = NULL; p_cb->pool_size[i] = 0; @@ -158,7 +152,7 @@ void gki_buffer_init(void) p_cb->pool_access_mask = GKI_DEF_BUFPOOL_PERM_MASK; for (int i = 0; i < GKI_NUM_FIXED_BUF_POOLS; ++i) { - gki_init_free_queue(i, buffer_info[i].size, buffer_info[i].count, NULL); + gki_init_free_queue(i, buffer_info[i].size, buffer_info[i].count, NULL); } } @@ -195,18 +189,18 @@ void GKI_init_q (BUFFER_Q *p_q) *******************************************************************************/ void *GKI_getbuf (UINT16 size) { - BUFFER_HDR_T *header = osi_malloc(size + BUFFER_HDR_SIZE); - assert(header != NULL); - if (header != NULL) { - header->status = BUF_STATUS_UNLINKED; - header->p_next = NULL; - header->Type = 0; - header->size = size; + BUFFER_HDR_T *header = osi_malloc(size + BUFFER_HDR_SIZE); + assert(header != NULL); + if (header != NULL) { + header->status = BUF_STATUS_UNLINKED; + header->p_next = NULL; + header->Type = 0; + header->size = size; - return header + 1; - } else { - return NULL; - } + return header + 1; + } else { + return NULL; + } } @@ -227,7 +221,7 @@ void *GKI_getbuf (UINT16 size) *******************************************************************************/ void *GKI_getpoolbuf (UINT8 pool_id) { - return GKI_getbuf(gki_cb.com.pool_size[pool_id]); + return GKI_getbuf(gki_cb.com.pool_size[pool_id]); } /******************************************************************************* @@ -243,7 +237,7 @@ void *GKI_getpoolbuf (UINT8 pool_id) *******************************************************************************/ void GKI_freebuf (void *p_buf) { - osi_free((BUFFER_HDR_T *)p_buf - 1); + osi_free((BUFFER_HDR_T *)p_buf - 1); } @@ -260,8 +254,8 @@ void GKI_freebuf (void *p_buf) *******************************************************************************/ UINT16 GKI_get_buf_size (void *p_buf) { - BUFFER_HDR_T *header = (BUFFER_HDR_T *)p_buf - 1; - return header->size; + BUFFER_HDR_T *header = (BUFFER_HDR_T *)p_buf - 1; + return header->size; } /******************************************************************************* @@ -284,13 +278,12 @@ void GKI_enqueue (BUFFER_Q *p_q, void *p_buf) GKI_disable(); /* Since the queue is exposed (C vs C++), keep the pointers in exposed format */ - if (p_q->_p_last) - { + if (p_q->_p_last) { BUFFER_HDR_T *_p_last_hdr = (BUFFER_HDR_T *)((UINT8 *)p_q->_p_last - BUFFER_HDR_SIZE); _p_last_hdr->p_next = p_hdr; - } - else + } else { p_q->_p_first = p_buf; + } p_q->_p_last = p_buf; p_q->_count++; @@ -318,8 +311,7 @@ void *GKI_dequeue (BUFFER_Q *p_q) GKI_disable(); - if (!p_q || !p_q->_count) - { + if (!p_q || !p_q->_count) { GKI_enable(); return (NULL); } @@ -328,10 +320,9 @@ void *GKI_dequeue (BUFFER_Q *p_q) /* Keep buffers such that GKI header is invisible */ - if (p_hdr->p_next) + if (p_hdr->p_next) { p_q->_p_first = ((UINT8 *)p_hdr->p_next + BUFFER_HDR_SIZE); - else - { + } else { p_q->_p_first = NULL; p_q->_p_last = NULL; } @@ -365,8 +356,7 @@ void *GKI_remove_from_queue (BUFFER_Q *p_q, void *p_buf) GKI_disable(); - if (p_buf == p_q->_p_first) - { + if (p_buf == p_q->_p_first) { GKI_enable(); return (GKI_dequeue (p_q)); } @@ -374,16 +364,15 @@ void *GKI_remove_from_queue (BUFFER_Q *p_q, void *p_buf) p_buf_hdr = (BUFFER_HDR_T *)((UINT8 *)p_buf - BUFFER_HDR_SIZE); p_prev = (BUFFER_HDR_T *)((UINT8 *)p_q->_p_first - BUFFER_HDR_SIZE); - for ( ; p_prev; p_prev = p_prev->p_next) - { + for ( ; p_prev; p_prev = p_prev->p_next) { /* If the previous points to this one, move the pointers around */ - if (p_prev->p_next == p_buf_hdr) - { + if (p_prev->p_next == p_buf_hdr) { p_prev->p_next = p_buf_hdr->p_next; /* If we are removing the last guy in the queue, update _p_last */ - if (p_buf == p_q->_p_last) + if (p_buf == p_q->_p_last) { p_q->_p_last = p_prev + 1; + } /* One less in the queue */ p_q->_count--; @@ -450,10 +439,11 @@ void *GKI_getnext (void *p_buf) p_hdr = (BUFFER_HDR_T *) ((UINT8 *) p_buf - BUFFER_HDR_SIZE); - if (p_hdr->p_next) + if (p_hdr->p_next) { return ((UINT8 *)p_hdr->p_next + BUFFER_HDR_SIZE); - else + } else { return (NULL); + } } /******************************************************************************* @@ -491,8 +481,9 @@ UINT16 GKI_queue_length(BUFFER_Q *p_q) *******************************************************************************/ UINT16 GKI_poolcount (UINT8 pool_id) { - if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) + if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) { return (0); + } return (gki_cb.com.freeq[pool_id].total); } @@ -513,8 +504,9 @@ UINT16 GKI_poolfreecount (UINT8 pool_id) { FREE_QUEUE_T *Q; - if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) + if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) { return (0); + } Q = &gki_cb.com.freeq[pool_id]; @@ -534,8 +526,9 @@ UINT16 GKI_poolfreecount (UINT8 pool_id) *******************************************************************************/ UINT16 GKI_get_pool_bufsize (UINT8 pool_id) { - if (pool_id < GKI_NUM_TOTAL_BUF_POOLS) + if (pool_id < GKI_NUM_TOTAL_BUF_POOLS) { return (gki_cb.com.freeq[pool_id].size); + } return (0); } @@ -556,13 +549,15 @@ UINT16 GKI_poolutilization (UINT8 pool_id) { FREE_QUEUE_T *Q; - if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) + if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) { return (100); + } Q = &gki_cb.com.freeq[pool_id]; - if (Q->total == 0) + if (Q->total == 0) { return (100); + } return ((Q->cur_cnt * 100) / Q->total); } diff --git a/components/bt/bluedroid/gki/gki_ulinux.c b/components/bt/bluedroid/gki/gki_ulinux.c old mode 100755 new mode 100644 index 058b9a23a..ed29f3bd1 --- a/components/bt/bluedroid/gki/gki_ulinux.c +++ b/components/bt/bluedroid/gki/gki_ulinux.c @@ -25,38 +25,44 @@ tGKI_CB gki_cb; -int gki_init(void) { - memset(&gki_cb, 0, sizeof(gki_cb)); +int gki_init(void) +{ + memset(&gki_cb, 0, sizeof(gki_cb)); - //pthread_mutexattr_t attr; - //pthread_mutexattr_init(&attr); - //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); - pthread_mutex_init(&gki_cb.lock, NULL);//&attr); + //pthread_mutexattr_t attr; + //pthread_mutexattr_init(&attr); + //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); + pthread_mutex_init(&gki_cb.lock, NULL);//&attr); - gki_buffer_init(); - return 0; + gki_buffer_init(); + return 0; } -void gki_clean_up(void) { - gki_buffer_cleanup(); +void gki_clean_up(void) +{ + gki_buffer_cleanup(); - pthread_mutex_destroy(&gki_cb.lock); + pthread_mutex_destroy(&gki_cb.lock); } -UINT32 GKI_get_os_tick_count(void) { - return osi_alarm_now(); +UINT32 GKI_get_os_tick_count(void) +{ + return osi_alarm_now(); } // Sleep the calling thread unconditionally for |timeout_ms| milliseconds. -void GKI_delay(UINT32 timeout_ms) { - osi_delay_ms(timeout_ms); - /*TODO:*/ +void GKI_delay(UINT32 timeout_ms) +{ + osi_delay_ms(timeout_ms); + /*TODO:*/ } -void GKI_enable(void) { - pthread_mutex_unlock(&gki_cb.lock); +void GKI_enable(void) +{ + pthread_mutex_unlock(&gki_cb.lock); } -void GKI_disable(void) { - pthread_mutex_lock(&gki_cb.lock); +void GKI_disable(void) +{ + pthread_mutex_lock(&gki_cb.lock); } diff --git a/components/bt/bluedroid/gki/include/gki.h b/components/bt/bluedroid/gki/include/gki.h old mode 100755 new mode 100644 index cbcb77151..9efd21199 --- a/components/bt/bluedroid/gki/include/gki.h +++ b/components/bt/bluedroid/gki/include/gki.h @@ -32,8 +32,7 @@ typedef void (TIMER_CBACK)(void *p_tle); #endif /* Define a timer list entry */ -typedef struct _tle -{ +typedef struct _tle { struct _tle *p_next; struct _tle *p_prev; TIMER_CBACK *p_cback; @@ -48,8 +47,7 @@ typedef struct _tle /*********************************************************************** ** This queue is a general purpose buffer queue, for application use. */ -typedef struct -{ +typedef struct { void *_p_first; void *_p_last; UINT16 _count; diff --git a/components/bt/bluedroid/gki/include/gki_common.h b/components/bt/bluedroid/gki/include/gki_common.h old mode 100755 new mode 100644 index 9416a1c69..838896eec --- a/components/bt/bluedroid/gki/include/gki_common.h +++ b/components/bt/bluedroid/gki/include/gki_common.h @@ -21,29 +21,26 @@ #include "gki.h" -typedef struct _buffer_hdr -{ - struct _buffer_hdr *p_next; /* next buffer in the queue */ - UINT8 q_id; /* id of the queue */ - UINT8 status; /* FREE, UNLINKED or QUEUED */ - UINT8 Type; - UINT16 size; +typedef struct _buffer_hdr { + struct _buffer_hdr *p_next; /* next buffer in the queue */ + UINT8 q_id; /* id of the queue */ + UINT8 status; /* FREE, UNLINKED or QUEUED */ + UINT8 Type; + UINT16 size; } BUFFER_HDR_T; -typedef struct _free_queue -{ - BUFFER_HDR_T *_p_first; /* first buffer in the queue */ - BUFFER_HDR_T *_p_last; /* last buffer in the queue */ - UINT16 size; /* size of the buffers in the pool */ - UINT16 total; /* toatal number of buffers */ - UINT16 cur_cnt; /* number of buffers currently allocated */ - UINT16 max_cnt; /* maximum number of buffers allocated at any time */ +typedef struct _free_queue { + BUFFER_HDR_T *_p_first; /* first buffer in the queue */ + BUFFER_HDR_T *_p_last; /* last buffer in the queue */ + UINT16 size; /* size of the buffers in the pool */ + UINT16 total; /* toatal number of buffers */ + UINT16 cur_cnt; /* number of buffers currently allocated */ + UINT16 max_cnt; /* maximum number of buffers allocated at any time */ } FREE_QUEUE_T; /* Put all GKI variables into one control block */ -typedef struct -{ +typedef struct { /* Define the buffer pool management variables */ FREE_QUEUE_T freeq[GKI_NUM_TOTAL_BUF_POOLS]; diff --git a/components/bt/bluedroid/gki/include/gki_int.h b/components/bt/bluedroid/gki/include/gki_int.h old mode 100755 new mode 100644 index 55768795d..3307066ef --- a/components/bt/bluedroid/gki/include/gki_int.h +++ b/components/bt/bluedroid/gki/include/gki_int.h @@ -24,8 +24,7 @@ #include "gki_common.h" -typedef struct -{ +typedef struct { pthread_mutex_t lock; tGKI_COM_CB com; } tGKI_CB; diff --git a/components/bt/bluedroid/hci/buffer_allocator.c b/components/bt/bluedroid/hci/buffer_allocator.c old mode 100755 new mode 100644 index e92101bcd..7cd51a9a0 --- a/components/bt/bluedroid/hci/buffer_allocator.c +++ b/components/bt/bluedroid/hci/buffer_allocator.c @@ -19,15 +19,17 @@ #include "gki.h" // TODO(zachoverflow): move the assertion into GKI_getbuf in the future -static void *buffer_alloc(size_t size) { - return GKI_getbuf((uint16_t)size); +static void *buffer_alloc(size_t size) +{ + return GKI_getbuf((uint16_t)size); } static const allocator_t interface = { - buffer_alloc, - GKI_freebuf + buffer_alloc, + GKI_freebuf }; -const allocator_t *buffer_allocator_get_interface() { - return &interface; +const allocator_t *buffer_allocator_get_interface() +{ + return &interface; } diff --git a/components/bt/bluedroid/hci/hci_hal_h4.c b/components/bt/bluedroid/hci/hci_hal_h4.c old mode 100755 new mode 100644 index 3f0e90915..0fe9aba69 --- a/components/bt/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/bluedroid/hci/hci_hal_h4.c @@ -34,23 +34,23 @@ static const uint8_t preamble_sizes[] = { - HCI_COMMAND_PREAMBLE_SIZE, - HCI_ACL_PREAMBLE_SIZE, - HCI_SCO_PREAMBLE_SIZE, - HCI_EVENT_PREAMBLE_SIZE + HCI_COMMAND_PREAMBLE_SIZE, + HCI_ACL_PREAMBLE_SIZE, + HCI_SCO_PREAMBLE_SIZE, + HCI_EVENT_PREAMBLE_SIZE }; static const uint16_t outbound_event_types[] = { - MSG_HC_TO_STACK_HCI_ERR, - MSG_HC_TO_STACK_HCI_ACL, - MSG_HC_TO_STACK_HCI_SCO, - MSG_HC_TO_STACK_HCI_EVT + MSG_HC_TO_STACK_HCI_ERR, + MSG_HC_TO_STACK_HCI_ACL, + MSG_HC_TO_STACK_HCI_SCO, + MSG_HC_TO_STACK_HCI_EVT }; typedef struct { - const allocator_t *allocator; - size_t buffer_size; - fixed_queue_t *rx_q; + const allocator_t *allocator; + size_t buffer_size; + fixed_queue_t *rx_q; } hci_hal_env_t; @@ -71,49 +71,52 @@ static void event_uart_has_bytes(fixed_queue_t *queue); static void hci_hal_env_init( size_t buffer_size, - size_t max_buffer_count) { - assert(buffer_size > 0); - assert(max_buffer_count > 0); + size_t max_buffer_count) +{ + assert(buffer_size > 0); + assert(max_buffer_count > 0); - hci_hal_env.allocator = buffer_allocator_get_interface(); - hci_hal_env.buffer_size = buffer_size; + hci_hal_env.allocator = buffer_allocator_get_interface(); + hci_hal_env.buffer_size = buffer_size; - hci_hal_env.rx_q = fixed_queue_new(max_buffer_count); - if (hci_hal_env.rx_q) - fixed_queue_register_dequeue(hci_hal_env.rx_q, event_uart_has_bytes); - else - LOG_ERROR("%s unable to create rx queue.\n", __func__); + hci_hal_env.rx_q = fixed_queue_new(max_buffer_count); + if (hci_hal_env.rx_q) { + fixed_queue_register_dequeue(hci_hal_env.rx_q, event_uart_has_bytes); + } else { + LOG_ERROR("%s unable to create rx queue.\n", __func__); + } - return; + return; } -static void hci_hal_env_deinit(void) { - fixed_queue_free(hci_hal_env.rx_q, hci_hal_env.allocator->free); +static void hci_hal_env_deinit(void) +{ + fixed_queue_free(hci_hal_env.rx_q, hci_hal_env.allocator->free); } static bool hal_open(const hci_hal_callbacks_t *upper_callbacks) { - assert(upper_callbacks != NULL); - callbacks = upper_callbacks; + assert(upper_callbacks != NULL); + callbacks = upper_callbacks; - hci_hal_env_init(HCI_HAL_SERIAL_BUFFER_SIZE, SIZE_MAX); - - xHciH4Queue = xQueueCreate(60, sizeof(BtTaskEvt_t)); - xTaskCreate(hci_hal_h4_rx_handler, "HciH4T", 2048+1024, NULL, configMAX_PRIORITIES - 3, &xHciH4TaskHandle); + hci_hal_env_init(HCI_HAL_SERIAL_BUFFER_SIZE, SIZE_MAX); - //register vhci host cb - API_vhci_host_register_callback(&vhci_host_cb); + xHciH4Queue = xQueueCreate(60, sizeof(BtTaskEvt_t)); + xTaskCreate(hci_hal_h4_rx_handler, "HciH4T", 2048 + 1024, NULL, configMAX_PRIORITIES - 3, &xHciH4TaskHandle); + //register vhci host cb + API_vhci_host_register_callback(&vhci_host_cb); - return true; + return true; } -static void hal_close() { - hci_hal_env_deinit(); - - /* delete task and queue */ - vTaskDelete(xHciH4TaskHandle); - vQueueDelete(xHciH4Queue); +static void hal_close() +{ + hci_hal_env_deinit(); + + /* delete task and queue */ + vTaskDelete(xHciH4TaskHandle); + vQueueDelete(xHciH4Queue); } /** @@ -125,31 +128,31 @@ static void hal_close() { static uint16_t transmit_data(serial_data_type_t type, uint8_t *data, uint16_t length) { - uint8_t previous_byte; + uint8_t previous_byte; - assert(data != NULL); - assert(length > 0); + assert(data != NULL); + assert(length > 0); - if (type < DATA_TYPE_COMMAND || type > DATA_TYPE_SCO) { - LOG_ERROR("%s invalid data type: %d", __func__, type); - return 0; - } + if (type < DATA_TYPE_COMMAND || type > DATA_TYPE_SCO) { + LOG_ERROR("%s invalid data type: %d", __func__, type); + return 0; + } - // Write the signal byte right before the data - --data; - previous_byte = *data; - *(data) = type; - ++length; + // Write the signal byte right before the data + --data; + previous_byte = *data; + *(data) = type; + ++length; - BTTRC_DUMP_BUFFER("Transmit Pkt", data, length); + BTTRC_DUMP_BUFFER("Transmit Pkt", data, length); - // TX Data to target - API_vhci_host_send_packet(data, length); + // TX Data to target + API_vhci_host_send_packet(data, length); - // Be nice and restore the old value of that byte - *(data) = previous_byte; + // Be nice and restore the old value of that byte + *(data) = previous_byte; - return length - 1; + return length - 1; } // Internal functions @@ -159,7 +162,7 @@ static void hci_hal_h4_rx_handler(void *arg) for (;;) { if (pdTRUE == xQueueReceive(xHciH4Queue, &e, (portTickType)portMAX_DELAY)) { - if (e.sig == 0xff) { + if (e.sig == 0xff) { fixed_queue_process(hci_hal_env.rx_q); } } @@ -173,111 +176,117 @@ void hci_hal_h4_task_post(void) evt.sig = 0xff; evt.par = 0; - if (xQueueSend(xHciH4Queue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { + if (xQueueSend(xHciH4Queue, &evt, 10 / portTICK_RATE_MS) != pdTRUE) { LOG_ERROR("xHciH4Queue failed\n"); } } -static void hci_hal_h4_hdl_rx_packet(BT_HDR *packet) { - uint8_t type, hdr_size; - uint16_t length; - uint8_t *stream = packet->data + packet->offset; +static void hci_hal_h4_hdl_rx_packet(BT_HDR *packet) +{ + uint8_t type, hdr_size; + uint16_t length; + uint8_t *stream = packet->data + packet->offset; - if (!packet) - return; - STREAM_TO_UINT8(type, stream); - packet->offset++; - packet->len--; - if (type == HCI_BLE_EVENT) { - uint8_t len; - STREAM_TO_UINT8(len, stream); - LOG_ERROR("Workround stream corrupted during LE SCAN: pkt_len=%d ble_event_len=%d", - packet->len, len); - hci_hal_env.allocator->free(packet); - return; - } - if (type < DATA_TYPE_ACL || type > DATA_TYPE_EVENT) { - LOG_ERROR("%d Unknown HCI message type. Dropping this byte 0x%x," - " min %x, max %x", __func__, type, - DATA_TYPE_ACL, DATA_TYPE_EVENT); - hci_hal_env.allocator->free(packet); - return; - } - hdr_size = preamble_sizes[type - 1]; - if (packet->len < hdr_size) { - LOG_ERROR("Wrong packet length type=%s pkt_len=%d hdr_len=%d", - type, packet->len, hdr_size); - hci_hal_env.allocator->free(packet); - return; - } - if (type == DATA_TYPE_ACL) { - stream += hdr_size - 2; - STREAM_TO_UINT16(length, stream); - } else { - stream += hdr_size - 1; - STREAM_TO_UINT8(length, stream); - } + if (!packet) { + return; + } + STREAM_TO_UINT8(type, stream); + packet->offset++; + packet->len--; + if (type == HCI_BLE_EVENT) { + uint8_t len; + STREAM_TO_UINT8(len, stream); + LOG_ERROR("Workround stream corrupted during LE SCAN: pkt_len=%d ble_event_len=%d\n", + packet->len, len); + hci_hal_env.allocator->free(packet); + return; + } + if (type < DATA_TYPE_ACL || type > DATA_TYPE_EVENT) { + LOG_ERROR("%s Unknown HCI message type. Dropping this byte 0x%x," + " min %x, max %x\n", __func__, type, + DATA_TYPE_ACL, DATA_TYPE_EVENT); + hci_hal_env.allocator->free(packet); + return; + } + hdr_size = preamble_sizes[type - 1]; + if (packet->len < hdr_size) { + LOG_ERROR("Wrong packet length type=%d pkt_len=%d hdr_len=%d", + type, packet->len, hdr_size); + hci_hal_env.allocator->free(packet); + return; + } + if (type == DATA_TYPE_ACL) { + stream += hdr_size - 2; + STREAM_TO_UINT16(length, stream); + } else { + stream += hdr_size - 1; + STREAM_TO_UINT8(length, stream); + } - if ((length + hdr_size) != packet->len) { - LOG_ERROR("Wrong packet length type=%d hdr_len=%d pd_len=%d " - "pkt_len=%d", type, hdr_size, length, packet->len); - hci_hal_env.allocator->free(packet); - return; - } + if ((length + hdr_size) != packet->len) { + LOG_ERROR("Wrong packet length type=%d hdr_len=%d pd_len=%d " + "pkt_len=%d", type, hdr_size, length, packet->len); + hci_hal_env.allocator->free(packet); + return; + } - packet->event = outbound_event_types[PACKET_TYPE_TO_INDEX(type)]; - callbacks->packet_ready(packet); + packet->event = outbound_event_types[PACKET_TYPE_TO_INDEX(type)]; + callbacks->packet_ready(packet); } -static void event_uart_has_bytes(fixed_queue_t *queue) { - BT_HDR *packet; - while (!fixed_queue_is_empty(queue)) { - packet = fixed_queue_dequeue(queue); - hci_hal_h4_hdl_rx_packet(packet); - } +static void event_uart_has_bytes(fixed_queue_t *queue) +{ + BT_HDR *packet; + while (!fixed_queue_is_empty(queue)) { + packet = fixed_queue_dequeue(queue); + hci_hal_h4_hdl_rx_packet(packet); + } } -static void host_send_pkt_available_cb(void) { - //Controller rx cache buffer is ready for receiving new host packet - //Just Call Host main thread task to process pending packets. - hci_host_task_post(); +static void host_send_pkt_available_cb(void) +{ + //Controller rx cache buffer is ready for receiving new host packet + //Just Call Host main thread task to process pending packets. + hci_host_task_post(); } -static int host_recv_pkt_cb(uint8_t *data, uint16_t len) { - //Target has packet to host, malloc new buffer for packet - BT_HDR *pkt; - size_t pkt_size; +static int host_recv_pkt_cb(uint8_t *data, uint16_t len) +{ + //Target has packet to host, malloc new buffer for packet + BT_HDR *pkt; + size_t pkt_size; - pkt_size = BT_HDR_SIZE + len; - pkt = (BT_HDR *)hci_hal_env.allocator->alloc(pkt_size); - if (!pkt) { - LOG_ERROR("%s couldn't aquire memory for inbound data buffer.", __func__); - return -1; - } - pkt->offset = 0; - pkt->len = len; - pkt->layer_specific = 0; - memcpy(pkt->data, data, len); - fixed_queue_enqueue(hci_hal_env.rx_q, pkt); - hci_hal_h4_task_post(); + pkt_size = BT_HDR_SIZE + len; + pkt = (BT_HDR *)hci_hal_env.allocator->alloc(pkt_size); + if (!pkt) { + LOG_ERROR("%s couldn't aquire memory for inbound data buffer.\n", __func__); + return -1; + } + pkt->offset = 0; + pkt->len = len; + pkt->layer_specific = 0; + memcpy(pkt->data, data, len); + fixed_queue_enqueue(hci_hal_env.rx_q, pkt); + hci_hal_h4_task_post(); - BTTRC_DUMP_BUFFER("Recv Pkt", pkt->data, len); + BTTRC_DUMP_BUFFER("Recv Pkt", pkt->data, len); - return 0; + return 0; } static const vhci_host_callback_t vhci_host_cb = { - .notify_host_send_available = host_send_pkt_available_cb, - .notify_host_recv = host_recv_pkt_cb, + .notify_host_send_available = host_send_pkt_available_cb, + .notify_host_recv = host_recv_pkt_cb, }; static const hci_hal_t interface = { - hal_open, - hal_close, - transmit_data, + hal_open, + hal_close, + transmit_data, }; -const hci_hal_t *hci_hal_h4_get_interface() { - return &interface; +const hci_hal_t *hci_hal_h4_get_interface() +{ + return &interface; } diff --git a/components/bt/bluedroid/hci/hci_layer.c b/components/bt/bluedroid/hci/hci_layer.c old mode 100755 new mode 100644 index 128a4f42e..c468039a9 --- a/components/bt/bluedroid/hci/hci_layer.c +++ b/components/bt/bluedroid/hci/hci_layer.c @@ -33,37 +33,37 @@ #include "thread.h" typedef struct { - uint16_t opcode; - future_t *complete_future; - command_complete_cb complete_callback; - command_status_cb status_callback; - void *context; - uint32_t sent_time; - BT_HDR *command; + uint16_t opcode; + future_t *complete_future; + command_complete_cb complete_callback; + command_status_cb status_callback; + void *context; + uint32_t sent_time; + BT_HDR *command; } waiting_command_t; typedef struct { - bool timer_is_set; - osi_alarm_t *command_response_timer; - list_t *commands_pending_response; - pthread_mutex_t commands_pending_response_lock; + bool timer_is_set; + osi_alarm_t *command_response_timer; + list_t *commands_pending_response; + pthread_mutex_t commands_pending_response_lock; } command_waiting_response_t; typedef struct { - int command_credits; - fixed_queue_t *command_queue; - fixed_queue_t *packet_queue; + int command_credits; + fixed_queue_t *command_queue; + fixed_queue_t *packet_queue; - // The hand-off point for data going to a higher layer, set by the higher layer - fixed_queue_t *upwards_data_queue; + // The hand-off point for data going to a higher layer, set by the higher layer + fixed_queue_t *upwards_data_queue; - command_waiting_response_t cmd_waiting_q; + command_waiting_response_t cmd_waiting_q; -/* - non_repeating_timer_t *command_response_timer; - list_t *commands_pending_response; - pthread_mutex_t commands_pending_response_lock; -*/ + /* + non_repeating_timer_t *command_response_timer; + list_t *commands_pending_response; + pthread_mutex_t commands_pending_response_lock; + */ } hci_host_env_t; // Using a define here, because it can be stringified for the property lookup @@ -97,8 +97,8 @@ static void sco_config_callback(bool success); static void event_command_ready(fixed_queue_t *queue); static void event_packet_ready(fixed_queue_t *queue); static void restart_comamnd_waiting_response_timer( - command_waiting_response_t *cmd_wait_q, - bool tigger_by_sending_command); + command_waiting_response_t *cmd_wait_q, + bool tigger_by_sending_command); static void command_timed_out(void *context); static void hal_says_packet_ready(BT_HDR *packet); static bool filter_incoming_event(BT_HDR *packet); @@ -107,33 +107,36 @@ static waiting_command_t *get_waiting_command(command_opcode_t opcode); static void dispatch_reassembled(BT_HDR *packet); // Module lifecycle functions -int hci_start_up(void) { - if (hci_layer_init_env()) - goto error; +int hci_start_up(void) +{ + if (hci_layer_init_env()) { + goto error; + } - xHciHostQueue = xQueueCreate(60, sizeof(BtTaskEvt_t)); - xTaskCreate(hci_host_thread_handler, "HciHostT", (1024+2048), NULL, configMAX_PRIORITIES - 3, &xHciHostTaskHandle); + xHciHostQueue = xQueueCreate(60, sizeof(BtTaskEvt_t)); + xTaskCreate(hci_host_thread_handler, "HciHostT", (2048 + 1024), NULL, configMAX_PRIORITIES - 3, &xHciHostTaskHandle); - packet_fragmenter->init(&packet_fragmenter_callbacks); - hal->open(&hal_callbacks); - - hci_host_startup_flag = true; - return 0; + packet_fragmenter->init(&packet_fragmenter_callbacks); + hal->open(&hal_callbacks); + + hci_host_startup_flag = true; + return 0; error: - hci_shut_down(); - return -1; + hci_shut_down(); + return -1; } -void hci_shut_down(void) { - hci_host_startup_flag = false; - hci_layer_deinit_env(); +void hci_shut_down(void) +{ + hci_host_startup_flag = false; + hci_layer_deinit_env(); - packet_fragmenter->cleanup(); + packet_fragmenter->cleanup(); - //low_power_manager->cleanup(); - hal->close(); - vTaskDelete(xHciHostTaskHandle); - vQueueDelete(xHciHostQueue); + //low_power_manager->cleanup(); + hal->close(); + vTaskDelete(xHciHostTaskHandle); + vQueueDelete(xHciHostQueue); } @@ -141,85 +144,88 @@ void hci_host_task_post(void) { BtTaskEvt_t evt; - if (hci_host_startup_flag == false) + if (hci_host_startup_flag == false) { return; + } evt.sig = 0xff; evt.par = 0; - if (xQueueSend(xHciHostQueue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { - LOG_ERROR("xHciHostQueue failed\n"); + if (xQueueSend(xHciHostQueue, &evt, 10 / portTICK_RATE_MS) != pdTRUE) { + LOG_ERROR("xHciHostQueue failed\n"); } } static int hci_layer_init_env(void) { - command_waiting_response_t *cmd_wait_q; + command_waiting_response_t *cmd_wait_q; - // The host is only allowed to send at most one command initially, - // as per the Bluetooth spec, Volume 2, Part E, 4.4 (Command Flow Control) - // This value can change when you get a command complete or command status event. - hci_host_env.command_credits = 1; - hci_host_env.command_queue = fixed_queue_new(SIZE_MAX); - if (hci_host_env.command_queue) - fixed_queue_register_dequeue(hci_host_env.command_queue, event_command_ready); - else { - LOG_ERROR("%s unable to create pending command queue.", __func__); - return -1; - } + // The host is only allowed to send at most one command initially, + // as per the Bluetooth spec, Volume 2, Part E, 4.4 (Command Flow Control) + // This value can change when you get a command complete or command status event. + hci_host_env.command_credits = 1; + hci_host_env.command_queue = fixed_queue_new(SIZE_MAX); + if (hci_host_env.command_queue) { + fixed_queue_register_dequeue(hci_host_env.command_queue, event_command_ready); + } else { + LOG_ERROR("%s unable to create pending command queue.", __func__); + return -1; + } - hci_host_env.packet_queue = fixed_queue_new(SIZE_MAX); - if (hci_host_env.packet_queue) - fixed_queue_register_dequeue(hci_host_env.packet_queue, event_packet_ready); - else { - LOG_ERROR("%s unable to create pending packet queue.", __func__); - return -1; - } + hci_host_env.packet_queue = fixed_queue_new(SIZE_MAX); + if (hci_host_env.packet_queue) { + fixed_queue_register_dequeue(hci_host_env.packet_queue, event_packet_ready); + } else { + LOG_ERROR("%s unable to create pending packet queue.", __func__); + return -1; + } - // Init Commands waiting response list and timer - cmd_wait_q = &hci_host_env.cmd_waiting_q; - cmd_wait_q->timer_is_set = false; - cmd_wait_q->commands_pending_response = list_new(NULL); - if (!cmd_wait_q->commands_pending_response) { - LOG_ERROR("%s unable to create list for commands pending response.", __func__); - return -1; - } - pthread_mutex_init(&cmd_wait_q->commands_pending_response_lock, NULL); - cmd_wait_q->command_response_timer = osi_alarm_new("cmd_rsp_to", command_timed_out, cmd_wait_q, COMMAND_PENDING_TIMEOUT, false); - if (!cmd_wait_q->command_response_timer) { - LOG_ERROR("%s unable to create command response timer.", __func__); - return -1; - } + // Init Commands waiting response list and timer + cmd_wait_q = &hci_host_env.cmd_waiting_q; + cmd_wait_q->timer_is_set = false; + cmd_wait_q->commands_pending_response = list_new(NULL); + if (!cmd_wait_q->commands_pending_response) { + LOG_ERROR("%s unable to create list for commands pending response.", __func__); + return -1; + } + pthread_mutex_init(&cmd_wait_q->commands_pending_response_lock, NULL); + cmd_wait_q->command_response_timer = osi_alarm_new("cmd_rsp_to", command_timed_out, cmd_wait_q, COMMAND_PENDING_TIMEOUT, false); + if (!cmd_wait_q->command_response_timer) { + LOG_ERROR("%s unable to create command response timer.", __func__); + return -1; + } - return 0; + return 0; } static void hci_layer_deinit_env(void) { - command_waiting_response_t *cmd_wait_q; + command_waiting_response_t *cmd_wait_q; - if (hci_host_env.command_queue) - fixed_queue_free(hci_host_env.command_queue, osi_free); - if (hci_host_env.packet_queue) - fixed_queue_free(hci_host_env.packet_queue, buffer_allocator->free); + if (hci_host_env.command_queue) { + fixed_queue_free(hci_host_env.command_queue, osi_free); + } + if (hci_host_env.packet_queue) { + fixed_queue_free(hci_host_env.packet_queue, buffer_allocator->free); + } - cmd_wait_q = &hci_host_env.cmd_waiting_q; - list_free(cmd_wait_q->commands_pending_response); - pthread_mutex_destroy(&cmd_wait_q->commands_pending_response_lock); - osi_alarm_free(cmd_wait_q->command_response_timer); - cmd_wait_q->command_response_timer = NULL; + cmd_wait_q = &hci_host_env.cmd_waiting_q; + list_free(cmd_wait_q->commands_pending_response); + pthread_mutex_destroy(&cmd_wait_q->commands_pending_response_lock); + osi_alarm_free(cmd_wait_q->command_response_timer); + cmd_wait_q->command_response_timer = NULL; } static void hci_host_thread_handler(void *arg) { - /* - * Previous task handles RX queue and two TX Queues, Since there is - * a RX Thread Task in H4 layer which receives packet from driver layer. - * Now HCI Host Task has been optimized to only process TX Queue - * including command and data queue. And command queue has high priority, - * All packets will be directly copied to single queue in driver layer with - * H4 type header added (1 byte). - */ + /* + * Previous task handles RX queue and two TX Queues, Since there is + * a RX Thread Task in H4 layer which receives packet from driver layer. + * Now HCI Host Task has been optimized to only process TX Queue + * including command and data queue. And command queue has high priority, + * All packets will be directly copied to single queue in driver layer with + * H4 type header added (1 byte). + */ BtTaskEvt_t e; @@ -233,10 +239,11 @@ static void hci_host_thread_handler(void *arg) packet_fragmenter->fragment_and_dispatch(pkt); } else { if (!fixed_queue_is_empty(hci_host_env.command_queue) && - hci_host_env.command_credits > 0) + hci_host_env.command_credits > 0) { fixed_queue_process(hci_host_env.command_queue); - else if (!fixed_queue_is_empty(hci_host_env.packet_queue)) + } else if (!fixed_queue_is_empty(hci_host_env.packet_queue)) { fixed_queue_process(hci_host_env.packet_queue); + } } } } @@ -244,348 +251,379 @@ static void hci_host_thread_handler(void *arg) } } -static void set_data_queue(fixed_queue_t *queue) { - hci_host_env.upwards_data_queue = queue; +static void set_data_queue(fixed_queue_t *queue) +{ + hci_host_env.upwards_data_queue = queue; } static void transmit_command( BT_HDR *command, command_complete_cb complete_callback, command_status_cb status_callback, - void *context) { - uint8_t *stream; - waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t)); - if (!wait_entry) { - LOG_ERROR("%s couldn't allocate space for wait entry.", __func__); - return; - } + void *context) +{ + uint8_t *stream; + waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t)); + if (!wait_entry) { + LOG_ERROR("%s couldn't allocate space for wait entry.", __func__); + return; + } - stream = command->data + command->offset; - STREAM_TO_UINT16(wait_entry->opcode, stream); - wait_entry->complete_callback = complete_callback; - wait_entry->status_callback = status_callback; - wait_entry->command = command; - wait_entry->context = context; + stream = command->data + command->offset; + STREAM_TO_UINT16(wait_entry->opcode, stream); + wait_entry->complete_callback = complete_callback; + wait_entry->status_callback = status_callback; + wait_entry->command = command; + wait_entry->context = context; - // Store the command message type in the event field - // in case the upper layer didn't already - command->event = MSG_STACK_TO_HC_HCI_CMD; - LOG_DEBUG("HCI Enqueue Comamnd opcode=0x%x\n", wait_entry->opcode); - BTTRC_DUMP_BUFFER(NULL, command->data + command->offset, command->len); + // Store the command message type in the event field + // in case the upper layer didn't already + command->event = MSG_STACK_TO_HC_HCI_CMD; + LOG_DEBUG("HCI Enqueue Comamnd opcode=0x%x\n", wait_entry->opcode); + BTTRC_DUMP_BUFFER(NULL, command->data + command->offset, command->len); - fixed_queue_enqueue(hci_host_env.command_queue, wait_entry); - hci_host_task_post(); + fixed_queue_enqueue(hci_host_env.command_queue, wait_entry); + hci_host_task_post(); } -static future_t *transmit_command_futured(BT_HDR *command) { - waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t)); - assert(wait_entry != NULL); +static future_t *transmit_command_futured(BT_HDR *command) +{ + waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t)); + assert(wait_entry != NULL); - future_t *future = future_new(); + future_t *future = future_new(); - uint8_t *stream = command->data + command->offset; - STREAM_TO_UINT16(wait_entry->opcode, stream); - wait_entry->complete_future = future; - wait_entry->command = command; + uint8_t *stream = command->data + command->offset; + STREAM_TO_UINT16(wait_entry->opcode, stream); + wait_entry->complete_future = future; + wait_entry->command = command; - // Store the command message type in the event field - // in case the upper layer didn't already - command->event = MSG_STACK_TO_HC_HCI_CMD; + // Store the command message type in the event field + // in case the upper layer didn't already + command->event = MSG_STACK_TO_HC_HCI_CMD; - fixed_queue_enqueue(hci_host_env.command_queue, wait_entry); - hci_host_task_post(); - return future; + fixed_queue_enqueue(hci_host_env.command_queue, wait_entry); + hci_host_task_post(); + return future; } -static void transmit_downward(uint16_t type, void *data) { - if (type == MSG_STACK_TO_HC_HCI_CMD) { - transmit_command((BT_HDR *)data, NULL, NULL, NULL); - LOG_WARN("%s legacy transmit of command. Use transmit_command instead.\n", __func__); - } else { - fixed_queue_enqueue(hci_host_env.packet_queue, data); - } - //ke_event_set(KE_EVENT_HCI_HOST_THREAD); - hci_host_task_post(); +static void transmit_downward(uint16_t type, void *data) +{ + if (type == MSG_STACK_TO_HC_HCI_CMD) { + transmit_command((BT_HDR *)data, NULL, NULL, NULL); + LOG_WARN("%s legacy transmit of command. Use transmit_command instead.\n", __func__); + } else { + fixed_queue_enqueue(hci_host_env.packet_queue, data); + } + //ke_event_set(KE_EVENT_HCI_HOST_THREAD); + hci_host_task_post(); } // Postload functions -static void event_postload(void) { - if (hci_send_async_command(BT_VND_OP_SCO_CFG, NULL) == -1) { - // If couldn't configure sco, we won't get the sco configuration callback - // so go pretend to do it now - sco_config_callback(false); +static void event_postload(void) +{ + if (hci_send_async_command(BT_VND_OP_SCO_CFG, NULL) == -1) { + // If couldn't configure sco, we won't get the sco configuration callback + // so go pretend to do it now + sco_config_callback(false); - } + } } -static void sco_config_callback(UNUSED_ATTR bool success) { - LOG_INFO("%s postload finished.", __func__); +static void sco_config_callback(UNUSED_ATTR bool success) +{ + LOG_INFO("%s postload finished.", __func__); } // Command/packet transmitting functions -static void event_command_ready(fixed_queue_t *queue) { - waiting_command_t *wait_entry = NULL; - command_waiting_response_t *cmd_wait_q = &hci_host_env.cmd_waiting_q; +static void event_command_ready(fixed_queue_t *queue) +{ + waiting_command_t *wait_entry = NULL; + command_waiting_response_t *cmd_wait_q = &hci_host_env.cmd_waiting_q; - wait_entry = fixed_queue_dequeue(queue); - hci_host_env.command_credits--; + wait_entry = fixed_queue_dequeue(queue); + hci_host_env.command_credits--; - // Move it to the list of commands awaiting response - pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); - list_append(cmd_wait_q->commands_pending_response, wait_entry); - pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); + // Move it to the list of commands awaiting response + pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); + list_append(cmd_wait_q->commands_pending_response, wait_entry); + pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); - // Send it off - packet_fragmenter->fragment_and_dispatch(wait_entry->command); + // Send it off + packet_fragmenter->fragment_and_dispatch(wait_entry->command); - wait_entry->sent_time = osi_alarm_now(); - restart_comamnd_waiting_response_timer(cmd_wait_q, true); + wait_entry->sent_time = osi_alarm_now(); + restart_comamnd_waiting_response_timer(cmd_wait_q, true); } -static void event_packet_ready(fixed_queue_t *queue) { - BT_HDR *packet = (BT_HDR *)fixed_queue_dequeue(queue); - // The queue may be the command queue or the packet queue, we don't care +static void event_packet_ready(fixed_queue_t *queue) +{ + BT_HDR *packet = (BT_HDR *)fixed_queue_dequeue(queue); + // The queue may be the command queue or the packet queue, we don't care - packet_fragmenter->fragment_and_dispatch(packet); + packet_fragmenter->fragment_and_dispatch(packet); } // Callback for the fragmenter to send a fragment -static void transmit_fragment(BT_HDR *packet, bool send_transmit_finished) { - uint16_t event = packet->event & MSG_EVT_MASK; - serial_data_type_t type = event_to_data_type(event); +static void transmit_fragment(BT_HDR *packet, bool send_transmit_finished) +{ + uint16_t event = packet->event & MSG_EVT_MASK; + serial_data_type_t type = event_to_data_type(event); - hal->transmit_data(type, packet->data + packet->offset, packet->len); + hal->transmit_data(type, packet->data + packet->offset, packet->len); - if (event != MSG_STACK_TO_HC_HCI_CMD && send_transmit_finished) - buffer_allocator->free(packet); + if (event != MSG_STACK_TO_HC_HCI_CMD && send_transmit_finished) { + buffer_allocator->free(packet); + } } -static void fragmenter_transmit_finished(BT_HDR *packet, bool all_fragments_sent) { - if (all_fragments_sent) { - buffer_allocator->free(packet); - } else { - // This is kind of a weird case, since we're dispatching a partially sent packet - // up to a higher layer. - // TODO(zachoverflow): rework upper layer so this isn't necessary. - dispatch_reassembled(packet); - //data_dispatcher_dispatch(interface.event_dispatcher, packet->event & MSG_EVT_MASK, packet); - } +static void fragmenter_transmit_finished(BT_HDR *packet, bool all_fragments_sent) +{ + if (all_fragments_sent) { + buffer_allocator->free(packet); + } else { + // This is kind of a weird case, since we're dispatching a partially sent packet + // up to a higher layer. + // TODO(zachoverflow): rework upper layer so this isn't necessary. + dispatch_reassembled(packet); + //data_dispatcher_dispatch(interface.event_dispatcher, packet->event & MSG_EVT_MASK, packet); + } } static void restart_comamnd_waiting_response_timer( - command_waiting_response_t *cmd_wait_q, - bool tigger_by_sending_command) + command_waiting_response_t *cmd_wait_q, + bool tigger_by_sending_command) { - uint32_t timeout; - waiting_command_t *wait_entry; - if (!cmd_wait_q) - return; + uint32_t timeout; + waiting_command_t *wait_entry; + if (!cmd_wait_q) { + return; + } - if (cmd_wait_q->timer_is_set) { - if (tigger_by_sending_command) - return; + if (cmd_wait_q->timer_is_set) { + if (tigger_by_sending_command) { + return; + } - //Cancel Previous command timeout timer setted when sending command - osi_alarm_cancel(cmd_wait_q->command_response_timer); - cmd_wait_q->timer_is_set = false; - } + //Cancel Previous command timeout timer setted when sending command + osi_alarm_cancel(cmd_wait_q->command_response_timer); + cmd_wait_q->timer_is_set = false; + } - pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); - wait_entry = (list_is_empty(cmd_wait_q->commands_pending_response) ? - NULL : list_front(cmd_wait_q->commands_pending_response)); - pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); + pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); + wait_entry = (list_is_empty(cmd_wait_q->commands_pending_response) ? + NULL : list_front(cmd_wait_q->commands_pending_response)); + pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); - if (wait_entry == NULL) - return; + if (wait_entry == NULL) { + return; + } - timeout =osi_alarm_time_diff(osi_alarm_now(), wait_entry->sent_time); - timeout =osi_alarm_time_diff(COMMAND_PENDING_TIMEOUT, timeout); - timeout = (timeout <= COMMAND_PENDING_TIMEOUT) ? timeout : COMMAND_PENDING_TIMEOUT; + timeout = osi_alarm_time_diff(osi_alarm_now(), wait_entry->sent_time); + timeout = osi_alarm_time_diff(COMMAND_PENDING_TIMEOUT, timeout); + timeout = (timeout <= COMMAND_PENDING_TIMEOUT) ? timeout : COMMAND_PENDING_TIMEOUT; - osi_alarm_set(cmd_wait_q->command_response_timer, timeout); - cmd_wait_q->timer_is_set = true; + osi_alarm_set(cmd_wait_q->command_response_timer, timeout); + cmd_wait_q->timer_is_set = true; } -static void command_timed_out(void *context) { - command_waiting_response_t *cmd_wait_q = (command_waiting_response_t *)context; - waiting_command_t *wait_entry; +static void command_timed_out(void *context) +{ + command_waiting_response_t *cmd_wait_q = (command_waiting_response_t *)context; + waiting_command_t *wait_entry; - pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); - wait_entry = (list_is_empty(cmd_wait_q->commands_pending_response) ? - NULL : list_front(cmd_wait_q->commands_pending_response)); - pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); + pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); + wait_entry = (list_is_empty(cmd_wait_q->commands_pending_response) ? + NULL : list_front(cmd_wait_q->commands_pending_response)); + pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); - if (wait_entry == NULL) - LOG_ERROR("%s with no commands pending response", __func__); - else - // We shouldn't try to recover the stack from this command timeout. - // If it's caused by a software bug, fix it. If it's a hardware bug, fix it. - LOG_ERROR("%s hci layer timeout waiting for response to a command. opcode: 0x%x", __func__, wait_entry->opcode); + if (wait_entry == NULL) { + LOG_ERROR("%s with no commands pending response", __func__); + } else + // We shouldn't try to recover the stack from this command timeout. + // If it's caused by a software bug, fix it. If it's a hardware bug, fix it. + { + LOG_ERROR("%s hci layer timeout waiting for response to a command. opcode: 0x%x", __func__, wait_entry->opcode); + } } // Event/packet receiving functions -static void hal_says_packet_ready(BT_HDR *packet) { - if (packet->event != MSG_HC_TO_STACK_HCI_EVT) { - packet_fragmenter->reassemble_and_dispatch(packet); - } else if (!filter_incoming_event(packet)) { - dispatch_reassembled(packet); - } +static void hal_says_packet_ready(BT_HDR *packet) +{ + if (packet->event != MSG_HC_TO_STACK_HCI_EVT) { + packet_fragmenter->reassemble_and_dispatch(packet); + } else if (!filter_incoming_event(packet)) { + dispatch_reassembled(packet); + } } // Returns true if the event was intercepted and should not proceed to // higher layers. Also inspects an incoming event for interesting // information, like how many commands are now able to be sent. -static bool filter_incoming_event(BT_HDR *packet) { - waiting_command_t *wait_entry = NULL; - uint8_t *stream = packet->data + packet->offset; - uint8_t event_code; - command_opcode_t opcode; +static bool filter_incoming_event(BT_HDR *packet) +{ + waiting_command_t *wait_entry = NULL; + uint8_t *stream = packet->data + packet->offset; + uint8_t event_code; + command_opcode_t opcode; - STREAM_TO_UINT8(event_code, stream); - STREAM_SKIP_UINT8(stream); // Skip the parameter total length field + STREAM_TO_UINT8(event_code, stream); + STREAM_SKIP_UINT8(stream); // Skip the parameter total length field - LOG_DEBUG("Receive packet event_code=0x%x\n", event_code); + LOG_DEBUG("Receive packet event_code=0x%x\n", event_code); - if (event_code == HCI_COMMAND_COMPLETE_EVT) { - STREAM_TO_UINT8(hci_host_env.command_credits, stream); - STREAM_TO_UINT16(opcode, stream); + if (event_code == HCI_COMMAND_COMPLETE_EVT) { + STREAM_TO_UINT8(hci_host_env.command_credits, stream); + STREAM_TO_UINT16(opcode, stream); - wait_entry = get_waiting_command(opcode); - if (!wait_entry) - LOG_WARN("%s command complete event with no matching command. opcode: 0x%x.", __func__, opcode); - else if (wait_entry->complete_callback) - wait_entry->complete_callback(packet, wait_entry->context); - else if (wait_entry->complete_future) - future_ready(wait_entry->complete_future, packet); + wait_entry = get_waiting_command(opcode); + if (!wait_entry) { + LOG_WARN("%s command complete event with no matching command. opcode: 0x%x.", __func__, opcode); + } else if (wait_entry->complete_callback) { + wait_entry->complete_callback(packet, wait_entry->context); + } else if (wait_entry->complete_future) { + future_ready(wait_entry->complete_future, packet); + } - goto intercepted; - } else if (event_code == HCI_COMMAND_STATUS_EVT) { - uint8_t status; - STREAM_TO_UINT8(status, stream); - STREAM_TO_UINT8(hci_host_env.command_credits, stream); - STREAM_TO_UINT16(opcode, stream); + goto intercepted; + } else if (event_code == HCI_COMMAND_STATUS_EVT) { + uint8_t status; + STREAM_TO_UINT8(status, stream); + STREAM_TO_UINT8(hci_host_env.command_credits, stream); + STREAM_TO_UINT16(opcode, stream); - // If a command generates a command status event, it won't be getting a command complete event + // If a command generates a command status event, it won't be getting a command complete event - wait_entry = get_waiting_command(opcode); - if (!wait_entry) - LOG_WARN("%s command status event with no matching command. opcode: 0x%x", __func__, opcode); - else if (wait_entry->status_callback) - wait_entry->status_callback(status, wait_entry->command, wait_entry->context); + wait_entry = get_waiting_command(opcode); + if (!wait_entry) { + LOG_WARN("%s command status event with no matching command. opcode: 0x%x", __func__, opcode); + } else if (wait_entry->status_callback) { + wait_entry->status_callback(status, wait_entry->command, wait_entry->context); + } - goto intercepted; - } + goto intercepted; + } - return false; + return false; intercepted: - /*Tell HCI Host Task to continue TX Pending commands*/ - if (hci_host_env.command_credits && - !fixed_queue_is_empty(hci_host_env.command_queue)) - hci_host_task_post(); + /*Tell HCI Host Task to continue TX Pending commands*/ + if (hci_host_env.command_credits && + !fixed_queue_is_empty(hci_host_env.command_queue)) { + hci_host_task_post(); + } //ke_event_set(KE_EVENT_HCI_HOST_THREAD); - restart_comamnd_waiting_response_timer(&hci_host_env.cmd_waiting_q, false); + restart_comamnd_waiting_response_timer(&hci_host_env.cmd_waiting_q, false); - if (wait_entry) { - // If it has a callback, it's responsible for freeing the packet - if (event_code == HCI_COMMAND_STATUS_EVT || - (!wait_entry->complete_callback && !wait_entry->complete_future)) - buffer_allocator->free(packet); + if (wait_entry) { + // If it has a callback, it's responsible for freeing the packet + if (event_code == HCI_COMMAND_STATUS_EVT || + (!wait_entry->complete_callback && !wait_entry->complete_future)) { + buffer_allocator->free(packet); + } - // If it has a callback, it's responsible for freeing the command - if (event_code == HCI_COMMAND_COMPLETE_EVT || !wait_entry->status_callback) - buffer_allocator->free(wait_entry->command); + // If it has a callback, it's responsible for freeing the command + if (event_code == HCI_COMMAND_COMPLETE_EVT || !wait_entry->status_callback) { + buffer_allocator->free(wait_entry->command); + } - osi_free(wait_entry); - } else { - buffer_allocator->free(packet); - } + osi_free(wait_entry); + } else { + buffer_allocator->free(packet); + } - return true; + return true; } // Callback for the fragmenter to dispatch up a completely reassembled packet -static void dispatch_reassembled(BT_HDR *packet) { - // Events should already have been dispatched before this point +static void dispatch_reassembled(BT_HDR *packet) +{ + // Events should already have been dispatched before this point - if (hci_host_env.upwards_data_queue) { - fixed_queue_enqueue(hci_host_env.upwards_data_queue, packet); - btu_task_post(SIG_BTU_WORK); - //Tell Up-layer received packet. - } else { - LOG_DEBUG("%s had no queue to place upwards data packet in. Dropping it on the floor.", __func__); - buffer_allocator->free(packet); - } + if (hci_host_env.upwards_data_queue) { + fixed_queue_enqueue(hci_host_env.upwards_data_queue, packet); + btu_task_post(SIG_BTU_WORK); + //Tell Up-layer received packet. + } else { + LOG_DEBUG("%s had no queue to place upwards data packet in. Dropping it on the floor.", __func__); + buffer_allocator->free(packet); + } } // Misc internal functions // TODO(zachoverflow): we seem to do this a couple places, like the HCI inject module. #centralize -static serial_data_type_t event_to_data_type(uint16_t event) { - if (event == MSG_STACK_TO_HC_HCI_ACL) - return DATA_TYPE_ACL; - else if (event == MSG_STACK_TO_HC_HCI_SCO) - return DATA_TYPE_SCO; - else if (event == MSG_STACK_TO_HC_HCI_CMD) - return DATA_TYPE_COMMAND; - else - LOG_ERROR("%s invalid event type, could not translate 0x%x", __func__, event); +static serial_data_type_t event_to_data_type(uint16_t event) +{ + if (event == MSG_STACK_TO_HC_HCI_ACL) { + return DATA_TYPE_ACL; + } else if (event == MSG_STACK_TO_HC_HCI_SCO) { + return DATA_TYPE_SCO; + } else if (event == MSG_STACK_TO_HC_HCI_CMD) { + return DATA_TYPE_COMMAND; + } else { + LOG_ERROR("%s invalid event type, could not translate 0x%x\n", __func__, event); + } - return 0; + return 0; } -static waiting_command_t *get_waiting_command(command_opcode_t opcode) { - command_waiting_response_t *cmd_wait_q = &hci_host_env.cmd_waiting_q; - pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); +static waiting_command_t *get_waiting_command(command_opcode_t opcode) +{ + command_waiting_response_t *cmd_wait_q = &hci_host_env.cmd_waiting_q; + pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); - for (const list_node_t *node = list_begin(cmd_wait_q->commands_pending_response); - node != list_end(cmd_wait_q->commands_pending_response); - node = list_next(node)) { - waiting_command_t *wait_entry = list_node(node); - if (!wait_entry || wait_entry->opcode != opcode) - continue; + for (const list_node_t *node = list_begin(cmd_wait_q->commands_pending_response); + node != list_end(cmd_wait_q->commands_pending_response); + node = list_next(node)) { + waiting_command_t *wait_entry = list_node(node); + if (!wait_entry || wait_entry->opcode != opcode) { + continue; + } - list_remove(cmd_wait_q->commands_pending_response, wait_entry); + list_remove(cmd_wait_q->commands_pending_response, wait_entry); + + pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); + return wait_entry; + } pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); - return wait_entry; - } - - pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); - return NULL; + return NULL; } static int hci_send_async_command(bt_vendor_opcode_t opcode, void *param) { } -static void init_layer_interface() { - if (!interface_created) { - interface.set_data_queue = set_data_queue; - interface.transmit_command = transmit_command; - interface.transmit_command_futured = transmit_command_futured; - interface.transmit_downward = transmit_downward; - interface_created = true; - } +static void init_layer_interface() +{ + if (!interface_created) { + interface.set_data_queue = set_data_queue; + interface.transmit_command = transmit_command; + interface.transmit_command_futured = transmit_command_futured; + interface.transmit_downward = transmit_downward; + interface_created = true; + } } static const hci_hal_callbacks_t hal_callbacks = { - hal_says_packet_ready + hal_says_packet_ready }; static const packet_fragmenter_callbacks_t packet_fragmenter_callbacks = { - transmit_fragment, - dispatch_reassembled, - fragmenter_transmit_finished + transmit_fragment, + dispatch_reassembled, + fragmenter_transmit_finished }; -const hci_t *hci_layer_get_interface() { - buffer_allocator = buffer_allocator_get_interface(); - hal = hci_hal_h4_get_interface(); - packet_fragmenter = packet_fragmenter_get_interface(); +const hci_t *hci_layer_get_interface() +{ + buffer_allocator = buffer_allocator_get_interface(); + hal = hci_hal_h4_get_interface(); + packet_fragmenter = packet_fragmenter_get_interface(); - init_layer_interface(); - return &interface; + init_layer_interface(); + return &interface; } diff --git a/components/bt/bluedroid/hci/hci_packet_factory.c b/components/bt/bluedroid/hci/hci_packet_factory.c old mode 100755 new mode 100644 index ba1e35ce3..6d5592b75 --- a/components/bt/bluedroid/hci/hci_packet_factory.c +++ b/components/bt/bluedroid/hci/hci_packet_factory.c @@ -35,168 +35,191 @@ static BT_HDR *make_command(uint16_t opcode, size_t parameter_size, uint8_t **st // Interface functions -static BT_HDR *make_reset(void) { - return make_command_no_params(HCI_RESET); +static BT_HDR *make_reset(void) +{ + return make_command_no_params(HCI_RESET); } -static BT_HDR *make_read_buffer_size(void) { - return make_command_no_params(HCI_READ_BUFFER_SIZE); +static BT_HDR *make_read_buffer_size(void) +{ + return make_command_no_params(HCI_READ_BUFFER_SIZE); } -static BT_HDR *make_host_buffer_size(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count) { - uint8_t *stream; - const uint8_t parameter_size = 2 + 1 + 2 + 2; // from each of the parameters - BT_HDR *packet = make_command(HCI_HOST_BUFFER_SIZE, parameter_size, &stream); +static BT_HDR *make_host_buffer_size(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count) +{ + uint8_t *stream; + const uint8_t parameter_size = 2 + 1 + 2 + 2; // from each of the parameters + BT_HDR *packet = make_command(HCI_HOST_BUFFER_SIZE, parameter_size, &stream); - UINT16_TO_STREAM(stream, acl_size); - UINT8_TO_STREAM(stream, sco_size); - UINT16_TO_STREAM(stream, acl_count); - UINT16_TO_STREAM(stream, sco_count); - return packet; + UINT16_TO_STREAM(stream, acl_size); + UINT8_TO_STREAM(stream, sco_size); + UINT16_TO_STREAM(stream, acl_count); + UINT16_TO_STREAM(stream, sco_count); + return packet; } -static BT_HDR *make_read_local_version_info(void) { - return make_command_no_params(HCI_READ_LOCAL_VERSION_INFO); +static BT_HDR *make_read_local_version_info(void) +{ + return make_command_no_params(HCI_READ_LOCAL_VERSION_INFO); } -static BT_HDR *make_read_bd_addr(void) { - return make_command_no_params(HCI_READ_BD_ADDR); +static BT_HDR *make_read_bd_addr(void) +{ + return make_command_no_params(HCI_READ_BD_ADDR); } -static BT_HDR *make_read_local_supported_commands(void) { - return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CMDS); +static BT_HDR *make_read_local_supported_commands(void) +{ + return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CMDS); } -static BT_HDR *make_read_local_extended_features(uint8_t page_number) { - uint8_t *stream; - const uint8_t parameter_size = 1; - BT_HDR *packet = make_command(HCI_READ_LOCAL_EXT_FEATURES, parameter_size, &stream); +static BT_HDR *make_read_local_extended_features(uint8_t page_number) +{ + uint8_t *stream; + const uint8_t parameter_size = 1; + BT_HDR *packet = make_command(HCI_READ_LOCAL_EXT_FEATURES, parameter_size, &stream); - UINT8_TO_STREAM(stream, page_number); - return packet; + UINT8_TO_STREAM(stream, page_number); + return packet; } -static BT_HDR *make_write_simple_pairing_mode(uint8_t mode) { - uint8_t *stream; - const uint8_t parameter_size = 1; - BT_HDR *packet = make_command(HCI_WRITE_SIMPLE_PAIRING_MODE, parameter_size, &stream); +static BT_HDR *make_write_simple_pairing_mode(uint8_t mode) +{ + uint8_t *stream; + const uint8_t parameter_size = 1; + BT_HDR *packet = make_command(HCI_WRITE_SIMPLE_PAIRING_MODE, parameter_size, &stream); - UINT8_TO_STREAM(stream, mode); - return packet; + UINT8_TO_STREAM(stream, mode); + return packet; } -static BT_HDR *make_write_secure_connections_host_support(uint8_t mode) { - uint8_t *stream; - const uint8_t parameter_size = 1; - BT_HDR *packet = make_command(HCI_WRITE_SECURE_CONNS_SUPPORT, parameter_size, &stream); +static BT_HDR *make_write_secure_connections_host_support(uint8_t mode) +{ + uint8_t *stream; + const uint8_t parameter_size = 1; + BT_HDR *packet = make_command(HCI_WRITE_SECURE_CONNS_SUPPORT, parameter_size, &stream); - UINT8_TO_STREAM(stream, mode); - return packet; + UINT8_TO_STREAM(stream, mode); + return packet; } -static BT_HDR *make_set_event_mask(const bt_event_mask_t *event_mask) { - uint8_t *stream; - uint8_t parameter_size = sizeof(bt_event_mask_t); - BT_HDR *packet = make_command(HCI_SET_EVENT_MASK, parameter_size, &stream); +static BT_HDR *make_set_event_mask(const bt_event_mask_t *event_mask) +{ + uint8_t *stream; + uint8_t parameter_size = sizeof(bt_event_mask_t); + BT_HDR *packet = make_command(HCI_SET_EVENT_MASK, parameter_size, &stream); - ARRAY8_TO_STREAM(stream, event_mask->as_array); - return packet; + ARRAY8_TO_STREAM(stream, event_mask->as_array); + return packet; } -static BT_HDR *make_ble_write_host_support(uint8_t supported_host, uint8_t simultaneous_host) { - uint8_t *stream; - const uint8_t parameter_size = 1 + 1; - BT_HDR *packet = make_command(HCI_WRITE_LE_HOST_SUPPORT, parameter_size, &stream); +static BT_HDR *make_ble_write_host_support(uint8_t supported_host, uint8_t simultaneous_host) +{ + uint8_t *stream; + const uint8_t parameter_size = 1 + 1; + BT_HDR *packet = make_command(HCI_WRITE_LE_HOST_SUPPORT, parameter_size, &stream); - UINT8_TO_STREAM(stream, supported_host); - UINT8_TO_STREAM(stream, simultaneous_host); - return packet; + UINT8_TO_STREAM(stream, supported_host); + UINT8_TO_STREAM(stream, simultaneous_host); + return packet; } -static BT_HDR *make_ble_read_white_list_size(void) { - return make_command_no_params(HCI_BLE_READ_WHITE_LIST_SIZE); +static BT_HDR *make_ble_read_white_list_size(void) +{ + return make_command_no_params(HCI_BLE_READ_WHITE_LIST_SIZE); } -static BT_HDR *make_ble_read_buffer_size(void) { - return make_command_no_params(HCI_BLE_READ_BUFFER_SIZE); +static BT_HDR *make_ble_read_buffer_size(void) +{ + return make_command_no_params(HCI_BLE_READ_BUFFER_SIZE); } -static BT_HDR *make_ble_read_supported_states(void) { - return make_command_no_params(HCI_BLE_READ_SUPPORTED_STATES); +static BT_HDR *make_ble_read_supported_states(void) +{ + return make_command_no_params(HCI_BLE_READ_SUPPORTED_STATES); } -static BT_HDR *make_ble_read_local_supported_features(void) { - return make_command_no_params(HCI_BLE_READ_LOCAL_SPT_FEAT); +static BT_HDR *make_ble_read_local_supported_features(void) +{ + return make_command_no_params(HCI_BLE_READ_LOCAL_SPT_FEAT); } -static BT_HDR *make_ble_read_resolving_list_size(void) { - return make_command_no_params(HCI_BLE_READ_RESOLVING_LIST_SIZE); +static BT_HDR *make_ble_read_resolving_list_size(void) +{ + return make_command_no_params(HCI_BLE_READ_RESOLVING_LIST_SIZE); } -static BT_HDR *make_ble_read_suggested_default_data_length(void) { +static BT_HDR *make_ble_read_suggested_default_data_length(void) +{ return make_command_no_params(HCI_BLE_READ_DEFAULT_DATA_LENGTH); } -static BT_HDR *make_ble_set_event_mask(const bt_event_mask_t *event_mask) { - uint8_t *stream; - uint8_t parameter_size = sizeof(bt_event_mask_t); - BT_HDR *packet = make_command(HCI_BLE_SET_EVENT_MASK, parameter_size, &stream); +static BT_HDR *make_ble_set_event_mask(const bt_event_mask_t *event_mask) +{ + uint8_t *stream; + uint8_t parameter_size = sizeof(bt_event_mask_t); + BT_HDR *packet = make_command(HCI_BLE_SET_EVENT_MASK, parameter_size, &stream); - ARRAY8_TO_STREAM(stream, event_mask->as_array); - return packet; + ARRAY8_TO_STREAM(stream, event_mask->as_array); + return packet; } // Internal functions -static BT_HDR *make_command_no_params(uint16_t opcode) { - return make_command(opcode, 0, NULL); +static BT_HDR *make_command_no_params(uint16_t opcode) +{ + return make_command(opcode, 0, NULL); } -static BT_HDR *make_command(uint16_t opcode, size_t parameter_size, uint8_t **stream_out) { - BT_HDR *packet = make_packet(HCI_COMMAND_PREAMBLE_SIZE + parameter_size); +static BT_HDR *make_command(uint16_t opcode, size_t parameter_size, uint8_t **stream_out) +{ + BT_HDR *packet = make_packet(HCI_COMMAND_PREAMBLE_SIZE + parameter_size); - uint8_t *stream = packet->data; - UINT16_TO_STREAM(stream, opcode); - UINT8_TO_STREAM(stream, parameter_size); + uint8_t *stream = packet->data; + UINT16_TO_STREAM(stream, opcode); + UINT8_TO_STREAM(stream, parameter_size); - if (stream_out != NULL) - *stream_out = stream; + if (stream_out != NULL) { + *stream_out = stream; + } - return packet; + return packet; } -static BT_HDR *make_packet(size_t data_size) { - BT_HDR *ret = (BT_HDR *)buffer_allocator->alloc(sizeof(BT_HDR) + data_size); - assert(ret); - ret->event = 0; - ret->offset = 0; - ret->layer_specific = 0; - ret->len = data_size; - return ret; +static BT_HDR *make_packet(size_t data_size) +{ + BT_HDR *ret = (BT_HDR *)buffer_allocator->alloc(sizeof(BT_HDR) + data_size); + assert(ret); + ret->event = 0; + ret->offset = 0; + ret->layer_specific = 0; + ret->len = data_size; + return ret; } static const hci_packet_factory_t interface = { - make_reset, - make_read_buffer_size, - make_host_buffer_size, - make_read_local_version_info, - make_read_bd_addr, - make_read_local_supported_commands, - make_read_local_extended_features, - make_write_simple_pairing_mode, - make_write_secure_connections_host_support, - make_set_event_mask, - make_ble_write_host_support, - make_ble_read_white_list_size, - make_ble_read_buffer_size, - make_ble_read_supported_states, - make_ble_read_local_supported_features, - make_ble_read_resolving_list_size, - make_ble_read_suggested_default_data_length, - make_ble_set_event_mask + make_reset, + make_read_buffer_size, + make_host_buffer_size, + make_read_local_version_info, + make_read_bd_addr, + make_read_local_supported_commands, + make_read_local_extended_features, + make_write_simple_pairing_mode, + make_write_secure_connections_host_support, + make_set_event_mask, + make_ble_write_host_support, + make_ble_read_white_list_size, + make_ble_read_buffer_size, + make_ble_read_supported_states, + make_ble_read_local_supported_features, + make_ble_read_resolving_list_size, + make_ble_read_suggested_default_data_length, + make_ble_set_event_mask }; -const hci_packet_factory_t *hci_packet_factory_get_interface() { - buffer_allocator = buffer_allocator_get_interface(); - return &interface; +const hci_packet_factory_t *hci_packet_factory_get_interface() +{ + buffer_allocator = buffer_allocator_get_interface(); + return &interface; } diff --git a/components/bt/bluedroid/hci/hci_packet_parser.c b/components/bt/bluedroid/hci/hci_packet_parser.c old mode 100755 new mode 100644 index 9f9d68fab..b0e5e4b43 --- a/components/bt/bluedroid/hci/hci_packet_parser.c +++ b/components/bt/bluedroid/hci/hci_packet_parser.c @@ -29,66 +29,71 @@ static const command_opcode_t NO_OPCODE_CHECKING = 0; static const allocator_t *buffer_allocator; static uint8_t *read_command_complete_header( - BT_HDR *response, - command_opcode_t expected_opcode, - size_t minimum_bytes_after); + BT_HDR *response, + command_opcode_t expected_opcode, + size_t minimum_bytes_after); -static void parse_generic_command_complete(BT_HDR *response) { - read_command_complete_header(response, NO_OPCODE_CHECKING, 0 /* bytes after */); +static void parse_generic_command_complete(BT_HDR *response) +{ + read_command_complete_header(response, NO_OPCODE_CHECKING, 0 /* bytes after */); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_read_buffer_size_response( BT_HDR *response, uint16_t *data_size_ptr, - uint16_t *acl_buffer_count_ptr) { + uint16_t *acl_buffer_count_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_READ_BUFFER_SIZE, 5 /* bytes after */); - assert(stream != NULL); - STREAM_TO_UINT16(*data_size_ptr, stream); - STREAM_SKIP_UINT8(stream); // skip the sco packet length - STREAM_TO_UINT16(*acl_buffer_count_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_READ_BUFFER_SIZE, 5 /* bytes after */); + assert(stream != NULL); + STREAM_TO_UINT16(*data_size_ptr, stream); + STREAM_SKIP_UINT8(stream); // skip the sco packet length + STREAM_TO_UINT16(*acl_buffer_count_ptr, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_read_local_version_info_response( BT_HDR *response, - bt_version_t *bt_version) { + bt_version_t *bt_version) +{ - uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_VERSION_INFO, 8 /* bytes after */); - assert(stream != NULL); - STREAM_TO_UINT8(bt_version->hci_version, stream); - STREAM_TO_UINT16(bt_version->hci_revision, stream); - STREAM_TO_UINT8(bt_version->lmp_version, stream); - STREAM_TO_UINT16(bt_version->manufacturer, stream); - STREAM_TO_UINT16(bt_version->lmp_subversion, stream); + uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_VERSION_INFO, 8 /* bytes after */); + assert(stream != NULL); + STREAM_TO_UINT8(bt_version->hci_version, stream); + STREAM_TO_UINT16(bt_version->hci_revision, stream); + STREAM_TO_UINT8(bt_version->lmp_version, stream); + STREAM_TO_UINT16(bt_version->manufacturer, stream); + STREAM_TO_UINT16(bt_version->lmp_subversion, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_read_bd_addr_response( BT_HDR *response, - bt_bdaddr_t *address_ptr) { + bt_bdaddr_t *address_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_READ_BD_ADDR, sizeof(bt_bdaddr_t) /* bytes after */); - assert(stream != NULL); - STREAM_TO_BDADDR(address_ptr->address, stream); + uint8_t *stream = read_command_complete_header(response, HCI_READ_BD_ADDR, sizeof(bt_bdaddr_t) /* bytes after */); + assert(stream != NULL); + STREAM_TO_BDADDR(address_ptr->address, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_read_local_supported_commands_response( BT_HDR *response, uint8_t *supported_commands_ptr, - size_t supported_commands_length) { + size_t supported_commands_length) +{ - uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_SUPPORTED_CMDS, supported_commands_length /* bytes after */); - assert(stream != NULL); - STREAM_TO_ARRAY(supported_commands_ptr, stream, (int)supported_commands_length); + uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_SUPPORTED_CMDS, supported_commands_length /* bytes after */); + assert(stream != NULL); + STREAM_TO_ARRAY(supported_commands_ptr, stream, (int)supported_commands_length); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_read_local_extended_features_response( @@ -96,88 +101,95 @@ static void parse_read_local_extended_features_response( uint8_t *page_number_ptr, uint8_t *max_page_number_ptr, bt_device_features_t *feature_pages, - size_t feature_pages_count) { + size_t feature_pages_count) +{ - uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_EXT_FEATURES, 2 + sizeof(bt_device_features_t) /* bytes after */); - if (stream != NULL) { - STREAM_TO_UINT8(*page_number_ptr, stream); - STREAM_TO_UINT8(*max_page_number_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_EXT_FEATURES, 2 + sizeof(bt_device_features_t) /* bytes after */); + if (stream != NULL) { + STREAM_TO_UINT8(*page_number_ptr, stream); + STREAM_TO_UINT8(*max_page_number_ptr, stream); - assert(*page_number_ptr < feature_pages_count); - STREAM_TO_ARRAY(feature_pages[*page_number_ptr].as_array, stream, (int)sizeof(bt_device_features_t)); - } else { - LOG_ERROR("%s() - WARNING: READING EXTENDED FEATURES FAILED. " - "THIS MAY INDICATE A FIRMWARE/CONTROLLER ISSUE.", __func__); - } + assert(*page_number_ptr < feature_pages_count); + STREAM_TO_ARRAY(feature_pages[*page_number_ptr].as_array, stream, (int)sizeof(bt_device_features_t)); + } else { + LOG_ERROR("%s() - WARNING: READING EXTENDED FEATURES FAILED. " + "THIS MAY INDICATE A FIRMWARE/CONTROLLER ISSUE.", __func__); + } - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_white_list_size_response( BT_HDR *response, - uint8_t *white_list_size_ptr) { + uint8_t *white_list_size_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_WHITE_LIST_SIZE, 1 /* byte after */); - assert(stream != NULL); - STREAM_TO_UINT8(*white_list_size_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_WHITE_LIST_SIZE, 1 /* byte after */); + assert(stream != NULL); + STREAM_TO_UINT8(*white_list_size_ptr, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_buffer_size_response( BT_HDR *response, uint16_t *data_size_ptr, - uint8_t *acl_buffer_count_ptr) { + uint8_t *acl_buffer_count_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_BUFFER_SIZE, 3 /* bytes after */); - assert(stream != NULL); - STREAM_TO_UINT16(*data_size_ptr, stream); - STREAM_TO_UINT8(*acl_buffer_count_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_BUFFER_SIZE, 3 /* bytes after */); + assert(stream != NULL); + STREAM_TO_UINT16(*data_size_ptr, stream); + STREAM_TO_UINT8(*acl_buffer_count_ptr, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_supported_states_response( BT_HDR *response, uint8_t *supported_states, - size_t supported_states_size) { + size_t supported_states_size) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_SUPPORTED_STATES, supported_states_size /* bytes after */); - assert(stream != NULL); - STREAM_TO_ARRAY(supported_states, stream, (int)supported_states_size); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_SUPPORTED_STATES, supported_states_size /* bytes after */); + assert(stream != NULL); + STREAM_TO_ARRAY(supported_states, stream, (int)supported_states_size); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_local_supported_features_response( BT_HDR *response, - bt_device_features_t *supported_features) { + bt_device_features_t *supported_features) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_LOCAL_SPT_FEAT, sizeof(bt_device_features_t) /* bytes after */); - assert(stream != NULL); - STREAM_TO_ARRAY(supported_features->as_array, stream, (int)sizeof(bt_device_features_t)); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_LOCAL_SPT_FEAT, sizeof(bt_device_features_t) /* bytes after */); + assert(stream != NULL); + STREAM_TO_ARRAY(supported_features->as_array, stream, (int)sizeof(bt_device_features_t)); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_resolving_list_size_response( BT_HDR *response, - uint8_t *resolving_list_size_ptr) { + uint8_t *resolving_list_size_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_RESOLVING_LIST_SIZE, 1 /* bytes after */); - STREAM_TO_UINT8(*resolving_list_size_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_RESOLVING_LIST_SIZE, 1 /* bytes after */); + STREAM_TO_UINT8(*resolving_list_size_ptr, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } static void parse_ble_read_suggested_default_data_length_response( BT_HDR *response, - uint16_t *ble_default_packet_length_ptr) { + uint16_t *ble_default_packet_length_ptr) +{ - uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */); - STREAM_TO_UINT8(*ble_default_packet_length_ptr, stream); + uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */); + STREAM_TO_UINT8(*ble_default_packet_length_ptr, stream); - buffer_allocator->free(response); + buffer_allocator->free(response); } // Internal functions @@ -185,59 +197,62 @@ static void parse_ble_read_suggested_default_data_length_response( static uint8_t *read_command_complete_header( BT_HDR *response, command_opcode_t expected_opcode, - size_t minimum_bytes_after) { + size_t minimum_bytes_after) +{ - uint8_t *stream = response->data + response->offset; + uint8_t *stream = response->data + response->offset; - // Read the event header - uint8_t event_code; - uint8_t parameter_length; - STREAM_TO_UINT8(event_code, stream); - STREAM_TO_UINT8(parameter_length, stream); + // Read the event header + uint8_t event_code; + uint8_t parameter_length; + STREAM_TO_UINT8(event_code, stream); + STREAM_TO_UINT8(parameter_length, stream); - const size_t parameter_bytes_we_read_here = 4; + const size_t parameter_bytes_we_read_here = 4; - // Check the event header values against what we expect - assert(event_code == HCI_COMMAND_COMPLETE_EVT); - assert(parameter_length >= (parameter_bytes_we_read_here + minimum_bytes_after)); + // Check the event header values against what we expect + assert(event_code == HCI_COMMAND_COMPLETE_EVT); + assert(parameter_length >= (parameter_bytes_we_read_here + minimum_bytes_after)); - // Read the command complete header - command_opcode_t opcode; - uint8_t status; - STREAM_SKIP_UINT8(stream); // skip the number of hci command packets field - STREAM_TO_UINT16(opcode, stream); + // Read the command complete header + command_opcode_t opcode; + uint8_t status; + STREAM_SKIP_UINT8(stream); // skip the number of hci command packets field + STREAM_TO_UINT16(opcode, stream); - // Check the command complete header values against what we expect - if (expected_opcode != NO_OPCODE_CHECKING) { - assert(opcode == expected_opcode); - } + // Check the command complete header values against what we expect + if (expected_opcode != NO_OPCODE_CHECKING) { + assert(opcode == expected_opcode); + } - // Assume the next field is the status field - STREAM_TO_UINT8(status, stream); + // Assume the next field is the status field + STREAM_TO_UINT8(status, stream); - if (status != HCI_SUCCESS) - return NULL; + if (status != HCI_SUCCESS) { + return NULL; + } - return stream; + return stream; } static const hci_packet_parser_t interface = { - parse_generic_command_complete, - parse_read_buffer_size_response, - parse_read_local_version_info_response, - parse_read_bd_addr_response, - parse_read_local_supported_commands_response, - parse_read_local_extended_features_response, - parse_ble_read_white_list_size_response, - parse_ble_read_buffer_size_response, - parse_ble_read_supported_states_response, - parse_ble_read_local_supported_features_response, - parse_ble_read_resolving_list_size_response, - parse_ble_read_suggested_default_data_length_response + parse_generic_command_complete, + parse_read_buffer_size_response, + parse_read_local_version_info_response, + parse_read_bd_addr_response, + parse_read_local_supported_commands_response, + parse_read_local_extended_features_response, + parse_ble_read_white_list_size_response, + parse_ble_read_buffer_size_response, + parse_ble_read_supported_states_response, + parse_ble_read_local_supported_features_response, + parse_ble_read_resolving_list_size_response, + parse_ble_read_suggested_default_data_length_response }; -const hci_packet_parser_t *hci_packet_parser_get_interface() { - buffer_allocator = buffer_allocator_get_interface(); - return &interface; +const hci_packet_parser_t *hci_packet_parser_get_interface() +{ + buffer_allocator = buffer_allocator_get_interface(); + return &interface; } diff --git a/components/bt/bluedroid/hci/include/bt_vendor_lib.h b/components/bt/bluedroid/hci/include/bt_vendor_lib.h old mode 100755 new mode 100644 index 3d563e1be..e3a8ec8db --- a/components/bt/bluedroid/hci/include/bt_vendor_lib.h +++ b/components/bt/bluedroid/hci/include/bt_vendor_lib.h @@ -30,142 +30,142 @@ /** Vendor specific operations OPCODE */ typedef enum { -/* [operation] - * Power on or off the BT Controller. - * [input param] - * A pointer to int type with content of bt_vendor_power_state_t. - * Typecasting conversion: (int *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Power on or off the BT Controller. + * [input param] + * A pointer to int type with content of bt_vendor_power_state_t. + * Typecasting conversion: (int *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_POWER_CTRL, -/* [operation] - * Perform any vendor specific initialization or configuration - * on the BT Controller. This is called before stack initialization. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call fwcfg_cb to notify the stack of the completion of vendor - * specific initialization once it has been done. - */ + /* [operation] + * Perform any vendor specific initialization or configuration + * on the BT Controller. This is called before stack initialization. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call fwcfg_cb to notify the stack of the completion of vendor + * specific initialization once it has been done. + */ BT_VND_OP_FW_CFG, -/* [operation] - * Perform any vendor specific SCO/PCM configuration on the BT Controller. - * This is called after stack initialization. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call scocfg_cb to notify the stack of the completion of vendor - * specific SCO configuration once it has been done. - */ + /* [operation] + * Perform any vendor specific SCO/PCM configuration on the BT Controller. + * This is called after stack initialization. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call scocfg_cb to notify the stack of the completion of vendor + * specific SCO configuration once it has been done. + */ BT_VND_OP_SCO_CFG, -/* [operation] - * Open UART port on where the BT Controller is attached. - * This is called before stack initialization. - * [input param] - * A pointer to int array type for open file descriptors. - * The mapping of HCI channel to fd slot in the int array is given in - * bt_vendor_hci_channels_t. - * And, it requires the vendor lib to fill up the content before returning - * the call. - * Typecasting conversion: (int (*)[]) param. - * [return] - * Numbers of opened file descriptors. - * Valid number: - * 1 - CMD/EVT/ACL-In/ACL-Out via the same fd (e.g. UART) - * 2 - CMD/EVT on one fd, and ACL-In/ACL-Out on the other fd - * 4 - CMD, EVT, ACL-In, ACL-Out are on their individual fd - * [callback] - * None. - */ + /* [operation] + * Open UART port on where the BT Controller is attached. + * This is called before stack initialization. + * [input param] + * A pointer to int array type for open file descriptors. + * The mapping of HCI channel to fd slot in the int array is given in + * bt_vendor_hci_channels_t. + * And, it requires the vendor lib to fill up the content before returning + * the call. + * Typecasting conversion: (int (*)[]) param. + * [return] + * Numbers of opened file descriptors. + * Valid number: + * 1 - CMD/EVT/ACL-In/ACL-Out via the same fd (e.g. UART) + * 2 - CMD/EVT on one fd, and ACL-In/ACL-Out on the other fd + * 4 - CMD, EVT, ACL-In, ACL-Out are on their individual fd + * [callback] + * None. + */ BT_VND_OP_USERIAL_OPEN, -/* [operation] - * Close the previously opened UART port. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Close the previously opened UART port. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_USERIAL_CLOSE, -/* [operation] - * Get the LPM idle timeout in milliseconds. - * The stack uses this information to launch a timer delay before it - * attempts to de-assert LPM WAKE signal once downstream HCI packet - * has been delivered. - * [input param] - * A pointer to uint32_t type which is passed in by the stack. And, it - * requires the vendor lib to fill up the content before returning - * the call. - * Typecasting conversion: (uint32_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Get the LPM idle timeout in milliseconds. + * The stack uses this information to launch a timer delay before it + * attempts to de-assert LPM WAKE signal once downstream HCI packet + * has been delivered. + * [input param] + * A pointer to uint32_t type which is passed in by the stack. And, it + * requires the vendor lib to fill up the content before returning + * the call. + * Typecasting conversion: (uint32_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_GET_LPM_IDLE_TIMEOUT, -/* [operation] - * Enable or disable LPM mode on BT Controller. - * [input param] - * A pointer to uint8_t type with content of bt_vendor_lpm_mode_t. - * Typecasting conversion: (uint8_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * Must call lpm_cb to notify the stack of the completion of LPM - * disable/enable process once it has been done. - */ + /* [operation] + * Enable or disable LPM mode on BT Controller. + * [input param] + * A pointer to uint8_t type with content of bt_vendor_lpm_mode_t. + * Typecasting conversion: (uint8_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * Must call lpm_cb to notify the stack of the completion of LPM + * disable/enable process once it has been done. + */ BT_VND_OP_LPM_SET_MODE, -/* [operation] - * Assert or Deassert LPM WAKE on BT Controller. - * [input param] - * A pointer to uint8_t type with content of bt_vendor_lpm_wake_state_t. - * Typecasting conversion: (uint8_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Assert or Deassert LPM WAKE on BT Controller. + * [input param] + * A pointer to uint8_t type with content of bt_vendor_lpm_wake_state_t. + * Typecasting conversion: (uint8_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_LPM_WAKE_SET_STATE, -/* [operation] - * Perform any vendor specific commands related to audio state changes. - * [input param] - * a pointer to bt_vendor_op_audio_state_t indicating what audio state is - * set. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Perform any vendor specific commands related to audio state changes. + * [input param] + * a pointer to bt_vendor_op_audio_state_t indicating what audio state is + * set. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_SET_AUDIO_STATE, -/* [operation] - * The epilog call to the vendor module so that it can perform any - * vendor-specific processes (e.g. send a HCI_RESET to BT Controller) - * before the caller calls for cleanup(). - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call epilog_cb to notify the stack of the completion of vendor - * specific epilog process once it has been done. - */ + /* [operation] + * The epilog call to the vendor module so that it can perform any + * vendor-specific processes (e.g. send a HCI_RESET to BT Controller) + * before the caller calls for cleanup(). + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call epilog_cb to notify the stack of the completion of vendor + * specific epilog process once it has been done. + */ BT_VND_OP_EPILOG, } bt_vendor_opcode_t; @@ -257,7 +257,7 @@ typedef void (*cfg_result_cb)(bt_vendor_op_result_t result); * HC_BT_HDR.offset = 0; * HC_BT_HDR.layer_specific = 0; */ -typedef void* (*malloc_cb)(int size); +typedef void *(*malloc_cb)(int size); /* datapath buffer deallocation callback (callout) */ typedef void (*mdealloc_cb)(void *p_buf); @@ -336,7 +336,7 @@ typedef struct { * Caller will open the interface and pass in the callback routines * to the implemenation of this interface. */ - int (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr); + int (*init)(const bt_vendor_callbacks_t *p_cb, unsigned char *local_bdaddr); /** Vendor specific operations */ int (*op)(bt_vendor_opcode_t opcode, void *param); diff --git a/components/bt/bluedroid/hci/include/hci_hal.h b/components/bt/bluedroid/hci/include/hci_hal.h old mode 100755 new mode 100644 index 6e8b1a66a..9853211df --- a/components/bt/bluedroid/hci/include/hci_hal.h +++ b/components/bt/bluedroid/hci/include/hci_hal.h @@ -25,57 +25,57 @@ #include "bt_types.h" typedef enum { - DATA_TYPE_COMMAND = 1, - DATA_TYPE_ACL = 2, - DATA_TYPE_SCO = 3, - DATA_TYPE_EVENT = 4 + DATA_TYPE_COMMAND = 1, + DATA_TYPE_ACL = 2, + DATA_TYPE_SCO = 3, + DATA_TYPE_EVENT = 4 } serial_data_type_t; typedef void (*packet_ready_cb)(BT_HDR *packet); typedef struct { - // Called when the HAL detects inbound data. - // Data |type| may be ACL, SCO, or EVENT. - // Executes in the context of the thread supplied to |init|. - packet_ready_cb packet_ready; + // Called when the HAL detects inbound data. + // Data |type| may be ACL, SCO, or EVENT. + // Executes in the context of the thread supplied to |init|. + packet_ready_cb packet_ready; - /* - // Called when the HAL detects inbound astronauts named Dave. - // HAL will deny all requests to open the pod bay doors after this. - dave_ready_cb dave_ready; - */ + /* + // Called when the HAL detects inbound astronauts named Dave. + // HAL will deny all requests to open the pod bay doors after this. + dave_ready_cb dave_ready; + */ } hci_hal_callbacks_t; typedef struct hci_hal_t { - // Initialize the HAL, with |upper_callbacks| and |upper_thread| to run in the context of. - //bool (*init)(const hci_hal_callbacks_t *upper_callbacks); + // Initialize the HAL, with |upper_callbacks| and |upper_thread| to run in the context of. + //bool (*init)(const hci_hal_callbacks_t *upper_callbacks); - // Connect to the underlying hardware, and let data start flowing. - bool (*open)(const hci_hal_callbacks_t *upper_callbacks); - // Disconnect from the underlying hardware, and close the HAL. - // "Daisy, Daisy..." - void (*close)(void); + // Connect to the underlying hardware, and let data start flowing. + bool (*open)(const hci_hal_callbacks_t *upper_callbacks); + // Disconnect from the underlying hardware, and close the HAL. + // "Daisy, Daisy..." + void (*close)(void); - // Retrieve up to |max_size| bytes for ACL, SCO, or EVENT data packets into - // |buffer|, blocking until max_size bytes read if |block| is true. - // Only guaranteed to be correct in the context of a data_ready callback - // of the corresponding type. - //size_t (*read_data)(serial_data_type_t type, uint8_t *buffer, size_t max_size); - // The upper layer must call this to notify the HAL that it has finished - // reading a packet of the specified |type|. Underlying implementations that - // use shared channels for multiple data types depend on this to know when - // to reinterpret the data stream. - //void (*packet_finished)(serial_data_type_t type); - // Transmit COMMAND, ACL, or SCO data packets. - // |data| may not be NULL. |length| must be greater than zero. - // - // IMPORTANT NOTE: - // Depending on the underlying implementation, the byte right - // before the beginning of |data| may be borrowed during this call - // and then restored to its original value. - // This is safe in the bluetooth context, because there is always a buffer - // header that prefixes data you're sending. - uint16_t (*transmit_data)(serial_data_type_t type, uint8_t *data, uint16_t length); + // Retrieve up to |max_size| bytes for ACL, SCO, or EVENT data packets into + // |buffer|, blocking until max_size bytes read if |block| is true. + // Only guaranteed to be correct in the context of a data_ready callback + // of the corresponding type. + //size_t (*read_data)(serial_data_type_t type, uint8_t *buffer, size_t max_size); + // The upper layer must call this to notify the HAL that it has finished + // reading a packet of the specified |type|. Underlying implementations that + // use shared channels for multiple data types depend on this to know when + // to reinterpret the data stream. + //void (*packet_finished)(serial_data_type_t type); + // Transmit COMMAND, ACL, or SCO data packets. + // |data| may not be NULL. |length| must be greater than zero. + // + // IMPORTANT NOTE: + // Depending on the underlying implementation, the byte right + // before the beginning of |data| may be borrowed during this call + // and then restored to its original value. + // This is safe in the bluetooth context, because there is always a buffer + // header that prefixes data you're sending. + uint16_t (*transmit_data)(serial_data_type_t type, uint8_t *data, uint16_t length); } hci_hal_t; diff --git a/components/bt/bluedroid/hci/include/hci_layer.h b/components/bt/bluedroid/hci/include/hci_layer.h old mode 100755 new mode 100644 index ed291077f..caea29f28 --- a/components/bt/bluedroid/hci/include/hci_layer.h +++ b/components/bt/bluedroid/hci/include/hci_layer.h @@ -71,27 +71,27 @@ typedef void (*command_complete_cb)(BT_HDR *response, void *context); typedef void (*command_status_cb)(uint8_t status, BT_HDR *command, void *context); typedef struct hci_t { - // Send a low power command, if supported and the low power manager is enabled. - //void (*send_low_power_command)(low_power_command_t command); + // Send a low power command, if supported and the low power manager is enabled. + //void (*send_low_power_command)(low_power_command_t command); - // Do the postload sequence (call after the rest of the BT stack initializes). - void (*do_postload)(void); + // Do the postload sequence (call after the rest of the BT stack initializes). + void (*do_postload)(void); - // Set the queue to receive ACL data in - void (*set_data_queue)(fixed_queue_t *queue); + // Set the queue to receive ACL data in + void (*set_data_queue)(fixed_queue_t *queue); - // Send a command through the HCI layer - void (*transmit_command)( - BT_HDR *command, - command_complete_cb complete_callback, - command_status_cb status_cb, - void *context - ); + // Send a command through the HCI layer + void (*transmit_command)( + BT_HDR *command, + command_complete_cb complete_callback, + command_status_cb status_cb, + void *context + ); - future_t *(*transmit_command_futured)(BT_HDR *command); + future_t *(*transmit_command_futured)(BT_HDR *command); - // Send some data downward through the HCI layer - void (*transmit_downward)(uint16_t type, void *data); + // Send some data downward through the HCI layer + void (*transmit_downward)(uint16_t type, void *data); } hci_t; const hci_t *hci_layer_get_interface(); diff --git a/components/bt/bluedroid/hci/include/hci_packet_factory.h b/components/bt/bluedroid/hci/include/hci_packet_factory.h old mode 100755 new mode 100644 index 3dd4197a2..879962c2f --- a/components/bt/bluedroid/hci/include/hci_packet_factory.h +++ b/components/bt/bluedroid/hci/include/hci_packet_factory.h @@ -23,24 +23,24 @@ #include "event_mask.h" typedef struct { - BT_HDR *(*make_reset)(void); - BT_HDR *(*make_read_buffer_size)(void); - BT_HDR *(*make_host_buffer_size)(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count); - BT_HDR *(*make_read_local_version_info)(void); - BT_HDR *(*make_read_bd_addr)(void); - BT_HDR *(*make_read_local_supported_commands)(void); - BT_HDR *(*make_read_local_extended_features)(uint8_t page_number); - BT_HDR *(*make_write_simple_pairing_mode)(uint8_t mode); - BT_HDR *(*make_write_secure_connections_host_support)(uint8_t mode); - BT_HDR *(*make_set_event_mask)(const bt_event_mask_t *event_mask); - BT_HDR *(*make_ble_write_host_support)(uint8_t supported_host, uint8_t simultaneous_host); - BT_HDR *(*make_ble_read_white_list_size)(void); - BT_HDR *(*make_ble_read_buffer_size)(void); - BT_HDR *(*make_ble_read_supported_states)(void); - BT_HDR *(*make_ble_read_local_supported_features)(void); - BT_HDR *(*make_ble_read_resolving_list_size)(void); - BT_HDR *(*make_ble_read_suggested_default_data_length)(void); - BT_HDR *(*make_ble_set_event_mask)(const bt_event_mask_t *event_mask); + BT_HDR *(*make_reset)(void); + BT_HDR *(*make_read_buffer_size)(void); + BT_HDR *(*make_host_buffer_size)(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count); + BT_HDR *(*make_read_local_version_info)(void); + BT_HDR *(*make_read_bd_addr)(void); + BT_HDR *(*make_read_local_supported_commands)(void); + BT_HDR *(*make_read_local_extended_features)(uint8_t page_number); + BT_HDR *(*make_write_simple_pairing_mode)(uint8_t mode); + BT_HDR *(*make_write_secure_connections_host_support)(uint8_t mode); + BT_HDR *(*make_set_event_mask)(const bt_event_mask_t *event_mask); + BT_HDR *(*make_ble_write_host_support)(uint8_t supported_host, uint8_t simultaneous_host); + BT_HDR *(*make_ble_read_white_list_size)(void); + BT_HDR *(*make_ble_read_buffer_size)(void); + BT_HDR *(*make_ble_read_supported_states)(void); + BT_HDR *(*make_ble_read_local_supported_features)(void); + BT_HDR *(*make_ble_read_resolving_list_size)(void); + BT_HDR *(*make_ble_read_suggested_default_data_length)(void); + BT_HDR *(*make_ble_set_event_mask)(const bt_event_mask_t *event_mask); } hci_packet_factory_t; const hci_packet_factory_t *hci_packet_factory_get_interface(); diff --git a/components/bt/bluedroid/hci/include/hci_packet_parser.h b/components/bt/bluedroid/hci/include/hci_packet_parser.h old mode 100755 new mode 100644 index 000397295..916ea313f --- a/components/bt/bluedroid/hci/include/hci_packet_parser.h +++ b/components/bt/bluedroid/hci/include/hci_packet_parser.h @@ -29,69 +29,69 @@ #include "version.h" typedef struct { - void (*parse_generic_command_complete)(BT_HDR *response); + void (*parse_generic_command_complete)(BT_HDR *response); - void (*parse_read_buffer_size_response)( - BT_HDR *response, - uint16_t *data_size_ptr, - uint16_t *acl_buffer_count_ptr - ); + void (*parse_read_buffer_size_response)( + BT_HDR *response, + uint16_t *data_size_ptr, + uint16_t *acl_buffer_count_ptr + ); - void (*parse_read_local_version_info_response)( - BT_HDR *response, - bt_version_t *bt_version_ptr - ); + void (*parse_read_local_version_info_response)( + BT_HDR *response, + bt_version_t *bt_version_ptr + ); - void (*parse_read_bd_addr_response)( - BT_HDR *response, - bt_bdaddr_t *address_ptr - ); + void (*parse_read_bd_addr_response)( + BT_HDR *response, + bt_bdaddr_t *address_ptr + ); - void (*parse_read_local_supported_commands_response)( - BT_HDR *response, - uint8_t *supported_commands_ptr, - size_t supported_commands_length - ); + void (*parse_read_local_supported_commands_response)( + BT_HDR *response, + uint8_t *supported_commands_ptr, + size_t supported_commands_length + ); - void (*parse_read_local_extended_features_response)( - BT_HDR *response, - uint8_t *page_number_ptr, - uint8_t *max_page_number_ptr, - bt_device_features_t *feature_pages, - size_t feature_pages_count - ); + void (*parse_read_local_extended_features_response)( + BT_HDR *response, + uint8_t *page_number_ptr, + uint8_t *max_page_number_ptr, + bt_device_features_t *feature_pages, + size_t feature_pages_count + ); - void (*parse_ble_read_white_list_size_response)( - BT_HDR *response, - uint8_t *white_list_size_ptr - ); + void (*parse_ble_read_white_list_size_response)( + BT_HDR *response, + uint8_t *white_list_size_ptr + ); - void (*parse_ble_read_buffer_size_response)( - BT_HDR *response, - uint16_t *data_size_ptr, - uint8_t *acl_buffer_count_ptr - ); + void (*parse_ble_read_buffer_size_response)( + BT_HDR *response, + uint16_t *data_size_ptr, + uint8_t *acl_buffer_count_ptr + ); - void (*parse_ble_read_supported_states_response)( - BT_HDR *response, - uint8_t *supported_states, - size_t supported_states_size - ); + void (*parse_ble_read_supported_states_response)( + BT_HDR *response, + uint8_t *supported_states, + size_t supported_states_size + ); - void (*parse_ble_read_local_supported_features_response)( - BT_HDR *response, - bt_device_features_t *supported_features - ); + void (*parse_ble_read_local_supported_features_response)( + BT_HDR *response, + bt_device_features_t *supported_features + ); - void (*parse_ble_read_resolving_list_size_response) ( - BT_HDR *response, - uint8_t *resolving_list_size_ptr - ); + void (*parse_ble_read_resolving_list_size_response) ( + BT_HDR *response, + uint8_t *resolving_list_size_ptr + ); - void (*parse_ble_read_suggested_default_data_length_response)( - BT_HDR *response, - uint16_t *ble_default_packet_length_ptr - ); + void (*parse_ble_read_suggested_default_data_length_response)( + BT_HDR *response, + uint16_t *ble_default_packet_length_ptr + ); } hci_packet_parser_t; const hci_packet_parser_t *hci_packet_parser_get_interface(); diff --git a/components/bt/bluedroid/hci/include/packet_fragmenter.h b/components/bt/bluedroid/hci/include/packet_fragmenter.h old mode 100755 new mode 100644 index a6ba15c0c..7227e0af2 --- a/components/bt/bluedroid/hci/include/packet_fragmenter.h +++ b/components/bt/bluedroid/hci/include/packet_fragmenter.h @@ -28,33 +28,33 @@ typedef void (*packet_reassembled_cb)(BT_HDR *packet); typedef void (*packet_fragmented_cb)(BT_HDR *packet, bool send_transmit_finished); typedef struct { - // Called for every packet fragment. - packet_fragmented_cb fragmented; + // Called for every packet fragment. + packet_fragmented_cb fragmented; - // Called for every completely reassembled packet. - packet_reassembled_cb reassembled; + // Called for every completely reassembled packet. + packet_reassembled_cb reassembled; - // Called when the fragmenter finishes sending all requested fragments, - // but the packet has not been entirely sent. - transmit_finished_cb transmit_finished; + // Called when the fragmenter finishes sending all requested fragments, + // but the packet has not been entirely sent. + transmit_finished_cb transmit_finished; } packet_fragmenter_callbacks_t; typedef struct packet_fragmenter_t { - // Initialize the fragmenter, specifying the |result_callbacks|. - void (*init)(const packet_fragmenter_callbacks_t *result_callbacks); + // Initialize the fragmenter, specifying the |result_callbacks|. + void (*init)(const packet_fragmenter_callbacks_t *result_callbacks); - // Release all resources associated with the fragmenter. - void (*cleanup)(void); + // Release all resources associated with the fragmenter. + void (*cleanup)(void); - // CHeck if Current fragmenter is ongoing - BT_HDR *(*fragment_current_packet)(void); + // CHeck if Current fragmenter is ongoing + BT_HDR *(*fragment_current_packet)(void); - // Fragments |packet| if necessary and hands off everything to the fragmented callback. - void (*fragment_and_dispatch)(BT_HDR *packet); - // If |packet| is a complete packet, forwards to the reassembled callback. Otherwise - // holds onto it until all fragments arrive, at which point the reassembled callback is called - // with the reassembled data. - void (*reassemble_and_dispatch)(BT_HDR *packet); + // Fragments |packet| if necessary and hands off everything to the fragmented callback. + void (*fragment_and_dispatch)(BT_HDR *packet); + // If |packet| is a complete packet, forwards to the reassembled callback. Otherwise + // holds onto it until all fragments arrive, at which point the reassembled callback is called + // with the reassembled data. + void (*reassemble_and_dispatch)(BT_HDR *packet); } packet_fragmenter_t; const packet_fragmenter_t *packet_fragmenter_get_interface(); diff --git a/components/bt/bluedroid/hci/packet_fragmenter.c b/components/bt/bluedroid/hci/packet_fragmenter.c old mode 100755 new mode 100644 index 46e419ae2..fe6ca5019 --- a/components/bt/bluedroid/hci/packet_fragmenter.c +++ b/components/bt/bluedroid/hci/packet_fragmenter.c @@ -50,176 +50,184 @@ static const packet_fragmenter_callbacks_t *callbacks; static hash_map_t *partial_packets; static BT_HDR *current_fragment_packet; -static void init(const packet_fragmenter_callbacks_t *result_callbacks) { - current_fragment_packet = NULL; - callbacks = result_callbacks; - partial_packets = hash_map_new(NUMBER_OF_BUCKETS, hash_function_naive, NULL, NULL, NULL); -} - -static void cleanup() { - if (partial_packets) - hash_map_free(partial_packets); -} - -static BT_HDR *fragment_get_current_packet() { - return current_fragment_packet; -} - -static void fragment_and_dispatch(BT_HDR *packet) { - uint16_t continuation_handle; - uint16_t max_data_size, max_packet_size, remaining_length; - uint16_t event = packet->event & MSG_EVT_MASK; - uint8_t *stream = packet->data + packet->offset; - - assert(packet != NULL); - - // We only fragment ACL packets - if (event != MSG_STACK_TO_HC_HCI_ACL) { - callbacks->fragmented(packet, true); - return; - } - - max_data_size = - SUB_EVENT(packet->event) == LOCAL_BR_EDR_CONTROLLER_ID ? - controller->get_acl_data_size_classic() : - controller->get_acl_data_size_ble(); - - max_packet_size = max_data_size + HCI_ACL_PREAMBLE_SIZE; - remaining_length = packet->len; - - STREAM_TO_UINT16(continuation_handle, stream); - continuation_handle = APPLY_CONTINUATION_FLAG(continuation_handle); - if (remaining_length > max_packet_size) { - current_fragment_packet = packet; - UINT16_TO_STREAM(stream, max_packet_size); - packet->len = max_packet_size; - callbacks->fragmented(packet, false); - packet->offset += max_data_size; - remaining_length -= max_data_size; - packet->len = remaining_length; - - // Write the ACL header for the next fragment - stream = packet->data + packet->offset; - UINT16_TO_STREAM(stream, continuation_handle); - UINT16_TO_STREAM(stream, remaining_length - HCI_ACL_PREAMBLE_SIZE); - - // Apparently L2CAP can set layer_specific to a max number of segments to transmit - if (packet->layer_specific) { - packet->layer_specific--; - if (packet->layer_specific == 0) { - packet->event = MSG_HC_TO_STACK_L2C_SEG_XMIT; - callbacks->transmit_finished(packet, false); - return; - } - } - } else { +static void init(const packet_fragmenter_callbacks_t *result_callbacks) +{ current_fragment_packet = NULL; - callbacks->fragmented(packet, true); - } + callbacks = result_callbacks; + partial_packets = hash_map_new(NUMBER_OF_BUCKETS, hash_function_naive, NULL, NULL, NULL); } -static void reassemble_and_dispatch(BT_HDR *packet) { - if ((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_ACL) { - uint8_t *stream = packet->data + packet->offset; - uint16_t handle; - uint16_t l2cap_length; - uint16_t acl_length; - uint8_t boundary_flag; - BT_HDR *partial_packet; - - STREAM_TO_UINT16(handle, stream); - STREAM_TO_UINT16(acl_length, stream); - STREAM_TO_UINT16(l2cap_length, stream); - - assert(acl_length == packet->len - HCI_ACL_PREAMBLE_SIZE); - - boundary_flag = GET_BOUNDARY_FLAG(handle); - handle = handle & HANDLE_MASK; - - partial_packet = (BT_HDR *)hash_map_get(partial_packets, (void *)(uintptr_t)handle); - - if (boundary_flag == START_PACKET_BOUNDARY) { - uint16_t full_length; - if (partial_packet) { - LOG_WARN("%s found unfinished packet for handle with start packet. Dropping old.", __func__); - hash_map_erase(partial_packets, (void *)(uintptr_t)handle); - buffer_allocator->free(partial_packet); - } - - full_length = l2cap_length + L2CAP_HEADER_SIZE + HCI_ACL_PREAMBLE_SIZE; - if (full_length <= packet->len) { - if (full_length < packet->len) - LOG_WARN("%s found l2cap full length %d less than the hci length %d.", __func__, l2cap_length, packet->len); - - callbacks->reassembled(packet); - return; - } - - partial_packet = (BT_HDR *)buffer_allocator->alloc(full_length + sizeof(BT_HDR)); - partial_packet->event = packet->event; - partial_packet->len = full_length; - partial_packet->offset = packet->len; - - memcpy(partial_packet->data, packet->data+packet->offset, packet->len); - - // Update the ACL data size to indicate the full expected length - stream = partial_packet->data; - STREAM_SKIP_UINT16(stream); // skip the handle - UINT16_TO_STREAM(stream, full_length - HCI_ACL_PREAMBLE_SIZE); - - hash_map_set(partial_packets, (void *)(uintptr_t)handle, partial_packet); - // Free the old packet buffer, since we don't need it anymore - buffer_allocator->free(packet); - } else { - uint16_t projected_offset; - if (!partial_packet) { - LOG_WARN("%s got continuation for unknown packet. Dropping it.", __func__); - buffer_allocator->free(packet); - return; - } - - packet->offset += HCI_ACL_PREAMBLE_SIZE; // skip ACL preamble - packet->len -= HCI_ACL_PREAMBLE_SIZE; - - projected_offset = partial_packet->offset + packet->len; - if (projected_offset > partial_packet->len) { // len stores the expected length - LOG_WARN("%s got packet which would exceed expected length of %d. Truncating.", __func__, partial_packet->len); - packet->len = partial_packet->len - partial_packet->offset; - projected_offset = partial_packet->len; - } - - memcpy( - partial_packet->data + partial_packet->offset, - packet->data + packet->offset, - packet->len - ); - // Free the old packet buffer, since we don't need it anymore - buffer_allocator->free(packet); - partial_packet->offset = projected_offset; - - if (partial_packet->offset == partial_packet->len) { - hash_map_erase(partial_packets, (void *)(uintptr_t)handle); - partial_packet->offset = 0; - callbacks->reassembled(partial_packet); - } +static void cleanup() +{ + if (partial_packets) { + hash_map_free(partial_packets); + } +} + +static BT_HDR *fragment_get_current_packet() +{ + return current_fragment_packet; +} + +static void fragment_and_dispatch(BT_HDR *packet) +{ + uint16_t continuation_handle; + uint16_t max_data_size, max_packet_size, remaining_length; + uint16_t event = packet->event & MSG_EVT_MASK; + uint8_t *stream = packet->data + packet->offset; + + assert(packet != NULL); + + // We only fragment ACL packets + if (event != MSG_STACK_TO_HC_HCI_ACL) { + callbacks->fragmented(packet, true); + return; + } + + max_data_size = + SUB_EVENT(packet->event) == LOCAL_BR_EDR_CONTROLLER_ID ? + controller->get_acl_data_size_classic() : + controller->get_acl_data_size_ble(); + + max_packet_size = max_data_size + HCI_ACL_PREAMBLE_SIZE; + remaining_length = packet->len; + + STREAM_TO_UINT16(continuation_handle, stream); + continuation_handle = APPLY_CONTINUATION_FLAG(continuation_handle); + if (remaining_length > max_packet_size) { + current_fragment_packet = packet; + UINT16_TO_STREAM(stream, max_packet_size); + packet->len = max_packet_size; + callbacks->fragmented(packet, false); + packet->offset += max_data_size; + remaining_length -= max_data_size; + packet->len = remaining_length; + + // Write the ACL header for the next fragment + stream = packet->data + packet->offset; + UINT16_TO_STREAM(stream, continuation_handle); + UINT16_TO_STREAM(stream, remaining_length - HCI_ACL_PREAMBLE_SIZE); + + // Apparently L2CAP can set layer_specific to a max number of segments to transmit + if (packet->layer_specific) { + packet->layer_specific--; + if (packet->layer_specific == 0) { + packet->event = MSG_HC_TO_STACK_L2C_SEG_XMIT; + callbacks->transmit_finished(packet, false); + return; + } + } + } else { + current_fragment_packet = NULL; + callbacks->fragmented(packet, true); + } +} + +static void reassemble_and_dispatch(BT_HDR *packet) +{ + if ((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_ACL) { + uint8_t *stream = packet->data + packet->offset; + uint16_t handle; + uint16_t l2cap_length; + uint16_t acl_length; + uint8_t boundary_flag; + BT_HDR *partial_packet; + + STREAM_TO_UINT16(handle, stream); + STREAM_TO_UINT16(acl_length, stream); + STREAM_TO_UINT16(l2cap_length, stream); + + assert(acl_length == packet->len - HCI_ACL_PREAMBLE_SIZE); + + boundary_flag = GET_BOUNDARY_FLAG(handle); + handle = handle & HANDLE_MASK; + + partial_packet = (BT_HDR *)hash_map_get(partial_packets, (void *)(uintptr_t)handle); + + if (boundary_flag == START_PACKET_BOUNDARY) { + uint16_t full_length; + if (partial_packet) { + LOG_WARN("%s found unfinished packet for handle with start packet. Dropping old.", __func__); + hash_map_erase(partial_packets, (void *)(uintptr_t)handle); + buffer_allocator->free(partial_packet); + } + + full_length = l2cap_length + L2CAP_HEADER_SIZE + HCI_ACL_PREAMBLE_SIZE; + if (full_length <= packet->len) { + if (full_length < packet->len) { + LOG_WARN("%s found l2cap full length %d less than the hci length %d.", __func__, l2cap_length, packet->len); + } + + callbacks->reassembled(packet); + return; + } + + partial_packet = (BT_HDR *)buffer_allocator->alloc(full_length + sizeof(BT_HDR)); + partial_packet->event = packet->event; + partial_packet->len = full_length; + partial_packet->offset = packet->len; + + memcpy(partial_packet->data, packet->data + packet->offset, packet->len); + + // Update the ACL data size to indicate the full expected length + stream = partial_packet->data; + STREAM_SKIP_UINT16(stream); // skip the handle + UINT16_TO_STREAM(stream, full_length - HCI_ACL_PREAMBLE_SIZE); + + hash_map_set(partial_packets, (void *)(uintptr_t)handle, partial_packet); + // Free the old packet buffer, since we don't need it anymore + buffer_allocator->free(packet); + } else { + uint16_t projected_offset; + if (!partial_packet) { + LOG_WARN("%s got continuation for unknown packet. Dropping it.", __func__); + buffer_allocator->free(packet); + return; + } + + packet->offset += HCI_ACL_PREAMBLE_SIZE; // skip ACL preamble + packet->len -= HCI_ACL_PREAMBLE_SIZE; + + projected_offset = partial_packet->offset + packet->len; + if (projected_offset > partial_packet->len) { // len stores the expected length + LOG_WARN("%s got packet which would exceed expected length of %d. Truncating.", __func__, partial_packet->len); + packet->len = partial_packet->len - partial_packet->offset; + projected_offset = partial_packet->len; + } + + memcpy( + partial_packet->data + partial_packet->offset, + packet->data + packet->offset, + packet->len + ); + // Free the old packet buffer, since we don't need it anymore + buffer_allocator->free(packet); + partial_packet->offset = projected_offset; + + if (partial_packet->offset == partial_packet->len) { + hash_map_erase(partial_packets, (void *)(uintptr_t)handle); + partial_packet->offset = 0; + callbacks->reassembled(partial_packet); + } + } + } else { + callbacks->reassembled(packet); } - } else { - callbacks->reassembled(packet); - } } static const packet_fragmenter_t interface = { - init, - cleanup, + init, + cleanup, - fragment_get_current_packet, - fragment_and_dispatch, - reassemble_and_dispatch + fragment_get_current_packet, + fragment_and_dispatch, + reassemble_and_dispatch }; -const packet_fragmenter_t *packet_fragmenter_get_interface() { - controller = controller_get_interface(); - buffer_allocator = buffer_allocator_get_interface(); - return &interface; +const packet_fragmenter_t *packet_fragmenter_get_interface() +{ + controller = controller_get_interface(); + buffer_allocator = buffer_allocator_get_interface(); + return &interface; } diff --git a/components/bt/bluedroid/include/bt_common_types.h b/components/bt/bluedroid/include/bt_common_types.h index 382689a82..abd213fbf 100755 --- a/components/bt/bluedroid/include/bt_common_types.h +++ b/components/bt/bluedroid/include/bt_common_types.h @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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. + diff --git a/components/bt/bluedroid/include/bt_defs.h b/components/bt/bluedroid/include/bt_defs.h old mode 100755 new mode 100644 index c98ed0ed8..ef236f663 --- a/components/bt/bluedroid/include/bt_defs.h +++ b/components/bt/bluedroid/include/bt_defs.h @@ -1,6 +1,20 @@ +// Copyright 2015-2016 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. + /** * bt_defs.h Defines useful API for whole Bluedroid - * + * */ #ifndef _BT_DEFS_H_ #define _BT_DEFS_H_ @@ -41,21 +55,21 @@ do { \ #define pthread_mutex_unlock osi_mutex_unlock #else #define pthread_mutex_t uint8_t -#define pthread_mutex_init(x1, x2) -#define pthread_mutex_destroy(mutex) -#define pthread_mutex_lock(mutex) -#define pthread_mutex_unlock(mutex) +#define pthread_mutex_init(x1, x2) +#define pthread_mutex_destroy(mutex) +#define pthread_mutex_lock(mutex) +#define pthread_mutex_unlock(mutex) #endif /*Bluetooth Address*/ typedef struct { - uint8_t address[6]; + uint8_t address[6]; } __attribute__ ((__packed__)) bt_bdaddr_t; /** Bluetooth 128-bit UUID */ typedef struct { - uint8_t uu[16]; + uint8_t uu[16]; } bt_uuid_t; /** Bluetooth Error Status */ @@ -74,61 +88,66 @@ typedef enum { BT_STATUS_AUTH_FAILURE, BT_STATUS_RMT_DEV_DOWN, BT_STATUS_AUTH_REJECTED - } bt_status_t; #ifndef CPU_LITTLE_ENDIAN #define CPU_LITTLE_ENDIAN #endif -inline uint16_t swap_byte_16(uint16_t x) { - return (((x & 0x00ffU) << 8) | - ((x & 0xff00U) >> 8)); +inline uint16_t swap_byte_16(uint16_t x) +{ + return (((x & 0x00ffU) << 8) | + ((x & 0xff00U) >> 8)); } -inline uint32_t swap_byte_32(uint32_t x) { - return (((x & 0x000000ffUL) << 24) | - ((x & 0x0000ff00UL) << 8) | - ((x & 0x00ff0000UL) >> 8) | - ((x & 0xff000000UL) >> 24)); +inline uint32_t swap_byte_32(uint32_t x) +{ + return (((x & 0x000000ffUL) << 24) | + ((x & 0x0000ff00UL) << 8) | + ((x & 0x00ff0000UL) >> 8) | + ((x & 0xff000000UL) >> 24)); } #ifndef ntohs -inline uint16_t ntohs(uint16_t x) { +inline uint16_t ntohs(uint16_t x) +{ #ifdef CPU_LITTLE_ENDIAN - return swap_byte_16(x); + return swap_byte_16(x); #else - return x; + return x; #endif } #endif /* #ifndef ntohs */ #ifndef htons -inline uint16_t htons(uint16_t x) { +inline uint16_t htons(uint16_t x) +{ #ifdef CPU_LITTLE_ENDIAN - return swap_byte_16(x); + return swap_byte_16(x); #else - return x; + return x; #endif } #endif /* #ifndef htons */ #ifndef ntohl -inline uint32_t ntohl(uint32_t x) { +inline uint32_t ntohl(uint32_t x) +{ #ifdef CPU_LITTLE_ENDIAN - return swap_byte_32(x); + return swap_byte_32(x); #else - return x; + return x; #endif } #endif /* #ifndef ntohl*/ #ifndef htonl -inline uint32_t htonl(uint32_t x) { +inline uint32_t htonl(uint32_t x) +{ #ifdef CPU_LITTLE_ENDIAN - return swap_byte_32(x); + return swap_byte_32(x); #else - return x; + return x; #endif } #endif /* #ifndef htonl*/ diff --git a/components/bt/bluedroid/include/bt_target.h b/components/bt/bluedroid/include/bt_target.h old mode 100755 new mode 100644 index 656af21f9..1bedf45f5 --- a/components/bt/bluedroid/include/bt_target.h +++ b/components/bt/bluedroid/include/bt_target.h @@ -41,9 +41,9 @@ #include "dyn_mem.h" /* defines static and/or dynamic memory for components */ -#ifndef CLASSIC_BT_INCLUDED -#define CLASSIC_BT_INCLUDED TRUE -#endif ///CLASSIC_BT_INCLUDED +#ifndef CLASSIC_BT_INCLUDED +#define CLASSIC_BT_INCLUDED TRUE +#endif ///CLASSIC_BT_INCLUDED //------------------Added from bdroid_buildcfg.h--------------------- #ifndef L2CAP_EXTFEA_SUPPORTED_MASK @@ -921,7 +921,7 @@ #endif #endif - + #if SMP_INCLUDED == TRUE && BLE_INCLUDED == FALSE #error "can't have SMP without BLE" #endif @@ -1557,7 +1557,7 @@ Range: 2 octets #endif #ifndef HID_HOST_MAX_CONN_RETRY -#define HID_HOST_MAX_CONN_RETRY (3) +#define HID_HOST_MAX_CONN_RETRY (3) #endif #ifndef HID_HOST_REPAGE_WIN diff --git a/components/bt/bluedroid/include/bt_trace.h b/components/bt/bluedroid/include/bt_trace.h old mode 100755 new mode 100644 index 2fa08b587..14f258a60 --- a/components/bt/bluedroid/include/bt_trace.h +++ b/components/bt/bluedroid/include/bt_trace.h @@ -19,31 +19,40 @@ #ifndef _BT_TRACE_H_ #define _BT_TRACE_H_ +#include #include "bt_types.h" #include "rom/ets_sys.h" -//extern void ets_printf(const char *fmt, ...); + +#ifdef CONFIG_BT_USE_ETS_PRINT +#define BT_PRINTF ets_printf +#else +#define BT_PRINTF printf +#endif #ifndef assert -#define assert(x) do { if (!(x)) ets_printf("bt host error %s %u\n", __FILE__, __LINE__); } while (0) +#define assert(x) do { if (!(x)) BT_PRINTF("bt host error %s %u\n", __FILE__, __LINE__); } while (0) #endif inline void trc_dump_buffer(uint8_t *prefix, uint8_t *data, uint16_t len) { - uint16_t i; + uint16_t i; - if (!data || !len) - return; + if (!data || !len) { + return; + } - if (prefix) - ets_printf("%s:\t", prefix); + if (prefix) { + BT_PRINTF("%s:\t", prefix); + } - for (i = 0; i < len; i++) { - ets_printf(" %02x", *(data + i)); - if (!((i + 1) & 0xf)) - ets_printf("\n"); - } - ets_printf("\n"); + for (i = 0; i < len; i++) { + BT_PRINTF(" %02x", *(data + i)); + if (!((i + 1) & 0xf)) { + BT_PRINTF("\n"); + } + } + BT_PRINTF("\n"); } #ifdef BTTRC_DUMP_BUFFER @@ -187,7 +196,7 @@ inline void trc_dump_buffer(uint8_t *prefix, uint8_t *data, uint16_t len) #endif #ifndef BTM_INITIAL_TRACE_LEVEL -#define BTM_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_NONE +#define BTM_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING #endif #ifndef L2CAP_INITIAL_TRACE_LEVEL @@ -239,7 +248,7 @@ inline void trc_dump_buffer(uint8_t *prefix, uint8_t *data, uint16_t len) #endif #ifndef APPL_INITIAL_TRACE_LEVEL -#define APPL_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_NONE +#define APPL_INITIAL_TRACE_LEVEL BT_TRACE_LEVEL_WARNING #endif #ifndef BT_TRACE_APPL @@ -256,187 +265,187 @@ inline void trc_dump_buffer(uint8_t *prefix, uint8_t *data, uint16_t len) // btla-specific -- /* Define common tracing for all */ -#define LOG_LEVEL_ERROR 1 -#define LOG_LEVEL_WARN 2 -#define LOG_LEVEL_INFO 3 -#define LOG_LEVEL_DEBUG 4 -#define LOG_LEVEL_VERBOSE 5 +#define LOG_LEVEL_ERROR 1 +#define LOG_LEVEL_WARN 2 +#define LOG_LEVEL_INFO 3 +#define LOG_LEVEL_DEBUG 4 +#define LOG_LEVEL_VERBOSE 5 #ifndef LOG_LEVEL -#define LOG_LEVEL 0 +#define LOG_LEVEL LOG_LEVEL_INFO #endif -#define LOG_ERROR(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_ERROR) ets_printf(fmt,## args);} while(0) -#define LOG_WARN(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_WARN) ets_printf(fmt,## args);} while(0) -#define LOG_INFO(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_INFO) ets_printf(fmt,## args);} while(0) -#define LOG_DEBUG(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_DEBUG) ets_printf(fmt,## args);} while(0) -#define LOG_VERBOSE(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_VERBOSE) ets_printf(fmt,## args);} while(0) +#define LOG_ERROR(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_ERROR) printf(fmt,## args);} while(0) +#define LOG_WARN(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_WARN) BT_PRINTF(fmt,## args);} while(0) +#define LOG_INFO(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_INFO) BT_PRINTF(fmt,## args);} while(0) +#define LOG_DEBUG(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_DEBUG) BT_PRINTF(fmt,## args);} while(0) +#define LOG_VERBOSE(fmt, args...) do {if (LOG_LEVEL >= LOG_LEVEL_VERBOSE) BT_PRINTF(fmt,## args);} while(0) /* Define tracing for the HCI unit */ -#define HCI_TRACE_ERROR(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt,## args);} -#define HCI_TRACE_WARNING(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt,## args);} -#define HCI_TRACE_EVENT(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt,## args);} -#define HCI_TRACE_DEBUG(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt,## args);} +#define HCI_TRACE_ERROR(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt,## args);} +#define HCI_TRACE_WARNING(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt,## args);} +#define HCI_TRACE_EVENT(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt,## args);} +#define HCI_TRACE_DEBUG(fmt, args...) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt,## args);} /* Define tracing for BTM */ -#define BTM_TRACE_ERROR(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define BTM_TRACE_WARNING(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define BTM_TRACE_API(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define BTM_TRACE_EVENT(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define BTM_TRACE_DEBUG(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define BTM_TRACE_ERROR(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define BTM_TRACE_WARNING(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define BTM_TRACE_API(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define BTM_TRACE_EVENT(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define BTM_TRACE_DEBUG(fmt, args...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Define tracing for the L2CAP unit */ -#define L2CAP_TRACE_ERROR(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define L2CAP_TRACE_WARNING(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define L2CAP_TRACE_API(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define L2CAP_TRACE_EVENT(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define L2CAP_TRACE_DEBUG(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define L2CAP_TRACE_ERROR(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define L2CAP_TRACE_WARNING(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define L2CAP_TRACE_API(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define L2CAP_TRACE_EVENT(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define L2CAP_TRACE_DEBUG(fmt, args...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Define tracing for the SDP unit */ -#define SDP_TRACE_ERROR(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define SDP_TRACE_WARNING(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define SDP_TRACE_API(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define SDP_TRACE_EVENT(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define SDP_TRACE_DEBUG(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define SDP_TRACE_ERROR(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define SDP_TRACE_WARNING(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define SDP_TRACE_API(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define SDP_TRACE_EVENT(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define SDP_TRACE_DEBUG(fmt, args...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Define tracing for the RFCOMM unit */ -#define RFCOMM_TRACE_ERROR(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define RFCOMM_TRACE_WARNING(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define RFCOMM_TRACE_API(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define RFCOMM_TRACE_EVENT(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define RFCOMM_TRACE_DEBUG(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define RFCOMM_TRACE_ERROR(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define RFCOMM_TRACE_WARNING(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define RFCOMM_TRACE_API(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define RFCOMM_TRACE_EVENT(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define RFCOMM_TRACE_DEBUG(fmt, args...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Generic Access Profile traces */ -#define GAP_TRACE_ERROR(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define GAP_TRACE_EVENT(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define GAP_TRACE_API(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define GAP_TRACE_WARNING(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} +#define GAP_TRACE_ERROR(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define GAP_TRACE_EVENT(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define GAP_TRACE_API(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define GAP_TRACE_WARNING(fmt, args...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} /* define traces for HID Host */ -#define HIDH_TRACE_ERROR(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define HIDH_TRACE_WARNING(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define HIDH_TRACE_API(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define HIDH_TRACE_EVENT(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define HIDH_TRACE_DEBUG(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define HIDH_TRACE_ERROR(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define HIDH_TRACE_WARNING(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define HIDH_TRACE_API(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define HIDH_TRACE_EVENT(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define HIDH_TRACE_DEBUG(fmt, args...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* define traces for BNEP */ -#define BNEP_TRACE_ERROR(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define BNEP_TRACE_WARNING(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define BNEP_TRACE_API(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define BNEP_TRACE_EVENT(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define BNEP_TRACE_DEBUG(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define BNEP_TRACE_ERROR(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define BNEP_TRACE_WARNING(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define BNEP_TRACE_API(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define BNEP_TRACE_EVENT(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define BNEP_TRACE_DEBUG(fmt, args...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* define traces for PAN */ -#define PAN_TRACE_ERROR(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define PAN_TRACE_WARNING(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define PAN_TRACE_API(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define PAN_TRACE_EVENT(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define PAN_TRACE_DEBUG(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define PAN_TRACE_ERROR(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define PAN_TRACE_WARNING(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define PAN_TRACE_API(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define PAN_TRACE_EVENT(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define PAN_TRACE_DEBUG(fmt, args...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Define tracing for the A2DP profile */ -#define A2D_TRACE_ERROR(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define A2D_TRACE_WARNING(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define A2D_TRACE_EVENT(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define A2D_TRACE_DEBUG(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define A2D_TRACE_API(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} +#define A2D_TRACE_ERROR(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define A2D_TRACE_WARNING(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define A2D_TRACE_EVENT(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define A2D_TRACE_DEBUG(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define A2D_TRACE_API(fmt, args...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} /* AVDTP */ -#define AVDT_TRACE_ERROR(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define AVDT_TRACE_WARNING(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define AVDT_TRACE_EVENT(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define AVDT_TRACE_DEBUG(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define AVDT_TRACE_API(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} +#define AVDT_TRACE_ERROR(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define AVDT_TRACE_WARNING(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define AVDT_TRACE_EVENT(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define AVDT_TRACE_DEBUG(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define AVDT_TRACE_API(fmt, args...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} /* Define tracing for the AVCTP protocol */ -#define AVCT_TRACE_ERROR(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define AVCT_TRACE_WARNING(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define AVCT_TRACE_EVENT(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define AVCT_TRACE_DEBUG(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define AVCT_TRACE_API(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} +#define AVCT_TRACE_ERROR(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define AVCT_TRACE_WARNING(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define AVCT_TRACE_EVENT(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define AVCT_TRACE_DEBUG(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define AVCT_TRACE_API(fmt, args...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} /* Define tracing for the AVRCP profile */ -#define AVRC_TRACE_ERROR(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define AVRC_TRACE_WARNING(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define AVRC_TRACE_EVENT(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define AVRC_TRACE_DEBUG(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define AVRC_TRACE_API(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} +#define AVRC_TRACE_ERROR(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define AVRC_TRACE_WARNING(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define AVRC_TRACE_EVENT(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define AVRC_TRACE_DEBUG(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define AVRC_TRACE_API(fmt, args...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} /* MCAP */ -#define MCA_TRACE_ERROR(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define MCA_TRACE_WARNING(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define MCA_TRACE_EVENT(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define MCA_TRACE_DEBUG(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define MCA_TRACE_API(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} +#define MCA_TRACE_ERROR(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define MCA_TRACE_WARNING(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define MCA_TRACE_EVENT(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define MCA_TRACE_DEBUG(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define MCA_TRACE_API(fmt, args...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} /* Define tracing for the ATT/GATT unit */ -#define GATT_TRACE_ERROR(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define GATT_TRACE_WARNING(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define GATT_TRACE_API(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define GATT_TRACE_EVENT(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define GATT_TRACE_DEBUG(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define GATT_TRACE_ERROR(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define GATT_TRACE_WARNING(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define GATT_TRACE_API(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define GATT_TRACE_EVENT(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define GATT_TRACE_DEBUG(fmt, args...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} /* Define tracing for the SMP unit */ -#define SMP_TRACE_ERROR(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define SMP_TRACE_WARNING(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define SMP_TRACE_API(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define SMP_TRACE_EVENT(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define SMP_TRACE_DEBUG(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} +#define SMP_TRACE_ERROR(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define SMP_TRACE_WARNING(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define SMP_TRACE_API(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define SMP_TRACE_EVENT(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define SMP_TRACE_DEBUG(fmt, args...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} extern UINT8 btif_trace_level; // define traces for application -#define BTIF_TRACE_ERROR(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define BTIF_TRACE_WARNING(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define BTIF_TRACE_API(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define BTIF_TRACE_EVENT(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define BTIF_TRACE_DEBUG(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define BTIF_TRACE_VERBOSE(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE)ets_printf(fmt, ## args);} +#define BTIF_TRACE_ERROR(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define BTIF_TRACE_WARNING(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define BTIF_TRACE_API(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define BTIF_TRACE_EVENT(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define BTIF_TRACE_DEBUG(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define BTIF_TRACE_VERBOSE(fmt, args...) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE)BT_PRINTF(fmt, ## args);} /* define traces for application */ -#define APPL_TRACE_ERROR(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) ets_printf(fmt, ## args);} -#define APPL_TRACE_WARNING(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) ets_printf(fmt, ## args);} -#define APPL_TRACE_API(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_API) ets_printf(fmt, ## args);} -#define APPL_TRACE_EVENT(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) ets_printf(fmt, ## args);} -#define APPL_TRACE_DEBUG(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) ets_printf(fmt, ## args);} -#define APPL_TRACE_VERBOSE(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE) ets_printf(fmt, ## args);} +#define APPL_TRACE_ERROR(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) BT_PRINTF(fmt, ## args);} +#define APPL_TRACE_WARNING(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) BT_PRINTF(fmt, ## args);} +#define APPL_TRACE_API(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_API) BT_PRINTF(fmt, ## args);} +#define APPL_TRACE_EVENT(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) BT_PRINTF(fmt, ## args);} +#define APPL_TRACE_DEBUG(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_PRINTF(fmt, ## args);} +#define APPL_TRACE_VERBOSE(fmt, args...) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE) BT_PRINTF(fmt, ## args);} /* Simplified Trace Helper Macro */ #define bdld(fmt, args...) \ do{\ if((MY_LOG_LEVEL) >= BT_TRACE_LEVEL_DEBUG) \ - ets_printf(fmt, ## args); \ + BT_PRINTF(fmt, ## args); \ }while(0) #define bdlw(fmt, args...) \ do{\ if((MY_LOG_LEVEL) >= BT_TRACE_LEVEL_DEBUG) \ - ets_printf(fmt, ## args); \ + BT_PRINTF(fmt, ## args); \ }while(0) #define bdle(fmt, args...) \ do{\ if((MY_LOG_LEVEL) >= BT_TRACE_LEVEL_DEBUG) \ - ets_printf(fmt, ## args); \ + BT_PRINTF(fmt, ## args); \ }while(0) #define bdla(assert_if) \ do{\ if(((MY_LOG_LEVEL) >= BT_TRACE_LEVEL_ERROR) && !(assert_if)) \ - ets_printf("%s: assert failed\n", #assert_if); \ + BT_PRINTF("%s: assert failed\n", #assert_if); \ }while(0) typedef UINT8 tBTTRC_PARAM_TYPE; diff --git a/components/bt/bluedroid/include/bt_vendor_lib.h b/components/bt/bluedroid/include/bt_vendor_lib.h old mode 100755 new mode 100644 index 3d563e1be..e3a8ec8db --- a/components/bt/bluedroid/include/bt_vendor_lib.h +++ b/components/bt/bluedroid/include/bt_vendor_lib.h @@ -30,142 +30,142 @@ /** Vendor specific operations OPCODE */ typedef enum { -/* [operation] - * Power on or off the BT Controller. - * [input param] - * A pointer to int type with content of bt_vendor_power_state_t. - * Typecasting conversion: (int *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Power on or off the BT Controller. + * [input param] + * A pointer to int type with content of bt_vendor_power_state_t. + * Typecasting conversion: (int *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_POWER_CTRL, -/* [operation] - * Perform any vendor specific initialization or configuration - * on the BT Controller. This is called before stack initialization. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call fwcfg_cb to notify the stack of the completion of vendor - * specific initialization once it has been done. - */ + /* [operation] + * Perform any vendor specific initialization or configuration + * on the BT Controller. This is called before stack initialization. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call fwcfg_cb to notify the stack of the completion of vendor + * specific initialization once it has been done. + */ BT_VND_OP_FW_CFG, -/* [operation] - * Perform any vendor specific SCO/PCM configuration on the BT Controller. - * This is called after stack initialization. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call scocfg_cb to notify the stack of the completion of vendor - * specific SCO configuration once it has been done. - */ + /* [operation] + * Perform any vendor specific SCO/PCM configuration on the BT Controller. + * This is called after stack initialization. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call scocfg_cb to notify the stack of the completion of vendor + * specific SCO configuration once it has been done. + */ BT_VND_OP_SCO_CFG, -/* [operation] - * Open UART port on where the BT Controller is attached. - * This is called before stack initialization. - * [input param] - * A pointer to int array type for open file descriptors. - * The mapping of HCI channel to fd slot in the int array is given in - * bt_vendor_hci_channels_t. - * And, it requires the vendor lib to fill up the content before returning - * the call. - * Typecasting conversion: (int (*)[]) param. - * [return] - * Numbers of opened file descriptors. - * Valid number: - * 1 - CMD/EVT/ACL-In/ACL-Out via the same fd (e.g. UART) - * 2 - CMD/EVT on one fd, and ACL-In/ACL-Out on the other fd - * 4 - CMD, EVT, ACL-In, ACL-Out are on their individual fd - * [callback] - * None. - */ + /* [operation] + * Open UART port on where the BT Controller is attached. + * This is called before stack initialization. + * [input param] + * A pointer to int array type for open file descriptors. + * The mapping of HCI channel to fd slot in the int array is given in + * bt_vendor_hci_channels_t. + * And, it requires the vendor lib to fill up the content before returning + * the call. + * Typecasting conversion: (int (*)[]) param. + * [return] + * Numbers of opened file descriptors. + * Valid number: + * 1 - CMD/EVT/ACL-In/ACL-Out via the same fd (e.g. UART) + * 2 - CMD/EVT on one fd, and ACL-In/ACL-Out on the other fd + * 4 - CMD, EVT, ACL-In, ACL-Out are on their individual fd + * [callback] + * None. + */ BT_VND_OP_USERIAL_OPEN, -/* [operation] - * Close the previously opened UART port. - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Close the previously opened UART port. + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_USERIAL_CLOSE, -/* [operation] - * Get the LPM idle timeout in milliseconds. - * The stack uses this information to launch a timer delay before it - * attempts to de-assert LPM WAKE signal once downstream HCI packet - * has been delivered. - * [input param] - * A pointer to uint32_t type which is passed in by the stack. And, it - * requires the vendor lib to fill up the content before returning - * the call. - * Typecasting conversion: (uint32_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Get the LPM idle timeout in milliseconds. + * The stack uses this information to launch a timer delay before it + * attempts to de-assert LPM WAKE signal once downstream HCI packet + * has been delivered. + * [input param] + * A pointer to uint32_t type which is passed in by the stack. And, it + * requires the vendor lib to fill up the content before returning + * the call. + * Typecasting conversion: (uint32_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_GET_LPM_IDLE_TIMEOUT, -/* [operation] - * Enable or disable LPM mode on BT Controller. - * [input param] - * A pointer to uint8_t type with content of bt_vendor_lpm_mode_t. - * Typecasting conversion: (uint8_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * Must call lpm_cb to notify the stack of the completion of LPM - * disable/enable process once it has been done. - */ + /* [operation] + * Enable or disable LPM mode on BT Controller. + * [input param] + * A pointer to uint8_t type with content of bt_vendor_lpm_mode_t. + * Typecasting conversion: (uint8_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * Must call lpm_cb to notify the stack of the completion of LPM + * disable/enable process once it has been done. + */ BT_VND_OP_LPM_SET_MODE, -/* [operation] - * Assert or Deassert LPM WAKE on BT Controller. - * [input param] - * A pointer to uint8_t type with content of bt_vendor_lpm_wake_state_t. - * Typecasting conversion: (uint8_t *) param. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Assert or Deassert LPM WAKE on BT Controller. + * [input param] + * A pointer to uint8_t type with content of bt_vendor_lpm_wake_state_t. + * Typecasting conversion: (uint8_t *) param. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_LPM_WAKE_SET_STATE, -/* [operation] - * Perform any vendor specific commands related to audio state changes. - * [input param] - * a pointer to bt_vendor_op_audio_state_t indicating what audio state is - * set. - * [return] - * 0 - default, don't care. - * [callback] - * None. - */ + /* [operation] + * Perform any vendor specific commands related to audio state changes. + * [input param] + * a pointer to bt_vendor_op_audio_state_t indicating what audio state is + * set. + * [return] + * 0 - default, don't care. + * [callback] + * None. + */ BT_VND_OP_SET_AUDIO_STATE, -/* [operation] - * The epilog call to the vendor module so that it can perform any - * vendor-specific processes (e.g. send a HCI_RESET to BT Controller) - * before the caller calls for cleanup(). - * [input param] - * None. - * [return] - * 0 - default, don't care. - * [callback] - * Must call epilog_cb to notify the stack of the completion of vendor - * specific epilog process once it has been done. - */ + /* [operation] + * The epilog call to the vendor module so that it can perform any + * vendor-specific processes (e.g. send a HCI_RESET to BT Controller) + * before the caller calls for cleanup(). + * [input param] + * None. + * [return] + * 0 - default, don't care. + * [callback] + * Must call epilog_cb to notify the stack of the completion of vendor + * specific epilog process once it has been done. + */ BT_VND_OP_EPILOG, } bt_vendor_opcode_t; @@ -257,7 +257,7 @@ typedef void (*cfg_result_cb)(bt_vendor_op_result_t result); * HC_BT_HDR.offset = 0; * HC_BT_HDR.layer_specific = 0; */ -typedef void* (*malloc_cb)(int size); +typedef void *(*malloc_cb)(int size); /* datapath buffer deallocation callback (callout) */ typedef void (*mdealloc_cb)(void *p_buf); @@ -336,7 +336,7 @@ typedef struct { * Caller will open the interface and pass in the callback routines * to the implemenation of this interface. */ - int (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr); + int (*init)(const bt_vendor_callbacks_t *p_cb, unsigned char *local_bdaddr); /** Vendor specific operations */ int (*op)(bt_vendor_opcode_t opcode, void *param); diff --git a/components/bt/bluedroid/include/bte.h b/components/bt/bluedroid/include/bte.h old mode 100755 new mode 100644 index 3338fd2d9..6a3ffe801 --- a/components/bt/bluedroid/include/bte.h +++ b/components/bt/bluedroid/include/bte.h @@ -37,13 +37,12 @@ #endif /* Target Modes (based on jumper settings on hardware [see user manual]) */ -enum -{ - /* BTE BBY */ - /* J3 J4 SW3-3 SW3-2 SW3-1 */ - /* -------------------------------------------- */ +enum { + /* BTE BBY */ + /* J3 J4 SW3-3 SW3-2 SW3-1 */ + /* -------------------------------------------- */ BTE_MODE_SERIAL_APP, /* OUT OUT OFF OFF OFF Sample serial port application */ - BTE_MODE_APPL, /* IN OUT OFF OFF ON Target used with Tester through RPC */ + BTE_MODE_APPL, /* IN OUT OFF OFF ON Target used with Tester through RPC */ BTE_MODE_RESERVED, /* OUT IN OFF ON OFF Reserved */ BTE_MODE_SAMPLE_APPS, /* IN IN OFF ON ON Sample applications (ICP/HSP) */ BTE_MODE_DONGLE, /* not yet supported ON OFF OFF Dongle mode */ @@ -67,7 +66,7 @@ void bte_get_startup_options(UINT32 *p_options); /* Platform specific fun #define BUILD_L2PING FALSE -#define LINUX_FM_DRIVER_INCLUDED FALSE +#define LINUX_FM_DRIVER_INCLUDED FALSE /* hcisu userial operations. should probably go into bt_types to avoid collisions! */ diff --git a/components/bt/bluedroid/main/bte_init.c b/components/bt/bluedroid/main/bte_init.c old mode 100755 new mode 100644 index 0cb24b8d0..9996129bc --- a/components/bt/bluedroid/main/bte_init.c +++ b/components/bt/bluedroid/main/bte_init.c @@ -183,14 +183,14 @@ void BTE_InitStack(void) //BTA Modules #if (BTA_INCLUDED == TRUE && BTA_DYNAMIC_MEMORY == TRUE) - memset((void*)bta_sys_cb_ptr, 0, sizeof(tBTA_SYS_CB)); - memset((void*)bta_dm_cb_ptr, 0, sizeof(tBTA_DM_CB)); - memset((void*)bta_dm_search_cb_ptr, 0, sizeof(tBTA_DM_SEARCH_CB)); - memset((void*)bta_dm_di_cb_ptr, 0, sizeof(tBTA_DM_DI_CB)); - memset((void*)bta_prm_cb_ptr, 0, sizeof(tBTA_PRM_CB)); - memset((void*)bta_ag_cb_ptr, 0, sizeof(tBTA_AG_CB)); + memset((void *)bta_sys_cb_ptr, 0, sizeof(tBTA_SYS_CB)); + memset((void *)bta_dm_cb_ptr, 0, sizeof(tBTA_DM_CB)); + memset((void *)bta_dm_search_cb_ptr, 0, sizeof(tBTA_DM_SEARCH_CB)); + memset((void *)bta_dm_di_cb_ptr, 0, sizeof(tBTA_DM_DI_CB)); + memset((void *)bta_prm_cb_ptr, 0, sizeof(tBTA_PRM_CB)); + memset((void *)bta_ag_cb_ptr, 0, sizeof(tBTA_AG_CB)); #if BTA_HS_INCLUDED == TRUE - memset((void*)bta_hs_cb_ptr, 0, sizeof(tBTA_HS_CB)); + memset((void *)bta_hs_cb_ptr, 0, sizeof(tBTA_HS_CB)); #endif #if BTA_AR_INCLUDED==TRUE memset((void *)bta_ar_cb_ptr, 0, sizeof(tBTA_AR_CB)); diff --git a/components/bt/bluedroid/main/bte_main.c b/components/bt/bluedroid/main/bte_main.c old mode 100755 new mode 100644 index bbe509a50..1cb3f3100 --- a/components/bt/bluedroid/main/bte_main.c +++ b/components/bt/bluedroid/main/bte_main.c @@ -117,24 +117,24 @@ int bte_main_boot_entry(bluedroid_init_done_cb_t cb) { if (gki_init()) { LOG_ERROR("%s: Init GKI Module Failure.\n", __func__); - return -1; - } + return -1; + } hci = hci_layer_get_interface(); if (!hci) { - LOG_ERROR("%s could not get hci layer interface.\n", __func__); - return -2; - } + LOG_ERROR("%s could not get hci layer interface.\n", __func__); + return -2; + } btu_hci_msg_queue = fixed_queue_new(SIZE_MAX); if (btu_hci_msg_queue == NULL) { - LOG_ERROR("%s unable to allocate hci message queue.\n", __func__); - return -3; + LOG_ERROR("%s unable to allocate hci message queue.\n", __func__); + return -3; } bluedroid_init_done_cb = cb; - //Caution: No event dispatcher defined now in hci layer + //Caution: No event dispatcher defined now in hci layer //data_dispatcher_register_default(hci->event_dispatcher, btu_hci_msg_queue); hci->set_data_queue(btu_hci_msg_queue); @@ -147,7 +147,7 @@ int bte_main_boot_entry(bluedroid_init_done_cb_t cb) //Enbale HCI bte_main_enable(); - return 0; + return 0; } /****************************************************************************** @@ -167,16 +167,16 @@ void bte_main_shutdown(void) btu_hci_msg_queue = NULL; -/* - module_clean_up(get_module(STACK_CONFIG_MODULE)); + /* + module_clean_up(get_module(STACK_CONFIG_MODULE)); - module_clean_up(get_module(COUNTER_MODULE)); - module_clean_up(get_module(GKI_MODULE)); -*/ + module_clean_up(get_module(COUNTER_MODULE)); + module_clean_up(get_module(GKI_MODULE)); + */ gki_clean_up(); - bte_main_disable(); + bte_main_disable(); } /****************************************************************************** @@ -214,12 +214,12 @@ static void bte_main_enable(void) ******************************************************************************/ static void bte_main_disable(void) { -/* - APPL_TRACE_DEBUG("%s", __FUNCTION__); + /* + APPL_TRACE_DEBUG("%s", __FUNCTION__); - module_shut_down(get_module(HCI_MODULE)); - module_shut_down(get_module(BTSNOOP_MODULE)); -*/ + module_shut_down(get_module(HCI_MODULE)); + module_shut_down(get_module(BTSNOOP_MODULE)); + */ hci_shut_down(); @@ -307,13 +307,10 @@ void bte_main_hci_send (BT_HDR *p_msg, UINT16 event) //counter_add("main.tx.packets", 1); //counter_add("main.tx.bytes", p_msg->len); - if((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || \ - (sub_event == LOCAL_BLE_CONTROLLER_ID)) - { + if ((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || \ + (sub_event == LOCAL_BLE_CONTROLLER_ID)) { hci->transmit_downward(event, p_msg); - } - else - { + } else { //APPL_TRACE_ERROR("Invalid Controller ID. Discarding message."); GKI_freebuf(p_msg); } diff --git a/components/bt/bluedroid/osi/alarm.c b/components/bt/bluedroid/osi/alarm.c old mode 100755 new mode 100644 index 9b24d8e5d..7eed98e7c --- a/components/bt/bluedroid/osi/alarm.c +++ b/components/bt/bluedroid/osi/alarm.c @@ -31,154 +31,161 @@ #define RTC_TIMER_TICKS_TO_MS(ticks) ((ticks/625)<<1 + (ticks-(ticks/625)*625)/312) -#define BT_ALARM_START_WAIT_TICKS 100 -#define BT_ALARM_STOP_WAIT_TICKS 100 -#define BT_ALARM_FREE_WAIT_TICKS 100 -#define BT_ALARM_CHG_PERIOD_WAIT_TICKS 100 +#define BT_ALARM_START_WAIT_TICKS 100 +#define BT_ALARM_STOP_WAIT_TICKS 100 +#define BT_ALARM_FREE_WAIT_TICKS 100 +#define BT_ALARM_CHG_PERIOD_WAIT_TICKS 100 static struct alarm_t alarm_cbs[ALARM_CBS_NUM]; void osi_alarm_init(void) { - memset(&alarm_cbs[0], 0x00, sizeof(alarm_cbs)); + memset(&alarm_cbs[0], 0x00, sizeof(alarm_cbs)); } static struct alarm_t *alarm_cbs_lookfor_available(void) { - int i; + int i; - for (i = 0; i < ALARM_CBS_NUM; i++) { - if (alarm_cbs[i].alarm_hdl == NULL) { //available - LOG_DEBUG(">>>> %d %08x<<<<\n", i, &alarm_cbs[i]); - return &alarm_cbs[i]; - } - } + for (i = 0; i < ALARM_CBS_NUM; i++) { + if (alarm_cbs[i].alarm_hdl == NULL) { //available + LOG_DEBUG(">>>> %d %08x<<<<\n", i, &alarm_cbs[i]); + return &alarm_cbs[i]; + } + } - return NULL; + return NULL; } static void alarm_cb_handler(TimerHandle_t xTimer) { - struct alarm_t *alarm; + struct alarm_t *alarm; - if (!xTimer) { - LOG_DEBUG("TimerName: NULL\n"); - return; - } + if (!xTimer) { + LOG_DEBUG("TimerName: NULL\n"); + return; + } - alarm = pvTimerGetTimerID(xTimer); - LOG_DEBUG("TimerID %08x, Name %s\n", alarm, pcTimerGetTimerName(xTimer)); - if (alarm->cb) { - alarm->cb(alarm->cb_data); - } + alarm = pvTimerGetTimerID(xTimer); + LOG_DEBUG("TimerID %08x, Name %s\n", alarm, pcTimerGetTimerName(xTimer)); + if (alarm->cb) { + alarm->cb(alarm->cb_data); + } } osi_alarm_t *osi_alarm_new(char *alarm_name, osi_alarm_callback_t callback, void *data, period_ms_t timer_expire, bool is_periodic) { - struct alarm_t *timer_id; - TimerHandle_t t; + struct alarm_t *timer_id; + TimerHandle_t t; - if (timer_expire == 0) - timer_expire = 1000; + if (timer_expire == 0) { + timer_expire = 1000; + } - /* TODO mutex lock */ - timer_id = alarm_cbs_lookfor_available(); - if (!timer_id) { - LOG_ERROR("%s full\n", __func__); - return NULL; - } + /* TODO mutex lock */ + timer_id = alarm_cbs_lookfor_available(); + if (!timer_id) { + LOG_ERROR("%s full\n", __func__); + return NULL; + } - portBASE_TYPE auto_reload = is_periodic ? pdTRUE : pdFALSE; - t = xTimerCreate(alarm_name, timer_expire / portTICK_PERIOD_MS, auto_reload, timer_id, alarm_cb_handler); - if (!t) { - LOG_ERROR("%s error\n", __func__); - return NULL; - } + portBASE_TYPE auto_reload = is_periodic ? pdTRUE : pdFALSE; + t = xTimerCreate(alarm_name, timer_expire / portTICK_PERIOD_MS, auto_reload, timer_id, alarm_cb_handler); + if (!t) { + LOG_ERROR("%s error\n", __func__); + return NULL; + } - timer_id->alarm_hdl = t; - timer_id->cb = callback; - timer_id->cb_data = data; - /* TODO mutex unlock */ + timer_id->alarm_hdl = t; + timer_id->cb = callback; + timer_id->cb_data = data; + /* TODO mutex unlock */ - return timer_id; + return timer_id; } int osi_alarm_free(osi_alarm_t *alarm) { - if (!alarm) { - LOG_ERROR("%s null\n", __func__); - return -1; - } + if (!alarm) { + LOG_ERROR("%s null\n", __func__); + return -1; + } - if (xTimerDelete(alarm->alarm_hdl, BT_ALARM_FREE_WAIT_TICKS) != pdPASS) { - LOG_ERROR("%s error\n", __func__); - return -2; - } + if (xTimerDelete(alarm->alarm_hdl, BT_ALARM_FREE_WAIT_TICKS) != pdPASS) { + LOG_ERROR("%s error\n", __func__); + return -2; + } - /* TODO mutex lock */ - memset(alarm, 0x00, sizeof(osi_alarm_t)); - /* TODO mutex unlock */ + /* TODO mutex lock */ + memset(alarm, 0x00, sizeof(osi_alarm_t)); + /* TODO mutex unlock */ - return 0; + return 0; } -int osi_alarm_set(osi_alarm_t *alarm, period_ms_t timeout) { - if (!alarm) { - LOG_ERROR("%s null\n", __func__); - return -1; - } +int osi_alarm_set(osi_alarm_t *alarm, period_ms_t timeout) +{ + if (!alarm) { + LOG_ERROR("%s null\n", __func__); + return -1; + } - if (xTimerChangePeriod(alarm->alarm_hdl, timeout / portTICK_PERIOD_MS, BT_ALARM_CHG_PERIOD_WAIT_TICKS) != pdPASS) { - LOG_ERROR("%s chg period error\n", __func__); - return -2; - } + if (xTimerChangePeriod(alarm->alarm_hdl, timeout / portTICK_PERIOD_MS, BT_ALARM_CHG_PERIOD_WAIT_TICKS) != pdPASS) { + LOG_ERROR("%s chg period error\n", __func__); + return -2; + } - if (xTimerStart(alarm->alarm_hdl, BT_ALARM_START_WAIT_TICKS) != pdPASS) { - LOG_ERROR("%s start error\n", __func__); - return -3; - } + if (xTimerStart(alarm->alarm_hdl, BT_ALARM_START_WAIT_TICKS) != pdPASS) { + LOG_ERROR("%s start error\n", __func__); + return -3; + } - return 0; + return 0; } -int osi_alarm_cancel(osi_alarm_t *alarm) { - if (!alarm) { - LOG_ERROR("%s null\n", __func__); - return -1; - } +int osi_alarm_cancel(osi_alarm_t *alarm) +{ + if (!alarm) { + LOG_ERROR("%s null\n", __func__); + return -1; + } - if (xTimerStop(alarm->alarm_hdl, BT_ALARM_STOP_WAIT_TICKS) != pdPASS) { - LOG_ERROR("%s error\n", __func__); - return -2; - } + if (xTimerStop(alarm->alarm_hdl, BT_ALARM_STOP_WAIT_TICKS) != pdPASS) { + LOG_ERROR("%s error\n", __func__); + return -2; + } - return 0; + return 0; } -static uint32_t alarm_current_tick(void) { - return xTaskGetTickCount(); +static uint32_t alarm_current_tick(void) +{ + return xTaskGetTickCount(); } // todo: this is not accurate // max return value: 0xffffffff / 312 = 13765920 = 0xD20D20 -period_ms_t osi_alarm_now(void) { - return RTC_TIMER_TICKS_TO_MS((alarm_current_tick())); +period_ms_t osi_alarm_now(void) +{ + return RTC_TIMER_TICKS_TO_MS((alarm_current_tick())); } period_ms_t osi_alarm_get_remaining_ms(const osi_alarm_t *alarm) { - /* TODO: use FreeRTOS timer.c implement ??? */ - return 0xffffffff; + /* TODO: use FreeRTOS timer.c implement ??? */ + return 0xffffffff; } // pre-condition: 0 <= t1, t2 <= 0xD20D20 // return value: 0<= ret <=0XD20D20 -period_ms_t osi_alarm_time_diff(period_ms_t t1, period_ms_t t2) { +period_ms_t osi_alarm_time_diff(period_ms_t t1, period_ms_t t2) +{ #define MAX_ALARM_TIME_MS (0xD20D20) - int32_t diff = (int32_t)(t1) - (int32_t)(t2); - if (diff < 0) - diff += MAX_ALARM_TIME_MS; - return (period_ms_t)diff; + int32_t diff = (int32_t)(t1) - (int32_t)(t2); + if (diff < 0) { + diff += MAX_ALARM_TIME_MS; + } + return (period_ms_t)diff; } diff --git a/components/bt/bluedroid/osi/allocator.c b/components/bt/bluedroid/osi/allocator.c old mode 100755 new mode 100644 index 2e42c0316..ded28f2a3 --- a/components/bt/bluedroid/osi/allocator.c +++ b/components/bt/bluedroid/osi/allocator.c @@ -24,35 +24,40 @@ extern void *pvPortZalloc(size_t size); extern void vPortFree(void *pv); -char *osi_strdup(const char *str) { - size_t size = strlen(str) + 1; // + 1 for the null terminator - char *new_string = (char *)calloc(1, size); +char *osi_strdup(const char *str) +{ + size_t size = strlen(str) + 1; // + 1 for the null terminator + char *new_string = (char *)calloc(1, size); - if (!new_string) - return NULL; + if (!new_string) { + return NULL; + } - memcpy(new_string, str, size); - return new_string; + memcpy(new_string, str, size); + return new_string; } -void *osi_malloc(size_t size) { - return calloc(1, size); +void *osi_malloc(size_t size) +{ + return calloc(1, size); } -void *osi_calloc(size_t size) { - return calloc(1, size); +void *osi_calloc(size_t size) +{ + return calloc(1, size); } -void osi_free(void *ptr) { - free(ptr); +void osi_free(void *ptr) +{ + free(ptr); } const allocator_t allocator_malloc = { - osi_malloc, - osi_free + osi_malloc, + osi_free }; const allocator_t allocator_calloc = { - osi_calloc, - osi_free + osi_calloc, + osi_free }; diff --git a/components/bt/bluedroid/osi/buffer.c b/components/bt/bluedroid/osi/buffer.c old mode 100755 new mode 100644 index 4b96e2df2..cb02f26a8 --- a/components/bt/bluedroid/osi/buffer.c +++ b/components/bt/bluedroid/osi/buffer.c @@ -23,74 +23,82 @@ #include "bt_trace.h" struct buffer_t { - buffer_t *root; - size_t refcount; - size_t length; - uint8_t data[]; + buffer_t *root; + size_t refcount; + size_t length; + uint8_t data[]; }; -buffer_t *buffer_new(size_t size) { - assert(size > 0); +buffer_t *buffer_new(size_t size) +{ + assert(size > 0); - buffer_t *buffer = osi_malloc(sizeof(buffer_t) + size); - if (!buffer) { - LOG_ERROR("%s unable to allocate buffer of %zu bytes.", __func__, size); - return NULL; - } + buffer_t *buffer = osi_malloc(sizeof(buffer_t) + size); + if (!buffer) { + LOG_ERROR("%s unable to allocate buffer of %zu bytes.", __func__, size); + return NULL; + } - buffer->root = buffer; - buffer->refcount = 1; - buffer->length = size; + buffer->root = buffer; + buffer->refcount = 1; + buffer->length = size; - return buffer; + return buffer; } -buffer_t *buffer_new_ref(const buffer_t *buf) { - assert(buf != NULL); - return buffer_new_slice(buf, buf->length); +buffer_t *buffer_new_ref(const buffer_t *buf) +{ + assert(buf != NULL); + return buffer_new_slice(buf, buf->length); } -buffer_t *buffer_new_slice(const buffer_t *buf, size_t slice_size) { - assert(buf != NULL); - assert(slice_size > 0); - assert(slice_size <= buf->length); +buffer_t *buffer_new_slice(const buffer_t *buf, size_t slice_size) +{ + assert(buf != NULL); + assert(slice_size > 0); + assert(slice_size <= buf->length); - buffer_t *ret = osi_calloc(sizeof(buffer_t)); - if (!ret) { - LOG_ERROR("%s unable to allocate new buffer for slice of length %zu.", __func__, slice_size); - return NULL; - } + buffer_t *ret = osi_calloc(sizeof(buffer_t)); + if (!ret) { + LOG_ERROR("%s unable to allocate new buffer for slice of length %zu.", __func__, slice_size); + return NULL; + } - ret->root = buf->root; - ret->refcount = SIZE_MAX; - ret->length = slice_size; + ret->root = buf->root; + ret->refcount = SIZE_MAX; + ret->length = slice_size; - ++buf->root->refcount; + ++buf->root->refcount; - return ret; + return ret; } -void buffer_free(buffer_t *buffer) { - if (!buffer) - return; +void buffer_free(buffer_t *buffer) +{ + if (!buffer) { + return; + } - if (buffer->root != buffer) { - // We're a leaf node. Delete the root node if we're the last referent. - if (--buffer->root->refcount == 0) - osi_free(buffer->root); - osi_free(buffer); - } else if (--buffer->refcount == 0) { - // We're a root node. Roots are only deleted when their refcount goes to 0. - osi_free(buffer); - } + if (buffer->root != buffer) { + // We're a leaf node. Delete the root node if we're the last referent. + if (--buffer->root->refcount == 0) { + osi_free(buffer->root); + } + osi_free(buffer); + } else if (--buffer->refcount == 0) { + // We're a root node. Roots are only deleted when their refcount goes to 0. + osi_free(buffer); + } } -void *buffer_ptr(const buffer_t *buf) { - assert(buf != NULL); - return buf->root->data + buf->root->length - buf->length; +void *buffer_ptr(const buffer_t *buf) +{ + assert(buf != NULL); + return buf->root->data + buf->root->length - buf->length; } -size_t buffer_length(const buffer_t *buf) { - assert(buf != NULL); - return buf->length; +size_t buffer_length(const buffer_t *buf) +{ + assert(buf != NULL); + return buf->length; } diff --git a/components/bt/bluedroid/osi/fixed_queue.c b/components/bt/bluedroid/osi/fixed_queue.c old mode 100755 new mode 100644 index fa5a752a7..5f3f2a3df --- a/components/bt/bluedroid/osi/fixed_queue.c +++ b/components/bt/bluedroid/osi/fixed_queue.c @@ -25,114 +25,126 @@ #include "bt_trace.h" typedef struct fixed_queue_t { - - list_t *list; - osi_sem_t enqueue_sem; - osi_sem_t dequeue_sem; - pthread_mutex_t lock; - size_t capacity; - fixed_queue_cb dequeue_ready; -/* - reactor_object_t *dequeue_object; - fixed_queue_cb dequeue_ready; - void *dequeue_context; -*/ + list_t *list; + osi_sem_t enqueue_sem; + osi_sem_t dequeue_sem; + pthread_mutex_t lock; + size_t capacity; + + fixed_queue_cb dequeue_ready; + /* + reactor_object_t *dequeue_object; + fixed_queue_cb dequeue_ready; + void *dequeue_context; + */ } fixed_queue_t; //static void internal_dequeue_ready(void *context); -fixed_queue_t *fixed_queue_new(size_t capacity) { - fixed_queue_t *ret = osi_calloc(sizeof(fixed_queue_t)); - if (!ret) - goto error; +fixed_queue_t *fixed_queue_new(size_t capacity) +{ + fixed_queue_t *ret = osi_calloc(sizeof(fixed_queue_t)); + if (!ret) { + goto error; + } - pthread_mutex_init(&ret->lock, NULL); - ret->capacity = capacity; + pthread_mutex_init(&ret->lock, NULL); + ret->capacity = capacity; - ret->list = list_new(NULL); - if (!ret->list) - goto error; + ret->list = list_new(NULL); + if (!ret->list) { + goto error; + } - osi_sem_new(&ret->enqueue_sem, capacity, capacity); - if (!ret->enqueue_sem) - goto error; + osi_sem_new(&ret->enqueue_sem, capacity, capacity); + if (!ret->enqueue_sem) { + goto error; + } - osi_sem_new(&ret->dequeue_sem, capacity, 0); - if (!ret->dequeue_sem) - goto error; + osi_sem_new(&ret->dequeue_sem, capacity, 0); + if (!ret->dequeue_sem) { + goto error; + } - return ret; + return ret; error:; - fixed_queue_free(ret, NULL); - return NULL; + fixed_queue_free(ret, NULL); + return NULL; } -void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb) { - const list_node_t *node; - if (!queue) - return; +void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb) +{ + const list_node_t *node; + if (!queue) { + return; + } // fixed_queue_unregister_dequeue(queue); - if (free_cb) - for (node = list_begin(queue->list); node != list_end(queue->list); node = list_next(node)) - free_cb(list_node(node)); + if (free_cb) + for (node = list_begin(queue->list); node != list_end(queue->list); node = list_next(node)) { + free_cb(list_node(node)); + } - list_free(queue->list); - osi_sem_free(&queue->enqueue_sem); - osi_sem_free(&queue->dequeue_sem); - pthread_mutex_destroy(&queue->lock); - osi_free(queue); + list_free(queue->list); + osi_sem_free(&queue->enqueue_sem); + osi_sem_free(&queue->dequeue_sem); + pthread_mutex_destroy(&queue->lock); + osi_free(queue); } -bool fixed_queue_is_empty(fixed_queue_t *queue) { - bool is_empty = false; - assert(queue != NULL); +bool fixed_queue_is_empty(fixed_queue_t *queue) +{ + bool is_empty = false; + assert(queue != NULL); - pthread_mutex_lock(&queue->lock); - is_empty = list_is_empty(queue->list); - pthread_mutex_unlock(&queue->lock); + pthread_mutex_lock(&queue->lock); + is_empty = list_is_empty(queue->list); + pthread_mutex_unlock(&queue->lock); - return is_empty; + return is_empty; } -size_t fixed_queue_capacity(fixed_queue_t *queue) { - assert(queue != NULL); +size_t fixed_queue_capacity(fixed_queue_t *queue) +{ + assert(queue != NULL); - return queue->capacity; + return queue->capacity; } -void fixed_queue_enqueue(fixed_queue_t *queue, void *data) { - assert(queue != NULL); - assert(data != NULL); +void fixed_queue_enqueue(fixed_queue_t *queue, void *data) +{ + assert(queue != NULL); + assert(data != NULL); - osi_sem_wait(&queue->enqueue_sem, 0); - - pthread_mutex_lock(&queue->lock); + osi_sem_wait(&queue->enqueue_sem, 0); - list_append(queue->list, data); - pthread_mutex_unlock(&queue->lock); + pthread_mutex_lock(&queue->lock); - osi_sem_signal(&queue->dequeue_sem); + list_append(queue->list, data); + pthread_mutex_unlock(&queue->lock); + + osi_sem_signal(&queue->dequeue_sem); } -void *fixed_queue_dequeue(fixed_queue_t *queue) { - void *ret = NULL; - assert(queue != NULL); +void *fixed_queue_dequeue(fixed_queue_t *queue) +{ + void *ret = NULL; + assert(queue != NULL); - osi_sem_wait(&queue->dequeue_sem, 0); + osi_sem_wait(&queue->dequeue_sem, 0); - pthread_mutex_lock(&queue->lock); - ret = list_front(queue->list); - list_remove(queue->list, ret); - pthread_mutex_unlock(&queue->lock); + pthread_mutex_lock(&queue->lock); + ret = list_front(queue->list); + list_remove(queue->list, ret); + pthread_mutex_unlock(&queue->lock); - osi_sem_signal(&queue->enqueue_sem); + osi_sem_signal(&queue->enqueue_sem); - return ret; + return ret; } /* @@ -158,25 +170,30 @@ int fixed_queue_get_dequeue_fd(const fixed_queue_t *queue) { return semaphore_get_fd(queue->dequeue_sem); } */ -void fixed_queue_register_dequeue(fixed_queue_t *queue, fixed_queue_cb ready_cb) { - assert(queue != NULL); - assert(ready_cb != NULL); +void fixed_queue_register_dequeue(fixed_queue_t *queue, fixed_queue_cb ready_cb) +{ + assert(queue != NULL); + assert(ready_cb != NULL); - queue->dequeue_ready = ready_cb; + queue->dequeue_ready = ready_cb; } -void fixed_queue_unregister_dequeue(fixed_queue_t *queue) { - assert(queue != NULL); +void fixed_queue_unregister_dequeue(fixed_queue_t *queue) +{ + assert(queue != NULL); - queue->dequeue_ready = NULL; + queue->dequeue_ready = NULL; } -void fixed_queue_process(fixed_queue_t *queue) { - if (queue == NULL) - return; +void fixed_queue_process(fixed_queue_t *queue) +{ + if (queue == NULL) { + return; + } - if (queue->dequeue_ready) - queue->dequeue_ready(queue); + if (queue->dequeue_ready) { + queue->dequeue_ready(queue); + } } /* static void internal_dequeue_ready(void *context) { diff --git a/components/bt/bluedroid/osi/future.c b/components/bt/bluedroid/osi/future.c index 7c816f9e4..b2dc40465 100644 --- a/components/bt/bluedroid/osi/future.c +++ b/components/bt/bluedroid/osi/future.c @@ -27,74 +27,82 @@ #include "osi_arch.h" struct future_t { - bool ready_can_be_called; - osi_sem_t semaphore; // NULL semaphore means immediate future - void *result; + bool ready_can_be_called; + osi_sem_t semaphore; // NULL semaphore means immediate future + void *result; }; static void future_free(future_t *future); -future_t *future_new(void) { - future_t *ret = osi_calloc(sizeof(future_t)); - if (!ret) { - LOG_ERROR("%s unable to allocate memory for return value.", __func__); - goto error; - } +future_t *future_new(void) +{ + future_t *ret = osi_calloc(sizeof(future_t)); + if (!ret) { + LOG_ERROR("%s unable to allocate memory for return value.", __func__); + goto error; + } - if (osi_sem_new(&ret->semaphore, 1, 0)!=0) { - LOG_ERROR("%s unable to allocate memory for the semaphore.", __func__); - goto error; - } + if (osi_sem_new(&ret->semaphore, 1, 0) != 0) { + LOG_ERROR("%s unable to allocate memory for the semaphore.", __func__); + goto error; + } - ret->ready_can_be_called = true; - return ret; + ret->ready_can_be_called = true; + return ret; error:; - future_free(ret); - return NULL; + future_free(ret); + return NULL; } -future_t *future_new_immediate(void *value) { - future_t *ret = osi_calloc(sizeof(future_t)); - if (!ret) { - LOG_ERROR("%s unable to allocate memory for return value.", __func__); - goto error; - } +future_t *future_new_immediate(void *value) +{ + future_t *ret = osi_calloc(sizeof(future_t)); + if (!ret) { + LOG_ERROR("%s unable to allocate memory for return value.", __func__); + goto error; + } - ret->result = value; - ret->ready_can_be_called = false; - return ret; + ret->result = value; + ret->ready_can_be_called = false; + return ret; error:; - future_free(ret); - return NULL; + future_free(ret); + return NULL; } -void future_ready(future_t *future, void *value) { - assert(future != NULL); - assert(future->ready_can_be_called); +void future_ready(future_t *future, void *value) +{ + assert(future != NULL); + assert(future->ready_can_be_called); - future->ready_can_be_called = false; - future->result = value; - osi_sem_signal(&future->semaphore); + future->ready_can_be_called = false; + future->result = value; + osi_sem_signal(&future->semaphore); } -void *future_await(future_t *future) { - assert(future != NULL); +void *future_await(future_t *future) +{ + assert(future != NULL); - // If the future is immediate, it will not have a semaphore - if (future->semaphore) - osi_sem_wait(&future->semaphore, 0); + // If the future is immediate, it will not have a semaphore + if (future->semaphore) { + osi_sem_wait(&future->semaphore, 0); + } - void *result = future->result; - future_free(future); - return result; + void *result = future->result; + future_free(future); + return result; } -static void future_free(future_t *future) { - if (!future) - return; +static void future_free(future_t *future) +{ + if (!future) { + return; + } - if (!future->semaphore) - osi_sem_free(&future->semaphore); + if (!future->semaphore) { + osi_sem_free(&future->semaphore); + } - osi_free(future); + osi_free(future); } diff --git a/components/bt/bluedroid/osi/hash_functions.c b/components/bt/bluedroid/osi/hash_functions.c old mode 100755 new mode 100644 index f279bd456..0cfd3f52d --- a/components/bt/bluedroid/osi/hash_functions.c +++ b/components/bt/bluedroid/osi/hash_functions.c @@ -20,23 +20,28 @@ #include "hash_functions.h" -hash_index_t hash_function_naive(const void *key) { - return (hash_index_t)key; +hash_index_t hash_function_naive(const void *key) +{ + return (hash_index_t)key; } -hash_index_t hash_function_integer(const void *key) { - return ((hash_index_t)key) * 2654435761; +hash_index_t hash_function_integer(const void *key) +{ + return ((hash_index_t)key) * 2654435761; } -hash_index_t hash_function_pointer(const void *key) { - return ((hash_index_t)key) * 2654435761; +hash_index_t hash_function_pointer(const void *key) +{ + return ((hash_index_t)key) * 2654435761; } -hash_index_t hash_function_string(const void *key) { - hash_index_t hash = 5381; - const char *name = (const char *)key; - size_t string_len = strlen(name); - for (size_t i = 0; i < string_len; ++i) - hash = ((hash << 5) + hash ) + name[i]; - return hash; +hash_index_t hash_function_string(const void *key) +{ + hash_index_t hash = 5381; + const char *name = (const char *)key; + size_t string_len = strlen(name); + for (size_t i = 0; i < string_len; ++i) { + hash = ((hash << 5) + hash ) + name[i]; + } + return hash; } diff --git a/components/bt/bluedroid/osi/hash_map.c b/components/bt/bluedroid/osi/hash_map.c old mode 100755 new mode 100644 index 9a18fb78a..41ae98339 --- a/components/bt/bluedroid/osi/hash_map.c +++ b/components/bt/bluedroid/osi/hash_map.c @@ -25,18 +25,18 @@ struct hash_map_t; typedef struct hash_map_bucket_t { - list_t *list; + list_t *list; } hash_map_bucket_t; typedef struct hash_map_t { - hash_map_bucket_t *bucket; - size_t num_bucket; - size_t hash_size; - hash_index_fn hash_fn; - key_free_fn key_fn; - data_free_fn data_fn; - const allocator_t *allocator; - key_equality_fn keys_are_equal; + hash_map_bucket_t *bucket; + size_t num_bucket; + size_t hash_size; + hash_index_fn hash_fn; + key_free_fn key_fn; + data_free_fn data_fn; + const allocator_t *allocator; + key_equality_fn keys_are_equal; } hash_map_t; // Hidden constructor for list, only to be used by us. @@ -45,7 +45,7 @@ list_t *list_new_internal(list_free_cb callback, const allocator_t *zeroed_alloc static void bucket_free_(void *data); static bool default_key_equality(const void *x, const void *y); static hash_map_entry_t *find_bucket_entry_(list_t *hash_bucket_list, - const void *key); + const void *key); // Hidden constructor, only to be used by the allocation tracker. Behaves the same as // |hash_map_new|, except you get to specify the allocator. @@ -55,28 +55,30 @@ hash_map_t *hash_map_new_internal( key_free_fn key_fn, data_free_fn data_fn, key_equality_fn equality_fn, - const allocator_t *zeroed_allocator) { - assert(hash_fn != NULL); - assert(num_bucket > 0); - assert(zeroed_allocator != NULL); + const allocator_t *zeroed_allocator) +{ + assert(hash_fn != NULL); + assert(num_bucket > 0); + assert(zeroed_allocator != NULL); - hash_map_t *hash_map = zeroed_allocator->alloc(sizeof(hash_map_t)); - if (hash_map == NULL) - return NULL; + hash_map_t *hash_map = zeroed_allocator->alloc(sizeof(hash_map_t)); + if (hash_map == NULL) { + return NULL; + } - hash_map->hash_fn = hash_fn; - hash_map->key_fn = key_fn; - hash_map->data_fn = data_fn; - hash_map->allocator = zeroed_allocator; - hash_map->keys_are_equal = equality_fn ? equality_fn : default_key_equality; + hash_map->hash_fn = hash_fn; + hash_map->key_fn = key_fn; + hash_map->data_fn = data_fn; + hash_map->allocator = zeroed_allocator; + hash_map->keys_are_equal = equality_fn ? equality_fn : default_key_equality; - hash_map->num_bucket = num_bucket; - hash_map->bucket = zeroed_allocator->alloc(sizeof(hash_map_bucket_t) * num_bucket); - if (hash_map->bucket == NULL) { - zeroed_allocator->free(hash_map); - return NULL; - } - return hash_map; + hash_map->num_bucket = num_bucket; + hash_map->bucket = zeroed_allocator->alloc(sizeof(hash_map_bucket_t) * num_bucket); + if (hash_map->bucket == NULL) { + zeroed_allocator->free(hash_map); + return NULL; + } + return hash_map; } hash_map_t *hash_map_new( @@ -84,16 +86,19 @@ hash_map_t *hash_map_new( hash_index_fn hash_fn, key_free_fn key_fn, data_free_fn data_fn, - key_equality_fn equality_fn) { - return hash_map_new_internal(num_bucket, hash_fn, key_fn, data_fn, equality_fn, &allocator_calloc); + key_equality_fn equality_fn) +{ + return hash_map_new_internal(num_bucket, hash_fn, key_fn, data_fn, equality_fn, &allocator_calloc); } -void hash_map_free(hash_map_t *hash_map) { - if (hash_map == NULL) - return; - hash_map_clear(hash_map); - hash_map->allocator->free(hash_map->bucket); - hash_map->allocator->free(hash_map); +void hash_map_free(hash_map_t *hash_map) +{ + if (hash_map == NULL) { + return; + } + hash_map_clear(hash_map); + hash_map->allocator->free(hash_map->bucket); + hash_map->allocator->free(hash_map); } /* @@ -113,135 +118,153 @@ size_t hash_map_num_buckets(const hash_map_t *hash_map) { } */ -bool hash_map_has_key(const hash_map_t *hash_map, const void *key) { - assert(hash_map != NULL); +bool hash_map_has_key(const hash_map_t *hash_map, const void *key) +{ + assert(hash_map != NULL); - hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; - list_t *hash_bucket_list = hash_map->bucket[hash_key].list; + hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; + list_t *hash_bucket_list = hash_map->bucket[hash_key].list; - hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); - return (hash_map_entry != NULL); + hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); + return (hash_map_entry != NULL); } -bool hash_map_set(hash_map_t *hash_map, const void *key, void *data) { - assert(hash_map != NULL); - assert(data != NULL); +bool hash_map_set(hash_map_t *hash_map, const void *key, void *data) +{ + assert(hash_map != NULL); + assert(data != NULL); - hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; + hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; - if (hash_map->bucket[hash_key].list == NULL) { - hash_map->bucket[hash_key].list = list_new_internal(bucket_free_, hash_map->allocator); - if (hash_map->bucket[hash_key].list == NULL) + if (hash_map->bucket[hash_key].list == NULL) { + hash_map->bucket[hash_key].list = list_new_internal(bucket_free_, hash_map->allocator); + if (hash_map->bucket[hash_key].list == NULL) { + return false; + } + } + list_t *hash_bucket_list = hash_map->bucket[hash_key].list; + + hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); + + if (hash_map_entry) { + // Calls hash_map callback to delete the hash_map_entry. + bool rc = list_remove(hash_bucket_list, hash_map_entry); + assert(rc == true); + } else { + hash_map->hash_size++; + } + hash_map_entry = hash_map->allocator->alloc(sizeof(hash_map_entry_t)); + if (hash_map_entry == NULL) { return false; - } - list_t *hash_bucket_list = hash_map->bucket[hash_key].list; - - hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); - - if (hash_map_entry) { - // Calls hash_map callback to delete the hash_map_entry. - bool rc = list_remove(hash_bucket_list, hash_map_entry); - assert(rc == true); - } else { - hash_map->hash_size++; - } - hash_map_entry = hash_map->allocator->alloc(sizeof(hash_map_entry_t)); - if (hash_map_entry == NULL) - return false; - - hash_map_entry->key = key; - hash_map_entry->data = data; - hash_map_entry->hash_map = hash_map; - - return list_append(hash_bucket_list, hash_map_entry); -} - -bool hash_map_erase(hash_map_t *hash_map, const void *key) { - assert(hash_map != NULL); - - hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; - list_t *hash_bucket_list = hash_map->bucket[hash_key].list; - - hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); - if (hash_map_entry == NULL) { - return false; - } - - hash_map->hash_size--; - - return list_remove(hash_bucket_list, hash_map_entry); -} - -void *hash_map_get(const hash_map_t *hash_map, const void *key) { - assert(hash_map != NULL); - - hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; - list_t *hash_bucket_list = hash_map->bucket[hash_key].list; - - hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); - if (hash_map_entry != NULL) - return hash_map_entry->data; - - return NULL; -} - -void hash_map_clear(hash_map_t *hash_map) { - assert(hash_map != NULL); - - for (hash_index_t i = 0; i < hash_map->num_bucket; i++){ - if (hash_map->bucket[i].list == NULL) - continue; - list_free(hash_map->bucket[i].list); - hash_map->bucket[i].list = NULL; - } -} - -void hash_map_foreach(hash_map_t *hash_map, hash_map_iter_cb callback, void *context) { - assert(hash_map != NULL); - assert(callback != NULL); - - for (hash_index_t i = 0; i < hash_map->num_bucket; ++i){ - if (hash_map->bucket[i].list == NULL) - continue; - for (const list_node_t *iter = list_begin(hash_map->bucket[i].list); - iter != list_end(hash_map->bucket[i].list); - iter = list_next(iter)) { - hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)list_node(iter); - if (!callback(hash_map_entry, context)) - return; } - } + + hash_map_entry->key = key; + hash_map_entry->data = data; + hash_map_entry->hash_map = hash_map; + + return list_append(hash_bucket_list, hash_map_entry); } -static void bucket_free_(void *data) { - assert(data != NULL); - hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)data; - const hash_map_t *hash_map = hash_map_entry->hash_map; +bool hash_map_erase(hash_map_t *hash_map, const void *key) +{ + assert(hash_map != NULL); - if (hash_map->key_fn) - hash_map->key_fn((void *)hash_map_entry->key); - if (hash_map->data_fn) - hash_map->data_fn(hash_map_entry->data); - hash_map->allocator->free(hash_map_entry); + hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; + list_t *hash_bucket_list = hash_map->bucket[hash_key].list; + + hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); + if (hash_map_entry == NULL) { + return false; + } + + hash_map->hash_size--; + + return list_remove(hash_bucket_list, hash_map_entry); } -static hash_map_entry_t * find_bucket_entry_(list_t *hash_bucket_list, - const void *key) { +void *hash_map_get(const hash_map_t *hash_map, const void *key) +{ + assert(hash_map != NULL); + + hash_index_t hash_key = hash_map->hash_fn(key) % hash_map->num_bucket; + list_t *hash_bucket_list = hash_map->bucket[hash_key].list; + + hash_map_entry_t *hash_map_entry = find_bucket_entry_(hash_bucket_list, key); + if (hash_map_entry != NULL) { + return hash_map_entry->data; + } - if (hash_bucket_list == NULL) return NULL; +} - for (const list_node_t *iter = list_begin(hash_bucket_list); - iter != list_end(hash_bucket_list); - iter = list_next(iter)) { - hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)list_node(iter); - if (hash_map_entry->hash_map->keys_are_equal(hash_map_entry->key, key)) { - return hash_map_entry; +void hash_map_clear(hash_map_t *hash_map) +{ + assert(hash_map != NULL); + + for (hash_index_t i = 0; i < hash_map->num_bucket; i++) { + if (hash_map->bucket[i].list == NULL) { + continue; + } + list_free(hash_map->bucket[i].list); + hash_map->bucket[i].list = NULL; } - } - return NULL; } -static bool default_key_equality(const void *x, const void *y) { - return x == y; +void hash_map_foreach(hash_map_t *hash_map, hash_map_iter_cb callback, void *context) +{ + assert(hash_map != NULL); + assert(callback != NULL); + + for (hash_index_t i = 0; i < hash_map->num_bucket; ++i) { + if (hash_map->bucket[i].list == NULL) { + continue; + } + for (const list_node_t *iter = list_begin(hash_map->bucket[i].list); + iter != list_end(hash_map->bucket[i].list); + iter = list_next(iter)) { + hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)list_node(iter); + if (!callback(hash_map_entry, context)) { + return; + } + } + } +} + +static void bucket_free_(void *data) +{ + assert(data != NULL); + hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)data; + const hash_map_t *hash_map = hash_map_entry->hash_map; + + if (hash_map->key_fn) { + hash_map->key_fn((void *)hash_map_entry->key); + } + if (hash_map->data_fn) { + hash_map->data_fn(hash_map_entry->data); + } + hash_map->allocator->free(hash_map_entry); +} + +static hash_map_entry_t *find_bucket_entry_(list_t *hash_bucket_list, + const void *key) +{ + + if (hash_bucket_list == NULL) { + return NULL; + } + + for (const list_node_t *iter = list_begin(hash_bucket_list); + iter != list_end(hash_bucket_list); + iter = list_next(iter)) { + hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)list_node(iter); + if (hash_map_entry->hash_map->keys_are_equal(hash_map_entry->key, key)) { + return hash_map_entry; + } + } + return NULL; +} + +static bool default_key_equality(const void *x, const void *y) +{ + return x == y; } diff --git a/components/bt/bluedroid/osi/include/alarm.h b/components/bt/bluedroid/osi/include/alarm.h old mode 100755 new mode 100644 index 4fea94c3e..480bf73d2 --- a/components/bt/bluedroid/osi/include/alarm.h +++ b/components/bt/bluedroid/osi/include/alarm.h @@ -27,13 +27,13 @@ typedef uint32_t period_ms_t; typedef void (*osi_alarm_callback_t)(void *data); -#define ALARM_CBS_NUM 20 -#define ALARM_ID_BASE 1000 +#define ALARM_CBS_NUM 20 +#define ALARM_ID_BASE 1000 typedef struct alarm_t { - /* timer id point to here */ - TimerHandle_t alarm_hdl; - osi_alarm_callback_t cb; - void *cb_data; + /* timer id point to here */ + TimerHandle_t alarm_hdl; + osi_alarm_callback_t cb; + void *cb_data; } osi_alarm_t; void osi_alarm_init(void); diff --git a/components/bt/bluedroid/osi/include/allocator.h b/components/bt/bluedroid/osi/include/allocator.h old mode 100755 new mode 100644 index 74bdfb73a..d7df1f205 --- a/components/bt/bluedroid/osi/include/allocator.h +++ b/components/bt/bluedroid/osi/include/allocator.h @@ -26,8 +26,8 @@ typedef void *(*alloc_fn)(size_t size); typedef void (*free_fn)(void *ptr); typedef struct { - alloc_fn alloc; - free_fn free; + alloc_fn alloc; + free_fn free; } allocator_t; // allocator_t abstractions for the osi_*alloc and osi_free functions diff --git a/components/bt/bluedroid/osi/include/hash_map.h b/components/bt/bluedroid/osi/include/hash_map.h old mode 100755 new mode 100644 index 6b8220b6c..fea1e0212 --- a/components/bt/bluedroid/osi/include/hash_map.h +++ b/components/bt/bluedroid/osi/include/hash_map.h @@ -26,9 +26,9 @@ struct hash_map_t; typedef struct hash_map_t hash_map_t; typedef struct hash_map_entry_t { - const void *key; - void *data; - const hash_map_t *hash_map; + const void *key; + void *data; + const hash_map_t *hash_map; } hash_map_entry_t; typedef size_t hash_index_t; diff --git a/components/bt/bluedroid/osi/include/thread.h b/components/bt/bluedroid/osi/include/thread.h index f49aae1ac..60e41990d 100644 --- a/components/bt/bluedroid/osi/include/thread.h +++ b/components/bt/bluedroid/osi/include/thread.h @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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 __THREAD_H__ #define __THREAD_H__ @@ -12,10 +26,10 @@ #define portBASE_TYPE int struct bt_task_evt { - uint32_t sig; //task sig - void * par; //point to task param - void * cb; //point to function cb - void * arg; //point to function arg + uint32_t sig; //task sig + void *par; //point to task param + void *cb; //point to function cb + void *arg; //point to function arg }; typedef struct bt_task_evt BtTaskEvt_t; diff --git a/components/bt/bluedroid/osi/list.c b/components/bt/bluedroid/osi/list.c old mode 100755 new mode 100644 index e259395b4..7ffcb47d4 --- a/components/bt/bluedroid/osi/list.c +++ b/components/bt/bluedroid/osi/list.c @@ -6,49 +6,55 @@ #include "osi.h" struct list_node_t { - struct list_node_t *next; - void *data; + struct list_node_t *next; + void *data; }; typedef struct list_t { - list_node_t *head; - list_node_t *tail; - size_t length; - list_free_cb free_cb; - const allocator_t *allocator; + list_node_t *head; + list_node_t *tail; + size_t length; + list_free_cb free_cb; + const allocator_t *allocator; } list_t; //static list_node_t *list_free_node_(list_t *list, list_node_t *node); // Hidden constructor, only to be used by the hash map for the allocation tracker. // Behaves the same as |list_new|, except you get to specify the allocator. -list_t *list_new_internal(list_free_cb callback, const allocator_t *zeroed_allocator) { - list_t *list = (list_t *)zeroed_allocator->alloc(sizeof(list_t)); - if (!list) - return NULL; +list_t *list_new_internal(list_free_cb callback, const allocator_t *zeroed_allocator) +{ + list_t *list = (list_t *)zeroed_allocator->alloc(sizeof(list_t)); + if (!list) { + return NULL; + } - list->head = list->tail = NULL; - list->length = 0; - list->free_cb = callback; - list->allocator = zeroed_allocator; - return list; + list->head = list->tail = NULL; + list->length = 0; + list->free_cb = callback; + list->allocator = zeroed_allocator; + return list; } -list_t *list_new(list_free_cb callback) { - return list_new_internal(callback, &allocator_calloc); +list_t *list_new(list_free_cb callback) +{ + return list_new_internal(callback, &allocator_calloc); } -void list_free(list_t *list) { - if (!list) - return; +void list_free(list_t *list) +{ + if (!list) { + return; + } - list_clear(list); - list->allocator->free(list); + list_clear(list); + list->allocator->free(list); } -bool list_is_empty(const list_t *list) { - assert(list != NULL); - return (list->length == 0); +bool list_is_empty(const list_t *list) +{ + assert(list != NULL); + return (list->length == 0); } /* @@ -66,16 +72,18 @@ bool list_contains(const list_t *list, const void *data) { } */ -size_t list_length(const list_t *list) { - assert(list != NULL); - return list->length; +size_t list_length(const list_t *list) +{ + assert(list != NULL); + return list->length; } -void *list_front(const list_t *list) { - assert(list != NULL); - assert(!list_is_empty(list)); +void *list_front(const list_t *list) +{ + assert(list != NULL); + assert(!list_is_empty(list)); - return list->head->data; + return list->head->data; } /* @@ -87,140 +95,160 @@ void *list_back(const list_t *list) { } */ -bool list_insert_after(list_t *list, list_node_t *prev_node, void *data) { - list_node_t *node; - assert(list != NULL); - assert(prev_node != NULL); - assert(data != NULL); +bool list_insert_after(list_t *list, list_node_t *prev_node, void *data) +{ + list_node_t *node; + assert(list != NULL); + assert(prev_node != NULL); + assert(data != NULL); - node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); - if (!node) - return false; - - node->next = prev_node->next; - node->data = data; - prev_node->next = node; - if (list->tail == prev_node) - list->tail = node; - ++list->length; - return true; -} - -bool list_prepend(list_t *list, void *data) { - list_node_t *node; - assert(list != NULL); - assert(data != NULL); - - node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); - if (!node) - return false; - node->next = list->head; - node->data = data; - list->head = node; - if (list->tail == NULL) - list->tail = list->head; - ++list->length; - return true; -} - -bool list_append(list_t *list, void *data) { - list_node_t *node; - assert(list != NULL); - assert(data != NULL); - - node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); - if (!node) { - return false; -} - node->next = NULL; - node->data = data; - if (list->tail == NULL) { - list->head = node; - list->tail = node; - } else { - list->tail->next = node; - list->tail = node; - } - ++list->length; - return true; -} - -bool list_remove(list_t *list, void *data) { - assert(list != NULL); - assert(data != NULL); - - if (list_is_empty(list)) - return false; - - if (list->head->data == data) { - list_node_t *next = list_free_node(list, list->head); - if (list->tail == list->head) - list->tail = next; - list->head = next; - return true; - } - - for (list_node_t *prev = list->head, *node = list->head->next; node; prev = node, node = node->next) - if (node->data == data) { - prev->next = list_free_node(list, node); - if (list->tail == node) - list->tail = prev; - return true; + node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); + if (!node) { + return false; } - return false; + node->next = prev_node->next; + node->data = data; + prev_node->next = node; + if (list->tail == prev_node) { + list->tail = node; + } + ++list->length; + return true; } -void list_clear(list_t *list) { - assert(list != NULL); - for (list_node_t *node = list->head; node; ) - node = list_free_node(list, node); - list->head = NULL; - list->tail = NULL; - list->length = 0; +bool list_prepend(list_t *list, void *data) +{ + list_node_t *node; + assert(list != NULL); + assert(data != NULL); + + node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); + if (!node) { + return false; + } + node->next = list->head; + node->data = data; + list->head = node; + if (list->tail == NULL) { + list->tail = list->head; + } + ++list->length; + return true; } -void list_foreach(const list_t *list, list_iter_cb callback) { - assert(list != NULL); - assert(callback != NULL); +bool list_append(list_t *list, void *data) +{ + list_node_t *node; + assert(list != NULL); + assert(data != NULL); + + node = (list_node_t *)list->allocator->alloc(sizeof(list_node_t)); + if (!node) { + return false; + } + node->next = NULL; + node->data = data; + if (list->tail == NULL) { + list->head = node; + list->tail = node; + } else { + list->tail->next = node; + list->tail = node; + } + ++list->length; + return true; +} + +bool list_remove(list_t *list, void *data) +{ + assert(list != NULL); + assert(data != NULL); + + if (list_is_empty(list)) { + return false; + } + + if (list->head->data == data) { + list_node_t *next = list_free_node(list, list->head); + if (list->tail == list->head) { + list->tail = next; + } + list->head = next; + return true; + } + + for (list_node_t *prev = list->head, *node = list->head->next; node; prev = node, node = node->next) + if (node->data == data) { + prev->next = list_free_node(list, node); + if (list->tail == node) { + list->tail = prev; + } + return true; + } + + return false; +} + +void list_clear(list_t *list) +{ + assert(list != NULL); + for (list_node_t *node = list->head; node; ) { + node = list_free_node(list, node); + } + list->head = NULL; + list->tail = NULL; + list->length = 0; +} + +void list_foreach(const list_t *list, list_iter_cb callback) +{ + assert(list != NULL); + assert(callback != NULL); + + for (list_node_t *node = list->head; node; ) { + list_node_t *next = node->next; + callback(node->data); + node = next; + } +} + +list_node_t *list_begin(const list_t *list) +{ + assert(list != NULL); + return list->head; +} + +list_node_t *list_end(UNUSED_ATTR const list_t *list) +{ + assert(list != NULL); + return NULL; +} + +list_node_t *list_next(const list_node_t *node) +{ + assert(node != NULL); + return node->next; +} + +void *list_node(const list_node_t *node) +{ + assert(node != NULL); + return node->data; +} + +list_node_t *list_free_node(list_t *list, list_node_t *node) +{ + assert(list != NULL); + assert(node != NULL); - for (list_node_t *node = list->head; node; ) { list_node_t *next = node->next; - callback(node->data); - node = next; - } -} - -list_node_t *list_begin(const list_t *list) { - assert(list != NULL); - return list->head; -} - -list_node_t *list_end(UNUSED_ATTR const list_t *list) { - assert(list != NULL); - return NULL; -} - -list_node_t *list_next(const list_node_t *node) { - assert(node != NULL); - return node->next; -} - -void *list_node(const list_node_t *node) { - assert(node != NULL); - return node->data; -} - -list_node_t *list_free_node(list_t *list, list_node_t *node) { - assert(list != NULL); - assert(node != NULL); - - list_node_t *next = node->next; - - if (list->free_cb) - list->free_cb(node->data); - list->allocator->free(node); - --list->length; - - return next; + + if (list->free_cb) { + list->free_cb(node->data); + } + list->allocator->free(node); + --list->length; + + return next; } diff --git a/components/bt/bluedroid/osi/osi_arch.c b/components/bt/bluedroid/osi/osi_arch.c old mode 100755 new mode 100644 index 0e8cd9639..e896efd87 --- a/components/bt/bluedroid/osi/osi_arch.c +++ b/components/bt/bluedroid/osi/osi_arch.c @@ -38,17 +38,17 @@ int osi_mutex_new(osi_mutex_t *pxMutex) { - int xReturn = -1; + int xReturn = -1; - *pxMutex = xSemaphoreCreateMutex(); + *pxMutex = xSemaphoreCreateMutex(); - if (*pxMutex != NULL) { - xReturn = 0; - } + if (*pxMutex != NULL) { + xReturn = 0; + } - //LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("osi_mutex_new: m=%p\n", *pxMutex)); + //LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("osi_mutex_new: m=%p\n", *pxMutex)); - return xReturn; + return xReturn; } /** Lock a mutex @@ -56,14 +56,17 @@ osi_mutex_new(osi_mutex_t *pxMutex) void osi_mutex_lock(osi_mutex_t *pxMutex) { - while (xSemaphoreTake(*pxMutex, portMAX_DELAY) != pdPASS); + while (xSemaphoreTake(*pxMutex, portMAX_DELAY) != pdPASS); } int osi_mutex_trylock(osi_mutex_t *pxMutex) { - if (xSemaphoreTake(*pxMutex, 0) == pdPASS) return 0; - else return -1; + if (xSemaphoreTake(*pxMutex, 0) == pdPASS) { + return 0; + } else { + return -1; + } } /** Unlock a mutex @@ -71,7 +74,7 @@ osi_mutex_trylock(osi_mutex_t *pxMutex) void osi_mutex_unlock(osi_mutex_t *pxMutex) { - xSemaphoreGive(*pxMutex); + xSemaphoreGive(*pxMutex); } /** Delete a semaphore @@ -79,8 +82,8 @@ osi_mutex_unlock(osi_mutex_t *pxMutex) void osi_mutex_free(osi_mutex_t *pxMutex) { - //LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("osi_mutex_free: m=%p\n", *pxMutex)); - vQueueDelete(*pxMutex); + //LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("osi_mutex_free: m=%p\n", *pxMutex)); + vQueueDelete(*pxMutex); } /*-----------------------------------------------------------------------------------*/ @@ -90,15 +93,15 @@ osi_mutex_free(osi_mutex_t *pxMutex) int osi_sem_new(osi_sem_t *sem, uint32_t max_count, uint32_t init_count) { - int xReturn = -1; - if (sem) { - *sem = xSemaphoreCreateCounting(max_count, init_count); - if ((*sem) != NULL) { - xReturn = 0; + int xReturn = -1; + if (sem) { + *sem = xSemaphoreCreateCounting(max_count, init_count); + if ((*sem) != NULL) { + xReturn = 0; + } } - } - return xReturn; + return xReturn; } /*-----------------------------------------------------------------------------------*/ @@ -106,7 +109,7 @@ osi_sem_new(osi_sem_t *sem, uint32_t max_count, uint32_t init_count) void osi_sem_signal(osi_sem_t *sem) { - xSemaphoreGive(*sem); + xSemaphoreGive(*sem); } /*-----------------------------------------------------------------------------------*/ @@ -128,38 +131,38 @@ osi_sem_signal(osi_sem_t *sem) uint32_t osi_sem_wait(osi_sem_t *sem, uint32_t timeout) { - portTickType StartTime, EndTime, Elapsed; - unsigned long ulReturn; + portTickType StartTime, EndTime, Elapsed; + unsigned long ulReturn; - StartTime = xTaskGetTickCount(); + StartTime = xTaskGetTickCount(); - if (timeout != 0) { - if (xSemaphoreTake(*sem, timeout / portTICK_RATE_MS) == pdTRUE) { - EndTime = xTaskGetTickCount(); - Elapsed = (EndTime - StartTime) * portTICK_RATE_MS; + if (timeout != 0) { + if (xSemaphoreTake(*sem, timeout / portTICK_RATE_MS) == pdTRUE) { + EndTime = xTaskGetTickCount(); + Elapsed = (EndTime - StartTime) * portTICK_RATE_MS; - if (Elapsed == 0) { - Elapsed = 1; - } + if (Elapsed == 0) { + Elapsed = 1; + } - ulReturn = Elapsed; - } else { - ulReturn = OSI_ARCH_TIMEOUT; - } - } else { // must block without a timeout - while (xSemaphoreTake(*sem, portMAX_DELAY) != pdTRUE); + ulReturn = Elapsed; + } else { + ulReturn = OSI_ARCH_TIMEOUT; + } + } else { // must block without a timeout + while (xSemaphoreTake(*sem, portMAX_DELAY) != pdTRUE); - EndTime = xTaskGetTickCount(); - Elapsed = (EndTime - StartTime) * portTICK_RATE_MS; + EndTime = xTaskGetTickCount(); + Elapsed = (EndTime - StartTime) * portTICK_RATE_MS; - if (Elapsed == 0) { - Elapsed = 1; + if (Elapsed == 0) { + Elapsed = 1; + } + + ulReturn = Elapsed; } - ulReturn = Elapsed; - } - - return ulReturn ; // return time blocked + return ulReturn ; // return time blocked } /*-----------------------------------------------------------------------------------*/ @@ -167,7 +170,7 @@ osi_sem_wait(osi_sem_t *sem, uint32_t timeout) void osi_sem_free(osi_sem_t *sem) { - vSemaphoreDelete(*sem); + vSemaphoreDelete(*sem); } /*-----------------------------------------------------------------------------------*/ @@ -181,13 +184,13 @@ osi_arch_init(void) uint32_t osi_now(void) { - return xTaskGetTickCount(); + return xTaskGetTickCount(); } void osi_delay_ms(uint32_t ms) { - vTaskDelay(ms/portTICK_RATE_MS); + vTaskDelay(ms / portTICK_RATE_MS); } diff --git a/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c b/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c deleted file mode 100644 index e1b34254d..000000000 --- a/components/bt/bluedroid/profiles/core/bt_prf_sys_main.c +++ /dev/null @@ -1,155 +0,0 @@ - -// Copyright 2015-2016 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. - -#include "thread.h" -#include "bt_prf_sys.h" -#include "fixed_queue.h" -#include "bt_prf_task.h" -#include "gki.h" -#include "bt_trace.h" - -#include - - -tBT_PRF_SYS_CB bt_prf_sys_cb; -fixed_queue_t *bt_profile_msg_queue; - - -static const tBT_PRF_SYS_REG bt_prf_sys_reg = -{ - NULL, - NULL -}; - - -void bt_prf_sys_init(void) -{ - LOG_ERROR("bt_prf_sys_init\n"); - memset(&bt_prf_sys_cb, 0, sizeof(tBT_PRF_SYS_CB)); - bt_prf_StartUp(); -} - - -/******************************************************************************* -** -** Function bt_prf_sys_event -** -** Description profile task event handler; called from task event handler. -** -** -** Returns void -** -*******************************************************************************/ -void bt_prf_sys_event(prf_hdr_evt_t *p_msg) -{ - UINT8 id; - BOOLEAN freebuf = TRUE; - - LOG_ERROR("profile task got event 0x%x\n", p_msg->event); - - /* get subsystem id from event */ - id = (UINT8) (p_msg->event >> 8); - - /* verify id and call subsystem event handler */ - if ((id < PRF_ID_MAX) && (bt_prf_sys_cb.reg[id] != NULL)) - { - freebuf = (*bt_prf_sys_cb.reg[id]->evt_hdlr)(p_msg); - } - else - { - LOG_ERROR("profile task got unregistered event id %d\n", id); - } - - if (freebuf) - { - GKI_freebuf(p_msg); - } - -} - - -/******************************************************************************* -** -** Function bt_prf_sys_register -** -** Description Called by other profile subsystems to register their event -** handler. -** -** Parameters id:the Identifiers index of the profile -** p_reg:the callback event which has been register to the profile task -** Returns void -** -*******************************************************************************/ -void bt_prf_sys_register(UINT8 id, const tBT_PRF_SYS_REG *p_reg) -{ - bt_prf_sys_cb.reg[id] = (tBT_PRF_SYS_REG *) p_reg; - bt_prf_sys_cb.is_reg[id] = TRUE; -} - -/******************************************************************************* -** -** Function bt_prf_sys_deregister -** -** Description Called by other profile subsystems to de-register -** handler. -** -** Parameters id:Identifiers index of the profile -** Returns void -** -*******************************************************************************/ -void bt_prf_sys_deregister(UINT8 id) -{ - bt_prf_sys_cb.reg[id] = NULL; - bt_prf_sys_cb.is_reg[id] = FALSE; -} - -/******************************************************************************* -** -** Function bt_prf_sys_is_register -** -** Description Called by other profile subsystems to get registeration -** status. -** -** -** Returns void -** -*******************************************************************************/ -BOOLEAN bt_prf_sys_is_register(UINT8 id) -{ - return bt_prf_sys_cb.is_reg[id]; -} - -/******************************************************************************* -** -** Function bt_prf_sys_sendmsg -** -** Description Send a message to the profile task. -** -** -** Returns void -** -*******************************************************************************/ -void bt_prf_sys_sendmsg(void *p_msg) -{ - // There is a race condition that occurs if the stack is shut down while - // there is a procedure in progress that can schedule a task via this - // message queue. This causes |bt_profile_msg_queue| to get cleaned up before - // it gets used here; hence we check for NULL before using it. - if (bt_profile_msg_queue) { - fixed_queue_enqueue(bt_profile_msg_queue, p_msg); - - bt_prf_task_post(SIG_PRF_WORK); - } -} diff --git a/components/bt/bluedroid/profiles/core/bt_prf_task.c b/components/bt/bluedroid/profiles/core/bt_prf_task.c deleted file mode 100644 index 3c32bb1f6..000000000 --- a/components/bt/bluedroid/profiles/core/bt_prf_task.c +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2015-2016 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. - -#include "bt_prf_task.h" -#include "bt_prf_sys.h" -#include "allocator.h" -#include "bt_trace.h" -#include "thread.h" -#include "gki.h" - - //thread_t *bt_workqueue_thread; - //static const char *BT_WORKQUEUE_NAME = "bt_workqueue"; - xTaskHandle xProfileTaskHandle = NULL; - xQueueHandle xProfileQueue = 0; - - // Communication queue between bt_proflie_task and app. - extern fixed_queue_t *bt_profile_msg_queue; - - - /***************************************************************************** - ** - ** Function bt_prf_task_thread_handler - ** - ** Description Process profile Task Thread. - ******************************************************************************/ - void bt_prf_task_thread_handler(void *arg) - { - BtTaskEvt_t e; - - for (;;) { - if (pdTRUE == xQueueReceive(xProfileQueue, &e, (portTickType)portMAX_DELAY)) { - - if (e.sig == SIG_PRF_WORK) { - fixed_queue_process(bt_profile_msg_queue); - LOG_ERROR("bt_prf_task_thread_handler\n"); - } - else if (e.sig == SIG_PRF_START_UP) { - bt_prf_task_start_up(); - } - } - } - } - - void bt_prf_task_post(uint32_t sig) -{ - BtTaskEvt_t evt; - - evt.sig = sig; - evt.par = 0; - - if (xQueueSend(xProfileQueue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { - ets_printf("xProfileQueue failed\n"); - } -} - -void bt_profile_msg_ready(fixed_queue_t *queue) { - prf_hdr_evt_t *p_msg; - - while (!fixed_queue_is_empty(queue)) { - p_msg = (prf_hdr_evt_t *)fixed_queue_dequeue(queue); - if(p_msg != NULL) - { - bt_prf_sys_event(p_msg); - } - } -} - - -void bt_prf_task_start_up(void) -{ - LOG_ERROR("bt_prf_task_start_up\n"); - fixed_queue_register_dequeue(bt_profile_msg_queue, bt_profile_msg_ready); -} - -void bt_prf_task_shut_down(void) -{ - fixed_queue_unregister_dequeue(bt_profile_msg_queue); - - bt_prf_free_core(); -} - - -void bt_prf_StartUp(void) -{ - bt_profile_msg_queue = fixed_queue_new(SIZE_MAX); - if (bt_profile_msg_queue == NULL) - goto error_exit; - - xProfileQueue = xQueueCreate(60, sizeof(BtTaskEvt_t)); - xTaskCreate(bt_prf_task_thread_handler, "Bt_prf", 4096, NULL, configMAX_PRIORITIES - 1, &xProfileTaskHandle); - bt_prf_task_post(SIG_PRF_START_UP); - return; - -error_exit: - LOG_ERROR("%s Unable to allocate resources for bt_workqueue\n", __func__); - bt_prf_ShutDown(); - -} - -void bt_prf_ShutDown(void) -{ - - bt_prf_task_shut_down(); - - //thread_free(bt_workqueue_thread); - vTaskDelete(xProfileTaskHandle); - vQueueDelete(xProfileQueue); - - bt_profile_msg_queue = NULL; - - // bt_workqueue_thread = NULL; - xProfileTaskHandle = NULL; - xProfileQueue = 0; -} - - -void bt_prf_free_core(void) -{ - -} - - - diff --git a/components/bt/bluedroid/profiles/core/include/bt_prf_evt.h b/components/bt/bluedroid/profiles/core/include/bt_prf_evt.h deleted file mode 100644 index a0fafde08..000000000 --- a/components/bt/bluedroid/profiles/core/include/bt_prf_evt.h +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2015-2016 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. - -#include - -enum -{ - API_BLE_DEVICE_READY_IND, - API_BLE_DM_CMP_EVT, - API_BLE_CONN_CMP_EVT, - API_BLE_CONN_REQ_IND, - API_BLE_DISCONN_IND, - API_BLE_MODULE_INIT_CMP_EVT, - API_BLE_ADV_REPORT_IND, - -#if (BLE_SEC) - API_BLE_BOND_REQ_IND, - API_BLE_BOND_REQ_IND, - API_BLE_ENCRYPT_REQ_IND, - API_BLE_ENCRYPT_IND, -#endif ///BLE_SEC - -#if (BLE_DISS_SERVER) - API_BLE_CREATE_DB_CFM, - API_BLE_DISABLE_IND, -#endif ///BLE_DISS_SERVER - -#if (BLE_PROX_REPORTER) - API_BLE_PROXR_ALERT_IND, - API_BLE_PXP_TIMER, - API_BLE_PROXR_CREATE_DB_CFM, - API_BLE_PROXR_DISABLE_IND, -#endif ///BLE_PROX_REPORTER - -#if (BLE_BUT_SERVER) - API_BLE_BUT_VAL_RECEIVCE, - API_BLE_CREATE_DB_CFM, - API_BLE_VAL_SEND_CFM, -#endif ///BLE_BUT_SERVER - -#if (BLE_APP_KEYBOARD) - API_BLE_HIDD_CREATE_DB_CFM, - API_BLE_DISABLE_IND, - API_BLE_NTF_SENT_CFM, - API_BLE_HIDD_TIMER, - API_BLE_GREEN_LED_TIMER, - API_BLE_RED_LED_TIMER, -#ifndef MITM_ON - API_BLE_HIDD_ENC_TIMER, -#endif ///MITM_ON - API_BLE_UPDATED_PRIVACY_IND, - API_BLE_UPDATED_RECON_ADDR_IND, - API_BLE_HID_MSG, -#endif ///BLE_APP_KEYBOARD - -#if (BLE_BATT_SERVER) - API_BLE_BATT_CREATE_DB_CFM, - API_BLE_BATT_LEVEL_UPD_CFM, - API_BLE_BATT_LEVEL_NTF_CFG_IND, - API_BLE_BATT_TIMER, - APP_BLE_ALERT_TIMER, -#endif ///BLE_BATT_SERVER - -#if (BLE_FINDME_TARGET) - API_BLE_FINDT_ALERT_IND, -#endif ///BLE_FINDME_TARGET - -#if (BLE_FINDME_LOCATOR) - API_BLE_FINDL_ENABLE_CFM, -#endif ///BLE_FINDME_LOCATOR - -#if (HAS_MULTI_BOND) - API_BLE_PAIR_TIMER, -#endif ///HAS_MULTI_BOND - -#if (BLE_SPOTA_RECEIVER) - API_BLE_SPOTAR_PATCH_MEM_DEV_IND, - API_BLE_SPOTAR_GPIO_MAP_IND, - API_BLE_SPOTAR_PATCH_LEN_IND, - API_BLE_SPOTAR_PATCH_DATA_IND, - API_BLE_SPOTAR_CREATE_DB_CFM, -#endif ///BLE_SPOTA_RECEIVER - -#if (BLE_APP_SMARTTAG) - API_BLE_ADV_TIMER, - API_BLE_ADV_BLINK_TIMER, - API_BLE_WAKEUP_MSG, -#endif ///BLE_APP_SMARTTAG - -#if (BLE_APP_PROXR) - API_BLE_ADV_TIMER, - API_BLE_WAKEUP_MSG, -#endif ///BLE_APP_PROXR - -#if (BLE_INTEGRATED_HOST_GTL_CENTRAL) - API_BLE_EXT_TEST_REQ, - API_BLE_EXT_SCAN_CMD, - API_BLE_EXT_CONNECT_CMD, - API_BLE_EXT_DISCONNECT_CMD, - API_BLE_EXT_TRANSMIT_CMD, -#endif ///BLE_INTEGRATED_HOST_GTL - -#if (BLE_APP_THROUGHPUT_PERIPHERAL) - API_BLE_EXT_TEST_REQ, - API_BLE_EXT_DISCONNECT_CMD, - API_BLE_EXT_TRANSMIT_CMD, -#endif ///BLE_APP_THROUGHPUT_PERIPHERAL - -#if (BLE_STREAMDATA_HOST) - API_BLE_STREAMDATAH_ENABLE_CFM, - API_BLE_STREAMDATAH_RCV_DATA_PACKET_IND, -#endif ///BLE_STREAMDATA_HOST - -#if (BLE_STREAMDATA_DEVICE) - API_BLE_STREAMDATAD_CREATE_DB_CFM, - API_BLE_STREAMDATAD_RCV_DATA_PACKET_IND, -#endif ///BLE_STREAMDATA_DEVICE - - - -}; - - diff --git a/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h b/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h deleted file mode 100644 index 57ed50679..000000000 --- a/components/bt/bluedroid/profiles/core/include/bt_prf_sys.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2015-2016 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 _PROFILE_SYS_H__ -#define _PROFILE_SYS_H__ - -#include "bt_types.h" -#include "prf_defs.h" - -enum -{ - PRF_ID_SYS, - PRF_ID_CONN, - PRF_ID_HIDD_LE, - PRF_ID_HIDH_LE, - PRF_ID_DISS_LE, - PRF_ID_DISC_LE, - PRF_ID_AIRSYNC_LE, - PRF_ID_ANCC_LE, - PRF_ID_BUT_LE, - - PRF_ID_MAX -}; - -typedef UINT8 tBT_PRF_SYS_CONN_STATUS; - - -/* disable function type */ -typedef void (tBT_PRF_SYS_DISABLE)(void); -/* event handler function type */ -typedef BOOLEAN (tBT_PRF_SYS_EVT_HDLR)(prf_hdr_evt_t *p_msg); - -/* conn callback for role / low power manager*/ -typedef void (tBT_PRF_SYS_CONN_CBACK)(tBT_PRF_SYS_CONN_STATUS status, - UINT8 id, UINT8 app_id, BD_ADDR peer_addr); - -/* Calculate start of event enumeration; id is top 8 bits of event */ -#define BT_PRF_SYS_EVT_START(id) ((id) << 8) - - - -/* registration structure */ -typedef struct -{ - tBT_PRF_SYS_EVT_HDLR *evt_hdlr; - tBT_PRF_SYS_DISABLE *disable; -} tBT_PRF_SYS_REG; - -/* system manager control block */ -typedef struct -{ - tBT_PRF_SYS_REG *reg[PRF_ID_MAX]; /* registration structures */ - BOOLEAN is_reg[PRF_ID_MAX]; /* registration structures */ - tBT_PRF_SYS_CONN_CBACK *prm_cb; /* role management callback registered by DM */ - tBT_PRF_SYS_CONN_CBACK *ppm_cb; /* low power management callback registered by DM */ - tBT_PRF_SYS_CONN_CBACK *p_policy_cb; /* link policy change callback registered by DM */ - -} tBT_PRF_SYS_CB; - - -extern tBT_PRF_SYS_CB bt_prf_sys_cb; - - -extern void bt_prf_sys_init(void); -extern void bt_prf_sys_free(void); -extern void bt_prf_sys_event(prf_hdr_evt_t *p_msg); - -extern void bt_prf_sys_sendmsg(void *p_msg); - - -extern void bt_prf_sys_register(uint8_t id, const tBT_PRF_SYS_REG *p_reg); -extern void bt_prf_sys_deregister(uint8_t id); -extern BOOLEAN bt_prf_sys_is_register(uint8_t id); - -extern void bt_prf_sys_idle(uint8_t id, uint8_t app_id, BD_ADDR peer_addr); -extern void bt_prf_sys_busy(uint8_t id, uint8_t app_id, BD_ADDR peer_addr); - - -#endif ///_PROFILE_SYS_H__ diff --git a/components/bt/bluedroid/profiles/esp/ble_button/button_pro.c b/components/bt/bluedroid/profiles/esp/ble_button/button_pro.c deleted file mode 100644 index 55f9a8b50..000000000 --- a/components/bt/bluedroid/profiles/esp/ble_button/button_pro.c +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2015-2016 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. - -#include - -#include -#include -#include - - -#include "bt_target.h" -#include "bt_trace.h" -#include "bt_types.h" -#include "gatt_api.h" -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "bta_gatts_int.h" -#include "button_pro.h" - -#include "prf_defs.h" - -#if (BUT_PROFILE_CFG) - - -#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) - - button_env_cb_t button_cb_env; - - - - -/***************************************************************************** -** Constants -*****************************************************************************/ -static void button_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); - - -/******************************************************************************* -** -** Function button_profile_cb -** -** Description the callback function after the profile has been register to the BTA manager module -** -** Returns NULL -** -*******************************************************************************/ -static void button_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) -{ - esp_gatts_rsp_t rsp; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; - but_inst_t *p_inst = &button_cb_env.button_inst; - uint8_t net_event = 0xff; - uint8_t len = 0; - uint8_t *p_rec_data = NULL; - //LOG_ERROR("p_data->status = %x\n",p_data->status); - //if(p_data->status != BTA_GATT_OK){ - // LOG_ERROR("button profile register failed\n"); - // return; - //} - LOG_ERROR("button profile cb event = %x\n",event); - switch(event) - { - case ESP_GATTS_REG_EVT: - - LOG_ERROR("p_data->reg_oper.status = %x\n",p_data->reg_oper.status); - LOG_ERROR("(p_data->reg_oper.uuid.uu.uuid16=%x\n",p_data->reg_oper.uuid.uu.uuid16); - if(p_data->reg_oper.status != BTA_GATT_OK) - { - LOG_ERROR("button profile register failed\n"); - } - button_cb_env.gatt_if = p_data->reg_oper.server_if; - button_cb_env.enabled = true; - //button_cb_env.button_inst.app_id = p_data->reg_oper.uuid; - //create the button service to the service data base. - if(p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_BUTTON) - { - Button_CreateService(); - } - break; - case ESP_GATTS_READ_EVT: - //tBTA_GATTS_RSP rsp; - memset(&rsp,0,sizeof(tBTA_GATTS_API_RSP)); - rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; - rsp.attr_value.len = 2; - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,&rsp); - break; - case ESP_GATTS_WRITE_EVT: - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,NULL); - LOG_ERROR("Received button data:"); - for(int i = 0; i < p_data->req_data.p_data->write_req.len; i++){ - LOG_ERROR("%x",p_data->req_data.p_data->write_req.value[i]); - } - LOG_ERROR("\n"); - if(p_data->req_data.p_data->write_req.handle == button_cb_env.button_inst.but_wirt_hdl){ - - p_rec_data = &p_data->req_data.p_data->write_req.value[0]; - // button_msg_notify(len,p_rec_data); - (*p_inst->p_cback)(button_cb_env.button_inst.app_id,net_event,len,p_rec_data); - - } - break; - case ESP_GATTS_CFM_EVT: - - break; - case ESP_GATTS_CREATE_EVT: - //tBT_UUID uuid_butt_write; - uuid.uu.uuid16 = ATT_CHAR_BUTTON_WIT; - //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_READ); - //tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE); - //uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; - button_cb_env.clcb.cur_srvc_id= p_data->create.service_id; - button_cb_env.is_primery = p_data->create.is_primary; - //uuid = {LEN_UUID_16, {ATT_CHAR_BUTTON_WIT}}; - //start the button service after created - esp_ble_gatts_start_srvc(p_data->create.service_id); - //add the frist button characteristic --> write characteristic - esp_ble_gatts_add_char(button_cb_env.clcb.cur_srvc_id,&uuid, - (GATT_PERM_WRITE|GATT_PERM_READ), - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE)); - break; - - case ESP_GATTS_ADD_CHAR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_BUTTON_WIT) - { - uuid.uu.uuid16 = ATT_CHAR_BUTTON_NTF; - //tBTA_GATT_PERM perm = GATT_PERM_READ; - tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY); - //save the att handle to the env - button_cb_env.button_inst.but_wirt_hdl = p_data->add_result.attr_id; - //add the frist button characteristic --> Notify characteristic - esp_ble_gatts_add_char(button_cb_env.clcb.cur_srvc_id,&uuid, - GATT_PERM_READ,(GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY)); - }else if(p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_BUTTON_NTF){ // add the gattc config descriptor to the notify charateristic - //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); - uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; - button_cb_env.button_inst.but_ntf_hdl = p_data->add_result.attr_id; - esp_ble_gatts_add_char_descr (button_cb_env.clcb.cur_srvc_id, - (GATT_PERM_WRITE|GATT_PERM_WRITE), - &uuid); - } - - break; - case ESP_GATTS_ADD_CHAR_DESCR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { - button_cb_env.button_inst.but_cfg_hdl = p_data->add_result.attr_id; - } - ///Start advertising - LOG_ERROR("\n*******Start sent the ADV.*************\n"); - //esp_ble_start_advertising (&adv_params); - //BTA_GATTS_Listen(button_cb_env.gatt_if, true, NULL); - break; - case ESP_GATTS_CONNECT_EVT: - LOG_ERROR("############BUTTON CONNCET EVT################\n"); - //esp_ble_stop_advertising(); - //set the connection flag to true - button_env_clcb_alloc(p_data->conn.conn_id, p_data->conn.remote_bda); - break; - case ESP_GATTS_DISCONNECT_EVT: - //set the connection flag to true - button_cb_env.clcb.connected = false; - break; - case ESP_GATTS_OPEN_EVT: - ///stop the advertising after connected - - break; - case ESP_GATTS_CLOSE_EVT: - if(button_cb_env.clcb.connected && (button_cb_env.clcb.conn_id == p_data->conn.conn_id)) - { - //set the connection channal congested flag to true - button_cb_env.clcb.congest = p_data->congest.congested; - } - break; - case ESP_GATTS_CONGEST_EVT: - break; - default: - break; - } -} - - -/******************************************************************************* -** -** Function Button_CreateService -** -** Description Create a Service for the button profile -** -** Returns NULL -** -*******************************************************************************/ -void Button_CreateService(void) -{ - esp_gatts_if_t server_if ; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_BUTTON}}; - uint16_t num_handle = KEY_IDX_NB; - uint8_t inst = 0x00; - server_if = button_cb_env.gatt_if; - button_cb_env.inst_id = inst; - //if(!button_cb_env.enabled) - //{ - // LOG_ERROR("button service added error."); - //} - esp_ble_gatts_create_srvc(server_if,&uuid,inst,num_handle,true); - -} - -/******************************************************************************* -** -** Function button_env_clcb_alloc -** -** Description The function allocates a GATT profile connection link control block -** -** Returns NULL if not found. Otherwise pointer to the connection link block. -** -*******************************************************************************/ -but_clcb_t *button_env_clcb_alloc (uint16_t conn_id, BD_ADDR remote_bda) -{ - but_clcb_t *p_clcb = NULL; - p_clcb = &button_cb_env.clcb; - - if(!p_clcb->in_use) - { - p_clcb->in_use = TRUE; - p_clcb->conn_id = conn_id; - LOG_ERROR("p_clcb->conn_id = %x\n",conn_id); - p_clcb->connected = TRUE; - memcpy(p_clcb->remote_bda,remote_bda,BD_ADDR_LEN); - } - - return p_clcb; -} - -/******************************************************************************* -** -** Function button_env_find_conn_id_by_bd_adddr -** -** Description The function searches all LCB with macthing bd address -** -** Returns total number of clcb found. -** -*******************************************************************************/ -uint16_t button_env_find_conn_id_by_bd_adddr(BD_ADDR remote_bda) -{ - uint8_t i_clcb; - but_clcb_t *p_clcb = NULL; - - for(i_clcb = 0, p_clcb = &button_cb_env.clcb; i_clcb < BUTT_MAX_APPS; i_clcb++, p_clcb++) - { - if(p_clcb->in_use && p_clcb->connected &&memcmp(p_clcb->remote_bda,remote_bda,BD_ADDR_LEN)) - { - return p_clcb->conn_id; - } - } - - return GATT_INVALID_CONN_ID; -} - -/******************************************************************************* -** -** Function button_env_clcb_dealloc -** -** Description The function deallocates a GATT profile connection link control block -** -** Returns True the deallocation is successful -** -*******************************************************************************/ - -BOOLEAN button_env_clcb_dealloc(uint16_t conn_id) -{ - uint16_t i_clcb = 0; - but_clcb_t *p_clcb = NULL; - - for(i_clcb = 0, p_clcb = &button_cb_env.clcb; i_clcb < 1; i_clcb++, p_clcb++) - { - if(p_clcb->in_use && p_clcb->connected && (p_clcb->conn_id == conn_id)) - { - memset(p_clcb, 0, sizeof(but_clcb_t)); - return TRUE; - } - } - - return FALSE; -} - -/******************************************************************************* -** -** Function button_init -** -** Description Initializa the GATT Service for button profiles. -** -*******************************************************************************/ -esp_gatt_status_t button_init (but_prf_cb_t call_back) -{ - tBT_UUID app_uuid = {LEN_UUID_16,{ATT_SVC_BUTTON}}; - - LOG_ERROR("\n=============================button_init==============================================\n"); - if(button_cb_env.enabled) - { - LOG_ERROR("button svc already initaliezd\n"); - return ESP_GATT_ERROR; - } - else - { - memset(&button_cb_env,0,sizeof(button_env_cb_t)); - } - - - if(call_back != NULL) - { - button_cb_env.button_inst.p_cback = call_back; - } - - - /* register the button profile to the BTA_GATTS module*/ - esp_ble_gatts_app_register(&app_uuid,button_profile_cb); - - button_cb_env.enabled = TRUE; - - return ESP_GATT_OK; -} - -void button_disable(uint16_t connid) -{ - button_env_clcb_dealloc(connid); -} - - -void button_msg_notify(uint16_t len, uint8_t *button_msg) -{ - BOOLEAN conn_status = button_cb_env.clcb.connected; - uint16_t conn_id = button_cb_env.clcb.conn_id; - uint16_t attr_id = button_cb_env.button_inst.but_ntf_hdl; - //notify rsp==false; indicate rsp==true. - BOOLEAN rsp = false; - if(!conn_status && button_cb_env.clcb.congest) - { - LOG_ERROR("the conneciton for button profile has been loss\n"); - return; - } - - esp_ble_gatts_hdl_val_indica (conn_id, attr_id, len, - button_msg, rsp); -} - -#endif ///BUT_PROFILE_CFG diff --git a/components/bt/bluedroid/profiles/esp/blufi/blufi_adv.c b/components/bt/bluedroid/profiles/esp/blufi/blufi_adv.c deleted file mode 100644 index 2944177f5..000000000 --- a/components/bt/bluedroid/profiles/esp/blufi/blufi_adv.c +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2015-2016 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. - -#include "blufi_adv.h" -#include "esp_adv_api.h" - - /******************************************************************************* - ** - ** Function BlufiConfigadvData - ** - ** Description This function is called to override the BTA default ADV parameters. - ** - ** adv_data: Pointer to User defined ADV data structure. This - ** memory space can not be freed until p_adv_data_cback - ** is received. - ** p_adv_data_cback: set adv data complete callback. - ** - ** Returns None - ** - *******************************************************************************/ - void BlufiBleConfigadvData(esp_ble_adv_data_cfg_t *adv_data, - esp_ble_set_adv_data_cmpl_cb_t *p_adv_data_cback) -{ - esp_ble_config_adv_data(adv_data, p_adv_data_cback); -} - - -/******************************************************************************* -** -** Function BLUFI_BleSetScanRsp -** -** Description This function is called to override the app scan response. -** -** Parameters Pointer to User defined ADV data structure -** -** Returns None -** -*******************************************************************************/ -void BlufiBleSetScanRsp(esp_ble_adv_data_cfg_t *scan_rsp_data, - esp_ble_set_adv_data_cmpl_cb_t *p_scan_rsp_data_cback) -{ - esp_ble_set_scan_rsp(scan_rsp_data, p_scan_rsp_data_cback); -} - - diff --git a/components/bt/bluedroid/profiles/esp/blufi/blufi_prf.c b/components/bt/bluedroid/profiles/esp/blufi/blufi_prf.c deleted file mode 100644 index 7b1fb9c50..000000000 --- a/components/bt/bluedroid/profiles/esp/blufi/blufi_prf.c +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2015-2016 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. - -#include - -#include -#include -#include - - -#include "bt_target.h" -#include "bt_trace.h" -#include "bt_types.h" -#include "gatt_api.h" -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "bta_gatts_int.h" - -#include "blufi_prf.h" -#include "blufi_adv.h" - -#include "esp_adv_api.h" -#include "esp_bt_defs.h" -#include "esp_gatt_api.h" - -#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] - -void blufi_config_success(void); -void blufi_config_failed(void); - -UINT16 esp32_uuid = SVC_BLUFI_UUID; -UINT8 esp32_manu[17] = {0xff,0x20,0x14,0x07,0x22,0x00,0x02,0x5B,0x00,0x33,0x49,0x31,0x30,0x4a,0x30,0x30,0x31}; -tBTA_BLE_MANU p_esp32_manu = {sizeof(esp32_manu),esp32_manu}; /* manufacturer data */ - -tBTA_BLE_SERVICE esp32_service = { - 0x01, //only one service in the blufi profile - false, - &esp32_uuid - }; /* 16 bits services */ - - -esp_ble_adv_data_cfg_t esp32_adv_data[ADV_SCAN_IDX_MAX] = -{ - [BLE_ADV_DATA_IDX] = { - .adv_name = "Espressif_008", - { - {0,0}, - NULL, //no manufature data to be setting in the esp32 adervetisiing datas - &esp32_service, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0200, //device type : generic display - BTA_DM_GENERAL_DISC, // General discoverable. - 0xFE //the tx power value,defult value is 0 - }, - }, - - [BLE_SCAN_RSP_DATA_IDX] = { - .adv_name = NULL, - { - {0,0}, - &p_esp32_manu, - NULL, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0000, //device type : generic display - 0x00, // General discoverable. - 0x00}, //the tx power value,defult value is 0 - } -}; - -tBLE_BD_ADDR peer_bda = { - .type = API_PUBLIC_ADDR, - .bda = {0} -}; - -esp_ble_adv_params_all_t adv_params = -{ - .adv_int_min = BTM_BLE_ADV_INT_MIN + 0x100, - .adv_int_max = BTM_BLE_ADV_INT_MIN + 0x100, - .adv_type = API_NON_DISCOVERABLE, - .addr_type_own = API_PUBLIC_ADDR, - .channel_map = ESP_BLE_ADV_CHNL_MAP, - .adv_filter_policy = ADV_ALLOW_SCAN_ANY_CON_ANY, - .p_dir_bda = &peer_bda -}; - -static tBLUFI_CB_ENV blufi_cb_env; - - - -/***************************************************************************** -** Constants -*****************************************************************************/ -static void blufi_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); - - -/******************************************************************************* -** -** Function blufi_profile_cb -** -** Description the callback function after the profile has been register to the BTA manager module -** -** Returns NULL -** -*******************************************************************************/ -static void blufi_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) -{ - esp_gatts_rsp_t rsp; - esp_bt_uuid_t uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; - tBLUFI_INST *p_inst = &blufi_cb_env.blufi_inst; - UINT8 net_event = 0xff; - UINT8 len = 0; - UINT8 *p_rec_data = NULL; - esp_gatt_status_t status; - - LOG_DEBUG("blufi profile cb event = %x\n",event); - switch(event) { - case ESP_GATTS_REG_EVT: - status = p_data->reg_oper.status; - - LOG_DEBUG("p_data->reg_oper.status = %x\n",p_data->reg_oper.status); - LOG_DEBUG("(p_data->reg_oper.uuid.uu.uuid16=%x\n",p_data->reg_oper.uuid.uu.uuid16); - if(p_data->reg_oper.status != ESP_GATT_OK) { - LOG_ERROR("blufi profile register failed\n"); - return; - } - - blufi_cb_env.gatt_if = p_data->reg_oper.server_if; - blufi_cb_env.enabled = true; - LOG_DEBUG("register complete: event=%d, status=%d, server_if=%d\n", - event, status, blufi_cb_env.gatt_if); - - LOG_DEBUG("set advertising parameters\n"); - //set the advertising data to the btm layer - BlufiBleConfigadvData(&esp32_adv_data[BLE_ADV_DATA_IDX], NULL); - //set the adversting data to the btm layer - BlufiBleSetScanRsp(&esp32_adv_data[BLE_SCAN_RSP_DATA_IDX],NULL); - esp_ble_start_advertising(&adv_params); - //create the blufi service to the service data base. - if(p_data->reg_oper.uuid.uu.uuid16 == SVC_BLUFI_UUID) { - blufi_create_service(); - } - break; - case ESP_GATTS_READ_EVT: - memset(&rsp, 0, sizeof(tBTA_GATTS_API_RSP)); - rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; - rsp.attr_value.len = 2; - //rsp.attr_value.value[0] = 0xde; - //rsp.attr_value.value[1] = 0xed; - //rsp.attr_value.value[2] = 0xbe; - //rsp.attr_value.value[3] = 0xef; - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,&rsp); - break; - case ESP_GATTS_WRITE_EVT: - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,NULL); - - LOG_DEBUG("Received blufi data:"); - for(int i = 0; i < p_data->req_data.p_data->write_req.len; i++){ - LOG_DEBUG("%x",p_data->req_data.p_data->write_req.value[i]); - } - LOG_DEBUG("\n"); - - if (p_data->req_data.p_data->write_req.handle == blufi_cb_env.blufi_inst.blufi_hdl) { - - p_rec_data = &p_data->req_data.p_data->write_req.value[0]; - if (p_inst && p_inst->blufi_cback) - p_inst->blufi_cback(blufi_cb_env.blufi_inst.app_id, net_event, len, p_rec_data); - } - break; - case ESP_GATTS_CFM_EVT: - /* Nothing */ - break; - case ESP_GATTS_CREATE_EVT: - uuid.uu.uuid16 = CHAR_BLUFI_UUID; - blufi_cb_env.clcb.cur_srvc_id = p_data->create.service_id; - blufi_cb_env.is_primery = p_data->create.is_primary; - //start the blufi service after created - esp_ble_gatts_start_srvc(p_data->create.service_id); - //add the frist blufi characteristic --> write characteristic - esp_ble_gatts_add_char(blufi_cb_env.clcb.cur_srvc_id, &uuid, - (GATT_PERM_WRITE | GATT_PERM_READ), - (GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE | GATT_CHAR_PROP_BIT_NOTIFY)); - break; - case ESP_GATTS_ADD_CHAR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == CHAR_BLUFI_UUID) - { - //save the att handle to the env - blufi_cb_env.blufi_inst.blufi_hdl = p_data->add_result.attr_id; - - uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; - esp_ble_gatts_add_char_descr(blufi_cb_env.clcb.cur_srvc_id, - (GATT_PERM_WRITE|GATT_PERM_WRITE), - &uuid); - } - break; - case ESP_GATTS_ADD_CHAR_DESCR_EVT: - /* Nothing */ - break; - case ESP_GATTS_CONNECT_EVT: - //set the connection flag to true - blufi_env_clcb_alloc(p_data->conn.conn_id, p_data->conn.remote_bda); - LOG_DEBUG("\ndevice is connected "BT_BD_ADDR_STR", server_if=%d,reason=0x%x,connect_id=%d\n", - BT_BD_ADDR_HEX(p_data->conn.remote_bda), p_data->conn.server_if, - p_data->conn.reason, p_data->conn.conn_id); - /*return whether the remote device is currently connected*/ - int is_connected = BTA_DmGetConnectionState(p_data->conn.remote_bda); - LOG_DEBUG("is_connected=%d\n",is_connected); - esp_ble_stop_advertising(); //stop adv - break; - case ESP_GATTS_DISCONNECT_EVT: - //set the connection flag to true - blufi_cb_env.clcb.connected = false; - esp_ble_start_advertising(&adv_params); - break; - case ESP_GATTS_OPEN_EVT: - break; - case ESP_GATTS_CLOSE_EVT: - if(blufi_cb_env.clcb.connected && (blufi_cb_env.clcb.conn_id == p_data->conn.conn_id)) - { - //set the connection channal congested flag to true - blufi_cb_env.clcb.congest = p_data->congest.congested; - } - break; - case ESP_GATTS_CONGEST_EVT: - break; - default: - break; - } -} - - -/******************************************************************************* -** -** Function blufi_create_service -** -** Description Create a Service for the blufi profile -** -** Returns NULL -** -*******************************************************************************/ -void blufi_create_service(void) -{ - esp_gatts_if_t server_if ; - esp_bt_uuid_t uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; - UINT16 num_handle = BLUFI_HDL_NUM; - UINT8 inst = 0x00; - server_if = blufi_cb_env.gatt_if; - blufi_cb_env.inst_id = inst; - if(!blufi_cb_env.enabled) - { - LOG_ERROR("blufi service added error."); - return; - } - esp_ble_gatts_create_srvc(server_if, &uuid, inst, num_handle, true); - -} - -/******************************************************************************* -** -** Function blufi_env_clcb_alloc -** -** Description The function allocates a GATT profile connection link control block -** -** Returns NULL if not found. Otherwise pointer to the connection link block. -** -*******************************************************************************/ -tBLUFI_CLCB *blufi_env_clcb_alloc (UINT16 conn_id, BD_ADDR remote_bda) -{ - tBLUFI_CLCB *p_clcb = NULL; - p_clcb = &blufi_cb_env.clcb; - - if(!p_clcb->in_use) - { - p_clcb->in_use = TRUE; - p_clcb->conn_id = conn_id; - p_clcb->connected = TRUE; - memcpy(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN); - LOG_ERROR("p_clcb->conn_id = %x\n", conn_id); - } - - return p_clcb; -} - -/******************************************************************************* -** -** Function blufi_env_find_conn_id_by_bd_adddr -** -** Description The function searches all LCB with macthing bd address -** -** Returns total number of clcb found. -** -*******************************************************************************/ -/* -UINT16 blufi_env_find_conn_id_by_bd_adddr(BD_ADDR remote_bda) -{ - UINT8 i_clcb; - tBLUFI_CLCB *p_clcb = NULL; - - for(i_clcb = 0, p_clcb = &blufi_cb_env.clcb; i_clcb < BLUFIT_MAX_APPS; i_clcb++, p_clcb++) - { - if(p_clcb->in_use && p_clcb->connected && memcmp(p_clcb->remote_bda, remote_bda, BD_ADDR_LEN) == 0) - { - return p_clcb->conn_id; - } - } - - return GATT_INVALID_CONN_ID; -} -*/ -/******************************************************************************* -** -** Function blufi_env_clcb_dealloc -** -** Description The function deallocates a GATT profile connection link control block -** -** Returns True the deallocation is successful -** -*******************************************************************************/ -BOOLEAN blufi_env_clcb_dealloc(UINT16 conn_id) -{ -// UINT8 i_clcb = 0; -// tBLUFI_CLCB *p_clcb = NULL; - - return FALSE; -} - - -/******************************************************************************* -** -** Function blufi_init -** -** Description Initializa the GATT Service for blufi profiles. -** -*******************************************************************************/ -esp_gatt_status_t blufi_profile_init (tBLUFI_CBACK *call_back) -{ - esp_bt_uuid_t app_uuid = {LEN_UUID_16, {SVC_BLUFI_UUID}}; - - - if(blufi_cb_env.enabled) - { - LOG_ERROR("blufi svc already initaliezd"); - return GATT_ERROR; - } - else - { - memset(&blufi_cb_env,0,sizeof(tBLUFI_CB_ENV)); - } - - - if(call_back != NULL) - { - blufi_cb_env.blufi_inst.blufi_cback = call_back; - } - - - /* register the blufi profile to the ESP_GATTS module*/ - esp_ble_gatts_app_register(&app_uuid, blufi_profile_cb); - - return GATT_SUCCESS; -} - -void blufi_msg_notify(UINT8 *blufi_msg, UINT8 len) -{ - BOOLEAN conn_status = blufi_cb_env.clcb.connected; - UINT16 conn_id = blufi_cb_env.clcb.conn_id; - UINT16 attr_id = blufi_cb_env.blufi_inst.blufi_hdl; - //notify rsp==false; indicate rsp==true. - BOOLEAN rsp = false; - if(!conn_status && blufi_cb_env.clcb.congest) - { - LOG_ERROR("the conneciton for blufi profile has been loss"); - return; - } - - esp_ble_gatts_hdl_val_indica(conn_id, attr_id, len, - blufi_msg, rsp); -} - -void blufi_config_success(void) -{ - uint8_t *success_msg = "BLUFI_CONFIG_OK"; - blufi_msg_notify(success_msg, strlen(success_msg)); -} - -void blufi_config_failed(void) -{ - uint8_t *failed_msg = "BLUFI_CONFIG_FAILED"; - blufi_msg_notify(failed_msg, strlen(failed_msg)); -} diff --git a/components/bt/bluedroid/profiles/esp/blufi/include/blufi_adv.h b/components/bt/bluedroid/profiles/esp/blufi/include/blufi_adv.h deleted file mode 100644 index 172586cdc..000000000 --- a/components/bt/bluedroid/profiles/esp/blufi/include/blufi_adv.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __BLUFI_ADV_H__ -#define __BLUFI_ADV_H__ - -#include "bta_api.h" -#include "btm_ble_api.h" -#include "esp_bt_defs.h" - -extern void BlufiBleConfigadvData(esp_ble_adv_data_cfg_t *adv_data, - esp_ble_set_adv_data_cmpl_cb_t *p_adv_data_cback); - -extern void BlufiBleSetScanRsp(esp_ble_adv_data_cfg_t *scan_rsp_data, - esp_ble_set_adv_data_cmpl_cb_t *p_scan_rsp_data_cback); - -#endif /* __BLUFI_ADV_H__ */ diff --git a/components/bt/bluedroid/profiles/esp/include/blufi_prf.h b/components/bt/bluedroid/profiles/esp/include/blufi_prf.h deleted file mode 100644 index 9fb53e876..000000000 --- a/components/bt/bluedroid/profiles/esp/include/blufi_prf.h +++ /dev/null @@ -1,76 +0,0 @@ -#include "bt_target.h" -#include "gatt_api.h" -#include "gattdefs.h" - -//define the blufi serivce uuid -#define SVC_BLUFI_UUID 0xFFFF -//define the blufi Char uuid -#define CHAR_BLUFI_UUID 0xFF01 - -#define BLUFI_HDL_NUM 4 - -#define BLUFI_VAL_MAX_LEN (20) - -#define BLUFI_MAX_STRING_DATA 33 - -typedef void (tBLUFI_CBACK)(UINT8 app_id, UINT8 event, UINT8 len, UINT8 *data); - -typedef enum -{ - RECV_ACT_PASSWD = 0, - RECV_ACT_SSID, - RECV_ACT_MAX -} RECV_ACTION; - -typedef struct -{ - BD_ADDR remote_bda; - BOOLEAN need_rsp; - UINT16 clt_cfg; -} tBLUFI_WRITE_DATA; - -typedef struct -{ - BOOLEAN in_use; - BOOLEAN congest; - UINT16 conn_id; - BOOLEAN connected; - BD_ADDR remote_bda; - UINT32 trans_id; - UINT8 cur_srvc_id; - -} tBLUFI_CLCB; - - -typedef struct -{ - UINT8 app_id; - UINT16 blufi_hdl; - tBLUFI_CBACK* blufi_cback; - -}tBLUFI_INST; - - -/* service engine control block */ -typedef struct -{ - BOOLEAN enabled; - BOOLEAN is_primery; - UINT8 inst_id; - tGATT_IF gatt_if; - tBLUFI_CLCB clcb; /* connection link*/ - tBLUFI_INST blufi_inst; -} tBLUFI_CB_ENV; - -void blufi_create_service(void); - -tBLUFI_CLCB *blufi_env_clcb_alloc(UINT16 conn_id, BD_ADDR bda); - -UINT16 blufi_env_find_conn_id_by_bd_adddr(BD_ADDR bda); - -BOOLEAN blufi_env_clcb_dealloc(UINT16 conn_id); - -tGATT_STATUS blufi_profile_init(tBLUFI_CBACK *call_back); - -void blufi_msg_notify(UINT8 *blufi_msg, UINT8 len); - diff --git a/components/bt/bluedroid/profiles/esp/wechat_AirSync/wx_airsync_prf.c b/components/bt/bluedroid/profiles/esp/wechat_AirSync/wx_airsync_prf.c deleted file mode 100644 index ac7efe58d..000000000 --- a/components/bt/bluedroid/profiles/esp/wechat_AirSync/wx_airsync_prf.c +++ /dev/null @@ -1,284 +0,0 @@ -#include "wx_airsync_prf.h" -// Copyright 2015-2016 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. - - -#if (WX_AIRSYNC_CFG) - -#include - -#include -#include -#include - -#include "bt_target.h" -#include "bt_trace.h" -#include "bt_types.h" -#include "gatt_api.h" -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "bta_gatts_int.h" - - - -tAIRSYNC_CB_ENV airsync_cb_env; - - -/***************************************************************************** -** Constants -*****************************************************************************/ -static void airsync_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); - - -/******************************************************************************* -** -** Function airsync_profile_cb -** -** Description the callback function after the profile has been register to the BTA manager module -** -** Returns NULL -** -*******************************************************************************/ -static void airsync_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) -{ - esp_gatts_rsp_t rsp; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_AIRSYNC}}; - tAirSync_INST *p_inst = &airsync_cb_env.airsync_inst; - - - LOG_ERROR("airsync profile cb event = %x\n",event); - switch(event) - { - case ESP_GATTS_REG_EVT: - - if(p_data->reg_oper.status != BTA_GATT_OK) - { - LOG_ERROR("button profile register failed\n"); - } - airsync_cb_env.gatt_if = p_data->reg_oper.server_if; - airsync_cb_env.enabled = true; - - if(p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_AIRSYNC) - { - AirSync_CreateService(); - } - break; - case ESP_GATTS_READ_EVT: - - if(airsync_cb_env.clcb.connected && airsync_cb_env.enabled){ - //tBTA_GATTS_RSP rsp; - memset(&rsp,0,sizeof(tBTA_GATTS_API_RSP)); - rsp.attr_value.handle = p_data->req_data.p_data->read_req.handle; - rsp.attr_value.len = 2; - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,&rsp); - } - break; - case ESP_GATTS_WRITE_EVT: - if(airsync_cb_env.clcb.connected && airsync_cb_env.enabled){ - esp_ble_gatts_send_rsp(p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,NULL); - - } - break; - case ESP_GATTS_CFM_EVT: - - break; - case ESP_GATTS_CREATE_EVT: - uuid.uu.uuid16 = ATT_CHAR_AIRSYNC_WIT; - - airsync_cb_env.clcb.cur_srvc_id= p_data->create.service_id; - airsync_cb_env.is_primery = p_data->create.is_primary; - //start the airsync service after created - esp_ble_gatts_start_srvc(p_data->create.service_id); - //add the frist airsync characteristic --> write characteristic - esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id,&uuid, - (GATT_PERM_WRITE|GATT_PERM_READ), - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE)); - break; - - case ESP_GATTS_ADD_CHAR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYNC_WIT) - { - uuid.uu.uuid16 = ATT_CHAR_AIRSYBC_NTF; - //tBTA_GATT_PERM perm = GATT_PERM_READ; - //tBTA_GATT_CHAR_PROP prop = (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY); - //save the att handle to the env - airsync_cb_env.airsync_inst.airsync_wirt_hdl = p_data->add_result.attr_id; - //add the second airsync characteristic --> Notify characteristic - esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id,&uuid, - GATT_PERM_READ,(GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_INDICATE)); - }else if(p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYBC_NTF){ - //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); - uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; - airsync_cb_env.airsync_inst.airsync_ntf_hdl = p_data->add_result.attr_id; - esp_ble_gatts_add_char_descr (airsync_cb_env.clcb.cur_srvc_id, - (GATT_PERM_WRITE|GATT_PERM_WRITE), - &uuid); - - uuid.uu.uuid16 = ATT_CHAR_AIRSYNC_READ; - //add the third airsync characteristic --> Read characteristic - esp_ble_gatts_add_char(airsync_cb_env.clcb.cur_srvc_id,&uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ); - }else if(p_data->add_result.char_uuid.uu.uuid16 == ATT_CHAR_AIRSYNC_READ){ - airsync_cb_env.airsync_inst.airsync_read_hdl = p_data->add_result.attr_id; - } - - break; - case ESP_GATTS_ADD_CHAR_DESCR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { - airsync_cb_env.airsync_inst.airsync_cfg_hdl = p_data->add_result.attr_id; - } - break; - case ESP_GATTS_CONNECT_EVT: - //set the connection flag to true - airsync_env_clcb_alloc(p_data->conn.conn_id, p_data->conn.remote_bda); - break; - case ESP_GATTS_DISCONNECT_EVT: - //set the connection flag to true - airsync_cb_env.clcb.connected = false; - break; - case ESP_GATTS_OPEN_EVT: - break; - case ESP_GATTS_CLOSE_EVT: - if(airsync_cb_env.clcb.connected && (airsync_cb_env.clcb.conn_id == p_data->conn.conn_id)) - { - //set the connection channal congested flag to true - airsync_cb_env.clcb.congest = p_data->congest.congested; - } - break; - case ESP_GATTS_CONGEST_EVT: - //set the congest flag - airsync_cb_env.clcb.congest = p_data->congest.congested; - break; - default: - break; - } -} - - -/******************************************************************************* -** -** Function AirSync_CreateService -** -** Description Create a Service for the airsync profile -** -** Returns NULL -** -*******************************************************************************/ -void AirSync_CreateService(void) -{ - esp_gatts_if_t server_if ; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_AIRSYNC}}; - UINT16 num_handle = WX_IDX_NB; - UINT8 inst = 0x00; - server_if = airsync_cb_env.gatt_if; - airsync_cb_env.inst_id = inst; - - esp_ble_gatts_create_srvc(server_if,&uuid,inst,num_handle,true); - -} - -/******************************************************************************* -** -** Function airsync_env_clcb_alloc -** -** Description The function allocates a GATT profile connection link control block -** -** Returns NULL if not found. Otherwise pointer to the connection link block. -** -*******************************************************************************/ -tAirSync_CLCB *airsync_env_clcb_alloc (UINT16 conn_id, BD_ADDR remote_bda) -{ - tAirSync_CLCB *p_clcb = NULL; - p_clcb = &airsync_cb_env.clcb; - - if(!p_clcb->in_use) - { - p_clcb->in_use = TRUE; - p_clcb->conn_id = conn_id; - LOG_ERROR("p_clcb->conn_id = %x\n",conn_id); - p_clcb->connected = TRUE; - memcpy(p_clcb->remote_bda,remote_bda,BD_ADDR_LEN); - } - - return p_clcb; -} - -/******************************************************************************* -** -** Function airsync_env_find_conn_id_by_bd_adddr -** -** Description The function searches all LCB with macthing bd address -** -** Returns total number of clcb found. -** -*******************************************************************************/ -UINT16 airsync_env_find_conn_id_by_bd_adddr(BD_ADDR remote_bda) -{ - UINT8 i_clcb; - tAirSync_CLCB *p_clcb = NULL; - - for(i_clcb = 0, p_clcb = &airsync_cb_env.clcb; i_clcb < 1; i_clcb++, p_clcb++) - { - if(p_clcb->in_use && p_clcb->connected &&memcmp(p_clcb->remote_bda,remote_bda,BD_ADDR_LEN)) - { - return p_clcb->conn_id; - } - } - - return GATT_INVALID_CONN_ID; -} - - -/******************************************************************************* -** -** Function airsync_init -** -** Description Initializa the GATT Service for airsync profiles. -** -*******************************************************************************/ -tGATT_STATUS AirSync_Init(tAIRSYNC_CBACK *call_back) -{ - esp_bt_uuid_t app_uuid = {LEN_UUID_16,{ATT_SVC_AIRSYNC}}; - - - if(airsync_cb_env.enabled) - { - LOG_ERROR("airsync svc already initaliezd\n"); - return ESP_GATT_ERROR; - } - else - { - memset(&airsync_cb_env,0,sizeof(tAIRSYNC_CB_ENV)); - } - - - if(call_back != NULL) - { - airsync_cb_env.airsync_inst.p_cback = call_back; - } - - - /* register the airsync profile to the BTA_GATTS module*/ - esp_ble_gatts_app_register(&app_uuid,airsync_profile_cb); - - airsync_cb_env.enabled = TRUE; - - return ESP_GATT_OK; -} - -#endif ///WX_AIRSYNC_CFG diff --git a/components/bt/bluedroid/profiles/std/battery/battery_prf.c b/components/bt/bluedroid/profiles/std/battery/battery_prf.c deleted file mode 100644 index ed32ff2f0..000000000 --- a/components/bt/bluedroid/profiles/std/battery/battery_prf.c +++ /dev/null @@ -1,624 +0,0 @@ -#include -// Copyright 2015-2016 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. - -#include -#include -#include - -//#include "bluedroid_test.h" -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "controller.h" - -#include "gatt_int.h" -#include "bt_trace.h" -#include "btm_api.h" -#include "bt_types.h" -#include "dis_api.h" - -#if BLE_INCLUDED == true - -#define BA_MAX_CHAR_NUM 1 -#define BA_MAX_ATTR_NUM (BA_MAX_CHAR_NUM * 5 + 1) -/*max 3 descriptors, 1 desclaration and 1 value*/ - -#ifndef BATTER_LEVEL_PROP -#define BATTER_LEVEL_PROP (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY) -#endif - -#ifndef BATTER_LEVEL_PERM -#define BATTER_LEVEL_PERM (GATT_PERM_READ) -#endif - -#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] -esp_gatts_if_t server_if; - -tBATTERY_CB battery_cb; -tGATT_CHAR_PROP prop = GATT_CHAR_PROP_BIT_READ; -tBA_REG_INFO ba_reg_info; -UINT8 attr_handle_bit = 0x00; - -extern tDIS_CB dis_cb; -esp_bt_uuid_t bas_uuid = {LEN_UUID_16, {UUID_SERVCLASS_BATTERY}}; -/****************************************************************************** -** Function bas_gatts_callback -** -** Description battery service register callback function -*******************************************************************************/ -static void bas_gatts_callback(esp_gatts_evt_t event, tBTA_GATTS* p_data) -{ - switch (event) - { - case ESP_GATTS_REG_EVT: - { - esp_gatt_status_t status = p_data->reg_oper.status; - server_if = p_data->reg_oper.server_if; - LOG_ERROR("BAS register completed: event=%d, status=%d, server_if=%d\n", - event, status, server_if); - - UINT8 app_id = 0xff; - bas_init(server_if, app_id); - - tDIS_ATTR_MASK mask = 0x01ff; - DIS_Init(server_if, mask); - } - break; - - /*connect callback*/ - case ESP_GATTS_CONNECT_EVT: - { - LOG_ERROR("\ndevice is connected "BT_BD_ADDR_STR", server_if=%d,reason=0x%x,connect_id=%d\n", - BT_BD_ADDR_HEX(p_data->conn.remote_bda), p_data->conn.server_if, - p_data->conn.reason, p_data->conn.conn_id); - /*return whether the remote device is currently connected*/ - int is_connected = BTA_DmGetConnectionState(p_data->conn.remote_bda); - LOG_ERROR("is_connected=%d\n",is_connected); - } - break; - - /*create service callback*/ - case ESP_GATTS_CREATE_EVT: - { - LOG_ERROR("create service:server_if=%d,service_id=0x%x,service_uuid=0x%x\n", - p_data->create.server_if, p_data->create.service_id, - p_data->create.uuid.uu.uuid16); - UINT16 service_uuid = p_data->create.uuid.uu.uuid16; - UINT16 service_id = p_data->create.service_id; - if (service_uuid == 0x180f) - { - tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_BATTERY_LEVEL}}; - bas_AddChar(service_id, &uuid); - } - if (service_uuid == 0x180a) - { - dis_cb.service_handle = service_id; - dis_cb.max_handle = service_id + DIS_MAX_ATTR_NUM; - dis_AddChar(service_id); - } - - } - break; - - case ESP_GATTS_ADD_CHAR_EVT: - { - LOG_ERROR("create characteristic:server_if=%d,service_id=0x%x,char_uuid=0x%x\n", - p_data->add_result.server_if, p_data->add_result.service_id, - p_data->add_result.char_uuid.uu.uuid16); - UINT16 char_uuid = p_data->add_result.char_uuid.uu.uuid16; - UINT16 service_id = p_data->add_result.service_id; - if(char_uuid == GATT_UUID_BATTERY_LEVEL) - bas_AddCharDescr(service_id, p_data->add_result.attr_id); - if(char_uuid == GATT_UUID_SYSTEM_ID | GATT_UUID_MODEL_NUMBER_STR | GATT_UUID_PNP_ID | - GATT_UUID_SERIAL_NUMBER_STR | GATT_UUID_FW_VERSION_STR | GATT_UUID_HW_VERSION_STR | - GATT_UUID_SW_VERSION_STR | GATT_UUID_MANU_NAME | GATT_UUID_IEEE_DATA) - { - switch (char_uuid) - { - case GATT_UUID_SYSTEM_ID: - dis_cb.dis_attr[0].handle = service_id; break; - case GATT_UUID_MODEL_NUMBER_STR: - dis_cb.dis_attr[1].handle = service_id; break; - case GATT_UUID_SERIAL_NUMBER_STR: - dis_cb.dis_attr[2].handle = service_id; break; - case GATT_UUID_FW_VERSION_STR: - dis_cb.dis_attr[3].handle = service_id; break; - case GATT_UUID_HW_VERSION_STR: - dis_cb.dis_attr[4].handle = service_id; break; - case GATT_UUID_SW_VERSION_STR: - dis_cb.dis_attr[5].handle = service_id; break; - case GATT_UUID_MANU_NAME: - dis_cb.dis_attr[6].handle = service_id; break; - case GATT_UUID_IEEE_DATA: - dis_cb.dis_attr[7].handle = service_id; break; - case GATT_UUID_PNP_ID: - dis_cb.dis_attr[8].handle = service_id; break; - } - } - } - break; - - case ESP_GATTS_ADD_CHAR_DESCR_EVT: - { - - LOG_ERROR("create descriptor:server_if=%d,service_id=0x%x,attr_id=0x%x,char_uuid=0x%x\n", - p_data->add_result.server_if, p_data->add_result.service_id, - p_data->add_result.attr_id, p_data->add_result.char_uuid.uu.uuid16); - bas_AddCharDescr(p_data->add_result.service_id, p_data->add_result.attr_id); - } - break; - - case ESP_GATTS_START_EVT: - { - LOG_ERROR("start service:server_if=%d,service_id=0x%x\n", p_data->srvc_oper.server_if, - p_data->srvc_oper.service_id); - bas_service_cmpl(p_data->srvc_oper.service_id, p_data->srvc_oper.status); - - /*start advertising*/ - //if(p_data->srvc_oper.status == GATT_SUCCESS) - // BTA_GATTS_Listen(server_if, true, NULL); - // BTA_GATTC_Broadcast(client_if, true); //non-connectable - } - break; - - case ESP_GATTS_READ_EVT: - { - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - UINT16 handle = p_data->req_data.p_data->read_req.handle; - bool is_long = p_data->req_data.p_data->read_req.is_long; - LOG_ERROR("read request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", - event, handle, trans_id, conn_id); - - if (dis_valid_handle_range(handle)) - { - tGATT_VALUE p_value; - p_value.handle = handle; - p_value.conn_id = conn_id; - p_value.offset = p_data->req_data.p_data->read_req.offset; - dis_s_read_attr_value(p_data->req_data.p_data, &p_value, trans_id, conn_id); - } - else - bas_s_read_attr_value(p_data->req_data.p_data, trans_id, conn_id); - } - break; - - case ESP_GATTS_WRITE_EVT: - { - - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - UINT16 handle = p_data->req_data.p_data->write_req.handle; - LOG_ERROR("write request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", - event, handle, trans_id, conn_id); - bas_s_write_attr_value(p_data->req_data.p_data, trans_id, conn_id, - p_data->req_data.remote_bda); - } - break; - - case ESP_GATTS_EXEC_WRITE_EVT: - { - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - UINT8 exec_write = p_data->req_data.p_data->exec_write; - LOG_ERROR("execute write request:event=0x%x,exce_write=0x%x,trans_id=0x%x,conn_id=0x%x\n", - event, exec_write, trans_id, conn_id); - } - break; - - case ESP_GATTS_MTU_EVT: - { - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - UINT16 mtu = p_data->req_data.p_data->mtu; - LOG_ERROR("exchange mtu request:event=0x%x,mtu=0x%x,trans_id=0x%x,conn_id=0x%x\n", - event, mtu, trans_id, conn_id); - } - break; - - case ESP_GATTS_CFM_EVT: - { - - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - LOG_ERROR("configue request:trans_id=0x%x,conn_id=0x%x\n", - trans_id, conn_id); - } - break; - - default: - LOG_ERROR("unsettled event: %d\n", event); - break; - } - -} -/****************************************************************************** -** Function bas_callback -** -** Description battery service callback for client request -*******************************************************************************/ -static void bas_callback(UINT32 trans_id, UINT16 conn_id, UINT8 app_id, - UINT8 event, tBA_WRITE_DATA *p_data) -{ - tBA_RSP_DATA p_rsp; - tGATT_STATUS st = ESP_GATT_OK; - switch(event) - { - case BA_READ_LEVEL_REQ : - { - LOG_ERROR("read battery level\n"); - p_rsp.ba_level = 60; //battery level - Battery_Rsp(trans_id, conn_id, app_id, st, event, &p_rsp); - } - break; - - case BA_READ_PRE_FMT_REQ : - { - LOG_ERROR("read presentation format\n"); - } - break; - - case BA_READ_CLT_CFG_REQ : - { - LOG_ERROR("read client characteristic configuration request\n"); - p_rsp.clt_cfg = 0x0001; //notification - Battery_Rsp(trans_id, conn_id, app_id, st, event, &p_rsp); - } - break; - - case BA_READ_RPT_REF_REQ : - { - LOG_ERROR("read report reference descriptor\n"); - } - break; - - /*battery level notify*/ - case BA_WRITE_CLT_CFG_REQ : - { - LOG_ERROR("write client characteristic configuration request\n"); - Battery_Rsp(trans_id, conn_id, app_id, st, event, NULL); - - int battery_level = 50; - Battery_Notify(conn_id, app_id, p_data->remote_bda, battery_level); - } - break; - - default: - break; - } - - return; -} -/***************************************************************************** -** Function bas_s_read_attr_value -** -** Description it will be called when client sends a read request -******************************************************************************/ -void bas_s_read_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, UINT16 conn_id) -{ - - tBA_INST *p_inst = &battery_cb.battery_inst[0]; - UINT8 i; - esp_gatt_status_t st = ESP_GATT_NOT_FOUND; - UINT16 handle = p_data->read_req.handle; - - - for (i = 0; i < BA_MAX_INT_NUM; i ++, p_inst ++) - { - // read battery level - if (handle == p_inst->ba_level_hdl || - handle == p_inst->clt_cfg_hdl || - handle == p_inst->rpt_ref_hdl || - handle == p_inst->pres_fmt_hdl) - { - if (p_data->read_req.is_long) - st = ESP_GATT_NOT_LONG; - - if (p_inst->p_cback) - { - if (handle == p_inst->ba_level_hdl) p_inst->pending_evt = BA_READ_LEVEL_REQ; - if (handle == p_inst->clt_cfg_hdl) p_inst->pending_evt = BA_READ_CLT_CFG_REQ; - if (handle == p_inst->pres_fmt_hdl) p_inst->pending_evt = BA_READ_PRE_FMT_REQ; - if (handle == p_inst->rpt_ref_hdl) p_inst->pending_evt = BA_READ_RPT_REF_REQ ; - - // p_inst->pending_clcb_idx = clcb_idx; - p_inst->pending_handle = handle; - //act = SRVC_ACT_PENDING; - (*p_inst->p_cback)(trans_id, conn_id, p_inst->app_id, p_inst->pending_evt, NULL); - } - else /* application is not registered */ - st = ESP_GATT_ERR_UNLIKELY; - break; - } - /* else attribute not found */ - } -} - -/***************************************************************************** -** Function bas_s_write_attr_value -** -** Description it will be called when client sends a write request -******************************************************************************/ -void bas_s_write_attr_value(tGATTS_DATA *p_data, UINT32 trans_id, UINT16 conn_id, BD_ADDR bd_addr) -{ - tBA_WRITE_DATA cfg; - UINT8 *p = p_data->write_req.value; - tBA_INST *p_inst = &battery_cb.battery_inst[0]; - UINT8 i; - esp_gatt_status_t st = ESP_GATT_NOT_FOUND; - UINT16 handle = p_data->write_req.handle; - - - for (i = 0; i < BA_MAX_INT_NUM; i ++, p_inst ++) - { - if (handle == p_inst->clt_cfg_hdl) - { - memcpy(cfg.remote_bda, bd_addr, BD_ADDR_LEN); - STREAM_TO_UINT16(cfg.clt_cfg, p); - - if (p_inst->p_cback) - { - p_inst->pending_evt = BA_WRITE_CLT_CFG_REQ; - p_inst->pending_handle = handle; - cfg.need_rsp = p_data->write_req.need_rsp; - (*p_inst->p_cback)(trans_id, conn_id, p_inst->app_id, p_inst->pending_evt, &cfg); - } - else /* all other handle is not writable */ - st = ESP_GATT_WRITE_NOT_PERMIT; - break; - } - - } -} -/*************************************************************** -** -** Function bas_register -** -** Description register app for battery service -** -****************************************************************/ -void bas_register(void) -{ - esp_ble_gatts_app_register(&bas_uuid, bas_gatts_callback); - -} -/*************************************************************** -** -** Function bas_init -** -** Description register battery service -** -****************************************************************/ -void bas_init(tBTA_GATTS_IF gatt_if, UINT16 app_id) -{ - - tBA_INST *p_inst; - - ba_reg_info.is_pri = true; - ba_reg_info.ba_level_descr = BA_LEVEL_NOTIFY; - ba_reg_info.transport = GATT_TRANSPORT_LE; - ba_reg_info.p_cback = bas_callback; - if (battery_cb.inst_id == BA_MAX_INT_NUM) - { - GATT_TRACE_ERROR("MAX battery service has been reached\n"); - return; - } - - p_inst = &battery_cb.battery_inst[battery_cb.inst_id]; - - LOG_ERROR("create battery service\n"); - LOG_ERROR("inst_id=%d\n", battery_cb.inst_id); - esp_ble_gatts_create_srvc (gatt_if, &bas_uuid, battery_cb.inst_id , - BA_MAX_ATTR_NUM, ba_reg_info.is_pri); - - battery_cb.inst_id ++; - - p_inst->app_id = app_id; - p_inst->p_cback = ba_reg_info.p_cback; - -} - -/*************************************************************** -** -** Function bas_AddChar -** -** Description add characteristic for battery service -** -****************************************************************/ -void bas_AddChar(UINT16 service_id, tBT_UUID *char_uuid) -{ - if (ba_reg_info.ba_level_descr & BA_LEVEL_NOTIFY) - prop |= GATT_CHAR_PROP_BIT_NOTIFY; - attr_handle_bit = 0x01; - esp_ble_gatts_add_char(service_id, char_uuid, BATTER_LEVEL_PERM, prop); - -} - -/*************************************************************** -** -** Function bas_AddCharDescr -** -** Description add descriptor for battery service if needed -** -****************************************************************/ -void bas_AddCharDescr(UINT16 service_id, UINT16 attr_id) -{ - tBT_UUID uuid; - uuid.len = LEN_UUID_16; - - battery_cb.inst_id --; - tBA_INST *p_inst = &battery_cb.battery_inst[battery_cb.inst_id++]; - /*store the attribute handles*/ - if(attr_handle_bit == 0x01) - p_inst->ba_level_hdl = attr_id; - else if(attr_handle_bit == 0x02) - p_inst->clt_cfg_hdl = attr_id; - else if(attr_handle_bit == 0x04) - p_inst->pres_fmt_hdl = attr_id; - else if(attr_handle_bit == 0x08) - p_inst->rpt_ref_hdl = attr_id; - - - if (ba_reg_info.ba_level_descr != 0) - { - if (ba_reg_info.ba_level_descr & BA_LEVEL_NOTIFY) - { - uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; - ba_reg_info.ba_level_descr &= 0xfe; - attr_handle_bit = 0x02; - esp_ble_gatts_add_char_descr(service_id, (GATT_PERM_READ|GATT_PERM_WRITE), &uuid); - return; - } - - /* need presentation format descriptor? */ - if (ba_reg_info.ba_level_descr & BA_LEVEL_PRE_FMT) - { - uuid.uu.uuid16 = GATT_UUID_CHAR_PRESENT_FORMAT; - esp_ble_gatts_add_char_descr(service_id, GATT_PERM_READ, &uuid); - ba_reg_info.ba_level_descr &= 0xfd; - attr_handle_bit = 0x04; - return; - } - /* need report reference format descriptor? */ - if (ba_reg_info.ba_level_descr & BA_LEVEL_RPT_REF) - { - uuid.uu.uuid16 = GATT_UUID_RPT_REF_DESCR; - ba_reg_info.ba_level_descr &= 0xfb; - esp_ble_gatts_add_char_descr(service_id, GATT_PERM_READ, &uuid); - attr_handle_bit = 0x08; - return; - } - } - - else - esp_ble_gatts_start_srvc(service_id); - -} - -/*************************************************************** -** -** Function bas_service_cmpl -** -** Description create battery service complete -** -****************************************************************/ -void bas_service_cmpl(UINT16 service_id, esp_gatt_status_t status) -{ - if(status != ESP_GATT_OK) - { - battery_cb.inst_id --; - esp_ble_gatts_dele_srvc(service_id); - } - -} -/******************************************************************************* -** -** Function Battery_Rsp -** -** Description Respond to a battery service request -** -*******************************************************************************/ -void Battery_Rsp (UINT32 trans_id, UINT16 conn_id, UINT8 app_id, - esp_gatt_status_t st, UINT8 event, tBA_RSP_DATA *p_rsp) -{ - tBA_INST *p_inst = &battery_cb.battery_inst[0]; - tGATTS_RSP rsp; - UINT8 *pp; - - UINT8 i = 0; - while (i < BA_MAX_INT_NUM) - { - if (p_inst->app_id == app_id && p_inst->ba_level_hdl != 0) - break; - i ++; - } - - if (i == BA_MAX_INT_NUM) - return; - - memset(&rsp, 0, sizeof(tGATTS_RSP)); - - if (p_inst->pending_evt == event) - { - switch (event) - { - case BA_READ_CLT_CFG_REQ: - rsp.attr_value.handle = p_inst->pending_handle; - rsp.attr_value.len = 2; - pp = rsp.attr_value.value; - UINT16_TO_STREAM(pp, p_rsp->clt_cfg); - esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); - //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); - break; - - case BA_READ_LEVEL_REQ: - rsp.attr_value.handle = p_inst->pending_handle; - rsp.attr_value.len = 1; - pp = rsp.attr_value.value; - UINT8_TO_STREAM(pp, p_rsp->ba_level); - esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); - //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); - break; - - case BA_WRITE_CLT_CFG_REQ: - esp_ble_gatts_send_rsp(conn_id, trans_id, st, NULL); - //srvc_sr_rsp(p_inst->pending_clcb_idx, st, NULL); - break; - - case BA_READ_RPT_REF_REQ: - rsp.attr_value.handle = p_inst->pending_handle; - rsp.attr_value.len = 2; - pp = rsp.attr_value.value; - UINT8_TO_STREAM(pp, p_rsp->rpt_ref.rpt_id); - UINT8_TO_STREAM(pp, p_rsp->rpt_ref.rpt_type); - esp_ble_gatts_send_rsp(conn_id, trans_id, st, &rsp); - //srvc_sr_rsp(p_inst->pending_clcb_idx, st, &rsp); - break; - - default: - break; - } - // p_inst->pending_clcb_idx = 0; - p_inst->pending_evt = 0; - p_inst->pending_handle = 0; - } - return; -} -/******************************************************************************* -** -** Function Battery_Notify -** -** Description Send battery level notification -** -*******************************************************************************/ -void Battery_Notify (UINT16 conn_id, UINT8 app_id, BD_ADDR remote_bda, UINT8 battery_level) -{ - tBA_INST *p_inst = &battery_cb.battery_inst[0]; - UINT8 i = 0; - - while (i < BA_MAX_INT_NUM) - { - if (p_inst->app_id == app_id && p_inst->ba_level_hdl != 0) - break; - i ++; - } - - if (i == BA_MAX_INT_NUM || p_inst->clt_cfg_hdl == 0) - return; - esp_ble_gatts_hdl_val_indica(conn_id, p_inst->ba_level_hdl, 1, &battery_level, false); - //srvc_sr_notify(remote_bda, p_inst->ba_level_hdl, 1, &battery_level); - -} -#endif diff --git a/components/bt/bluedroid/profiles/std/hid_le/hid_le_prf.c b/components/bt/bluedroid/profiles/std/hid_le/hid_le_prf.c deleted file mode 100644 index 9978524dd..000000000 --- a/components/bt/bluedroid/profiles/std/hid_le/hid_le_prf.c +++ /dev/null @@ -1,661 +0,0 @@ -#include -// Copyright 2015-2016 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. - -#include "hid_le_prf.h" -#include "prf_defs.h" - -#if (HIDD_LE_PROFILE_CFG) -hidd_le_env_t hidd_le_env; - -#define HI_UINT16(a) (((a) >> 8) & 0xFF) -#define LO_UINT16(a) ((a) & 0xFF) - - -// HID Information characteristic value -static const uint8_t hidInfo[HID_INFORMATION_LEN] = -{ - LO_UINT16(0x0111), HI_UINT16(0x0111), // bcdHID (USB HID version) - 0x00, // bCountryCode - HID_KBD_FLAGS // Flags -}; - -// HID Report Map characteristic value -// Keyboard report descriptor (using format for Boot interface descriptor) -static const uint8_t hidReportMap[] = -{ - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x02, // Usage (Mouse) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report Id (1) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x05, 0x09, // Usage Page (Buttons) - 0x19, 0x01, // Usage Minimum (01) - Button 1 - 0x29, 0x03, // Usage Maximum (03) - Button 3 - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x03, // Report Count (3) - 0x81, 0x02, // Input (Data, Variable, Absolute) - Button states - 0x75, 0x05, // Report Size (5) - 0x95, 0x01, // Report Count (1) - 0x81, 0x01, // Input (Constant) - Padding or Reserved bits - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x38, // Usage (Wheel) - 0x15, 0x81, // Logical Minimum (-127) - 0x25, 0x7F, // Logical Maximum (127) - 0x75, 0x08, // Report Size (8) - 0x95, 0x03, // Report Count (3) - 0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate - 0xC0, // End Collection - 0xC0, // End Collection - - 0x05, 0x01, // Usage Pg (Generic Desktop) - 0x09, 0x06, // Usage (Keyboard) - 0xA1, 0x01, // Collection: (Application) - 0x85, 0x02, // Report Id (2) - // - 0x05, 0x07, // Usage Pg (Key Codes) - 0x19, 0xE0, // Usage Min (224) - 0x29, 0xE7, // Usage Max (231) - 0x15, 0x00, // Log Min (0) - 0x25, 0x01, // Log Max (1) - // - // Modifier byte - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x81, 0x02, // Input: (Data, Variable, Absolute) - // - // Reserved byte - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x01, // Input: (Constant) - // - // LED report - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) - 0x05, 0x08, // Usage Pg (LEDs) - 0x19, 0x01, // Usage Min (1) - 0x29, 0x05, // Usage Max (5) - 0x91, 0x02, // Output: (Data, Variable, Absolute) - // - // LED report padding - 0x95, 0x01, // Report Count (1) - 0x75, 0x03, // Report Size (3) - 0x91, 0x01, // Output: (Constant) - // - // Key arrays (6 bytes) - 0x95, 0x06, // Report Count (6) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Log Min (0) - 0x25, 0x65, // Log Max (101) - 0x05, 0x07, // Usage Pg (Key Codes) - 0x19, 0x00, // Usage Min (0) - 0x29, 0x65, // Usage Max (101) - 0x81, 0x00, // Input: (Data, Array) - // - 0xC0, // End Collection - // - 0x05, 0x0C, // Usage Pg (Consumer Devices) - 0x09, 0x01, // Usage (Consumer Control) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x03, // Report Id (3) - 0x09, 0x02, // Usage (Numeric Key Pad) - 0xA1, 0x02, // Collection (Logical) - 0x05, 0x09, // Usage Pg (Button) - 0x19, 0x01, // Usage Min (Button 1) - 0x29, 0x0A, // Usage Max (Button 10) - 0x15, 0x01, // Logical Min (1) - 0x25, 0x0A, // Logical Max (10) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x00, // Input (Data, Ary, Abs) - 0xC0, // End Collection - 0x05, 0x0C, // Usage Pg (Consumer Devices) - 0x09, 0x86, // Usage (Channel) - 0x15, 0xFF, // Logical Min (-1) - 0x25, 0x01, // Logical Max (1) - 0x75, 0x02, // Report Size (2) - 0x95, 0x01, // Report Count (1) - 0x81, 0x46, // Input (Data, Var, Rel, Null) - 0x09, 0xE9, // Usage (Volume Up) - 0x09, 0xEA, // Usage (Volume Down) - 0x15, 0x00, // Logical Min (0) - 0x75, 0x01, // Report Size (1) - 0x95, 0x02, // Report Count (2) - 0x81, 0x02, // Input (Data, Var, Abs) - 0x09, 0xE2, // Usage (Mute) - 0x09, 0x30, // Usage (Power) - 0x09, 0x83, // Usage (Recall Last) - 0x09, 0x81, // Usage (Assign Selection) - 0x09, 0xB0, // Usage (Play) - 0x09, 0xB1, // Usage (Pause) - 0x09, 0xB2, // Usage (Record) - 0x09, 0xB3, // Usage (Fast Forward) - 0x09, 0xB4, // Usage (Rewind) - 0x09, 0xB5, // Usage (Scan Next) - 0x09, 0xB6, // Usage (Scan Prev) - 0x09, 0xB7, // Usage (Stop) - 0x15, 0x01, // Logical Min (1) - 0x25, 0x0C, // Logical Max (12) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x00, // Input (Data, Ary, Abs) - 0x09, 0x80, // Usage (Selection) - 0xA1, 0x02, // Collection (Logical) - 0x05, 0x09, // Usage Pg (Button) - 0x19, 0x01, // Usage Min (Button 1) - 0x29, 0x03, // Usage Max (Button 3) - 0x15, 0x01, // Logical Min (1) - 0x25, 0x03, // Logical Max (3) - 0x75, 0x02, // Report Size (2) - 0x81, 0x00, // Input (Data, Ary, Abs) - 0xC0, // End Collection - 0x81, 0x03, // Input (Const, Var, Abs) - 0xC0 // End Collection -}; - -// HID report map length -uint8_t hidReportMapLen = sizeof(hidReportMap); - -uint8_t hidProtocolMode = HID_PROTOCOL_MODE_REPORT; - -// HID report mapping table -static hidRptMap_t hidRptMap[HID_NUM_REPORTS]; - - -esp_bt_uuid_t char_info_uuid = {LEN_UUID_16, {CHAR_HID_INFO_UUID}}; -esp_bt_uuid_t char_ctnl_pt_uuid = {LEN_UUID_16, {CHAR_HID_CTNL_PT_UUID}}; -esp_bt_uuid_t char_report_map_uuid = {LEN_UUID_16, {CHAR_REPORT_MAP_UUID}}; -esp_bt_uuid_t char_report_uuid = {LEN_UUID_16, {CHAR_REPORT_UUID}}; -esp_bt_uuid_t char_proto_mode_uuid = {LEN_UUID_16, {CHAR_PROTOCOL_MODE_UUID}}; -esp_bt_uuid_t char_kb_in_report_uuid = {LEN_UUID_16, {CHAR_BOOT_KB_IN_REPORT_UUID}}; -esp_bt_uuid_t char_kb_out_report_uuid = {LEN_UUID_16,{CHAR_BOOT_KB_OUT_REPORT_UUID}}; -esp_bt_uuid_t char_mouse_in_report_uuid = {LEN_UUID_16,{CHAR_BOOT_MOUSE_IN_REPORT_UUID}}; - - - -/// Full HID device Database Description - Used to add attributes into the database -const char_desc_t hids_char_db[HIDD_LE_CHAR_MAX] = -{ - // HID Information Characteristic Value - [HIDD_LE_INFO_CHAR] = { - &char_info_uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ - }, - - // HID Control Point Characteristic Value - [HIDD_LE_CTNL_PT_CHAR] = { - &char_ctnl_pt_uuid, - GATT_PERM_WRITE, - GATT_CHAR_PROP_BIT_WRITE_NR - }, - - // Report Map Characteristic Value - [HIDD_LE_REPORT_MAP_CHAR] = { - &char_report_map_uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ - }, - // Report Characteristic Value - [HIDD_LE_REPORT_CHAR] = { - &char_report_uuid, - (GATT_PERM_READ|GATT_PERM_WRITE), - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE|GATT_CHAR_PROP_BIT_WRITE_NR) - }, - // Protocol Mode Characteristic Declaration - [HIDD_LE_PROTO_MODE_CHAR] = { - &char_proto_mode_uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ, - }, - - // Boot Keyboard Input Report Characteristic Value - [HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = { - &char_kb_in_report_uuid, - GATT_PERM_READ, - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY), - - }, - - // Boot Keyboard Output Report Characteristic Value - [HIDD_LE_BOOT_KB_OUT_REPORT_CHAR] = { - &char_kb_out_report_uuid, - GATT_PERM_READ, - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_WRITE|GATT_CHAR_PROP_BIT_WRITE_NR) - }, - - // Boot Mouse Input Report Characteristic Value - [HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR] = { - &char_mouse_in_report_uuid, - GATT_PERM_READ, - (GATT_CHAR_PROP_BIT_READ|GATT_CHAR_PROP_BIT_NOTIFY), - }, -}; - -static void hidd_add_characterisitc(const char_desc_t *char_desc); - -/***************************************************************************** -** Constants -*****************************************************************************/ -static void hidd_le_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data); - -/******************************************************************************* -** -** Function hidd_add_characterisitc -** -** Description the callback function after the hid device profile has been register to the BTA manager module -** -** Returns NULL -** -*******************************************************************************/ -static void hidd_add_characterisitc(const char_desc_t *char_desc) -{ - uint16_t service_id; - if(char_desc == NULL) - { - LOG_ERROR("Invalid hid characteristic\n"); - return; - } - //check the hid device serivce has been register to the data base or not - if(!hidd_le_env.enabled) - { - LOG_ERROR("The hid device didn't register yet\n"); - return; - } - //get the service id from the env whitch has been register - service_id = hidd_le_env.hidd_clcb.cur_srvc_id; - if(char_desc->char_uuid != 0x00) - { - // start added the charact to the data base - esp_ble_gatts_add_char (service_id, - char_desc->char_uuid, - char_desc->perm, - char_desc->prop); - } -} - - -/******************************************************************************* -** -** Function hidd_le_profile_cb -** -** Description the callback function after the hid device profile has been register to the BTA manager module -** -** Returns NULL -** -*******************************************************************************/ -static void hidd_le_profile_cb(esp_gatts_evt_t event, esp_gatts_t *p_data) -{ - esp_gatts_rsp_t rsp; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_HID}}; - static uint8_t hid_char_idx; - hidd_clcb_t *p_clcb = NULL; - uint8_t app_id = 0xff; - - switch(event) - { - case ESP_GATTS_REG_EVT: - //check the register of the hid device profile has been succeess or not - if(p_data->reg_oper.status != ESP_GATT_OK) - { - LOG_ERROR("hidd profile register failed\n"); - } - hidd_le_env.hidd_inst.app_id = app_id; - //save the gatt interface in the hid device ENV - hidd_le_env.gatt_if = p_data->reg_oper.server_if; - //set the env flag to enable - hidd_le_env.enabled = true; - //create the hid device service to the service data base. - if(p_data->reg_oper.uuid.uu.uuid16 == ATT_SVC_HID) - { - hidd_le_create_service(true); - } - break; - case ESP_GATTS_CREATE_EVT: - if(p_data->create.uuid.uu.uuid16 == ATT_SVC_HID) - { - ///store the service id to the env - hidd_le_env.hidd_clcb.cur_srvc_id = p_data->create.service_id; - //start the button service after created - esp_ble_gatts_start_srvc(p_data->create.service_id); - hid_char_idx = HIDD_LE_INFO_CHAR; - //added the info character to the data base. - hidd_add_characterisitc(&hids_char_db[hid_char_idx]); - hid_char_idx++; - } - - break; - case ESP_GATTS_ADD_INCL_SRVC_EVT: - - break; - case ESP_GATTS_ADD_CHAR_EVT: - //save the charateristic handle to the env - hidd_le_env.hidd_inst.att_tbl[hid_char_idx-1] = p_data->add_result.attr_id; - LOG_ERROR("hanlder = %x, p_data->add_result.char_uuid.uu.uuid16 = %x\n",p_data->add_result.attr_id, - p_data->add_result.char_uuid.uu.uuid16); - LOG_ERROR("hid_char_idx=%x\n",hid_char_idx); - if(hid_char_idx <= HIDD_LE_CHAR_MAX) //added the characteristic until the index overflow - { - - if((p_data->add_result.char_uuid.uu.uuid16 == CHAR_BOOT_KB_IN_REPORT_UUID) || - (p_data->add_result.char_uuid.uu.uuid16 == CHAR_BOOT_MOUSE_IN_REPORT_UUID)) - { - // add the gattc config descriptor to the notify charateristic - //tBTA_GATT_PERM perm = (GATT_PERM_WRITE|GATT_PERM_WRITE); - uuid.uu.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; - LOG_ERROR("p_data->add_result.char_uuid.uu.uuid16 = %x\n", - p_data->add_result.char_uuid.uu.uuid16); - esp_ble_gatts_add_char_descr (hidd_le_env.hidd_clcb.cur_srvc_id, - GATT_PERM_WRITE, - &uuid); - - - break; - } - hidd_add_characterisitc(&hids_char_db[hid_char_idx]); - } - hid_char_idx++; - break; - case ESP_GATTS_ADD_CHAR_DESCR_EVT: - if(p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { - uuid.uu.uuid16 = GATT_UUID_RPT_REF_DESCR; - BTA_GATTS_AddCharDescriptor (hidd_le_env.hidd_clcb.cur_srvc_id, - GATT_PERM_READ, - &uuid); - LOG_ERROR("p_data->add_result.char_uuid.uu.uuid16 = %x\n", - p_data->add_result.char_uuid.uu.uuid16); - } - if(p_data->add_result.char_uuid.uu.uuid16 == GATT_UUID_RPT_REF_DESCR) - { - if(hid_char_idx < HIDD_LE_CHAR_MAX) - { - hidd_add_characterisitc(&hids_char_db[hid_char_idx]); - hid_char_idx++; - } - } - break; - case ESP_GATTS_READ_EVT: - { - LOG_ERROR("Hidd profile BTA_GATTS_READ_EVT\n"); - UINT32 trans_id = p_data->req_data.trans_id; - UINT16 conn_id = p_data->req_data.conn_id; - UINT16 handle = p_data->req_data.p_data->read_req.handle; - bool is_long = p_data->req_data.p_data->read_req.is_long; - LOG_ERROR("read request:event=0x%x,handle=0x%x,trans_id=0x%x,conn_id=0x%x\n", - event, handle, trans_id, conn_id); - - hidd_read_attr_value(p_data->req_data.p_data,trans_id); - } - break; - case ESP_GATTS_WRITE_EVT: - esp_ble_gatts_send_rsp (p_data->req_data.conn_id,p_data->req_data.trans_id, - p_data->req_data.status,NULL); - break; - case ESP_GATTS_CONNECT_EVT: - p_clcb = &hidd_le_env.hidd_clcb; - - if(!p_clcb->in_use) - { - p_clcb->in_use = TRUE; - p_clcb->conn_id = p_data->conn.conn_id;; - LOG_ERROR("hidd->conn_id = %x\n",p_data->conn.conn_id); - p_clcb->connected = TRUE; - memcpy(p_clcb->remote_bda, p_data->conn.remote_bda,BD_ADDR_LEN); - } - break; - case ESP_GATTS_DISCONNECT_EVT: - p_clcb = &hidd_le_env.hidd_clcb; - //set the connection flag to true - p_clcb->connected = false; - p_clcb->in_use = TRUE; - memset(p_clcb->remote_bda, 0, BD_ADDR_LEN); - break; - case ESP_GATTS_START_EVT: - break; - case ESP_GATTS_CONGEST_EVT: - if(hidd_le_env.hidd_clcb.connected && (hidd_le_env.hidd_clcb.conn_id == p_data->conn.conn_id)) - { - //set the connection channal congested flag to true - hidd_le_env.hidd_clcb.congest = p_data->congest.congested; - } - break; - default: - break; - } -} - -/******************************************************************************* -** -** Function hidd_le_create_service -** -** Description Create a Service for the hid device profile -** -** Parameters is_primary: this service is the primary service or not,true is the primary service -** false is not the primary service -** p_service_uuid: service UUID. -** -** Returns NULL -** -*******************************************************************************/ -void hidd_le_create_service(BOOLEAN is_primary) -{ - esp_gatts_if_t server_if ; - esp_bt_uuid_t uuid = {LEN_UUID_16, {ATT_SVC_HID}}; - //the number of the hid device attributes in the hid service. - UINT16 num_handle = HIDD_LE_IDX_NB; - UINT8 inst = 0x00; - server_if = hidd_le_env.gatt_if; - hidd_le_env.inst_id = inst; - //start create the hid device service - esp_ble_gatts_create_srvc (server_if,&uuid,inst,num_handle,is_primary); -} - - -/***************************************************************************** -** Function hidd_read_attr_value -** -** Description it will be called when client sends a read request -******************************************************************************/ -void hidd_read_attr_value(tGATTS_DATA *p_data, uint32_t trans_id) -{ - hidd_inst_t *p_inst = &hidd_le_env.hidd_inst; - uint8_t i; - uint8_t status = ESP_GATT_OK; - uint8_t app_id = hidd_le_env.hidd_inst.app_id; - - esp_gatt_status_t st = ESP_GATT_NOT_FOUND; - uint16_t handle = p_data->read_req.handle; - uint16_t conn_id = hidd_le_env.hidd_clcb.conn_id; - - if (handle == p_inst->att_tbl[HIDD_LE_INFO_CHAR]) - { - //read hid device info evt - p_inst->pending_evt = HIDD_LE_READ_INFO_EVT; - - }else if(handle == p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]){ - //read hid device contol point evt - p_inst->pending_evt = HIDD_LE_READ_CTNL_PT_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]){ - //read hid device report map value evt - p_inst->pending_evt = HIDD_LE_READ_REPORT_MAP_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_REPORT_CHAR]){ - //read hid device report evt - p_inst->pending_evt = HIDD_LE_READ_REPORT_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]){ - //read hid device mode evt - p_inst->pending_evt = HIDD_LE_READ_PROTO_MODE_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]){ - //read hid boot keyboard in report evt - p_inst->pending_evt = HIDD_LE_BOOT_KB_IN_REPORT_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_BOOT_KB_OUT_REPORT_CHAR]){ - //read hid boot keyboard out report evt - p_inst->pending_evt = HIDD_LE_BOOT_KB_OUT_REPORT_EVT; - }else if(handle == p_inst->att_tbl[HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR]){ - //read hid device boot mouse in report evt - p_inst->pending_evt = HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT; - } - - //start build the rsp message - hidd_rsp(trans_id, conn_id, app_id, status, p_inst->pending_evt, p_data); -} - -/******************************************************************************* -** -** Function hidd_rsp -** -** Description Respond to a hid device service request -** -*******************************************************************************/ -void hidd_rsp (uint32_t trans_id, uint16_t conn_id, uint8_t app_id, - esp_gatt_status_t status, uint8_t event, tGATTS_DATA *p_rsp) -{ - hidd_inst_t *p_inst = &hidd_le_env.hidd_inst; - tGATTS_RSP rsp; - uint8_t *pp; - LOG_ERROR("conn_id = %x, trans_id = %x, event = %x\n", - conn_id,trans_id,event); - - if (p_inst->app_id == app_id) - return ; - - memset(&rsp, 0, sizeof(tGATTS_RSP)); - - if (p_inst->pending_evt == event) - { - switch (event) - { - case HIDD_LE_READ_INFO_EVT: - LOG_ERROR(" p_inst->att_tbl[HIDD_LE_INFO_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_INFO_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_INFO_CHAR]; - rsp.attr_value.len = HID_INFORMATION_LEN; - //copy the infomation value to the att value to sent to the peer device - memcpy(rsp.attr_value.value,hidInfo,HID_INFORMATION_LEN); - //start send the rsp to the peer device - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - - case HIDD_LE_READ_CTNL_PT_EVT: - LOG_ERROR(" p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_CTNL_PT_CHAR]; - rsp.attr_value.len = 0; - //start send the rsp to the peer device - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - - case HIDD_LE_READ_REPORT_MAP_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_REPORT_MAP_CHAR]; - rsp.attr_value.len = hidReportMapLen; - //copy the infomation value to the att value to sent to the peer device - memcpy(rsp.attr_value.value,hidReportMap,hidReportMapLen); - //start send the rsp to the peer device - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - case HIDD_LE_READ_REPORT_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; - rsp.attr_value.len = 0; - - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - case HIDD_LE_READ_PROTO_MODE_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_PROTO_MODE_CHAR]; - rsp.attr_value.len = 1; - pp = rsp.attr_value.value; - //copy the infomation value to the att value to sent to the peer device - memcpy(rsp.attr_value.value,&hidProtocolMode,rsp.attr_value.len); - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - case HIDD_LE_BOOT_KB_IN_REPORT_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; - rsp.attr_value.len = 0; - - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - case HIDD_LE_BOOT_KB_OUT_REPORT_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; - rsp.attr_value.len = 0; - - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - case HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT: - LOG_ERROR("p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR] = %x\n", - p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]); - rsp.attr_value.handle = p_inst->att_tbl[HIDD_LE_BOOT_KB_IN_REPORT_CHAR]; - rsp.attr_value.len = 0; - - esp_ble_gatts_send_rsp(conn_id, trans_id, status, &rsp); - break; - default: - break; - } - // p_inst->pending_clcb_idx = 0; - p_inst->pending_evt = 0; - p_inst->pending_hal = 0; - } - return; -} - - -/******************************************************************************* -** -** Function hidd_le_init -** -** Description Initializa the GATT Service for button profiles. -** Returns NULL -*******************************************************************************/ -esp_gatt_status_t hidd_le_init (void) -{ - tBT_UUID app_uuid = {LEN_UUID_16,{ATT_SVC_HID}}; - - if(hidd_le_env.enabled) - { - LOG_ERROR("hid device svc already initaliezd\n"); - return ESP_GATT_ERROR; - } - else - { - memset(&hidd_le_env,0,sizeof(hidd_le_env_t)); - } - - - /* - register the hid deivce profile to the BTA_GATTS module*/ - esp_ble_gatts_app_register(&app_uuid, hidd_le_profile_cb); - - hidd_le_env.enabled = TRUE; - - return ESP_GATT_OK; -} - - -#endif ///HIDD_LE_PROFILE_CFG - - diff --git a/components/bt/bluedroid/profiles/std/include/prf_defs.h b/components/bt/bluedroid/profiles/std/include/prf_defs.h deleted file mode 100644 index 242bb27fa..000000000 --- a/components/bt/bluedroid/profiles/std/include/prf_defs.h +++ /dev/null @@ -1,647 +0,0 @@ -#ifndef PRF_DEFS_H_ -// Copyright 2015-2016 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. - -#define PRF_DEFS_H_ - -#include "bta_api.h" -#include "bta_gattc_int.h" -#include "bta_gatts_int.h" -#include "bta_gatt_api.h" -#include "bt_types.h" -#include "esp_bt_defs.h" - - -#define ATT_HANDLE_LEN 0x0002 -#define ATT_UUID_16_LEN 0x0002 -#define ATT_UUID_128_LEN 0x0010 -#define ATT_UUID_32_LEN 0x0004 - -#define WX_AIRSYNC_CFG FALSE -#define BUT_PROFILE_CFG TRUE -#define HIDD_LE_PROFILE_CFG FALSE - -/* - * Type Definition - **************************************************************************************** - */ - -/* Define the header of each buffer used in the profile stack. -*/ -typedef struct -{ - uint16_t event; - uint16_t len; - uint8_t data[]; -} prf_hdr_evt_t; - - -/// Characteristic Value Descriptor -typedef struct -{ - ///characteristic uuid - esp_bt_uuid_t *char_uuid; - ///the permition of the characteristic - esp_gatt_perm_t perm; - /// the properties of the characteristic - esp_gatt_char_prop_t prop; -}char_desc_t; - -/// UUID - 128-bit type -typedef struct -{ - /// 128-bit UUID - uint8_t uuid[ATT_UUID_128_LEN]; -}uuid_128_t; - -/// UUID - 32-bit type -typedef struct -{ - /// 32-bit UUID - uint8_t uuid[ATT_UUID_32_LEN]; -}uuid_32_t; - -/// include service entry element -typedef struct -{ - /// start handle value of included service - uint16_t start_hdl; - /// end handle value of included service - uint16_t end_hdl; - /// attribute value UUID - uint16_t uuid; -}incl_svc_desc; - -/// Service Changed type definition -typedef struct -{ - /// Service start handle which changed - uint16_t start_hdl; - /// Service end handle which changed - uint16_t end_hdl; -}svc_chang_type_t; - - - -/// Common 16-bit Universal Unique Identifier -enum { - ATT_INVALID_UUID = 0, - /*----------------- SERVICES ---------------------*/ - /// Generic Access Profile - SVC_GENERIC_ACCESS_UUID = 0x1800, - /// Attribute Profile - SVC_GENERIC_ATTRIBUTE_UUID, - /// Immediate alert Service - SVC_IMMEDIATE_ALERT_UUID, - /// Link Loss Service - SVC_LINK_LOSS_UUID, - /// Tx Power Service - SVC_TX_POWER_UUID, - /// Current Time Service Service - SVC_CURRENT_TIME_UUID, - /// Reference Time Update Service - SVC_REF_TIME_UPDATE_UUID, - /// Next DST Change Service - SVC_NEXT_DST_CHANGE_UUID, - /// Glucose Service - SVC_GLUCOSE_UUID = 0x1808, - /// Health Thermometer Service - SVC_HEALTH_THERMOM_UUID = 0x1809, - /// Device Information Service - SVC_DEVICE_INFO_UUID = 0x180A, - /// Heart Rate Service - SVC_HEART_RATE_UUID = 0x180D, - /// Phone Alert Status Service - SVC_PHONE_ALERT_STATUS_UUID, - /// Battery Service - SVC_BATTERY_SERVICE_UUID, - /// Blood Pressure Service - SVC_BLOOD_PRESSURE_UUID = 0x1810, - /// Alert Notification Service - SVC_ALERT_NTF_UUID = 0x1811, - /// HID Service - SVC_HID_UUID = 0x1812, - /// Scan Parameters Service - SVC_SCAN_PARAMETERS_UUID = 0x1813, - /// Running Speed and Cadence Service - SVC_RUNNING_SPEED_CADENCE_UUID = 0x1814, - /// Cycling Speed and Cadence Service - SVC_CYCLING_SPEED_CADENCE_UUID = 0x1816, - /// Cycling Power Service - SVC_CYCLING_POWER_UUID = 0x1818, - /// Location and Navigation Service - SVC_LOCATION_AND_NAVIGATION_UUID = 0x1819, - /// User Data Service - SVC_USER_DATA_UUID = 0x181C, - /// Weight Scale Service - SVC_WEIGHT_SCALE_UUID = 0x181D, - - /*------------------- UNITS ---------------------*/ - /// No defined unit - UNIT_UNITLESS_UUID = 0x2700, - /// Length Unit - Metre - UNIT_METRE_UUID, - //Mass unit - Kilogram - UNIT_KG_UUID, - ///Time unit - second - UNIT_SECOND_UUID, - ///Electric current unit - Ampere - UNIT_AMPERE_UUID, - ///Thermodynamic Temperature unit - Kelvin - UNIT_KELVIN_UUID, - /// Amount of substance unit - mole - UNIT_MOLE_UUID, - ///Luminous intensity unit - candela - UNIT_CANDELA_UUID, - ///Area unit - square metres - UNIT_SQ_METRE_UUID = 0x2710, - ///Colume unit - cubic metres - UNIT_CUBIC_METRE_UUID, - ///Velocity unit - metres per second - UNIT_METRE_PER_SECOND_UUID, - ///Acceleration unit - metres per second squared - UNIT_METRES_PER_SEC_SQ_UUID, - ///Wavenumber unit - reciprocal metre - UNIT_RECIPROCAL_METRE_UUID, - ///Density unit - kilogram per cubic metre - UNIT_DENS_KG_PER_CUBIC_METRE_UUID, - ///Surface density unit - kilogram per square metre - UNIT_KG_PER_SQ_METRE_UUID, - ///Specific volume unit - cubic metre per kilogram - UNIT_CUBIC_METRE_PER_KG_UUID, - ///Current density unit - ampere per square metre - UNIT_AMPERE_PER_SQ_METRE_UUID, - ///Magnetic field strength unit - Ampere per metre - UNIT_AMPERE_PER_METRE_UUID, - ///Amount concentration unit - mole per cubic metre - UNIT_MOLE_PER_CUBIC_METRE_UUID, - ///Mass Concentration unit - kilogram per cubic metre - UNIT_MASS_KG_PER_CUBIC_METRE_UUID, - ///Luminance unit - candela per square metre - UNIT_CANDELA_PER_SQ_METRE_UUID, - ///Refractive index unit - UNIT_REFRACTIVE_INDEX_UUID, - ///Relative permeability unit - UNIT_RELATIVE_PERMEABILITY_UUID, - ///Plane angle unit - radian - UNIT_RADIAN_UUID = 0x2720, - ///Solid angle unit - steradian - UNIT_STERADIAN_UUID, - ///Frequency unit - Hertz - UNIT_HERTZ_UUID, - ///Force unit - Newton - UNIT_NEWTON_UUID, - ///Pressure unit - Pascal - UNIT_PASCAL_UUID, - ///Energy unit - Joule - UNIT_JOULE_UUID, - ///Power unit - Watt - UNIT_WATT_UUID, - ///electric Charge unit - Coulomb - UNIT_COULOMB_UUID, - ///Electric potential difference - Volt - UNIT_VOLT_UUID, - ///Capacitance unit - Farad - UNIT_FARAD_UUID, - ///electric resistance unit - Ohm - UNIT_OHM_UUID, - ///Electric conductance - Siemens - UNIT_SIEMENS_UUID, - ///Magnetic flux unit - Weber - UNIT_WEBER_UUID, - ///Magnetic flux density unit - Tesla - UNIT_TESLA_UUID, - ///Inductance unit - Henry - UNIT_HENRY_UUID, - ///Temperature unit - degree Celsius - UNIT_CELSIUS_UUID, - ///Luminous flux unit - lumen - UNIT_LUMEN_UUID, - //Illuminance unit - lux - UNIT_LUX_UUID, - ///Activity referred to a radionuclide unit - becquerel - UNIT_BECQUEREL_UUID, - ///Absorbed dose unit - Gray - UNIT_GRAY_UUID, - ///Dose equivalent unit - Sievert - UNIT_SIEVERT_UUID, - ///Catalytic activity unit - Katal - UNIT_KATAL_UUID, - ///Synamic viscosity unit - Pascal second - UNIT_PASCAL_SECOND_UUID = 0x2740, - ///Moment of force unit - Newton metre - UNIT_NEWTON_METRE_UUID, - ///surface tension unit - Newton per metre - UNIT_NEWTON_PER_METRE_UUID, - ///Angular velocity unit - radian per second - UNIT_RADIAN_PER_SECOND_UUID, - ///Angular acceleration unit - radian per second squared - UNIT_RADIAN_PER_SECOND_SQ_UUID, - ///Heat flux density unit - Watt per square metre - UNIT_WATT_PER_SQ_METRE_UUID, - ///HEat capacity unit - Joule per Kelvin - UNIT_JOULE_PER_KELVIN_UUID, - ///Specific heat capacity unit - Joule per kilogram kelvin - UNIT_JOULE_PER_KG_KELVIN_UUID, - ///Specific Energy unit - Joule per kilogram - UNIT_JOULE_PER_KG_UUID, - ///Thermal conductivity - Watt per metre Kelvin - UNIT_WATT_PER_METRE_KELVIN_UUID, - ///Energy Density unit - joule per cubic metre - UNIT_JOULE_PER_CUBIC_METRE_UUID, - ///Electric field strength unit - volt per metre - UNIT_VOLT_PER_METRE_UUID, - ///Electric charge density unit - coulomb per cubic metre - UNIT_COULOMB_PER_CUBIC_METRE_UUID, - ///Surface charge density unit - coulomb per square metre - UNIT_SURF_COULOMB_PER_SQ_METRE_UUID, - ///Electric flux density unit - coulomb per square metre - UNIT_FLUX_COULOMB_PER_SQ_METRE_UUID, - ///Permittivity unit - farad per metre - UNIT_FARAD_PER_METRE_UUID, - ///Permeability unit - henry per metre - UNIT_HENRY_PER_METRE_UUID, - ///Molar energy unit - joule per mole - UNIT_JOULE_PER_MOLE_UUID, - ///Molar entropy unit - joule per mole kelvin - UNIT_JOULE_PER_MOLE_KELVIN_UUID, - ///Exposure unit - coulomb per kilogram - UNIT_COULOMB_PER_KG_UUID, - ///Absorbed dose rate unit - gray per second - UNIT_GRAY_PER_SECOND_UUID, - ///Radiant intensity unit - watt per steradian - UNIT_WATT_PER_STERADIAN_UUID, - ///Radiance unit - watt per square meter steradian - UNIT_WATT_PER_SQ_METRE_STERADIAN_UUID, - ///Catalytic activity concentration unit - katal per cubic metre - UNIT_KATAL_PER_CUBIC_METRE_UUID, - ///Time unit - minute - UNIT_MINUTE_UUID = 0x2760, - ///Time unit - hour - UNIT_HOUR_UUID, - ///Time unit - day - UNIT_DAY_UUID, - ///Plane angle unit - degree - UNIT_ANGLE_DEGREE_UUID, - ///Plane angle unit - minute - UNIT_ANGLE_MINUTE_UUID, - ///Plane angle unit - second - UNIT_ANGLE_SECOND_UUID, - ///Area unit - hectare - UNIT_HECTARE_UUID, - ///Volume unit - litre - UNIT_LITRE_UUID, - ///Mass unit - tonne - UNIT_TONNE_UUID, - ///Pressure unit - bar - UNIT_BAR_UUID = 0x2780, - ///Pressure unit - millimetre of mercury - UNIT_MM_MERCURY_UUID, - ///Length unit - angstrom - UNIT_ANGSTROM_UUID, - ///Length unit - nautical mile - UNIT_NAUTICAL_MILE_UUID, - ///Area unit - barn - UNIT_BARN_UUID, - ///Velocity unit - knot - UNIT_KNOT_UUID, - ///Logarithmic radio quantity unit - neper - UNIT_NEPER_UUID, - ///Logarithmic radio quantity unit - bel - UNIT_BEL_UUID, - ///Length unit - yard - UNIT_YARD_UUID = 0x27A0, - ///Length unit - parsec - UNIT_PARSEC_UUID, - ///length unit - inch - UNIT_INCH_UUID, - ///length unit - foot - UNIT_FOOT_UUID, - ///length unit - mile - UNIT_MILE_UUID, - ///pressure unit - pound-force per square inch - UNIT_POUND_FORCE_PER_SQ_INCH_UUID, - ///velocity unit - kilometre per hour - UNIT_KM_PER_HOUR_UUID, - ///velocity unit - mile per hour - UNIT_MILE_PER_HOUR_UUID, - ///angular velocity unit - revolution per minute - UNIT_REVOLUTION_PER_MINUTE_UUID, - ///energy unit - gram calorie - UNIT_GRAM_CALORIE_UUID, - ///energy unit - kilogram calorie - UNIT_KG_CALORIE_UUID, - /// energy unit - kilowatt hour - UNIT_KILOWATT_HOUR_UUID, - ///thermodynamic temperature unit - degree Fahrenheit - UNIT_FAHRENHEIT_UUID, - ///percentage - UNIT_PERCENTAGE_UUID, - ///per mille - UNIT_PER_MILLE_UUID, - ///period unit - beats per minute) - UNIT_BEATS_PER_MINUTE_UUID, - ///electric charge unit - ampere hours - UNIT_AMPERE_HOURS_UUID, - ///mass density unit - milligram per decilitre - UNIT_MILLIGRAM_PER_DECILITRE_UUID, - ///mass density unit - millimole per litre - UNIT_MILLIMOLE_PER_LITRE_UUID, - ///time unit - year - UNIT_YEAR_UUID, - ////time unit - month - UNIT_MONTH_UUID, - - - /*---------------- DECLARATIONS -----------------*/ - /// Primary service Declaration - DECL_PRIMARY_SERVICE_UUID = 0x2800, - /// Secondary service Declaration - DECL_SECONDARY_SERVICE_UUID, - /// Include Declaration - DECL_INCLUDE_UUID, - /// Characteristic Declaration - DECL_CHARACTERISTIC_UUID, - - - /*----------------- DESCRIPTORS -----------------*/ - /// Characteristic extended properties - DESC_CHAR_EXT_PROPERTIES_UUID = 0x2900, - /// Characteristic user description - DESC_CHAR_USER_DESCRIPTION_UUID, - /// Client characteristic configuration - DESC_CLIENT_CHAR_CFG_UUID, - /// Server characteristic configuration - DESC_SERVER_CHAR_CFG_UUID, - /// Characteristic Presentation Format - DESC_CHAR_PRES_FORMAT_UUID, - /// Characteristic Aggregate Format - DESC_CHAR_AGGREGATE_FORMAT_UUID, - /// Valid Range - DESC_VALID_RANGE_UUID, - /// External Report Reference - DESC_EXT_REPORT_REF_UUID, - /// Report Reference - DESC_REPORT_REF_UUID, - - - /*--------------- CHARACTERISTICS ---------------*/ - /// Device name - CHAR_DEVICE_NAME_UUID = 0x2A00, - /// Appearance - CHAR_APPEARANCE_UUID = 0x2A01, - /// Privacy flag - CHAR_PRIVACY_FLAG_UUID = 0x2A02, - /// Reconnection address - CHAR_RECONNECTION_ADDR_UUID = 0x2A03, - /// Peripheral preferred connection parameters - CHAR_PERIPH_PREF_CON_PARAM_UUID = 0x2A04, - /// Service handles changed - CHAR_SERVICE_CHANGED_UUID = 0x2A05, - /// Alert Level characteristic - CHAR_ALERT_LEVEL_UUID = 0x2A06, - /// Tx Power Level - CHAR_TX_POWER_LEVEL_UUID = 0x2A07, - /// Date Time - CHAR_DATE_TIME_UUID = 0x2A08, - /// Day of Week - CHAR_DAY_WEEK_UUID = 0x2A09, - /// Day Date Time - CHAR_DAY_DATE_TIME_UUID = 0x2A0A, - /// Exact time 256 - CHAR_EXACT_TIME_256_UUID = 0x2A0C, - /// DST Offset - CHAR_DST_OFFSET_UUID = 0x2A0D, - /// Time zone - CHAR_TIME_ZONE_UUID = 0x2A0E, - /// Local time Information - CHAR_LOCAL_TIME_INFO_UUID = 0x2A0F, - /// Time with DST - CHAR_TIME_WITH_DST_UUID = 0x2A11, - /// Time Accuracy - CHAR_TIME_ACCURACY_UUID = 0x2A12, - ///Time Source - CHAR_TIME_SOURCE_UUID = 0x2A13, - /// Reference Time Information - CHAR_REFERENCE_TIME_INFO_UUID = 0x2A14, - /// Time Update Control Point - CHAR_TIME_UPDATE_CNTL_POINT_UUID = 0x2A16, - /// Time Update State - CHAR_TIME_UPDATE_STATE_UUID = 0x2A17, - /// Glucose Measurement - CHAR_GLUCOSE_MEAS_UUID = 0x2A18, - /// Battery Level - CHAR_BATTERY_LEVEL_UUID = 0x2A19, - /// Temperature Measurement - CHAR_TEMPERATURE_MEAS_UUID = 0x2A1C, - /// Temperature Type - CHAR_TEMPERATURE_TYPE_UUID = 0x2A1D, - /// Intermediate Temperature - CHAR_INTERMED_TEMPERATURE_UUID = 0x2A1E, - /// Measurement Interval - CHAR_MEAS_INTERVAL_UUID = 0x2A21, - /// Boot Keyboard Input Report - CHAR_BOOT_KB_IN_REPORT_UUID = 0x2A22, - /// System ID - CHAR_SYS_ID_UUID = 0x2A23, - /// Model Number String - CHAR_MODEL_NB_UUID = 0x2A24, - /// Serial Number String - CHAR_SERIAL_NB_UUID = 0x2A25, - /// Firmware Revision String - CHAR_FW_REV_UUID = 0x2A26, - /// Hardware revision String - CHAR_HW_REV_UUID = 0x2A27, - /// Software Revision String - CHAR_SW_REV_UUID = 0x2A28, - /// Manufacturer Name String - CHAR_MANUF_NAME_UUID = 0x2A29, - /// IEEE Regulatory Certification Data List - CHAR_IEEE_CERTIF_UUID = 0x2A2A, - /// CT Time - CHAR_CT_TIME_UUID = 0x2A2B, - /// Scan Refresh - CHAR_SCAN_REFRESH_UUID = 0x2A31, - /// Boot Keyboard Output Report - CHAR_BOOT_KB_OUT_REPORT_UUID = 0x2A32, - /// Boot Mouse Input Report - CHAR_BOOT_MOUSE_IN_REPORT_UUID = 0x2A33, - /// Glucose Measurement Context - CHAR_GLUCOSE_MEAS_CTX_UUID = 0x2A34, - /// Blood Pressure Measurement - CHAR_BLOOD_PRESSURE_MEAS_UUID = 0x2A35, - /// Intermediate Cuff Pressure - CHAR_INTERMEDIATE_CUFF_PRESSURE_UUID = 0x2A36, - /// Heart Rate Measurement - CHAR_HEART_RATE_MEAS_UUID = 0x2A37, - /// Body Sensor Location - CHAR_BODY_SENSOR_LOCATION_UUID = 0x2A38, - /// Heart Rate Control Point - CHAR_HEART_RATE_CNTL_POINT_UUID = 0x2A39, - /// Alert Status - CHAR_ALERT_STATUS_UUID = 0x2A3F, - /// Ringer Control Point - CHAR_RINGER_CNTL_POINT_UUID = 0x2A40, - /// Ringer Setting - CHAR_RINGER_SETTING_UUID = 0x2A41, - /// Alert Category ID Bit Mask - CHAR_ALERT_CAT_ID_BIT_MASK_UUID = 0x2A42, - /// Alert Category ID - CHAR_ALERT_CAT_ID_UUID = 0x2A43, - /// Alert Notification Control Point - CHAR_ALERT_NTF_CTNL_PT_UUID = 0x2A44, - /// Unread Alert Status - CHAR_UNREAD_ALERT_STATUS_UUID = 0x2A45, - /// New Alert - CHAR_NEW_ALERT_UUID = 0x2A46, - /// Supported New Alert Category - CHAR_SUP_NEW_ALERT_CAT_UUID = 0x2A47, - /// Supported Unread Alert Category - CHAR_SUP_UNREAD_ALERT_CAT_UUID = 0x2A48, - /// Blood Pressure Feature - CHAR_BLOOD_PRESSURE_FEATURE_UUID = 0x2A49, - /// HID Information - CHAR_HID_INFO_UUID = 0x2A4A, - /// Report Map - CHAR_REPORT_MAP_UUID = 0x2A4B, - /// HID Control Point - CHAR_HID_CTNL_PT_UUID = 0x2A4C, - /// Report - CHAR_REPORT_UUID = 0x2A4D, - /// Protocol Mode - CHAR_PROTOCOL_MODE_UUID = 0x2A4E, - /// Scan Interval Window - CHAR_SCAN_INTV_WD_UUID = 0x2A4F, - /// PnP ID - CHAR_PNP_ID_UUID = 0x2A50, - /// Glucose Feature - CHAR_GLUCOSE_FEATURE_UUID = 0x2A51, - /// Record access control point - CHAR_REC_ACCESS_CTRL_PT_UUID = 0x2A52, - /// RSC Measurement - CHAR_RSC_MEAS_UUID = 0x2A53, - /// RSC Feature - CHAR_RSC_FEAT_UUID = 0x2A54, - /// SC Control Point - CHAR_SC_CNTL_PT_UUID = 0x2A55, - /// CSC Measurement - CHAR_CSC_MEAS_UUID = 0x2A5B, - /// CSC Feature - CHAR_CSC_FEAT_UUID = 0x2A5C, - /// Sensor Location - CHAR_SENSOR_LOC_UUID = 0x2A5D, - /// CP Measurement - CHAR_CP_MEAS_UUID = 0x2A63, - /// CP Vector - CHAR_CP_VECTOR_UUID = 0x2A64, - /// CP Feature - CHAR_CP_FEAT_UUID = 0x2A65, - /// CP Control Point - CHAR_CP_CNTL_PT_UUID = 0x2A66, - /// Location and Speed - CHAR_LOC_SPEED_UUID = 0x2A67, - /// Navigation - CHAR_NAVIGATION_UUID = 0x2A68, - /// Position Quality - CHAR_POS_QUALITY_UUID = 0x2A69, - /// LN Feature - CHAR_LN_FEAT_UUID = 0x2A6A, - /// LN Control Point - CHAR_LN_CNTL_PT_UUID = 0x2A6B, - - /// Weight Scale Feature - CHAR_WS_FEAT_UUID = 0x2A9E, - /// Weight Scale Measurement - CHAR_WS_MEAS_UUID = 0x2A9D, - /// User height - CHAR_UDS_USER_HEIGHT_UUID = 0x2A8E, - /// User age - CHAR_UDS_USER_AGE_UUID = 0x2A80, - /// User date of birth - CHAR_UDS_USER_DATE_OF_BIRTH_UUID = 0x2A85, - /// User database change increment - CHAR_UDS_USER_DB_CHANGE_INCR_UUID = 0x2A99, - /// User Data Index - CHAR_UDS_USER_DATA_INDEX_UUID = 0x2A9A, - /// User Data Control Point - CHAR_UDS_USER_CTRL_PT_UUID = 0x2A9F, - /// Central Address Resolution - CHAR_CENT_ADDR_RES_UUID = 0x2AA6, - /// Last define - LAST -}; - -/// Format for Characteristic Presentation -enum { - /// unsigned 1-bit: true or false - FORMAT_BOOL_UUID = 0x01, - /// unsigned 2-bit integer - FORMAT_2BIT_UUID, - /// unsigned 4-bit integer - FORMAT_NIBBLE_UUID, - /// unsigned 8-bit integer - FORMAT_UINT8_UUID, - /// unsigned 12-bit integer - FORMAT_UINT12_UUID, - /// unsigned 16-bit integer - FORMAT_UINT16_UUID, - /// unsigned 24-bit integer - FORMAT_UINT24_UUID, - /// unsigned 32-bit integer - FORMAT_UINT32_UUID, - /// unsigned 48-bit integer - FORMAT_UINT48_UUID, - /// unsigned 64-bit integer - FORMAT_UINT64_UUID, - /// unsigned 128-bit integer - FORMAT_UINT128_UUID, - /// signed 8-bit integer - FORMAT_SINT8_UUID, - /// signed 12-bit integer - FORMAT_SINT12_UUID, - /// signed 16-bit integer - FORMAT_SINT16_UUID, - /// signed 24-bit integer - FORMAT_SINT24_UUID, - /// signed 32-bit integer - FORMAT_SINT32_UUID, - /// signed 48-bit integer - FORMAT_SINT48_UUID, - /// signed 64-bit integer - FORMAT_SINT64_UUID, - /// signed 128-bit integer - FORMAT_SINT128_UUID, - /// IEEE-754 32-bit floating point - FORMAT_FLOAT32_UUID, - /// IEEE-754 64-bit floating point - FORMAT_FLOAT64_UUID, - /// IEEE-11073 16-bit SFLOAT - FORMAT_SFLOAT_UUID, - /// IEEE-11073 32-bit FLOAT - FORMAT_FLOAT_UUID, - /// IEEE-20601 format - FORMAT_DUINT16_UUID, - /// UTF-8 string - FORMAT_UTF8S_UUID, - /// UTF-16 string - FORMAT_UTF16S_UUID, - /// Opaque structure - FORMAT_STRUCT_UUID, - /// Last format - FORMAT_LAST_UUID -}; - - -#endif ///PRF_DEFS_H_ - diff --git a/components/bt/bluedroid/stack/btm/btm_acl.c b/components/bt/bluedroid/stack/btm/btm_acl.c old mode 100755 new mode 100644 index 05055a09e..266254a52 --- a/components/bt/bluedroid/stack/btm/btm_acl.c +++ b/components/bt/bluedroid/stack/btm/btm_acl.c @@ -95,24 +95,21 @@ tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport) { tACL_CONN *p = &btm_cb.acl_db[0]; UINT16 xx; - if (bda) - { - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) - { + if (bda) { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN)) #if BLE_INCLUDED == TRUE - && p->transport == transport + && p->transport == transport #endif - ) - { + ) { BTM_TRACE_DEBUG ("btm_bda_to_acl found\n"); - return(p); + return (p); } } } /* If here, no BD Addr found */ - return((tACL_CONN *)NULL); + return ((tACL_CONN *)NULL); } /******************************************************************************* @@ -129,16 +126,14 @@ UINT8 btm_handle_to_acl_index (UINT16 hci_handle) tACL_CONN *p = &btm_cb.acl_db[0]; UINT8 xx; BTM_TRACE_DEBUG ("btm_handle_to_acl_index\n"); - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) - { - if ((p->in_use) && (p->hci_handle == hci_handle)) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { + if ((p->in_use) && (p->hci_handle == hci_handle)) { break; } } /* If here, no BD Addr found */ - return(xx); + return (xx); } #if BLE_PRIVACY_SPT == TRUE @@ -158,14 +153,12 @@ BOOLEAN btm_ble_get_acl_remote_addr(tBTM_SEC_DEV_REC *p_dev_rec, BD_ADDR conn_ad #if BLE_INCLUDED == TRUE BOOLEAN st = TRUE; - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR("btm_ble_get_acl_remote_addr can not find device with matching address\n"); return FALSE; } - switch (p_dev_rec->ble.active_addr_type) - { + switch (p_dev_rec->ble.active_addr_type) { case BTM_BLE_ADDR_PSEUDO: memcpy(conn_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); * p_addr_type = p_dev_rec->ble.ble_addr_type; @@ -214,27 +207,24 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, UINT8 xx; BTM_TRACE_DEBUG ("btm_acl_created hci_handle=%d link_role=%d transport=%d\n", - hci_handle,link_role, transport); + hci_handle, link_role, transport); /* Ensure we don't have duplicates */ p = btm_bda_to_acl(bda, transport); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { p->hci_handle = hci_handle; p->link_role = link_role; #if BLE_INCLUDED == TRUE p->transport = transport; #endif BTM_TRACE_DEBUG ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy); return; } /* Allocate acl_db entry */ - for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) - { - if (!p->in_use) - { + for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) { + if (!p->in_use) { p->in_use = TRUE; p->hci_handle = hci_handle; p->link_role = link_role; @@ -246,7 +236,7 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, #if BLE_PRIVACY_SPT == TRUE if (transport == BT_TRANSPORT_LE) btm_ble_refresh_local_resolvable_private_addr(bda, - btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr); + btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr); #else p->conn_addr_type = BLE_ADDR_PUBLIC; memcpy(p->conn_addr, &controller_get_interface()->get_address()->address, BD_ADDR_LEN); @@ -258,35 +248,33 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, btm_pm_sm_alloc(xx); - if (dc) + if (dc) { memcpy (p->remote_dc, dc, DEV_CLASS_LEN); + } - if (bdn) + if (bdn) { memcpy (p->remote_name, bdn, BTM_MAX_REM_BD_NAME_LEN); + } /* if BR/EDR do something more */ - if (transport == BT_TRANSPORT_BR_EDR) - { + if (transport == BT_TRANSPORT_BR_EDR) { btsnd_hcic_read_rmt_clk_offset (p->hci_handle); btsnd_hcic_rmt_ver_req (p->hci_handle); } p_dev_rec = btm_find_dev_by_handle (hci_handle); #if (BLE_INCLUDED == TRUE) - if (p_dev_rec ) - { + if (p_dev_rec ) { BTM_TRACE_DEBUG ("device_type=0x%x\n", p_dev_rec->device_type); } #endif - if (p_dev_rec && !(transport == BT_TRANSPORT_LE)) - { + if (p_dev_rec && !(transport == BT_TRANSPORT_LE)) { /* If remote features already known, copy them and continue connection setup */ if ((p_dev_rec->num_read_pages) && - (p_dev_rec->num_read_pages <= (HCI_EXT_FEATURES_PAGE_MAX + 1))) - { + (p_dev_rec->num_read_pages <= (HCI_EXT_FEATURES_PAGE_MAX + 1))) { memcpy (p->peer_lmp_features, p_dev_rec->features, - (HCI_FEATURE_BYTES_PER_PAGE * p_dev_rec->num_read_pages)); + (HCI_FEATURE_BYTES_PER_PAGE * p_dev_rec->num_read_pages)); p->num_read_pages = p_dev_rec->num_read_pages; const UINT8 req_pend = (p_dev_rec->sm4 & BTM_SM4_REQ_PEND); @@ -295,8 +283,7 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, btm_sec_set_peer_sec_caps(p, p_dev_rec); BTM_TRACE_API("%s: pend:%d\n", __FUNCTION__, req_pend); - if (req_pend) - { + if (req_pend) { /* Request for remaining Security Features (if any) */ l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); } @@ -307,24 +294,19 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, #if (BLE_INCLUDED == TRUE) /* If here, features are not known yet */ - if (p_dev_rec && transport == BT_TRANSPORT_LE) - { + if (p_dev_rec && transport == BT_TRANSPORT_LE) { #if BLE_PRIVACY_SPT == TRUE btm_ble_get_acl_remote_addr (p_dev_rec, p->active_remote_addr, - &p->active_remote_addr_type); + &p->active_remote_addr_type); #endif if (HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) - || link_role == HCI_ROLE_MASTER) - { + || link_role == HCI_ROLE_MASTER) { btsnd_hcic_ble_read_remote_feat(p->hci_handle); - } - else - { + } else { btm_establish_continue(p); } - } - else + } else #endif { btm_read_remote_features (p->hci_handle); @@ -352,8 +334,7 @@ void btm_acl_report_role_change (UINT8 hci_status, BD_ADDR bda) tBTM_ROLE_SWITCH_CMPL ref_data; BTM_TRACE_DEBUG ("btm_acl_report_role_change\n"); if (btm_cb.devcb.p_switch_role_cb - && (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN)))) - { + && (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN)))) { memcpy (&ref_data, &btm_cb.devcb.switch_role_ref_data, sizeof(tBTM_ROLE_SWITCH_CMPL)); ref_data.hci_status = hci_status; (*btm_cb.devcb.p_switch_role_cb)(&ref_data); @@ -378,25 +359,22 @@ void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport) tACL_CONN *p; tBTM_BL_EVENT_DATA evt_data; #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) - tBTM_SEC_DEV_REC *p_dev_rec=NULL; + tBTM_SEC_DEV_REC *p_dev_rec = NULL; #endif BTM_TRACE_DEBUG ("btm_acl_removed\n"); p = btm_bda_to_acl(bda, transport); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { p->in_use = FALSE; /* if the disconnected channel has a pending role switch, clear it now */ btm_acl_report_role_change(HCI_ERR_NO_CONNECTION, bda); /* Only notify if link up has had a chance to be issued */ - if (p->link_up_issued) - { + if (p->link_up_issued) { p->link_up_issued = FALSE; /* If anyone cares, tell him database changed */ - if (btm_cb.p_bl_changed_cb) - { + if (btm_cb.p_bl_changed_cb) { evt_data.event = BTM_BL_DISCN_EVT; evt_data.discn.p_bda = bda; #if BLE_INCLUDED == TRUE @@ -412,39 +390,30 @@ void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport) #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) BTM_TRACE_DEBUG ("acl hci_handle=%d transport=%d connectable_mode=0x%0x link_role=%d\n", - p->hci_handle, - p->transport, - btm_cb.ble_ctr_cb.inq_var.connectable_mode, - p->link_role); + p->hci_handle, + p->transport, + btm_cb.ble_ctr_cb.inq_var.connectable_mode, + p->link_role); p_dev_rec = btm_find_dev(bda); - if ( p_dev_rec) - { + if ( p_dev_rec) { BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x\n", p_dev_rec->sec_flags); - if (p->transport == BT_TRANSPORT_LE) - { + if (p->transport == BT_TRANSPORT_LE) { BTM_TRACE_DEBUG("LE link down\n"); p_dev_rec->sec_flags &= ~(BTM_SEC_LE_ENCRYPTED | BTM_SEC_ROLE_SWITCHED); - if ( (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) == 0) - { + if ( (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) == 0) { BTM_TRACE_DEBUG("Not Bonded\n"); p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_AUTHED | BTM_SEC_LE_AUTHENTICATED); - } - else - { + } else { BTM_TRACE_DEBUG("Bonded\n"); } - } - else - { + } else { BTM_TRACE_DEBUG("Bletooth link down\n"); p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED - | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED); + | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED); } BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x\n", p_dev_rec->sec_flags); - } - else - { + } else { BTM_TRACE_ERROR("Device not found\n"); } @@ -471,11 +440,9 @@ void btm_acl_device_down (void) tACL_CONN *p = &btm_cb.acl_db[0]; UINT16 xx; BTM_TRACE_DEBUG ("btm_acl_device_down\n"); - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) - { - if (p->in_use) - { - BTM_TRACE_DEBUG ("hci_handle=%d HCI_ERR_HW_FAILURE \n",p->hci_handle ); + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { + if (p->in_use) { + BTM_TRACE_DEBUG ("hci_handle=%d HCI_ERR_HW_FAILURE \n", p->hci_handle ); l2c_link_hci_disc_comp (p->hci_handle, HCI_ERR_HW_FAILURE); } } @@ -497,53 +464,51 @@ void btm_acl_update_busy_level (tBTM_BLI_EVENT event) UINT8 busy_level; BTM_TRACE_DEBUG ("btm_acl_update_busy_level\n"); BOOLEAN old_inquiry_state = btm_cb.is_inquiry; - switch (event) - { - case BTM_BLI_ACL_UP_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_ACL_UP_EVT\n"); - break; - case BTM_BLI_ACL_DOWN_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_ACL_DOWN_EVT\n"); - break; - case BTM_BLI_PAGE_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_PAGE_EVT\n"); - btm_cb.is_paging = TRUE; - evt.busy_level_flags= BTM_BL_PAGING_STARTED; - break; - case BTM_BLI_PAGE_DONE_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_PAGE_DONE_EVT\n"); - btm_cb.is_paging = FALSE; - evt.busy_level_flags = BTM_BL_PAGING_COMPLETE; - break; - case BTM_BLI_INQ_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_INQ_EVT\n"); - btm_cb.is_inquiry = TRUE; - evt.busy_level_flags = BTM_BL_INQUIRY_STARTED; - break; - case BTM_BLI_INQ_CANCEL_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_INQ_CANCEL_EVT\n"); - btm_cb.is_inquiry = FALSE; - evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED; - break; - case BTM_BLI_INQ_DONE_EVT: - BTM_TRACE_DEBUG ("BTM_BLI_INQ_DONE_EVT\n"); - btm_cb.is_inquiry = FALSE; - evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE; - break; + switch (event) { + case BTM_BLI_ACL_UP_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_ACL_UP_EVT\n"); + break; + case BTM_BLI_ACL_DOWN_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_ACL_DOWN_EVT\n"); + break; + case BTM_BLI_PAGE_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_PAGE_EVT\n"); + btm_cb.is_paging = TRUE; + evt.busy_level_flags = BTM_BL_PAGING_STARTED; + break; + case BTM_BLI_PAGE_DONE_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_PAGE_DONE_EVT\n"); + btm_cb.is_paging = FALSE; + evt.busy_level_flags = BTM_BL_PAGING_COMPLETE; + break; + case BTM_BLI_INQ_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_INQ_EVT\n"); + btm_cb.is_inquiry = TRUE; + evt.busy_level_flags = BTM_BL_INQUIRY_STARTED; + break; + case BTM_BLI_INQ_CANCEL_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_INQ_CANCEL_EVT\n"); + btm_cb.is_inquiry = FALSE; + evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED; + break; + case BTM_BLI_INQ_DONE_EVT: + BTM_TRACE_DEBUG ("BTM_BLI_INQ_DONE_EVT\n"); + btm_cb.is_inquiry = FALSE; + evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE; + break; } - if (btm_cb.is_paging || btm_cb.is_inquiry) + if (btm_cb.is_paging || btm_cb.is_inquiry) { busy_level = 10; - else + } else { busy_level = BTM_GetNumAclLinks(); + } - if ((busy_level != btm_cb.busy_level) ||(old_inquiry_state != btm_cb.is_inquiry)) - { + if ((busy_level != btm_cb.busy_level) || (old_inquiry_state != btm_cb.is_inquiry)) { evt.event = BTM_BL_UPDATE_EVT; evt.busy_level = busy_level; btm_cb.busy_level = busy_level; - if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK)) - { + if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK)) { (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt); } } @@ -564,15 +529,14 @@ tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role) { tACL_CONN *p; BTM_TRACE_DEBUG ("BTM_GetRole\n"); - if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { *p_role = BTM_ROLE_UNDEFINED; - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /* Get the current role */ *p_role = p->link_role; - return(BTM_SUCCESS); + return (BTM_SUCCESS); } @@ -607,97 +571,97 @@ tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, UINT8 new_role, tBTM_CMPL_CB BD_ADDR_PTR p_bda; #endif BTM_TRACE_API ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x\n", - remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2], - remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]); + remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2], + remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]); /* Make sure the local device supports switching */ - if (!controller_get_interface()->supports_master_slave_role_switch()) - return(BTM_MODE_UNSUPPORTED); + if (!controller_get_interface()->supports_master_slave_role_switch()) { + return (BTM_MODE_UNSUPPORTED); + } - if (btm_cb.devcb.p_switch_role_cb && p_cb) - { + if (btm_cb.devcb.p_switch_role_cb && p_cb) { #if (BT_USE_TRACES == TRUE) p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr; BTM_TRACE_DEBUG ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x\n", - p_bda[0], p_bda[1], p_bda[2], - p_bda[3], p_bda[4], p_bda[5]); + p_bda[0], p_bda[1], p_bda[2], + p_bda[3], p_bda[4], p_bda[5]); #endif - return(BTM_BUSY); + return (BTM_BUSY); } - if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - return(BTM_UNKNOWN_ADDR); + if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { + return (BTM_UNKNOWN_ADDR); + } /* Finished if already in desired role */ - if (p->link_role == new_role) - return(BTM_SUCCESS); + if (p->link_role == new_role) { + return (BTM_SUCCESS); + } #if BTM_SCO_INCLUDED == TRUE /* Check if there is any SCO Active on this BD Address */ is_sco_active = btm_is_sco_active_by_bdaddr(remote_bd_addr); - if (is_sco_active == TRUE) - return(BTM_NO_RESOURCES); + if (is_sco_active == TRUE) { + return (BTM_NO_RESOURCES); + } #endif /* Ignore role switch request if the previous request was not completed */ - if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) - { + if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) { BTM_TRACE_DEBUG ("BTM_SwitchRole busy: %d\n", - p->switch_role_state); - return(BTM_BUSY); + p->switch_role_state); + return (BTM_BUSY); } - if ((status = BTM_ReadPowerMode(p->remote_addr, &pwr_mode)) != BTM_SUCCESS) - return(status); + if ((status = BTM_ReadPowerMode(p->remote_addr, &pwr_mode)) != BTM_SUCCESS) { + return (status); + } /* Wake up the link if in sniff or park before attempting switch */ - if (pwr_mode == BTM_PM_MD_PARK || pwr_mode == BTM_PM_MD_SNIFF) - { - memset( (void*)&settings, 0, sizeof(settings)); + if (pwr_mode == BTM_PM_MD_PARK || pwr_mode == BTM_PM_MD_SNIFF) { + memset( (void *)&settings, 0, sizeof(settings)); settings.mode = BTM_PM_MD_ACTIVE; status = BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p->remote_addr, &settings); - if (status != BTM_CMD_STARTED) - return(BTM_WRONG_MODE); + if (status != BTM_CMD_STARTED) { + return (BTM_WRONG_MODE); + } p->switch_role_state = BTM_ACL_SWKEY_STATE_MODE_CHANGE; } /* some devices do not support switch while encryption is on */ - else - { + else { p_dev_rec = btm_find_dev (remote_bd_addr); if ((p_dev_rec != NULL) - && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0) - && !BTM_EPR_AVAILABLE(p)) - { + && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0) + && !BTM_EPR_AVAILABLE(p)) { /* bypass turning off encryption if change link key is already doing it */ - if (p->encrypt_state != BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF) - { - if (!btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE)) - return(BTM_NO_RESOURCES); - else + if (p->encrypt_state != BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF) { + if (!btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE)) { + return (BTM_NO_RESOURCES); + } else { p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF; + } } p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF; - } - else - { - if (!btsnd_hcic_switch_role (remote_bd_addr, new_role)) - return(BTM_NO_RESOURCES); + } else { + if (!btsnd_hcic_switch_role (remote_bd_addr, new_role)) { + return (BTM_NO_RESOURCES); + } p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS; #if BTM_DISC_DURING_RS == TRUE - if (p_dev_rec) + if (p_dev_rec) { p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING; + } #endif } } /* Initialize return structure in case request fails */ - if (p_cb) - { + if (p_cb) { memcpy (btm_cb.devcb.switch_role_ref_data.remote_bd_addr, remote_bd_addr, BD_ADDR_LEN); btm_cb.devcb.switch_role_ref_data.role = new_role; @@ -705,7 +669,7 @@ tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, UINT8 new_role, tBTM_CMPL_CB btm_cb.devcb.switch_role_ref_data.hci_status = HCI_ERR_UNSUPPORTED_VALUE; btm_cb.devcb.p_switch_role_cb = p_cb; } - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /******************************************************************************* @@ -728,54 +692,48 @@ void btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) tBTM_BL_ROLE_CHG_DATA evt; BTM_TRACE_DEBUG ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d\n", - handle, status, encr_enable); + handle, status, encr_enable); xx = btm_handle_to_acl_index(handle); /* don't assume that we can never get a bad hci_handle */ - if (xx < MAX_L2CAP_LINKS) + if (xx < MAX_L2CAP_LINKS) { p = &btm_cb.acl_db[xx]; - else + } else { return; + } /* Process Role Switch if active */ - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF) - { + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF) { /* if encryption turn off failed we still will try to switch role */ - if (encr_enable) - { + if (encr_enable) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE; p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE; - } - else - { + } else { p->switch_role_state = BTM_ACL_SWKEY_STATE_SWITCHING; p->encrypt_state = BTM_ACL_ENCRYPT_STATE_TEMP_FUNC; } - if (!btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role)) - { + if (!btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role)) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE; p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE; btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr); } #if BTM_DISC_DURING_RS == TRUE - else - { - if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL) + else { + if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL) { p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING; + } } #endif } /* Finished enabling Encryption after role switch */ - else if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_ON) - { + else if (p->switch_role_state == BTM_ACL_SWKEY_STATE_ENCRYPTION_ON) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE; p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE; btm_acl_report_role_change(btm_cb.devcb.switch_role_ref_data.hci_status, p->remote_addr); /* if role change event is registered, report it now */ - if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) - { + if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = btm_cb.devcb.switch_role_ref_data.role; evt.p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr; @@ -783,20 +741,18 @@ void btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt); BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d\n", - evt.new_role, evt.hci_status, p->switch_role_state); + evt.new_role, evt.hci_status, p->switch_role_state); } #if BTM_DISC_DURING_RS == TRUE /* If a disconnect is pending, issue it now that role switch has completed */ - if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL) - { - if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING) - { + if ((p_dev_rec = btm_find_dev (p->remote_addr)) != NULL) { + if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING) { BTM_TRACE_WARNING("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!\n"); btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER); } BTM_TRACE_ERROR("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d\n", - (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending); + (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending); p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ } #endif @@ -816,38 +772,34 @@ tBTM_STATUS BTM_SetLinkPolicy (BD_ADDR remote_bda, UINT16 *settings) tACL_CONN *p; UINT8 *localFeatures = BTM_ReadLocalFeatures(); BTM_TRACE_DEBUG ("BTM_SetLinkPolicy\n"); -/* BTM_TRACE_API ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */ + /* BTM_TRACE_API ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */ /* First, check if hold mode is supported */ - if (*settings != HCI_DISABLE_ALL_LM_MODES) - { - if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) ) - { + if (*settings != HCI_DISABLE_ALL_LM_MODES) { + if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) ) { *settings &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH); BTM_TRACE_API ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)\n", *settings ); } - if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) ) - { + if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) ) { *settings &= (~HCI_ENABLE_HOLD_MODE); BTM_TRACE_API ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)\n", *settings ); } - if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) ) - { + if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) ) { *settings &= (~HCI_ENABLE_SNIFF_MODE); BTM_TRACE_API ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)\n", *settings ); } - if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) ) - { + if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) ) { *settings &= (~HCI_ENABLE_PARK_MODE); BTM_TRACE_API ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)\n", *settings ); } } - if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL) - return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ? BTM_CMD_STARTED : BTM_NO_RESOURCES); + if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL) { + return (btsnd_hcic_write_policy_set (p->hci_handle, *settings) ? BTM_CMD_STARTED : BTM_NO_RESOURCES); + } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -866,23 +818,19 @@ void BTM_SetDefaultLinkPolicy (UINT16 settings) BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x\n", settings); - if((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures))) - { + if ((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures))) { settings &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)\n", settings); } - if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures))) - { + if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures))) { settings &= ~HCI_ENABLE_HOLD_MODE; BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)\n", settings); } - if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures))) - { + if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures))) { settings &= ~HCI_ENABLE_SNIFF_MODE; BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)\n", settings); } - if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures))) - { + if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures))) { settings &= ~HCI_ENABLE_PARK_MODE; BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)\n", settings); } @@ -916,19 +864,17 @@ void btm_read_remote_version_complete (UINT8 *p) STREAM_TO_UINT16 (handle, p); /* Look up the connection by handle and copy features */ - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++) - { - if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle)) - { - if (status == HCI_SUCCESS) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++) { + if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle)) { + if (status == HCI_SUCCESS) { STREAM_TO_UINT8 (p_acl_cb->lmp_version, p); STREAM_TO_UINT16 (p_acl_cb->manufacturer, p); STREAM_TO_UINT16 (p_acl_cb->lmp_subversion, p); } #if BLE_INCLUDED == TRUE - if (p_acl_cb->transport == BT_TRANSPORT_LE) + if (p_acl_cb->transport == BT_TRANSPORT_LE) { l2cble_notify_le_connection (p_acl_cb->remote_addr); + } #endif break; } @@ -955,8 +901,7 @@ void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages) BTM_TRACE_DEBUG ("btm_process_remote_ext_features\n"); /* Make sure we have the record to save remote features information */ - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { /* Get a new device; might be doing dedicated bonding */ p_dev_rec = btm_find_or_alloc_dev (p_acl_cb->remote_addr); } @@ -965,10 +910,8 @@ void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages) p_dev_rec->num_read_pages = num_read_pages; /* Move the pages to placeholder */ - for (page_idx = 0; page_idx < num_read_pages; page_idx++) - { - if (page_idx > HCI_EXT_FEATURES_PAGE_MAX) - { + for (page_idx = 0; page_idx < num_read_pages; page_idx++) { + if (page_idx > HCI_EXT_FEATURES_PAGE_MAX) { BTM_TRACE_ERROR("%s: page=%d unexpected\n", __FUNCTION__, page_idx); break; } @@ -982,8 +925,7 @@ void btm_process_remote_ext_features (tACL_CONN *p_acl_cb, UINT8 num_read_pages) btm_sec_set_peer_sec_caps(p_acl_cb, p_dev_rec); BTM_TRACE_API("%s: pend:%d\n", __FUNCTION__, req_pend); - if (req_pend) - { + if (req_pend) { /* Request for remaining Security Features (if any) */ l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); } @@ -1007,8 +949,7 @@ void btm_read_remote_features (UINT16 handle) BTM_TRACE_DEBUG("btm_read_remote_features() handle: %d\n", handle); - if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) - { + if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) { BTM_TRACE_ERROR("btm_read_remote_features handle=%d invalid\n", handle); return; } @@ -1060,19 +1001,17 @@ void btm_read_remote_features_complete (UINT8 *p) BTM_TRACE_DEBUG ("btm_read_remote_features_complete\n"); STREAM_TO_UINT8 (status, p); - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { BTM_TRACE_ERROR ("btm_read_remote_features_complete failed (status 0x%02x)\n", status); return; } - STREAM_TO_UINT16 (handle, p); + STREAM_TO_UINT16 (handle, p); - if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) - { + if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) { BTM_TRACE_ERROR("btm_read_remote_features_complete handle=%d invalid\n", handle); return; - } + } p_acl_cb = &btm_cb.acl_db[acl_idx]; @@ -1081,8 +1020,7 @@ void btm_read_remote_features_complete (UINT8 *p) HCI_FEATURE_BYTES_PER_PAGE); if ((HCI_LMP_EXTENDED_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) && - (controller_get_interface()->supports_reading_remote_extended_features())) - { + (controller_get_interface()->supports_reading_remote_extended_features())) { /* if the remote controller has extended features and local controller supports ** HCI_Read_Remote_Extended_Features command then start reading these feature starting ** with extended features page 1 */ @@ -1124,14 +1062,12 @@ void btm_read_remote_ext_features_complete (UINT8 *p) STREAM_TO_UINT8 (max_page, p); /* Validate parameters */ - if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) - { + if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) { BTM_TRACE_ERROR("btm_read_remote_ext_features_complete handle=%d invalid\n", handle); return; } - if (max_page > HCI_EXT_FEATURES_PAGE_MAX) - { + if (max_page > HCI_EXT_FEATURES_PAGE_MAX) { BTM_TRACE_ERROR("btm_read_remote_ext_features_complete page=%d unknown", max_page); return; } @@ -1143,8 +1079,7 @@ void btm_read_remote_ext_features_complete (UINT8 *p) /* If there is the next remote features page and * we have space to keep this page data - read this page */ - if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX)) - { + if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX)) { page_num++; BTM_TRACE_DEBUG("BTM reads next remote extended features page (%d)\n", page_num); btm_read_remote_ext_features (handle, page_num); @@ -1177,10 +1112,9 @@ void btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle) UINT8 acl_idx; BTM_TRACE_WARNING ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d\n", - status, handle); + status, handle); - if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) - { + if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) { BTM_TRACE_ERROR("btm_read_remote_ext_features_failed handle=%d invalid\n", handle); return; } @@ -1206,40 +1140,40 @@ void btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle) *******************************************************************************/ void btm_establish_continue (tACL_CONN *p_acl_cb) { - tBTM_BL_EVENT_DATA evt_data; - BTM_TRACE_DEBUG ("btm_establish_continue\n"); + tBTM_BL_EVENT_DATA evt_data; + BTM_TRACE_DEBUG ("btm_establish_continue\n"); #if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) - if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR) + if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR) #endif - { - /* For now there are a some devices that do not like sending */ - /* commands events and data at the same time. */ - /* Set the packet types to the default allowed by the device */ - btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); + { + /* For now there are a some devices that do not like sending */ + /* commands events and data at the same time. */ + /* Set the packet types to the default allowed by the device */ + btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); - if (btm_cb.btm_def_link_policy) - BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); + if (btm_cb.btm_def_link_policy) { + BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); } + } #endif - p_acl_cb->link_up_issued = TRUE; + p_acl_cb->link_up_issued = TRUE; - /* If anyone cares, tell him database changed */ - if (btm_cb.p_bl_changed_cb) - { - evt_data.event = BTM_BL_CONN_EVT; - evt_data.conn.p_bda = p_acl_cb->remote_addr; - evt_data.conn.p_bdn = p_acl_cb->remote_name; - evt_data.conn.p_dc = p_acl_cb->remote_dc; - evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]; + /* If anyone cares, tell him database changed */ + if (btm_cb.p_bl_changed_cb) { + evt_data.event = BTM_BL_CONN_EVT; + evt_data.conn.p_bda = p_acl_cb->remote_addr; + evt_data.conn.p_bdn = p_acl_cb->remote_name; + evt_data.conn.p_dc = p_acl_cb->remote_dc; + evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]; #if BLE_INCLUDED == TRUE - evt_data.conn.handle = p_acl_cb->hci_handle; - evt_data.conn.transport = p_acl_cb->transport; + evt_data.conn.handle = p_acl_cb->hci_handle; + evt_data.conn.transport = p_acl_cb->transport; #endif - (*btm_cb.p_bl_changed_cb)(&evt_data); - } - btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT); + (*btm_cb.p_bl_changed_cb)(&evt_data); + } + btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT); } @@ -1273,13 +1207,12 @@ tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, UINT16 *p_timeout) tACL_CONN *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_GetLinkSuperTout\n"); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { *p_timeout = p->link_super_tout; - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } @@ -1297,25 +1230,24 @@ tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, UINT16 timeout) tACL_CONN *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_SetLinkSuperTout\n"); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { p->link_super_tout = timeout; /* Only send if current role is Master; 2.0 spec requires this */ - if (p->link_role == BTM_ROLE_MASTER) - { + if (p->link_role == BTM_ROLE_MASTER) { if (!btsnd_hcic_write_link_super_tout (LOCAL_BR_EDR_CONTROLLER_ID, - p->hci_handle, timeout)) - return(BTM_NO_RESOURCES); + p->hci_handle, timeout)) { + return (BTM_NO_RESOURCES); + } - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); + } else { + return (BTM_SUCCESS); } - else - return(BTM_SUCCESS); } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -1333,17 +1265,16 @@ BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport) tACL_CONN *p; BTM_TRACE_API ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - remote_bda[0], remote_bda[1], remote_bda[2], - remote_bda[3], remote_bda[4], remote_bda[5]); + remote_bda[0], remote_bda[1], remote_bda[2], + remote_bda[3], remote_bda[4], remote_bda[5]); p = btm_bda_to_acl(remote_bda, transport); - if (p != (tACL_CONN *)NULL) - { - return(TRUE); + if (p != (tACL_CONN *)NULL) { + return (TRUE); } /* If here, no BD Addr found */ - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -1360,10 +1291,10 @@ UINT16 BTM_GetNumAclLinks (void) { uint16_t num_acl = 0; - for (uint16_t i = 0; i < MAX_L2CAP_LINKS; ++i) - { - if (btm_cb.acl_db[i].in_use) + for (uint16_t i = 0; i < MAX_L2CAP_LINKS; ++i) { + if (btm_cb.acl_db[i].in_use) { ++num_acl; + } } return num_acl; @@ -1383,7 +1314,7 @@ UINT16 btm_get_acl_disc_reason_code (void) { UINT8 res = btm_cb.acl_disc_reason; BTM_TRACE_DEBUG ("btm_get_acl_disc_reason_code\n"); - return(res); + return (res); } @@ -1402,13 +1333,12 @@ UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport) tACL_CONN *p; BTM_TRACE_DEBUG ("BTM_GetHCIConnHandle\n"); p = btm_bda_to_acl(remote_bda, transport); - if (p != (tACL_CONN *)NULL) - { - return(p->hci_handle); + if (p != (tACL_CONN *)NULL) { + return (p->hci_handle); } /* If here, no BD Addr found */ - return(0xFFFF); + return (0xFFFF); } /******************************************************************************* @@ -1428,8 +1358,9 @@ void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset) UINT8 xx; BTM_TRACE_DEBUG ("btm_process_clk_off_comp_evt\n"); /* Look up the connection by handle and set the current mode */ - if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS) + if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS) { btm_cb.acl_db[xx].clock_offset = clock_offset; + } } /******************************************************************************* @@ -1447,7 +1378,7 @@ void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset) void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) { UINT8 *p_bda = (bd_addr) ? bd_addr : - btm_cb.devcb.switch_role_ref_data.remote_bd_addr; + btm_cb.devcb.switch_role_ref_data.remote_bd_addr; tACL_CONN *p = btm_bda_to_acl(p_bda, BT_TRANSPORT_BR_EDR); tBTM_ROLE_SWITCH_CMPL *p_data = &btm_cb.devcb.switch_role_ref_data; tBTM_SEC_DEV_REC *p_dev_rec; @@ -1455,18 +1386,17 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) BTM_TRACE_DEBUG ("btm_acl_role_changed\n"); /* Ignore any stray events */ - if (p == NULL) - { + if (p == NULL) { /* it could be a failure */ - if (hci_status != HCI_SUCCESS) + if (hci_status != HCI_SUCCESS) { btm_acl_report_role_change(hci_status, bd_addr); + } return; } p_data->hci_status = hci_status; - if (hci_status == HCI_SUCCESS) - { + if (hci_status == HCI_SUCCESS) { p_data->role = new_role; memcpy(p_data->remote_bd_addr, p_bda, BD_ADDR_LEN); @@ -1474,13 +1404,10 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) p->link_role = new_role; /* Reload LSTO: link supervision timeout is reset in the LM after a role switch */ - if (new_role == BTM_ROLE_MASTER) - { + if (new_role == BTM_ROLE_MASTER) { BTM_SetLinkSuperTout (p->remote_addr, p->link_super_tout); } - } - else - { + } else { /* so the BTM_BL_ROLE_CHG_EVT uses the old role */ new_role = p->link_role; } @@ -1490,10 +1417,8 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) /* if switching state is switching we need to turn encryption on */ /* if idle, we did not change encryption */ - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_SWITCHING) - { - if (btsnd_hcic_set_conn_encrypt (p->hci_handle, TRUE)) - { + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_SWITCHING) { + if (btsnd_hcic_set_conn_encrypt (p->hci_handle, TRUE)) { p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON; p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_ON; return; @@ -1502,8 +1427,7 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) /* Set the switch_role_state to IDLE since the reply received from HCI */ /* regardless of its result either success or failed. */ - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_IN_PROGRESS) - { + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_IN_PROGRESS) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE; p->encrypt_state = BTM_ACL_ENCRYPT_STATE_IDLE; } @@ -1512,8 +1436,7 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) btm_acl_report_role_change(hci_status, bd_addr); /* if role change event is registered, report it now */ - if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) - { + if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = new_role; evt.p_bda = p_bda; @@ -1522,19 +1445,17 @@ void btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role) } BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d\n", - p_data->role, p_data->hci_status, p->switch_role_state); + p_data->role, p_data->hci_status, p->switch_role_state); #if BTM_DISC_DURING_RS == TRUE /* If a disconnect is pending, issue it now that role switch has completed */ - if ((p_dev_rec = btm_find_dev (p_bda)) != NULL) - { - if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING) - { + if ((p_dev_rec = btm_find_dev (p_bda)) != NULL) { + if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING) { BTM_TRACE_WARNING("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!\n"); btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER); } BTM_TRACE_ERROR("tBTM_SEC_DEV:0x%x rs_disc_pending=%d\n", - (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending); + (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending); p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ } @@ -1558,16 +1479,14 @@ UINT8 BTM_AllocateSCN(void) BTM_TRACE_DEBUG ("BTM_AllocateSCN\n"); // stack reserves scn 1 for HFP, HSP we still do the correct way - for (x = 1; x < BTM_MAX_SCN; x++) - { - if (!btm_cb.btm_scn[x]) - { + for (x = 1; x < BTM_MAX_SCN; x++) { + if (!btm_cb.btm_scn[x]) { btm_cb.btm_scn[x] = TRUE; - return(x+1); + return (x + 1); } } - return(0); /* No free ports */ + return (0); /* No free ports */ } /******************************************************************************* @@ -1585,13 +1504,13 @@ BOOLEAN BTM_TryAllocateSCN(UINT8 scn) /* Make sure we don't exceed max port range. * Stack reserves scn 1 for HFP, HSP we still do the correct way. */ - if ( (scn>=BTM_MAX_SCN) || (scn == 1) ) + if ( (scn >= BTM_MAX_SCN) || (scn == 1) ) { return FALSE; + } /* check if this port is available */ - if (!btm_cb.btm_scn[scn-1]) - { - btm_cb.btm_scn[scn-1] = TRUE; + if (!btm_cb.btm_scn[scn - 1]) { + btm_cb.btm_scn[scn - 1] = TRUE; return TRUE; } @@ -1610,13 +1529,12 @@ BOOLEAN BTM_TryAllocateSCN(UINT8 scn) BOOLEAN BTM_FreeSCN(UINT8 scn) { BTM_TRACE_DEBUG ("BTM_FreeSCN \n"); - if (scn <= BTM_MAX_SCN) - { - btm_cb.btm_scn[scn-1] = FALSE; - return(TRUE); + if (scn <= BTM_MAX_SCN) { + btm_cb.btm_scn[scn - 1] = FALSE; + return (TRUE); + } else { + return (FALSE); /* Illegal SCN passed in */ } - else - return(FALSE); /* Illegal SCN passed in */ } /******************************************************************************* @@ -1647,14 +1565,13 @@ tBTM_STATUS btm_set_packet_types (tACL_CONN *p, UINT16 pkt_types) BTM_TRACE_DEBUG ("SetPacketType Mask -> 0x%04x\n", temp_pkt_types); - if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types)) - { - return(BTM_NO_RESOURCES); + if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types)) { + return (BTM_NO_RESOURCES); } p->pkt_types_mask = temp_pkt_types; - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /******************************************************************************* @@ -1671,48 +1588,44 @@ UINT16 btm_get_max_packet_size (BD_ADDR addr) UINT16 pkt_types = 0; UINT16 pkt_size = 0; BTM_TRACE_DEBUG ("btm_get_max_packet_size\n"); - if (p != NULL) - { + if (p != NULL) { pkt_types = p->pkt_types_mask; - } - else - { + } else { /* Special case for when info for the local device is requested */ - if (memcmp (controller_get_interface()->get_address(), addr, BD_ADDR_LEN) == 0) - { + if (memcmp (controller_get_interface()->get_address(), addr, BD_ADDR_LEN) == 0) { pkt_types = btm_cb.btm_acl_pkt_types_supported; } } - if (pkt_types) - { - if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH5)) + if (pkt_types) { + if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH5)) { pkt_size = HCI_EDR3_DH5_PACKET_SIZE; - else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH5)) + } else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH5)) { pkt_size = HCI_EDR2_DH5_PACKET_SIZE; - else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH3)) + } else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH3)) { pkt_size = HCI_EDR3_DH3_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH5) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH5) { pkt_size = HCI_DH5_PACKET_SIZE; - else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH3)) + } else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH3)) { pkt_size = HCI_EDR2_DH3_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM5) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM5) { pkt_size = HCI_DM5_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH3) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH3) { pkt_size = HCI_DH3_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM3) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM3) { pkt_size = HCI_DM3_PACKET_SIZE; - else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH1)) + } else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_3_DH1)) { pkt_size = HCI_EDR3_DH1_PACKET_SIZE; - else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH1)) + } else if (!(pkt_types & BTM_ACL_PKT_TYPES_MASK_NO_2_DH1)) { pkt_size = HCI_EDR2_DH1_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH1) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DH1) { pkt_size = HCI_DH1_PACKET_SIZE; - else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM1) + } else if (pkt_types & BTM_ACL_PKT_TYPES_MASK_DM1) { pkt_size = HCI_DM1_PACKET_SIZE; + } } - return(pkt_size); + return (pkt_size); } /******************************************************************************* @@ -1727,19 +1640,23 @@ tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, UINT8 *lmp_version, { tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_ReadRemoteVersion\n"); - if (p == NULL) - return(BTM_UNKNOWN_ADDR); + if (p == NULL) { + return (BTM_UNKNOWN_ADDR); + } - if (lmp_version) + if (lmp_version) { *lmp_version = p->lmp_version; + } - if (manufacturer) + if (manufacturer) { *manufacturer = p->manufacturer; + } - if (lmp_sub_version) + if (lmp_sub_version) { *lmp_sub_version = p->lmp_subversion; + } - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /******************************************************************************* @@ -1753,12 +1670,11 @@ UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr) { tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_ReadRemoteFeatures\n"); - if (p == NULL) - { - return(NULL); + if (p == NULL) { + return (NULL); } - return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]); + return (p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]); } /******************************************************************************* @@ -1773,18 +1689,16 @@ UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number) { tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_ReadRemoteExtendedFeatures\n"); - if (p == NULL) - { - return(NULL); + if (p == NULL) { + return (NULL); } - if (page_number > HCI_EXT_FEATURES_PAGE_MAX) - { + if (page_number > HCI_EXT_FEATURES_PAGE_MAX) { BTM_TRACE_ERROR("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown\n", page_number); return NULL; } - return(p->peer_lmp_features[page_number]); + return (p->peer_lmp_features[page_number]); } /******************************************************************************* @@ -1798,12 +1712,11 @@ UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr) { tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_ReadNumberRemoteFeaturesPages\n"); - if (p == NULL) - { - return(0); + if (p == NULL) { + return (0); } - return(p->num_read_pages); + return (p->num_read_pages); } /******************************************************************************* @@ -1817,12 +1730,11 @@ UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr) { tACL_CONN *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR); BTM_TRACE_DEBUG ("BTM_ReadAllRemoteFeatures\n"); - if (p == NULL) - { - return(NULL); + if (p == NULL) { + return (NULL); } - return(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]); + return (p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]); } /******************************************************************************* @@ -1839,19 +1751,21 @@ tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level, tBTM_BL_EVENT_MASK evt_mask) { BTM_TRACE_DEBUG ("BTM_RegBusyLevelNotif\n"); - if (p_level) + if (p_level) { *p_level = btm_cb.busy_level; + } btm_cb.bl_evt_mask = evt_mask; - if (!p_cb) + if (!p_cb) { btm_cb.p_bl_changed_cb = NULL; - else if (btm_cb.p_bl_changed_cb) - return(BTM_BUSY); - else + } else if (btm_cb.p_bl_changed_cb) { + return (BTM_BUSY); + } else { btm_cb.p_bl_changed_cb = p_cb; + } - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /******************************************************************************* @@ -1868,32 +1782,31 @@ tBTM_STATUS BTM_SetQoS (BD_ADDR bd, FLOW_SPEC *p_flow, tBTM_CMPL_CB *p_cb) tACL_CONN *p = &btm_cb.acl_db[0]; BTM_TRACE_API ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x\n", - bd[0], bd[1], bd[2], - bd[3], bd[4], bd[5]); + bd[0], bd[1], bd[2], + bd[3], bd[4], bd[5]); /* If someone already waiting on the version, do not allow another */ - if (btm_cb.devcb.p_qossu_cmpl_cb) - return(BTM_BUSY); + if (btm_cb.devcb.p_qossu_cmpl_cb) { + return (BTM_BUSY); + } - if ( (p = btm_bda_to_acl(bd, BT_TRANSPORT_BR_EDR)) != NULL) - { + if ( (p = btm_bda_to_acl(bd, BT_TRANSPORT_BR_EDR)) != NULL) { btu_start_timer (&btm_cb.devcb.qossu_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT); btm_cb.devcb.p_qossu_cmpl_cb = p_cb; if (!btsnd_hcic_qos_setup (p->hci_handle, p_flow->qos_flags, p_flow->service_type, p_flow->token_rate, p_flow->peak_bandwidth, - p_flow->latency,p_flow->delay_variation)) - { + p_flow->latency, p_flow->delay_variation)) { btm_cb.devcb.p_qossu_cmpl_cb = NULL; btu_stop_timer(&btm_cb.devcb.qossu_timer); - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); + } else { + return (BTM_CMD_STARTED); } - else - return(BTM_CMD_STARTED); } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -1915,13 +1828,11 @@ void btm_qos_setup_complete (UINT8 status, UINT16 handle, FLOW_SPEC *p_flow) btm_cb.devcb.p_qossu_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { memset(&qossu, 0, sizeof(tBTM_QOS_SETUP_CMPL)); qossu.status = status; qossu.handle = handle; - if (p_flow != NULL) - { + if (p_flow != NULL) { qossu.flow.qos_flags = p_flow->qos_flags; qossu.flow.service_type = p_flow->service_type; qossu.flow.token_rate = p_flow->token_rate; @@ -1930,7 +1841,7 @@ void btm_qos_setup_complete (UINT8 status, UINT16 handle, FLOW_SPEC *p_flow) qossu.flow.delay_variation = p_flow->delay_variation; } BTM_TRACE_DEBUG ("BTM: p_flow->delay_variation: 0x%02x\n", - qossu.flow.delay_variation); + qossu.flow.delay_variation); (*p_cb)(&qossu); } } @@ -1956,39 +1867,39 @@ tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb) tBLE_ADDR_TYPE addr_type; #endif BTM_TRACE_API ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - remote_bda[0], remote_bda[1], remote_bda[2], - remote_bda[3], remote_bda[4], remote_bda[5]); + remote_bda[0], remote_bda[1], remote_bda[2], + remote_bda[3], remote_bda[4], remote_bda[5]); /* If someone already waiting on the version, do not allow another */ - if (btm_cb.devcb.p_rssi_cmpl_cb) - return(BTM_BUSY); + if (btm_cb.devcb.p_rssi_cmpl_cb) { + return (BTM_BUSY); + } #if BLE_INCLUDED == TRUE BTM_ReadDevInfo(remote_bda, &dev_type, &addr_type); - if (dev_type == BT_DEVICE_TYPE_BLE) + if (dev_type == BT_DEVICE_TYPE_BLE) { transport = BT_TRANSPORT_LE; + } #endif p = btm_bda_to_acl(remote_bda, transport); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { btu_start_timer (&btm_cb.devcb.rssi_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT); btm_cb.devcb.p_rssi_cmpl_cb = p_cb; - if (!btsnd_hcic_read_rssi (p->hci_handle)) - { + if (!btsnd_hcic_read_rssi (p->hci_handle)) { btm_cb.devcb.p_rssi_cmpl_cb = NULL; btu_stop_timer (&btm_cb.devcb.rssi_timer); - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); + } else { + return (BTM_CMD_STARTED); } - else - return(BTM_CMD_STARTED); } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -2007,32 +1918,31 @@ tBTM_STATUS BTM_ReadLinkQuality (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb) tACL_CONN *p; BTM_TRACE_API ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - remote_bda[0], remote_bda[1], remote_bda[2], - remote_bda[3], remote_bda[4], remote_bda[5]); + remote_bda[0], remote_bda[1], remote_bda[2], + remote_bda[3], remote_bda[4], remote_bda[5]); /* If someone already waiting on the version, do not allow another */ - if (btm_cb.devcb.p_lnk_qual_cmpl_cb) - return(BTM_BUSY); + if (btm_cb.devcb.p_lnk_qual_cmpl_cb) { + return (BTM_BUSY); + } p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { btu_start_timer (&btm_cb.devcb.lnk_quality_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT); btm_cb.devcb.p_lnk_qual_cmpl_cb = p_cb; - if (!btsnd_hcic_get_link_quality (p->hci_handle)) - { + if (!btsnd_hcic_get_link_quality (p->hci_handle)) { btu_stop_timer (&btm_cb.devcb.lnk_quality_timer); btm_cb.devcb.p_lnk_qual_cmpl_cb = NULL; - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); + } else { + return (BTM_CMD_STARTED); } - else - return(BTM_CMD_STARTED); } /* If here, no BD Addr found */ - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -2055,40 +1965,37 @@ tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBT_TRANSPORT transport, tBTM_C #define BTM_READ_RSSI_TYPE_MAX 0X01 BTM_TRACE_API ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - remote_bda[0], remote_bda[1], remote_bda[2], - remote_bda[3], remote_bda[4], remote_bda[5]); + remote_bda[0], remote_bda[1], remote_bda[2], + remote_bda[3], remote_bda[4], remote_bda[5]); /* If someone already waiting on the version, do not allow another */ - if (btm_cb.devcb.p_tx_power_cmpl_cb) - return(BTM_BUSY); + if (btm_cb.devcb.p_tx_power_cmpl_cb) { + return (BTM_BUSY); + } p = btm_bda_to_acl(remote_bda, transport); - if (p != (tACL_CONN *)NULL) - { + if (p != (tACL_CONN *)NULL) { btu_start_timer (&btm_cb.devcb.tx_power_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT); btm_cb.devcb.p_tx_power_cmpl_cb = p_cb; #if BLE_INCLUDED == TRUE - if (p->transport == BT_TRANSPORT_LE) - { + if (p->transport == BT_TRANSPORT_LE) { memcpy(btm_cb.devcb.read_tx_pwr_addr, remote_bda, BD_ADDR_LEN); ret = btsnd_hcic_ble_read_adv_chnl_tx_power(); - } - else + } else #endif { ret = btsnd_hcic_read_tx_power (p->hci_handle, BTM_READ_RSSI_TYPE_CUR); } - if (!ret) - { + if (!ret) { btm_cb.devcb.p_tx_power_cmpl_cb = NULL; btu_stop_timer (&btm_cb.devcb.tx_power_timer); - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); + } else { + return (BTM_CMD_STARTED); } - else - return(BTM_CMD_STARTED); } /* If here, no BD Addr found */ @@ -2117,41 +2024,35 @@ void btm_read_tx_power_complete (UINT8 *p, BOOLEAN is_ble) /* If there was a callback registered for read rssi, call it */ btm_cb.devcb.p_tx_power_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { STREAM_TO_UINT8 (results.hci_status, p); - if (results.hci_status == HCI_SUCCESS) - { + if (results.hci_status == HCI_SUCCESS) { results.status = BTM_SUCCESS; - if (!is_ble) - { + if (!is_ble) { STREAM_TO_UINT16 (handle, p); STREAM_TO_UINT8 (results.tx_power, p); /* Search through the list of active channels for the correct BD Addr */ - for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) - { - if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) - { + for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) { + if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) { memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN); break; } } } #if BLE_INCLUDED == TRUE - else - { + else { STREAM_TO_UINT8 (results.tx_power, p); memcpy(results.rem_bda, btm_cb.devcb.read_tx_pwr_addr, BD_ADDR_LEN); } #endif BTM_TRACE_DEBUG ("BTM TX power Complete: tx_power %d, hci status 0x%02x\n", - results.tx_power, results.hci_status); - } - else + results.tx_power, results.hci_status); + } else { results.status = BTM_ERR_PROCESSING; + } (*p_cb)(&results); } @@ -2180,32 +2081,28 @@ void btm_read_rssi_complete (UINT8 *p) /* If there was a callback registered for read rssi, call it */ btm_cb.devcb.p_rssi_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { STREAM_TO_UINT8 (results.hci_status, p); - if (results.hci_status == HCI_SUCCESS) - { + if (results.hci_status == HCI_SUCCESS) { results.status = BTM_SUCCESS; STREAM_TO_UINT16 (handle, p); STREAM_TO_UINT8 (results.rssi, p); BTM_TRACE_DEBUG ("BTM RSSI Complete: rssi %d, hci status 0x%02x\n", - results.rssi, results.hci_status); + results.rssi, results.hci_status); /* Search through the list of active channels for the correct BD Addr */ - for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) - { - if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) - { + for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) { + if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) { memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN); break; } } - } - else + } else { results.status = BTM_ERR_PROCESSING; + } (*p_cb)(&results); } @@ -2234,32 +2131,28 @@ void btm_read_link_quality_complete (UINT8 *p) /* If there was a callback registered for read rssi, call it */ btm_cb.devcb.p_lnk_qual_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { STREAM_TO_UINT8 (results.hci_status, p); - if (results.hci_status == HCI_SUCCESS) - { + if (results.hci_status == HCI_SUCCESS) { results.status = BTM_SUCCESS; STREAM_TO_UINT16 (handle, p); STREAM_TO_UINT8 (results.link_quality, p); BTM_TRACE_DEBUG ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x\n", - results.link_quality, results.hci_status); + results.link_quality, results.hci_status); /* Search through the list of active channels for the correct BD Addr */ - for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) - { - if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) - { + for (index = 0; index < MAX_L2CAP_LINKS; index++, p_acl_cb++) { + if ((p_acl_cb->in_use) && (handle == p_acl_cb->hci_handle)) { memcpy (results.rem_bda, p_acl_cb->remote_addr, BD_ADDR_LEN); break; } } - } - else + } else { results.status = BTM_ERR_PROCESSING; + } (*p_cb)(&results); } @@ -2284,21 +2177,19 @@ tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); /* Role Switch is pending, postpone until completed */ - if (p_dev_rec && (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING)) - { + if (p_dev_rec && (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING)) { p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; - } - else /* otherwise can disconnect right away */ + } else /* otherwise can disconnect right away */ #endif { if (hci_handle != 0xFFFF && p_dev_rec && - p_dev_rec->sec_state!= BTM_SEC_STATE_DISCONNECTING) - { - if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER)) + p_dev_rec->sec_state != BTM_SEC_STATE_DISCONNECTING) { + if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER)) { status = BTM_NO_RESOURCES; - } - else + } + } else { status = BTM_UNKNOWN_ADDR; + } } return status; @@ -2318,10 +2209,11 @@ tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport) UINT8 BTM_SetTraceLevel (UINT8 new_level) { BTM_TRACE_DEBUG ("BTM_SetTraceLevel\n"); - if (new_level != 0xFF) + if (new_level != 0xFF) { btm_cb.trace_level = new_level; + } - return(btm_cb.trace_level); + return (btm_cb.trace_level); } /******************************************************************************* @@ -2336,48 +2228,43 @@ UINT8 BTM_SetTraceLevel (UINT8 new_level) ** *******************************************************************************/ void btm_cont_rswitch (tACL_CONN *p, tBTM_SEC_DEV_REC *p_dev_rec, - UINT8 hci_status) + UINT8 hci_status) { BOOLEAN sw_ok = TRUE; BTM_TRACE_DEBUG ("btm_cont_rswitch\n"); /* Check to see if encryption needs to be turned off if pending change of link key or role switch */ - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) - { + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) { /* Must turn off Encryption first if necessary */ /* Some devices do not support switch or change of link key while encryption is on */ if (p_dev_rec != NULL && ((p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) != 0) - && !BTM_EPR_AVAILABLE(p)) - { - if (btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE)) - { + && !BTM_EPR_AVAILABLE(p)) { + if (btsnd_hcic_set_conn_encrypt (p->hci_handle, FALSE)) { p->encrypt_state = BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF; - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) { p->switch_role_state = BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF; - } - else - { + } + } else { /* Error occurred; set states back to Idle */ - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) { sw_ok = FALSE; + } } - } - else /* Encryption not used or EPR supported, continue with switch + } else /* Encryption not used or EPR supported, continue with switch and/or change of link key */ { - if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) - { + if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IN_PROGRESS; #if BTM_DISC_DURING_RS == TRUE - if (p_dev_rec) + if (p_dev_rec) { p_dev_rec->rs_disc_pending = BTM_SEC_RS_PENDING; + } #endif sw_ok = btsnd_hcic_switch_role (p->remote_addr, (UINT8)!p->link_role); } } - if (!sw_ok) - { + if (!sw_ok) { p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE; btm_acl_report_role_change(hci_status, p->remote_addr); } @@ -2399,8 +2286,7 @@ void btm_acl_resubmit_page (void) BD_ADDR bda; BTM_TRACE_DEBUG ("btm_acl_resubmit_page\n"); /* If there were other page request schedule can start the next one */ - if ((p_buf = (BT_HDR *)GKI_dequeue (&btm_cb.page_queue)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_dequeue (&btm_cb.page_queue)) != NULL) { /* skip 3 (2 bytes opcode and 1 byte len) to get to the bd_addr * for both create_conn and rmt_name */ pp = (UINT8 *)(p_buf + 1) + p_buf->offset + 3; @@ -2413,9 +2299,9 @@ void btm_acl_resubmit_page (void) memcpy (btm_cb.connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p_buf); - } - else + } else { btm_cb.paging = FALSE; + } } /******************************************************************************* @@ -2430,8 +2316,9 @@ void btm_acl_reset_paging (void) BT_HDR *p; BTM_TRACE_DEBUG ("btm_acl_reset_paging\n"); /* If we sent reset we are definitely not paging any more */ - while ((p = (BT_HDR *)GKI_dequeue(&btm_cb.page_queue)) != NULL) + while ((p = (BT_HDR *)GKI_dequeue(&btm_cb.page_queue)) != NULL) { GKI_freebuf (p); + } btm_cb.paging = FALSE; } @@ -2448,29 +2335,22 @@ void btm_acl_paging (BT_HDR *p, BD_ADDR bda) tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_DEBUG ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x\n", - btm_cb.discing, btm_cb.paging, - (bda[0]<<16) + (bda[1]<<8) + bda[2], (bda[3]<<16) + (bda[4] << 8) + bda[5]); - if (btm_cb.discing) - { + btm_cb.discing, btm_cb.paging, + (bda[0] << 16) + (bda[1] << 8) + bda[2], (bda[3] << 16) + (bda[4] << 8) + bda[5]); + if (btm_cb.discing) { btm_cb.paging = TRUE; GKI_enqueue (&btm_cb.page_queue, p); - } - else - { - if (!BTM_ACL_IS_CONNECTED (bda)) - { + } else { + if (!BTM_ACL_IS_CONNECTED (bda)) { BTM_TRACE_DEBUG ("connecting_bda: %06x%06x\n", - (btm_cb.connecting_bda[0]<<16) + (btm_cb.connecting_bda[1]<<8) + - btm_cb.connecting_bda[2], - (btm_cb.connecting_bda[3]<<16) + (btm_cb.connecting_bda[4] << 8) + - btm_cb.connecting_bda[5]); + (btm_cb.connecting_bda[0] << 16) + (btm_cb.connecting_bda[1] << 8) + + btm_cb.connecting_bda[2], + (btm_cb.connecting_bda[3] << 16) + (btm_cb.connecting_bda[4] << 8) + + btm_cb.connecting_bda[5]); if (btm_cb.paging && - memcmp (bda, btm_cb.connecting_bda, BD_ADDR_LEN) != 0) - { + memcmp (bda, btm_cb.connecting_bda, BD_ADDR_LEN) != 0) { GKI_enqueue (&btm_cb.page_queue, p); - } - else - { + } else { p_dev_rec = btm_find_or_alloc_dev (bda); memcpy (btm_cb.connecting_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); memcpy (btm_cb.connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); @@ -2479,9 +2359,7 @@ void btm_acl_paging (BT_HDR *p, BD_ADDR bda) } btm_cb.paging = TRUE; - } - else /* ACL is already up */ - { + } else { /* ACL is already up */ btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); } } @@ -2502,10 +2380,9 @@ BOOLEAN btm_acl_notif_conn_collision (BD_ADDR bda) tBTM_BL_EVENT_DATA evt_data; /* Report possible collision to the upper layer. */ - if (btm_cb.p_bl_changed_cb) - { + if (btm_cb.p_bl_changed_cb) { BTM_TRACE_DEBUG ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x\n", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); evt_data.event = BTM_BL_COLLISION_EVT; evt_data.conn.p_bda = bda; @@ -2516,9 +2393,9 @@ BOOLEAN btm_acl_notif_conn_collision (BD_ADDR bda) #endif (*btm_cb.p_bl_changed_cb)(&evt_data); return TRUE; - } - else + } else { return FALSE; + } } @@ -2532,33 +2409,38 @@ BOOLEAN btm_acl_notif_conn_collision (BD_ADDR bda) void btm_acl_chk_peer_pkt_type_support (tACL_CONN *p, UINT16 *p_pkt_type) { /* 3 and 5 slot packets? */ - if (!HCI_3_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) - *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH3 +BTM_ACL_PKT_TYPES_MASK_DM3); + if (!HCI_3_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) { + *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3); + } - if (!HCI_5_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) + if (!HCI_5_SLOT_PACKETS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) { *p_pkt_type &= ~(BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5); + } /* 2 and 3 MPS support? */ if (!HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) /* Not supported. Add 'not_supported' mask for all 2MPS packet types */ *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + - BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); + BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); if (!HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) /* Not supported. Add 'not_supported' mask for all 3MPS packet types */ *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + - BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); + BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); /* EDR 3 and 5 slot support? */ if (HCI_EDR_ACL_2MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]) - || HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) - { + || HCI_EDR_ACL_3MPS_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) { if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) /* Not supported. Add 'not_supported' mask for all 3-slot EDR packet types */ + { *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); + } if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) /* Not supported. Add 'not_supported' mask for all 5-slot EDR packet types */ + { *p_pkt_type |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); + } } } diff --git a/components/bt/bluedroid/stack/btm/btm_ble.c b/components/bt/bluedroid/stack/btm/btm_ble.c old mode 100755 new mode 100644 index 14216e121..4e1f15195 --- a/components/bt/bluedroid/stack/btm/btm_ble.c +++ b/components/bt/bluedroid/stack/btm/btm_ble.c @@ -44,7 +44,7 @@ #if SMP_INCLUDED == TRUE extern BOOLEAN aes_cipher_msg_auth_code(BT_OCTET16 key, UINT8 *input, UINT16 length, - UINT16 tlen, UINT8 *p_signature); + UINT16 tlen, UINT8 *p_signature); extern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable); extern BOOLEAN smp_proc_ltk_request(BD_ADDR bda); #endif @@ -73,21 +73,18 @@ BOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, tBT_DEVICE_TYPE d { tBTM_SEC_DEV_REC *p_dev_rec; UINT8 i = 0; - tBTM_INQ_INFO *p_info=NULL; + tBTM_INQ_INFO *p_info = NULL; BTM_TRACE_DEBUG ("BTM_SecAddBleDevice dev_type=0x%x", dev_type); p_dev_rec = btm_find_dev (bd_addr); - if (!p_dev_rec) - { + if (!p_dev_rec) { BTM_TRACE_DEBUG("Add a new device"); /* There is no device record, allocate one. * If we can not find an empty spot for this one, let it fail. */ - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) - { - if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) { + if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) { BTM_TRACE_DEBUG ("allocate a new dev rec idx=0x%x ", i ); p_dev_rec = &btm_cb.sec_dev_rec[i]; @@ -100,27 +97,25 @@ BOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, tBT_DEVICE_TYPE d /* update conn params, use default value for background connection params */ p_dev_rec->conn_params.min_conn_int = - p_dev_rec->conn_params.max_conn_int = - p_dev_rec->conn_params.supervision_tout = - p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF; + p_dev_rec->conn_params.max_conn_int = + p_dev_rec->conn_params.supervision_tout = + p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_PARAM_UNDEF; BTM_TRACE_DEBUG ("hci_handl=0x%x ", p_dev_rec->ble_hci_handle ); break; } } - if (!p_dev_rec) - return(FALSE); - } - else - { + if (!p_dev_rec) { + return (FALSE); + } + } else { BTM_TRACE_DEBUG("Device already exist"); } memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); - if (bd_name && bd_name[0]) - { + if (bd_name && bd_name[0]) { p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); @@ -131,15 +126,14 @@ BOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, tBT_DEVICE_TYPE d memcpy (p_dev_rec->ble.pseudo_addr, bd_addr, BD_ADDR_LEN); /* sync up with the Inq Data base*/ p_info = BTM_InqDbRead(bd_addr); - if (p_info) - { + if (p_info) { p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type ; p_info->results.device_type = p_dev_rec->device_type; BTM_TRACE_DEBUG ("InqDb device_type =0x%x addr_type=0x%x", - p_info->results.device_type, p_info->results.ble_addr_type); + p_info->results.device_type, p_info->results.ble_addr_type); } - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -164,31 +158,31 @@ BOOLEAN BTM_SecAddBleKey (BD_ADDR bd_addr, tBTM_LE_KEY_VALUE *p_le_key, tBTM_LE_ BTM_TRACE_DEBUG ("BTM_SecAddBleKey"); p_dev_rec = btm_find_dev (bd_addr); if (!p_dev_rec || !p_le_key || - (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID && - key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC && - key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) - { + (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID && + key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC && + key_type != BTM_LE_KEY_LCSRK && key_type != BTM_LE_KEY_LID)) { BTM_TRACE_WARNING ("BTM_SecAddBleKey() Wrong Type, or No Device record \ for bdaddr: %08x%04x, Type: %d", - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], key_type); - return(FALSE); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], key_type); + return (FALSE); } BTM_TRACE_DEBUG ("BTM_SecAddLeKey() BDA: %08x%04x, Type: 0x%02x", - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], key_type); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], key_type); btm_sec_save_le_key (bd_addr, key_type, p_le_key, FALSE); #if (BLE_PRIVACY_SPT == TRUE) - if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID) + if (key_type == BTM_LE_KEY_PID || key_type == BTM_LE_KEY_LID) { btm_ble_resolving_list_load_dev (p_dev_rec); + } #endif #endif - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -208,21 +202,19 @@ void BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key) { tBTM_DEVCB *p_devcb = &btm_cb.devcb; BTM_TRACE_DEBUG ("%s", __func__); - if (p_key != NULL) - { - switch (key_type) - { - case BTM_BLE_KEY_TYPE_ID: - memcpy(&p_devcb->id_keys, &p_key->id_keys, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); - break; + if (p_key != NULL) { + switch (key_type) { + case BTM_BLE_KEY_TYPE_ID: + memcpy(&p_devcb->id_keys, &p_key->id_keys, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); + break; - case BTM_BLE_KEY_TYPE_ER: - memcpy(p_devcb->ble_encryption_key_value, p_key->er, sizeof(BT_OCTET16)); - break; + case BTM_BLE_KEY_TYPE_ER: + memcpy(p_devcb->ble_encryption_key_value, p_key->er, sizeof(BT_OCTET16)); + break; - default: - BTM_TRACE_ERROR("unknow local key type: %d", key_type); - break; + default: + BTM_TRACE_ERROR("unknow local key type: %d", key_type); + break; } } } @@ -292,8 +284,7 @@ void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, tBLE_A { tACL_CONN *p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE); - if (p_acl == NULL) - { + if (p_acl == NULL) { BTM_TRACE_ERROR("No connection exist!"); return; } @@ -301,7 +292,7 @@ void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, tBLE_A * p_addr_type = p_acl->conn_addr_type; BTM_TRACE_DEBUG ("BTM_ReadConnectionAddr address type: %d addr: 0x%02x", - p_acl->conn_addr_type, p_acl->conn_addr[0]); + p_acl->conn_addr_type, p_acl->conn_addr[0]); } /******************************************************************************* @@ -323,8 +314,9 @@ BOOLEAN BTM_IsBleConnection (UINT16 conn_handle) BTM_TRACE_API ("BTM_IsBleConnection: conn_handle: %d", conn_handle); xx = btm_handle_to_acl_index (conn_handle); - if (xx >= MAX_L2CAP_LINKS) + if (xx >= MAX_L2CAP_LINKS) { return FALSE; + } p = &btm_cb.acl_db[xx]; @@ -348,14 +340,13 @@ BOOLEAN BTM_IsBleConnection (UINT16 conn_handle) ** *******************************************************************************/ BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr, - tBLE_ADDR_TYPE *p_addr_type) + tBLE_ADDR_TYPE *p_addr_type) { - BOOLEAN st = TRUE; + BOOLEAN st = TRUE; #if (BLE_PRIVACY_SPT == TRUE) tACL_CONN *p = btm_bda_to_acl (pseudo_addr, BT_TRANSPORT_LE); - if (p == NULL) - { + if (p == NULL) { BTM_TRACE_ERROR("BTM_ReadRemoteConnectionAddr can not find connection" " with matching address"); return FALSE; @@ -367,8 +358,7 @@ BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr, tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_addr); memcpy(conn_addr, pseudo_addr, BD_ADDR_LEN); - if (p_dev_rec != NULL) - { + if (p_dev_rec != NULL) { *p_addr_type = p_dev_rec->ble.ble_addr_type; } #endif @@ -417,8 +407,7 @@ void BTM_BlePasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR("Passkey reply to Unknown device"); return; } @@ -446,8 +435,7 @@ void BTM_BleConfirmReply (BD_ADDR bd_addr, UINT8 res) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL; - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR("Passkey reply to Unknown device"); return; } @@ -477,8 +465,7 @@ void BTM_BleOobDataReply(BD_ADDR bd_addr, UINT8 res, UINT8 len, UINT8 *p_data) BTM_TRACE_DEBUG ("BTM_BleOobDataReply"); - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR("BTM_BleOobDataReply() to Unknown device"); return; } @@ -507,27 +494,21 @@ void BTM_BleSetConnScanParams (UINT32 scan_interval, UINT32 scan_window) BOOLEAN new_param = FALSE; if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) && - BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX)) - { - if (p_ble_cb->scan_int != scan_interval) - { + BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX)) { + if (p_ble_cb->scan_int != scan_interval) { p_ble_cb->scan_int = scan_interval; new_param = TRUE; } - if (p_ble_cb->scan_win != scan_window) - { + if (p_ble_cb->scan_win != scan_window) { p_ble_cb->scan_win = scan_window; new_param = TRUE; } - if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) - { + if (new_param && p_ble_cb->conn_state == BLE_BG_CONN) { btm_ble_suspend_bg_conn(); } - } - else - { + } else { BTM_TRACE_ERROR("Illegal Connection Scan Parameters"); } #endif @@ -558,48 +539,45 @@ void BTM_BleSetPrefConnParams (BD_ADDR bd_addr, BTM_TRACE_API ("BTM_BleSetPrefConnParams min: %u max: %u latency: %u \ tout: %u", - min_conn_int, max_conn_int, slave_latency, supervision_tout); + min_conn_int, max_conn_int, slave_latency, supervision_tout); if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) && - BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) && - BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) && - (slave_latency <= BTM_BLE_CONN_LATENCY_MAX || slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) - { - if (p_dev_rec) - { + BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) && + BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) && + (slave_latency <= BTM_BLE_CONN_LATENCY_MAX || slave_latency == BTM_BLE_CONN_PARAM_UNDEF)) { + if (p_dev_rec) { /* expect conn int and stout and slave latency to be updated all together */ - if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) - { - if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) + if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF || max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) { + if (min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) { p_dev_rec->conn_params.min_conn_int = min_conn_int; - else + } else { p_dev_rec->conn_params.min_conn_int = max_conn_int; + } - if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) + if (max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) { p_dev_rec->conn_params.max_conn_int = max_conn_int; - else + } else { p_dev_rec->conn_params.max_conn_int = min_conn_int; + } - if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF) + if (slave_latency != BTM_BLE_CONN_PARAM_UNDEF) { p_dev_rec->conn_params.slave_latency = slave_latency; - else + } else { p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; + } - if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) + if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) { p_dev_rec->conn_params.supervision_tout = supervision_tout; - else + } else { p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF; + } } - } - else - { + } else { BTM_TRACE_ERROR("Unknown Device, setting rejected"); } - } - else - { + } else { BTM_TRACE_ERROR("Illegal Connection Parameters"); } } @@ -623,40 +601,30 @@ void BTM_ReadDevInfo (BD_ADDR remote_bda, tBT_DEVICE_TYPE *p_dev_type, tBLE_ADDR *p_addr_type = BLE_ADDR_PUBLIC; - if (!p_dev_rec) - { + if (!p_dev_rec) { *p_dev_type = BT_DEVICE_TYPE_BREDR; /* Check with the BT manager if details about remote device are known */ - if (p_inq_info != NULL) - { + if (p_inq_info != NULL) { *p_dev_type = p_inq_info->results.device_type ; *p_addr_type = p_inq_info->results.ble_addr_type; } else { /* unknown device, assume BR/EDR */ BTM_TRACE_DEBUG ("btm_find_dev_type - unknown device, BR/EDR assumed"); } - } - else /* there is a security device record exisitng */ - { + } else { /* there is a security device record exisitng */ /* new inquiry result, overwrite device type in security device record */ - if (p_inq_info) - { + if (p_inq_info) { p_dev_rec->device_type = p_inq_info->results.device_type; p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; } if (memcmp(p_dev_rec->bd_addr, remote_bda, BD_ADDR_LEN) == 0 && - memcmp(p_dev_rec->ble.pseudo_addr, remote_bda, BD_ADDR_LEN) == 0) - { + memcmp(p_dev_rec->ble.pseudo_addr, remote_bda, BD_ADDR_LEN) == 0) { *p_dev_type = p_dev_rec->device_type; *p_addr_type = p_dev_rec->ble.ble_addr_type; - } - else if (memcmp(p_dev_rec->ble.pseudo_addr, remote_bda, BD_ADDR_LEN) == 0) - { + } else if (memcmp(p_dev_rec->ble.pseudo_addr, remote_bda, BD_ADDR_LEN) == 0) { *p_dev_type = BT_DEVICE_TYPE_BLE; *p_addr_type = p_dev_rec->ble.ble_addr_type; - } - else /* matching static adddress only */ - { + } else { /* matching static adddress only */ *p_dev_type = BT_DEVICE_TYPE_BREDR; *p_addr_type = BLE_ADDR_PUBLIC; } @@ -686,32 +654,29 @@ BOOLEAN BTM_ReadConnectedTransportAddress(BD_ADDR remote_bda, tBT_TRANSPORT tran tACL_CONN *p = btm_bda_to_acl(remote_bda, transport); /* if no device can be located, return */ - if (p_dev_rec == NULL) - return FALSE; - - if (transport == BT_TRANSPORT_BR_EDR) - { - if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) - { - memcpy(remote_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); - return TRUE; - } - else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) - { - memcpy(remote_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); - } - else - memset(remote_bda, 0, BD_ADDR_LEN); + if (p_dev_rec == NULL) { return FALSE; } - if (transport == BT_TRANSPORT_LE) - { - memcpy(remote_bda, p_dev_rec->ble.pseudo_addr, BD_ADDR_LEN); - if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL) + if (transport == BT_TRANSPORT_BR_EDR) { + if (btm_bda_to_acl(p_dev_rec->bd_addr, transport) != NULL) { + memcpy(remote_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); return TRUE; - else + } else if (p_dev_rec->device_type & BT_DEVICE_TYPE_BREDR) { + memcpy(remote_bda, p_dev_rec->bd_addr, BD_ADDR_LEN); + } else { + memset(remote_bda, 0, BD_ADDR_LEN); + } + return FALSE; + } + + if (transport == BT_TRANSPORT_LE) { + memcpy(remote_bda, p_dev_rec->ble.pseudo_addr, BD_ADDR_LEN); + if (btm_bda_to_acl(p_dev_rec->ble.pseudo_addr, transport) != NULL) { + return TRUE; + } else { return FALSE; + } } return FALSE; @@ -729,12 +694,11 @@ BOOLEAN BTM_ReadConnectedTransportAddress(BD_ADDR remote_bda, tBT_TRANSPORT tran *******************************************************************************/ void BTM_BleReceiverTest(UINT8 rx_freq, tBTM_CMPL_CB *p_cmd_cmpl_cback) { - btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; + btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; - if (btsnd_hcic_ble_receiver_test(rx_freq) == FALSE) - { - BTM_TRACE_ERROR("%s: Unable to Trigger LE receiver test", __FUNCTION__); - } + if (btsnd_hcic_ble_receiver_test(rx_freq) == FALSE) { + BTM_TRACE_ERROR("%s: Unable to Trigger LE receiver test", __FUNCTION__); + } } /******************************************************************************* @@ -750,13 +714,12 @@ void BTM_BleReceiverTest(UINT8 rx_freq, tBTM_CMPL_CB *p_cmd_cmpl_cback) ** *******************************************************************************/ void BTM_BleTransmitterTest(UINT8 tx_freq, UINT8 test_data_len, - UINT8 packet_payload, tBTM_CMPL_CB *p_cmd_cmpl_cback) + UINT8 packet_payload, tBTM_CMPL_CB *p_cmd_cmpl_cback) { - btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; - if (btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload) == FALSE) - { - BTM_TRACE_ERROR("%s: Unable to Trigger LE transmitter test", __FUNCTION__); - } + btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; + if (btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload) == FALSE) { + BTM_TRACE_ERROR("%s: Unable to Trigger LE transmitter test", __FUNCTION__); + } } /******************************************************************************* @@ -770,12 +733,11 @@ void BTM_BleTransmitterTest(UINT8 tx_freq, UINT8 test_data_len, *******************************************************************************/ void BTM_BleTestEnd(tBTM_CMPL_CB *p_cmd_cmpl_cback) { - btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; + btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback; - if (btsnd_hcic_ble_test_end() == FALSE) - { - BTM_TRACE_ERROR("%s: Unable to End the LE TX/RX test", __FUNCTION__); - } + if (btsnd_hcic_ble_test_end() == FALSE) { + BTM_TRACE_ERROR("%s: Unable to End the LE TX/RX test", __FUNCTION__); + } } /******************************************************************************* @@ -787,8 +749,7 @@ void btm_ble_test_command_complete(UINT8 *p) btm_cb.devcb.p_le_test_cmd_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { (*p_cb)(p); } } @@ -809,16 +770,11 @@ BOOLEAN BTM_UseLeLink (BD_ADDR bd_addr) tBLE_ADDR_TYPE addr_type; BOOLEAN use_le = FALSE; - if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR)) != NULL) - { + if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR)) != NULL) { return use_le; - } - else if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE)) != NULL) - { + } else if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE)) != NULL) { use_le = TRUE; - } - else - { + } else { BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); use_le = (dev_type == BT_DEVICE_TYPE_BLE); } @@ -840,34 +796,30 @@ tBTM_STATUS BTM_SetBleDataLength(BD_ADDR bd_addr, UINT16 tx_pdu_length) tACL_CONN *p_acl = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE); BTM_TRACE_DEBUG("%s: tx_pdu_length =%d", __FUNCTION__, tx_pdu_length); - if (!controller_get_interface()->supports_ble_packet_extension()) - { + if (!controller_get_interface()->supports_ble_packet_extension()) { BTM_TRACE_ERROR("%s failed, request not supported", __FUNCTION__); return BTM_ILLEGAL_VALUE; } - if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) - { + if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) { BTM_TRACE_ERROR("%s failed, peer does not support request", __FUNCTION__); return BTM_ILLEGAL_VALUE; } - if (p_acl != NULL) - { - if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX) + if (p_acl != NULL) { + if (tx_pdu_length > BTM_BLE_DATA_SIZE_MAX) { tx_pdu_length = BTM_BLE_DATA_SIZE_MAX; - else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN) + } else if (tx_pdu_length < BTM_BLE_DATA_SIZE_MIN) { tx_pdu_length = BTM_BLE_DATA_SIZE_MIN; + } /* always set the TxTime to be max, as controller does not care for now */ btsnd_hcic_ble_set_data_length(p_acl->hci_handle, tx_pdu_length, - BTM_BLE_DATA_TX_TIME_MAX); + BTM_BLE_DATA_TX_TIME_MAX); return BTM_SUCCESS; - } - else - { - BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported",__FUNCTION__); + } else { + BTM_TRACE_ERROR("%s: Wrong mode: no LE link exist or LE not supported", __FUNCTION__); return BTM_WRONG_MODE; } } @@ -893,29 +845,29 @@ void btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_en memset(¶ms, 0, sizeof(tBTM_RAND_ENC)); /* If there was a callback address for vcs complete, call it */ - if (p_enc_cplt_cback && p) - { + if (p_enc_cplt_cback && p) { /* Pass paramters to the callback function */ STREAM_TO_UINT8(params.status, p); /* command status */ - if (params.status == HCI_SUCCESS) - { + if (params.status == HCI_SUCCESS) { params.opcode = op_code; - if (op_code == HCI_BLE_RAND) + if (op_code == HCI_BLE_RAND) { params.param_len = BT_OCTET8_LEN; - else + } else { params.param_len = BT_OCTET16_LEN; + } memcpy(p_dest, p, params.param_len); /* Fetch return info from HCI event message */ } - if (p_enc_cplt_cback) - (*p_enc_cplt_cback)(¶ms); /* Call the Encryption complete callback function */ + if (p_enc_cplt_cback) { + (*p_enc_cplt_cback)(¶ms); /* Call the Encryption complete callback function */ + } } } - #if (SMP_INCLUDED == TRUE) +#if (SMP_INCLUDED == TRUE) /******************************************************************************* ** @@ -931,16 +883,16 @@ void btm_ble_increment_sign_ctr(BD_ADDR bd_addr, BOOLEAN is_local ) BTM_TRACE_DEBUG ("btm_ble_increment_sign_ctr is_local=%d", is_local); - if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) - { - if (is_local) + if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) { + if (is_local) { p_dev_rec->ble.keys.local_counter++; - else + } else { p_dev_rec->ble.keys.counter++; + } BTM_TRACE_DEBUG ("is_local=%d local sign counter=%d peer sign counter=%d", - is_local, - p_dev_rec->ble.keys.local_counter, - p_dev_rec->ble.keys.counter); + is_local, + p_dev_rec->ble.keys.local_counter, + p_dev_rec->ble.keys.counter); } } @@ -960,8 +912,7 @@ BOOLEAN btm_ble_get_enc_key_type(BD_ADDR bd_addr, UINT8 *p_key_types) BTM_TRACE_DEBUG ("btm_ble_get_enc_key_type"); - if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) - { + if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) { *p_key_types = p_dev_rec->ble.key_type; return TRUE; } @@ -983,15 +934,14 @@ BOOLEAN btm_get_local_div (BD_ADDR bd_addr, UINT16 *p_div) BTM_TRACE_DEBUG ("btm_get_local_div"); BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", - bd_addr[0],bd_addr[1], - bd_addr[2],bd_addr[3], - bd_addr[4],bd_addr[5]); + bd_addr[0], bd_addr[1], + bd_addr[2], bd_addr[3], + bd_addr[4], bd_addr[5]); *p_div = 0; p_dev_rec = btm_find_dev (bd_addr); - if (p_dev_rec && p_dev_rec->ble.keys.div) - { + if (p_dev_rec && p_dev_rec->ble.keys.div) { status = TRUE; *p_div = p_dev_rec->ble.keys.div; } @@ -1019,116 +969,114 @@ void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY tBTM_LE_EVT_DATA cb_data; UINT8 i; - BTM_TRACE_DEBUG ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application); + BTM_TRACE_DEBUG ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d", key_type, pass_to_application); /* Store the updated key in the device database */ BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", - bd_addr[0],bd_addr[1], - bd_addr[2],bd_addr[3], - bd_addr[4],bd_addr[5]); + bd_addr[0], bd_addr[1], + bd_addr[2], bd_addr[3], + bd_addr[4], bd_addr[5]); - if ((p_rec = btm_find_dev (bd_addr)) != NULL && (p_keys || key_type== BTM_LE_KEY_LID)) - { + if ((p_rec = btm_find_dev (bd_addr)) != NULL && (p_keys || key_type == BTM_LE_KEY_LID)) { btm_ble_init_pseudo_addr (p_rec, bd_addr); - switch (key_type) - { - case BTM_LE_KEY_PENC: - memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN); - memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN); - p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level; - p_rec->ble.keys.ediv = p_keys->penc_key.ediv; - p_rec->ble.keys.key_size = p_keys->penc_key.key_size; - p_rec->ble.key_type |= BTM_LE_KEY_PENC; - p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; - if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED) - p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; - else - p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; - BTM_TRACE_DEBUG("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x", - p_rec->ble.key_type, - p_rec->sec_flags, - p_rec->ble.keys.sec_level); - break; + switch (key_type) { + case BTM_LE_KEY_PENC: + memcpy(p_rec->ble.keys.pltk, p_keys->penc_key.ltk, BT_OCTET16_LEN); + memcpy(p_rec->ble.keys.rand, p_keys->penc_key.rand, BT_OCTET8_LEN); + p_rec->ble.keys.sec_level = p_keys->penc_key.sec_level; + p_rec->ble.keys.ediv = p_keys->penc_key.ediv; + p_rec->ble.keys.key_size = p_keys->penc_key.key_size; + p_rec->ble.key_type |= BTM_LE_KEY_PENC; + p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; + if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED) { + p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; + } else { + p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; + } + BTM_TRACE_DEBUG("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x", + p_rec->ble.key_type, + p_rec->sec_flags, + p_rec->ble.keys.sec_level); + break; - case BTM_LE_KEY_PID: - for (i=0; ible.keys.irk[i] = p_keys->pid_key.irk[i]; - } + case BTM_LE_KEY_PID: + for (i = 0; i < BT_OCTET16_LEN; i++) { + p_rec->ble.keys.irk[i] = p_keys->pid_key.irk[i]; + } - //memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo will crash the system - memcpy(p_rec->ble.static_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN); - p_rec->ble.static_addr_type = p_keys->pid_key.addr_type; - p_rec->ble.key_type |= BTM_LE_KEY_PID; - BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK", p_rec->ble.key_type); - /* update device record address as static address */ - memcpy(p_rec->bd_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN); - /* combine DUMO device security record if needed */ - btm_consolidate_dev(p_rec); - break; + //memcpy( p_rec->ble.keys.irk, p_keys->pid_key, BT_OCTET16_LEN); todo will crash the system + memcpy(p_rec->ble.static_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN); + p_rec->ble.static_addr_type = p_keys->pid_key.addr_type; + p_rec->ble.key_type |= BTM_LE_KEY_PID; + BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK", p_rec->ble.key_type); + /* update device record address as static address */ + memcpy(p_rec->bd_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN); + /* combine DUMO device security record if needed */ + btm_consolidate_dev(p_rec); + break; - case BTM_LE_KEY_PCSRK: - memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN); - p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level; - p_rec->ble.keys.counter = p_keys->pcsrk_key.counter; - p_rec->ble.key_type |= BTM_LE_KEY_PCSRK; - p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; - if ( p_keys->pcsrk_key.sec_level== SMP_SEC_AUTHENTICATED) - p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; - else - p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; + case BTM_LE_KEY_PCSRK: + memcpy(p_rec->ble.keys.pcsrk, p_keys->pcsrk_key.csrk, BT_OCTET16_LEN); + p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level; + p_rec->ble.keys.counter = p_keys->pcsrk_key.counter; + p_rec->ble.key_type |= BTM_LE_KEY_PCSRK; + p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN; + if ( p_keys->pcsrk_key.sec_level == SMP_SEC_AUTHENTICATED) { + p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED; + } else { + p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED; + } - BTM_TRACE_DEBUG("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d", - p_rec->ble.key_type, - p_rec->sec_flags, - p_rec->ble.keys.srk_sec_level, - p_rec->ble.keys.counter ); - break; + BTM_TRACE_DEBUG("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d", + p_rec->ble.key_type, + p_rec->sec_flags, + p_rec->ble.keys.srk_sec_level, + p_rec->ble.keys.counter ); + break; - case BTM_LE_KEY_LENC: - memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN); - p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */ - p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level; - p_rec->ble.keys.key_size = p_keys->lenc_key.key_size; - p_rec->ble.key_type |= BTM_LE_KEY_LENC; + case BTM_LE_KEY_LENC: + memcpy(p_rec->ble.keys.lltk, p_keys->lenc_key.ltk, BT_OCTET16_LEN); + p_rec->ble.keys.div = p_keys->lenc_key.div; /* update DIV */ + p_rec->ble.keys.sec_level = p_keys->lenc_key.sec_level; + p_rec->ble.keys.key_size = p_keys->lenc_key.key_size; + p_rec->ble.key_type |= BTM_LE_KEY_LENC; - BTM_TRACE_DEBUG("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x", - p_rec->ble.key_type, - p_rec->ble.keys.div, - p_rec->ble.keys.key_size, - p_rec->ble.keys.sec_level ); - break; + BTM_TRACE_DEBUG("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x", + p_rec->ble.key_type, + p_rec->ble.keys.div, + p_rec->ble.keys.key_size, + p_rec->ble.keys.sec_level ); + break; - case BTM_LE_KEY_LCSRK:/* local CSRK has been delivered */ - memcpy (p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN); - p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */ - p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level; - p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter; - p_rec->ble.key_type |= BTM_LE_KEY_LCSRK; - BTM_TRACE_DEBUG("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d", - p_rec->ble.key_type, - p_rec->ble.keys.div, - p_rec->ble.keys.local_csrk_sec_level, - p_rec->ble.keys.local_counter ); - break; + case BTM_LE_KEY_LCSRK:/* local CSRK has been delivered */ + memcpy (p_rec->ble.keys.lcsrk, p_keys->lcsrk_key.csrk, BT_OCTET16_LEN); + p_rec->ble.keys.div = p_keys->lcsrk_key.div; /* update DIV */ + p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level; + p_rec->ble.keys.local_counter = p_keys->lcsrk_key.counter; + p_rec->ble.key_type |= BTM_LE_KEY_LCSRK; + BTM_TRACE_DEBUG("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d", + p_rec->ble.key_type, + p_rec->ble.keys.div, + p_rec->ble.keys.local_csrk_sec_level, + p_rec->ble.keys.local_counter ); + break; - case BTM_LE_KEY_LID: - p_rec->ble.key_type |= BTM_LE_KEY_LID; - break; - default: - BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type); - return; + case BTM_LE_KEY_LID: + p_rec->ble.key_type |= BTM_LE_KEY_LID; + break; + default: + BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type); + return; } BTM_TRACE_DEBUG ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type, - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5]); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); /* Notify the application that one of the BLE keys has been updated If link key is in progress, it will get sent later.*/ - if (pass_to_application && btm_cb.api.p_le_callback) - { + if (pass_to_application && btm_cb.api.p_le_callback) { cb_data.key.p_key_value = p_keys; cb_data.key.key_type = key_type; @@ -1138,11 +1086,10 @@ void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY } BTM_TRACE_WARNING ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type, - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5]); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); - if (p_rec) - { + if (p_rec) { BTM_TRACE_DEBUG ("sec_flags=0x%x", p_rec->sec_flags); } } @@ -1162,8 +1109,7 @@ void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size) BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size); - if ((p_rec = btm_find_dev (bd_addr)) != NULL ) - { + if ((p_rec = btm_find_dev (bd_addr)) != NULL ) { p_rec->enc_key_size = enc_key_size; } } @@ -1181,12 +1127,11 @@ UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_rec; - if ((p_rec = btm_find_dev (bd_addr)) != NULL ) - { + if ((p_rec = btm_find_dev (bd_addr)) != NULL ) { return p_rec->enc_key_size; - } - else + } else { return 0; + } } /******************************************************************************* @@ -1205,60 +1150,51 @@ void btm_ble_link_sec_check(BD_ADDR bd_addr, tBTM_LE_AUTH_REQ auth_req, tBTM_BLE BTM_TRACE_DEBUG ("btm_ble_link_sec_check auth_req =0x%x", auth_req); - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR ("btm_ble_link_sec_check received for unknown device"); return; } if (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING || - p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) - { + p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { /* race condition: discard the security request while master is encrypting the link */ *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_DISCARD; - } - else - { + } else { req_sec_level = BTM_LE_SEC_UNAUTHENTICATE; - if (auth_req & BTM_LE_AUTH_REQ_MITM) - { + if (auth_req & BTM_LE_AUTH_REQ_MITM) { req_sec_level = BTM_LE_SEC_AUTHENTICATED; } BTM_TRACE_DEBUG ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags); /* currently encrpted */ - if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) - { - if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED) + if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED) { + if (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED) { cur_sec_level = BTM_LE_SEC_AUTHENTICATED; - else + } else { cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE; - } - else /* unencrypted link */ - { + } + } else { /* unencrypted link */ /* if bonded, get the key security level */ - if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) + if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) { cur_sec_level = p_dev_rec->ble.keys.sec_level; - else + } else { cur_sec_level = BTM_LE_SEC_NONE; + } } - if (cur_sec_level >= req_sec_level) - { + if (cur_sec_level >= req_sec_level) { /* To avoid re-encryption on an encrypted link for an equal condition encryption */ *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_ENCRYPT; - } - else - { + } else { *p_sec_req_act = BTM_BLE_SEC_REQ_ACT_PAIR; /* start the pariring process to upgrade the keys*/ } } BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d", - cur_sec_level, - req_sec_level, - *p_sec_req_act); + cur_sec_level, + req_sec_level, + *p_sec_req_act); } @@ -1283,55 +1219,48 @@ tBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 lin tBTM_BLE_SEC_REQ_ACT sec_req_act; tBTM_LE_AUTH_REQ auth_req; - if (p_rec == NULL) - { + if (p_rec == NULL) { BTM_TRACE_WARNING ("btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act); - return(BTM_WRONG_MODE); + return (BTM_WRONG_MODE); } BTM_TRACE_DEBUG ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master); - if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) - { + if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM) { p_rec->security_required |= BTM_SEC_IN_MITM; } - switch (sec_act) - { - case BTM_BLE_SEC_ENCRYPT: - if (link_role == BTM_ROLE_MASTER) - { - /* start link layer encryption using the security info stored */ + switch (sec_act) { + case BTM_BLE_SEC_ENCRYPT: + if (link_role == BTM_ROLE_MASTER) { + /* start link layer encryption using the security info stored */ + cmd = btm_ble_start_encrypt(bd_addr, FALSE, NULL); + break; + } + /* if salve role then fall through to call SMP_Pair below which will send a + sec_request to request the master to encrypt the link */ + case BTM_BLE_SEC_ENCRYPT_NO_MITM: + case BTM_BLE_SEC_ENCRYPT_MITM: + if (link_role == BTM_ROLE_MASTER) { + auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) + ? SMP_AUTH_GEN_BOND : (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT); + btm_ble_link_sec_check (bd_addr, auth_req, &sec_req_act); + + if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) { cmd = btm_ble_start_encrypt(bd_addr, FALSE, NULL); break; } - /* if salve role then fall through to call SMP_Pair below which will send a - sec_request to request the master to encrypt the link */ - case BTM_BLE_SEC_ENCRYPT_NO_MITM: - case BTM_BLE_SEC_ENCRYPT_MITM: - if (link_role == BTM_ROLE_MASTER) - { - auth_req = (sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) - ? SMP_AUTH_GEN_BOND : (SMP_AUTH_GEN_BOND | SMP_AUTH_YN_BIT); - btm_ble_link_sec_check (bd_addr, auth_req, &sec_req_act); + } - if (sec_req_act == BTM_BLE_SEC_REQ_ACT_ENCRYPT) - { - cmd = btm_ble_start_encrypt(bd_addr, FALSE, NULL); - break; - } - } + if (SMP_Pair(bd_addr) == SMP_STARTED) { + cmd = BTM_CMD_STARTED; + p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; + } + break; - if (SMP_Pair(bd_addr) == SMP_STARTED) - { - cmd = BTM_CMD_STARTED; - p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; - } - break; - - default: - cmd = BTM_WRONG_MODE; - break; + default: + cmd = BTM_WRONG_MODE; + break; } return cmd; } @@ -1359,10 +1288,10 @@ void btm_ble_ltk_request(UINT16 handle, UINT8 rand[8], UINT16 ediv) memcpy(p_cb->enc_rand, rand, BT_OCTET8_LEN); - if (p_dev_rec != NULL) - { - if (!smp_proc_ltk_request(p_dev_rec->bd_addr)) + if (p_dev_rec != NULL) { + if (!smp_proc_ltk_request(p_dev_rec->bd_addr)) { btm_ble_ltk_request_reply(p_dev_rec->bd_addr, FALSE, dummy_stk); + } } } @@ -1386,39 +1315,34 @@ tBTM_STATUS btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk) BTM_TRACE_DEBUG ("btm_ble_start_encrypt"); - if (!p_rec ) - { + if (!p_rec ) { BTM_TRACE_ERROR("Link is not active, can not encrypt!"); return BTM_WRONG_MODE; } - if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) - { + if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) { BTM_TRACE_WARNING("Link Encryption is active, Busy!"); return BTM_BUSY; } p_cb->enc_handle = p_rec->ble_hci_handle; - if (use_stk) - { - if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk)) + if (use_stk) { + if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk)) { rt = BTM_CMD_STARTED; - } - else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) - { + } + } else if (p_rec->ble.key_type & BTM_LE_KEY_PENC) { if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand, - p_rec->ble.keys.ediv, p_rec->ble.keys.pltk)) + p_rec->ble.keys.ediv, p_rec->ble.keys.pltk)) { rt = BTM_CMD_STARTED; - } - else - { + } + } else { BTM_TRACE_ERROR("No key available to encrypt the link"); } - if (rt == BTM_CMD_STARTED) - { - if (p_rec->sec_state == BTM_SEC_STATE_IDLE) + if (rt == BTM_CMD_STARTED) { + if (p_rec->sec_state == BTM_SEC_STATE_IDLE) { p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; + } } return rt; @@ -1438,8 +1362,7 @@ void btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); BOOLEAN enc_cback; - if (!p_dev_rec) - { + if (!p_dev_rec) { BTM_TRACE_WARNING ("btm_ble_link_encrypted (No Device Found!) encr_enable=%d", encr_enable); return; } @@ -1452,16 +1375,17 @@ void btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable) BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags); - if (encr_enable && p_dev_rec->enc_key_size == 0) + if (encr_enable && p_dev_rec->enc_key_size == 0) { p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size; + } p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; - if (p_dev_rec->p_callback && enc_cback) - { - if (encr_enable) + if (p_dev_rec->p_callback && enc_cback) { + if (encr_enable) { btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, TRUE); - else if (p_dev_rec->role_master) + } else if (p_dev_rec->role_master) { btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, TRUE); + } } /* to notify GATT to send data if any request is pending */ @@ -1476,10 +1400,10 @@ static void btm_enc_proc_ltk(tSMP_ENC *p) { UINT8 i; BTM_TRACE_DEBUG ("btm_enc_proc_ltk"); - if (p && p->param_len == BT_OCTET16_LEN) - { - for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++) + if (p && p->param_len == BT_OCTET16_LEN) { + for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++) { p->param_buf[BT_OCTET16_LEN - i - 1] = 0; + } btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p->param_buf); } } @@ -1497,27 +1421,24 @@ static void btm_enc_proc_slave_y(tSMP_ENC *p) tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_DEBUG ("btm_enc_proc_slave_y"); - if (p != NULL) - { + if (p != NULL) { STREAM_TO_UINT16(y, pp); div = p_cb->ediv ^ y; p_dev_rec = btm_find_dev_by_handle (p_cb->enc_handle); if ( p_dev_rec && - p_dev_rec->ble.keys.div == div ) - { + p_dev_rec->ble.keys.div == div ) { BTM_TRACE_DEBUG ("LTK request OK"); /* calculating LTK , LTK = E er(div) */ SMP_Encrypt(p_cb->devcb.ble_encryption_key_value, BT_OCTET16_LEN, (UINT8 *)&div, 2, &output); btm_enc_proc_ltk(&output); - } - else - { + } else { BTM_TRACE_DEBUG ("LTK request failed - send negative reply"); btsnd_hcic_ble_ltk_req_neg_reply(p_cb->enc_handle); - if (p_dev_rec) + if (p_dev_rec) { btm_ble_link_encrypted(p_dev_rec->bd_addr, 0); + } } } @@ -1539,8 +1460,7 @@ void btm_ble_ltk_request_reply(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk) tBTM_CB *p_cb = &btm_cb; tSMP_ENC output; - if (p_rec == NULL) - { + if (p_rec == NULL) { BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device"); return; } @@ -1550,16 +1470,14 @@ void btm_ble_ltk_request_reply(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk) p_cb->key_size = p_rec->ble.keys.key_size; BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size); - if (use_stk) - { + if (use_stk) { btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk); - } - else /* calculate LTK using peer device */ - { - if (p_rec->ble.key_type & BTM_LE_KEY_LENC) + } else { /* calculate LTK using peer device */ + if (p_rec->ble.key_type & BTM_LE_KEY_LENC) { btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, p_rec->ble.keys.lltk); - else + } else { btsnd_hcic_ble_ltk_req_neg_reply(btm_cb.enc_handle); + } } } @@ -1576,8 +1494,7 @@ UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p { UINT8 callback_rc = BTM_SUCCESS; BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req"); - if (btm_cb.api.p_le_callback) - { + if (btm_cb.api.p_le_callback) { /* the callback function implementation may change the IO capability... */ callback_rc = (*btm_cb.api.p_le_callback) (BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, (tBTM_LE_EVT_DATA *)p_data); } @@ -1588,15 +1505,13 @@ UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p #endif { #if BTM_BLE_CONFORMANCE_TESTING == TRUE - if (btm_cb.devcb.keep_rfu_in_auth_req) - { + if (btm_cb.devcb.keep_rfu_in_auth_req) { BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u", - btm_cb.devcb.keep_rfu_in_auth_req); + btm_cb.devcb.keep_rfu_in_auth_req); p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU; btm_cb.devcb.keep_rfu_in_auth_req = FALSE; - } - else - { /* default */ + } else { + /* default */ p_data->auth_req &= BTM_LE_AUTH_REQ_MASK; } #else @@ -1604,17 +1519,17 @@ UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p #endif BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d", - p_dev_rec->security_required, p_data->auth_req); + p_dev_rec->security_required, p_data->auth_req); BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)", - p_data->init_keys, - p_data->resp_keys); + p_data->init_keys, + p_data->resp_keys); /* if authentication requires MITM protection, put on the mask */ - if (p_dev_rec->security_required & BTM_SEC_IN_MITM) + if (p_dev_rec->security_required & BTM_SEC_IN_MITM) { p_data->auth_req |= BTM_LE_AUTH_REQ_MITM; + } - if (!(p_data->auth_req & SMP_AUTH_BOND)) - { + if (!(p_data->auth_req & SMP_AUTH_BOND)) { BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged"); p_data->init_keys = 0; p_data->resp_keys = 0; @@ -1622,18 +1537,18 @@ UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 3: auth_req:%d\n", p_data->auth_req); BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x\n", - p_data->init_keys, - p_data->resp_keys); + p_data->init_keys, + p_data->resp_keys); BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d\n", - p_data->io_cap, p_data->auth_req); + p_data->io_cap, p_data->auth_req); /* remove MITM protection requirement if IO cap does not allow it */ - if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE) + if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE) { p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM; + } - if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) - { + if (!(p_data->auth_req & SMP_SC_SUPPORT_BIT)) { /* if Secure Connections are not supported then remove LK derivation, ** and keypress notifications. */ @@ -1645,7 +1560,7 @@ UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p } BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:0x%02x\n", - p_data->io_cap, p_data->oob_data, p_data->auth_req); + p_data->io_cap, p_data->oob_data, p_data->auth_req); } return callback_rc; } @@ -1664,11 +1579,10 @@ UINT8 btm_ble_br_keys_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data) { UINT8 callback_rc = BTM_SUCCESS; BTM_TRACE_DEBUG ("%s\n", __func__); - if (btm_cb.api.p_le_callback) - { + if (btm_cb.api.p_le_callback) { /* the callback function implementation may change the IO capability... */ callback_rc = (*btm_cb.api.p_le_callback) (BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, - (tBTM_LE_EVT_DATA *)p_data); + (tBTM_LE_EVT_DATA *)p_data); } return callback_rc; @@ -1684,7 +1598,7 @@ UINT8 btm_ble_br_keys_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data) ** Returns void ** *******************************************************************************/ -static void btm_ble_resolve_random_addr_on_conn_cmpl(void * p_rec, void *p_data) +static void btm_ble_resolve_random_addr_on_conn_cmpl(void *p_rec, void *p_data) { UINT8 *p = (UINT8 *)p_data; tBTM_SEC_DEV_REC *match_rec = (tBTM_SEC_DEV_REC *) p_rec; @@ -1707,24 +1621,18 @@ static void btm_ble_resolve_random_addr_on_conn_cmpl(void * p_rec, void *p_data) BTM_TRACE_EVENT ("%s\n", __func__); - if (match_rec) - { + if (match_rec) { LOG_INFO("%s matched and resolved random address", __func__); match = TRUE; match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA; memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN); - if (!btm_ble_init_pseudo_addr (match_rec, bda)) - { + if (!btm_ble_init_pseudo_addr (match_rec, bda)) { /* assign the original address to be the current report address */ memcpy(bda, match_rec->ble.pseudo_addr, BD_ADDR_LEN); - } - else - { + } else { memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN); } - } - else - { + } else { LOG_INFO("%s unable to match and resolve random address", __func__); } @@ -1759,31 +1667,26 @@ void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, /* Commenting out trace due to obf/compilation problems. */ #if (BT_USE_TRACES == TRUE) - if (p_dev_rec) - { + if (p_dev_rec) { BTM_TRACE_EVENT ("Security Manager: btm_ble_connected : handle:%d enc_mode:%d bda:%x RName:%s", - handle, enc_mode, - (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], - p_dev_rec->sec_bd_name); + handle, enc_mode, + (bda[2] << 24) + (bda[3] << 16) + (bda[4] << 8) + bda[5], + p_dev_rec->sec_bd_name); - BTM_TRACE_DEBUG ("btm_ble_connected sec_flags=0x%x",p_dev_rec->sec_flags); - } - else - { + BTM_TRACE_DEBUG ("btm_ble_connected sec_flags=0x%x", p_dev_rec->sec_flags); + } else { BTM_TRACE_EVENT ("Security Manager: btm_ble_connected: handle:%d enc_mode:%d bda:%x ", - handle, enc_mode, - (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); + handle, enc_mode, + (bda[2] << 24) + (bda[3] << 16) + (bda[4] << 8) + bda[5]); } #endif - if (!p_dev_rec) - { + if (!p_dev_rec) { /* There is no device record for new connection. Allocate one */ - if ((p_dev_rec = btm_sec_alloc_dev (bda)) == NULL) + if ((p_dev_rec = btm_sec_alloc_dev (bda)) == NULL) { return; - } - else /* Update the timestamp for this device */ - { + } + } else { /* Update the timestamp for this device */ p_dev_rec->timestamp = btm_cb.dev_rec_count++; } @@ -1795,15 +1698,18 @@ void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, memcpy(p_dev_rec->ble.pseudo_addr, bda, BD_ADDR_LEN); p_dev_rec->role_master = FALSE; - if (role == HCI_ROLE_MASTER) + if (role == HCI_ROLE_MASTER) { p_dev_rec->role_master = TRUE; + } #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - if (!addr_matched) + if (!addr_matched) { p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO; + } - if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched) + if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched) { memcpy(p_dev_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN); + } #endif p_cb->inq_var.directed_conn = BTM_BLE_CONNECT_EVT; @@ -1835,25 +1741,21 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len, BOOLEAN enhanced) STREAM_TO_UINT8 (bda_type, p); STREAM_TO_BDADDR (bda, p); - if (status == 0) - { + if (status == 0) { #if (BLE_PRIVACY_SPT == TRUE ) peer_addr_type = bda_type; match = btm_identity_addr_to_random_pseudo (bda, &bda_type, TRUE); - if (enhanced) - { + if (enhanced) { STREAM_TO_BDADDR (local_rpa, p); STREAM_TO_BDADDR (peer_rpa, p); } /* possiblly receive connection complete with resolvable random on slave role while the device has been paired */ - if (!match && role == HCI_ROLE_SLAVE && BTM_BLE_IS_RESOLVE_BDA(bda)) - { + if (!match && role == HCI_ROLE_SLAVE && BTM_BLE_IS_RESOLVE_BDA(bda)) { btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data); - } - else + } else #endif { STREAM_TO_UINT16 (conn_interval, p); @@ -1867,28 +1769,23 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len, BOOLEAN enhanced) conn_latency, conn_timeout); #if (BLE_PRIVACY_SPT == TRUE) - if (enhanced) - { + if (enhanced) { btm_ble_refresh_local_resolvable_private_addr(bda, local_rpa); - if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT) + if (peer_addr_type & BLE_ADDR_TYPE_ID_BIT) { btm_ble_refresh_peer_resolvable_private_addr(bda, peer_rpa, BLE_ADDR_RANDOM); + } } #endif } - } - else - { + } else { role = HCI_ROLE_UNKNOWN; - if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) - { + if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) { btm_ble_set_conn_st(BLE_CONN_IDLE); #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, TRUE); #endif - } - else - { + } else { #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE; btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); @@ -1909,8 +1806,7 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len, BOOLEAN enhanced) ******************************************************************************/ void btm_ble_create_ll_conn_complete (UINT8 status) { - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { btm_ble_set_conn_st(BLE_CONN_IDLE); btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status); } @@ -1928,126 +1824,111 @@ UINT8 btm_proc_smp_cback(tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data) BTM_TRACE_DEBUG ("btm_proc_smp_cback event = %d", event); - if (p_dev_rec != NULL) - { - switch (event) - { - case SMP_IO_CAP_REQ_EVT: - btm_ble_io_capabilities_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req); + if (p_dev_rec != NULL) { + switch (event) { + case SMP_IO_CAP_REQ_EVT: + btm_ble_io_capabilities_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req); + break; + + case SMP_BR_KEYS_REQ_EVT: + btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req); + break; + + case SMP_PASSKEY_REQ_EVT: + case SMP_PASSKEY_NOTIF_EVT: + case SMP_OOB_REQ_EVT: + case SMP_NC_REQ_EVT: + case SMP_SC_OOB_REQ_EVT: + /* fall through */ + p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; + + case SMP_SEC_REQUEST_EVT: + if (event == SMP_SEC_REQUEST_EVT && btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { + BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__); break; + } + memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); + p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; + btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; + /* fall through */ - case SMP_BR_KEYS_REQ_EVT: - btm_ble_br_keys_req(p_dev_rec, (tBTM_LE_IO_REQ *)&p_data->io_req); - break; + case SMP_COMPLT_EVT: + if (btm_cb.api.p_le_callback) { + /* the callback function implementation may change the IO capability... */ + BTM_TRACE_DEBUG ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback ); + (*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data); + } - case SMP_PASSKEY_REQ_EVT: - case SMP_PASSKEY_NOTIF_EVT: - case SMP_OOB_REQ_EVT: - case SMP_NC_REQ_EVT: - case SMP_SC_OOB_REQ_EVT: - /* fall through */ - p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED; + if (event == SMP_COMPLT_EVT) { + BTM_TRACE_DEBUG ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags ); - case SMP_SEC_REQUEST_EVT: - if (event == SMP_SEC_REQUEST_EVT && btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - { - BTM_TRACE_DEBUG("%s: Ignoring SMP Security request", __func__); - break; + res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING; + + BTM_TRACE_DEBUG ("after update result=%d sec_level=0x%x sec_flags=0x%x", + res, p_data->cmplt.sec_level , p_dev_rec->sec_flags ); + + if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback ) { + BTM_TRACE_DEBUG ("Pairing Cancel completed"); + (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS); } - memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); - p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; - btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; - /* fall through */ - - case SMP_COMPLT_EVT: - if (btm_cb.api.p_le_callback) - { - /* the callback function implementation may change the IO capability... */ - BTM_TRACE_DEBUG ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback ); - (*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data); - } - - if (event == SMP_COMPLT_EVT) - { - BTM_TRACE_DEBUG ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags ); - - res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING; - - BTM_TRACE_DEBUG ("after update result=%d sec_level=0x%x sec_flags=0x%x", - res, p_data->cmplt.sec_level , p_dev_rec->sec_flags ); - - if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback ) - { - BTM_TRACE_DEBUG ("Pairing Cancel completed"); - (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS); - } #if BTM_BLE_CONFORMANCE_TESTING == TRUE - if (res != BTM_SUCCESS) - { - if (!btm_cb.devcb.no_disc_if_pair_fail && p_data->cmplt.reason != SMP_CONN_TOUT) - { - BTM_TRACE_DEBUG ("Pairing failed - prepare to remove ACL"); - l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); - } - else - { - BTM_TRACE_DEBUG ("Pairing failed - Not Removing ACL"); - p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; - } - } -#else - if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) - { + if (res != BTM_SUCCESS) { + if (!btm_cb.devcb.no_disc_if_pair_fail && p_data->cmplt.reason != SMP_CONN_TOUT) { BTM_TRACE_DEBUG ("Pairing failed - prepare to remove ACL"); l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); - } -#endif - - BTM_TRACE_DEBUG ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x", - btm_cb.pairing_state, - btm_cb.pairing_flags, - btm_cb.pin_code_len ); - BTM_TRACE_DEBUG ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x", - btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2], - btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]); - - /* Reset btm state only if the callback address matches pairing address*/ - if(memcmp(bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) - { - memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); - btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; - btm_cb.pairing_flags = 0; - } - - if (res == BTM_SUCCESS) - { + } else { + BTM_TRACE_DEBUG ("Pairing failed - Not Removing ACL"); p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; -#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - /* add all bonded device into resolving list if IRK is available*/ - btm_ble_resolving_list_load_dev(p_dev_rec); -#endif } - - btm_sec_dev_rec_cback_event(p_dev_rec, res, TRUE); } - break; +#else + if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT) { + BTM_TRACE_DEBUG ("Pairing failed - prepare to remove ACL"); + l2cu_start_post_bond_timer(p_dev_rec->ble_hci_handle); + } +#endif - default: - BTM_TRACE_DEBUG ("unknown event = %d", event); - break; + BTM_TRACE_DEBUG ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x", + btm_cb.pairing_state, + btm_cb.pairing_flags, + btm_cb.pin_code_len ); + BTM_TRACE_DEBUG ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x", + btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2], + btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]); + + /* Reset btm state only if the callback address matches pairing address*/ + if (memcmp(bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) { + memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); + btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; + btm_cb.pairing_flags = 0; + } + + if (res == BTM_SUCCESS) { + p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; +#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) + /* add all bonded device into resolving list if IRK is available*/ + btm_ble_resolving_list_load_dev(p_dev_rec); +#endif + } + + btm_sec_dev_rec_cback_event(p_dev_rec, res, TRUE); + } + break; + + default: + BTM_TRACE_DEBUG ("unknown event = %d", event); + break; } - } - else - { + } else { BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device"); } return 0; } - #endif /* SMP_INCLUDED */ +#endif /* SMP_INCLUDED */ /******************************************************************************* ** @@ -2072,21 +1953,16 @@ BOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len, BTM_TRACE_DEBUG ("%s", __func__); BOOLEAN ret = FALSE; - if (p_rec == NULL) - { + if (p_rec == NULL) { BTM_TRACE_ERROR("%s-data signing can not be done from unknown device", __func__); - } - else - { + } else { UINT8 *p_mac = (UINT8 *)signature; UINT8 *p_buf, *pp; - if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL) - { + if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL) { BTM_TRACE_DEBUG("%s-Start to generate Local CSRK", __func__); pp = p_buf; /* prepare plain text */ - if (p_text) - { + if (p_text) { memcpy(p_buf, p_text, len); pp = (p_buf + len); } @@ -2095,14 +1971,13 @@ BOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len, UINT32_TO_STREAM(p_mac, p_rec->ble.keys.local_counter); if ((ret = aes_cipher_msg_auth_code(p_rec->ble.keys.lcsrk, p_buf, (UINT16)(len + 4), - BTM_CMAC_TLEN_SIZE, p_mac)) == TRUE) - { - btm_ble_increment_sign_ctr(bd_addr, TRUE); + BTM_CMAC_TLEN_SIZE, p_mac)) == TRUE) { + btm_ble_increment_sign_ctr(bd_addr, TRUE); } BTM_TRACE_DEBUG("%s p_mac = %d", __func__, p_mac); BTM_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x", - *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); + *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); BTM_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x", *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); GKI_freebuf(p_buf); @@ -2134,27 +2009,18 @@ BOOLEAN BTM_BleVerifySignature (BD_ADDR bd_addr, UINT8 *p_orig, UINT16 len, UINT tBTM_SEC_DEV_REC *p_rec = btm_find_dev (bd_addr); UINT8 p_mac[BTM_CMAC_TLEN_SIZE]; - if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) - { + if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK))) { BTM_TRACE_ERROR("can not verify signature for unknown device"); - } - else if (counter < p_rec->ble.keys.counter) - { + } else if (counter < p_rec->ble.keys.counter) { BTM_TRACE_ERROR("signature received with out dated sign counter"); - } - else if (p_orig == NULL) - { + } else if (p_orig == NULL) { BTM_TRACE_ERROR("No signature to verify"); - } - else - { + } else { BTM_TRACE_DEBUG ("%s rcv_cnt=%d >= expected_cnt=%d", __func__, counter, - p_rec->ble.keys.counter); + p_rec->ble.keys.counter); - if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac)) - { - if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) - { + if (aes_cipher_msg_auth_code(p_rec->ble.keys.pcsrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac)) { + if (memcmp(p_mac, p_comp, BTM_CMAC_TLEN_SIZE) == 0) { btm_ble_increment_sign_ctr(bd_addr, FALSE); verified = TRUE; } @@ -2185,42 +2051,37 @@ BOOLEAN BTM_GetLeSecurityState (BD_ADDR bd_addr, UINT8 *p_le_dev_sec_flags, UINT *p_le_key_size = 0; #if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE) - if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) - { + if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) { BTM_TRACE_ERROR ("%s fails", __func__); return (FALSE); } - if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) - { + if (p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) { BTM_TRACE_ERROR ("%s-this is not LE device", __func__); return (FALSE); } dev_rec_sec_flags = p_dev_rec->sec_flags; - if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) - { + if (dev_rec_sec_flags & BTM_SEC_LE_ENCRYPTED) { /* link is encrypted with LTK or STK */ *p_le_key_size = p_dev_rec->enc_key_size; *p_le_dev_sec_flags |= BTM_SEC_LE_LINK_ENCRYPTED; *p_le_dev_sec_flags |= (dev_rec_sec_flags & BTM_SEC_LE_AUTHENTICATED) - ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ - : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ - } - else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) - { + ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ + : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ + } else if (p_dev_rec->ble.key_type & BTM_LE_KEY_PENC) { /* link is unencrypted, still LTK is available */ *p_le_key_size = p_dev_rec->ble.keys.key_size; *p_le_dev_sec_flags |= (dev_rec_sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) - ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ - : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ + ? BTM_SEC_LE_LINK_PAIRED_WITH_MITM /* set auth LTK flag */ + : BTM_SEC_LE_LINK_PAIRED_WITHOUT_MITM; /* set unauth LTK flag */ } BTM_TRACE_DEBUG ("%s - le_dev_sec_flags: 0x%02x, le_key_size: %d", - __func__, *p_le_dev_sec_flags, *p_le_key_size); + __func__, *p_le_dev_sec_flags, *p_le_key_size); return TRUE; #else @@ -2243,11 +2104,10 @@ BOOLEAN BTM_BleSecurityProcedureIsRunning(BD_ADDR bd_addr) #if (BLE_INCLUDED == TRUE) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { BTM_TRACE_ERROR ("%s device with BDA: %08x%04x is not found", - __func__, (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5]); + __func__, (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); return FALSE; } @@ -2272,33 +2132,30 @@ BOOLEAN BTM_BleSecurityProcedureIsRunning(BD_ADDR bd_addr) extern UINT8 BTM_BleGetSupportedKeySize (BD_ADDR bd_addr) { #ifndef L2CAP_LE_COC_INCLUDED -#define L2CAP_LE_COC_INCLUDED FALSE +#define L2CAP_LE_COC_INCLUDED FALSE #endif #if ((BLE_INCLUDED == TRUE) && (L2CAP_LE_COC_INCLUDED == TRUE)) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); tBTM_LE_IO_REQ dev_io_cfg; UINT8 callback_rc; - if (!p_dev_rec) - { + if (!p_dev_rec) { BTM_TRACE_ERROR ("%s device with BDA: %08x%04x is not found", - __func__,(bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5]); + __func__, (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); return 0; } - if (btm_cb.api.p_le_callback == NULL) - { - BTM_TRACE_ERROR ("%s can't access supported key size",__func__); + if (btm_cb.api.p_le_callback == NULL) { + BTM_TRACE_ERROR ("%s can't access supported key size", __func__); return 0; } callback_rc = (*btm_cb.api.p_le_callback) (BTM_LE_IO_REQ_EVT, p_dev_rec->bd_addr, - (tBTM_LE_EVT_DATA *) &dev_io_cfg); + (tBTM_LE_EVT_DATA *) &dev_io_cfg); - if (callback_rc != BTM_SUCCESS) - { - BTM_TRACE_ERROR ("%s can't access supported key size",__func__); + if (callback_rc != BTM_SUCCESS) { + BTM_TRACE_ERROR ("%s can't access supported key size", __func__); return 0; } @@ -2328,26 +2185,25 @@ static void btm_notify_new_key(UINT8 key_type) BTM_TRACE_DEBUG ("btm_notify_new_key key_type=%d", key_type); - if (btm_cb.api.p_le_key_callback) - { - switch (key_type) - { - case BTM_BLE_KEY_TYPE_ID: - BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ID"); - p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys; - break; + if (btm_cb.api.p_le_key_callback) { + switch (key_type) { + case BTM_BLE_KEY_TYPE_ID: + BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ID"); + p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys; + break; - case BTM_BLE_KEY_TYPE_ER: - BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ER"); - p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.ble_encryption_key_value; - break; + case BTM_BLE_KEY_TYPE_ER: + BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ER"); + p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.ble_encryption_key_value; + break; - default: - BTM_TRACE_ERROR("unknown key type: %d", key_type); - break; + default: + BTM_TRACE_ERROR("unknown key type: %d", key_type); + break; } - if (p_locak_keys != NULL) + if (p_locak_keys != NULL) { (*btm_cb.api.p_le_key_callback) (key_type, p_locak_keys); + } } } @@ -2365,13 +2221,10 @@ static void btm_ble_process_er2(tBTM_RAND_ENC *p) { BTM_TRACE_DEBUG ("btm_ble_process_er2"); - if (p &&p->opcode == HCI_BLE_RAND) - { + if (p && p->opcode == HCI_BLE_RAND) { memcpy(&btm_cb.devcb.ble_encryption_key_value[8], p->param_buf, BT_OCTET8_LEN); btm_notify_new_key(BTM_BLE_KEY_TYPE_ER); - } - else - { + } else { BTM_TRACE_ERROR("Generating ER2 exception."); memset(&btm_cb.devcb.ble_encryption_key_value, 0, sizeof(BT_OCTET16)); } @@ -2391,18 +2244,14 @@ static void btm_ble_process_er(tBTM_RAND_ENC *p) { BTM_TRACE_DEBUG ("btm_ble_process_er"); - if (p &&p->opcode == HCI_BLE_RAND) - { + if (p && p->opcode == HCI_BLE_RAND) { memcpy(&btm_cb.devcb.ble_encryption_key_value[0], p->param_buf, BT_OCTET8_LEN); - if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2)) - { + if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2)) { memset(&btm_cb.devcb.ble_encryption_key_value, 0, sizeof(BT_OCTET16)); BTM_TRACE_ERROR("Generating ER2 failed."); } - } - else - { + } else { BTM_TRACE_ERROR("Generating ER1 exception."); } } @@ -2420,27 +2269,22 @@ static void btm_ble_process_er(tBTM_RAND_ENC *p) static void btm_ble_process_irk(tSMP_ENC *p) { BTM_TRACE_DEBUG ("btm_ble_process_irk"); - if (p &&p->opcode == HCI_BLE_ENCRYPT) - { + if (p && p->opcode == HCI_BLE_ENCRYPT) { memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN); btm_notify_new_key(BTM_BLE_KEY_TYPE_ID); #if BLE_PRIVACY_SPT == TRUE /* if privacy is enabled, new RPA should be calculated */ - if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) - { + if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low); } #endif - } - else - { + } else { BTM_TRACE_ERROR("Generating IRK exception."); } /* proceed generate ER */ - if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er)) - { + if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er)) { BTM_TRACE_ERROR("Generating ER failed."); } } @@ -2464,25 +2308,19 @@ static void btm_ble_process_dhk(tSMP_ENC *p) BTM_TRACE_DEBUG ("btm_ble_process_dhk"); - if (p && p->opcode == HCI_BLE_ENCRYPT) - { + if (p && p->opcode == HCI_BLE_ENCRYPT) { memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN); BTM_TRACE_DEBUG("BLE DHK generated."); /* IRK = D1(IR, 1) */ if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt, - 1, &output)) - { + 1, &output)) { /* reset all identity root related key */ memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); - } - else - { + } else { btm_ble_process_irk(&output); } - } - else - { + } else { /* reset all identity root related key */ memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); } @@ -2508,8 +2346,7 @@ static void btm_ble_process_ir2(tBTM_RAND_ENC *p) BTM_TRACE_DEBUG ("btm_ble_process_ir2"); - if (p && p->opcode == HCI_BLE_RAND) - { + if (p && p->opcode == HCI_BLE_RAND) { /* remembering in control block */ memcpy(&btm_cb.devcb.id_keys.ir[8], p->param_buf, BT_OCTET8_LEN); /* generate DHK= Eir({0x03, 0x00, 0x00 ...}) */ @@ -2520,9 +2357,7 @@ static void btm_ble_process_ir2(tBTM_RAND_ENC *p) btm_ble_process_dhk(&output); BTM_TRACE_DEBUG("BLE IR generated."); - } - else - { + } else { memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); } #endif @@ -2543,13 +2378,11 @@ static void btm_ble_process_ir(tBTM_RAND_ENC *p) { BTM_TRACE_DEBUG ("btm_ble_process_ir"); - if (p && p->opcode == HCI_BLE_RAND) - { + if (p && p->opcode == HCI_BLE_RAND) { /* remembering in control block */ memcpy(btm_cb.devcb.id_keys.ir, p->param_buf, BT_OCTET8_LEN); - if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2)) - { + if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2)) { BTM_TRACE_ERROR("Generating IR2 failed."); memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS)); } @@ -2570,13 +2403,12 @@ void btm_ble_reset_id( void ) BTM_TRACE_DEBUG ("btm_ble_reset_id"); /* regenrate Identity Root*/ - if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir)) - { + if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir)) { BTM_TRACE_DEBUG("Generating IR failed."); } } - #if BTM_BLE_CONFORMANCE_TESTING == TRUE +#if BTM_BLE_CONFORMANCE_TESTING == TRUE /******************************************************************************* ** ** Function btm_ble_set_no_disc_if_pair_fail @@ -2621,7 +2453,7 @@ void btm_ble_set_test_mac_value(BOOLEAN enable, UINT8 *p_test_mac_val ) void btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr ) { BTM_TRACE_DEBUG ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d", - enable, test_local_sign_cntr); + enable, test_local_sign_cntr); btm_cb.devcb.enable_test_local_sign_cntr = enable; btm_cb.devcb.test_local_sign_cntr = test_local_sign_cntr; } @@ -2642,14 +2474,16 @@ void btm_set_random_address(BD_ADDR random_bda) BTM_TRACE_DEBUG ("btm_set_random_address"); - if (adv_mode == BTM_BLE_ADV_ENABLE) + if (adv_mode == BTM_BLE_ADV_ENABLE) { btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE); + } memcpy(p_cb->private_addr, random_bda, BD_ADDR_LEN); btsnd_hcic_ble_set_random_addr(p_cb->private_addr); - if (adv_mode == BTM_BLE_ADV_ENABLE) + if (adv_mode == BTM_BLE_ADV_ENABLE) { btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE); + } } diff --git a/components/bt/bluedroid/stack/btm/btm_ble_addr.c b/components/bt/bluedroid/stack/btm/btm_ble_addr.c old mode 100755 new mode 100644 index 70543c3b4..95a2ad9cc --- a/components/bt/bluedroid/stack/btm/btm_ble_addr.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_addr.c @@ -51,8 +51,7 @@ static void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p) tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; BTM_TRACE_EVENT ("btm_gen_resolve_paddr_cmpl"); - if (p) - { + if (p) { /* set hash to be LSB of rpAddress */ p_cb->private_addr[5] = p->param_buf[0]; p_cb->private_addr[4] = p->param_buf[1]; @@ -66,14 +65,12 @@ static void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p) btu_stop_timer_oneshot(&p_cb->raddr_timer_ent); #if (BTM_BLE_CONFORMANCE_TESTING == TRUE) btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, - btm_cb.ble_ctr_cb.rpa_tout); + btm_cb.ble_ctr_cb.rpa_tout); #else btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, - BTM_BLE_PRIVATE_ADDR_INT); + BTM_BLE_PRIVATE_ADDR_INT); #endif - } - else - { + } else { /* random address set failure */ BTM_TRACE_DEBUG("set random address failed"); } @@ -95,8 +92,7 @@ void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p) tSMP_ENC output; BTM_TRACE_EVENT ("btm_gen_resolve_paddr_low"); - if (p) - { + if (p) { p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK); p->param_buf[2] |= BLE_RESOLVE_ADDR_MSB; @@ -105,12 +101,9 @@ void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p) p_cb->private_addr[0] = p->param_buf[2]; /* encrypt with ur IRK */ - if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output)) - { + if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output)) { btm_gen_resolve_paddr_cmpl(NULL); - } - else - { + } else { btm_gen_resolve_paddr_cmpl(&output); } } @@ -129,8 +122,9 @@ void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback) { BTM_TRACE_EVENT ("btm_gen_resolvable_private_addr"); /* generate 3B rand as BD LSB, SRK with it, get BD MSB */ - if (!btsnd_hcic_ble_rand((void *)p_cmd_cplt_cback)) + if (!btsnd_hcic_ble_rand((void *)p_cmd_cplt_cback)) { btm_gen_resolve_paddr_cmpl(NULL); + } } /******************************************************************************* ** @@ -153,8 +147,7 @@ static void btm_gen_non_resolve_paddr_cmpl(tBTM_RAND_ENC *p) BTM_TRACE_EVENT ("btm_gen_non_resolve_paddr_cmpl"); p_cb->p_generate_cback = NULL; - if (p) - { + if (p) { pp = p->param_buf; STREAM_TO_BDADDR(static_random, pp); @@ -162,14 +155,14 @@ static void btm_gen_non_resolve_paddr_cmpl(tBTM_RAND_ENC *p) static_random[0] &= BLE_STATIC_PRIVATE_MSB_MASK; /* report complete */ - if (p_cback) + if (p_cback) { (* p_cback)(static_random, p_data); - } - else - { + } + } else { BTM_TRACE_DEBUG("btm_gen_non_resolvable_private_addr failed"); - if (p_cback) + if (p_cback) { (* p_cback)(NULL, p_data); + } } } /******************************************************************************* @@ -188,13 +181,13 @@ void btm_gen_non_resolvable_private_addr (tBTM_BLE_ADDR_CBACK *p_cback, void *p) BTM_TRACE_EVENT ("btm_gen_non_resolvable_private_addr"); - if (p_mgnt_cb->p_generate_cback != NULL) + if (p_mgnt_cb->p_generate_cback != NULL) { return; + } p_mgnt_cb->p_generate_cback = p_cback; p_mgnt_cb->p = p; - if (!btsnd_hcic_ble_rand((void *)btm_gen_non_resolve_paddr_cmpl)) - { + if (!btsnd_hcic_ble_rand((void *)btm_gen_non_resolve_paddr_cmpl)) { btm_gen_non_resolve_paddr_cmpl(NULL); } @@ -221,8 +214,7 @@ static void btm_ble_resolve_address_cmpl(void) BTM_TRACE_EVENT ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index); - if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS) - { + if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS) { p_dev_rec = &btm_cb.sec_dev_rec[p_mgnt_cb->index]; } @@ -250,10 +242,8 @@ static BOOLEAN btm_ble_proc_resolve_x(tSMP_ENC *p) comp[1] = p_mgnt_cb->random_bda[4]; comp[2] = p_mgnt_cb->random_bda[3]; - if (p) - { - if (!memcmp(p->param_buf, &comp[0], 3)) - { + if (p) { + if (!memcmp(p->param_buf, &comp[0], 3)) { /* match is found */ BTM_TRACE_EVENT ("match is found"); btm_ble_resolve_address_cmpl(); @@ -277,8 +267,7 @@ BOOLEAN btm_ble_init_pseudo_addr (tBTM_SEC_DEV_REC *p_dev_rec, BD_ADDR new_pseud { BD_ADDR dummy_bda = {0}; - if (memcmp(p_dev_rec->ble.pseudo_addr, dummy_bda, BD_ADDR_LEN) == 0) - { + if (memcmp(p_dev_rec->ble.pseudo_addr, dummy_bda, BD_ADDR_LEN) == 0) { memcpy(p_dev_rec->ble.pseudo_addr, new_pseudo_addr, BD_ADDR_LEN); return TRUE; } @@ -299,14 +288,14 @@ BOOLEAN btm_ble_addr_resolvable (BD_ADDR rpa, tBTM_SEC_DEV_REC *p_dev_rec) { BOOLEAN rt = FALSE; - if (!BTM_BLE_IS_RESOLVE_BDA(rpa)) + if (!BTM_BLE_IS_RESOLVE_BDA(rpa)) { return rt; + } UINT8 rand[3]; tSMP_ENC output; if ((p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) && - (p_dev_rec->ble.key_type & BTM_LE_KEY_PID)) - { + (p_dev_rec->ble.key_type & BTM_LE_KEY_PID)) { BTM_TRACE_DEBUG("%s try to resolve", __func__); /* use the 3 MSB of bd address as prand */ rand[0] = rpa[2]; @@ -321,8 +310,7 @@ BOOLEAN btm_ble_addr_resolvable (BD_ADDR rpa, tBTM_SEC_DEV_REC *p_dev_rec) rand[1] = rpa[4]; rand[2] = rpa[3]; - if (!memcmp(output.param_buf, &rand[0], 3)) - { + if (!memcmp(output.param_buf, &rand[0], 3)) { btm_ble_init_pseudo_addr (p_dev_rec, rpa); rt = TRUE; } @@ -354,8 +342,7 @@ static BOOLEAN btm_ble_match_random_bda(UINT16 rec_index) BTM_TRACE_EVENT("%s rec_index = %d", __func__, rec_index); - if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS) - { + if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS) { tSMP_ENC output; tBTM_SEC_DEV_REC *p_dev_rec; p_dev_rec = &btm_cb.sec_dev_rec[rec_index]; @@ -364,21 +351,16 @@ static BOOLEAN btm_ble_match_random_bda(UINT16 rec_index) p_dev_rec->device_type); if ((p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) && - (p_dev_rec->ble.key_type & BTM_LE_KEY_PID)) - { + (p_dev_rec->ble.key_type & BTM_LE_KEY_PID)) { /* generate X = E irk(R0, R1, R2) and R is random address 3 LSO */ SMP_Encrypt(p_dev_rec->ble.keys.irk, BT_OCTET16_LEN, &rand[0], 3, &output); return btm_ble_proc_resolve_x(&output); - } - else - { + } else { // not completed return FALSE; } - } - else /* no match found */ - { + } else { /* no match found */ btm_ble_resolve_address_cmpl(); return TRUE; } @@ -395,13 +377,12 @@ static BOOLEAN btm_ble_match_random_bda(UINT16 rec_index) ** address is matched to. ** *******************************************************************************/ -void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p) +void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK *p_cback, void *p) { tBTM_LE_RANDOM_CB *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; BTM_TRACE_EVENT ("btm_ble_resolve_random_addr"); - if ( !p_mgnt_cb->busy) - { + if ( !p_mgnt_cb->busy) { p_mgnt_cb->p = p; p_mgnt_cb->busy = TRUE; p_mgnt_cb->index = 0; @@ -409,18 +390,16 @@ void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_ memcpy(p_mgnt_cb->random_bda, random_bda, BD_ADDR_LEN); /* start to resolve random address */ /* check for next security record */ - while (TRUE) - { - if (btm_ble_match_random_bda(p_mgnt_cb->index)) - { + while (TRUE) { + if (btm_ble_match_random_bda(p_mgnt_cb->index)) { /* atch found or went through the list */ break; } p_mgnt_cb->index ++; } - } - else + } else { (*p_cback)(NULL, p); + } } #endif @@ -434,22 +413,19 @@ void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_ ** Description find the security record whose LE static address is matching ** *******************************************************************************/ -tBTM_SEC_DEV_REC* btm_find_dev_by_identity_addr(BD_ADDR bd_addr, UINT8 addr_type) +tBTM_SEC_DEV_REC *btm_find_dev_by_identity_addr(BD_ADDR bd_addr, UINT8 addr_type) { #if BLE_PRIVACY_SPT == TRUE UINT8 i; tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++) { if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) && - memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) == 0) - { + memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) == 0) { if ((p_dev_rec->ble.static_addr_type & (~BLE_ADDR_TYPE_ID_BIT)) != - (addr_type & (~BLE_ADDR_TYPE_ID_BIT))) - { + (addr_type & (~BLE_ADDR_TYPE_ID_BIT))) { BTM_TRACE_WARNING("%s find pseudo->random match with diff addr type: %d vs %d", - __func__, p_dev_rec->ble.static_addr_type, addr_type); + __func__, p_dev_rec->ble.static_addr_type, addr_type); } /* found the match */ @@ -476,15 +452,16 @@ BOOLEAN btm_identity_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type, BTM_TRACE_EVENT ("%s", __func__); /* evt reported on static address, map static address to random pseudo */ - if (p_dev_rec != NULL) - { + if (p_dev_rec != NULL) { /* if RPA offloading is supported, or 4.2 controller, do RPA refresh */ - if (refresh && controller_get_interface()->get_ble_resolving_list_max_size() != 0) + if (refresh && controller_get_interface()->get_ble_resolving_list_max_size() != 0) { btm_ble_read_resolving_list_entry(p_dev_rec); + } /* assign the original address to be the current report address */ - if (!btm_ble_init_pseudo_addr (p_dev_rec, bd_addr)) + if (!btm_ble_init_pseudo_addr (p_dev_rec, bd_addr)) { memcpy(bd_addr, p_dev_rec->ble.pseudo_addr, BD_ADDR_LEN); + } *p_addr_type = p_dev_rec->ble.ble_addr_type; return TRUE; @@ -506,14 +483,13 @@ BOOLEAN btm_random_pseudo_to_identity_addr(BD_ADDR random_pseudo, UINT8 *p_stati #if BLE_PRIVACY_SPT == TRUE tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (random_pseudo); - if (p_dev_rec != NULL) - { - if (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) - { + if (p_dev_rec != NULL) { + if (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) { * p_static_addr_type = p_dev_rec->ble.static_addr_type; memcpy(random_pseudo, p_dev_rec->ble.static_addr, BD_ADDR_LEN); - if (controller_get_interface()->supports_ble_privacy()) + if (controller_get_interface()->supports_ble_privacy()) { *p_static_addr_type |= BLE_ADDR_TYPE_ID_BIT; + } return TRUE; } } @@ -530,29 +506,28 @@ BOOLEAN btm_random_pseudo_to_identity_addr(BD_ADDR random_pseudo, UINT8 *p_stati ** *******************************************************************************/ void btm_ble_refresh_peer_resolvable_private_addr(BD_ADDR pseudo_bda, BD_ADDR rpa, - UINT8 rra_type) + UINT8 rra_type) { #if BLE_PRIVACY_SPT == TRUE UINT8 rra_dummy = FALSE; BD_ADDR dummy_bda = {0}; - if (memcmp(dummy_bda, rpa, BD_ADDR_LEN) == 0) + if (memcmp(dummy_bda, rpa, BD_ADDR_LEN) == 0) { rra_dummy = TRUE; + } /* update security record here, in adv event or connection complete process */ tBTM_SEC_DEV_REC *p_sec_rec = btm_find_dev(pseudo_bda); - if (p_sec_rec != NULL) - { + if (p_sec_rec != NULL) { memcpy(p_sec_rec->ble.cur_rand_addr, rpa, BD_ADDR_LEN); /* unknown, if dummy address, set to static */ - if (rra_type == BTM_BLE_ADDR_PSEUDO) - p_sec_rec->ble.active_addr_type = rra_dummy ? BTM_BLE_ADDR_STATIC: BTM_BLE_ADDR_RRA; - else + if (rra_type == BTM_BLE_ADDR_PSEUDO) { + p_sec_rec->ble.active_addr_type = rra_dummy ? BTM_BLE_ADDR_STATIC : BTM_BLE_ADDR_RRA; + } else { p_sec_rec->ble.active_addr_type = rra_type; - } - else - { + } + } else { BTM_TRACE_ERROR("No matching known device in record"); return; } @@ -562,36 +537,30 @@ void btm_ble_refresh_peer_resolvable_private_addr(BD_ADDR pseudo_bda, BD_ADDR rp /* connection refresh remote address */ tACL_CONN *p_acl = btm_bda_to_acl(p_sec_rec->bd_addr, BT_TRANSPORT_LE); - if (p_acl == NULL) + if (p_acl == NULL) { p_acl = btm_bda_to_acl(p_sec_rec->ble.pseudo_addr, BT_TRANSPORT_LE); + } - if (p_acl != NULL) - { - if (rra_type == BTM_BLE_ADDR_PSEUDO) - { + if (p_acl != NULL) { + if (rra_type == BTM_BLE_ADDR_PSEUDO) { /* use static address, resolvable_private_addr is empty */ - if (rra_dummy) - { + if (rra_dummy) { p_acl->active_remote_addr_type = p_sec_rec->ble.static_addr_type; memcpy(p_acl->active_remote_addr, p_sec_rec->ble.static_addr, BD_ADDR_LEN); - } - else - { + } else { p_acl->active_remote_addr_type = BLE_ADDR_RANDOM; memcpy(p_acl->active_remote_addr, rpa, BD_ADDR_LEN); } - } - else - { - p_acl->active_remote_addr_type = rra_type; - memcpy(p_acl->active_remote_addr, rpa, BD_ADDR_LEN); + } else { + p_acl->active_remote_addr_type = rra_type; + memcpy(p_acl->active_remote_addr, rpa, BD_ADDR_LEN); } BTM_TRACE_DEBUG("p_acl->active_remote_addr_type: %d ", p_acl->active_remote_addr_type); BTM_TRACE_DEBUG("%s conn_addr: %02x:%02x:%02x:%02x:%02x:%02x", - __func__,p_acl->active_remote_addr[0], p_acl->active_remote_addr[1], - p_acl->active_remote_addr[2], p_acl->active_remote_addr[3], - p_acl->active_remote_addr[4], p_acl->active_remote_addr[5]); + __func__, p_acl->active_remote_addr[0], p_acl->active_remote_addr[1], + p_acl->active_remote_addr[2], p_acl->active_remote_addr[3], + p_acl->active_remote_addr[4], p_acl->active_remote_addr[5]); } #endif } @@ -605,26 +574,23 @@ void btm_ble_refresh_peer_resolvable_private_addr(BD_ADDR pseudo_bda, BD_ADDR rp ** *******************************************************************************/ void btm_ble_refresh_local_resolvable_private_addr(BD_ADDR pseudo_addr, - BD_ADDR local_rpa) + BD_ADDR local_rpa) { #if BLE_PRIVACY_SPT == TRUE tACL_CONN *p = btm_bda_to_acl(pseudo_addr, BT_TRANSPORT_LE); BD_ADDR dummy_bda = {0}; - if (p != NULL) - { - if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) - { + if (p != NULL) { + if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { p->conn_addr_type = BLE_ADDR_RANDOM; - if (memcmp(local_rpa, dummy_bda, BD_ADDR_LEN)) + if (memcmp(local_rpa, dummy_bda, BD_ADDR_LEN)) { memcpy(p->conn_addr, local_rpa, BD_ADDR_LEN); - else + } else { memcpy(p->conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN); - } - else - { + } + } else { p->conn_addr_type = BLE_ADDR_PUBLIC; - memcpy(p->conn_addr,&controller_get_interface()->get_address()->address, BD_ADDR_LEN); + memcpy(p->conn_addr, &controller_get_interface()->get_address()->address, BD_ADDR_LEN); } } #endif diff --git a/components/bt/bluedroid/stack/btm/btm_ble_adv_filter.c b/components/bt/bluedroid/stack/btm/btm_ble_adv_filter.c old mode 100755 new mode 100644 index 933bd3d31..1190643f3 --- a/components/bt/bluedroid/stack/btm/btm_ble_adv_filter.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_adv_filter.c @@ -50,10 +50,10 @@ tBTM_BLE_ADV_FILTER_CB btm_ble_adv_filt_cb; tBTM_BLE_VSC_CB cmn_ble_vsc_cb; -static const BD_ADDR na_bda= {0}; +static const BD_ADDR na_bda = {0}; static UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action, - UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, UINT8 num_available); + UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, UINT8 num_available); #define BTM_BLE_SET_SCAN_PF_OPCODE(x, y) (((x)<<4)|y) #define BTM_BLE_GET_SCAN_PF_SUBCODE(x) ((x) >> 4) @@ -88,8 +88,7 @@ tBTM_STATUS btm_ble_obtain_vsc_details() #if BLE_VND_INCLUDED == TRUE BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.max_filter) - { + if (0 == cmn_ble_vsc_cb.max_filter) { st = BTM_MODE_UNSUPPORTED; return st; } @@ -113,17 +112,17 @@ void btm_ble_advfilt_enq_op_q(UINT8 action, UINT8 ocf, tBTM_BLE_FILT_CB_EVT cb_e tBTM_BLE_REF_VALUE ref, tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback, tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback) { - btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = (action |(ocf << 4)); + btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = (action | (ocf << 4)); btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref; btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt; btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] = p_cmpl_cback; btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx] = p_filt_param_cback; BTM_TRACE_DEBUG("btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, cback:%x", - btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], action, - ocf, cb_evt, p_cmpl_cback); + btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], action, + ocf, cb_evt, p_cmpl_cback); btm_ble_adv_filt_cb.op_q.next_idx = (btm_ble_adv_filt_cb.op_q.next_idx + 1) - % BTM_BLE_PF_TYPE_MAX; + % BTM_BLE_PF_TYPE_MAX; } /******************************************************************************* @@ -136,13 +135,13 @@ void btm_ble_advfilt_enq_op_q(UINT8 action, UINT8 ocf, tBTM_BLE_FILT_CB_EVT cb_e ** Returns void ** *******************************************************************************/ -void btm_ble_advfilt_deq_op_q(UINT8 *p_action,UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT *p_cb_evt, - tBTM_BLE_REF_VALUE *p_ref, tBTM_BLE_PF_CFG_CBACK ** p_cmpl_cback, +void btm_ble_advfilt_deq_op_q(UINT8 *p_action, UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT *p_cb_evt, + tBTM_BLE_REF_VALUE *p_ref, tBTM_BLE_PF_CFG_CBACK **p_cmpl_cback, tBTM_BLE_PF_PARAM_CBACK **p_filt_param_cback) { *p_ocf = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >> 4); *p_action = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] - & BTM_BLE_ADV_FILT_SUBCODE_MASK); + & BTM_BLE_ADV_FILT_SUBCODE_MASK); *p_ref = btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx]; *p_cb_evt = btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx]; *p_cmpl_cback = btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx]; @@ -150,9 +149,9 @@ void btm_ble_advfilt_deq_op_q(UINT8 *p_action,UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx]; btm_ble_adv_filt_cb.op_q.pending_idx = (btm_ble_adv_filt_cb.op_q.pending_idx + 1) - % BTM_BLE_PF_TYPE_MAX; + % BTM_BLE_PF_TYPE_MAX; BTM_TRACE_DEBUG("btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x", - *p_ocf,*p_action, *p_ref, *p_cb_evt); + *p_ocf, *p_action, *p_ref, *p_cb_evt); } /******************************************************************************* @@ -168,32 +167,31 @@ UINT8 btm_ble_condtype_to_ocf(UINT8 cond_type) { UINT8 ocf = 0; - switch(cond_type) - { - case BTM_BLE_PF_ADDR_FILTER: - ocf = BTM_BLE_META_PF_ADDR; - break; - case BTM_BLE_PF_SRVC_UUID: - ocf = BTM_BLE_META_PF_UUID; - break; - case BTM_BLE_PF_SRVC_SOL_UUID: - ocf = BTM_BLE_META_PF_SOL_UUID; - break; - case BTM_BLE_PF_LOCAL_NAME: - ocf = BTM_BLE_META_PF_LOCAL_NAME; - break; - case BTM_BLE_PF_MANU_DATA: - ocf = BTM_BLE_META_PF_MANU_DATA; - break; - case BTM_BLE_PF_SRVC_DATA_PATTERN: - ocf = BTM_BLE_META_PF_SRVC_DATA; - break; - case BTM_BLE_PF_TYPE_ALL: - ocf = BTM_BLE_META_PF_ALL; - break; - default: - ocf = BTM_BLE_PF_TYPE_MAX; - break; + switch (cond_type) { + case BTM_BLE_PF_ADDR_FILTER: + ocf = BTM_BLE_META_PF_ADDR; + break; + case BTM_BLE_PF_SRVC_UUID: + ocf = BTM_BLE_META_PF_UUID; + break; + case BTM_BLE_PF_SRVC_SOL_UUID: + ocf = BTM_BLE_META_PF_SOL_UUID; + break; + case BTM_BLE_PF_LOCAL_NAME: + ocf = BTM_BLE_META_PF_LOCAL_NAME; + break; + case BTM_BLE_PF_MANU_DATA: + ocf = BTM_BLE_META_PF_MANU_DATA; + break; + case BTM_BLE_PF_SRVC_DATA_PATTERN: + ocf = BTM_BLE_META_PF_SRVC_DATA; + break; + case BTM_BLE_PF_TYPE_ALL: + ocf = BTM_BLE_META_PF_ALL; + break; + default: + ocf = BTM_BLE_PF_TYPE_MAX; + break; } return ocf; } @@ -211,35 +209,34 @@ UINT8 btm_ble_ocf_to_condtype(UINT8 ocf) { UINT8 cond_type = 0; - switch(ocf) - { - case BTM_BLE_META_PF_FEAT_SEL: - cond_type = BTM_BLE_META_PF_FEAT_SEL; - break; - case BTM_BLE_META_PF_ADDR: - cond_type = BTM_BLE_PF_ADDR_FILTER; - break; - case BTM_BLE_META_PF_UUID: - cond_type = BTM_BLE_PF_SRVC_UUID; - break; - case BTM_BLE_META_PF_SOL_UUID: - cond_type = BTM_BLE_PF_SRVC_SOL_UUID; - break; - case BTM_BLE_META_PF_LOCAL_NAME: - cond_type = BTM_BLE_PF_LOCAL_NAME; - break; - case BTM_BLE_META_PF_MANU_DATA: - cond_type = BTM_BLE_PF_MANU_DATA; - break; - case BTM_BLE_META_PF_SRVC_DATA: - cond_type = BTM_BLE_PF_SRVC_DATA_PATTERN; - break; - case BTM_BLE_META_PF_ALL: - cond_type = BTM_BLE_PF_TYPE_ALL; - break; - default: - cond_type = BTM_BLE_PF_TYPE_MAX; - break; + switch (ocf) { + case BTM_BLE_META_PF_FEAT_SEL: + cond_type = BTM_BLE_META_PF_FEAT_SEL; + break; + case BTM_BLE_META_PF_ADDR: + cond_type = BTM_BLE_PF_ADDR_FILTER; + break; + case BTM_BLE_META_PF_UUID: + cond_type = BTM_BLE_PF_SRVC_UUID; + break; + case BTM_BLE_META_PF_SOL_UUID: + cond_type = BTM_BLE_PF_SRVC_SOL_UUID; + break; + case BTM_BLE_META_PF_LOCAL_NAME: + cond_type = BTM_BLE_PF_LOCAL_NAME; + break; + case BTM_BLE_META_PF_MANU_DATA: + cond_type = BTM_BLE_PF_MANU_DATA; + break; + case BTM_BLE_META_PF_SRVC_DATA: + cond_type = BTM_BLE_PF_SRVC_DATA_PATTERN; + break; + case BTM_BLE_META_PF_ALL: + cond_type = BTM_BLE_PF_TYPE_ALL; + break; + default: + cond_type = BTM_BLE_PF_TYPE_MAX; + break; } return cond_type; } @@ -264,10 +261,9 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params) tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback = NULL; tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback = NULL; - if (evt_len < 3 || evt_len > 4) - { - BTM_TRACE_ERROR("%s cannot interpret APCF callback status = %d, length = %d", - __func__, status, evt_len); + if (evt_len < 3 || evt_len > 4) { + BTM_TRACE_ERROR("%s cannot interpret APCF callback status = %d, length = %d", + __func__, status, evt_len); btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback, &p_filt_param_cback); return; @@ -281,79 +277,74 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params) STREAM_TO_UINT8(action, p); /* Ignore the event, if it is not the same one expected */ - if (3 == evt_len) - { - if(ocf != op_subcode) - { - BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, %d", - ocf, op_subcode, action, evt_len, ref_value, status); - return; - } - else - { - if(NULL != btm_ble_adv_filt_cb.p_filt_stat_cback) - btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value); + if (3 == evt_len) { + if (ocf != op_subcode) { + BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, %d", + ocf, op_subcode, action, evt_len, ref_value, status); + return; + } else { + if (NULL != btm_ble_adv_filt_cb.p_filt_stat_cback) { + btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value); + } BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d", - ocf, action, status, ref_value); + ocf, action, status, ref_value); return; } } - if (4 == evt_len && ocf != op_subcode) - { + if (4 == evt_len && ocf != op_subcode) { BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d", - ocf, op_subcode, action, status, ref_value); + ocf, op_subcode, action, status, ref_value); return; } STREAM_TO_UINT8(num_avail, p); - switch (op_subcode) - { - case BTM_BLE_META_PF_ADDR: - case BTM_BLE_META_PF_UUID: - case BTM_BLE_META_PF_SOL_UUID: - case BTM_BLE_META_PF_LOCAL_NAME: - case BTM_BLE_META_PF_MANU_DATA: - case BTM_BLE_META_PF_SRVC_DATA: - cond_type = btm_ble_ocf_to_condtype(ocf); - BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", op_subcode, - ocf, action, status, ref_value, num_avail); - if (HCI_SUCCESS == status) - { - if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0) - btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail); - else - btm_ble_cs_update_pf_counter(action, cond_type, - &btm_ble_adv_filt_cb.cur_filter_target, num_avail); - } + switch (op_subcode) { + case BTM_BLE_META_PF_ADDR: + case BTM_BLE_META_PF_UUID: + case BTM_BLE_META_PF_SOL_UUID: + case BTM_BLE_META_PF_LOCAL_NAME: + case BTM_BLE_META_PF_MANU_DATA: + case BTM_BLE_META_PF_SRVC_DATA: + cond_type = btm_ble_ocf_to_condtype(ocf); + BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", op_subcode, + ocf, action, status, ref_value, num_avail); + if (HCI_SUCCESS == status) { + if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0) { + btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail); + } else + btm_ble_cs_update_pf_counter(action, cond_type, + &btm_ble_adv_filt_cb.cur_filter_target, num_avail); + } - /* send ADV PF operation complete */ - btm_ble_adv_filt_cb.op_type = 0; - break; + /* send ADV PF operation complete */ + btm_ble_adv_filt_cb.op_type = 0; + break; - case BTM_BLE_META_PF_FEAT_SEL: - BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d", - action, status, ref_value, num_avail); - break; + case BTM_BLE_META_PF_FEAT_SEL: + BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d", + action, status, ref_value, num_avail); + break; - default: - BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", op_subcode); - break; + default: + BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", op_subcode); + break; } - switch(cb_evt) - { + switch (cb_evt) { BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d", cb_evt); - case BTM_BLE_FILT_CFG: - if(NULL != p_scan_cfg_cback) - p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value); - break; - case BTM_BLE_FILT_ADV_PARAM: - if(NULL != p_filt_param_cback) - p_filt_param_cback(action, num_avail, ref_value, status); - break; - default: - break; + case BTM_BLE_FILT_CFG: + if (NULL != p_scan_cfg_cback) { + p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value); + } + break; + case BTM_BLE_FILT_ADV_PARAM: + if (NULL != p_filt_param_cback) { + p_filt_param_cback(action, num_avail, ref_value, status); + } + break; + default: + break; } } @@ -366,19 +357,18 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params) ** Returns pointer to the counter if found; NULL otherwise. ** *******************************************************************************/ -tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda) +tBTM_BLE_PF_COUNT *btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda) { UINT8 i; tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1]; - if (p_le_bda == NULL) + if (p_le_bda == NULL) { return &btm_ble_adv_filt_cb.p_addr_filter_count[0]; + } - for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) - { + for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) { if (p_addr_filter->in_use && - memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0) - { + memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0) { return p_addr_filter; } } @@ -394,15 +384,13 @@ tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda) ** Returns pointer to the counter if allocation succeed; NULL otherwise. ** *******************************************************************************/ -tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr) +tBTM_BLE_PF_COUNT *btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr) { UINT8 i; tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1]; - for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) - { - if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0) - { + for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) { + if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0) { memcpy(p_addr_filter->bd_addr, bd_addr, BD_ADDR_LEN); p_addr_filter->in_use = TRUE; return p_addr_filter; @@ -425,19 +413,20 @@ BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filte tBTM_BLE_PF_COUNT *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1]; BOOLEAN found = FALSE; - if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr) + if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr) { memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT)); + } - for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) - { + for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++) { if ((p_addr_filter->in_use) && (NULL == p_bd_addr || - (NULL != p_bd_addr && - memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0))) - { + (NULL != p_bd_addr && + memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0))) { found = TRUE; memset(p_addr_filter, 0, sizeof(tBTM_BLE_PF_COUNT)); - if (NULL != p_bd_addr) break; + if (NULL != p_bd_addr) { + break; + } } } return found; @@ -455,13 +444,13 @@ BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filte ** *******************************************************************************/ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_COND_PARAM *p_cond) + tBTM_BLE_PF_FILT_INDEX filt_index, + tBTM_BLE_PF_COND_PARAM *p_cond) { tBTM_BLE_PF_LOCAL_NAME_COND *p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name; UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH], *p = param, - len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; + len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; tBTM_STATUS st = BTM_ILLEGAL_VALUE; memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH); @@ -473,13 +462,14 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, UINT8_TO_STREAM(p, filt_index); if (BTM_BLE_SCAN_COND_ADD == action || - BTM_BLE_SCAN_COND_DELETE == action) - { - if (NULL == p_local_name) + BTM_BLE_SCAN_COND_DELETE == action) { + if (NULL == p_local_name) { return st; + } - if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX) + if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX) { p_local_name->data_len = BTM_BLE_PF_STR_LEN_MAX; + } ARRAY_TO_STREAM(p, p_local_name->p_data, p_local_name->data_len); len += p_local_name->data_len; @@ -487,15 +477,12 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, /* send local name filter */ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - len, - param, - btm_ble_scan_pf_cmpl_cback)) - != BTM_NO_RESOURCES) - { + len, + param, + btm_ble_scan_pf_cmpl_cback)) + != BTM_NO_RESOURCES) { memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); - } - else - { + } else { BTM_TRACE_ERROR("Local Name PF filter update failed"); } @@ -515,16 +502,17 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ tBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_COND_PARAM *p_cond) + tBTM_BLE_PF_FILT_INDEX filt_index, + tBTM_BLE_PF_COND_PARAM *p_cond) { tBTM_STATUS st = BTM_ILLEGAL_VALUE; tBLE_BD_ADDR *p_bd_addr = p_cond ? &p_cond->target_addr : NULL; UINT8 num_avail = (action == BTM_BLE_SCAN_COND_ADD) ? 0 : 1; if (btm_ble_cs_update_pf_counter (action, BTM_BLE_PF_SRVC_DATA, p_bd_addr, num_avail) - != BTM_BLE_INVALID_COUNTER) + != BTM_BLE_INVALID_COUNTER) { st = BTM_SUCCESS; + } return st; } @@ -553,21 +541,19 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH], *p = param, - len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; + len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; tBTM_STATUS st = BTM_ILLEGAL_VALUE; - if (NULL == p_data) + if (NULL == p_data) { return st; + } memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX - + BTM_BLE_ADV_FILT_META_HDR_LENGTH); + + BTM_BLE_ADV_FILT_META_HDR_LENGTH); - if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) - { + if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) { UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA); - } - else - { + } else { UINT8_TO_STREAM(p, BTM_BLE_META_PF_MANU_DATA); } @@ -576,17 +562,16 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, /* Filter index */ UINT8_TO_STREAM(p, filt_index); - if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action) - { - if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) - { - if (NULL == p_srvc_data) + if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action) { + if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) { + if (NULL == p_srvc_data) { return st; - if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) + } + if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) { p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2); + } - if (p_srvc_data->data_len > 0) - { + if (p_srvc_data->data_len > 0) { ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len); len += (p_srvc_data->data_len); ARRAY_TO_STREAM(p, p_srvc_data->p_pattern_mask, p_srvc_data->data_len); @@ -594,41 +579,34 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, len += (p_srvc_data->data_len); BTM_TRACE_DEBUG("Service data length: %d", len); - } - else - { - if (NULL == p_manu_data) - { + } else { + if (NULL == p_manu_data) { BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data"); return st; } BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d", - p_manu_data->data_len); - if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) + p_manu_data->data_len); + if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) { p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2); + } UINT16_TO_STREAM(p, p_manu_data->company_id); - if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL) - { + if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL) { ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len); len += (p_manu_data->data_len + 2); - } - else + } else { len += 2; - - if (p_manu_data->company_id_mask != 0) - { - UINT16_TO_STREAM (p, p_manu_data->company_id_mask); } - else - { + + if (p_manu_data->company_id_mask != 0) { + UINT16_TO_STREAM (p, p_manu_data->company_id_mask); + } else { memset(p, 0xff, 2); p += 2; } len += 2; - if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL) - { + if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL) { ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len); len += (p_manu_data->data_len); } @@ -639,14 +617,11 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, /* send manufacturer*/ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - len, - param, - btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) - { + len, + param, + btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) { memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); - } - else - { + } else { BTM_TRACE_ERROR("manufacturer data PF filter update failed"); } @@ -664,57 +639,52 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action, - UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, - UINT8 num_available) + UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, + UINT8 num_available) { tBTM_BLE_PF_COUNT *p_addr_filter = NULL; UINT8 *p_counter = NULL; btm_ble_obtain_vsc_details(); - if (cond_type > BTM_BLE_PF_TYPE_ALL) - { + if (cond_type > BTM_BLE_PF_TYPE_ALL) { BTM_TRACE_ERROR("unknown PF filter condition type %d", cond_type); return BTM_BLE_INVALID_COUNTER; } /* for these three types of filter, always generic */ if (BTM_BLE_PF_ADDR_FILTER == cond_type || - BTM_BLE_PF_MANU_DATA == cond_type || - BTM_BLE_PF_LOCAL_NAME == cond_type || - BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) + BTM_BLE_PF_MANU_DATA == cond_type || + BTM_BLE_PF_LOCAL_NAME == cond_type || + BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) { p_bd_addr = NULL; + } if ((p_addr_filter = btm_ble_find_addr_filter_counter(p_bd_addr)) == NULL && - BTM_BLE_SCAN_COND_ADD == action) - { + BTM_BLE_SCAN_COND_ADD == action) { p_addr_filter = btm_ble_alloc_addr_filter_counter(p_bd_addr->bda); } - if (NULL != p_addr_filter) - { + if (NULL != p_addr_filter) { /* all filter just cleared */ if ((BTM_BLE_PF_TYPE_ALL == cond_type && BTM_BLE_SCAN_COND_CLEAR == action) || - /* or bd address filter been deleted */ - (BTM_BLE_PF_ADDR_FILTER == cond_type && - (BTM_BLE_SCAN_COND_DELETE == action || BTM_BLE_SCAN_COND_CLEAR == action))) - { + /* or bd address filter been deleted */ + (BTM_BLE_PF_ADDR_FILTER == cond_type && + (BTM_BLE_SCAN_COND_DELETE == action || BTM_BLE_SCAN_COND_CLEAR == action))) { btm_ble_dealloc_addr_filter_counter(p_bd_addr, cond_type); } /* if not feature selection, update new addition/reduction of the filter counter */ - else if (cond_type != BTM_BLE_PF_TYPE_ALL) - { + else if (cond_type != BTM_BLE_PF_TYPE_ALL) { p_counter = p_addr_filter->pf_counter; - if (num_available > 0) + if (num_available > 0) { p_counter[cond_type] += 1; + } BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d", - p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available); + p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available); return p_counter[cond_type]; } - } - else - { + } else { BTM_TRACE_ERROR("no matching filter counter found"); } /* no matching filter located and updated */ @@ -738,7 +708,7 @@ tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_COND_PARAM *p_cond) { UINT8 param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH], - * p= param; + * p = param; tBTM_STATUS st = BTM_ILLEGAL_VALUE; tBLE_BD_ADDR *p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr; @@ -751,24 +721,21 @@ tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action, UINT8_TO_STREAM(p, filt_index); if (BTM_BLE_SCAN_COND_ADD == action || - BTM_BLE_SCAN_COND_DELETE == action) - { - if (NULL == p_addr) + BTM_BLE_SCAN_COND_DELETE == action) { + if (NULL == p_addr) { return st; + } BDADDR_TO_STREAM(p, p_addr->bda); UINT8_TO_STREAM(p, p_addr->type); } /* send address filter */ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), - param, - btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) - { + (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), + param, + btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) { memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); - } - else - { + } else { BTM_TRACE_ERROR("Broadcaster Address Filter Update failed"); } return st; @@ -793,36 +760,31 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_REF_VALUE ref_value) { UINT8 param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH], - * p= param, - len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; + * p = param, + len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; tBTM_STATUS st = BTM_ILLEGAL_VALUE; tBTM_BLE_PF_UUID_COND *p_uuid_cond; UINT8 evt_type; memset(param, 0, BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH); - if (BTM_BLE_PF_SRVC_UUID == filter_type) - { + if (BTM_BLE_PF_SRVC_UUID == filter_type) { evt_type = BTM_BLE_META_PF_UUID; p_uuid_cond = p_cond ? &p_cond->srvc_uuid : NULL; - } - else - { + } else { evt_type = BTM_BLE_META_PF_SOL_UUID; p_uuid_cond = p_cond ? &p_cond->solicitate_uuid : NULL; } - if (NULL == p_uuid_cond && action != BTM_BLE_SCAN_COND_CLEAR) - { + if (NULL == p_uuid_cond && action != BTM_BLE_SCAN_COND_CLEAR) { BTM_TRACE_ERROR("Illegal param for add/delete UUID filter"); return st; } /* need to add address filter first, if adding per bda UUID filter without address filter */ if (BTM_BLE_SCAN_COND_ADD == action && NULL != p_uuid_cond && - p_uuid_cond->p_target_addr && - btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL) - { + p_uuid_cond->p_target_addr && + btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL) { UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR); UINT8_TO_STREAM(p, action); @@ -834,10 +796,9 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, /* send address filter */ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), - param, - btm_ble_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES) - { + (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), + param, + btm_ble_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES) { BTM_TRACE_ERROR("Update Address filter into controller failed."); return st; } @@ -854,50 +815,34 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, UINT8_TO_STREAM(p, filt_index); if ((BTM_BLE_SCAN_COND_ADD == action || - BTM_BLE_SCAN_COND_DELETE == action) && - NULL != p_uuid_cond) - { - if (p_uuid_cond->uuid.len == LEN_UUID_16) - { + BTM_BLE_SCAN_COND_DELETE == action) && + NULL != p_uuid_cond) { + if (p_uuid_cond->uuid.len == LEN_UUID_16) { UINT16_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid16); len += LEN_UUID_16; - } - else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */ - { + } else if (p_uuid_cond->uuid.len == LEN_UUID_32) { /*4 bytes */ UINT32_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid32); len += LEN_UUID_32; - } - else if (p_uuid_cond->uuid.len == LEN_UUID_128) - { + } else if (p_uuid_cond->uuid.len == LEN_UUID_128) { ARRAY_TO_STREAM (p, p_uuid_cond->uuid.uu.uuid128, LEN_UUID_128); len += LEN_UUID_128; - } - else - { + } else { BTM_TRACE_ERROR("illegal UUID length: %d", p_uuid_cond->uuid.len); return BTM_ILLEGAL_VALUE; } - if (NULL != p_uuid_cond->p_uuid_mask) - { - if (p_uuid_cond->uuid.len == LEN_UUID_16) - { + if (NULL != p_uuid_cond->p_uuid_mask) { + if (p_uuid_cond->uuid.len == LEN_UUID_16) { UINT16_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid16_mask); len += LEN_UUID_16; - } - else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */ - { + } else if (p_uuid_cond->uuid.len == LEN_UUID_32) { /*4 bytes */ UINT32_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid32_mask); len += LEN_UUID_32; - } - else if (p_uuid_cond->uuid.len == LEN_UUID_128) - { + } else if (p_uuid_cond->uuid.len == LEN_UUID_128) { ARRAY_TO_STREAM (p, p_uuid_cond->p_uuid_mask->uuid128_mask, LEN_UUID_128); len += LEN_UUID_128; } - } - else - { + } else { memset(p, 0xff, p_uuid_cond->uuid.len); len += p_uuid_cond->uuid.len; } @@ -907,18 +852,16 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, /* send UUID filter update */ if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - len, - param, - btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) - { + len, + param, + btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES) { if (p_uuid_cond && p_uuid_cond->p_target_addr) memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr, - sizeof(tBLE_BD_ADDR)); - else + sizeof(tBLE_BD_ADDR)); + else { memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); - } - else - { + } + } else { BTM_TRACE_ERROR("UUID filter udpating failed"); } @@ -938,19 +881,18 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_COND_PARAM *p_cond, - tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback, - tBTM_BLE_FILT_CB_EVT cb_evt, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_PF_FILT_INDEX filt_index, + tBTM_BLE_PF_COND_PARAM *p_cond, + tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback, + tBTM_BLE_FILT_CB_EVT cb_evt, + tBTM_BLE_REF_VALUE ref_value) { - tBLE_BD_ADDR *p_target = (p_cond == NULL)? NULL : &p_cond->target_addr; + tBLE_BD_ADDR *p_target = (p_cond == NULL) ? NULL : &p_cond->target_addr; tBTM_BLE_PF_COUNT *p_bda_filter; tBTM_STATUS st = BTM_WRONG_MODE; UINT8 param[20], *p; - if (BTM_BLE_SCAN_COND_CLEAR != action) - { + if (BTM_BLE_SCAN_COND_CLEAR != action) { BTM_TRACE_ERROR("unable to perform action:%d for generic adv filter type", action); return BTM_ILLEGAL_VALUE; } @@ -961,50 +903,49 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, p_bda_filter = btm_ble_find_addr_filter_counter(p_target); if (NULL == p_bda_filter || - /* not a generic filter */ - (p_target != NULL && p_bda_filter)) - { + /* not a generic filter */ + (p_target != NULL && p_bda_filter)) { BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!"); return st; } /* clear the general filter entry */ - if (NULL == p_target) - { + if (NULL == p_target) { /* clear manufactuer data filter */ st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, - BTM_BLE_PF_MANU_DATA, cb_evt, ref_value); - if(BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt, - ref_value, NULL, NULL); + BTM_BLE_PF_MANU_DATA, cb_evt, ref_value); + if (BTM_CMD_STARTED == st) + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt, + ref_value, NULL, NULL); /* clear local name filter */ st = btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL); - if(BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt, - ref_value, NULL, NULL); + if (BTM_CMD_STARTED == st) + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt, + ref_value, NULL, NULL); /* update the counter for service data */ st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL); /* clear UUID filter */ st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, - BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, ref_value); - if(BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, NULL, NULL); + BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, ref_value); + if (BTM_CMD_STARTED == st) { + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, NULL, NULL); + } st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, - BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, ref_value); - if(BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt, - ref_value, NULL, NULL); + BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, ref_value); + if (BTM_CMD_STARTED == st) + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt, + ref_value, NULL, NULL); /* clear service data filter */ st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, - BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, ref_value); - if(BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt, - ref_value, NULL, NULL); + BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, ref_value); + if (BTM_CMD_STARTED == st) + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt, + ref_value, NULL, NULL); } /* select feature based on control block settings */ @@ -1020,15 +961,15 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR); if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN), - param, - btm_ble_scan_pf_cmpl_cback)) - != BTM_NO_RESOURCES) - { - if (p_target) + (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN), + param, + btm_ble_scan_pf_cmpl_cback)) + != BTM_NO_RESOURCES) { + if (p_target) { memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR)); - else + } else { memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); + } } return st; } @@ -1051,9 +992,9 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, ** *******************************************************************************/ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_FILT_PARAMS *p_filt_params, - tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_PF_FILT_PARAMS *p_filt_params, + tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback, + tBTM_BLE_REF_VALUE ref_value) { tBTM_STATUS st = BTM_WRONG_MODE; tBTM_BLE_PF_COUNT *p_bda_filter = NULL; @@ -1061,20 +1002,19 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i BTM_BLE_ADV_FILT_TRACK_NUM; UINT8 param[len], *p; - if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) + if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { return st; + } p = param; memset(param, 0, len); BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup"); - if (BTM_BLE_SCAN_COND_ADD == action) - { + if (BTM_BLE_SCAN_COND_ADD == action) { p_bda_filter = btm_ble_find_addr_filter_counter(p_target); - if (NULL == p_bda_filter) - { - BTM_TRACE_ERROR("BD Address not found!"); - return st; + if (NULL == p_bda_filter) { + BTM_TRACE_ERROR("BD Address not found!"); + return st; } BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln); @@ -1096,8 +1036,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i /* set delivery mode */ UINT8_TO_STREAM(p, p_filt_params->dely_mode); - if (0x01 == p_filt_params->dely_mode) - { + if (0x01 == p_filt_params->dely_mode) { /* set onfound timeout */ UINT16_TO_STREAM(p, p_filt_params->found_timeout); /* set onfound timeout count*/ @@ -1107,30 +1046,27 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i /* set onlost timeout */ UINT16_TO_STREAM(p, p_filt_params->lost_timeout); /* set num_of_track_entries for firmware greater than L-release version */ - if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION) + if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION) { UINT16_TO_STREAM(p, p_filt_params->num_of_tracking_entries); + } } - if (cmn_ble_vsc_cb.version_supported == BTM_VSC_CHIP_CAPABILITY_L_VERSION) + if (cmn_ble_vsc_cb.version_supported == BTM_VSC_CHIP_CAPABILITY_L_VERSION) { len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN; - else + } else len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN + BTM_BLE_ADV_FILT_TRACK_NUM; if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)len, - param, - btm_ble_scan_pf_cmpl_cback)) - == BTM_NO_RESOURCES) - { + (UINT8)len, + param, + btm_ble_scan_pf_cmpl_cback)) + == BTM_NO_RESOURCES) { return st; } btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM, ref_value, NULL, p_cmpl_cback); - } - else - if (BTM_BLE_SCAN_COND_DELETE == action) - { + } else if (BTM_BLE_SCAN_COND_DELETE == action) { /* select feature based on control block settings */ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL); UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_DELETE); @@ -1138,19 +1074,15 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i UINT8_TO_STREAM(p, filt_index); if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH), - param, - btm_ble_scan_pf_cmpl_cback)) - == BTM_NO_RESOURCES) - { + (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH), + param, + btm_ble_scan_pf_cmpl_cback)) + == BTM_NO_RESOURCES) { return st; } btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM, ref_value, NULL, p_cmpl_cback); - } - else - if (BTM_BLE_SCAN_COND_CLEAR == action) - { + } else if (BTM_BLE_SCAN_COND_CLEAR == action) { /* Deallocate all filters here */ btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL); @@ -1159,11 +1091,10 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR); if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH-1), - param, - btm_ble_scan_pf_cmpl_cback)) - == BTM_NO_RESOURCES) - { + (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH - 1), + param, + btm_ble_scan_pf_cmpl_cback)) + == BTM_NO_RESOURCES) { return st; } btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM, @@ -1187,14 +1118,15 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i ** *******************************************************************************/ tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable, - tBTM_BLE_PF_STATUS_CBACK *p_stat_cback, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_PF_STATUS_CBACK *p_stat_cback, + tBTM_BLE_REF_VALUE ref_value) { UINT8 param[20], *p; tBTM_STATUS st = BTM_WRONG_MODE; - if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) - return st; + if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { + return st; + } p = param; memset(param, 0, 20); @@ -1206,12 +1138,11 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable, UINT8_TO_STREAM(p, enable); if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF, - BTM_BLE_PCF_ENABLE_LEN, param, - btm_ble_scan_pf_cmpl_cback)) == BTM_CMD_STARTED) - { - btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback; - btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, BTM_BLE_FILT_ENABLE_DISABLE, - ref_value, NULL, NULL); + BTM_BLE_PCF_ENABLE_LEN, param, + btm_ble_scan_pf_cmpl_cback)) == BTM_CMD_STARTED) { + btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback; + btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, BTM_BLE_FILT_ENABLE_DISABLE, + ref_value, NULL, NULL); } return st; } @@ -1243,60 +1174,56 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action, tBTM_STATUS st = BTM_ILLEGAL_VALUE; UINT8 ocf = 0; BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action, - cond_type, filt_index); + cond_type, filt_index); - if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) + if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { return st; - - switch (cond_type) - { - /* write service data filter */ - case BTM_BLE_PF_SRVC_DATA_PATTERN: - /* write manufacturer data filter */ - case BTM_BLE_PF_MANU_DATA: - st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, ref_value); - break; - - /* write local name filter */ - case BTM_BLE_PF_LOCAL_NAME: - st = btm_ble_update_pf_local_name(action, filt_index, p_cond); - break; - - /* filter on advertiser address */ - case BTM_BLE_PF_ADDR_FILTER: - st = btm_ble_update_addr_filter(action, filt_index, p_cond); - break; - - /* filter on service/solicitated UUID */ - case BTM_BLE_PF_SRVC_UUID: - case BTM_BLE_PF_SRVC_SOL_UUID: - st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, ref_value); - break; - - case BTM_BLE_PF_SRVC_DATA: - st = btm_ble_update_srvc_data_change(action, filt_index, p_cond); - break; - - case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */ - st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, p_cmpl_cback, - 0, ref_value); - break; - - default: - BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type); - break; } - if(BTM_CMD_STARTED == st && cond_type != BTM_BLE_PF_TYPE_ALL) - { - ocf = btm_ble_condtype_to_ocf(cond_type); - btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, p_cmpl_cback, NULL); + switch (cond_type) { + /* write service data filter */ + case BTM_BLE_PF_SRVC_DATA_PATTERN: + /* write manufacturer data filter */ + case BTM_BLE_PF_MANU_DATA: + st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, ref_value); + break; + + /* write local name filter */ + case BTM_BLE_PF_LOCAL_NAME: + st = btm_ble_update_pf_local_name(action, filt_index, p_cond); + break; + + /* filter on advertiser address */ + case BTM_BLE_PF_ADDR_FILTER: + st = btm_ble_update_addr_filter(action, filt_index, p_cond); + break; + + /* filter on service/solicitated UUID */ + case BTM_BLE_PF_SRVC_UUID: + case BTM_BLE_PF_SRVC_SOL_UUID: + st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, ref_value); + break; + + case BTM_BLE_PF_SRVC_DATA: + st = btm_ble_update_srvc_data_change(action, filt_index, p_cond); + break; + + case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */ + st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, p_cmpl_cback, + 0, ref_value); + break; + + default: + BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type); + break; } - else - if(BTM_CMD_STARTED == st && BTM_BLE_PF_TYPE_ALL == cond_type) - { - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG, - ref_value, p_cmpl_cback, NULL); + + if (BTM_CMD_STARTED == st && cond_type != BTM_BLE_PF_TYPE_ALL) { + ocf = btm_ble_condtype_to_ocf(cond_type); + btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, p_cmpl_cback, NULL); + } else if (BTM_CMD_STARTED == st && BTM_BLE_PF_TYPE_ALL == cond_type) { + btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG, + ref_value, p_cmpl_cback, NULL); } return st; } @@ -1315,13 +1242,13 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action, void btm_ble_adv_filter_init(void) { memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB)); - if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) - return; + if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { + return; + } - if (cmn_ble_vsc_cb.max_filter > 0) - { + if (cmn_ble_vsc_cb.max_filter > 0) { btm_ble_adv_filt_cb.p_addr_filter_count = - (tBTM_BLE_PF_COUNT*) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter); + (tBTM_BLE_PF_COUNT *) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter); } } @@ -1338,8 +1265,9 @@ void btm_ble_adv_filter_init(void) *******************************************************************************/ void btm_ble_adv_filter_cleanup(void) { - if (btm_ble_adv_filt_cb.p_addr_filter_count) + if (btm_ble_adv_filt_cb.p_addr_filter_count) { GKI_freebuf (btm_ble_adv_filt_cb.p_addr_filter_count); + } } #endif diff --git a/components/bt/bluedroid/stack/btm/btm_ble_batchscan.c b/components/bt/bluedroid/stack/btm/btm_ble_batchscan.c old mode 100755 new mode 100644 index 22d01c6b4..d64373664 --- a/components/bt/bluedroid/stack/btm/btm_ble_batchscan.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_batchscan.c @@ -68,22 +68,20 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p) BTM_TRACE_EVENT("btm_ble_batchscan_filter_track_adv_vse_cback called with event:%x", sub_event); if (HCI_VSE_SUBCODE_BLE_THRESHOLD_SUB_EVT == sub_event && - NULL != ble_batchscan_cb.p_thres_cback) - { + NULL != ble_batchscan_cb.p_thres_cback) { ble_batchscan_cb.p_thres_cback(ble_batchscan_cb.ref_value); return; } - if (HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT == sub_event && NULL != ble_advtrack_cb.p_track_cback) - { - if (len < 10) + if (HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT == sub_event && NULL != ble_advtrack_cb.p_track_cback) { + if (len < 10) { return; + } memset(&adv_data, 0 , sizeof(tBTM_BLE_TRACK_ADV_DATA)); BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); adv_data.client_if = (UINT8)ble_advtrack_cb.ref_value; - if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION) - { + if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION) { STREAM_TO_UINT8(adv_data.filt_index, p); STREAM_TO_UINT8(adv_data.advertiser_state, p); STREAM_TO_UINT8(adv_data.advertiser_info_present, p); @@ -91,29 +89,24 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p) STREAM_TO_UINT8(adv_data.addr_type, p); /* Extract the adv info details */ - if (ADV_INFO_PRESENT == adv_data.advertiser_info_present) - { + if (ADV_INFO_PRESENT == adv_data.advertiser_info_present) { STREAM_TO_UINT8(adv_data.tx_power, p); STREAM_TO_UINT8(adv_data.rssi_value, p); STREAM_TO_UINT16(adv_data.time_stamp, p); STREAM_TO_UINT8(adv_data.adv_pkt_len, p); - if (adv_data.adv_pkt_len > 0) - { + if (adv_data.adv_pkt_len > 0) { adv_data.p_adv_pkt_data = GKI_getbuf(adv_data.adv_pkt_len); memcpy(adv_data.p_adv_pkt_data, p, adv_data.adv_pkt_len); } STREAM_TO_UINT8(adv_data.scan_rsp_len, p); - if (adv_data.scan_rsp_len > 0) - { + if (adv_data.scan_rsp_len > 0) { adv_data.p_scan_rsp_data = GKI_getbuf(adv_data.scan_rsp_len); memcpy(adv_data.p_scan_rsp_data, p, adv_data.scan_rsp_len); } } - } - else - { + } else { /* Based on L-release version */ STREAM_TO_UINT8(adv_data.filt_index, p); STREAM_TO_UINT8(adv_data.addr_type, p); @@ -122,7 +115,7 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p) } BTM_TRACE_EVENT("track_adv_vse_cback called: %d, %d, %d", adv_data.filt_index, - adv_data.addr_type, adv_data.advertiser_state); + adv_data.addr_type, adv_data.advertiser_state); ble_advtrack_cb.p_track_cback(&adv_data); return; } @@ -139,17 +132,17 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p) ** *******************************************************************************/ void btm_ble_batchscan_enq_op_q(UINT8 opcode, tBTM_BLE_BATCH_SCAN_STATE cur_state, - UINT8 cb_evt, tBTM_BLE_REF_VALUE ref_value) + UINT8 cb_evt, tBTM_BLE_REF_VALUE ref_value) { - ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] = (opcode |(cb_evt << 4)); + ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] = (opcode | (cb_evt << 4)); ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx] = cur_state; ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx] = ref_value; BTM_TRACE_DEBUG("btm_ble_batchscan_enq_op_q: subcode:%d, Cur_state:%d, ref_value:%d", - ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx], - ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx], - ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]); + ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx], + ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx], + ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]); ble_batchscan_cb.op_q.next_idx = (ble_batchscan_cb.op_q.next_idx + 1) - % BTM_BLE_BATCH_SCAN_MAX; + % BTM_BLE_BATCH_SCAN_MAX; } /******************************************************************************* @@ -165,10 +158,10 @@ void btm_ble_batchscan_enq_op_q(UINT8 opcode, tBTM_BLE_BATCH_SCAN_STATE cur_stat tBTM_STATUS btm_ble_batchscan_enq_rep_q(UINT8 report_format, tBTM_BLE_REF_VALUE ref_value) { int i = 0; - for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++) - { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i]) + for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++) { + if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i]) { return BTM_ILLEGAL_VALUE; + } } ble_batchscan_cb.main_rep_q.rep_mode[ble_batchscan_cb.main_rep_q.next_idx] = report_format; @@ -177,10 +170,10 @@ tBTM_STATUS btm_ble_batchscan_enq_rep_q(UINT8 report_format, tBTM_BLE_REF_VALUE ble_batchscan_cb.main_rep_q.data_len[ble_batchscan_cb.main_rep_q.next_idx] = 0; ble_batchscan_cb.main_rep_q.p_data[ble_batchscan_cb.main_rep_q.next_idx] = NULL; BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_q: index:%d, rep %d, ref %d", - ble_batchscan_cb.main_rep_q.next_idx, report_format, ref_value); + ble_batchscan_cb.main_rep_q.next_idx, report_format, ref_value); ble_batchscan_cb.main_rep_q.next_idx = (ble_batchscan_cb.main_rep_q.next_idx + 1) - % BTM_BLE_BATCH_REP_MAIN_Q_SIZE; + % BTM_BLE_BATCH_REP_MAIN_Q_SIZE; return BTM_SUCCESS; } @@ -199,31 +192,27 @@ void btm_ble_batchscan_enq_rep_data(UINT8 report_format, UINT8 num_records, UINT int index = 0, len = 0; UINT8 *p_orig_data = NULL, *p_app_data = NULL; - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) - { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) + for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) { + if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) { break; + } } BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_data: index:%d, rep %d, num %d len : %d", - index, report_format, num_records, data_len); + index, report_format, num_records, data_len); - if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 && num_records > 0) - { + if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 && num_records > 0) { len = ble_batchscan_cb.main_rep_q.data_len[index]; p_orig_data = ble_batchscan_cb.main_rep_q.p_data[index]; - if (NULL != p_orig_data) - { + if (NULL != p_orig_data) { p_app_data = GKI_getbuf(len + data_len); memcpy(p_app_data, p_orig_data, len); - memcpy(p_app_data+len, p_data, data_len); + memcpy(p_app_data + len, p_data, data_len); GKI_freebuf(p_orig_data); ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data; ble_batchscan_cb.main_rep_q.num_records[index] += num_records; ble_batchscan_cb.main_rep_q.data_len[index] += data_len; - } - else - { + } else { p_app_data = GKI_getbuf(data_len); memcpy(p_app_data, p_data, data_len); ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data; @@ -244,18 +233,17 @@ void btm_ble_batchscan_enq_rep_data(UINT8 report_format, UINT8 num_records, UINT ** *******************************************************************************/ void btm_ble_batchscan_deq_rep_data(UINT8 report_format, tBTM_BLE_REF_VALUE *p_ref_value, - UINT8 *p_num_records, UINT8 **p_data, UINT16 *p_data_len) + UINT8 *p_num_records, UINT8 **p_data, UINT16 *p_data_len) { int index = 0; - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) - { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) + for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) { + if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) { break; + } } - if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index) - { + if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index) { BTM_TRACE_ERROR("btm_ble_batchscan_deq_rep_data: rep_format:%d not found", report_format); return; } @@ -272,10 +260,10 @@ void btm_ble_batchscan_deq_rep_data(UINT8 report_format, tBTM_BLE_REF_VALUE *p_r ble_batchscan_cb.main_rep_q.num_records[index] = 0; BTM_TRACE_DEBUG("btm_ble_batchscan_deq_rep_data: index:%d, rep %d, num %d, data_len %d", - index, report_format, *p_num_records, *p_data_len); + index, report_format, *p_num_records, *p_data_len); ble_batchscan_cb.main_rep_q.pending_idx = (ble_batchscan_cb.main_rep_q.pending_idx + 1) - % BTM_BLE_BATCH_SCAN_MAX; + % BTM_BLE_BATCH_SCAN_MAX; } /******************************************************************************* @@ -288,16 +276,16 @@ void btm_ble_batchscan_deq_rep_data(UINT8 report_format, tBTM_BLE_REF_VALUE *p_r ** Returns void ** *******************************************************************************/ -void btm_ble_batchscan_deq_op_q(UINT8 *p_opcode,tBTM_BLE_BATCH_SCAN_STATE *cur_state, - UINT8 *p_cb_evt, tBTM_BLE_REF_VALUE *p_ref) +void btm_ble_batchscan_deq_op_q(UINT8 *p_opcode, tBTM_BLE_BATCH_SCAN_STATE *cur_state, + UINT8 *p_cb_evt, tBTM_BLE_REF_VALUE *p_ref) { *p_cb_evt = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] >> 4); *p_opcode = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] - & BTM_BLE_BATCH_SCAN_SUBCODE_MASK); + & BTM_BLE_BATCH_SCAN_SUBCODE_MASK); *p_ref = ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.pending_idx]; *cur_state = (ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.pending_idx]); ble_batchscan_cb.op_q.pending_idx = (ble_batchscan_cb.op_q.pending_idx + 1) - % BTM_BLE_BATCH_SCAN_MAX; + % BTM_BLE_BATCH_SCAN_MAX; } /******************************************************************************* @@ -313,7 +301,7 @@ void btm_ble_batchscan_deq_op_q(UINT8 *p_opcode,tBTM_BLE_BATCH_SCAN_STATE *cur_s ** *******************************************************************************/ tBTM_STATUS btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_REF_VALUE ref_value) { tBTM_STATUS status = BTM_NO_RESOURCES; UINT8 param[BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN], *pp; @@ -325,15 +313,13 @@ tBTM_STATUS btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, UINT8_TO_STREAM (pp, scan_mode); if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param, btm_ble_batchscan_vsc_cmpl_cback)) - != BTM_CMD_STARTED) - { + BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param, btm_ble_batchscan_vsc_cmpl_cback)) + != BTM_CMD_STARTED) { BTM_TRACE_ERROR("btm_ble_read_batchscan_reports %d", status); return BTM_ILLEGAL_VALUE; } - if (BTM_CMD_STARTED == status) - { + if (BTM_CMD_STARTED == status) { /* The user needs to be provided scan read reports event */ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_READ_RESULTS, ble_batchscan_cb.cur_state, BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value); @@ -366,8 +352,7 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params) tBTM_STATUS btm_status = 0; UINT8 *p_data = NULL; - if (len < 2) - { + if (len < 2) { BTM_TRACE_ERROR("wrong length for btm_ble_batch_scan_vsc_cmpl_cback"); btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value); return; @@ -379,108 +364,93 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params) btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value); BTM_TRACE_DEBUG("btm_ble_batchscan op_code = %02x state = %02x cb_evt = %02x,ref_value=%d", - opcode, cur_state, cb_evt, ref_value); + opcode, cur_state, cb_evt, ref_value); - if (opcode != subcode) - { - BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d",subcode,opcode); + if (opcode != subcode) { + BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d", subcode, opcode); return; } - switch (subcode) - { - case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE: - { - if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state) - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE; - else - if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state) - { - BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb"); - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; - } - - BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d", - status, ble_batchscan_cb.cur_state, cb_evt); - - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; + switch (subcode) { + case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE: { + if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state) { + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE; + } else if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state) { + BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb"); + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; } - case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM: - { - BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d", - status, cb_evt); - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; + BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d", + status, ble_batchscan_cb.cur_state, cb_evt); + + if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) { + ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); } + break; + } - case BTM_BLE_BATCH_SCAN_SET_PARAMS: - { - BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt); + case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM: { + BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d", + status, cb_evt); + if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) { + ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); + } + break; + } - if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state) - { - if (BTM_SUCCESS == status) - { - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE; - } - else - { - BTM_TRACE_ERROR("BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled"); - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; - } + case BTM_BLE_BATCH_SCAN_SET_PARAMS: { + BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt); + + if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state) { + if (BTM_SUCCESS == status) { + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE; + } else { + BTM_TRACE_ERROR("BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled"); + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; } - - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; } - case BTM_BLE_BATCH_SCAN_READ_RESULTS: - { - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback) - { - STREAM_TO_UINT8(report_format,p); - STREAM_TO_UINT8(num_records, p); - p = (uint8_t *)(p_params->p_param_buf + 4); - BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d", - status, len-4, num_records); + if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) { + ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); + } + break; + } - if (0 == num_records) - { - btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records, - &p_data, &data_len); - if (NULL != ble_batchscan_cb.p_scan_rep_cback) - ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format, num_records, - data_len, p_data, status); - } - else - { - if ((len-4) > 0) - { - btm_ble_batchscan_enq_rep_data(report_format, num_records, p, len-4); - /* More records could be in the buffer and needs to be pulled out */ - btm_status = btm_ble_read_batchscan_reports(report_format, ref_value); - if (BTM_CMD_STARTED != btm_status) - { - btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records, - &p_data, &data_len); - /* Send whatever is available, in case of a command failure */ - if (NULL != ble_batchscan_cb.p_scan_rep_cback && NULL != p_data) - ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format, - num_records, data_len, p_data, status); - } + case BTM_BLE_BATCH_SCAN_READ_RESULTS: { + if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback) { + STREAM_TO_UINT8(report_format, p); + STREAM_TO_UINT8(num_records, p); + p = (uint8_t *)(p_params->p_param_buf + 4); + BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d", + status, len - 4, num_records); + + if (0 == num_records) { + btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records, + &p_data, &data_len); + if (NULL != ble_batchscan_cb.p_scan_rep_cback) + ble_batchscan_cb.p_scan_rep_cback(ref_value, report_format, num_records, + data_len, p_data, status); + } else { + if ((len - 4) > 0) { + btm_ble_batchscan_enq_rep_data(report_format, num_records, p, len - 4); + /* More records could be in the buffer and needs to be pulled out */ + btm_status = btm_ble_read_batchscan_reports(report_format, ref_value); + if (BTM_CMD_STARTED != btm_status) { + btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records, + &p_data, &data_len); + /* Send whatever is available, in case of a command failure */ + if (NULL != ble_batchscan_cb.p_scan_rep_cback && NULL != p_data) + ble_batchscan_cb.p_scan_rep_cback(ref_value, report_format, + num_records, data_len, p_data, status); } } } - break; } + break; + } - default: - break; + default: + break; } return; @@ -514,9 +484,8 @@ tBTM_STATUS btm_ble_set_storage_config(UINT8 batch_scan_full_max, UINT8 batch_sc UINT8_TO_STREAM (pp, batch_scan_notify_threshold); if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param, - btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED) - { + BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param, + btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED) { BTM_TRACE_ERROR("btm_ble_set_storage_config %d", status); return BTM_ILLEGAL_VALUE; } @@ -540,8 +509,8 @@ tBTM_STATUS btm_ble_set_storage_config(UINT8 batch_scan_full_max, UINT8 batch_sc ** *******************************************************************************/ tBTM_STATUS btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type, - tBTM_BLE_DISCARD_RULE discard_rule) + UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type, + tBTM_BLE_DISCARD_RULE discard_rule) { tBTM_STATUS status = BTM_NO_RESOURCES; UINT8 scan_param[BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN], *pp_scan; @@ -561,9 +530,8 @@ tBTM_STATUS btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode, UINT8_TO_STREAM (pp_scan, discard_rule); if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN, - scan_param, btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED) - { + BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN, + scan_param, btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED) { BTM_TRACE_ERROR("btm_ble_set_batchscan_param %d", status); return BTM_ILLEGAL_VALUE; } @@ -588,11 +556,11 @@ tBTM_STATUS btm_ble_enable_disable_batchscan(BOOLEAN should_enable) UINT8 shld_enable = 0x01; UINT8 enable_param[BTM_BLE_BATCH_SCAN_ENB_DISB_LEN], *pp_enable; - if (!should_enable) + if (!should_enable) { shld_enable = 0x00; + } - if (should_enable) - { + if (should_enable) { pp_enable = enable_param; memset(enable_param, 0, BTM_BLE_BATCH_SCAN_ENB_DISB_LEN); @@ -600,28 +568,25 @@ tBTM_STATUS btm_ble_enable_disable_batchscan(BOOLEAN should_enable) UINT8_TO_STREAM (pp_enable, shld_enable); if ((status = BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param, - btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED) - { + BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param, + btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED) { status = BTM_MODE_UNSUPPORTED; BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status); return BTM_ILLEGAL_VALUE; } - } - else - if ((status = btm_ble_set_batchscan_param(BTM_BLE_BATCH_SCAN_MODE_DISABLE, - ble_batchscan_cb.scan_interval, ble_batchscan_cb.scan_window, - ble_batchscan_cb.addr_type, ble_batchscan_cb.discard_rule)) != BTM_CMD_STARTED) - { - status = BTM_MODE_UNSUPPORTED; - BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status); - return BTM_ILLEGAL_VALUE; + } else if ((status = btm_ble_set_batchscan_param(BTM_BLE_BATCH_SCAN_MODE_DISABLE, + ble_batchscan_cb.scan_interval, ble_batchscan_cb.scan_window, + ble_batchscan_cb.addr_type, ble_batchscan_cb.discard_rule)) != BTM_CMD_STARTED) { + status = BTM_MODE_UNSUPPORTED; + BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status); + return BTM_ILLEGAL_VALUE; } - if (should_enable) + if (should_enable) { ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED; - else + } else { ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED; + } return status; } @@ -643,26 +608,26 @@ tBTM_STATUS btm_ble_enable_disable_batchscan(BOOLEAN should_enable) ** *******************************************************************************/ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_trunc_max, - UINT8 batch_scan_notify_threshold, - tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback, - tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, - tBTM_BLE_SCAN_REP_CBACK* p_rep_cback, - tBTM_BLE_REF_VALUE ref_value) + UINT8 batch_scan_notify_threshold, + tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback, + tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, + tBTM_BLE_SCAN_REP_CBACK *p_rep_cback, + tBTM_BLE_REF_VALUE ref_value) { tBTM_STATUS status = BTM_NO_RESOURCES; tBTM_BLE_VSC_CB cmn_ble_vsc_cb; BTM_TRACE_EVENT (" BTM_BleSetStorageConfig: %d, %d, %d, %d, %d", - ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max, batch_scan_trunc_max, - batch_scan_notify_threshold); + ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max, batch_scan_trunc_max, + batch_scan_notify_threshold); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { BTM_TRACE_ERROR("Controller does not support batch scan"); return BTM_ERR_PROCESSING; } @@ -673,33 +638,33 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_ ble_batchscan_cb.ref_value = ref_value; if (batch_scan_full_max > BTM_BLE_ADV_SCAN_FULL_MAX || - batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX || - batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX) - { + batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX || + batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX) { BTM_TRACE_ERROR("Illegal set storage config params"); return BTM_ILLEGAL_VALUE; } - if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) - { + if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || + BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || + BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) { status = btm_ble_enable_disable_batchscan(TRUE); - if (BTM_CMD_STARTED != status) + if (BTM_CMD_STARTED != status) { return status; + } ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED; btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE, - BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value); + BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value); } status = btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold); - if (BTM_CMD_STARTED != status) - return status; - /* The user needs to be provided scan config storage event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state, - BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value); + if (BTM_CMD_STARTED != status) { + return status; + } + /* The user needs to be provided scan config storage event */ + btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state, + BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value); return status; } @@ -721,44 +686,43 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_ ** *******************************************************************************/ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type, - tBTM_BLE_DISCARD_RULE discard_rule, tBTM_BLE_REF_VALUE ref_value) + UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type, + tBTM_BLE_DISCARD_RULE discard_rule, tBTM_BLE_REF_VALUE ref_value) { tBTM_STATUS status = BTM_NO_RESOURCES; tBTM_BLE_VSC_CB cmn_ble_vsc_cb; BTM_TRACE_EVENT (" BTM_BleEnableBatchScan: %d, %d, %d, %d, %d, %d", - scan_mode, scan_interval, scan_window, addr_type, discard_rule, ref_value); + scan_mode, scan_interval, scan_window, addr_type, discard_rule, ref_value); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { BTM_TRACE_ERROR("Controller does not support batch scan"); return BTM_ERR_PROCESSING; } BTM_TRACE_DEBUG("BTM_BleEnableBatchScan: %d, %x, %x, %d, %d", scan_mode, scan_interval, - scan_window, discard_rule, ble_batchscan_cb.cur_state); + scan_window, discard_rule, ble_batchscan_cb.cur_state); /* Only 16 bits will be used for scan interval and scan window as per agreement with Google */ /* So the standard LE range would suffice for scan interval and scan window */ if ((BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) || - BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX)) - && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode - || BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode) - && (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule || - BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule)) - { + BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX)) + && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode + || BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode) + && (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule || + BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule)) { if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) - { + BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || + BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) { status = btm_ble_enable_disable_batchscan(TRUE); - if (BTM_CMD_STARTED != status) - return status; + if (BTM_CMD_STARTED != status) { + return status; + } btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE, BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value); } @@ -770,16 +734,15 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, ble_batchscan_cb.discard_rule = discard_rule; /* This command starts batch scanning, if enabled */ status = btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, addr_type, - discard_rule); - if (BTM_CMD_STARTED != status) + discard_rule); + if (BTM_CMD_STARTED != status) { return status; + } /* The user needs to be provided scan enable event */ btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, ble_batchscan_cb.cur_state, BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value); - } - else - { + } else { BTM_TRACE_ERROR("Illegal enable scan params"); return BTM_ILLEGAL_VALUE; } @@ -803,24 +766,23 @@ tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) tBTM_BLE_VSC_CB cmn_ble_vsc_cb; BTM_TRACE_EVENT (" BTM_BleDisableBatchScan"); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { BTM_TRACE_ERROR("Controller does not support batch scan"); return BTM_ERR_PROCESSING; } status = btm_ble_enable_disable_batchscan(FALSE); - if (BTM_CMD_STARTED == status) - { - /* The user needs to be provided scan disable event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, - BTM_BLE_SCAN_DISABLE_CALLED, BTM_BLE_BATCH_SCAN_DISABLE_EVT, - ref_value); + if (BTM_CMD_STARTED == status) { + /* The user needs to be provided scan disable event */ + btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, + BTM_BLE_SCAN_DISABLE_CALLED, BTM_BLE_BATCH_SCAN_DISABLE_EVT, + ref_value); } return status; @@ -839,7 +801,7 @@ tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) ** *******************************************************************************/ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_REF_VALUE ref_value) { tBTM_STATUS status = BTM_NO_RESOURCES; tBTM_BLE_VSC_CB cmn_ble_vsc_cb; @@ -849,41 +811,37 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, BTM_TRACE_EVENT (" BTM_BleReadScanReports; %d, %d", scan_mode, ref_value); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { BTM_TRACE_ERROR("Controller does not support batch scan"); return BTM_ERR_PROCESSING; } /* Check if the requested scan mode has already been setup by the user */ read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_ACTI; - if (0 == read_scan_mode) + if (0 == read_scan_mode) { read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS; + } /* Check only for modes, as scan reports can be called after disabling batch scan */ if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || - BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)) - { + BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)) { status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value); - if (BTM_SUCCESS == status) - { + if (BTM_SUCCESS == status) { status = btm_ble_read_batchscan_reports(scan_mode, ref_value); - if (BTM_CMD_STARTED != status) - { + if (BTM_CMD_STARTED != status) { btm_ble_batchscan_deq_rep_data(scan_mode, &ref_value, &num_records, &p_data, &data_len); } } - } - else - { + } else { BTM_TRACE_ERROR("Illegal read scan params: %d, %d, %d", read_scan_mode, scan_mode, - ble_batchscan_cb.cur_state); + ble_batchscan_cb.cur_state); return BTM_ILLEGAL_VALUE; } return status; @@ -903,17 +861,17 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, ** *******************************************************************************/ tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback, - tBTM_BLE_REF_VALUE ref_value) + tBTM_BLE_REF_VALUE ref_value) { tBTM_BLE_VSC_CB cmn_ble_vsc_cb; BTM_TRACE_EVENT (" BTM_BleTrackAdvertiser"); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) - { + if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { BTM_TRACE_ERROR("Controller does not support scan storage"); return BTM_ERR_PROCESSING; } @@ -958,10 +916,10 @@ void btm_ble_batchscan_cleanup(void) int index = 0; BTM_TRACE_EVENT (" btm_ble_batchscan_cleanup"); - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) - { - if (NULL != ble_batchscan_cb.main_rep_q.p_data[index]) + for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) { + if (NULL != ble_batchscan_cb.main_rep_q.p_data[index]) { GKI_freebuf(ble_batchscan_cb.main_rep_q.p_data[index]); + } ble_batchscan_cb.main_rep_q.p_data[index] = NULL; } diff --git a/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c b/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c old mode 100755 new mode 100644 index e69d44637..f53f71a5d --- a/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c @@ -52,59 +52,68 @@ static const size_t background_connection_buckets = 42; static hash_map_t *background_connections = NULL; typedef struct background_connection_t { - bt_bdaddr_t address; + bt_bdaddr_t address; } background_connection_t; -static bool bdaddr_equality_fn(const void *x, const void *y) { - return bdaddr_equals((bt_bdaddr_t *)x, (bt_bdaddr_t *)y); +static bool bdaddr_equality_fn(const void *x, const void *y) +{ + return bdaddr_equals((bt_bdaddr_t *)x, (bt_bdaddr_t *)y); } static void background_connections_lazy_init() { - if (!background_connections) { - background_connections = hash_map_new(background_connection_buckets, - hash_function_bdaddr, NULL, osi_free, bdaddr_equality_fn); - assert(background_connections); - } + if (!background_connections) { + background_connections = hash_map_new(background_connection_buckets, + hash_function_bdaddr, NULL, osi_free, bdaddr_equality_fn); + assert(background_connections); + } } -static void background_connection_add(bt_bdaddr_t *address) { - assert(address); - background_connections_lazy_init(); - background_connection_t *connection = hash_map_get(background_connections, address); - if (!connection) { - connection = osi_calloc(sizeof(background_connection_t)); - connection->address = *address; - hash_map_set(background_connections, &(connection->address), connection); - } +static void background_connection_add(bt_bdaddr_t *address) +{ + assert(address); + background_connections_lazy_init(); + background_connection_t *connection = hash_map_get(background_connections, address); + if (!connection) { + connection = osi_calloc(sizeof(background_connection_t)); + connection->address = *address; + hash_map_set(background_connections, &(connection->address), connection); + } } -static void background_connection_remove(bt_bdaddr_t *address) { - if (address && background_connections) - hash_map_erase(background_connections, address); +static void background_connection_remove(bt_bdaddr_t *address) +{ + if (address && background_connections) { + hash_map_erase(background_connections, address); + } } -static void background_connections_clear() { - if (background_connections) - hash_map_clear(background_connections); +static void background_connections_clear() +{ + if (background_connections) { + hash_map_clear(background_connections); + } } -static bool background_connections_pending_cb(hash_map_entry_t *hash_entry, void *context) { - bool *pending_connections = context; - background_connection_t *connection = hash_entry->data; - const bool connected = BTM_IsAclConnectionUp(connection->address.address, BT_TRANSPORT_LE); - if (!connected) { - *pending_connections = true; - return false; - } - return true; +static bool background_connections_pending_cb(hash_map_entry_t *hash_entry, void *context) +{ + bool *pending_connections = context; + background_connection_t *connection = hash_entry->data; + const bool connected = BTM_IsAclConnectionUp(connection->address.address, BT_TRANSPORT_LE); + if (!connected) { + *pending_connections = true; + return false; + } + return true; } -static bool background_connections_pending() { - bool pending_connections = false; - if (background_connections) - hash_map_foreach(background_connections, background_connections_pending_cb, &pending_connections); - return pending_connections; +static bool background_connections_pending() +{ + bool pending_connections = false; + if (background_connections) { + hash_map_foreach(background_connections, background_connections_pending_cb, &pending_connections); + } + return pending_connections; } /******************************************************************************* @@ -125,15 +134,12 @@ void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy) p_inq->sfp = scan_policy; p_inq->scan_type = p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE ? BTM_BLE_SCAN_MODE_ACTI : p_inq->scan_type; - if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) - { + if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) { btsnd_hcic_ble_set_scan_params(p_inq->scan_type, (UINT16)scan_interval, (UINT16)scan_window, btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, scan_policy); - } - else - { + } else { btm_ble_send_extended_scan_params(p_inq->scan_type, scan_interval, scan_window, btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, scan_policy); @@ -154,44 +160,35 @@ BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr) tBT_DEVICE_TYPE dev_type; if (p_dev_rec != NULL && - p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) - { - if (to_add) - { - if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr)) - { + p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) { + if (to_add) { + if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr)) { started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr); p_dev_rec->ble.in_controller_list |= BTM_WHITE_LIST_BIT; - } - else if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 && - memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0) - { + } else if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 && + memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0) { started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type, - p_dev_rec->ble.static_addr); + p_dev_rec->ble.static_addr); p_dev_rec->ble.in_controller_list |= BTM_WHITE_LIST_BIT; } - } - else - { - if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr)) - { + } else { + if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr)) { started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.ble_addr_type, bd_addr); } if (memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0 && - memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0) - { + memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0) { started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr); } p_dev_rec->ble.in_controller_list &= ~BTM_WHITE_LIST_BIT; } } /* if not a known device, shall we add it? */ - else - { + else { BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr); - if (to_add) + if (to_add) { started = btsnd_hcic_ble_add_white_list (addr_type, bd_addr); + } } return started; @@ -209,15 +206,13 @@ BOOLEAN btm_execute_wl_dev_operation(void) UINT8 i = 0; BOOLEAN rt = TRUE; - for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && rt; i ++, p_dev_op ++) - { - if (p_dev_op->in_use) - { + for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && rt; i ++, p_dev_op ++) { + if (p_dev_op->in_use) { rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr); memset(p_dev_op, 0, sizeof(tBTM_BLE_WL_OP)); - } - else + } else { break; + } } return rt; } @@ -232,24 +227,19 @@ void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr) tBTM_BLE_WL_OP *p_dev_op = btm_cb.ble_ctr_cb.wl_op_q; UINT8 i = 0; - for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++, p_dev_op ++) - { - if (p_dev_op->in_use && !memcmp(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN)) - { + for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++, p_dev_op ++) { + if (p_dev_op->in_use && !memcmp(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN)) { p_dev_op->to_add = to_add; return; - } - else if (!p_dev_op->in_use) + } else if (!p_dev_op->in_use) { break; + } } - if (i != BTM_BLE_MAX_BG_CONN_DEV_NUM) - { + if (i != BTM_BLE_MAX_BG_CONN_DEV_NUM) { p_dev_op->in_use = TRUE; p_dev_op->to_add = to_add; memcpy(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN); - } - else - { + } else { BTM_TRACE_ERROR("max pending WL operation reached, discard"); } return; @@ -267,16 +257,16 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr) { tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; - if (to_add && p_cb->white_list_avail_size == 0) - { + if (to_add && p_cb->white_list_avail_size == 0) { BTM_TRACE_ERROR("%s Whitelist full, unable to add device", __func__); return FALSE; } - if (to_add) - background_connection_add((bt_bdaddr_t*)bd_addr); - else - background_connection_remove((bt_bdaddr_t*)bd_addr); + if (to_add) { + background_connection_add((bt_bdaddr_t *)bd_addr); + } else { + background_connection_remove((bt_bdaddr_t *)bd_addr); + } btm_suspend_wl_activity(p_cb->wl_state); btm_enq_wl_dev_operation(to_add, bd_addr); @@ -314,8 +304,9 @@ void btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len) BTM_TRACE_EVENT ("btm_ble_clear_white_list_complete"); STREAM_TO_UINT8 (status, p_data); - if (status == HCI_SUCCESS) + if (status == HCI_SUCCESS) { p_cb->white_list_avail_size = controller_get_interface()->get_ble_white_list_size(); + } } /******************************************************************************* @@ -341,8 +332,9 @@ void btm_ble_white_list_init(UINT8 white_list_size) void btm_ble_add_2_white_list_complete(UINT8 status) { BTM_TRACE_EVENT("%s status=%d", __func__, status); - if (status == HCI_SUCCESS) + if (status == HCI_SUCCESS) { --btm_cb.ble_ctr_cb.white_list_avail_size; + } } /******************************************************************************* @@ -356,8 +348,9 @@ void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len) { UNUSED(evt_len); BTM_TRACE_EVENT ("%s status=%d", __func__, *p); - if (*p == HCI_SUCCESS) + if (*p == HCI_SUCCESS) { ++btm_cb.ble_ctr_cb.white_list_avail_size; + } } /******************************************************************************* @@ -381,11 +374,9 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start) UINT8 own_addr_type = p_cb->addr_mgnt_cb.own_addr_type; UINT8 peer_addr_type = BLE_ADDR_PUBLIC; - if (start) - { + if (start) { if (p_cb->conn_state == BLE_CONN_IDLE && background_connections_pending() - && btm_ble_topology_check(BTM_BLE_STATE_INIT)) - { + && btm_ble_topology_check(BTM_BLE_STATE_INIT)) { p_cb->wl_state |= BTM_BLE_WL_INIT; btm_execute_wl_dev_operation(); @@ -394,14 +385,13 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start) btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_INIT); #endif scan_int = (p_cb->scan_int == BTM_BLE_SCAN_PARAM_UNDEF) ? - BTM_BLE_SCAN_SLOW_INT_1 : p_cb->scan_int; + BTM_BLE_SCAN_SLOW_INT_1 : p_cb->scan_int; scan_win = (p_cb->scan_win == BTM_BLE_SCAN_PARAM_UNDEF) ? - BTM_BLE_SCAN_SLOW_WIN_1 : p_cb->scan_win; + BTM_BLE_SCAN_SLOW_WIN_1 : p_cb->scan_win; #if BLE_PRIVACY_SPT == TRUE if (btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE - && controller_get_interface()->supports_ble_privacy()) - { + && controller_get_interface()->supports_ble_privacy()) { own_addr_type |= BLE_ADDR_TYPE_ID_BIT; peer_addr_type |= BLE_ADDR_TYPE_ID_BIT; } @@ -418,32 +408,22 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start) BTM_BLE_CONN_SLAVE_LATENCY_DEF, /* UINT16 conn_latency */ BTM_BLE_CONN_TIMEOUT_DEF, /* UINT16 conn_timeout */ 0, /* UINT16 min_len */ - 0)) /* UINT16 max_len */ - { + 0)) { /* UINT16 max_len */ /* start auto connection failed */ exec = FALSE; p_cb->wl_state &= ~BTM_BLE_WL_INIT; - } - else - { + } else { btm_ble_set_conn_st (BLE_BG_CONN); } - } - else - { + } else { exec = FALSE; } - } - else - { - if (p_cb->conn_state == BLE_BG_CONN) - { + } else { + if (p_cb->conn_state == BLE_BG_CONN) { btsnd_hcic_ble_create_conn_cancel(); btm_ble_set_conn_st (BLE_CONN_CANCEL); p_cb->wl_state &= ~BTM_BLE_WL_INIT; - } - else - { + } else { BTM_TRACE_DEBUG("conn_st = %d, not in auto conn state, cannot stop", p_cb->conn_state); exec = FALSE; } @@ -472,12 +452,11 @@ BOOLEAN btm_ble_start_select_conn(BOOLEAN start, tBTM_BLE_SEL_CBACK *p_select_cb BTM_TRACE_EVENT ("%s", __func__); - if (start) - { - if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity)) - { - if (p_select_cback != NULL) + if (start) { + if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity)) { + if (p_select_cback != NULL) { btm_cb.ble_ctr_cb.p_select_cback = p_select_cback; + } btm_execute_wl_dev_operation(); @@ -485,62 +464,52 @@ BOOLEAN btm_ble_start_select_conn(BOOLEAN start, tBTM_BLE_SEL_CBACK *p_select_cb btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_PASS; /* Process advertising packets only from devices in the white list */ - if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) - { + if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) { /* use passive scan by default */ if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS, scan_int, scan_win, p_cb->addr_mgnt_cb.own_addr_type, - SP_ADV_WL)) - { + SP_ADV_WL)) { return FALSE; } - } - else - { + } else { if (!btm_ble_send_extended_scan_params(BTM_BLE_SCAN_MODE_PASS, scan_int, scan_win, p_cb->addr_mgnt_cb.own_addr_type, - SP_ADV_WL)) - { + SP_ADV_WL)) { return FALSE; } } - if (!btm_ble_topology_check(BTM_BLE_STATE_PASSIVE_SCAN)) - { + if (!btm_ble_topology_check(BTM_BLE_STATE_PASSIVE_SCAN)) { BTM_TRACE_ERROR("peripheral device cannot initiate passive scan for a selective connection"); return FALSE; - } - else if (background_connections_pending()) - { + } else if (background_connections_pending()) { #if BLE_PRIVACY_SPT == TRUE btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN); #endif - if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */ - return FALSE; - /* mark up inquiry status flag */ - p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE; - p_cb->wl_state |= BTM_BLE_WL_SCAN; + if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) { /* duplicate filtering enabled */ + return FALSE; + } + /* mark up inquiry status flag */ + p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE; + p_cb->wl_state |= BTM_BLE_WL_SCAN; } - } - else - { + } else { BTM_TRACE_ERROR("scan active, can not start selective connection procedure"); return FALSE; } - } - else /* disable selective connection mode */ - { + } else { /* disable selective connection mode */ p_cb->scan_activity &= ~BTM_LE_SELECT_CONN_ACTIVE; p_cb->p_select_cback = NULL; p_cb->wl_state &= ~BTM_BLE_WL_SCAN; /* stop scanning */ - if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity)) - btm_ble_stop_scan(); /* duplicate filtering enabled */ + if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity)) { + btm_ble_stop_scan(); /* duplicate filtering enabled */ + } } return TRUE; } @@ -562,8 +531,7 @@ void btm_ble_initiate_select_conn(BD_ADDR bda) BTM_TRACE_EVENT ("btm_ble_initiate_select_conn"); /* use direct connection procedure to initiate connection */ - if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda)) - { + if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda)) { BTM_TRACE_ERROR("btm_ble_initiate_select_conn failed"); } } @@ -583,10 +551,11 @@ BOOLEAN btm_ble_suspend_bg_conn(void) { BTM_TRACE_EVENT ("%s\n", __func__); - if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) + if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) { return btm_ble_start_auto_conn(FALSE); - else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) + } else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) { return btm_ble_start_select_conn(FALSE, NULL); + } return FALSE; } @@ -601,16 +570,13 @@ BOOLEAN btm_ble_suspend_bg_conn(void) *******************************************************************************/ static void btm_suspend_wl_activity(tBTM_BLE_WL_STATE wl_state) { - if (wl_state & BTM_BLE_WL_INIT) - { + if (wl_state & BTM_BLE_WL_INIT) { btm_ble_start_auto_conn(FALSE); } - if (wl_state & BTM_BLE_WL_SCAN) - { + if (wl_state & BTM_BLE_WL_SCAN) { btm_ble_start_select_conn(FALSE, NULL); } - if (wl_state & BTM_BLE_WL_ADV) - { + if (wl_state & BTM_BLE_WL_ADV) { btm_ble_stop_adv(); } @@ -628,9 +594,8 @@ static void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state) { btm_ble_resume_bg_conn(); - if (wl_state & BTM_BLE_WL_ADV) - { - btm_ble_start_adv(); + if (wl_state & BTM_BLE_WL_ADV) { + btm_ble_start_adv(); } } @@ -651,13 +616,14 @@ BOOLEAN btm_ble_resume_bg_conn(void) tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; BOOLEAN ret = FALSE; - if (p_cb->bg_conn_type != BTM_BLE_CONN_NONE) - { - if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO) + if (p_cb->bg_conn_type != BTM_BLE_CONN_NONE) { + if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO) { ret = btm_ble_start_auto_conn(TRUE); + } - if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE) + if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE) { ret = btm_ble_start_select_conn(TRUE, btm_cb.ble_ctr_cb.p_select_cback); + } } return ret; @@ -688,10 +654,11 @@ void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st) { btm_cb.ble_ctr_cb.conn_state = new_st; - if (new_st == BLE_BG_CONN || new_st == BLE_DIR_CONN) + if (new_st == BLE_BG_CONN || new_st == BLE_DIR_CONN) { btm_ble_set_topology_mask(BTM_BLE_STATE_INIT_BIT); - else + } else { btm_ble_clear_topology_mask(BTM_BLE_STATE_INIT_BIT); + } } /******************************************************************************* @@ -725,9 +692,8 @@ BOOLEAN btm_send_pending_direct_conn(void) tBTM_BLE_CONN_REQ *p_req; BOOLEAN rt = FALSE; - if (!GKI_queue_is_empty(&btm_cb.ble_ctr_cb.conn_pending_q)) - { - p_req = (tBTM_BLE_CONN_REQ*)GKI_dequeue (&btm_cb.ble_ctr_cb.conn_pending_q); + if (!GKI_queue_is_empty(&btm_cb.ble_ctr_cb.conn_pending_q)) { + p_req = (tBTM_BLE_CONN_REQ *)GKI_dequeue (&btm_cb.ble_ctr_cb.conn_pending_q); rt = l2cble_init_direct_conn((tL2C_LCB *)(p_req->p_param)); diff --git a/components/bt/bluedroid/stack/btm/btm_ble_cont_energy.c b/components/bt/bluedroid/stack/btm/btm_ble_cont_energy.c old mode 100755 new mode 100644 index 286127b5b..5a9629d87 --- a/components/bt/bluedroid/stack/btm/btm_ble_cont_energy.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_cont_energy.c @@ -48,8 +48,7 @@ void btm_ble_cont_energy_cmpl_cback (tBTM_VSC_CMPL *p_params) UINT8 status = 0; UINT32 total_tx_time = 0, total_rx_time = 0, total_idle_time = 0, total_energy_used = 0; - if (len < 17) - { + if (len < 17) { BTM_TRACE_ERROR("wrong length for btm_ble_cont_energy_cmpl_cback"); return; } @@ -61,11 +60,11 @@ void btm_ble_cont_energy_cmpl_cback (tBTM_VSC_CMPL *p_params) STREAM_TO_UINT32(total_energy_used, p); BTM_TRACE_DEBUG("energy_info status=%d,tx_t=%ld, rx_t=%ld, ener_used=%ld, idle_t=%ld", - status, total_tx_time, total_rx_time, total_energy_used, total_idle_time); + status, total_tx_time, total_rx_time, total_energy_used, total_idle_time); if (NULL != ble_energy_info_cb.p_ener_cback) ble_energy_info_cb.p_ener_cback(total_tx_time, total_rx_time, total_idle_time, - total_energy_used, status); + total_energy_used, status); return; } @@ -90,16 +89,14 @@ tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback) BTM_TRACE_EVENT("BTM_BleGetEnergyInfo\n"); - if (0 == cmn_ble_vsc_cb.energy_support) - { + if (0 == cmn_ble_vsc_cb.energy_support) { BTM_TRACE_ERROR("Controller does not support get energy info\n"); return BTM_ERR_PROCESSING; } ble_energy_info_cb.p_ener_cback = p_ener_cback; if ((status = BTM_VendorSpecificCommand (HCI_BLE_ENERGY_INFO_OCF, 0, NULL, - btm_ble_cont_energy_cmpl_cback)) != BTM_CMD_STARTED) - { + btm_ble_cont_energy_cmpl_cback)) != BTM_CMD_STARTED) { BTM_TRACE_ERROR("BTM_BleGetEnergyInfo status: %d", status); return BTM_ILLEGAL_VALUE; } diff --git a/components/bt/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/bluedroid/stack/btm/btm_ble_gap.c old mode 100755 new mode 100644 index f665998ac..0e484d952 --- a/components/bt/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_gap.c @@ -69,9 +69,9 @@ static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data); static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb, - BD_ADDR_PTR p_peer_addr_ptr, - tBLE_ADDR_TYPE *p_peer_addr_type, - tBLE_ADDR_TYPE *p_own_addr_type); + BD_ADDR_PTR p_peer_addr_ptr, + tBLE_ADDR_TYPE *p_peer_addr_type, + tBLE_ADDR_TYPE *p_own_addr_type); static void btm_ble_stop_observe(void); #define BTM_BLE_INQ_RESULT 0x01 @@ -79,8 +79,7 @@ static void btm_ble_stop_observe(void); #define BTM_BLE_SEL_CONN_RESULT 0x04 /* LE states combo bit to check */ -const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] = -{ +const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] = { {/* single state support */ {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF}, /* conn_adv */ {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */ @@ -190,7 +189,7 @@ const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] = {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* non connectable adv */ {0, 0}, /* passive scan */ {0, 0}, /* active scan */ - {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */ + {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */ }, { /* active scan */ {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */ @@ -253,16 +252,16 @@ void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy) { tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC; - BD_ADDR p_addr_ptr= {0}; + BD_ADDR p_addr_ptr = {0}; UINT8 adv_mode = p_cb->adv_mode; BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy\n"); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return; + } - if (p_cb->afp != adv_policy) - { + if (p_cb->afp != adv_policy) { p_cb->afp = adv_policy; /* if adv active, stop and restart */ @@ -270,12 +269,12 @@ void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy) if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE) p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, - &p_cb->adv_addr_type); + &p_cb->adv_addr_type); btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_SLOW_INT), (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : - BTM_BLE_GAP_ADV_SLOW_INT), + BTM_BLE_GAP_ADV_SLOW_INT), p_cb->evt_type, p_cb->adv_addr_type, init_addr_type, @@ -283,8 +282,9 @@ void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy) p_cb->adv_chnl_map, p_cb->afp); - if (adv_mode == BTM_BLE_ADV_ENABLE) + if (adv_mode == BTM_BLE_ADV_ENABLE) { btm_ble_start_adv (); + } } } @@ -305,8 +305,8 @@ void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy) ** *******************************************************************************/ BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int, - UINT32 scan_win, UINT8 addr_type_own, - UINT8 scan_filter_policy) + UINT32 scan_win, UINT8 addr_type_own, + UINT8 scan_filter_policy) { UINT8 scan_param[HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM]; UINT8 *pp_scan = scan_param; @@ -321,8 +321,7 @@ BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int, BTM_TRACE_DEBUG("%s, %d, %d", __func__, scan_int, scan_win); if ((BTM_VendorSpecificCommand(HCI_BLE_EXTENDED_SCAN_PARAMS_OCF, - HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM, scan_param, NULL)) != BTM_SUCCESS) - { + HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM, scan_param, NULL)) != BTM_SUCCESS) { BTM_TRACE_ERROR("%s error sending extended scan parameters", __func__); return FALSE; } @@ -352,16 +351,15 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration, UINT32 scan_window = !p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window; BTM_TRACE_EVENT ("%s : scan_type:%d, %d, %d\n", __func__, btm_cb.btm_inq_vars.scan_type, - p_inq->scan_interval, p_inq->scan_window); + p_inq->scan_interval, p_inq->scan_window); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } - if (start) - { + if (start) { /* shared inquiry database, do not allow observe if any inquiry is active */ - if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) - { + if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { BTM_TRACE_ERROR("%s Observe Already Active", __func__); return status; } @@ -371,26 +369,22 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration, status = BTM_CMD_STARTED; /* scan is not started */ - if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) - { + if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { /* allow config of scan type */ p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? - BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type; + BTM_BLE_SCAN_MODE_ACTI : p_inq->scan_type; /* assume observe always not using white list */ - #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - /* enable resolving list */ - btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN); - #endif +#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) + /* enable resolving list */ + btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN); +#endif - if (cmn_ble_vsc_cb.extended_scan_support == 0) - { + if (cmn_ble_vsc_cb.extended_scan_support == 0) { btsnd_hcic_ble_set_scan_params(p_inq->scan_type, (UINT16)scan_interval, (UINT16)scan_window, btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, BTM_BLE_DEFAULT_SFP); - } - else - { + } else { btm_ble_send_extended_scan_params(p_inq->scan_type, scan_interval, scan_window, btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, BTM_BLE_DEFAULT_SFP); @@ -400,22 +394,19 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration, status = btm_ble_start_scan(); } - if (status == BTM_CMD_STARTED) - { + if (status == BTM_CMD_STARTED) { btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE; if (duration != 0) /* start observer timer */ + { btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration); + } } - } - else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) - { + } else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { status = BTM_CMD_STARTED; btm_ble_stop_observe(); - } - else - { - BTM_TRACE_ERROR("%s Observe not active", __func__); + } else { + BTM_TRACE_ERROR("%s Observe not active\n", __func__); } return status; @@ -438,25 +429,24 @@ tBTM_STATUS BTM_BleBroadcast(BOOLEAN start) tBTM_STATUS status = BTM_NO_RESOURCES; tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; - UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT; + UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT; - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } #ifdef BTM_BLE_PC_ADV_TEST_MODE - if (BTM_BLE_PC_ADV_TEST_MODE) - { - evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT: BTM_BLE_NON_CONNECT_EVT; + if (BTM_BLE_PC_ADV_TEST_MODE) { + evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT : BTM_BLE_NON_CONNECT_EVT; } #endif - if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE) - { + if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE) { /* update adv params */ if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT), (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : - BTM_BLE_GAP_ADV_INT), + BTM_BLE_GAP_ADV_INT), evt_type, p_addr_cb->own_addr_type, p_cb->direct_bda.type, @@ -464,24 +454,22 @@ tBTM_STATUS BTM_BleBroadcast(BOOLEAN start) p_cb->adv_chnl_map, p_cb->afp)) + { status = BTM_NO_RESOURCES; - else + } else { p_cb->evt_type = evt_type; + } status = btm_ble_start_adv (); - } - else if (!start) - { + } else if (!start) { status = btm_ble_stop_adv(); #if BLE_PRIVACY_SPT == TRUE btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); #endif - } - else - { + } else { status = BTM_WRONG_MODE; BTM_TRACE_ERROR("Can not %s Broadcast, device %s in Broadcast mode", - (start ? "Start" : "Stop"), (start ? "already" :"not")); + (start ? "Start" : "Stop"), (start ? "already" : "not")); } return status; } @@ -505,14 +493,12 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_ /* Check status of command complete event */ if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) && - (p_vcs_cplt_params->param_len > 0)) - { + (p_vcs_cplt_params->param_len > 0)) { p = p_vcs_cplt_params->p_param_buf; STREAM_TO_UINT8(status, p); } - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.adv_inst_max, p); STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.rpa_offloading, p); STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p); @@ -521,17 +507,13 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_filter, p); STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.energy_support, p); - if (p_vcs_cplt_params->param_len > BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE) - { + if (p_vcs_cplt_params->param_len > BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE) { STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.version_supported, p); - } - else - { + } else { btm_cb.cmn_ble_vsc_cb.version_supported = BTM_VSC_CHIP_CAPABILITY_L_VERSION; } - if (btm_cb.cmn_ble_vsc_cb.version_supported >= BTM_VSC_CHIP_CAPABILITY_M_VERSION) - { + if (btm_cb.cmn_ble_vsc_cb.version_supported >= BTM_VSC_CHIP_CAPABILITY_M_VERSION) { STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers, p); STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.extended_scan_support, p); STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.debug_logging_supported, p); @@ -540,28 +522,33 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_ } BTM_TRACE_DEBUG("%s: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d, ext_scan=%d", - __func__, status, btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, - btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading, - btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support); + __func__, status, btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, + btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading, + btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support); - if (BTM_BleMaxMultiAdvInstanceCount() > 0) + if (BTM_BleMaxMultiAdvInstanceCount() > 0) { btm_ble_multi_adv_init(); + } - if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) + if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) { btm_ble_adv_filter_init(); + } #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) /* VS capability included and non-4.2 device */ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 && - controller_get_interface()->get_ble_resolving_list_max_size() == 0) + controller_get_interface()->get_ble_resolving_list_max_size() == 0) { btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz); + } #endif - if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0) + if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0) { btm_ble_batchscan_init(); + } - if (p_ctrl_le_feature_rd_cmpl_cback != NULL) + if (p_ctrl_le_feature_rd_cmpl_cback != NULL) { p_ctrl_le_feature_rd_cmpl_cback(status); + } #endif } @@ -580,8 +567,7 @@ extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb) { BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities"); - if (NULL != p_cmn_vsc_cb) - { + if (NULL != p_cmn_vsc_cb) { *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb; } } @@ -599,8 +585,9 @@ extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb) *******************************************************************************/ extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback) { - if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read) + if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read) { return; + } #if BLE_VND_INCLUDED == TRUE BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures"); @@ -610,8 +597,7 @@ extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_c 0, NULL, btm_ble_vendor_capability_vsc_cmpl_cback) - != BTM_CMD_STARTED) - { + != BTM_CMD_STARTED) { BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed."); } #else @@ -662,33 +648,31 @@ BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode) BTM_TRACE_EVENT ("%s\n", __func__); /* if LE is not supported, return error */ - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return FALSE; + } uint8_t addr_resolution = 0; - if(!privacy_mode)/* if privacy disabled, always use public address */ - { + if (!privacy_mode) { /* if privacy disabled, always use public address */ p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC; p_cb->privacy_mode = BTM_PRIVACY_NONE; - } - else /* privacy is turned on*/ - { + } else { /* privacy is turned on*/ /* always set host random address, used when privacy 1.1 or priavcy 1.2 is disabled */ p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM; btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low); - if (BTM_BleMaxMultiAdvInstanceCount() > 0) + if (BTM_BleMaxMultiAdvInstanceCount() > 0) { btm_ble_multi_adv_enb_privacy(privacy_mode); + } /* 4.2 controller only allow privacy 1.2 or mixed mode, resolvable private address in controller */ - if (controller_get_interface()->supports_ble_privacy()) - { + if (controller_get_interface()->supports_ble_privacy()) { addr_resolution = 1; /* check vendor specific capability */ p_cb->privacy_mode = btm_cb.ble_ctr_cb.mixed_mode ? BTM_PRIVACY_MIXED : BTM_PRIVACY_1_2; - } - else /* 4.1/4.0 controller */ + } else { /* 4.1/4.0 controller */ p_cb->privacy_mode = BTM_PRIVACY_1_1; + } } #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE) @@ -713,7 +697,7 @@ BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode) extern UINT8 BTM_BleMaxMultiAdvInstanceCount(void) { return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ? - btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX; + btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX; } #if BLE_PRIVACY_SPT == TRUE @@ -726,7 +710,7 @@ extern UINT8 BTM_BleMaxMultiAdvInstanceCount(void) ** Returns void ** *******************************************************************************/ -static void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p) +static void btm_ble_resolve_random_addr_on_adv(void *p_rec, void *p) { tBTM_SEC_DEV_REC *match_rec = (tBTM_SEC_DEV_REC *) p_rec; UINT8 addr_type = BLE_ADDR_RANDOM; @@ -740,14 +724,12 @@ static void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p) STREAM_TO_UINT8 (addr_type, pp); STREAM_TO_BDADDR (bda, pp); - if (match_rec) - { + if (match_rec) { BTM_TRACE_DEBUG("Random match"); match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA; memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN); - if (btm_ble_init_pseudo_addr(match_rec, bda)) - { + if (btm_ble_init_pseudo_addr(match_rec, bda)) { memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN); } else { // Assign the original address to be the current report address @@ -799,45 +781,41 @@ BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE bg_conn_type, BOOLEAN started = TRUE; BTM_TRACE_EVENT ("BTM_BleSetBgConnType "); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return FALSE; + } - if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type) - { - switch (bg_conn_type) - { - case BTM_BLE_CONN_AUTO: - btm_ble_start_auto_conn(TRUE); - break; + if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type) { + switch (bg_conn_type) { + case BTM_BLE_CONN_AUTO: + btm_ble_start_auto_conn(TRUE); + break; - case BTM_BLE_CONN_SELECTIVE: - if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) - { - btm_ble_start_auto_conn(FALSE); - } - btm_ble_start_select_conn(TRUE, p_select_cback); - break; + case BTM_BLE_CONN_SELECTIVE: + if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) { + btm_ble_start_auto_conn(FALSE); + } + btm_ble_start_select_conn(TRUE, p_select_cback); + break; - case BTM_BLE_CONN_NONE: - if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) - { - btm_ble_start_auto_conn(FALSE); - } - else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) - { - btm_ble_start_select_conn(FALSE, NULL); - } - started = TRUE; - break; + case BTM_BLE_CONN_NONE: + if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) { + btm_ble_start_auto_conn(FALSE); + } else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) { + btm_ble_start_select_conn(FALSE, NULL); + } + started = TRUE; + break; - default: - BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type); - started = FALSE; - break; + default: + BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type); + started = FALSE; + break; } - if (started) + if (started) { btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type; + } } return started; } @@ -903,8 +881,9 @@ tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode) tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; BTM_TRACE_EVENT ("%s connectable_mode = %d ", __func__, connectable_mode); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } p_cb->directed_conn = connectable_mode; return btm_ble_set_connectability( p_cb->connectable_mode); @@ -920,45 +899,40 @@ tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode) ** *******************************************************************************/ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb, - BD_ADDR_PTR p_peer_addr_ptr, - tBLE_ADDR_TYPE *p_peer_addr_type, - tBLE_ADDR_TYPE *p_own_addr_type) + BD_ADDR_PTR p_peer_addr_ptr, + tBLE_ADDR_TYPE *p_peer_addr_type, + tBLE_ADDR_TYPE *p_own_addr_type) { UINT8 evt_type, i = BTM_SEC_MAX_DEVICE_RECORDS; tBTM_SEC_DEV_REC *p_dev_rec; evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \ - ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\ - : BTM_BLE_CONNECT_EVT; + ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\ + : BTM_BLE_CONNECT_EVT; - if (evt_type == BTM_BLE_CONNECT_EVT) - { + if (evt_type == BTM_BLE_CONNECT_EVT) { evt_type = p_cb->directed_conn; if ( p_cb->directed_conn == BTM_BLE_CONNECT_DIR_EVT || - p_cb->directed_conn == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT) - { + p_cb->directed_conn == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT) { #if BLE_PRIVACY_SPT == TRUE /* for privacy 1.2, convert peer address as static, own address set as ID addr */ if (btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_1_2 || - btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) - { + btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) { /* only do so for bonded device */ - if ((p_dev_rec = btm_find_or_alloc_dev (p_cb->direct_bda.bda)) != NULL && - p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) - { - btm_ble_enable_resolving_list(BTM_BLE_RL_ADV); - memcpy(p_peer_addr_ptr, p_dev_rec->ble.static_addr, BD_ADDR_LEN); - *p_peer_addr_type = p_dev_rec->ble.static_addr_type; - *p_own_addr_type = BLE_ADDR_RANDOM_ID; - return evt_type; - } - /* otherwise fall though as normal directed adv */ - else - { + if ((p_dev_rec = btm_find_or_alloc_dev (p_cb->direct_bda.bda)) != NULL && + p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) { + btm_ble_enable_resolving_list(BTM_BLE_RL_ADV); + memcpy(p_peer_addr_ptr, p_dev_rec->ble.static_addr, BD_ADDR_LEN); + *p_peer_addr_type = p_dev_rec->ble.static_addr_type; + *p_own_addr_type = BLE_ADDR_RANDOM_ID; + return evt_type; + } + /* otherwise fall though as normal directed adv */ + else { btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); - } + } } #endif /* direct adv mode does not have privacy, if privacy is not enabled */ @@ -972,30 +946,28 @@ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb, #if BLE_PRIVACY_SPT == TRUE /* when privacy 1.2 privacy only mode is used, or mixed mode */ if ((btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_1_2 && p_cb->afp != AP_SCAN_CONN_ALL) || - btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) - { + btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) { /* if enhanced privacy is required, set Identity address and matching IRK peer */ - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++) { if ((btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) != 0 && - (btm_cb.sec_dev_rec[i].ble.in_controller_list & BTM_RESOLVING_LIST_BIT) != 0) - { + (btm_cb.sec_dev_rec[i].ble.in_controller_list & BTM_RESOLVING_LIST_BIT) != 0) { memcpy(p_peer_addr_ptr, btm_cb.sec_dev_rec[i].ble.static_addr, BD_ADDR_LEN); *p_peer_addr_type = btm_cb.sec_dev_rec[i].ble.static_addr_type; - break; + break; } } - if (i != BTM_SEC_MAX_DEVICE_RECORDS) + if (i != BTM_SEC_MAX_DEVICE_RECORDS) { *p_own_addr_type = BLE_ADDR_RANDOM_ID; - else + } else /* resolving list is empty, not enabled */ + { *p_own_addr_type = BLE_ADDR_RANDOM; + } } /* privacy 1.1, or privacy 1.2, general discoverable/connectable mode, disable privacy in */ /* controller fall back to host based privacy */ - else if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) - { + else if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { *p_own_addr_type = BLE_ADDR_RANDOM; } #endif @@ -1033,12 +1005,12 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, BTM_TRACE_EVENT ("BTM_BleSetAdvParams"); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) || - !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) - { + !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) { return BTM_ILLEGAL_VALUE; } @@ -1046,8 +1018,7 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, p_cb->adv_interval_max = adv_int_max; p_cb->adv_chnl_map = chnl_map; - if (p_dir_bda) - { + if (p_dir_bda) { memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR)); } @@ -1056,7 +1027,7 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, btm_ble_stop_adv(); p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, - &own_addr_type); + &own_addr_type); /* update adv params */ btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min, @@ -1068,8 +1039,9 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, p_cb->adv_chnl_map, p_cb->afp); - if (adv_mode == BTM_BLE_ADV_ENABLE) + if (adv_mode == BTM_BLE_ADV_ENABLE) { btm_ble_start_adv(); + } return status; } @@ -1087,42 +1059,41 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, ** *******************************************************************************/ tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max, UINT8 adv_type, - tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda, - tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp) + tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda, + tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp) { - tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; + tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; tBTM_STATUS status = BTM_SUCCESS; - - BTM_TRACE_EVENT ("BTM_BleSetAdvParamsStartAdv\n"); - if (!controller_get_interface()->supports_ble()) + BTM_TRACE_EVENT ("BTM_BleSetAdvParamsStartAdv\n"); + + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) || - !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) - { + !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) { return BTM_ILLEGAL_VALUE; } p_cb->adv_interval_min = adv_int_min; p_cb->adv_interval_max = adv_int_max; p_cb->adv_chnl_map = chnl_map; - p_addr_cb->own_addr_type = own_bda_type; - p_cb->evt_type = adv_type; - p_cb->adv_mode = BTM_BLE_ADV_ENABLE; - p_cb->afp = afp; - - if (p_dir_bda) - { + p_addr_cb->own_addr_type = own_bda_type; + p_cb->evt_type = adv_type; + p_cb->adv_mode = BTM_BLE_ADV_ENABLE; + p_cb->afp = afp; + + if (p_dir_bda) { memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR)); } - BTM_TRACE_EVENT ("update params for an active adv\n"); + BTM_TRACE_EVENT ("update params for an active adv\n"); btm_ble_stop_adv(); - /* update adv params */ + /* update adv params */ btsnd_hcic_ble_write_adv_params (adv_int_min, adv_int_max, adv_type, @@ -1132,7 +1103,7 @@ tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max, chnl_map, p_cb->afp); - btm_ble_start_adv(); + btm_ble_start_adv(); } @@ -1158,15 +1129,15 @@ void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max, tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; BTM_TRACE_EVENT ("BTM_BleReadAdvParams "); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return ; + } *adv_int_min = p_cb->adv_interval_min; *adv_int_max = p_cb->adv_interval_max; *p_chnl_map = p_cb->adv_chnl_map; - if (p_dir_bda != NULL) - { + if (p_dir_bda != NULL) { memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR)); } } @@ -1195,37 +1166,34 @@ void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_ UINT32 max_scan_window; BTM_TRACE_EVENT ("%s\n", __func__); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return; + } /* If not supporting extended scan support, use the older range for checking */ - if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) - { + if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) { max_scan_interval = BTM_BLE_SCAN_INT_MAX; max_scan_window = BTM_BLE_SCAN_WIN_MAX; - } - else - { + } else { /* If supporting extended scan support, use the new extended range for checking */ max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX; max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX; } if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) && - BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) && - (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) - { + BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) && + (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) { p_cb->scan_type = scan_mode; p_cb->scan_interval = scan_interval; p_cb->scan_window = scan_window; - if (scan_setup_status_cback != NULL) + if (scan_setup_status_cback != NULL) { scan_setup_status_cback(client_if, BTM_SUCCESS); - } - else - { - if (scan_setup_status_cback != NULL) + } + } else { + if (scan_setup_status_cback != NULL) { scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE); + } BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n", scan_interval, scan_window); @@ -1234,51 +1202,48 @@ void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_ } void BTM_BleSetScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window, - tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, tBTM_BLE_SFP scan_filter_policy, - tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback) + tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, tBTM_BLE_SFP scan_filter_policy, + tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback) { - tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; + tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; UINT32 max_scan_interval; UINT32 max_scan_window; BTM_TRACE_EVENT ("%s\n", __func__); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return; + } /* If not supporting extended scan support, use the older range for checking */ - if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) - { + if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) { max_scan_interval = BTM_BLE_SCAN_INT_MAX; max_scan_window = BTM_BLE_SCAN_WIN_MAX; - } - else - { + } else { /* If supporting extended scan support, use the new extended range for checking */ max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX; max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX; } if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) && - BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) && - (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) - { + BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) && + (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) { p_cb->scan_type = scan_mode; p_cb->scan_interval = scan_interval; p_cb->scan_window = scan_window; - p_cb->sfp = scan_filter_policy; + p_cb->sfp = scan_filter_policy; - btsnd_hcic_ble_set_scan_params(p_cb->scan_type, (UINT16)scan_interval, - (UINT16)scan_window, - addr_type_own, - scan_filter_policy); - - if (scan_setup_status_cback != NULL) + btsnd_hcic_ble_set_scan_params(p_cb->scan_type, (UINT16)scan_interval, + (UINT16)scan_window, + addr_type_own, + scan_filter_policy); + + if (scan_setup_status_cback != NULL) { scan_setup_status_cback(client_if, BTM_SUCCESS); - } - else - { - if (scan_setup_status_cback != NULL) + } + } else { + if (scan_setup_status_cback != NULL) { scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE); + } BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n", scan_interval, scan_window); @@ -1305,23 +1270,24 @@ tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p BTM_TRACE_EVENT (" BTM_BleWriteScanRsp"); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN); btm_ble_build_adv_data(&data_mask, &p, p_data); - if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data)) - { + if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data)) { status = BTM_SUCCESS; - if (data_mask != 0) + if (data_mask != 0) { btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE; - else + } else { btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE; - } - else + } + } else { status = BTM_ILLEGAL_VALUE; + } return status; } @@ -1345,8 +1311,9 @@ tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p BTM_TRACE_EVENT ("BTM_BleWriteAdvData "); - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ILLEGAL_VALUE; + } memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA)); p = p_cb_data->ad_data; @@ -1356,18 +1323,18 @@ tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p p_cb_data->p_pad = p; - if (mask != 0) - { + if (mask != 0) { BTM_TRACE_ERROR("Partial data write into ADV"); } p_cb_data->data_mask &= ~mask; if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data), - p_cb_data->ad_data)) + p_cb_data->ad_data)) { return BTM_SUCCESS; - else + } else { return BTM_NO_RESOURCES; + } } @@ -1385,16 +1352,15 @@ tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p *******************************************************************************/ BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr) { - BOOLEAN set_flag = false; - UINT8 len = sizeof(rand_addr); - if(len != BD_ADDR_LEN) - { - APPL_TRACE_ERROR("Invalid random adress"); - return false; - } - //send the set random address to the controller - set_flag = btsnd_hcic_ble_set_random_addr(rand_addr); - return set_flag; + BOOLEAN set_flag = false; + UINT8 len = sizeof(rand_addr); + if (len != BD_ADDR_LEN) { + APPL_TRACE_ERROR("Invalid random adress"); + return false; + } + //send the set random address to the controller + set_flag = btsnd_hcic_ble_set_random_addr(rand_addr); + return set_flag; } /******************************************************************************* @@ -1419,12 +1385,10 @@ UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length) STREAM_TO_UINT8(length, p); - while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX)) - { + while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX)) { STREAM_TO_UINT8(adv_type, p); - if ( adv_type == type ) - { + if ( adv_type == type ) { /* length doesn't include itself */ *p_length = length - 1; /* minus the length of type */ return p; @@ -1483,7 +1447,7 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, { UINT32 data_mask = *p_data_mask; UINT8 *p = *p_dst, - *p_flag = NULL; + *p_flag = NULL; UINT16 len = BTM_BLE_AD_DATA_LEN, cp_len = 0; UINT8 i = 0; tBTM_BLE_PROP_ELEM *p_elem; @@ -1491,26 +1455,24 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, BTM_TRACE_EVENT (" btm_ble_build_adv_data"); /* build the adv data structure and build the data string */ - if (data_mask) - { + if (data_mask) { /* flags */ - if (data_mask & BTM_BLE_AD_BIT_FLAGS) - { + if (data_mask & BTM_BLE_AD_BIT_FLAGS) { *p++ = MIN_ADV_LENGTH; *p++ = BTM_BLE_AD_TYPE_FLAG; p_flag = p; - if (p_data) + if (p_data) { *p++ = p_data->flag; - else + } else { *p++ = 0; + } len -= 3; data_mask &= ~BTM_BLE_AD_BIT_FLAGS; } /* appearance data */ - if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE) - { + if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE) { *p++ = 3; /* length */ *p++ = BTM_BLE_AD_TYPE_APPEARANCE; UINT16_TO_STREAM(p, p_data->appearance); @@ -1520,16 +1482,12 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* device name */ #if BTM_MAX_LOC_BD_NAME_LEN > 0 - if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME) - { - if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH)) - { + if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME) { + if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH)) { *p++ = len - MIN_ADV_LENGTH + 1; *p++ = BTM_BLE_AD_TYPE_NAME_SHORT; ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH); - } - else - { + } else { cp_len = (UINT16)strlen(btm_cb.cfg.bd_name); *p++ = cp_len + 1; *p++ = BTM_BLE_AD_TYPE_NAME_CMPL; @@ -1541,56 +1499,50 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, #endif /* manufacturer data */ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU && - p_data && p_data->p_manu && - p_data->p_manu->len != 0 && p_data->p_manu->p_val) - { - if (p_data->p_manu->len > (len - MIN_ADV_LENGTH)) + p_data && p_data->p_manu && + p_data->p_manu->len != 0 && p_data->p_manu->p_val) { + if (p_data->p_manu->len > (len - MIN_ADV_LENGTH)) { cp_len = len - MIN_ADV_LENGTH; - else + } else { cp_len = p_data->p_manu->len; - LOG_ERROR("cp_len = %d\n,p_data->p_manu->len=%d\n",cp_len,p_data->p_manu->len); - for(int i = 0; i < p_data->p_manu->len; i++) - { - LOG_DEBUG("p_data->p_manu->p_val[%d] = %x\n",i,p_data->p_manu->p_val[i]); + } + LOG_DEBUG("cp_len = %d\n,p_data->p_manu->len=%d\n", cp_len, p_data->p_manu->len); + for (int i = 0; i < p_data->p_manu->len; i++) { + LOG_DEBUG("p_data->p_manu->p_val[%d] = %x\n", i, p_data->p_manu->p_val[i]); } *p++ = cp_len + 1; *p++ = BTM_BLE_AD_TYPE_MANU; ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len); - LOG_ERROR("p_addr = %p\n,p_data->p_manu->p_val = %p\n",p,p_data->p_manu->p_val); + LOG_DEBUG("p_addr = %p\n,p_data->p_manu->p_val = %p\n", p, p_data->p_manu->p_val); len -= (cp_len + MIN_ADV_LENGTH); data_mask &= ~BTM_BLE_AD_BIT_MANU; } /* TX power */ - if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR) - { + if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR) { *p++ = MIN_ADV_LENGTH; *p++ = BTM_BLE_AD_TYPE_TX_PWR; - if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX) + if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX) { p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX; + } *p++ = btm_ble_map_adv_tx_power(p_data->tx_power); len -= 3; data_mask &= ~BTM_BLE_AD_BIT_TX_PWR; } /* 16 bits services */ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE && - p_data && p_data->p_services && - p_data->p_services->num_service != 0 && - p_data->p_services->p_uuid) - { - if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH)) - { - cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16; + p_data && p_data->p_services && + p_data->p_services->num_service != 0 && + p_data->p_services->p_uuid) { + if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH)) { + cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_16; *p ++ = 1 + cp_len * LEN_UUID_16; *p++ = BTM_BLE_AD_TYPE_16SRV_PART; - } - else - { + } else { cp_len = p_data->p_services->num_service; *p++ = 1 + cp_len * LEN_UUID_16; *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL; } - for (i = 0; i < cp_len; i ++) - { + for (i = 0; i < cp_len; i ++) { UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i)); } @@ -1599,24 +1551,19 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* 32 bits service uuid */ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 && - p_data && p_data->p_service_32b && - p_data->p_service_32b->num_service != 0 && - p_data->p_service_32b->p_uuid) - { - if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) - { - cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32; + p_data && p_data->p_service_32b && + p_data->p_service_32b->num_service != 0 && + p_data->p_service_32b->p_uuid) { + if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) { + cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32; *p ++ = 1 + cp_len * LEN_UUID_32; *p++ = BTM_BLE_AD_TYPE_32SRV_PART; - } - else - { + } else { cp_len = p_data->p_service_32b->num_service; *p++ = 1 + cp_len * LEN_UUID_32; *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL; } - for (i = 0; i < cp_len; i ++) - { + for (i = 0; i < cp_len; i ++) { UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i)); } @@ -1625,13 +1572,13 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* 128 bits services */ if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 && - p_data && p_data->p_services_128b) - { + p_data && p_data->p_services_128b) { *p ++ = 1 + MAX_UUID_SIZE; - if (!p_data->p_services_128b->list_cmpl) + if (!p_data->p_services_128b->list_cmpl) { *p++ = BTM_BLE_AD_TYPE_128SRV_PART; - else + } else { *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL; + } ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE); @@ -1640,24 +1587,19 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* 32 bits Service Solicitation UUIDs */ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL && - p_data && p_data->p_sol_service_32b && - p_data->p_sol_service_32b->num_service != 0 && - p_data->p_sol_service_32b->p_uuid) - { - if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) - { - cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32; + p_data && p_data->p_sol_service_32b && + p_data->p_sol_service_32b->num_service != 0 && + p_data->p_sol_service_32b->p_uuid) { + if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) { + cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32; *p ++ = 1 + cp_len * LEN_UUID_32; - } - else - { + } else { cp_len = p_data->p_sol_service_32b->num_service; *p++ = 1 + cp_len * LEN_UUID_32; } *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID; - for (i = 0; i < cp_len; i ++) - { + for (i = 0; i < cp_len; i ++) { UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i)); } @@ -1666,8 +1608,7 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* 128 bits Solicitation services UUID */ if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL && - p_data && p_data->p_sol_service_128b) - { + p_data && p_data->p_sol_service_128b) { *p ++ = 1 + MAX_UUID_SIZE; *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID; ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE); @@ -1676,28 +1617,22 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, } /* 16bits/32bits/128bits Service Data */ if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA && - p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) - { - if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) - { - if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH)) - cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len; - else + p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) { + if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) { + if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH)) { + cp_len = len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len; + } else { cp_len = p_data->p_service_data->len; + } *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len; - if (p_data->p_service_data->service_uuid.len == LEN_UUID_16) - { + if (p_data->p_service_data->service_uuid.len == LEN_UUID_16) { *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA; UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16); - } - else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32) - { + } else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32) { *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA; UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32); - } - else - { + } else { *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA; ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128, LEN_UUID_128); @@ -1707,16 +1642,13 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len); data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA; - } - else - { + } else { BTM_TRACE_WARNING("service data does not fit"); } } if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE && - p_data) - { + p_data) { *p++ = 5; *p++ = BTM_BLE_AD_TYPE_INT_RANGE; UINT16_TO_STREAM(p, p_data->int_range.low); @@ -1724,10 +1656,8 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, len -= 6; data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE; } - if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary) - { - for (i = 0; i < p_data->p_proprietary->num_elem ; i ++) - { + if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary) { + for (i = 0; i < p_data->p_proprietary->num_elem ; i ++) { p_elem = p_data->p_proprietary->p_elem + i; if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2) @@ -1738,9 +1668,7 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len); len -= (MIN_ADV_LENGTH + p_elem->len); - } - else - { + } else { BTM_TRACE_WARNING("data exceed max adv packet length"); break; } @@ -1765,15 +1693,11 @@ UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, *******************************************************************************/ void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max) { - if (p_cb->adv_interval_min && p_cb->adv_interval_max) - { + if (p_cb->adv_interval_min && p_cb->adv_interval_max) { *p_adv_int_min = p_cb->adv_interval_min; *p_adv_int_max = p_cb->adv_interval_max; - } - else - { - switch (evt_type) - { + } else { + switch (evt_type) { case BTM_BLE_CONNECT_EVT: case BTM_BLE_CONNECT_LO_DUTY_DIR_EVT: *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1; @@ -1814,20 +1738,22 @@ void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 * ** *******************************************************************************/ void btm_ble_update_dmt_flag_bits(UINT8 *adv_flag_value, const UINT16 connect_mode, - const UINT16 disc_mode) + const UINT16 disc_mode) { /* BR/EDR non-discoverable , non-connectable */ if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 && - (connect_mode & BTM_CONNECTABLE_MASK) == 0) + (connect_mode & BTM_CONNECTABLE_MASK) == 0) { *adv_flag_value |= BTM_BLE_BREDR_NOT_SPT; - else + } else { *adv_flag_value &= ~BTM_BLE_BREDR_NOT_SPT; + } /* if local controller support, mark both controller and host support in flag */ - if (controller_get_interface()->supports_simultaneous_le_bredr()) - *adv_flag_value |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT); - else - *adv_flag_value &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT); + if (controller_get_interface()->supports_simultaneous_le_bredr()) { + *adv_flag_value |= (BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT); + } else { + *adv_flag_value &= ~(BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT); + } } /******************************************************************************* @@ -1847,30 +1773,25 @@ void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode) UINT8 flag = 0, old_flag = 0; tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data; - if (p_adv_data->p_flags != NULL) + if (p_adv_data->p_flags != NULL) { flag = old_flag = *(p_adv_data->p_flags); + } btm_ble_update_dmt_flag_bits (&flag, connect_mode, disc_mode); LOG_DEBUG("disc_mode %04x", disc_mode); /* update discoverable flag */ - if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE) - { + if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE) { flag &= ~BTM_BLE_GEN_DISC_FLAG; flag |= BTM_BLE_LIMIT_DISC_FLAG; - } - else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE) - { + } else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE) { flag |= BTM_BLE_GEN_DISC_FLAG; flag &= ~BTM_BLE_LIMIT_DISC_FLAG; - } - else /* remove all discoverable flags */ - { - flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG); + } else { /* remove all discoverable flags */ + flag &= ~(BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG); } - if (flag != old_flag) - { + if (flag != old_flag) { LOG_ERROR("flag = 0x%x,old_flag = 0x%x", flag, old_flag); btm_ble_update_adv_flag(flag); } @@ -1894,7 +1815,7 @@ tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode) UINT8 new_mode = BTM_BLE_ADV_ENABLE; UINT8 evt_type; tBTM_STATUS status = BTM_SUCCESS; - BD_ADDR p_addr_ptr= {0}; + BD_ADDR p_addr_ptr = {0}; tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC, own_addr_type = p_addr_cb->own_addr_type; UINT16 adv_int_min, adv_int_max; @@ -1902,15 +1823,17 @@ tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode) BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode); /*** Check mode parameter ***/ - if (mode > BTM_BLE_MAX_DISCOVERABLE) - return(BTM_ILLEGAL_VALUE); + if (mode > BTM_BLE_MAX_DISCOVERABLE) { + return (BTM_ILLEGAL_VALUE); + } p_cb->discoverable_mode = mode; evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type); - if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE) + if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE) { new_mode = BTM_BLE_ADV_DISABLE; + } btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max); @@ -1919,13 +1842,11 @@ tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode) /* update adv params if start advertising */ BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x\n ", evt_type, p_cb->evt_type); - if (new_mode == BTM_BLE_ADV_ENABLE) - { + if (new_mode == BTM_BLE_ADV_ENABLE) { btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode); - if (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type - || !p_cb->fast_adv_on) - { + if (evt_type != p_cb->evt_type || p_cb->adv_addr_type != own_addr_type + || !p_cb->fast_adv_on) { btm_ble_stop_adv(); /* update adv params */ @@ -1936,43 +1857,36 @@ tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode) init_addr_type, p_addr_ptr, p_cb->adv_chnl_map, - p_cb->afp)) - { + p_cb->afp)) { status = BTM_NO_RESOURCES; - } - else - { + } else { p_cb->evt_type = evt_type; p_cb->adv_addr_type = own_addr_type; } } } - if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode) - { - if (new_mode == BTM_BLE_ADV_ENABLE) + if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode) { + if (new_mode == BTM_BLE_ADV_ENABLE) { status = btm_ble_start_adv(); - else + } else { status = btm_ble_stop_adv(); + } } - if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) - { + if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) { p_cb->fast_adv_on = TRUE; /* start initial GAP mode adv timer */ btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV, - BTM_BLE_GAP_FAST_ADV_TOUT); - } - else - { + BTM_BLE_GAP_FAST_ADV_TOUT); + } else { #if BLE_PRIVACY_SPT == TRUE btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); #endif } /* set up stop advertising timer */ - if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE) - { + if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE) { BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT); /* start Tgap(lim_timeout) */ btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC, @@ -2008,26 +1922,26 @@ tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode) BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode); /*** Check mode parameter ***/ - if (mode > BTM_BLE_MAX_CONNECTABLE) - return(BTM_ILLEGAL_VALUE); + if (mode > BTM_BLE_MAX_CONNECTABLE) { + return (BTM_ILLEGAL_VALUE); + } p_cb->connectable_mode = mode; evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &peer_addr_type, &own_addr_type); - if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE) + if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE) { new_mode = BTM_BLE_ADV_DISABLE; + } btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max); btu_stop_timer(&p_cb->fast_adv_timer); /* update adv params if needed */ - if (new_mode == BTM_BLE_ADV_ENABLE) - { + if (new_mode == BTM_BLE_ADV_ENABLE) { btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode); if (p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type - || !p_cb->fast_adv_on) - { + || !p_cb->fast_adv_on) { btm_ble_stop_adv(); if (!btsnd_hcic_ble_write_adv_params (adv_int_min, @@ -2037,12 +1951,9 @@ tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode) peer_addr_type, p_addr_ptr, p_cb->adv_chnl_map, - p_cb->afp)) - { + p_cb->afp)) { status = BTM_NO_RESOURCES; - } - else - { + } else { p_cb->evt_type = evt_type; p_cb->adv_addr_type = own_addr_type; } @@ -2050,23 +1961,20 @@ tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode) } /* update advertising mode */ - if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode) - { - if (new_mode == BTM_BLE_ADV_ENABLE) + if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode) { + if (new_mode == BTM_BLE_ADV_ENABLE) { status = btm_ble_start_adv(); - else + } else { status = btm_ble_stop_adv(); + } } - if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) - { + if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) { p_cb->fast_adv_on = TRUE; /* start initial GAP mode adv timer */ btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV, - BTM_BLE_GAP_FAST_ADV_TOUT); - } - else - { + BTM_BLE_GAP_FAST_ADV_TOUT); + } else { #if BLE_PRIVACY_SPT == TRUE btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); #endif @@ -2104,47 +2012,42 @@ tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration) /* if selective connection is active, or inquiry is already active, reject it */ if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) || - BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity)) - { + BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity)) { BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry"); - return(BTM_BUSY); + return (BTM_BUSY); } - if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) - { + if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) { btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI, - BTM_BLE_LOW_LATENCY_SCAN_INT, - BTM_BLE_LOW_LATENCY_SCAN_WIN, - btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, - SP_ADV_ALL); + BTM_BLE_LOW_LATENCY_SCAN_INT, + BTM_BLE_LOW_LATENCY_SCAN_WIN, + btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, + SP_ADV_ALL); #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) /* enable IRK list */ btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN); #endif p_ble_cb->inq_var.scan_duplicate_filter = BTM_BLE_DUPLICATE_DISABLE; status = btm_ble_start_scan(); - } - else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) || - (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) { + } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) || + (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) { BTM_TRACE_DEBUG("%s, restart LE scan with low latency scan params", __FUNCTION__); btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE); btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI, - BTM_BLE_LOW_LATENCY_SCAN_INT, - BTM_BLE_LOW_LATENCY_SCAN_WIN, - btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, - SP_ADV_ALL); + BTM_BLE_LOW_LATENCY_SCAN_INT, + BTM_BLE_LOW_LATENCY_SCAN_WIN, + btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type, + SP_ADV_ALL); btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE); } - if (status == BTM_CMD_STARTED) - { + if (status == BTM_CMD_STARTED) { p_inq->inq_active |= mode; p_ble_cb->scan_activity |= mode; BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active); - if (duration != 0) - { + if (duration != 0) { /* start inquiry timer */ btu_start_timer (&p_ble_cb->inq_var.inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration); } @@ -2169,18 +2072,16 @@ void btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, c BD_NAME bd_name; memset(bd_name, 0, (BD_NAME_LEN + 1)); - if (length > BD_NAME_LEN) - { + if (length > BD_NAME_LEN) { length = BD_NAME_LEN; } - memcpy((UINT8*)bd_name, p_name, length); + memcpy((UINT8 *)bd_name, p_name, length); - if ((!status) || (length==0)) - { + if ((!status) || (length == 0)) { hci_status = HCI_ERR_HOST_TIMEOUT; } - btm_process_remote_name(bda, bd_name, length +1, hci_status); + btm_process_remote_name(bda, bd_name, length + 1, hci_status); btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status); } @@ -2200,24 +2101,26 @@ tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, t { tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars; - if (!controller_get_interface()->supports_ble()) + if (!controller_get_interface()->supports_ble()) { return BTM_ERR_PROCESSING; + } if (p_cur && - p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV && - p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV) - { + p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV && + p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV) { BTM_TRACE_DEBUG("name request to non-connectable device failed."); return BTM_ERR_PROCESSING; } /* read remote device name using GATT procedure */ - if (p_inq->remname_active) + if (p_inq->remname_active) { return BTM_BUSY; + } #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE) - if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl)) + if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl)) { return BTM_BUSY; + } #endif p_inq->p_remname_cmpl_cb = p_cb; @@ -2278,18 +2181,14 @@ static void btm_ble_update_adv_flag(UINT8 flag) BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag); - if (p_adv_data->p_flags != NULL) - { + if (p_adv_data->p_flags != NULL) { BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags); *p_adv_data->p_flags = flag; - } - else /* no FLAGS in ADV data*/ - { + } else { /* no FLAGS in ADV data*/ p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad; /* need 3 bytes space to stuff in the flags, if not */ /* erase all written data, just for flags */ - if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3) - { + if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3) { p = p_adv_data->p_pad = p_adv_data->ad_data; memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN); } @@ -2302,8 +2201,9 @@ static void btm_ble_update_adv_flag(UINT8 flag) } if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data), - p_adv_data->ad_data)) + p_adv_data->ad_data)) { p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS; + } } @@ -2325,84 +2225,82 @@ static void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data, BTM_TRACE_EVENT (" btm_ble_parse_adv_data"); - while (len > 0) - { + while (len > 0) { BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len); - if ((ad_len = *p_cur ++) == 0) + if ((ad_len = *p_cur ++) == 0) { break; + } ad_type = *p_cur ++; BTM_TRACE_DEBUG(" ad_type = %02x ad_len = %d", ad_type, ad_len); - switch (ad_type) - { - case BTM_BLE_AD_TYPE_NAME_SHORT: + switch (ad_type) { + case BTM_BLE_AD_TYPE_NAME_SHORT: - case BTM_BLE_AD_TYPE_NAME_CMPL: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME; - if (p_info) - { - p_info->remote_name_type =(ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ? - BTM_BLE_NAME_SHORT: BTM_BLE_NAME_CMPL; - memcpy(p_info->remote_name, p_cur, ad_len -1); - p_info->remote_name[ad_len] = 0; - p_adv_data->p_remote_name = p_info->remote_name; - p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1; - BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name); - } - p_cur += (ad_len -1); + case BTM_BLE_AD_TYPE_NAME_CMPL: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME; + if (p_info) { + p_info->remote_name_type = (ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ? + BTM_BLE_NAME_SHORT : BTM_BLE_NAME_CMPL; + memcpy(p_info->remote_name, p_cur, ad_len - 1); + p_info->remote_name[ad_len] = 0; + p_adv_data->p_remote_name = p_info->remote_name; + p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1; + BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s", p_adv_data->p_remote_name); + } + p_cur += (ad_len - 1); - break; + break; - case BTM_BLE_AD_TYPE_FLAG: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS; - ad_flag = *p_cur ++; - p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ; - BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s", - (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "", - (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "", - (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : ""); - break; + case BTM_BLE_AD_TYPE_FLAG: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS; + ad_flag = *p_cur ++; + p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ; + BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s", + (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG) ? "LE_LIMIT_DISC" : "", + (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG) ? "LE_GENERAL_DISC" : "", + (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT) ? "LE Only device" : ""); + break; - case BTM_BLE_AD_TYPE_TX_PWR: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR; - p_adv_data->tx_power_level = (INT8)*p_cur ++; - BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level); - break; + case BTM_BLE_AD_TYPE_TX_PWR: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR; + p_adv_data->tx_power_level = (INT8) * p_cur ++; + BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level); + break; - case BTM_BLE_AD_TYPE_MANU: + case BTM_BLE_AD_TYPE_MANU: - case BTM_BLE_AD_TYPE_16SRV_PART: - case BTM_BLE_AD_TYPE_16SRV_CMPL: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE; - /* need allocate memory to store UUID list */ - p_adv_data->service.num_service = (ad_len - 1)/2; - BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); - p_cur += (ad_len - 1); - break; + case BTM_BLE_AD_TYPE_16SRV_PART: + case BTM_BLE_AD_TYPE_16SRV_CMPL: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE; + /* need allocate memory to store UUID list */ + p_adv_data->service.num_service = (ad_len - 1) / 2; + BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); + p_cur += (ad_len - 1); + break; - case BTM_BLE_AD_TYPE_SOL_SRV_UUID: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; - /* need allocate memory to store UUID list */ - p_adv_data->service.num_service = (ad_len - 1)/2; - BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); - p_cur += (ad_len - 1); - break; + case BTM_BLE_AD_TYPE_SOL_SRV_UUID: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL; + /* need allocate memory to store UUID list */ + p_adv_data->service.num_service = (ad_len - 1) / 2; + BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); + p_cur += (ad_len - 1); + break; - case BTM_BLE_AD_TYPE_128SOL_SRV_UUID: - p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; - /* need allocate memory to store UUID list */ - p_adv_data->service.num_service = (ad_len - 1)/16; - BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); - p_cur += (ad_len - 1); - break; + case BTM_BLE_AD_TYPE_128SOL_SRV_UUID: + p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL; + /* need allocate memory to store UUID list */ + p_adv_data->service.num_service = (ad_len - 1) / 16; + BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service); + p_cur += (ad_len - 1); + break; - case BTM_BLE_AD_TYPE_APPEARANCE: - case BTM_BLE_AD_TYPE_PUBLIC_TARGET: - case BTM_BLE_AD_TYPE_RANDOM_TARGET: - default: - break; + case BTM_BLE_AD_TYPE_APPEARANCE: + case BTM_BLE_AD_TYPE_PUBLIC_TARGET: + case BTM_BLE_AD_TYPE_RANDOM_TARGET: + default: + break; } len -= (ad_len + 1); } @@ -2426,24 +2324,21 @@ void btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, U UNUSED(p_cur); /* cache adv report/scan response data */ - if (evt_type != BTM_BLE_SCAN_RSP_EVT) - { + if (evt_type != BTM_BLE_SCAN_RSP_EVT) { p_le_inq_cb->adv_len = 0; memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX); } - if (data_len > 0) - { + if (data_len > 0) { p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len]; STREAM_TO_UINT8(length, p); - while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX)) - { + while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX)) { /* copy from the length byte & data into cache */ - memcpy(p_cache, p-1, length+1); + memcpy(p_cache, p - 1, length + 1); /* advance the cache pointer past data */ - p_cache += length+1; + p_cache += length + 1; /* increment cache length */ - p_le_inq_cb->adv_len += length+1; + p_le_inq_cb->adv_len += length + 1; /* skip the length of data */ p += length; STREAM_TO_UINT8(length, p); @@ -2476,38 +2371,35 @@ UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p) UNUSED(p); /* for observer, always "discoverable */ - if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) + if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { rt |= BTM_BLE_OBS_RESULT; + } if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) && - (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT)) + (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT)) { rt |= BTM_BLE_SEL_CONN_RESULT; + } /* does not match filter condition */ if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR && - memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0) - { + memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0) { BTM_TRACE_DEBUG("BD ADDR does not meet filter condition"); return rt; } - if (p_le_inq_cb->adv_len != 0) - { + if (p_le_inq_cb->adv_len != 0) { if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, - BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL) - { + BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL) { flag = * p_flag; if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) && - (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0) - { + (flag & (BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG)) != 0) { BTM_TRACE_DEBUG("Find Generable Discoverable device"); rt |= BTM_BLE_INQ_RESULT; } else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY && - (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0) - { + (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0) { BTM_TRACE_DEBUG("Find limited discoverable device"); rt |= BTM_BLE_INQ_RESULT; } @@ -2520,126 +2412,125 @@ static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class) { dev_class[0] = 0; - switch (appearance) - { - case BTM_BLE_APPEARANCE_GENERIC_PHONE: - dev_class[1] = BTM_COD_MAJOR_PHONE; - dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; - break; - case BTM_BLE_APPEARANCE_GENERIC_COMPUTER: - dev_class[1] = BTM_COD_MAJOR_COMPUTER; - dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; - break; - case BTM_BLE_APPEARANCE_GENERIC_REMOTE: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL; - break; - case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER: - case BTM_BLE_APPEARANCE_THERMOMETER_EAR: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_THERMOMETER; - break; - case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE: - case BTM_BLE_APPEARANCE_HEART_RATE_BELT: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR; - break; - case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE: - case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM: - case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR; - break; - case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER: - case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP: - case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER; - break; - case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER; - break; - case BTM_BLE_APPEARANCE_GENERIC_WEIGHT: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE; - break; - case BTM_BLE_APPEARANCE_GENERIC_WALKING: - case BTM_BLE_APPEARANCE_WALKING_IN_SHOE: - case BTM_BLE_APPEARANCE_WALKING_ON_SHOE: - case BTM_BLE_APPEARANCE_WALKING_ON_HIP: - dev_class[1] = BTM_COD_MAJOR_HEALTH; - dev_class[2] = BTM_COD_MINOR_STEP_COUNTER; - break; - case BTM_BLE_APPEARANCE_GENERIC_WATCH: - case BTM_BLE_APPEARANCE_SPORTS_WATCH: - dev_class[1] = BTM_COD_MAJOR_WEARABLE; - dev_class[2] = BTM_COD_MINOR_WRIST_WATCH; - break; - case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES: - dev_class[1] = BTM_COD_MAJOR_WEARABLE; - dev_class[2] = BTM_COD_MINOR_GLASSES; - break; - case BTM_BLE_APPEARANCE_GENERIC_DISPLAY: - dev_class[1] = BTM_COD_MAJOR_IMAGING; - dev_class[2] = BTM_COD_MINOR_DISPLAY; - break; - case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER: - dev_class[1] = BTM_COD_MAJOR_AUDIO; - dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; - break; - case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER: - case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER: - case BTM_BLE_APPEARANCE_GENERIC_HID: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; - break; - case BTM_BLE_APPEARANCE_HID_KEYBOARD: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_KEYBOARD; - break; - case BTM_BLE_APPEARANCE_HID_MOUSE: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_POINTING; - break; - case BTM_BLE_APPEARANCE_HID_JOYSTICK: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_JOYSTICK; - break; - case BTM_BLE_APPEARANCE_HID_GAMEPAD: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_GAMEPAD; - break; - case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET; - break; - case BTM_BLE_APPEARANCE_HID_CARD_READER: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_CARD_READER; - break; - case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN: - dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; - dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN; - break; - case BTM_BLE_APPEARANCE_UKNOWN: - case BTM_BLE_APPEARANCE_GENERIC_CLOCK: - case BTM_BLE_APPEARANCE_GENERIC_TAG: - case BTM_BLE_APPEARANCE_GENERIC_KEYRING: - case BTM_BLE_APPEARANCE_GENERIC_CYCLING: - case BTM_BLE_APPEARANCE_CYCLING_COMPUTER: - case BTM_BLE_APPEARANCE_CYCLING_SPEED: - case BTM_BLE_APPEARANCE_CYCLING_CADENCE: - case BTM_BLE_APPEARANCE_CYCLING_POWER: - case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE: - case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS: - case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION: - case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV: - case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD: - case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV: - default: - dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED; - dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; + switch (appearance) { + case BTM_BLE_APPEARANCE_GENERIC_PHONE: + dev_class[1] = BTM_COD_MAJOR_PHONE; + dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; + break; + case BTM_BLE_APPEARANCE_GENERIC_COMPUTER: + dev_class[1] = BTM_COD_MAJOR_COMPUTER; + dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; + break; + case BTM_BLE_APPEARANCE_GENERIC_REMOTE: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL; + break; + case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER: + case BTM_BLE_APPEARANCE_THERMOMETER_EAR: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_THERMOMETER; + break; + case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE: + case BTM_BLE_APPEARANCE_HEART_RATE_BELT: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR; + break; + case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE: + case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM: + case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR; + break; + case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER: + case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP: + case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER; + break; + case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER; + break; + case BTM_BLE_APPEARANCE_GENERIC_WEIGHT: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE; + break; + case BTM_BLE_APPEARANCE_GENERIC_WALKING: + case BTM_BLE_APPEARANCE_WALKING_IN_SHOE: + case BTM_BLE_APPEARANCE_WALKING_ON_SHOE: + case BTM_BLE_APPEARANCE_WALKING_ON_HIP: + dev_class[1] = BTM_COD_MAJOR_HEALTH; + dev_class[2] = BTM_COD_MINOR_STEP_COUNTER; + break; + case BTM_BLE_APPEARANCE_GENERIC_WATCH: + case BTM_BLE_APPEARANCE_SPORTS_WATCH: + dev_class[1] = BTM_COD_MAJOR_WEARABLE; + dev_class[2] = BTM_COD_MINOR_WRIST_WATCH; + break; + case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES: + dev_class[1] = BTM_COD_MAJOR_WEARABLE; + dev_class[2] = BTM_COD_MINOR_GLASSES; + break; + case BTM_BLE_APPEARANCE_GENERIC_DISPLAY: + dev_class[1] = BTM_COD_MAJOR_IMAGING; + dev_class[2] = BTM_COD_MINOR_DISPLAY; + break; + case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER: + dev_class[1] = BTM_COD_MAJOR_AUDIO; + dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; + break; + case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER: + case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER: + case BTM_BLE_APPEARANCE_GENERIC_HID: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; + break; + case BTM_BLE_APPEARANCE_HID_KEYBOARD: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_KEYBOARD; + break; + case BTM_BLE_APPEARANCE_HID_MOUSE: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_POINTING; + break; + case BTM_BLE_APPEARANCE_HID_JOYSTICK: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_JOYSTICK; + break; + case BTM_BLE_APPEARANCE_HID_GAMEPAD: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_GAMEPAD; + break; + case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET; + break; + case BTM_BLE_APPEARANCE_HID_CARD_READER: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_CARD_READER; + break; + case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN: + dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; + dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN; + break; + case BTM_BLE_APPEARANCE_UKNOWN: + case BTM_BLE_APPEARANCE_GENERIC_CLOCK: + case BTM_BLE_APPEARANCE_GENERIC_TAG: + case BTM_BLE_APPEARANCE_GENERIC_KEYRING: + case BTM_BLE_APPEARANCE_GENERIC_CYCLING: + case BTM_BLE_APPEARANCE_CYCLING_COMPUTER: + case BTM_BLE_APPEARANCE_CYCLING_SPEED: + case BTM_BLE_APPEARANCE_CYCLING_CADENCE: + case BTM_BLE_APPEARANCE_CYCLING_POWER: + case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE: + case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS: + case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION: + case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV: + case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD: + case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV: + default: + dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED; + dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED; }; } @@ -2668,8 +2559,7 @@ BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_t STREAM_TO_UINT8 (data_len, p); - if (data_len > BTM_BLE_ADV_DATA_LEN_MAX) - { + if (data_len > BTM_BLE_ADV_DATA_LEN_MAX) { BTM_TRACE_WARNING("EIR data too long %d. discard", data_len); return FALSE; } @@ -2685,54 +2575,48 @@ BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_t /* active scan, always wait until get scan_rsp to report the result */ if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI && - (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT))) - { + (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT))) { BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\ scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type); p_i->scan_rsp = FALSE; to_report = FALSE; - } - else + } else { p_i->scan_rsp = TRUE; + } - if (p_i->inq_count != p_inq->inq_counter) + if (p_i->inq_count != p_inq->inq_counter) { p_cur->device_type = BT_DEVICE_TYPE_BLE; - else + } else { p_cur->device_type |= BT_DEVICE_TYPE_BLE; + } - if (evt_type != BTM_BLE_SCAN_RSP_EVT) + if (evt_type != BTM_BLE_SCAN_RSP_EVT) { p_cur->ble_evt_type = evt_type; + } p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */ - if (p_le_inq_cb->adv_len != 0) - { - if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL) + if (p_le_inq_cb->adv_len != 0) { + if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL) { p_cur->flag = * p_flag; + } } - if (p_le_inq_cb->adv_len != 0) - { + if (p_le_inq_cb->adv_len != 0) { /* Check to see the BLE device has the Appearance UUID in the advertising data. If it does * then try to convert the appearance value to a class of device value Bluedroid can use. * Otherwise fall back to trying to infer if it is a HID device based on the service class. */ p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len); - if (p_uuid16 && len == 2) - { + if (p_uuid16 && len == 2) { btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class); - } - else - { + } else { if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, - BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL) - { + BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL) { UINT8 i; - for (i = 0; i + 2 <= len; i = i + 2) - { + for (i = 0; i + 2 <= len; i = i + 2) { /* if this BLE device support HID over LE, set HID Major in class of device */ - if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID) - { + if ((p_uuid16[i] | (p_uuid16[i + 1] << 8)) == UUID_SERVCLASS_LE_HID) { p_cur->dev_class[0] = 0; p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL; p_cur->dev_class[2] = 0; @@ -2745,18 +2629,14 @@ BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_t /* if BR/EDR not supported is not set, assume is a DUMO device */ if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 && - evt_type != BTM_BLE_CONNECT_DIR_EVT) - { - if (p_cur->ble_addr_type != BLE_ADDR_RANDOM) - { + evt_type != BTM_BLE_CONNECT_DIR_EVT) { + if (p_cur->ble_addr_type != BLE_ADDR_RANDOM) { BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO"); p_cur->device_type |= BT_DEVICE_TYPE_DUMO; } else { BTM_TRACE_DEBUG("Random address, treating device as LE only"); } - } - else - { + } else { BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device"); } @@ -2779,13 +2659,13 @@ void btm_clear_all_pending_le_entry(void) UINT16 xx; tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db; - for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) - { + for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { /* mark all pending LE entry as unused if an LE only device has scan response outstanding */ if ((p_ent->in_use) && - (p_ent->inq_info.results.device_type == BT_DEVICE_TYPE_BLE) && - !p_ent->scan_rsp) + (p_ent->inq_info.results.device_type == BT_DEVICE_TYPE_BLE) && + !p_ent->scan_rsp) { p_ent->in_use = FALSE; + } } } @@ -2807,26 +2687,27 @@ void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_dat UNUSED(addr_type); if (btm_cb.ble_ctr_cb.p_select_cback == NULL || - /* non-connectable device */ - (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV)) + /* non-connectable device */ + (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV)) { return; + } STREAM_TO_UINT8 (data_len, p_data); /* get the device name if exist in ADV data */ - if (data_len != 0) - { + if (data_len != 0) { p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len); - if (p_dev_name == NULL) + if (p_dev_name == NULL) { p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len); + } - if (p_dev_name) + if (p_dev_name) { memcpy(remname, p_dev_name, len); + } } /* allow connection */ - if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname)) - { + if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname)) { /* terminate selective connection, initiate connection */ btm_ble_initiate_select_conn(remote_bda); } @@ -2857,31 +2738,30 @@ void btm_ble_process_adv_pkt (UINT8 *p_data) #endif /* Only process the results if the inquiry is still active */ - if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) + if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { return; + } /* Extract the number of reports in this event. */ STREAM_TO_UINT8(num_reports, p); - while (num_reports--) - { + while (num_reports--) { /* Extract inquiry results */ STREAM_TO_UINT8 (evt_type, p); STREAM_TO_UINT8 (addr_type, p); STREAM_TO_BDADDR (bda, p); - + //BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n", + // bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]); #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) /* map address to security record */ match = btm_identity_addr_to_random_pseudo(bda, &addr_type, FALSE); - BTM_TRACE_DEBUG("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x", - bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]); + // BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n", + // bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]); /* always do RRA resolution on host */ - if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) - { + if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) { btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data); - } - else + } else #endif btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p); @@ -2917,69 +2797,59 @@ static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt p_i = btm_inq_db_find (bda); /* Check if this address has already been processed for this inquiry */ - if (btm_inq_find_bdaddr(bda)) - { + if (btm_inq_find_bdaddr(bda)) { /* never been report as an LE device */ if (p_i && - (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) || - /* scan repsonse to be updated */ - (!p_i->scan_rsp))) - { + (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) || + /* scan repsonse to be updated */ + (!p_i->scan_rsp))) { update = TRUE; - } - else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) - { + } else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) { update = FALSE; - } - else - { + } else { /* if yes, skip it */ return; /* assumption: one result per event */ } } /* If existing entry, use that, else get a new one (possibly reusing the oldest) */ - if (p_i == NULL) - { - if ((p_i = btm_inq_db_new (bda)) != NULL) - { + if (p_i == NULL) { + if ((p_i = btm_inq_db_new (bda)) != NULL) { p_inq->inq_cmpl_info.num_resp++; - } - else + } else { return; - } - else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */ - { + } + } else if (p_i->inq_count != p_inq->inq_counter) { /* first time seen in this inquiry */ p_inq->inq_cmpl_info.num_resp++; } /* update the LE device information in inquiry database */ - if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p)) - return; - - if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0) - { - LOG_WARN("%s device is no longer discoverable so discarding advertising packet pkt", - __func__); + if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p)) { return; } - if (!update) + + if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0) { + LOG_WARN("%s device is no longer discoverable so discarding advertising packet pkt", + __func__); + return; + } + if (!update) { result &= ~BTM_BLE_INQ_RESULT; + } /* If the number of responses found and limited, issue a cancel inquiry */ if (p_inq->inqparms.max_resps && - p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps) - { + p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps) { /* new device */ if (p_i == NULL || - /* assume a DUMO device, BR/EDR inquiry is always active */ - (p_i && - (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE && - p_i->scan_rsp)) - { + /* assume a DUMO device, BR/EDR inquiry is always active */ + (p_i && + (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE && + p_i->scan_rsp)) { BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry.."); /* if is non-periodic inquiry active, cancel now */ if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 && - (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0) + (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0) { btsnd_hcic_inq_cancel(); + } btm_ble_stop_inquiry(); @@ -2987,23 +2857,17 @@ static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt } } /* background connection in selective connection mode */ - if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) - { - if (result & BTM_BLE_SEL_CONN_RESULT) + if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) { + if (result & BTM_BLE_SEL_CONN_RESULT) { btm_send_sel_conn_callback(bda, evt_type, p, addr_type); - else - { - BTM_TRACE_DEBUG("None LE device, can not initiate selective connection"); + } else { + BTM_TRACE_DEBUG("None LE device, can not initiate selective connection\n"); } - } - else - { - if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT)) - { + } else { + if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT)) { (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache); } - if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT)) - { + if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT)) { (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache); } } @@ -3024,16 +2888,14 @@ tBTM_STATUS btm_ble_start_scan(void) tBTM_STATUS status = BTM_CMD_STARTED; /* start scan, disable duplicate filtering */ - if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, p_inq->scan_duplicate_filter)) - { + if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, p_inq->scan_duplicate_filter)) { status = BTM_NO_RESOURCES; - } - else - { - if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI) + } else { + if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI) { btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT); - else + } else { btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT); + } } return status; } @@ -3080,11 +2942,10 @@ void btm_ble_stop_inquiry(void) p_ble_cb->scan_activity &= ~BTM_BLE_INQUIRY_MASK; /* If no more scan activity, stop LE scan now */ - if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) + if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) { btm_ble_stop_scan(); - else if((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) || - (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) - { + } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) || + (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) { BTM_TRACE_DEBUG("%s: setting default params for ongoing observe", __FUNCTION__); btm_ble_stop_scan(); btm_ble_start_scan(); @@ -3092,7 +2953,7 @@ void btm_ble_stop_inquiry(void) /* If we have a callback registered for inquiry complete, call it */ BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d", - p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp); + p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp); btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK)); } @@ -3118,11 +2979,13 @@ static void btm_ble_stop_observe(void) p_ble_cb->p_obs_results_cb = NULL; p_ble_cb->p_obs_cmpl_cb = NULL; - if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) + if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) { btm_ble_stop_scan(); + } - if (p_obs_cb) + if (p_obs_cb) { (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info); + } } /******************************************************************************* ** @@ -3138,8 +3001,7 @@ static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UI { BOOLEAN rt = FALSE; - switch (adv_evt) - { + switch (adv_evt) { case BTM_BLE_CONNECT_EVT: rt = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT); break; @@ -3181,32 +3043,31 @@ tBTM_STATUS btm_ble_start_adv(void) { tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; tBTM_STATUS rt = BTM_NO_RESOURCES; - BTM_TRACE_EVENT ("btm_ble_start_adv\n"); - if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type)) + BTM_TRACE_EVENT ("btm_ble_start_adv\n"); + if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type)) { return BTM_WRONG_MODE; + } #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) /* To relax resolving list, always have resolving list enabled, unless directed adv */ if (p_cb->evt_type != BTM_BLE_CONNECT_LO_DUTY_DIR_EVT && - p_cb->evt_type != BTM_BLE_CONNECT_DIR_EVT) + p_cb->evt_type != BTM_BLE_CONNECT_DIR_EVT) /* enable resolving list is desired */ - btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_ADV); -#endif - if (p_cb->afp != AP_SCAN_CONN_ALL) { + btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_ADV); + } +#endif + if (p_cb->afp != AP_SCAN_CONN_ALL) { btm_execute_wl_dev_operation(); btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV; } - if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE)) - { - p_cb->adv_mode = BTM_BLE_ADV_ENABLE; - btm_ble_adv_states_operation(btm_ble_set_topology_mask, p_cb->evt_type); - rt = BTM_SUCCESS; - BTM_TRACE_EVENT ("BTM_SUCCESS\n"); - } - else - { + if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE)) { + p_cb->adv_mode = BTM_BLE_ADV_ENABLE; + btm_ble_adv_states_operation(btm_ble_set_topology_mask, p_cb->evt_type); + rt = BTM_SUCCESS; + BTM_TRACE_EVENT ("BTM_SUCCESS\n"); + } else { p_cb->adv_mode = BTM_BLE_ADV_DISABLE; btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV; } @@ -3227,19 +3088,17 @@ tBTM_STATUS btm_ble_stop_adv(void) tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; tBTM_STATUS rt = BTM_SUCCESS; - if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) - { - if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE)) - { + if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) { + if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE)) { p_cb->fast_adv_on = FALSE; p_cb->adv_mode = BTM_BLE_ADV_DISABLE; btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV; /* clear all adv states */ btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK); - } - else + } else { rt = BTM_NO_RESOURCES; + } } return rt; } @@ -3258,8 +3117,7 @@ static void btm_ble_start_slow_adv (void) { tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; - if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) - { + if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) { tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb; BD_ADDR p_addr_ptr = {0}; tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC; @@ -3268,7 +3126,7 @@ static void btm_ble_start_slow_adv (void) btm_ble_stop_adv(); p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, - &own_addr_type); + &own_addr_type); /* slow adv mode never goes into directed adv */ btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT, BTM_BLE_GAP_ADV_SLOW_INT, @@ -3292,45 +3150,41 @@ void btm_ble_timeout(TIMER_LIST_ENT *p_tle) { BTM_TRACE_EVENT ("btm_ble_timeout"); - switch (p_tle->event) - { - case BTU_TTYPE_BLE_OBSERVE: - btm_ble_stop_observe(); - break; + switch (p_tle->event) { + case BTU_TTYPE_BLE_OBSERVE: + btm_ble_stop_observe(); + break; - case BTU_TTYPE_BLE_INQUIRY: - btm_ble_stop_inquiry(); - break; + case BTU_TTYPE_BLE_INQUIRY: + btm_ble_stop_inquiry(); + break; - case BTU_TTYPE_BLE_GAP_LIM_DISC: - /* lim_timeout expiried, limited discovery should exit now */ - btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE; - btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode); - break; + case BTU_TTYPE_BLE_GAP_LIM_DISC: + /* lim_timeout expiried, limited discovery should exit now */ + btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE; + btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode); + break; - case BTU_TTYPE_BLE_RANDOM_ADDR: - if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM) - { - if (NULL == (void *)(p_tle->param)) - { - /* refresh the random addr */ - btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low); - } - else - { - if (BTM_BleMaxMultiAdvInstanceCount() > 0) - btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param); + case BTU_TTYPE_BLE_RANDOM_ADDR: + if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM) { + if (NULL == (void *)(p_tle->param)) { + /* refresh the random addr */ + btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low); + } else { + if (BTM_BleMaxMultiAdvInstanceCount() > 0) { + btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST *)p_tle->param); } } - break; + } + break; - case BTU_TTYPE_BLE_GAP_FAST_ADV: - /* fast adv is completed, fall back to slow adv interval */ - btm_ble_start_slow_adv(); - break; + case BTU_TTYPE_BLE_GAP_FAST_ADV: + /* fast adv is completed, fall back to slow adv interval */ + btm_ble_start_slow_adv(); + break; - default: - break; + default: + break; } } @@ -3360,15 +3214,12 @@ void btm_ble_read_remote_features_complete(UINT8 *p) // if LE read remote feature failed for HCI_ERR_CONN_FAILED_ESTABLISHMENT, // expect disconnect complete to be received - if (status != HCI_ERR_CONN_FAILED_ESTABLISHMENT) - { + if (status != HCI_ERR_CONN_FAILED_ESTABLISHMENT) { STREAM_TO_UINT16 (handle, p); /* Look up the connection by handle and copy features */ - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++) - { - if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle)) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++) { + if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle)) { STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN); btsnd_hcic_rmt_ver_req (p_acl_cb->hci_handle); break; @@ -3387,13 +3238,12 @@ void btm_ble_read_remote_features_complete(UINT8 *p) ** Returns void ** *******************************************************************************/ -void btm_ble_write_adv_enable_complete(UINT8 * p) +void btm_ble_write_adv_enable_complete(UINT8 *p) { tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; /* if write adv enable/disbale not succeed */ - if (*p != HCI_SUCCESS) - { + if (*p != HCI_SUCCESS) { /* toggle back the adv mode */ p_cb->adv_mode = !p_cb->adv_mode; } @@ -3461,19 +3311,21 @@ void btm_ble_update_link_topology_mask(UINT8 link_role, BOOLEAN increase) { btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_CONN_MASK); - if (increase) + if (increase) { btm_cb.ble_ctr_cb.link_count[link_role]++; - else if (btm_cb.ble_ctr_cb.link_count[link_role] > 0) + } else if (btm_cb.ble_ctr_cb.link_count[link_role] > 0) { btm_cb.ble_ctr_cb.link_count[link_role]--; + } - if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_MASTER]) + if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_MASTER]) { btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT); + } - if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_SLAVE]) + if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_SLAVE]) { btm_ble_set_topology_mask(BTM_BLE_STATE_SLAVE_BIT); + } - if (link_role == HCI_ROLE_SLAVE && increase) - { + if (link_role == HCI_ROLE_SLAVE && increase) { btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE; /* make device fall back into undirected adv mode by default */ btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT; @@ -3494,8 +3346,7 @@ void btm_ble_update_link_topology_mask(UINT8 link_role, BOOLEAN increase) *******************************************************************************/ void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status) { - if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) - { + if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) { btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE; /* make device fall back into undirected adv mode by default */ btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT; @@ -3503,8 +3354,7 @@ void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 statu btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK); } - if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) - { + if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) { btm_ble_set_connectability(btm_cb.btm_inq_vars.connectable_mode | btm_cb.ble_ctr_cb.inq_var.connectable_mode); } @@ -3513,9 +3363,8 @@ void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 statu due to resource limitation, start next direct connection or background connection now in order */ if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES && - !btm_send_pending_direct_conn()) - { - btm_ble_resume_bg_conn(); + !btm_send_pending_direct_conn()) { + btm_ble_resume_bg_conn(); } } @@ -3578,27 +3427,24 @@ BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask) /* check only one bit is set and within valid range */ if (request_state_mask == BTM_BLE_STATE_INVALID || - request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT || - (request_state_mask & (request_state_mask -1 )) != 0) - { + request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT || + (request_state_mask & (request_state_mask - 1 )) != 0) { BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask); return rt; } - while (request_state_mask) - { + while (request_state_mask) { request_state_mask >>= 1; request_state ++; } /* check if the requested state is supported or not */ mask = btm_le_state_combo_tbl[0][request_state - 1][0]; - offset = btm_le_state_combo_tbl[0][request_state-1][1]; + offset = btm_le_state_combo_tbl[0][request_state - 1][1]; const uint8_t *ble_supported_states = controller_get_interface()->get_ble_supported_states(); - if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) - { + if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) { BTM_TRACE_ERROR("state requested not supported: %d", request_state); return rt; } @@ -3606,17 +3452,13 @@ BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask) rt = TRUE; /* make sure currently active states are all supported in conjunction with the requested state. If the bit in table is not set, the combination is not supported */ - while (cur_states != 0) - { - if (cur_states & 0x01) - { + while (cur_states != 0) { + if (cur_states & 0x01) { mask = btm_le_state_combo_tbl[request_state][state_offset][0]; offset = btm_le_state_combo_tbl[request_state][state_offset][1]; - if (mask != 0 && offset != 0) - { - if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) - { + if (mask != 0 && offset != 0) { + if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) { rt = FALSE; break; } diff --git a/components/bt/bluedroid/stack/btm/btm_ble_multi_adv.c b/components/bt/bluedroid/stack/btm/btm_ble_multi_adv.c old mode 100755 new mode 100644 index dd7876bf5..cb273ef9d --- a/components/bt/bluedroid/stack/btm/btm_ble_multi_adv.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_multi_adv.c @@ -52,7 +52,7 @@ tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q; ** Externs ************************************************************************************/ extern void btm_ble_update_dmt_flag_bits(UINT8 *flag_value, - const UINT16 connect_mode, const UINT16 disc_mode); + const UINT16 connect_mode, const UINT16 disc_mode); /******************************************************************************* ** @@ -70,7 +70,7 @@ void btm_ble_multi_adv_enq_op_q(UINT8 opcode, UINT8 inst_id, UINT8 cb_evt) p_op_q->p_inst_id[p_op_q->next_idx] = inst_id; - p_op_q->p_sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4)); + p_op_q->p_sub_code[p_op_q->next_idx] = (opcode | (cb_evt << 4)); p_op_q->next_idx = (p_op_q->next_idx + 1) % BTM_BleMaxMultiAdvInstanceCount(); } @@ -115,8 +115,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params) tBTM_BLE_MULTI_ADV_INST *p_inst ; UINT8 cb_evt = 0, opcode; - if (len < 2) - { + if (len < 2) { BTM_TRACE_ERROR("wrong length for btm_ble_multi_adv_vsc_cmpl_cback"); return; } @@ -128,56 +127,49 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params) BTM_TRACE_DEBUG("op_code = %02x inst_id = %d cb_evt = %02x", opcode, inst_id, cb_evt); - if (opcode != subcode || inst_id == 0) - { - BTM_TRACE_ERROR("get unexpected VSC cmpl, expect: %d get: %d",subcode,opcode); + if (opcode != subcode || inst_id == 0) { + BTM_TRACE_ERROR("get unexpected VSC cmpl, expect: %d get: %d", subcode, opcode); return; } p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1]; - switch (subcode) - { - case BTM_BLE_MULTI_ADV_ENB: - { - BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status); + switch (subcode) { + case BTM_BLE_MULTI_ADV_ENB: { + BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status); - /* Mark as not in use here, if instance cannot be enabled */ - if (HCI_SUCCESS != status && BTM_BLE_MULTI_ADV_ENB_EVT == cb_evt) - btm_multi_adv_cb.p_adv_inst[inst_id-1].in_use = FALSE; - break; + /* Mark as not in use here, if instance cannot be enabled */ + if (HCI_SUCCESS != status && BTM_BLE_MULTI_ADV_ENB_EVT == cb_evt) { + btm_multi_adv_cb.p_adv_inst[inst_id - 1].in_use = FALSE; } - - case BTM_BLE_MULTI_ADV_SET_PARAM: - { - BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_PARAM status = %d", status); - break; - } - - case BTM_BLE_MULTI_ADV_WRITE_ADV_DATA: - { - BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_ADV_DATA status = %d", status); - break; - } - - case BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA: - { - BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA status = %d", status); - break; - } - - case BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR: - { - BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR status = %d", status); - break; - } - - default: - break; + break; } - if (cb_evt != 0 && p_inst->p_cback != NULL) - { + case BTM_BLE_MULTI_ADV_SET_PARAM: { + BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_PARAM status = %d", status); + break; + } + + case BTM_BLE_MULTI_ADV_WRITE_ADV_DATA: { + BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_ADV_DATA status = %d", status); + break; + } + + case BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA: { + BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA status = %d", status); + break; + } + + case BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR: { + BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR status = %d", status); + break; + } + + default: + break; + } + + if (cb_evt != 0 && p_inst->p_cback != NULL) { (p_inst->p_cback)(cb_evt, inst_id, p_inst->p_ref, status); } return; @@ -198,7 +190,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params) tBTM_STATUS btm_ble_enable_multi_adv (BOOLEAN enable, UINT8 inst_id, UINT8 cb_evt) { UINT8 param[BTM_BLE_MULTI_ADV_ENB_LEN], *pp; - UINT8 enb = enable ? 1: 0; + UINT8 enb = enable ? 1 : 0; tBTM_STATUS rt; pp = param; @@ -208,14 +200,13 @@ tBTM_STATUS btm_ble_enable_multi_adv (BOOLEAN enable, UINT8 inst_id, UINT8 cb_ev UINT8_TO_STREAM (pp, enb); UINT8_TO_STREAM (pp, inst_id); - BTM_TRACE_EVENT (" btm_ble_enable_multi_adv: enb %d, Inst ID %d",enb,inst_id); + BTM_TRACE_EVENT (" btm_ble_enable_multi_adv: enb %d, Inst ID %d", enb, inst_id); if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF, - BTM_BLE_MULTI_ADV_ENB_LEN, - param, - btm_ble_multi_adv_vsc_cmpl_cback)) - == BTM_CMD_STARTED) - { + BTM_BLE_MULTI_ADV_ENB_LEN, + param, + btm_ble_multi_adv_vsc_cmpl_cback)) + == BTM_CMD_STARTED) { btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_ENB, inst_id, cb_evt); } return rt; @@ -234,8 +225,9 @@ tBTM_STATUS btm_ble_enable_multi_adv (BOOLEAN enable, UINT8 inst_id, UINT8 cb_ev int btm_ble_tx_power[BTM_BLE_ADV_TX_POWER_MAX + 1] = BTM_BLE_ADV_TX_POWER; char btm_ble_map_adv_tx_power(int tx_power_index) { - if(0 <= tx_power_index && tx_power_index < BTM_BLE_ADV_TX_POWER_MAX) + if (0 <= tx_power_index && tx_power_index < BTM_BLE_ADV_TX_POWER_MAX) { return (char)btm_ble_tx_power[tx_power_index]; + } return 0; } /******************************************************************************* @@ -250,12 +242,12 @@ char btm_ble_map_adv_tx_power(int tx_power_index) ** *******************************************************************************/ tBTM_STATUS btm_ble_multi_adv_set_params (tBTM_BLE_MULTI_ADV_INST *p_inst, - tBTM_BLE_ADV_PARAMS *p_params, - UINT8 cb_evt) + tBTM_BLE_ADV_PARAMS *p_params, + UINT8 cb_evt) { UINT8 param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN], *pp; tBTM_STATUS rt; - BD_ADDR dummy ={0,0,0,0,0,0}; + BD_ADDR dummy = {0, 0, 0, 0, 0, 0}; pp = param; memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN); @@ -267,12 +259,10 @@ tBTM_STATUS btm_ble_multi_adv_set_params (tBTM_BLE_MULTI_ADV_INST *p_inst, UINT8_TO_STREAM (pp, p_params->adv_type); #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) - { + if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { UINT8_TO_STREAM (pp, BLE_ADDR_RANDOM); BDADDR_TO_STREAM (pp, p_inst->rpa); - } - else + } else #endif { UINT8_TO_STREAM (pp, BLE_ADDR_PUBLIC); @@ -280,43 +270,44 @@ tBTM_STATUS btm_ble_multi_adv_set_params (tBTM_BLE_MULTI_ADV_INST *p_inst, } BTM_TRACE_EVENT (" btm_ble_multi_adv_set_params,Min %d, Max %d,adv_type %d", - p_params->adv_int_min,p_params->adv_int_max,p_params->adv_type); + p_params->adv_int_min, p_params->adv_int_max, p_params->adv_type); UINT8_TO_STREAM (pp, 0); BDADDR_TO_STREAM (pp, dummy); - if (p_params->channel_map == 0 || p_params->channel_map > BTM_BLE_DEFAULT_ADV_CHNL_MAP) + if (p_params->channel_map == 0 || p_params->channel_map > BTM_BLE_DEFAULT_ADV_CHNL_MAP) { p_params->channel_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP; + } UINT8_TO_STREAM (pp, p_params->channel_map); - if (p_params->adv_filter_policy >= AP_SCAN_CONN_POLICY_MAX) + if (p_params->adv_filter_policy >= AP_SCAN_CONN_POLICY_MAX) { p_params->adv_filter_policy = AP_SCAN_CONN_ALL; + } UINT8_TO_STREAM (pp, p_params->adv_filter_policy); UINT8_TO_STREAM (pp, p_inst->inst_id); - if (p_params->tx_power > BTM_BLE_ADV_TX_POWER_MAX) + if (p_params->tx_power > BTM_BLE_ADV_TX_POWER_MAX) { p_params->tx_power = BTM_BLE_ADV_TX_POWER_MAX; + } UINT8_TO_STREAM (pp, btm_ble_map_adv_tx_power(p_params->tx_power)); BTM_TRACE_EVENT("set_params:Chnl Map %d,adv_fltr policy %d,ID:%d, TX Power%d", - p_params->channel_map,p_params->adv_filter_policy,p_inst->inst_id,p_params->tx_power); + p_params->channel_map, p_params->adv_filter_policy, p_inst->inst_id, p_params->tx_power); if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF, - BTM_BLE_MULTI_ADV_SET_PARAM_LEN, - param, - btm_ble_multi_adv_vsc_cmpl_cback)) - == BTM_CMD_STARTED) - { + BTM_BLE_MULTI_ADV_SET_PARAM_LEN, + param, + btm_ble_multi_adv_vsc_cmpl_cback)) + == BTM_CMD_STARTED) { p_inst->adv_evt = p_params->adv_type; #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) - { + if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) { /* start timer */ p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst; btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, - BTM_BLE_PRIVATE_ADDR_INT); + BTM_BLE_PRIVATE_ADDR_INT); } #endif btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_PARAM, p_inst->inst_id, cb_evt); @@ -342,8 +333,8 @@ tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADD tBTM_STATUS rt; BTM_TRACE_EVENT ("%s-BD_ADDR:%02x-%02x-%02x-%02x-%02x-%02x,inst_id:%d", - __FUNCTION__, random_addr[5], random_addr[4], random_addr[3], random_addr[2], - random_addr[1], random_addr[0], p_inst->inst_id); + __FUNCTION__, random_addr[5], random_addr[4], random_addr[3], random_addr[2], + random_addr[1], random_addr[0], p_inst->inst_id); memset(param, 0, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN); @@ -352,15 +343,14 @@ tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADD UINT8_TO_STREAM(pp, p_inst->inst_id); if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF, - BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN, - param, - btm_ble_multi_adv_vsc_cmpl_cback)) == BTM_CMD_STARTED) - { + BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN, + param, + btm_ble_multi_adv_vsc_cmpl_cback)) == BTM_CMD_STARTED) { /* start a periodical timer to refresh random addr */ btu_stop_timer_oneshot(&p_inst->raddr_timer_ent); p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst; btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR, - BTM_BLE_PRIVATE_ADDR_INT); + BTM_BLE_PRIVATE_ADDR_INT); btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR, p_inst->inst_id, 0); } @@ -384,22 +374,16 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p) UINT8 index = 0; tBTM_BLE_MULTI_ADV_INST *p_inst = NULL; - /* Retrieve the index of adv instance from stored Q */ - if (btm_multi_adv_idx_q.front == -1) - { + /* Retrieve the index of adv instance from stored Q */ + if (btm_multi_adv_idx_q.front == -1) { BTM_TRACE_ERROR(" %s can't locate advertise instance", __FUNCTION__); return; - } - else - { + } else { index = btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.front]; - if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear) - { + if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear) { btm_multi_adv_idx_q.front = -1; btm_multi_adv_idx_q.rear = -1; - } - else - { + } else { btm_multi_adv_idx_q.front = (btm_multi_adv_idx_q.front + 1) % BTM_BLE_MULTI_ADV_MAX; } } @@ -407,8 +391,7 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p) p_inst = &(btm_multi_adv_cb.p_adv_inst[index]); BTM_TRACE_EVENT ("btm_ble_multi_adv_gen_rpa_cmpl inst_id = %d", p_inst->inst_id); - if (p) - { + if (p) { p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK); p->param_buf[2] |= BLE_RESOLVE_ADDR_MSB; @@ -416,12 +399,9 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p) p_inst->rpa[1] = p->param_buf[1]; p_inst->rpa[0] = p->param_buf[2]; - if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output)) - { + if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output)) { BTM_TRACE_DEBUG("generate random address failed"); - } - else - { + } else { /* set hash to be LSB of rpAddress */ p_inst->rpa[5] = output.param_buf[0]; p_inst->rpa[4] = output.param_buf[1]; @@ -429,8 +409,7 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p) } if (p_inst->inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD && - p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()) - { + p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()) { /* set it to controller */ btm_ble_multi_adv_write_rpa(p_inst, p_inst->rpa); } @@ -451,20 +430,14 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p) *******************************************************************************/ void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst) { - if (btm_multi_adv_idx_q.front == (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX) - { + if (btm_multi_adv_idx_q.front == (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX) { BTM_TRACE_ERROR("outstanding rand generation exceeded max allowed "); return; - } - else - { - if (btm_multi_adv_idx_q.front == -1) - { + } else { + if (btm_multi_adv_idx_q.front == -1) { btm_multi_adv_idx_q.front = 0; btm_multi_adv_idx_q.rear = 0; - } - else - { + } else { btm_multi_adv_idx_q.rear = (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX; } btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.rear] = p_inst->index; @@ -487,17 +460,16 @@ void btm_ble_multi_adv_reenable(UINT8 inst_id) { tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1]; - if (TRUE == p_inst->in_use) - { - if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT) + if (TRUE == p_inst->in_use) { + if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT) { btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, 0); - else - /* mark directed adv as disabled if adv has been stopped */ + } else + /* mark directed adv as disabled if adv has been stopped */ { - (p_inst->p_cback)(BTM_BLE_MULTI_ADV_DISABLE_EVT,p_inst->inst_id,p_inst->p_ref,0); - p_inst->in_use = FALSE; + (p_inst->p_cback)(BTM_BLE_MULTI_ADV_DISABLE_EVT, p_inst->inst_id, p_inst->p_ref, 0); + p_inst->in_use = FALSE; } - } + } } /******************************************************************************* @@ -516,13 +488,13 @@ void btm_ble_multi_adv_enb_privacy(BOOLEAN enable) UINT8 i; tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0]; - for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++) - { + for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++) { p_inst->in_use = FALSE; - if (enable) + if (enable) { btm_ble_multi_adv_configure_rpa (p_inst); - else + } else { btu_stop_timer_oneshot(&p_inst->raddr_timer_ent); + } } } @@ -542,7 +514,7 @@ void btm_ble_multi_adv_enb_privacy(BOOLEAN enable) ** *******************************************************************************/ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params, - tBTM_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref) + tBTM_BLE_MULTI_ADV_CBACK *p_cback, void *p_ref) { UINT8 i; tBTM_STATUS rt = BTM_NO_RESOURCES; @@ -550,45 +522,39 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params, BTM_TRACE_EVENT("BTM_BleEnableAdvInstance called"); - if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max) - { + if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max) { BTM_TRACE_ERROR("Controller does not support Multi ADV"); return BTM_ERR_PROCESSING; } - if (NULL == p_inst) - { + if (NULL == p_inst) { BTM_TRACE_ERROR("Invalid instance in BTM_BleEnableAdvInstance"); return BTM_ERR_PROCESSING; } - for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++) - { - if (FALSE == p_inst->in_use) - { + for (i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++) { + if (FALSE == p_inst->in_use) { p_inst->in_use = TRUE; /* configure adv parameter */ - if (p_params) + if (p_params) { rt = btm_ble_multi_adv_set_params(p_inst, p_params, 0); - else + } else { rt = BTM_CMD_STARTED; + } /* enable adv */ BTM_TRACE_EVENT("btm_ble_enable_multi_adv being called with inst_id:%d", - p_inst->inst_id); + p_inst->inst_id); - if (BTM_CMD_STARTED == rt) - { + if (BTM_CMD_STARTED == rt) { if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, - BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED) - { + BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED) { p_inst->p_cback = p_cback; p_inst->p_ref = p_ref; } } - if (BTM_CMD_STARTED != rt) - { + if (BTM_CMD_STARTED != rt) { p_inst->in_use = FALSE; BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed"); } @@ -618,26 +584,24 @@ tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_par BTM_TRACE_EVENT("BTM_BleUpdateAdvInstParam called with inst_id:%d", inst_id); - if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max) - { + if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max) { BTM_TRACE_ERROR("Controller does not support Multi ADV"); return BTM_ERR_PROCESSING; } if (inst_id < BTM_BleMaxMultiAdvInstanceCount() && - inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD && - p_params != NULL) - { - if (FALSE == p_inst->in_use) - { + inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD && + p_params != NULL) { + if (FALSE == p_inst->in_use) { BTM_TRACE_DEBUG("adv instance %d is not active", inst_id); return BTM_WRONG_MODE; - } - else + } else { btm_ble_enable_multi_adv(FALSE, inst_id, 0); + } - if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0)) + if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0)) { rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT); + } } return rt; } @@ -658,30 +622,30 @@ tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_par ** *******************************************************************************/ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, - tBTM_BLE_AD_MASK data_mask, - tBTM_BLE_ADV_DATA *p_data) + tBTM_BLE_AD_MASK data_mask, + tBTM_BLE_ADV_DATA *p_data) { UINT8 param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN], *pp = param; UINT8 sub_code = (is_scan_rsp) ? BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA : BTM_BLE_MULTI_ADV_WRITE_ADV_DATA; UINT8 *p_len; tBTM_STATUS rt; - UINT8 *pp_temp = (UINT8*)(param + BTM_BLE_MULTI_ADV_WRITE_DATA_LEN -1); + UINT8 *pp_temp = (UINT8 *)(param + BTM_BLE_MULTI_ADV_WRITE_DATA_LEN - 1); tBTM_BLE_VSC_CB cmn_ble_vsc_cb; BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.adv_inst_max) - { + if (0 == cmn_ble_vsc_cb.adv_inst_max) { BTM_TRACE_ERROR("Controller does not support Multi ADV"); return BTM_ERR_PROCESSING; } btm_ble_update_dmt_flag_bits(&p_data->flag, btm_cb.btm_inq_vars.connectable_mode, - btm_cb.btm_inq_vars.discoverable_mode); + btm_cb.btm_inq_vars.discoverable_mode); BTM_TRACE_EVENT("BTM_BleCfgAdvInstData called with inst_id:%d", inst_id); - if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD) + if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD) { return BTM_ILLEGAL_VALUE; + } memset(param, 0, BTM_BLE_MULTI_ADV_WRITE_DATA_LEN); @@ -692,11 +656,10 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, UINT8_TO_STREAM(pp_temp, inst_id); if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF, - (UINT8)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, - param, - btm_ble_multi_adv_vsc_cmpl_cback)) - == BTM_CMD_STARTED) - { + (UINT8)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, + param, + btm_ble_multi_adv_vsc_cmpl_cback)) + == BTM_CMD_STARTED) { btm_ble_multi_adv_enq_op_q(sub_code, inst_id, BTM_BLE_MULTI_ADV_DATA_EVT); } return rt; @@ -715,30 +678,27 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, *******************************************************************************/ tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id) { - tBTM_STATUS rt = BTM_ILLEGAL_VALUE; - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; + tBTM_STATUS rt = BTM_ILLEGAL_VALUE; + tBTM_BLE_VSC_CB cmn_ble_vsc_cb; - BTM_TRACE_EVENT("BTM_BleDisableAdvInstance with inst_id:%d", inst_id); + BTM_TRACE_EVENT("BTM_BleDisableAdvInstance with inst_id:%d", inst_id); - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); + BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - if (0 == cmn_ble_vsc_cb.adv_inst_max) - { - BTM_TRACE_ERROR("Controller does not support Multi ADV"); - return BTM_ERR_PROCESSING; - } + if (0 == cmn_ble_vsc_cb.adv_inst_max) { + BTM_TRACE_ERROR("Controller does not support Multi ADV"); + return BTM_ERR_PROCESSING; + } - if (inst_id < BTM_BleMaxMultiAdvInstanceCount() && - inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD) - { - if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT)) - == BTM_CMD_STARTED) - { - btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id-1]); - btu_stop_timer_oneshot(&btm_multi_adv_cb.p_adv_inst[inst_id-1].raddr_timer_ent); - btm_multi_adv_cb.p_adv_inst[inst_id-1].in_use = FALSE; - } - } + if (inst_id < BTM_BleMaxMultiAdvInstanceCount() && + inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD) { + if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT)) + == BTM_CMD_STARTED) { + btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id - 1]); + btu_stop_timer_oneshot(&btm_multi_adv_cb.p_adv_inst[inst_id - 1].raddr_timer_ent); + btm_multi_adv_cb.p_adv_inst[inst_id - 1].in_use = FALSE; + } + } return rt; } /******************************************************************************* @@ -761,35 +721,29 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p) len--; BTM_TRACE_EVENT("btm_ble_multi_adv_vse_cback called with event:%d", sub_event); - if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4)) - { + if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4)) { STREAM_TO_UINT8(adv_inst, p); ++p; STREAM_TO_UINT16(conn_handle, p); - if ((idx = btm_handle_to_acl_index(conn_handle)) != MAX_L2CAP_LINKS) - { + if ((idx = btm_handle_to_acl_index(conn_handle)) != MAX_L2CAP_LINKS) { #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE && - adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD) - { + adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD) { memcpy(btm_cb.acl_db[idx].conn_addr, btm_multi_adv_cb.p_adv_inst[adv_inst - 1].rpa, - BD_ADDR_LEN); + BD_ADDR_LEN); } #endif } if (adv_inst < BTM_BleMaxMultiAdvInstanceCount() && - adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD) - { + adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD) { BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called"); btm_ble_multi_adv_reenable(adv_inst); } /* re-enable connectibility */ - else if (adv_inst == BTM_BLE_MULTI_ADV_DEFAULT_STD) - { - if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) - { + else if (adv_inst == BTM_BLE_MULTI_ADV_DEFAULT_STD) { + if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) { btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode ); } } @@ -812,26 +766,25 @@ void btm_ble_multi_adv_init() { UINT8 i = 0; memset(&btm_multi_adv_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB)); - memset (&btm_multi_adv_idx_q,0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q)); + memset (&btm_multi_adv_idx_q, 0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q)); btm_multi_adv_idx_q.front = -1; btm_multi_adv_idx_q.rear = -1; - if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0) - { - btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST)* - (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); - memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST)* - (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); + if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0) { + btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST) * + (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); + memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST) * + (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); btm_multi_adv_cb.op_q.p_sub_code = GKI_getbuf( sizeof(UINT8) * - (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); + (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); memset(btm_multi_adv_cb.op_q.p_sub_code, 0, - sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max)); + sizeof(UINT8) * (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); btm_multi_adv_cb.op_q.p_inst_id = GKI_getbuf( sizeof(UINT8) * (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); memset(btm_multi_adv_cb.op_q.p_inst_id, 0, - sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max)); + sizeof(UINT8) * (btm_cb.cmn_ble_vsc_cb.adv_inst_max)); } /* Initialize adv instance indices and IDs. */ @@ -855,14 +808,17 @@ void btm_ble_multi_adv_init() *******************************************************************************/ void btm_ble_multi_adv_cleanup(void) { - if (btm_multi_adv_cb.p_adv_inst) + if (btm_multi_adv_cb.p_adv_inst) { GKI_freebuf(btm_multi_adv_cb.p_adv_inst); + } - if (btm_multi_adv_cb.op_q.p_sub_code) - GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code); + if (btm_multi_adv_cb.op_q.p_sub_code) { + GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code); + } - if (btm_multi_adv_cb.op_q.p_inst_id) + if (btm_multi_adv_cb.op_q.p_inst_id) { GKI_freebuf(btm_multi_adv_cb.op_q.p_inst_id); + } } @@ -877,15 +833,15 @@ void btm_ble_multi_adv_cleanup(void) ** Returns void* ** *******************************************************************************/ -void* btm_ble_multi_adv_get_ref(UINT8 inst_id) +void *btm_ble_multi_adv_get_ref(UINT8 inst_id) { tBTM_BLE_MULTI_ADV_INST *p_inst = NULL; - if (inst_id < BTM_BleMaxMultiAdvInstanceCount()) - { + if (inst_id < BTM_BleMaxMultiAdvInstanceCount()) { p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1]; - if (NULL != p_inst) + if (NULL != p_inst) { return p_inst->p_ref; + } } return NULL; diff --git a/components/bt/bluedroid/stack/btm/btm_ble_privacy.c b/components/bt/bluedroid/stack/btm/btm_ble_privacy.c old mode 100755 new mode 100644 index e0bbcf89d..08870d9e7 --- a/components/bt/bluedroid/stack/btm/btm_ble_privacy.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_privacy.c @@ -91,11 +91,11 @@ BOOLEAN btm_ble_brcm_find_resolving_pending_entry(BD_ADDR pseudo_addr, UINT8 act { tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; - for (UINT8 i = p_q->q_pending; i != p_q->q_next;) - { + for (UINT8 i = p_q->q_pending; i != p_q->q_next;) { if (memcmp(p_q->resolve_q_random_pseudo[i], pseudo_addr, BD_ADDR_LEN) == 0 && - action == p_q->resolve_q_action[i]) + action == p_q->resolve_q_action[i]) { return TRUE; + } i ++; i %= controller_get_interface()->get_ble_resolving_list_max_size(); @@ -118,8 +118,7 @@ BOOLEAN btm_ble_deq_resolving_pending(BD_ADDR pseudo_addr) { tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; - if (p_q->q_next != p_q->q_pending) - { + if (p_q->q_next != p_q->q_pending) { memcpy(pseudo_addr, p_q->resolve_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN); memset(p_q->resolve_q_random_pseudo[p_q->q_pending], 0, BD_ADDR_LEN); p_q->q_pending ++; @@ -144,11 +143,10 @@ void btm_ble_clear_irk_index(UINT8 index) UINT8 byte; UINT8 bit; - if (index < controller_get_interface()->get_ble_resolving_list_max_size()) - { - byte = index / 8; - bit = index % 8; - btm_cb.ble_ctr_cb.irk_list_mask[byte] &= (~(1 << bit)); + if (index < controller_get_interface()->get_ble_resolving_list_max_size()) { + byte = index / 8; + bit = index % 8; + btm_cb.ble_ctr_cb.irk_list_mask[byte] &= (~(1 << bit)); } } @@ -167,13 +165,11 @@ UINT8 btm_ble_find_irk_index(void) UINT8 byte; UINT8 bit; - while (i < controller_get_interface()->get_ble_resolving_list_max_size()) - { + while (i < controller_get_interface()->get_ble_resolving_list_max_size()) { byte = i / 8; bit = i % 8; - if ((btm_cb.ble_ctr_cb.irk_list_mask[byte] & (1 << bit)) == 0) - { + if ((btm_cb.ble_ctr_cb.irk_list_mask[byte] & (1 << bit)) == 0) { btm_cb.ble_ctr_cb.irk_list_mask[byte] |= (1 << bit); return i; } @@ -196,23 +192,21 @@ UINT8 btm_ble_find_irk_index(void) void btm_ble_update_resolving_list(BD_ADDR pseudo_bda, BOOLEAN add) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_bda); - if (p_dev_rec == NULL) + if (p_dev_rec == NULL) { return; - - if (add) - { - p_dev_rec->ble.in_controller_list |= BTM_RESOLVING_LIST_BIT; - if (!controller_get_interface()->supports_ble_privacy()) - p_dev_rec->ble.resolving_list_index = btm_ble_find_irk_index(); } - else - { + + if (add) { + p_dev_rec->ble.in_controller_list |= BTM_RESOLVING_LIST_BIT; + if (!controller_get_interface()->supports_ble_privacy()) { + p_dev_rec->ble.resolving_list_index = btm_ble_find_irk_index(); + } + } else { p_dev_rec->ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT; - if (!controller_get_interface()->supports_ble_privacy()) - { - /* clear IRK list index mask */ - btm_ble_clear_irk_index(p_dev_rec->ble.resolving_list_index); - p_dev_rec->ble.resolving_list_index = 0; + if (!controller_get_interface()->supports_ble_privacy()) { + /* clear IRK list index mask */ + btm_ble_clear_irk_index(p_dev_rec->ble.resolving_list_index); + p_dev_rec->ble.resolving_list_index = 0; } } } @@ -234,10 +228,8 @@ void btm_ble_clear_resolving_list_complete(UINT8 *p, UINT16 evt_len) BTM_TRACE_DEBUG("%s status=%d", __func__, status); - if (status == HCI_SUCCESS) - { - if (evt_len >= 3) - { + if (status == HCI_SUCCESS) { + if (evt_len >= 3) { /* VSC complete has one extra byte for op code and list size, skip it here */ p ++; @@ -245,11 +237,12 @@ void btm_ble_clear_resolving_list_complete(UINT8 *p, UINT16 evt_len) uint8_t irk_list_sz_max = 0; STREAM_TO_UINT8(irk_list_sz_max, p); - if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { btm_ble_resolving_list_init(irk_list_sz_max); + } uint8_t irk_mask_size = (irk_list_sz_max % 8) ? - (irk_list_sz_max / 8 + 1) : (irk_list_sz_max / 8); + (irk_list_sz_max / 8 + 1) : (irk_list_sz_max / 8); memset(btm_cb.ble_ctr_cb.irk_list_mask, 0, irk_mask_size); } @@ -259,8 +252,9 @@ void btm_ble_clear_resolving_list_complete(UINT8 *p, UINT16 evt_len) BTM_TRACE_DEBUG("%s resolving_list_avail_size=%d", __func__, btm_cb.ble_ctr_cb.resolving_list_avail_size); - for (UINT8 i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; ++i) + for (UINT8 i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; ++i) { btm_cb.sec_dev_rec[i].ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT; + } } } @@ -282,26 +276,21 @@ void btm_ble_add_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) BTM_TRACE_DEBUG("%s status = %d", __func__, status); BD_ADDR pseudo_bda; - if (!btm_ble_deq_resolving_pending(pseudo_bda)) - { + if (!btm_ble_deq_resolving_pending(pseudo_bda)) { BTM_TRACE_DEBUG("no pending resolving list operation"); return; } - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { /* privacy 1.2 command complete does not have these extra byte */ - if (evt_len > 2) - { + if (evt_len > 2) { /* VSC complete has one extra byte for op code, skip it here */ p ++; STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p); - } - else + } else { btm_cb.ble_ctr_cb.resolving_list_avail_size --; - } - else if (status == HCI_ERR_MEMORY_FULL) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED */ - { + } + } else if (status == HCI_ERR_MEMORY_FULL) { /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED */ btm_cb.ble_ctr_cb.resolving_list_avail_size = 0; BTM_TRACE_DEBUG("%s Resolving list Full ", __func__); } @@ -326,22 +315,19 @@ void btm_ble_remove_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) BTM_TRACE_DEBUG("%s status = %d", __func__, status); - if (!btm_ble_deq_resolving_pending(pseudo_bda)) - { + if (!btm_ble_deq_resolving_pending(pseudo_bda)) { BTM_TRACE_ERROR("%s no pending resolving list operation", __func__); return; } - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { /* proprietary: spec does not have these extra bytes */ - if (evt_len > 2) - { + if (evt_len > 2) { p ++; /* skip opcode */ STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p); - } - else + } else { btm_cb.ble_ctr_cb.resolving_list_avail_size++; + } } } @@ -364,29 +350,24 @@ void btm_ble_read_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) BTM_TRACE_DEBUG("%s status = %d", __func__, status); - if (!btm_ble_deq_resolving_pending(pseudo_bda)) - { + if (!btm_ble_deq_resolving_pending(pseudo_bda)) { BTM_TRACE_ERROR("no pending resolving list operation"); return; } - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { /* proprietary spec has extra bytes */ - if (evt_len > 8) - { + if (evt_len > 8) { p += (2 + 16 + 1 + 6); /* skip subcode, index, IRK value, address type, identity addr type */ STREAM_TO_BDADDR(rra, p); BTM_TRACE_ERROR("%s peer_addr: %02x:%02x:%02x:%02x:%02x:%02x", __func__, rra[0], rra[1], rra[2], rra[3], rra[4], rra[5]); - } - else - { - STREAM_TO_BDADDR(rra, p); + } else { + STREAM_TO_BDADDR(rra, p); } btm_ble_refresh_peer_resolvable_private_addr(pseudo_bda, rra, rra_type); - } + } } /******************************************************************************* VSC that implement controller based privacy @@ -411,24 +392,15 @@ void btm_ble_resolving_list_vsc_op_cmpl (tBTM_VSC_CMPL *p_params) BTM_TRACE_DEBUG("%s op_subcode = %d", __func__, op_subcode); - if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST) - { + if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST) { btm_ble_clear_resolving_list_complete(p, evt_len); - } - else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY) - { - btm_ble_add_resolving_list_entry_complete(p, evt_len); - } - else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY) - { + } else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY) { + btm_ble_add_resolving_list_entry_complete(p, evt_len); + } else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY) { btm_ble_remove_resolving_list_entry_complete(p, evt_len); - } - else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY) - { - btm_ble_read_resolving_list_entry_complete(p, evt_len); - } - else if (op_subcode == BTM_BLE_META_IRK_ENABLE) - { + } else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY) { + btm_ble_read_resolving_list_entry_complete(p, evt_len); + } else if (op_subcode == BTM_BLE_META_IRK_ENABLE) { /* RPA offloading enable/disabled */ } } @@ -448,19 +420,18 @@ void btm_ble_resolving_list_vsc_op_cmpl (tBTM_VSC_CMPL *p_params) tBTM_STATUS btm_ble_remove_resolving_list_entry(tBTM_SEC_DEV_REC *p_dev_rec) { /* if controller does not support RPA offloading or privacy 1.2, skip */ - if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { return BTM_WRONG_MODE; + } tBTM_STATUS st = BTM_NO_RESOURCES; - if (controller_get_interface()->supports_ble_privacy()) - { + if (controller_get_interface()->supports_ble_privacy()) { if (btsnd_hcic_ble_rm_device_resolving_list(p_dev_rec->ble.static_addr_type, - p_dev_rec->ble.static_addr)) + p_dev_rec->ble.static_addr)) { st = BTM_CMD_STARTED; - } - else - { - UINT8 param[20]= {0}; + } + } else { + UINT8 param[20] = {0}; UINT8 *p = param; UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY); @@ -473,8 +444,9 @@ tBTM_STATUS btm_ble_remove_resolving_list_entry(tBTM_SEC_DEV_REC *p_dev_rec) btm_ble_resolving_list_vsc_op_cmpl); } - if (st == BTM_CMD_STARTED) + if (st == BTM_CMD_STARTED) { btm_ble_enq_resolving_list_pending( p_dev_rec->bd_addr, BTM_BLE_META_REMOVE_IRK_ENTRY); + } return st; } @@ -494,13 +466,11 @@ tBTM_STATUS btm_ble_clear_resolving_list(void) { tBTM_STATUS st = BTM_NO_RESOURCES; - if (controller_get_interface()->supports_ble_privacy()) - { - if (btsnd_hcic_ble_clear_resolving_list()) + if (controller_get_interface()->supports_ble_privacy()) { + if (btsnd_hcic_ble_clear_resolving_list()) { st = BTM_SUCCESS; - } - else - { + } + } else { UINT8 param[20] = {0}; UINT8 *p = param; @@ -529,17 +499,16 @@ tBTM_STATUS btm_ble_read_resolving_list_entry(tBTM_SEC_DEV_REC *p_dev_rec) { tBTM_STATUS st = BTM_NO_RESOURCES; - if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT)) + if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT)) { return BTM_WRONG_MODE; - - if (controller_get_interface()->supports_ble_privacy()) - { - if (btsnd_hcic_ble_read_resolvable_addr_peer(p_dev_rec->ble.static_addr_type, - p_dev_rec->ble.static_addr)) - st = BTM_CMD_STARTED; } - else - { + + if (controller_get_interface()->supports_ble_privacy()) { + if (btsnd_hcic_ble_read_resolvable_addr_peer(p_dev_rec->ble.static_addr_type, + p_dev_rec->ble.static_addr)) { + st = BTM_CMD_STARTED; + } + } else { UINT8 param[20] = {0}; UINT8 *p = param; @@ -580,32 +549,31 @@ BOOLEAN btm_ble_suspend_resolving_list_activity(void) /* if resolving list is not enabled, do not need to terminate any activity */ /* if asking for stop all activity */ /* if already suspended */ - if (p_ble_cb->suspended_rl_state != BTM_BLE_RL_IDLE) + if (p_ble_cb->suspended_rl_state != BTM_BLE_RL_IDLE) { return TRUE; + } /* direct connection active, wait until it completed */ - if (btm_ble_get_conn_st() == BLE_DIR_CONN) - { + if (btm_ble_get_conn_st() == BLE_DIR_CONN) { BTM_TRACE_ERROR("resolving list can not be edited, EnQ now"); return FALSE; } p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE; - if (p_ble_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE) - { + if (p_ble_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE) { btm_ble_stop_adv(); p_ble_cb->suspended_rl_state |= BTM_BLE_RL_ADV; } - if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) - { + if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) { btm_ble_stop_scan(); p_ble_cb->suspended_rl_state |= BTM_BLE_RL_SCAN; } - if (btm_ble_suspend_bg_conn()) + if (btm_ble_suspend_bg_conn()) { p_ble_cb->suspended_rl_state |= BTM_BLE_RL_INIT; + } return TRUE; } @@ -625,14 +593,17 @@ void btm_ble_resume_resolving_list_activity(void) { tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb; - if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_ADV) + if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_ADV) { btm_ble_start_adv(); + } - if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_SCAN) + if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_SCAN) { btm_ble_start_scan(); + } - if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_INIT) + if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_INIT) { btm_ble_resume_bg_conn(); + } p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE; } @@ -678,13 +649,15 @@ tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable) *******************************************************************************/ BOOLEAN btm_ble_exe_disable_resolving_list(void) { - if (!btm_ble_suspend_resolving_list_activity()) + if (!btm_ble_suspend_resolving_list_activity()) { return FALSE; + } - if (!controller_get_interface()->supports_ble_privacy()) + if (!controller_get_interface()->supports_ble_privacy()) { btm_ble_vendor_enable_irk_feature(FALSE); - else + } else { btsnd_hcic_ble_set_addr_resolution_enable(FALSE); + } return TRUE; } @@ -700,13 +673,15 @@ BOOLEAN btm_ble_exe_disable_resolving_list(void) *******************************************************************************/ void btm_ble_exe_enable_resolving_list(void) { - if (!btm_ble_suspend_resolving_list_activity()) + if (!btm_ble_suspend_resolving_list_activity()) { return; + } - if (!controller_get_interface()->supports_ble_privacy()) + if (!controller_get_interface()->supports_ble_privacy()) { btm_ble_vendor_enable_irk_feature(TRUE); - else + } else { btsnd_hcic_ble_set_addr_resolution_enable(TRUE); + } } /******************************************************************************* @@ -723,22 +698,22 @@ BOOLEAN btm_ble_disable_resolving_list(UINT8 rl_mask, BOOLEAN to_resume ) UINT8 rl_state = btm_cb.ble_ctr_cb.rl_state; /* if controller does not support RPA offloading or privacy 1.2, skip */ - if (controller_get_interface()->get_ble_resolving_list_max_size()== 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { return FALSE; + } btm_cb.ble_ctr_cb.rl_state &= ~rl_mask; - if (rl_state != BTM_BLE_RL_IDLE && btm_cb.ble_ctr_cb.rl_state == BTM_BLE_RL_IDLE) - { - if (btm_ble_exe_disable_resolving_list()) - { - if (to_resume) + if (rl_state != BTM_BLE_RL_IDLE && btm_cb.ble_ctr_cb.rl_state == BTM_BLE_RL_IDLE) { + if (btm_ble_exe_disable_resolving_list()) { + if (to_resume) { btm_ble_resume_resolving_list_activity(); + } return TRUE; - } - else + } else { return FALSE; + } } return TRUE; @@ -761,42 +736,38 @@ BOOLEAN btm_ble_resolving_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec) UINT8 rl_mask = btm_cb.ble_ctr_cb.rl_state; BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d\n", __func__, - btm_cb.ble_ctr_cb.privacy_mode); + btm_cb.ble_ctr_cb.privacy_mode); /* if controller does not support RPA offloading or privacy 1.2, skip */ - if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { return FALSE; + } BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d\n", __func__, btm_cb.ble_ctr_cb.privacy_mode); /* only add RPA enabled device into resolving list */ if (p_dev_rec != NULL && /* RPA is being used and PID is known */ - (p_dev_rec->sec_flags & BTM_SEC_IN_USE) != 0 && - ((p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0 || - (p_dev_rec->ble.key_type & BTM_LE_KEY_LID) != 0)) - { + (p_dev_rec->sec_flags & BTM_SEC_IN_USE) != 0 && + ((p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0 || + (p_dev_rec->ble.key_type & BTM_LE_KEY_LID) != 0)) { if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && - btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, - BTM_BLE_META_ADD_IRK_ENTRY) == FALSE) - { - if (btm_cb.ble_ctr_cb.resolving_list_avail_size > 0) - { - if (rl_mask) - { - if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) + btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, + BTM_BLE_META_ADD_IRK_ENTRY) == FALSE) { + if (btm_cb.ble_ctr_cb.resolving_list_avail_size > 0) { + if (rl_mask) { + if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) { return FALSE; + } } btm_ble_update_resolving_list(p_dev_rec->bd_addr, TRUE); - if (controller_get_interface()->supports_ble_privacy()) - { + if (controller_get_interface()->supports_ble_privacy()) { BD_ADDR dummy_bda = {0}; UINT8 *peer_irk = p_dev_rec->ble.keys.irk; UINT8 *local_irk = btm_cb.devcb.id_keys.irk; - if (memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) == 0) - { + if (memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) == 0) { memcpy(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); p_dev_rec->ble.static_addr_type = p_dev_rec->ble.ble_addr_type; } @@ -804,45 +775,41 @@ BOOLEAN btm_ble_resolving_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec) BTM_TRACE_DEBUG("%s:adding device to controller resolving list\n", __func__); // use identical IRK for now rt = btsnd_hcic_ble_add_device_resolving_list(p_dev_rec->ble.static_addr_type, - p_dev_rec->ble.static_addr, peer_irk, local_irk); - } - else - { + p_dev_rec->ble.static_addr, peer_irk, local_irk); + } else { UINT8 param[40] = {0}; UINT8 *p = param; UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY); ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN); UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); - BDADDR_TO_STREAM(p,p_dev_rec->ble.static_addr); + BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr); if (BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_META_ADD_IRK_LEN, param, btm_ble_resolving_list_vsc_op_cmpl) - == BTM_CMD_STARTED) + == BTM_CMD_STARTED) { rt = TRUE; + } } - if (rt) - btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, - BTM_BLE_META_ADD_IRK_ENTRY); + if (rt) + btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, + BTM_BLE_META_ADD_IRK_ENTRY); /* if resolving list has been turned on, re-enable it */ - if (rl_mask) + if (rl_mask) { btm_ble_enable_resolving_list(rl_mask); - else + } else { btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); + } } - } - else - { + } else { BTM_TRACE_ERROR("Device already in Resolving list\n"); rt = TRUE; } - } - else - { + } else { BTM_TRACE_DEBUG("Device not a RPA enabled device\n"); } return rt; @@ -864,27 +831,25 @@ void btm_ble_resolving_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec) UINT8 rl_mask = btm_cb.ble_ctr_cb.rl_state; BTM_TRACE_EVENT ("%s\n", __func__); - if (rl_mask) - { - if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) - return; + if (rl_mask) { + if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) { + return; + } } if ((p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && - btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, - BTM_BLE_META_REMOVE_IRK_ENTRY) == FALSE) - { + btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, + BTM_BLE_META_REMOVE_IRK_ENTRY) == FALSE) { btm_ble_update_resolving_list( p_dev_rec->bd_addr, FALSE); btm_ble_remove_resolving_list_entry(p_dev_rec); - } - else - { + } else { BTM_TRACE_DEBUG("Device not in resolving list\n"); } /* if resolving list has been turned on, re-enable it */ - if (rl_mask) + if (rl_mask) { btm_ble_enable_resolving_list(rl_mask); + } } /******************************************************************************* @@ -902,9 +867,8 @@ void btm_ble_enable_resolving_list(UINT8 rl_mask) btm_cb.ble_ctr_cb.rl_state |= rl_mask; if (rl_state == BTM_BLE_RL_IDLE && - btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE && - controller_get_interface()->get_ble_resolving_list_max_size() != 0) - { + btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE && + controller_get_interface()->get_ble_resolving_list_max_size() != 0) { btm_ble_exe_enable_resolving_list(); btm_ble_resume_resolving_list_activity(); } @@ -939,25 +903,24 @@ BOOLEAN btm_ble_resolving_list_empty(void) void btm_ble_enable_resolving_list_for_platform (UINT8 rl_mask) { /* if controller does not support, skip */ - if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { return; + } - if (btm_cb.ble_ctr_cb.wl_state == BTM_BLE_WL_IDLE) - { + if (btm_cb.ble_ctr_cb.wl_state == BTM_BLE_WL_IDLE) { if (controller_get_interface()->get_ble_resolving_list_max_size() > - btm_cb.ble_ctr_cb.resolving_list_avail_size) + btm_cb.ble_ctr_cb.resolving_list_avail_size) { btm_ble_enable_resolving_list(rl_mask); - else + } else { btm_ble_disable_resolving_list(rl_mask, TRUE); + } return; } tBTM_SEC_DEV_REC *p_dev = &btm_cb.sec_dev_rec[0]; - for (UINT8 i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev ++) - { + for (UINT8 i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev ++) { if ((p_dev->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && - (p_dev->ble.in_controller_list & BTM_WHITE_LIST_BIT)) - { + (p_dev->ble.in_controller_list & BTM_WHITE_LIST_BIT)) { btm_ble_enable_resolving_list(rl_mask); return; } @@ -980,16 +943,16 @@ void btm_ble_resolving_list_init(UINT8 max_irk_list_sz) { tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; UINT8 irk_mask_size = (max_irk_list_sz % 8) ? - (max_irk_list_sz/8 + 1) : (max_irk_list_sz/8); + (max_irk_list_sz / 8 + 1) : (max_irk_list_sz / 8); - if (max_irk_list_sz > 0) - { + if (max_irk_list_sz > 0) { p_q->resolve_q_random_pseudo = (BD_ADDR *)GKI_getbuf(sizeof(BD_ADDR) * max_irk_list_sz); p_q->resolve_q_action = (UINT8 *)GKI_getbuf(max_irk_list_sz); /* RPA offloading feature */ - if (btm_cb.ble_ctr_cb.irk_list_mask == NULL) + if (btm_cb.ble_ctr_cb.irk_list_mask == NULL) { btm_cb.ble_ctr_cb.irk_list_mask = (UINT8 *)GKI_getbuf(irk_mask_size); + } BTM_TRACE_DEBUG ("%s max_irk_list_sz = %d", __func__, max_irk_list_sz); } @@ -1014,15 +977,18 @@ void btm_ble_resolving_list_cleanup(void) { tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; - if (p_q->resolve_q_random_pseudo) + if (p_q->resolve_q_random_pseudo) { GKI_freebuf(p_q->resolve_q_random_pseudo); + } - if (p_q->resolve_q_action) - GKI_freebuf(p_q->resolve_q_action); + if (p_q->resolve_q_action) { + GKI_freebuf(p_q->resolve_q_action); + } controller_get_interface()->set_ble_resolving_list_max_size(0); - if (btm_cb.ble_ctr_cb.irk_list_mask) - GKI_freebuf(btm_cb.ble_ctr_cb.irk_list_mask); + if (btm_cb.ble_ctr_cb.irk_list_mask) { + GKI_freebuf(btm_cb.ble_ctr_cb.irk_list_mask); + } btm_cb.ble_ctr_cb.irk_list_mask = NULL; } diff --git a/components/bt/bluedroid/stack/btm/btm_dev.c b/components/bt/bluedroid/stack/btm/btm_dev.c old mode 100755 new mode 100644 index 8ca65741a..72a173902 --- a/components/bt/bluedroid/stack/btm/btm_dev.c +++ b/components/bt/bluedroid/stack/btm/btm_dev.c @@ -67,16 +67,13 @@ BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int i, j; BOOLEAN found = FALSE; - BTM_TRACE_API("%s, link key type:%x\n", __FUNCTION__,key_type); + BTM_TRACE_API("%s, link key type:%x\n", __FUNCTION__, key_type); p_dev_rec = btm_find_dev (bd_addr); - if (!p_dev_rec) - { + if (!p_dev_rec) { /* There is no device record, allocate one. * If we can not find an empty spot for this one, let it fail. */ - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) - { - if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) { + if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) { p_dev_rec = &btm_cb.sec_dev_rec[i]; /* Mark this record as in use and initialize */ @@ -94,64 +91,59 @@ BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, } } - if (!p_dev_rec) - return(FALSE); + if (!p_dev_rec) { + return (FALSE); + } } p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; /* Default value */ p_dev_rec->timestamp = btm_cb.dev_rec_count++; - if (dev_class) + if (dev_class) { memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN); + } memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); - if (bd_name && bd_name[0]) - { + if (bd_name && bd_name[0]) { p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), - (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); + (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); } p_dev_rec->num_read_pages = 0; - if (features) - { + if (features) { memcpy (p_dev_rec->features, features, sizeof (p_dev_rec->features)); - for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) - { - for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) - { - if (p_dev_rec->features[i][j] != 0) - { + for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) { + for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) { + if (p_dev_rec->features[i][j] != 0) { found = TRUE; break; } } - if (found) - { + if (found) { p_dev_rec->num_read_pages = i + 1; break; } } - } - else + } else { memset (p_dev_rec->features, 0, sizeof (p_dev_rec->features)); + } BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); - if (link_key) - { + if (link_key) { BTM_TRACE_EVENT ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x\n", - bd_addr[0], bd_addr[1], bd_addr[2], - bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], + bd_addr[3], bd_addr[4], bd_addr[5]); p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN); p_dev_rec->link_key_type = key_type; p_dev_rec->pin_code_length = pin_length; if (pin_length >= 16 || - key_type == BTM_LKEY_TYPE_AUTH_COMB || - key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { + key_type == BTM_LKEY_TYPE_AUTH_COMB || + key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { // Set the fiag if the link key was made by using either a 16 digit // pin or MITM. p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; @@ -159,16 +151,17 @@ BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, } #if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE) - if (key_type < BTM_MAX_PRE_SM4_LKEY_TYPE) + if (key_type < BTM_MAX_PRE_SM4_LKEY_TYPE) { p_dev_rec->sm4 = BTM_SM4_KNOWN; - else + } else { p_dev_rec->sm4 = BTM_SM4_TRUE; + } #endif p_dev_rec->rmt_io_caps = io_cap; p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; - return(TRUE); + return (TRUE); } @@ -188,14 +181,12 @@ BOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr) tBTM_SEC_DEV_REC *p_dev_rec; if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) || - BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR)) - { + BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR)) { BTM_TRACE_WARNING("%s FAILED: Cannot Delete when connection is active\n", __func__); return FALSE; } - if ((p_dev_rec = btm_find_dev(bd_addr)) != NULL) - { + if ((p_dev_rec = btm_find_dev(bd_addr)) != NULL) { btm_sec_free_dev(p_dev_rec); /* Tell controller to get rid of the link key, if it has one stored */ BTM_DeleteStoredLinkKey (p_dev_rec->bd_addr, NULL); @@ -219,10 +210,11 @@ char *BTM_SecReadDevName (BD_ADDR bd_addr) char *p_name = NULL; tBTM_SEC_DEV_REC *p_srec; - if ((p_srec = btm_find_dev(bd_addr)) != NULL) + if ((p_srec = btm_find_dev(bd_addr)) != NULL) { p_name = (char *)p_srec->sec_bd_name; + } - return(p_name); + return (p_name); } /******************************************************************************* @@ -245,22 +237,18 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) int i_old_entry = BTM_SEC_MAX_DEVICE_RECORDS; BTM_TRACE_EVENT ("btm_sec_alloc_dev\n"); - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) { /* look for old entry where device details are present */ if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) && - (!memcmp (btm_cb.sec_dev_rec[i].bd_addr, bd_addr, BD_ADDR_LEN))) - { + (!memcmp (btm_cb.sec_dev_rec[i].bd_addr, bd_addr, BD_ADDR_LEN))) { i_old_entry = i; BTM_TRACE_EVENT ("btm_sec_alloc_dev old device found\n"); break; } } - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) - { - if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) { + if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) { i_new_entry = i; break; } @@ -268,14 +256,12 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) if (i_new_entry == BTM_SEC_MAX_DEVICE_RECORDS) { p_dev_rec = btm_find_oldest_dev(); - } - else { + } else { /* if the old device entry not present go with new entry */ - if(i_old_entry == BTM_SEC_MAX_DEVICE_RECORDS) { + if (i_old_entry == BTM_SEC_MAX_DEVICE_RECORDS) { p_dev_rec = &btm_cb.sec_dev_rec[i_new_entry]; - } - else { + } else { p_dev_rec = &btm_cb.sec_dev_rec[i_old_entry]; memcpy (old_cod, p_dev_rec->dev_class, DEV_CLASS_LEN); } @@ -283,7 +269,7 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); /* Retain the old COD for device */ - if(i_old_entry != BTM_SEC_MAX_DEVICE_RECORDS) { + if (i_old_entry != BTM_SEC_MAX_DEVICE_RECORDS) { BTM_TRACE_EVENT ("btm_sec_alloc_dev restoring cod \n"); memcpy (p_dev_rec->dev_class, old_cod, DEV_CLASS_LEN); @@ -294,8 +280,7 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) /* Check with the BT manager if details about remote device are known */ /* outgoing connection */ - if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) - { + if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) { memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN); #if BLE_INCLUDED == TRUE @@ -305,16 +290,15 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) /* update conn params, use default value for background connection params */ memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); #endif - } - else - { + } else { #if BLE_INCLUDED == TRUE /* update conn params, use default value for background connection params */ memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); #endif - if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) + if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) { memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); + } } memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); @@ -325,7 +309,7 @@ tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR); p_dev_rec->timestamp = btm_cb.dev_rec_count++; - return(p_dev_rec); + return (p_dev_rec); } @@ -369,38 +353,34 @@ BOOLEAN btm_dev_support_switch (BD_ADDR bd_addr) #if BTM_SCO_INCLUDED == TRUE /* Role switch is not allowed if a SCO is up */ - if (btm_is_sco_active_by_bdaddr(bd_addr)) - return(FALSE); + if (btm_is_sco_active_by_bdaddr(bd_addr)) { + return (FALSE); + } #endif p_dev_rec = btm_find_dev (bd_addr); - if (p_dev_rec && controller_get_interface()->supports_master_slave_role_switch()) - { - if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0])) - { + if (p_dev_rec && controller_get_interface()->supports_master_slave_role_switch()) { + if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0])) { BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)\n"); return (TRUE); } /* If the feature field is all zero, we never received them */ - for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) - { - if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00) - { + for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) { + if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00) { feature_empty = FALSE; /* at least one is != 0 */ break; } } /* If we don't know peer's capabilities, assume it supports Role-switch */ - if (feature_empty) - { + if (feature_empty) { BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)\n"); return (TRUE); } } BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE\n"); - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -418,17 +398,17 @@ tBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle) tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; int i; - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) - && ((p_dev_rec->hci_handle == handle) + && ((p_dev_rec->hci_handle == handle) #if BLE_INCLUDED == TRUE - ||(p_dev_rec->ble_hci_handle == handle) + || (p_dev_rec->ble_hci_handle == handle) #endif - )) - return(p_dev_rec); + )) { + return (p_dev_rec); + } } - return(NULL); + return (NULL); } /******************************************************************************* @@ -445,27 +425,27 @@ tBTM_SEC_DEV_REC *btm_find_dev(BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; - if (bd_addr) - { - for (uint8_t i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { - if (p_dev_rec->sec_flags & BTM_SEC_IN_USE) - { - if (!memcmp (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN)) - return(p_dev_rec); + if (bd_addr) { + for (uint8_t i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { + if (p_dev_rec->sec_flags & BTM_SEC_IN_USE) { + if (!memcmp (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN)) { + return (p_dev_rec); + } #if BLE_INCLUDED == TRUE // If a LE random address is looking for device record - if (!memcmp(p_dev_rec->ble.pseudo_addr, bd_addr, BD_ADDR_LEN)) + if (!memcmp(p_dev_rec->ble.pseudo_addr, bd_addr, BD_ADDR_LEN)) { return (p_dev_rec); + } - if (btm_ble_addr_resolvable(bd_addr, p_dev_rec)) - return(p_dev_rec); + if (btm_ble_addr_resolvable(bd_addr, p_dev_rec)) { + return (p_dev_rec); + } #endif } } } - return(NULL); + return (NULL); } /******************************************************************************* @@ -486,12 +466,9 @@ void btm_consolidate_dev(tBTM_SEC_DEV_REC *p_target_rec) BTM_TRACE_DEBUG("%s\n", __func__); - for (uint8_t i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { - if (p_target_rec!= p_dev_rec && p_dev_rec->sec_flags & BTM_SEC_IN_USE) - { - if (!memcmp (p_dev_rec->bd_addr, p_target_rec->bd_addr, BD_ADDR_LEN)) - { + for (uint8_t i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { + if (p_target_rec != p_dev_rec && p_dev_rec->sec_flags & BTM_SEC_IN_USE) { + if (!memcmp (p_dev_rec->bd_addr, p_target_rec->bd_addr, BD_ADDR_LEN)) { memcpy(p_target_rec, p_dev_rec, sizeof(tBTM_SEC_DEV_REC)); p_target_rec->ble = temp_rec.ble; p_target_rec->ble_hci_handle = temp_rec.ble_hci_handle; @@ -510,10 +487,8 @@ void btm_consolidate_dev(tBTM_SEC_DEV_REC *p_target_rec) } /* an RPA device entry is a duplicate of the target record */ - if (btm_ble_addr_resolvable(p_dev_rec->bd_addr, p_target_rec)) - { - if (memcmp(p_target_rec->ble.pseudo_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) - { + if (btm_ble_addr_resolvable(p_dev_rec->bd_addr, p_target_rec)) { + if (memcmp(p_target_rec->ble.pseudo_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) { p_target_rec->ble.ble_addr_type = p_dev_rec->ble.ble_addr_type; p_target_rec->device_type |= p_dev_rec->device_type; p_dev_rec->sec_flags &= ~BTM_SEC_IN_USE; @@ -540,13 +515,12 @@ tBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_EVENT ("btm_find_or_alloc_dev\n"); - if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) - { + if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) { /* Allocate a new device record or reuse the oldest one */ p_dev_rec = btm_sec_alloc_dev (bd_addr); } - return(p_dev_rec); + return (p_dev_rec); } /******************************************************************************* @@ -568,36 +542,35 @@ tBTM_SEC_DEV_REC *btm_find_oldest_dev (void) int i; /* First look for the non-paired devices for the oldest entry */ - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) - || ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN |BTM_SEC_LE_LINK_KEY_KNOWN)) != 0)) - continue; /* Device is paired so skip it */ + || ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LE_LINK_KEY_KNOWN)) != 0)) { + continue; /* Device is paired so skip it */ + } - if (p_dev_rec->timestamp < ot) - { + if (p_dev_rec->timestamp < ot) { p_oldest = p_dev_rec; ot = p_dev_rec->timestamp; } } - if (ot != 0xFFFFFFFF) - return(p_oldest); + if (ot != 0xFFFFFFFF) { + return (p_oldest); + } /* All devices are paired; find the oldest */ p_dev_rec = &btm_cb.sec_dev_rec[0]; - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { - if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { + if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) { continue; + } - if (p_dev_rec->timestamp < ot) - { + if (p_dev_rec->timestamp < ot) { p_oldest = p_dev_rec; ot = p_dev_rec->timestamp; } } - return(p_oldest); + return (p_oldest); } /******************************************************************************* @@ -614,8 +587,9 @@ tBTM_BOND_TYPE btm_get_bond_type_dev(BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr); - if (p_dev_rec == NULL) + if (p_dev_rec == NULL) { return BOND_TYPE_UNKNOWN; + } return p_dev_rec->bond_type; } @@ -634,8 +608,9 @@ BOOLEAN btm_set_bond_type_dev(BD_ADDR bd_addr, tBTM_BOND_TYPE bond_type) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr); - if (p_dev_rec == NULL) + if (p_dev_rec == NULL) { return FALSE; + } p_dev_rec->bond_type = bond_type; return TRUE; diff --git a/components/bt/bluedroid/stack/btm/btm_devctl.c b/components/bt/bluedroid/stack/btm/btm_devctl.c old mode 100755 new mode 100644 index 9773ffd6e..91851decc --- a/components/bt/bluedroid/stack/btm/btm_devctl.c +++ b/components/bt/bluedroid/stack/btm/btm_devctl.c @@ -54,7 +54,7 @@ #endif #define BTM_DEV_REPLY_TIMEOUT 2 /* 1 second expiration time is not good. Timer may start between 0 and 1 second. */ - /* if it starts at the very end of the 0 second, timer will expire really easily. */ +/* if it starts at the very end of the 0 second, timer will expire really easily. */ #define BTM_INFO_TIMEOUT 5 /* 5 seconds for info response */ @@ -118,96 +118,98 @@ static void btm_db_reset (void) btm_inq_db_reset(); - if (btm_cb.devcb.p_rln_cmpl_cb) - { + if (btm_cb.devcb.p_rln_cmpl_cb) { p_cb = btm_cb.devcb.p_rln_cmpl_cb; btm_cb.devcb.p_rln_cmpl_cb = NULL; - if (p_cb) + if (p_cb) { (*p_cb)((void *) NULL); + } } - if (btm_cb.devcb.p_rssi_cmpl_cb) - { + if (btm_cb.devcb.p_rssi_cmpl_cb) { p_cb = btm_cb.devcb.p_rssi_cmpl_cb; btm_cb.devcb.p_rssi_cmpl_cb = NULL; - if (p_cb) + if (p_cb) { (*p_cb)((tBTM_RSSI_RESULTS *) &status); + } } } -static void reset_complete(void) { - const controller_t *controller = controller_get_interface(); +static void reset_complete(void) +{ + const controller_t *controller = controller_get_interface(); - /* Tell L2CAP that all connections are gone */ - l2cu_device_reset (); + /* Tell L2CAP that all connections are gone */ + l2cu_device_reset (); - /* Clear current security state */ - for (int devinx = 0; devinx < BTM_SEC_MAX_DEVICE_RECORDS; devinx++) { - btm_cb.sec_dev_rec[devinx].sec_state = BTM_SEC_STATE_IDLE; - } + /* Clear current security state */ + for (int devinx = 0; devinx < BTM_SEC_MAX_DEVICE_RECORDS; devinx++) { + btm_cb.sec_dev_rec[devinx].sec_state = BTM_SEC_STATE_IDLE; + } - /* After the reset controller should restore all parameters to defaults. */ - btm_cb.btm_inq_vars.inq_counter = 1; - btm_cb.btm_inq_vars.inq_scan_window = HCI_DEF_INQUIRYSCAN_WINDOW; - btm_cb.btm_inq_vars.inq_scan_period = HCI_DEF_INQUIRYSCAN_INTERVAL; - btm_cb.btm_inq_vars.inq_scan_type = HCI_DEF_SCAN_TYPE; + /* After the reset controller should restore all parameters to defaults. */ + btm_cb.btm_inq_vars.inq_counter = 1; + btm_cb.btm_inq_vars.inq_scan_window = HCI_DEF_INQUIRYSCAN_WINDOW; + btm_cb.btm_inq_vars.inq_scan_period = HCI_DEF_INQUIRYSCAN_INTERVAL; + btm_cb.btm_inq_vars.inq_scan_type = HCI_DEF_SCAN_TYPE; - btm_cb.btm_inq_vars.page_scan_window = HCI_DEF_PAGESCAN_WINDOW; - btm_cb.btm_inq_vars.page_scan_period = HCI_DEF_PAGESCAN_INTERVAL; - btm_cb.btm_inq_vars.page_scan_type = HCI_DEF_SCAN_TYPE; + btm_cb.btm_inq_vars.page_scan_window = HCI_DEF_PAGESCAN_WINDOW; + btm_cb.btm_inq_vars.page_scan_period = HCI_DEF_PAGESCAN_INTERVAL; + btm_cb.btm_inq_vars.page_scan_type = HCI_DEF_SCAN_TYPE; #if (BLE_INCLUDED == TRUE) - btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; - btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; - btm_cb.ble_ctr_cb.p_select_cback = NULL; - gatt_reset_bgdev_list(); - btm_ble_multi_adv_init(); + btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; + btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; + btm_cb.ble_ctr_cb.p_select_cback = NULL; + gatt_reset_bgdev_list(); + btm_ble_multi_adv_init(); #endif - btm_pm_reset(); + btm_pm_reset(); - l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic()); + l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic()); #if (BLE_INCLUDED == TRUE) #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - /* Set up the BLE privacy settings */ - if (controller->supports_ble() && controller->supports_ble_privacy() && - controller->get_ble_resolving_list_max_size() > 0) { - btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size()); - /* set the default random private address timeout */ - btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT); - } + /* Set up the BLE privacy settings */ + if (controller->supports_ble() && controller->supports_ble_privacy() && + controller->get_ble_resolving_list_max_size() > 0) { + btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size()); + /* set the default random private address timeout */ + btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT); + } #endif - if (controller->supports_ble()) { - btm_ble_white_list_init(controller->get_ble_white_list_size()); - l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); - } + if (controller->supports_ble()) { + btm_ble_white_list_init(controller->get_ble_white_list_size()); + l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); + } #endif - BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len); + BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len); - for (int i = 0; i <= controller->get_last_features_classic_index(); i++) { - btm_decode_ext_features_page(i, controller->get_features_classic(i)->as_array); - } + for (int i = 0; i <= controller->get_last_features_classic_index(); i++) { + btm_decode_ext_features_page(i, controller->get_features_classic(i)->as_array); + } - btm_report_device_status(BTM_DEV_STATUS_UP); + btm_report_device_status(BTM_DEV_STATUS_UP); } // TODO(zachoverflow): remove this function -void BTM_DeviceReset (UNUSED_ATTR tBTM_CMPL_CB *p_cb) { - /* Flush all ACL connections */ - btm_acl_device_down(); +void BTM_DeviceReset (UNUSED_ATTR tBTM_CMPL_CB *p_cb) +{ + /* Flush all ACL connections */ + btm_acl_device_down(); - /* Clear the callback, so application would not hang on reset */ - btm_db_reset(); + /* Clear the callback, so application would not hang on reset */ + btm_db_reset(); - /* todo: review the below logic; start_up executes under another task context - * reset_complete runs in btu task */ - controller_get_interface()->start_up(); - reset_complete(); + /* todo: review the below logic; start_up executes under another task context + * reset_complete runs in btu task */ + controller_get_interface()->start_up(); + reset_complete(); } /******************************************************************************* @@ -237,14 +239,14 @@ void btm_dev_timeout (TIMER_LIST_ENT *p_tle) { TIMER_PARAM_TYPE timer_type = (TIMER_PARAM_TYPE)p_tle->param; - if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN) - { + if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN) { tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; btm_cb.devcb.p_rln_cmpl_cb = NULL; - if (p_cb) + if (p_cb) { (*p_cb)((void *) NULL); + } } } @@ -263,8 +265,7 @@ static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_feat UINT8 first; BTM_TRACE_DEBUG ("btm_decode_ext_features_page page: %d", page_number); - switch (page_number) - { + switch (page_number) { /* Extended (Legacy) Page 0 */ case HCI_EXT_FEATURES_PAGE_0: @@ -281,15 +282,13 @@ static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_feat BTM_ACL_PKT_TYPES_MASK_DM5); /* Add in EDR related ACL types */ - if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) - { + if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) { btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); } - if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) - { + if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) { btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); @@ -297,8 +296,7 @@ static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_feat /* Check to see if 3 and 5 slot packets are available */ if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) || - HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) - { + HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) { if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features)) btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); @@ -309,56 +307,55 @@ static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_feat } BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x", - btm_cb.btm_acl_pkt_types_supported); + btm_cb.btm_acl_pkt_types_supported); /* Create (e)SCO supported packet types mask */ btm_cb.btm_sco_pkt_types_supported = 0; #if BTM_SCO_INCLUDED == TRUE btm_cb.sco_cb.esco_supported = FALSE; #endif - if (HCI_SCO_LINK_SUPPORTED(p_features)) - { + if (HCI_SCO_LINK_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1; - if (HCI_HV2_PACKETS_SUPPORTED(p_features)) + if (HCI_HV2_PACKETS_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2; + } - if (HCI_HV3_PACKETS_SUPPORTED(p_features)) + if (HCI_HV3_PACKETS_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3; + } } - if (HCI_ESCO_EV3_SUPPORTED(p_features)) + if (HCI_ESCO_EV3_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3; + } - if (HCI_ESCO_EV4_SUPPORTED(p_features)) + if (HCI_ESCO_EV4_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4; + } - if (HCI_ESCO_EV5_SUPPORTED(p_features)) + if (HCI_ESCO_EV5_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5; + } #if BTM_SCO_INCLUDED == TRUE - if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) - { + if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) { btm_cb.sco_cb.esco_supported = TRUE; /* Add in EDR related eSCO types */ - if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) - { - if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) + if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) { + if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_2_EV5; - } - else - { + } + } else { btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5); } - if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) - { - if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) + if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) { + if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) { btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; - } - else - { + } + } else { btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); } @@ -366,44 +363,49 @@ static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_feat #endif BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x", - btm_cb.btm_sco_pkt_types_supported); + btm_cb.btm_sco_pkt_types_supported); /* Create Default Policy Settings */ - if (HCI_SWITCH_SUPPORTED(p_features)) + if (HCI_SWITCH_SUPPORTED(p_features)) { btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; - else + } else { btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; + } - if (HCI_HOLD_MODE_SUPPORTED(p_features)) + if (HCI_HOLD_MODE_SUPPORTED(p_features)) { btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE; - else + } else { btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE; + } - if (HCI_SNIFF_MODE_SUPPORTED(p_features)) + if (HCI_SNIFF_MODE_SUPPORTED(p_features)) { btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE; - else + } else { btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE; + } - if (HCI_PARK_MODE_SUPPORTED(p_features)) + if (HCI_PARK_MODE_SUPPORTED(p_features)) { btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE; - else + } else { btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE; + } btm_sec_dev_reset (); - if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) - { - if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) + if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) { + if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) { BTM_SetInquiryMode (BTM_INQ_RESULT_EXTENDED); - else + } else { BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); + } } #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE - if( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) + if ( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) { l2cu_set_non_flushable_pbf(TRUE); - else + } else { l2cu_set_non_flushable_pbf(FALSE); + } #endif BTM_SetPageScanType (BTM_DEFAULT_SCAN_TYPE); BTM_SetInquiryScanType (BTM_DEFAULT_SCAN_TYPE); @@ -439,17 +441,18 @@ tBTM_STATUS BTM_SetLocalDeviceName (char *p_name) { UINT8 *p; - if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN)) + if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN)) { return (BTM_ILLEGAL_VALUE); + } - if (!controller_get_interface()->get_is_ready()) + if (!controller_get_interface()->get_is_ready()) { return (BTM_DEV_RESET); + } #if BTM_MAX_LOC_BD_NAME_LEN > 0 /* Save the device name if local storage is enabled */ p = (UINT8 *)btm_cb.cfg.bd_name; - if (p != (UINT8 *)p_name) - { + if (p != (UINT8 *)p_name) { BCM_STRNCPY_S(btm_cb.cfg.bd_name, sizeof(btm_cb.cfg.bd_name), p_name, BTM_MAX_LOC_BD_NAME_LEN); btm_cb.cfg.bd_name[BTM_MAX_LOC_BD_NAME_LEN] = '\0'; } @@ -457,10 +460,11 @@ tBTM_STATUS BTM_SetLocalDeviceName (char *p_name) p = (UINT8 *)p_name; #endif - if (btsnd_hcic_change_name(p)) + if (btsnd_hcic_change_name(p)) { return (BTM_CMD_STARTED); - else + } else { return (BTM_NO_RESOURCES); + } } @@ -482,10 +486,10 @@ tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name) { #if BTM_MAX_LOC_BD_NAME_LEN > 0 *p_name = btm_cb.cfg.bd_name; - return(BTM_SUCCESS); + return (BTM_SUCCESS); #else *p_name = NULL; - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); #endif } @@ -503,8 +507,9 @@ tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name) tBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback) { /* Check if rln already in progress */ - if (btm_cb.devcb.p_rln_cmpl_cb) - return(BTM_NO_RESOURCES); + if (btm_cb.devcb.p_rln_cmpl_cb) { + return (BTM_NO_RESOURCES); + } /* Save callback */ btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback; @@ -536,14 +541,14 @@ void btm_read_local_name_complete (UINT8 *p, UINT16 evt_len) /* If there was a callback address for read local name, call it */ btm_cb.devcb.p_rln_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { STREAM_TO_UINT8 (status, p); - if (status == HCI_SUCCESS) + if (status == HCI_SUCCESS) { (*p_cb)(p); - else + } else { (*p_cb)(NULL); + } } } @@ -558,16 +563,19 @@ void btm_read_local_name_complete (UINT8 *p, UINT16 evt_len) *******************************************************************************/ tBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class) { - if(!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) - return(BTM_SUCCESS); + if (!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) { + return (BTM_SUCCESS); + } memcpy (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN); - if (!controller_get_interface()->get_is_ready()) + if (!controller_get_interface()->get_is_ready()) { return (BTM_DEV_RESET); + } - if (!btsnd_hcic_write_dev_class (dev_class)) + if (!btsnd_hcic_write_dev_class (dev_class)) { return (BTM_NO_RESOURCES); + } return (BTM_SUCCESS); } @@ -647,23 +655,23 @@ tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len, void *p_buf; BTM_TRACE_EVENT ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.", - opcode, param_len); + opcode, param_len); /* Allocate a buffer to hold HCI command plus the callback function */ if ((p_buf = GKI_getbuf((UINT16)(sizeof(BT_HDR) + sizeof (tBTM_CMPL_CB *) + - param_len + HCIC_PREAMBLE_SIZE))) != NULL) - { + param_len + HCIC_PREAMBLE_SIZE))) != NULL) { /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */ btsnd_hcic_vendor_spec_cmd (p_buf, opcode, param_len, p_param_buf, (void *)p_cb); /* Return value */ - if (p_cb != NULL) + if (p_cb != NULL) { return (BTM_CMD_STARTED); - else + } else { return (BTM_SUCCESS); - } - else + } + } else { return (BTM_NO_RESOURCES); + } } @@ -684,8 +692,7 @@ void btm_vsc_complete (UINT8 *p, UINT16 opcode, UINT16 evt_len, tBTM_VSC_CMPL vcs_cplt_params; /* If there was a callback address for vcs complete, call it */ - if (p_vsc_cplt_cback) - { + if (p_vsc_cplt_cback) { /* Pass paramters to the callback function */ vcs_cplt_params.opcode = opcode; /* Number of bytes in return info */ vcs_cplt_params.param_len = evt_len; /* Number of bytes in return info */ @@ -715,18 +722,13 @@ tBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register) UINT8 i, free_idx = BTM_MAX_VSE_CALLBACKS; /* See if callback is already registered */ - for (i=0; itransmit_command( - hci_packet_factory_get_interface()->make_set_event_mask((const bt_event_mask_t *)("\x00\x00\x00\x00\x00\x00\x00\x00")), - NULL, - NULL, - NULL); + hci_packet_factory_get_interface()->make_set_event_mask((const bt_event_mask_t *)("\x00\x00\x00\x00\x00\x00\x00\x00")), + NULL, + NULL, + NULL); /* Send the HCI command */ - if (btsnd_hcic_enable_test_mode ()) + if (btsnd_hcic_enable_test_mode ()) { return (BTM_SUCCESS); - else + } else { return (BTM_NO_RESOURCES); + } } /******************************************************************************* @@ -905,11 +903,11 @@ tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) BOOLEAN delete_all_flag = FALSE; /* Check if the previous command is completed */ - if (btm_cb.devcb.p_stored_link_key_cmpl_cb) + if (btm_cb.devcb.p_stored_link_key_cmpl_cb) { return (BTM_BUSY); + } - if (!bd_addr) - { + if (!bd_addr) { /* This is to delete all link keys */ delete_all_flag = TRUE; @@ -918,16 +916,15 @@ tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) } BTM_TRACE_EVENT ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s", - delete_all_flag ? "TRUE" : "FALSE"); + delete_all_flag ? "TRUE" : "FALSE"); /* Send the HCI command */ btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; - if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag)) - { + if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag)) { return (BTM_NO_RESOURCES); - } - else + } else { return (BTM_SUCCESS); + } } /******************************************************************************* @@ -948,8 +945,7 @@ void btm_delete_stored_link_key_complete (UINT8 *p) /* If there was a callback registered for read stored link key, call it */ btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { /* Set the call back event to indicate command complete */ result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS; @@ -978,8 +974,9 @@ void btm_report_device_status (tBTM_DEV_STATUS status) tBTM_DEV_STATUS_CB *p_cb = btm_cb.devcb.p_dev_status_cb; /* Call the call back to pass the device status to application */ - if (p_cb) + if (p_cb) { (*p_cb)(status); + } } diff --git a/components/bt/bluedroid/stack/btm/btm_inq.c b/components/bt/bluedroid/stack/btm/btm_inq.c old mode 100755 new mode 100644 index 6a9eea526..6492cd42b --- a/components/bt/bluedroid/stack/btm/btm_inq.c +++ b/components/bt/bluedroid/stack/btm/btm_inq.c @@ -50,15 +50,14 @@ /********************************************************************************/ /* L O C A L D A T A D E F I N I T I O N S */ /********************************************************************************/ -static const LAP general_inq_lap = {0x9e,0x8b,0x33}; -static const LAP limited_inq_lap = {0x9e,0x8b,0x00}; +static const LAP general_inq_lap = {0x9e, 0x8b, 0x33}; +static const LAP limited_inq_lap = {0x9e, 0x8b, 0x00}; #if (defined(SDP_INCLUDED) && SDP_INCLUDED == TRUE) -static const UINT16 BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] = -{ +static const UINT16 BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] = { UUID_SERVCLASS_SERVICE_DISCOVERY_SERVER, -/* UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR, */ -/* UUID_SERVCLASS_PUBLIC_BROWSE_GROUP, */ + /* UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR, */ + /* UUID_SERVCLASS_PUBLIC_BROWSE_GROUP, */ UUID_SERVCLASS_SERIAL_PORT, UUID_SERVCLASS_LAN_ACCESS_USING_PPP, UUID_SERVCLASS_DIALUP_NETWORKING, @@ -71,19 +70,19 @@ static const UINT16 BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] = UUID_SERVCLASS_AUDIO_SOURCE, UUID_SERVCLASS_AUDIO_SINK, UUID_SERVCLASS_AV_REM_CTRL_TARGET, -/* UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, */ + /* UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, */ UUID_SERVCLASS_AV_REMOTE_CONTROL, -/* UUID_SERVCLASS_VIDEO_CONFERENCING, */ + /* UUID_SERVCLASS_VIDEO_CONFERENCING, */ UUID_SERVCLASS_INTERCOM, UUID_SERVCLASS_FAX, UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, -/* UUID_SERVCLASS_WAP, */ -/* UUID_SERVCLASS_WAP_CLIENT, */ + /* UUID_SERVCLASS_WAP, */ + /* UUID_SERVCLASS_WAP_CLIENT, */ UUID_SERVCLASS_PANU, UUID_SERVCLASS_NAP, UUID_SERVCLASS_GN, UUID_SERVCLASS_DIRECT_PRINTING, -/* UUID_SERVCLASS_REFERENCE_PRINTING, */ + /* UUID_SERVCLASS_REFERENCE_PRINTING, */ UUID_SERVCLASS_IMAGING, UUID_SERVCLASS_IMAGING_RESPONDER, UUID_SERVCLASS_IMAGING_AUTO_ARCHIVE, @@ -91,36 +90,36 @@ static const UINT16 BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] = UUID_SERVCLASS_HF_HANDSFREE, UUID_SERVCLASS_AG_HANDSFREE, UUID_SERVCLASS_DIR_PRT_REF_OBJ_SERVICE, -/* UUID_SERVCLASS_REFLECTED_UI, */ + /* UUID_SERVCLASS_REFLECTED_UI, */ UUID_SERVCLASS_BASIC_PRINTING, UUID_SERVCLASS_PRINTING_STATUS, UUID_SERVCLASS_HUMAN_INTERFACE, UUID_SERVCLASS_CABLE_REPLACEMENT, UUID_SERVCLASS_HCRP_PRINT, UUID_SERVCLASS_HCRP_SCAN, -/* UUID_SERVCLASS_COMMON_ISDN_ACCESS, */ -/* UUID_SERVCLASS_VIDEO_CONFERENCING_GW, */ -/* UUID_SERVCLASS_UDI_MT, */ -/* UUID_SERVCLASS_UDI_TA, */ -/* UUID_SERVCLASS_VCP, */ + /* UUID_SERVCLASS_COMMON_ISDN_ACCESS, */ + /* UUID_SERVCLASS_VIDEO_CONFERENCING_GW, */ + /* UUID_SERVCLASS_UDI_MT, */ + /* UUID_SERVCLASS_UDI_TA, */ + /* UUID_SERVCLASS_VCP, */ UUID_SERVCLASS_SAP, UUID_SERVCLASS_PBAP_PCE, UUID_SERVCLASS_PBAP_PSE, UUID_SERVCLASS_PHONE_ACCESS, UUID_SERVCLASS_HEADSET_HS, UUID_SERVCLASS_PNP_INFORMATION, -/* UUID_SERVCLASS_GENERIC_NETWORKING, */ -/* UUID_SERVCLASS_GENERIC_FILETRANSFER, */ -/* UUID_SERVCLASS_GENERIC_AUDIO, */ -/* UUID_SERVCLASS_GENERIC_TELEPHONY, */ -/* UUID_SERVCLASS_UPNP_SERVICE, */ -/* UUID_SERVCLASS_UPNP_IP_SERVICE, */ -/* UUID_SERVCLASS_ESDP_UPNP_IP_PAN, */ -/* UUID_SERVCLASS_ESDP_UPNP_IP_LAP, */ -/* UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP, */ + /* UUID_SERVCLASS_GENERIC_NETWORKING, */ + /* UUID_SERVCLASS_GENERIC_FILETRANSFER, */ + /* UUID_SERVCLASS_GENERIC_AUDIO, */ + /* UUID_SERVCLASS_GENERIC_TELEPHONY, */ + /* UUID_SERVCLASS_UPNP_SERVICE, */ + /* UUID_SERVCLASS_UPNP_IP_SERVICE, */ + /* UUID_SERVCLASS_ESDP_UPNP_IP_PAN, */ + /* UUID_SERVCLASS_ESDP_UPNP_IP_LAP, */ + /* UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP, */ UUID_SERVCLASS_VIDEO_SOURCE, UUID_SERVCLASS_VIDEO_SINK, -/* UUID_SERVCLASS_VIDEO_DISTRIBUTION */ + /* UUID_SERVCLASS_VIDEO_DISTRIBUTION */ UUID_SERVCLASS_MESSAGE_ACCESS, UUID_SERVCLASS_MESSAGE_NOTIFICATION, UUID_SERVCLASS_HDP_SOURCE, @@ -140,7 +139,7 @@ static void btm_clr_inq_result_flt (void); static UINT8 btm_convert_uuid_to_eir_service( UINT16 uuid16 ); static void btm_set_eir_uuid( UINT8 *p_eir, tBTM_INQ_RESULTS *p_results ); static UINT8 *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size, - UINT8 *p_num_uuid, UINT8 *p_uuid_list_type ); + UINT8 *p_num_uuid, UINT8 *p_uuid_list_type ); static UINT16 btm_convert_uuid_to_uuid16( UINT8 *p_uuid, UINT8 uuid_size ); /******************************************************************************* @@ -172,11 +171,9 @@ tBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, UINT16 inter BTM_TRACE_API ("BTM_SetDiscoverability\n"); #if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE) - if (controller_get_interface()->supports_ble()) - { + if (controller_get_interface()->supports_ble()) { if (btm_ble_set_discoverability((UINT16)(inq_mode)) - == BTM_SUCCESS) - { + == BTM_SUCCESS) { btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_BLE_DISCOVERABLE_MASK); btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_DISCOVERABLE_MASK); } @@ -185,54 +182,54 @@ tBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, UINT16 inter #endif /*** Check mode parameter ***/ - if (inq_mode > BTM_MAX_DISCOVERABLE) + if (inq_mode > BTM_MAX_DISCOVERABLE) { return (BTM_ILLEGAL_VALUE); + } /* Make sure the controller is active */ - if (!controller_get_interface()->get_is_ready()) + if (!controller_get_interface()->get_is_ready()) { return (BTM_DEV_RESET); + } /* If the window and/or interval is '0', set to default values */ - if (!window) + if (!window) { window = BTM_DEFAULT_DISC_WINDOW; + } - if (!interval) + if (!interval) { interval = BTM_DEFAULT_DISC_INTERVAL; + } BTM_TRACE_API ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x\n", - inq_mode, window, interval); + inq_mode, window, interval); /*** Check for valid window and interval parameters ***/ /*** Only check window and duration if mode is connectable ***/ - if (inq_mode != BTM_NON_DISCOVERABLE) - { + if (inq_mode != BTM_NON_DISCOVERABLE) { /* window must be less than or equal to interval */ if (window < HCI_MIN_INQUIRYSCAN_WINDOW || - window > HCI_MAX_INQUIRYSCAN_WINDOW || - interval < HCI_MIN_INQUIRYSCAN_INTERVAL || - interval > HCI_MAX_INQUIRYSCAN_INTERVAL || - window > interval) - { + window > HCI_MAX_INQUIRYSCAN_WINDOW || + interval < HCI_MIN_INQUIRYSCAN_INTERVAL || + interval > HCI_MAX_INQUIRYSCAN_INTERVAL || + window > interval) { return (BTM_ILLEGAL_VALUE); } } /* Set the IAC if needed */ - if (inq_mode != BTM_NON_DISCOVERABLE) - { - if (inq_mode & BTM_LIMITED_DISCOVERABLE) - { + if (inq_mode != BTM_NON_DISCOVERABLE) { + if (inq_mode & BTM_LIMITED_DISCOVERABLE) { /* Use the GIAC and LIAC codes for limited discoverable mode */ memcpy (temp_lap[0], limited_inq_lap, LAP_LEN); memcpy (temp_lap[1], general_inq_lap, LAP_LEN); - if (!btsnd_hcic_write_cur_iac_lap (2, (LAP * const) temp_lap)) - return (BTM_NO_RESOURCES); /* Cannot continue */ - } - else - { - if (!btsnd_hcic_write_cur_iac_lap (1, (LAP * const) &general_inq_lap)) - return (BTM_NO_RESOURCES); /* Cannot continue */ + if (!btsnd_hcic_write_cur_iac_lap (2, (LAP * const) temp_lap)) { + return (BTM_NO_RESOURCES); /* Cannot continue */ + } + } else { + if (!btsnd_hcic_write_cur_iac_lap (1, (LAP * const) &general_inq_lap)) { + return (BTM_NO_RESOURCES); /* Cannot continue */ + } } scan_mode |= HCI_INQUIRY_SCAN_ENABLED; @@ -240,41 +237,39 @@ tBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, UINT16 inter /* Send down the inquiry scan window and period if changed */ if ((window != btm_cb.btm_inq_vars.inq_scan_window) || - (interval != btm_cb.btm_inq_vars.inq_scan_period)) - { - if (btsnd_hcic_write_inqscan_cfg (interval, window)) - { + (interval != btm_cb.btm_inq_vars.inq_scan_period)) { + if (btsnd_hcic_write_inqscan_cfg (interval, window)) { btm_cb.btm_inq_vars.inq_scan_window = window; btm_cb.btm_inq_vars.inq_scan_period = interval; - } - else + } else { return (BTM_NO_RESOURCES); + } } - if (btm_cb.btm_inq_vars.connectable_mode & BTM_CONNECTABLE_MASK) + if (btm_cb.btm_inq_vars.connectable_mode & BTM_CONNECTABLE_MASK) { scan_mode |= HCI_PAGE_SCAN_ENABLED; + } - if (btsnd_hcic_write_scan_enable (scan_mode)) - { + if (btsnd_hcic_write_scan_enable (scan_mode)) { btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_DISCOVERABLE_MASK); btm_cb.btm_inq_vars.discoverable_mode |= inq_mode; - } - else + } else { return (BTM_NO_RESOURCES); + } /* Change the service class bit if mode has changed */ p_cod = BTM_ReadDeviceClass(); BTM_COD_SERVICE_CLASS(service_class, p_cod); is_limited = (inq_mode & BTM_LIMITED_DISCOVERABLE) ? TRUE : FALSE; cod_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? TRUE : FALSE; - if (is_limited ^ cod_limited) - { + if (is_limited ^ cod_limited) { BTM_COD_MINOR_CLASS(minor, p_cod ); BTM_COD_MAJOR_CLASS(major, p_cod ); - if (is_limited) + if (is_limited) { service_class |= BTM_COD_SERVICE_LMTD_DISCOVER; - else + } else { service_class &= ~BTM_COD_SERVICE_LMTD_DISCOVER; + } FIELDS_TO_COD(cod, minor, major, service_class); (void) BTM_SetDeviceClass (cod); @@ -299,24 +294,26 @@ tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type) { BTM_TRACE_API ("BTM_SetInquiryScanType\n"); - if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED) + if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED) { return (BTM_ILLEGAL_VALUE); + } /* whatever app wants if device is not 1.2 scan type should be STANDARD */ - if (!controller_get_interface()->supports_interlaced_inquiry_scan()) - return (BTM_MODE_UNSUPPORTED); + if (!controller_get_interface()->supports_interlaced_inquiry_scan()) { + return (BTM_MODE_UNSUPPORTED); + } /* Check for scan type if configuration has been changed */ - if (scan_type != btm_cb.btm_inq_vars.inq_scan_type) - { - if (BTM_IsDeviceUp()) - { - if (btsnd_hcic_write_inqscan_type ((UINT8)scan_type)) + if (scan_type != btm_cb.btm_inq_vars.inq_scan_type) { + if (BTM_IsDeviceUp()) { + if (btsnd_hcic_write_inqscan_type ((UINT8)scan_type)) { btm_cb.btm_inq_vars.inq_scan_type = scan_type; - else + } else { return (BTM_NO_RESOURCES); + } + } else { + return (BTM_WRONG_MODE); } - else return (BTM_WRONG_MODE); } return (BTM_SUCCESS); } @@ -336,24 +333,26 @@ tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type) tBTM_STATUS BTM_SetPageScanType (UINT16 scan_type) { BTM_TRACE_API ("BTM_SetPageScanType\n"); - if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED) + if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED) { return (BTM_ILLEGAL_VALUE); + } /* whatever app wants if device is not 1.2 scan type should be STANDARD */ - if (!controller_get_interface()->supports_interlaced_inquiry_scan()) - return (BTM_MODE_UNSUPPORTED); + if (!controller_get_interface()->supports_interlaced_inquiry_scan()) { + return (BTM_MODE_UNSUPPORTED); + } /* Check for scan type if configuration has been changed */ - if (scan_type != btm_cb.btm_inq_vars.page_scan_type) - { - if (BTM_IsDeviceUp()) - { - if (btsnd_hcic_write_pagescan_type ((UINT8)scan_type)) + if (scan_type != btm_cb.btm_inq_vars.page_scan_type) { + if (BTM_IsDeviceUp()) { + if (btsnd_hcic_write_pagescan_type ((UINT8)scan_type)) { btm_cb.btm_inq_vars.page_scan_type = scan_type; - else + } else { return (BTM_NO_RESOURCES); + } + } else { + return (BTM_WRONG_MODE); } - else return (BTM_WRONG_MODE); } return (BTM_SUCCESS); } @@ -378,28 +377,27 @@ tBTM_STATUS BTM_SetInquiryMode (UINT8 mode) { const controller_t *controller = controller_get_interface(); BTM_TRACE_API ("BTM_SetInquiryMode\n"); - if (mode == BTM_INQ_RESULT_STANDARD) - { + if (mode == BTM_INQ_RESULT_STANDARD) { /* mandatory mode */ - } - else if (mode == BTM_INQ_RESULT_WITH_RSSI) - { - if (!controller->supports_rssi_with_inquiry_results()) + } else if (mode == BTM_INQ_RESULT_WITH_RSSI) { + if (!controller->supports_rssi_with_inquiry_results()) { return (BTM_MODE_UNSUPPORTED); - } - else if (mode == BTM_INQ_RESULT_EXTENDED) - { - if (!controller->supports_extended_inquiry_response()) + } + } else if (mode == BTM_INQ_RESULT_EXTENDED) { + if (!controller->supports_extended_inquiry_response()) { return (BTM_MODE_UNSUPPORTED); - } - else + } + } else { return (BTM_ILLEGAL_VALUE); + } - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } - if (!btsnd_hcic_write_inquiry_mode (mode)) + if (!btsnd_hcic_write_inquiry_mode (mode)) { return (BTM_NO_RESOURCES); + } return (BTM_SUCCESS); } @@ -421,11 +419,13 @@ tBTM_STATUS BTM_SetInquiryMode (UINT8 mode) UINT16 BTM_ReadDiscoverability (UINT16 *p_window, UINT16 *p_interval) { BTM_TRACE_API ("BTM_ReadDiscoverability\n"); - if (p_window) + if (p_window) { *p_window = btm_cb.btm_inq_vars.inq_scan_window; + } - if (p_interval) + if (p_interval) { *p_interval = btm_cb.btm_inq_vars.inq_scan_period; + } return (btm_cb.btm_inq_vars.discoverable_mode); } @@ -467,33 +467,36 @@ tBTM_STATUS BTM_SetPeriodicInquiryMode (tBTM_INQ_PARMS *p_inqparms, UINT16 max_d tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars; BTM_TRACE_API ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d\n", - p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, - p_inqparms->filter_cond_type, min_delay, max_delay); + p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, + p_inqparms->filter_cond_type, min_delay, max_delay); /*** Make sure the device is ready ***/ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } /* Only one active inquiry is allowed in this implementation. Also do not allow an inquiry if the inquiry filter is being updated */ - if (p_inq->inq_active || p_inq->inqfilt_active) + if (p_inq->inq_active || p_inq->inqfilt_active) { return (BTM_BUSY); + } /* If illegal parameters return FALSE */ if (p_inqparms->mode != BTM_GENERAL_INQUIRY && - p_inqparms->mode != BTM_LIMITED_INQUIRY) + p_inqparms->mode != BTM_LIMITED_INQUIRY) { return (BTM_ILLEGAL_VALUE); + } /* Verify the parameters for this command */ if (p_inqparms->duration < BTM_MIN_INQUIRY_LEN || - p_inqparms->duration > BTM_MAX_INQUIRY_LENGTH || - min_delay <= p_inqparms->duration || - min_delay < BTM_PER_INQ_MIN_MIN_PERIOD || - min_delay > BTM_PER_INQ_MAX_MIN_PERIOD || - max_delay <= min_delay || - max_delay < BTM_PER_INQ_MIN_MAX_PERIOD) - /* max_delay > BTM_PER_INQ_MAX_MAX_PERIOD)*/ - /* BTM_PER_INQ_MAX_MAX_PERIOD set to 1's in all bits. Condition resulting in false always*/ + p_inqparms->duration > BTM_MAX_INQUIRY_LENGTH || + min_delay <= p_inqparms->duration || + min_delay < BTM_PER_INQ_MIN_MIN_PERIOD || + min_delay > BTM_PER_INQ_MAX_MIN_PERIOD || + max_delay <= min_delay || + max_delay < BTM_PER_INQ_MIN_MAX_PERIOD) + /* max_delay > BTM_PER_INQ_MAX_MAX_PERIOD)*/ + /* BTM_PER_INQ_MAX_MAX_PERIOD set to 1's in all bits. Condition resulting in false always*/ { return (BTM_ILLEGAL_VALUE); } @@ -506,24 +509,22 @@ tBTM_STATUS BTM_SetPeriodicInquiryMode (tBTM_INQ_PARMS *p_inqparms, UINT16 max_d p_inq->p_inq_results_cb = p_results_cb; p_inq->inq_active = (UINT8)((p_inqparms->mode == BTM_LIMITED_INQUIRY) ? - (BTM_LIMITED_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE) : - (BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE)); + (BTM_LIMITED_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE) : + (BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE)); /* If a filter is specified, then save it for later and clear the current filter. The setting of the filter is done upon completion of clearing of the previous filter. */ - if (p_inqparms->filter_cond_type != BTM_CLR_INQUIRY_FILTER) - { + if (p_inqparms->filter_cond_type != BTM_CLR_INQUIRY_FILTER) { p_inq->state = BTM_INQ_CLR_FILT_STATE; p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER; - } - else /* The filter is not being used so simply clear it; the inquiry can start after this operation */ + } else { /* The filter is not being used so simply clear it; the inquiry can start after this operation */ p_inq->state = BTM_INQ_SET_FILT_STATE; + } /* Before beginning the inquiry the current filter must be cleared, so initiate the command */ - if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type, &p_inqparms->filter_cond)) != BTM_CMD_STARTED) - { + if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type, &p_inqparms->filter_cond)) != BTM_CMD_STARTED) { /* If set filter command is not succesful reset the state */ p_inq->p_inq_results_cb = NULL; p_inq->state = BTM_INQ_INACTIVE_STATE; @@ -553,22 +554,24 @@ tBTM_STATUS BTM_CancelPeriodicInquiry(void) BTM_TRACE_API ("BTM_CancelPeriodicInquiry called\n"); /*** Make sure the device is ready ***/ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } /* Only cancel if one is active */ - if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) - { + if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { btm_cb.btm_inq_vars.inq_active = BTM_INQUIRY_INACTIVE; btm_cb.btm_inq_vars.p_inq_results_cb = (tBTM_INQ_RESULTS_CB *) NULL; - if (!btsnd_hcic_exit_per_inq ()) + if (!btsnd_hcic_exit_per_inq ()) { status = BTM_NO_RESOURCES; + } /* If the event filter is in progress, mark it so that the processing of the return event will be ignored */ - if(p_inq->inqfilt_active) + if (p_inq->inqfilt_active) { p_inq->pending_filt_complete_event++; + } p_inq->inqfilt_active = FALSE; p_inq->inq_counter++; @@ -599,10 +602,8 @@ tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, UINT16 inter BTM_TRACE_API ("BTM_SetConnectability\n"); #if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE) - if (controller_get_interface()->supports_ble()) - { - if (btm_ble_set_connectability(page_mode) != BTM_SUCCESS) - { + if (controller_get_interface()->supports_ble()) { + if (btm_ble_set_connectability(page_mode) != BTM_SUCCESS) { return BTM_NO_RESOURCES; } p_inq->connectable_mode &= (~BTM_BLE_CONNECTABLE_MASK); @@ -612,34 +613,36 @@ tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, UINT16 inter #endif /*** Check mode parameter ***/ - if (page_mode != BTM_NON_CONNECTABLE && page_mode != BTM_CONNECTABLE) + if (page_mode != BTM_NON_CONNECTABLE && page_mode != BTM_CONNECTABLE) { return (BTM_ILLEGAL_VALUE); + } /* Make sure the controller is active */ - if (!controller_get_interface()->get_is_ready()) + if (!controller_get_interface()->get_is_ready()) { return (BTM_DEV_RESET); + } /* If the window and/or interval is '0', set to default values */ - if (!window) + if (!window) { window = BTM_DEFAULT_CONN_WINDOW; + } - if (!interval) + if (!interval) { interval = BTM_DEFAULT_CONN_INTERVAL; + } BTM_TRACE_API ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x\n", - page_mode, window, interval); + page_mode, window, interval); /*** Check for valid window and interval parameters ***/ /*** Only check window and duration if mode is connectable ***/ - if (page_mode == BTM_CONNECTABLE) - { + if (page_mode == BTM_CONNECTABLE) { /* window must be less than or equal to interval */ if (window < HCI_MIN_PAGESCAN_WINDOW || - window > HCI_MAX_PAGESCAN_WINDOW || - interval < HCI_MIN_PAGESCAN_INTERVAL || - interval > HCI_MAX_PAGESCAN_INTERVAL || - window > interval) - { + window > HCI_MAX_PAGESCAN_WINDOW || + interval < HCI_MIN_PAGESCAN_INTERVAL || + interval > HCI_MAX_PAGESCAN_INTERVAL || + window > interval) { return (BTM_ILLEGAL_VALUE); } @@ -647,20 +650,20 @@ tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, UINT16 inter } if ((window != p_inq->page_scan_window) || - (interval != p_inq->page_scan_period)) - { + (interval != p_inq->page_scan_period)) { p_inq->page_scan_window = window; p_inq->page_scan_period = interval; - if (!btsnd_hcic_write_pagescan_cfg (interval, window)) + if (!btsnd_hcic_write_pagescan_cfg (interval, window)) { return (BTM_NO_RESOURCES); + } } /* Keep the inquiry scan as previouosly set */ - if (p_inq->discoverable_mode & BTM_DISCOVERABLE_MASK) + if (p_inq->discoverable_mode & BTM_DISCOVERABLE_MASK) { scan_mode |= HCI_INQUIRY_SCAN_ENABLED; + } - if (btsnd_hcic_write_scan_enable (scan_mode)) - { + if (btsnd_hcic_write_scan_enable (scan_mode)) { p_inq->connectable_mode &= (~BTM_CONNECTABLE_MASK); p_inq->connectable_mode |= page_mode; @@ -686,11 +689,13 @@ tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, UINT16 inter UINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval) { BTM_TRACE_API ("BTM_ReadConnectability\n"); - if (p_window) + if (p_window) { *p_window = btm_cb.btm_inq_vars.page_scan_window; + } - if (p_interval) + if (p_interval) { *p_interval = btm_cb.btm_inq_vars.page_scan_period; + } return (btm_cb.btm_inq_vars.connectable_mode); } @@ -713,7 +718,7 @@ UINT16 BTM_IsInquiryActive (void) { BTM_TRACE_API ("BTM_IsInquiryActive\n"); - return(btm_cb.btm_inq_vars.inq_active); + return (btm_cb.btm_inq_vars.inq_active); } @@ -734,18 +739,18 @@ tBTM_STATUS BTM_CancelInquiry(void) tBTM_STATUS status = BTM_SUCCESS; tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars; #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - UINT8 active_mode=p_inq->inq_active; + UINT8 active_mode = p_inq->inq_active; #endif BTM_TRACE_API ("BTM_CancelInquiry called\n"); /*** Make sure the device is ready ***/ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } /* Only cancel if not in periodic mode, otherwise the caller should call BTM_CancelPeriodicMode */ - if ((p_inq->inq_active &BTM_INQUIRY_ACTIVE_MASK) != 0 && - (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))) - { + if ((p_inq->inq_active & BTM_INQUIRY_ACTIVE_MASK) != 0 && + (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))) { p_inq->inq_active = BTM_INQUIRY_INACTIVE; p_inq->state = BTM_INQ_INACTIVE_STATE; p_inq->p_inq_results_cb = (tBTM_INQ_RESULTS_CB *) NULL; /* Do not notify caller anymore */ @@ -753,30 +758,29 @@ tBTM_STATUS BTM_CancelInquiry(void) /* If the event filter is in progress, mark it so that the processing of the return event will be ignored */ - if (p_inq->inqfilt_active) - { + if (p_inq->inqfilt_active) { p_inq->inqfilt_active = FALSE; p_inq->pending_filt_complete_event++; } - /* Initiate the cancel inquiry */ - else - { + /* Initiate the cancel inquiry */ + else { if (((p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK) != 0) #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - &&(active_mode & BTM_BR_INQUIRY_MASK) + && (active_mode & BTM_BR_INQUIRY_MASK) #endif - ) - { - if (!btsnd_hcic_inq_cancel()) + ) { + if (!btsnd_hcic_inq_cancel()) { status = BTM_NO_RESOURCES; + } } #if BLE_INCLUDED == TRUE if (((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - &&(active_mode & BTM_BLE_INQ_ACTIVE_MASK) + && (active_mode & BTM_BLE_INQ_ACTIVE_MASK) #endif - ) + ) { btm_ble_stop_inquiry(); + } #endif } @@ -785,8 +789,8 @@ tBTM_STATUS BTM_CancelInquiry(void) * btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT); */ - p_inq->inq_counter++; - btm_clr_inq_result_flt(); + p_inq->inq_counter++; + btm_clr_inq_result_flt(); } return (status); @@ -829,49 +833,49 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars; BTM_TRACE_API ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d\n", - p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, - p_inqparms->filter_cond_type); + p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, + p_inqparms->filter_cond_type); /* Only one active inquiry is allowed in this implementation. Also do not allow an inquiry if the inquiry filter is being updated */ - if (p_inq->inq_active || p_inq->inqfilt_active) - { + if (p_inq->inq_active || p_inq->inqfilt_active) { #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) /*check if LE observe is already running*/ - if(p_inq->scan_type==INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb!=NULL) - { + if (p_inq->scan_type == INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb != NULL) { BTM_TRACE_API("BTM_StartInquiry: LE observe in progress"); p_inq->scan_type = INQ_GENERAL; p_inq->inq_active = BTM_INQUIRY_INACTIVE; btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE; btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE); - } - else + } else #endif { return (BTM_BUSY); BTM_TRACE_API("BTM_StartInquiry: return BUSY\n"); } - } - else + } else { p_inq->scan_type = INQ_GENERAL; + } - /*** Make sure the device is ready ***/ - if (!BTM_IsDeviceUp()) + /*** Make sure the device is ready ***/ + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } - if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK)!= BTM_GENERAL_INQUIRY && - (p_inqparms->mode & BTM_BR_INQUIRY_MASK)!= BTM_LIMITED_INQUIRY + if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) != BTM_GENERAL_INQUIRY && + (p_inqparms->mode & BTM_BR_INQUIRY_MASK) != BTM_LIMITED_INQUIRY #if (BLE_INCLUDED == TRUE) - && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)!= BTM_BLE_GENERAL_INQUIRY - && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)!= BTM_BLE_LIMITED_INQUIRY + && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK) != BTM_BLE_GENERAL_INQUIRY + && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK) != BTM_BLE_LIMITED_INQUIRY #endif - ) + ) { return (BTM_ILLEGAL_VALUE); + } #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - if(p_inq->next_state==BTM_FINISH) - return BTM_ILLEGAL_VALUE; + if (p_inq->next_state == BTM_FINISH) { + return BTM_ILLEGAL_VALUE; + } #endif @@ -887,49 +891,44 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p BTM_TRACE_DEBUG("BTM_StartInquiry: p_inq->inq_active = 0x%02x\n", p_inq->inq_active); -/* interleave scan minimal conditions */ + /* interleave scan minimal conditions */ #if (BLE_INCLUDED==TRUE && (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)) /* check if both modes are present */ - if((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && (p_inqparms->mode & BTM_BR_INQUIRY_MASK)) - { + if ((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && (p_inqparms->mode & BTM_BR_INQUIRY_MASK)) { BTM_TRACE_API("BTM:Interleave Inquiry Mode Set\n"); - p_inqparms->duration=p_inqparms->intl_duration[p_inq->next_state]; - p_inq->inqparms.duration=p_inqparms->duration; - } - else - { + p_inqparms->duration = p_inqparms->intl_duration[p_inq->next_state]; + p_inq->inqparms.duration = p_inqparms->duration; + } else { BTM_TRACE_API("BTM:Single Mode: No interleaving, Mode:0x%02x\n", p_inqparms->mode); - p_inq->next_state=BTM_NO_INTERLEAVING; + p_inq->next_state = BTM_NO_INTERLEAVING; } #endif -/* start LE inquiry here if requested */ + /* start LE inquiry here if requested */ #if BLE_INCLUDED == TRUE if ((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - &&(p_inq->next_state==BTM_BLE_ONE || p_inq->next_state==BTM_BLE_TWO || - p_inq->next_state==BTM_NO_INTERLEAVING) + && (p_inq->next_state == BTM_BLE_ONE || p_inq->next_state == BTM_BLE_TWO || + p_inq->next_state == BTM_NO_INTERLEAVING) #endif - ) + ) { #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) p_inq->inq_active = (p_inqparms->mode & BTM_BLE_INQUIRY_MASK); BTM_TRACE_API("BTM:Starting LE Scan with duration %d and activeMode:0x%02x\n", - p_inqparms->duration, (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)); + p_inqparms->duration, (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)); #endif - if (!controller_get_interface()->supports_ble()) - { + if (!controller_get_interface()->supports_ble()) { p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK; status = BTM_ILLEGAL_VALUE; } /* BLE for now does not support filter condition for inquiry */ else if ((status = btm_ble_start_inquiry((UINT8)(p_inqparms->mode & BTM_BLE_INQUIRY_MASK), - p_inqparms->duration)) != BTM_CMD_STARTED) - { + p_inqparms->duration)) != BTM_CMD_STARTED) { BTM_TRACE_ERROR("Err Starting LE Inquiry.\n"); p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK; } @@ -938,19 +937,17 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p #endif #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - if(p_inq->next_state==BTM_NO_INTERLEAVING) - { - p_inq->next_state=BTM_FINISH; - } - else - { + if (p_inq->next_state == BTM_NO_INTERLEAVING) { + p_inq->next_state = BTM_FINISH; + } else { BTM_TRACE_API("BTM:Interleaving: started LE scan, Advancing to next state: %d\n", - p_inq->next_state+1); - p_inq->next_state+=1; + p_inq->next_state + 1); + p_inq->next_state += 1; } /* reset next_state if status <> BTM_Started */ - if(status!=BTM_CMD_STARTED) - p_inq->next_state=BTM_BR_ONE; + if (status != BTM_CMD_STARTED) { + p_inq->next_state = BTM_BR_ONE; + } /* if interleave scan..return here */ return status; @@ -962,62 +959,60 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p #endif /* end of BLE_INCLUDED */ /* we're done with this routine if BR/EDR inquiry is not desired. */ - if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) == BTM_INQUIRY_NONE) + if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) == BTM_INQUIRY_NONE) { return status; + } /* BR/EDR inquiry portion */ #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - if((p_inq->next_state==BTM_BR_ONE || p_inq->next_state==BTM_BR_TWO || - p_inq->next_state==BTM_NO_INTERLEAVING )) - { + if ((p_inq->next_state == BTM_BR_ONE || p_inq->next_state == BTM_BR_TWO || + p_inq->next_state == BTM_NO_INTERLEAVING )) { p_inq->inq_active = (p_inqparms->mode & BTM_BR_INQUIRY_MASK); #endif - /* If a filter is specified, then save it for later and clear the current filter. - The setting of the filter is done upon completion of clearing of the previous - filter. - */ - switch (p_inqparms->filter_cond_type) - { - case BTM_CLR_INQUIRY_FILTER: - p_inq->state = BTM_INQ_SET_FILT_STATE; - break; + /* If a filter is specified, then save it for later and clear the current filter. + The setting of the filter is done upon completion of clearing of the previous + filter. + */ + switch (p_inqparms->filter_cond_type) { + case BTM_CLR_INQUIRY_FILTER: + p_inq->state = BTM_INQ_SET_FILT_STATE; + break; - case BTM_FILTER_COND_DEVICE_CLASS: - case BTM_FILTER_COND_BD_ADDR: - /* The filter is not being used so simply clear it; - the inquiry can start after this operation */ - p_inq->state = BTM_INQ_CLR_FILT_STATE; - p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER; - /* =============>>>> adding LE filtering here ????? */ - break; + case BTM_FILTER_COND_DEVICE_CLASS: + case BTM_FILTER_COND_BD_ADDR: + /* The filter is not being used so simply clear it; + the inquiry can start after this operation */ + p_inq->state = BTM_INQ_CLR_FILT_STATE; + p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER; + /* =============>>>> adding LE filtering here ????? */ + break; - default: - return (BTM_ILLEGAL_VALUE); - } + default: + return (BTM_ILLEGAL_VALUE); + } - /* Before beginning the inquiry the current filter must be cleared, so initiate the command */ - if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type, - &p_inqparms->filter_cond)) != BTM_CMD_STARTED) - p_inq->state = BTM_INQ_INACTIVE_STATE; + /* Before beginning the inquiry the current filter must be cleared, so initiate the command */ + if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type, + &p_inqparms->filter_cond)) != BTM_CMD_STARTED) { + p_inq->state = BTM_INQ_INACTIVE_STATE; + } #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - if (p_inq->next_state==BTM_NO_INTERLEAVING) - p_inq->next_state=BTM_FINISH; - else - { + if (p_inq->next_state == BTM_NO_INTERLEAVING) { + p_inq->next_state = BTM_FINISH; + } else { BTM_TRACE_API("BTM:Interleaving: Started BTM inq, Advancing to next state: %d\n", - p_inq->next_state+1); - p_inq->next_state+=1; + p_inq->next_state + 1); + p_inq->next_state += 1; } - } - if (status!=BTM_CMD_STARTED) - { - /* Some error beginning the scan process. - Reset the next_state parameter.. Do we need to reset the inq_active also? - */ + } + if (status != BTM_CMD_STARTED) { + /* Some error beginning the scan process. + Reset the next_state parameter.. Do we need to reset the inq_active also? + */ BTM_TRACE_API("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x\n", status); - p_inq->next_state=BTM_BR_ONE; - } + p_inq->next_state = BTM_BR_ONE; + } #endif @@ -1048,32 +1043,29 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p ** *******************************************************************************/ tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb - ,tBT_TRANSPORT transport) + , tBT_TRANSPORT transport) { tBTM_INQ_INFO *p_cur = NULL; tINQ_DB_ENT *p_i; BTM_TRACE_API ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]\n", - remote_bda[0], remote_bda[1], remote_bda[2], - remote_bda[3], remote_bda[4], remote_bda[5]); + remote_bda[0], remote_bda[1], remote_bda[2], + remote_bda[3], remote_bda[4], remote_bda[5]); /* Use the remote device's clock offset if it is in the local inquiry database */ - if ((p_i = btm_inq_db_find (remote_bda)) != NULL) - { + if ((p_i = btm_inq_db_find (remote_bda)) != NULL) { p_cur = &p_i->inq_info; } BTM_TRACE_API ("no device found in inquiry db\n"); #if (BLE_INCLUDED == TRUE) - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { return btm_ble_read_remote_name(remote_bda, p_cur, p_cb); - } - else + } else #endif - return (btm_initiate_rem_name (remote_bda, p_cur, BTM_RMT_NAME_EXT, - BTM_EXT_RMT_NAME_TIMEOUT, p_cb)); + return (btm_initiate_rem_name (remote_bda, p_cur, BTM_RMT_NAME_EXT, + BTM_EXT_RMT_NAME_TIMEOUT, p_cb)); } /******************************************************************************* @@ -1099,25 +1091,24 @@ tBTM_STATUS BTM_CancelRemoteDeviceName (void) BTM_TRACE_API ("BTM_CancelRemoteDeviceName()\n"); /* Make sure there is not already one in progress */ - if (p_inq->remname_active) - { + if (p_inq->remname_active) { #if BLE_INCLUDED == TRUE - if (BTM_UseLeLink(p_inq->remname_bda)) - { - if (btm_ble_cancel_remote_name(p_inq->remname_bda)) + if (BTM_UseLeLink(p_inq->remname_bda)) { + if (btm_ble_cancel_remote_name(p_inq->remname_bda)) { return (BTM_CMD_STARTED); - else + } else { return (BTM_UNKNOWN_ADDR); - } - else + } + } else #endif - if (btsnd_hcic_rmt_name_req_cancel (p_inq->remname_bda)) - return (BTM_CMD_STARTED); - else - return (BTM_NO_RESOURCES); - } - else + if (btsnd_hcic_rmt_name_req_cancel (p_inq->remname_bda)) { + return (BTM_CMD_STARTED); + } else { + return (BTM_NO_RESOURCES); + } + } else { return (BTM_WRONG_MODE); + } } /******************************************************************************* @@ -1134,11 +1125,12 @@ tBTM_STATUS BTM_CancelRemoteDeviceName (void) tBTM_INQ_INFO *BTM_InqDbRead (BD_ADDR p_bda) { BTM_TRACE_API ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]\n", - p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); + p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); tINQ_DB_ENT *p_ent = btm_inq_db_find(p_bda); - if (!p_ent) - return NULL; + if (!p_ent) { + return NULL; + } return &p_ent->inq_info; } @@ -1161,10 +1153,10 @@ tBTM_INQ_INFO *BTM_InqDbFirst (void) UINT16 xx; tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db; - for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) - { - if (p_ent->in_use) + for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { + if (p_ent->in_use) { return (&p_ent->inq_info); + } } /* If here, no used entry found */ @@ -1188,22 +1180,21 @@ tBTM_INQ_INFO *BTM_InqDbNext (tBTM_INQ_INFO *p_cur) tINQ_DB_ENT *p_ent; UINT16 inx; - if (p_cur) - { + if (p_cur) { p_ent = (tINQ_DB_ENT *) ((UINT8 *)p_cur - offsetof (tINQ_DB_ENT, inq_info)); inx = (UINT16)((p_ent - btm_cb.btm_inq_vars.inq_db) + 1); - for (p_ent = &btm_cb.btm_inq_vars.inq_db[inx]; inx < BTM_INQ_DB_SIZE; inx++, p_ent++) - { - if (p_ent->in_use) + for (p_ent = &btm_cb.btm_inq_vars.inq_db[inx]; inx < BTM_INQ_DB_SIZE; inx++, p_ent++) { + if (p_ent->in_use) { return (&p_ent->inq_info); + } } /* If here, more entries found */ return ((tBTM_INQ_INFO *)NULL); - } - else + } else { return (BTM_InqDbFirst()); + } } @@ -1227,8 +1218,9 @@ tBTM_STATUS BTM_ClearInqDb (BD_ADDR p_bda) /* If an inquiry or remote name is in progress return busy */ if (p_inq->inq_active != BTM_INQUIRY_INACTIVE || - p_inq->inqfilt_active) + p_inq->inqfilt_active) { return (BTM_BUSY); + } btm_clr_inq_db(p_bda); @@ -1248,22 +1240,22 @@ tBTM_STATUS BTM_ClearInqDb (BD_ADDR p_bda) *******************************************************************************/ tBTM_STATUS BTM_ReadInquiryRspTxPower (tBTM_CMPL_CB *p_cb) { - if (btm_cb.devcb.p_txpwer_cmpl_cb) + if (btm_cb.devcb.p_txpwer_cmpl_cb) { return (BTM_BUSY); + } - btu_start_timer (&btm_cb.devcb.txpwer_timer, BTU_TTYPE_BTM_ACL, BTM_INQ_REPLY_TIMEOUT ); + btu_start_timer (&btm_cb.devcb.txpwer_timer, BTU_TTYPE_BTM_ACL, BTM_INQ_REPLY_TIMEOUT ); btm_cb.devcb.p_txpwer_cmpl_cb = p_cb; - if (!btsnd_hcic_read_inq_tx_power ()) - { + if (!btsnd_hcic_read_inq_tx_power ()) { btm_cb.devcb.p_txpwer_cmpl_cb = NULL; btu_stop_timer (&btm_cb.devcb.txpwer_timer); return (BTM_NO_RESOURCES); - } - else + } else { return (BTM_CMD_STARTED); + } } /********************************************************************************* @@ -1294,18 +1286,15 @@ void btm_inq_db_reset (void) btu_stop_timer (&p_inq->inq_timer_ent); /* If an inquiry or periodic inquiry is active, reset the mode to inactive */ - if (p_inq->inq_active != BTM_INQUIRY_INACTIVE) - { + if (p_inq->inq_active != BTM_INQUIRY_INACTIVE) { temp_inq_active = p_inq->inq_active; /* Save so state can change BEFORE callback is called */ p_inq->inq_active = BTM_INQUIRY_INACTIVE; /* If not a periodic inquiry, the complete callback must be called to notify caller */ if (temp_inq_active == BTM_LIMITED_INQUIRY_ACTIVE || - temp_inq_active == BTM_GENERAL_INQUIRY_ACTIVE) - { - if (p_inq->p_inq_cmpl_cb) - { + temp_inq_active == BTM_GENERAL_INQUIRY_ACTIVE) { + if (p_inq->p_inq_cmpl_cb) { num_responses = 0; (*p_inq->p_inq_cmpl_cb)(&num_responses); } @@ -1313,14 +1302,12 @@ void btm_inq_db_reset (void) } /* Cancel a remote name request if active, and notify the caller (if waiting) */ - if (p_inq->remname_active ) - { + if (p_inq->remname_active ) { btu_stop_timer (&p_inq->rmt_name_timer_ent); p_inq->remname_active = FALSE; memset(p_inq->remname_bda, 0, BD_ADDR_LEN); - if (p_inq->p_remname_cmpl_cb) - { + if (p_inq->p_remname_cmpl_cb) { rem_name.status = BTM_DEV_RESET; (*p_inq->p_remname_cmpl_cb)(&rem_name); @@ -1329,12 +1316,10 @@ void btm_inq_db_reset (void) } /* Cancel an inquiry filter request if active, and notify the caller (if waiting) */ - if (p_inq->inqfilt_active) - { + if (p_inq->inqfilt_active) { p_inq->inqfilt_active = FALSE; - if (p_inq->p_inqfilter_cmpl_cb) - { + if (p_inq->p_inqfilter_cmpl_cb) { status = BTM_DEV_RESET; (*p_inq->p_inqfilter_cmpl_cb)(&status); } @@ -1388,22 +1373,17 @@ void btm_inq_db_init (void) *******************************************************************************/ void btm_inq_stop_on_ssp(void) { - UINT8 normal_active = (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE); + UINT8 normal_active = (BTM_GENERAL_INQUIRY_ACTIVE | BTM_LIMITED_INQUIRY_ACTIVE); #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d\n", - btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); + btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); #endif - if (btm_cb.btm_inq_vars.no_inc_ssp) - { - if (btm_cb.btm_inq_vars.state == BTM_INQ_ACTIVE_STATE) - { - if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) - { + if (btm_cb.btm_inq_vars.no_inc_ssp) { + if (btm_cb.btm_inq_vars.state == BTM_INQ_ACTIVE_STATE) { + if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { BTM_CancelPeriodicInquiry(); - } - else if (btm_cb.btm_inq_vars.inq_active & normal_active) - { + } else if (btm_cb.btm_inq_vars.inq_active & normal_active) { /* can not call BTM_CancelInquiry() here. We need to report inquiry complete evt */ btsnd_hcic_inq_cancel(); } @@ -1448,23 +1428,20 @@ void btm_clr_inq_db (BD_ADDR p_bda) #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_clr_inq_db: inq_active:0x%x state:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state); #endif - for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) - { - if (p_ent->in_use) - { + for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { + if (p_ent->in_use) { /* If this is the specified BD_ADDR or clearing all devices */ if (p_bda == NULL || - (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN))) - { + (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN))) { p_ent->in_use = FALSE; } } } #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("inq_active:0x%x state:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state); #endif } @@ -1483,8 +1460,7 @@ static void btm_clr_inq_result_flt (void) { tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars; - if (p_inq->p_bd_db) - { + if (p_inq->p_bd_db) { GKI_freebuf(p_inq->p_bd_db); p_inq->p_bd_db = NULL; } @@ -1509,18 +1485,18 @@ BOOLEAN btm_inq_find_bdaddr (BD_ADDR p_bda) UINT16 xx; /* Don't bother searching, database doesn't exist or periodic mode */ - if ((p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) || !p_db) + if ((p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) || !p_db) { return (FALSE); - - for (xx = 0; xx < p_inq->num_bd_entries; xx++, p_db++) - { - if (!memcmp(p_db->bd_addr, p_bda, BD_ADDR_LEN) - && p_db->inq_count == p_inq->inq_counter) - return (TRUE); } - if (xx < p_inq->max_bd_entries) - { + for (xx = 0; xx < p_inq->num_bd_entries; xx++, p_db++) { + if (!memcmp(p_db->bd_addr, p_bda, BD_ADDR_LEN) + && p_db->inq_count == p_inq->inq_counter) { + return (TRUE); + } + } + + if (xx < p_inq->max_bd_entries) { p_db->inq_count = p_inq->inq_counter; memcpy(p_db->bd_addr, p_bda, BD_ADDR_LEN); p_inq->num_bd_entries++; @@ -1545,10 +1521,10 @@ tINQ_DB_ENT *btm_inq_db_find (BD_ADDR p_bda) UINT16 xx; tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db; - for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) - { - if ((p_ent->in_use) && (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN))) + for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { + if ((p_ent->in_use) && (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN))) { return (p_ent); + } } /* If here, not found */ @@ -1573,10 +1549,8 @@ tINQ_DB_ENT *btm_inq_db_new (BD_ADDR p_bda) tINQ_DB_ENT *p_old = btm_cb.btm_inq_vars.inq_db; UINT32 ot = 0xFFFFFFFF; - for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) - { - if (!p_ent->in_use) - { + for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { + if (!p_ent->in_use) { memset (p_ent, 0, sizeof (tINQ_DB_ENT)); memcpy (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN); p_ent->in_use = TRUE; @@ -1584,8 +1558,7 @@ tINQ_DB_ENT *btm_inq_db_new (BD_ADDR p_bda) return (p_ent); } - if (p_ent->time_of_resp < ot) - { + if (p_ent->time_of_resp < ot) { p_old = p_ent; ot = p_ent->time_of_resp; } @@ -1625,7 +1598,7 @@ tINQ_DB_ENT *btm_inq_db_new (BD_ADDR p_bda) ** *******************************************************************************/ static tBTM_STATUS btm_set_inq_event_filter (UINT8 filter_cond_type, - tBTM_INQ_FILT_COND *p_filt_cond) + tBTM_INQ_FILT_COND *p_filt_cond) { UINT8 condition_length = DEV_CLASS_LEN * 2; UINT8 condition_buf[DEV_CLASS_LEN * 2]; @@ -1633,15 +1606,14 @@ static tBTM_STATUS btm_set_inq_event_filter (UINT8 filter_cond_type, #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]\n", - filter_cond_type); + filter_cond_type); BTM_TRACE_DEBUG (" condition [%02x%02x%02x %02x%02x%02x]\n", - p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], p_filt_cond->bdaddr_cond[2], - p_filt_cond->bdaddr_cond[3], p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]); + p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], p_filt_cond->bdaddr_cond[2], + p_filt_cond->bdaddr_cond[3], p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]); #endif /* Load the correct filter condition to pass to the lower layer */ - switch (filter_cond_type) - { + switch (filter_cond_type) { case BTM_FILTER_COND_DEVICE_CLASS: /* copy the device class and device class fields into contiguous memory to send to HCI */ memcpy (condition_buf, p_filt_cond->cod_cond.dev_class, DEV_CLASS_LEN); @@ -1671,9 +1643,11 @@ static tBTM_STATUS btm_set_inq_event_filter (UINT8 filter_cond_type, if (btsnd_hcic_set_event_filter(HCI_FILTER_INQUIRY_RESULT, filter_cond_type, p_cond, condition_length)) + { return (BTM_CMD_STARTED); - else + } else { return (BTM_NO_RESOURCES); + } } @@ -1697,43 +1671,38 @@ void btm_event_filter_complete (UINT8 *p) #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); #endif /* If the filter complete event is from an old or cancelled request, ignore it */ - if(p_inq->pending_filt_complete_event) - { + if (p_inq->pending_filt_complete_event) { p_inq->pending_filt_complete_event--; return; } /* Only process the inquiry filter; Ignore the connection filter until it is used by the upper layers */ - if (p_inq->inqfilt_active == TRUE ) - { + if (p_inq->inqfilt_active == TRUE ) { /* Extract the returned status from the buffer */ STREAM_TO_UINT8 (hci_status, p); - if (hci_status != HCI_SUCCESS) - { + if (hci_status != HCI_SUCCESS) { /* If standalone operation, return the error status; if embedded in the inquiry, continue the inquiry */ BTM_TRACE_WARNING ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)\n", hci_status); status = BTM_ERR_PROCESSING; - } - else + } else { status = BTM_SUCCESS; + } /* If the set filter was initiated externally (via BTM_SetInqEventFilter), call the callback function to notify the initiator that it has completed */ - if (p_inq->state == BTM_INQ_INACTIVE_STATE) - { + if (p_inq->state == BTM_INQ_INACTIVE_STATE) { p_inq->inqfilt_active = FALSE; - if (p_cb) + if (p_cb) { (*p_cb) (&status); - } - else /* An inquiry is active (the set filter command was internally generated), + } + } else /* An inquiry is active (the set filter command was internally generated), process the next state of the process (Set a new filter or start the inquiry). */ { - if(status != BTM_SUCCESS) - { + if (status != BTM_SUCCESS) { /* Process the inquiry complete (Error Status) */ btm_process_inq_complete (BTM_ERR_PROCESSING, (UINT8)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK)); @@ -1746,22 +1715,16 @@ void btm_event_filter_complete (UINT8 *p) } /* Check to see if a new filter needs to be set up */ - if (p_inq->state == BTM_INQ_CLR_FILT_STATE) - { - if ((status = btm_set_inq_event_filter (p_inq->inqparms.filter_cond_type, &p_inq->inqparms.filter_cond)) == BTM_CMD_STARTED) - { + if (p_inq->state == BTM_INQ_CLR_FILT_STATE) { + if ((status = btm_set_inq_event_filter (p_inq->inqparms.filter_cond_type, &p_inq->inqparms.filter_cond)) == BTM_CMD_STARTED) { p_inq->state = BTM_INQ_SET_FILT_STATE; - } - else /* Error setting the filter: Call the initiator's callback function to indicate a failure */ - { + } else { /* Error setting the filter: Call the initiator's callback function to indicate a failure */ p_inq->inqfilt_active = FALSE; /* Process the inquiry complete (Error Status) */ btm_process_inq_complete (BTM_ERR_PROCESSING, (UINT8)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK)); } - } - else /* Initiate the Inquiry or Periodic Inquiry */ - { + } else { /* Initiate the Inquiry or Periodic Inquiry */ p_inq->state = BTM_INQ_ACTIVE_STATE; p_inq->inqfilt_active = FALSE; btm_initiate_inquiry (p_inq); @@ -1796,12 +1759,11 @@ static void btm_initiate_inquiry (tBTM_INQUIRY_VAR_ST *p_inq) #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); #endif btm_acl_update_busy_level (BTM_BLI_INQ_EVT); - if (p_inq->inq_active & BTM_SSP_INQUIRY_ACTIVE) - { + if (p_inq->inq_active & BTM_SSP_INQUIRY_ACTIVE) { btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK)); return; } @@ -1811,29 +1773,27 @@ static void btm_initiate_inquiry (tBTM_INQUIRY_VAR_ST *p_inq) lap = (p_inq->inq_active & BTM_LIMITED_INQUIRY_ACTIVE) ? &limited_inq_lap : &general_inq_lap; - if (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) - { + if (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { if (!btsnd_hcic_per_inq_mode (p_inq->per_max_delay, p_inq->per_min_delay, *lap, p_inqparms->duration, - p_inqparms->max_resps)) + p_inqparms->max_resps)) { btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK)); - } - else - { + } + } else { btm_clr_inq_result_flt(); /* Allocate memory to hold bd_addrs responding */ - if ((p_inq->p_bd_db = (tINQ_BDADDR *)GKI_getbuf(GKI_MAX_BUF_SIZE)) != NULL) - { + if ((p_inq->p_bd_db = (tINQ_BDADDR *)GKI_getbuf(GKI_MAX_BUF_SIZE)) != NULL) { p_inq->max_bd_entries = (UINT16)(GKI_MAX_BUF_SIZE / sizeof(tINQ_BDADDR)); memset(p_inq->p_bd_db, 0, GKI_MAX_BUF_SIZE); -/* BTM_TRACE_DEBUG("btm_initiate_inquiry: memory allocated for %d bdaddrs", - p_inq->max_bd_entries); */ + /* BTM_TRACE_DEBUG("btm_initiate_inquiry: memory allocated for %d bdaddrs", + p_inq->max_bd_entries); */ } - if (!btsnd_hcic_inquiry(*lap, p_inqparms->duration, 0)) + if (!btsnd_hcic_inquiry(*lap, p_inqparms->duration, 0)) { btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK)); + } } } @@ -1857,7 +1817,7 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) UINT8 num_resp, xx; BD_ADDR bda; tINQ_DB_ENT *p_i; - tBTM_INQ_RESULTS *p_cur=NULL; + tBTM_INQ_RESULTS *p_cur = NULL; BOOLEAN is_new = TRUE; BOOLEAN update = FALSE; INT8 i_rssi; @@ -1873,31 +1833,29 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d inq_res_mode=%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active, inq_res_mode); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active, inq_res_mode); #endif /* Only process the results if the BR inquiry is still active */ - if (!(p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK)) + if (!(p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK)) { return; + } STREAM_TO_UINT8 (num_resp, p); - for (xx = 0; xx < num_resp; xx++) - { + for (xx = 0; xx < num_resp; xx++) { update = FALSE; /* Extract inquiry results */ STREAM_TO_BDADDR (bda, p); STREAM_TO_UINT8 (page_scan_rep_mode, p); STREAM_TO_UINT8 (page_scan_per_mode, p); - if (inq_res_mode == BTM_INQ_RESULT_STANDARD) - { + if (inq_res_mode == BTM_INQ_RESULT_STANDARD) { STREAM_TO_UINT8(page_scan_mode, p); } STREAM_TO_DEVCLASS (dc, p); STREAM_TO_UINT16 (clock_offset, p); - if (inq_res_mode != BTM_INQ_RESULT_STANDARD) - { + if (inq_res_mode != BTM_INQ_RESULT_STANDARD) { STREAM_TO_UINT8(rssi, p); } @@ -1909,38 +1867,35 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) responses could be processed which can confuse some apps */ if (p_inq->inqparms.max_resps && - p_inq->inq_cmpl_info.num_resp >= p_inq->inqparms.max_resps + p_inq->inq_cmpl_info.num_resp >= p_inq->inqparms.max_resps #if BLE_INCLUDED == TRUE - /* new device response */ - && ( p_i == NULL || - /* exisiting device with BR/EDR info */ - (p_i && (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0) - ) + /* new device response */ + && ( p_i == NULL || + /* exisiting device with BR/EDR info */ + (p_i && (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0) + ) #endif - ) - { + ) { BTM_TRACE_WARNING("INQ RES: Extra Response Received...ignoring\n"); return; } /* Check if this address has already been processed for this inquiry */ - if (btm_inq_find_bdaddr(bda)) - { - BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]\n", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); - /* By default suppose no update needed */ + if (btm_inq_find_bdaddr(bda)) { + BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]\n", + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + /* By default suppose no update needed */ i_rssi = (INT8)rssi; /* If this new RSSI is higher than the last one */ - if(p_inq->inqparms.report_dup && (rssi != 0) && - p_i && (i_rssi > p_i->inq_info.results.rssi || p_i->inq_info.results.rssi == 0 + if (p_inq->inqparms.report_dup && (rssi != 0) && + p_i && (i_rssi > p_i->inq_info.results.rssi || p_i->inq_info.results.rssi == 0 #if BLE_INCLUDED == TRUE - /* BR/EDR inquiry information update */ - || (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0 + /* BR/EDR inquiry information update */ + || (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0 #endif - )) - { + )) { p_cur = &p_i->inq_info.results; BTM_TRACE_DEBUG("update RSSI new:%d, old:%d\n", i_rssi, p_cur->rssi); p_cur->rssi = i_rssi; @@ -1948,19 +1903,18 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) } /* If we received a second Extended Inq Event for an already */ /* discovered device, this is because for the first one EIR was not received */ - else if ((inq_res_mode == BTM_INQ_RESULT_EXTENDED) && (p_i)) - { + else if ((inq_res_mode == BTM_INQ_RESULT_EXTENDED) && (p_i)) { p_cur = &p_i->inq_info.results; update = TRUE; } /* If no update needed continue with next response (if any) */ - else + else { continue; + } } /* If existing entry, use that, else get a new one (possibly reusing the oldest) */ - if (p_i == NULL) - { + if (p_i == NULL) { p_i = btm_inq_db_new (bda); is_new = TRUE; } @@ -1971,19 +1925,20 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) */ else if (p_i->inq_count == p_inq->inq_counter #if (BLE_INCLUDED == TRUE ) - && (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BREDR) + && (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BREDR) #endif - ) + ) { is_new = FALSE; + } /* keep updating RSSI to have latest value */ - if( inq_res_mode != BTM_INQ_RESULT_STANDARD ) + if ( inq_res_mode != BTM_INQ_RESULT_STANDARD ) { p_i->inq_info.results.rssi = (INT8)rssi; - else + } else { p_i->inq_info.results.rssi = BTM_INQ_RES_IGNORE_RSSI; + } - if (is_new == TRUE) - { + if (is_new == TRUE) { /* Save the info */ p_cur = &p_i->inq_info.results; p_cur->page_scan_rep_mode = page_scan_rep_mode; @@ -1996,39 +1951,39 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) p_i->time_of_resp = GKI_get_os_tick_count(); - if (p_i->inq_count != p_inq->inq_counter) - p_inq->inq_cmpl_info.num_resp++; /* A new response was found */ + if (p_i->inq_count != p_inq->inq_counter) { + p_inq->inq_cmpl_info.num_resp++; /* A new response was found */ + } #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) p_cur->inq_result_type = BTM_INQ_RESULT_BR; - if (p_i->inq_count != p_inq->inq_counter) - { + if (p_i->inq_count != p_inq->inq_counter) { p_cur->device_type = BT_DEVICE_TYPE_BREDR; p_i->scan_rsp = FALSE; - } - else + } else { p_cur->device_type |= BT_DEVICE_TYPE_BREDR; + } #endif - p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */ + p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */ /* If the number of responses found and not unlimited, issue a cancel inquiry */ if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && - p_inq->inqparms.max_resps && - p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps + p_inq->inqparms.max_resps && + p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps #if BLE_INCLUDED == TRUE - /* BLE scanning is active and received adv */ - && ((((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) && - p_cur->device_type == BT_DEVICE_TYPE_DUMO && p_i->scan_rsp) || - (p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) == 0) + /* BLE scanning is active and received adv */ + && ((((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) && + p_cur->device_type == BT_DEVICE_TYPE_DUMO && p_i->scan_rsp) || + (p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) == 0) #endif - ) - { -/* BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling inquiry..."); */ + ) { + /* BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling inquiry..."); */ btsnd_hcic_inq_cancel(); #if BLE_INCLUDED == TRUE - if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) + if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) { btm_ble_stop_inquiry(); + } #endif btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT); } @@ -2036,22 +1991,21 @@ void btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode) p_i->inq_info.appl_knows_rem_name = FALSE; } - if (is_new || update) - { - if( inq_res_mode == BTM_INQ_RESULT_EXTENDED ) - { + if (is_new || update) { + if ( inq_res_mode == BTM_INQ_RESULT_EXTENDED ) { memset( p_cur->eir_uuid, 0, - BTM_EIR_SERVICE_ARRAY_SIZE * (BTM_EIR_ARRAY_BITS/8)); + BTM_EIR_SERVICE_ARRAY_SIZE * (BTM_EIR_ARRAY_BITS / 8)); /* set bit map of UUID list from received EIR */ btm_set_eir_uuid( p, p_cur ); p_eir_data = p; - } - else + } else { p_eir_data = NULL; + } /* If a callback is registered, call it with the results */ - if (p_inq_results_cb) + if (p_inq_results_cb) { (p_inq_results_cb)((tBTM_INQ_RESULTS *) p_cur, p_eir_data); + } } } } @@ -2071,21 +2025,17 @@ void btm_sort_inq_result(void) UINT8 xx, yy, num_resp; tINQ_DB_ENT *p_tmp = NULL; tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db; - tINQ_DB_ENT *p_next = btm_cb.btm_inq_vars.inq_db+1; + tINQ_DB_ENT *p_next = btm_cb.btm_inq_vars.inq_db + 1; int size; - num_resp = (btm_cb.btm_inq_vars.inq_cmpl_info.num_respinq_info.results.rssi < p_next->inq_info.results.rssi) - { + for (xx = 0; xx < num_resp - 1; xx++, p_ent++) { + for (yy = xx + 1, p_next = p_ent + 1; yy < num_resp; yy++, p_next++) { + if (p_ent->inq_info.results.rssi < p_next->inq_info.results.rssi) { memcpy (p_tmp, p_next, size); memcpy (p_next, p_ent, size); memcpy (p_ent, p_tmp, size); @@ -2119,10 +2069,9 @@ void btm_process_inq_complete (UINT8 status, UINT8 mode) /* inquiry inactive case happens when inquiry is cancelled. Make mode 0 for no further inquiries from the current inquiry process */ - if(status!=HCI_SUCCESS || p_inq->next_state==BTM_FINISH || !p_inq->inq_active) - { + if (status != HCI_SUCCESS || p_inq->next_state == BTM_FINISH || !p_inq->inq_active) { /* re-initialize for next inquiry request */ - p_inq->next_state=BTM_BR_ONE; + p_inq->next_state = BTM_BR_ONE; /* make the mode 0 here */ p_inq->inqparms.mode &= ~(p_inq->inqparms.mode); @@ -2133,28 +2082,25 @@ void btm_process_inq_complete (UINT8 status, UINT8 mode) p_inq->inqparms.mode &= ~(mode); #endif - if(p_inq->scan_type == INQ_LE_OBSERVE && !p_inq->inq_active) - { + if (p_inq->scan_type == INQ_LE_OBSERVE && !p_inq->inq_active) { /*end of LE observe*/ p_inq->p_inq_ble_results_cb = (tBTM_INQ_RESULTS_CB *) NULL; p_inq->p_inq_ble_cmpl_cb = (tBTM_CMPL_CB *) NULL; - p_inq->scan_type=INQ_NONE; + p_inq->scan_type = INQ_NONE; } #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); #endif btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT); /* Ignore any stray or late complete messages if the inquiry is not active */ - if (p_inq->inq_active) - { + if (p_inq->inq_active) { p_inq->inq_cmpl_info.status = (tBTM_STATUS)((status == HCI_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING); /* Notify caller that the inquiry has completed; (periodic inquiries do not send completion events */ - if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && p_inq->inqparms.mode == 0) - { + if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && p_inq->inqparms.mode == 0) { #if BLE_INCLUDED == TRUE btm_clear_all_pending_le_entry(); #endif @@ -2165,9 +2111,8 @@ void btm_process_inq_complete (UINT8 status, UINT8 mode) btm_clr_inq_result_flt(); - if((p_inq->inq_cmpl_info.status == BTM_SUCCESS) && - controller_get_interface()->supports_rssi_with_inquiry_results()) - { + if ((p_inq->inq_cmpl_info.status == BTM_SUCCESS) && + controller_get_interface()->supports_rssi_with_inquiry_results()) { btm_sort_inq_result(); } @@ -2178,36 +2123,34 @@ void btm_process_inq_complete (UINT8 status, UINT8 mode) /* If we have a callback registered for inquiry complete, call it */ BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d\n", - p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp); + p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp); - if (p_inq_cb) + if (p_inq_cb) { (p_inq_cb)((tBTM_INQUIRY_CMPL *) &p_inq->inq_cmpl_info); + } } #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) - if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)) - { + if (p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)) { /* make inquiry inactive for next iteration */ p_inq->inq_active = BTM_INQUIRY_INACTIVE; /* call the inquiry again */ - BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb); + BTM_StartInquiry(&p_inq->inqparms, p_inq->p_inq_results_cb, p_inq->p_inq_cmpl_cb); } #endif } - if(p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL)//this inquiry is complete - { + if (p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL) { //this inquiry is complete p_inq->scan_type = INQ_NONE; #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) /* check if the LE observe is pending */ - if(p_inq->p_inq_ble_results_cb != NULL) - { + if (p_inq->p_inq_ble_results_cb != NULL) { BTM_TRACE_DEBUG("BTM Inq Compl: resuming a pending LE scan"); - BTM_BleObserve(1,0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb); + BTM_BleObserve(1, 0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb); } #endif } #if (BTM_INQ_DEBUG == TRUE) BTM_TRACE_DEBUG ("inq_active:0x%x state:%d inqfilt_active:%d\n", - btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); + btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); #endif } @@ -2225,8 +2168,8 @@ void btm_process_inq_complete (UINT8 status, UINT8 mode) *******************************************************************************/ void btm_process_cancel_complete(UINT8 status, UINT8 mode) { - btm_acl_update_busy_level (BTM_BLI_INQ_CANCEL_EVT); - btm_process_inq_complete(status, mode); + btm_acl_update_busy_level (BTM_BLI_INQ_CANCEL_EVT); + btm_process_inq_complete(status, mode); } /******************************************************************************* ** @@ -2256,28 +2199,25 @@ tBTM_STATUS btm_initiate_rem_name (BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, /*** Make sure the device is ready ***/ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (BTM_WRONG_MODE); + } - if (origin == BTM_RMT_NAME_SEC) - { + if (origin == BTM_RMT_NAME_SEC) { cmd_ok = btsnd_hcic_rmt_name_req (remote_bda, HCI_PAGE_SCAN_REP_MODE_R1, - HCI_MANDATARY_PAGE_SCAN_MODE, 0); - if (cmd_ok) + HCI_MANDATARY_PAGE_SCAN_MODE, 0); + if (cmd_ok) { return BTM_CMD_STARTED; - else + } else { return BTM_NO_RESOURCES; + } } /* Make sure there are no two remote name requests from external API in progress */ - else if (origin == BTM_RMT_NAME_EXT) - { - if (p_inq->remname_active) - { + else if (origin == BTM_RMT_NAME_EXT) { + if (p_inq->remname_active) { return (BTM_BUSY); - } - else - { + } else { /* If there is no remote name request running,call the callback function and start timer */ p_inq->p_remname_cmpl_cb = p_cb; memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN); @@ -2286,30 +2226,24 @@ tBTM_STATUS btm_initiate_rem_name (BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, timeout); /* If the database entry exists for the device, use its clock offset */ - if (p_cur) - { + if (p_cur) { cmd_ok = btsnd_hcic_rmt_name_req (remote_bda, - p_cur->results.page_scan_rep_mode, - p_cur->results.page_scan_mode, - (UINT16)(p_cur->results.clock_offset | - BTM_CLOCK_OFFSET_VALID)); - } - else /* Otherwise use defaults and mark the clock offset as invalid */ - { + p_cur->results.page_scan_rep_mode, + p_cur->results.page_scan_mode, + (UINT16)(p_cur->results.clock_offset | + BTM_CLOCK_OFFSET_VALID)); + } else { /* Otherwise use defaults and mark the clock offset as invalid */ cmd_ok = btsnd_hcic_rmt_name_req (remote_bda, HCI_PAGE_SCAN_REP_MODE_R1, - HCI_MANDATARY_PAGE_SCAN_MODE, 0); + HCI_MANDATARY_PAGE_SCAN_MODE, 0); } - if (cmd_ok) - { + if (cmd_ok) { p_inq->remname_active = TRUE; return BTM_CMD_STARTED; - } - else + } else { return BTM_NO_RESOURCES; + } } - } - else - { + } else { return BTM_ILLEGAL_VALUE; } } @@ -2334,40 +2268,38 @@ void btm_process_remote_name (BD_ADDR bda, BD_NAME bdn, UINT16 evt_len, UINT8 hc UINT16 temp_evt_len; - if (bda != NULL) - { - BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x\n",bda[0], bda[1], - bda[2], bda[3], - bda[4], bda[5]); + if (bda != NULL) { + BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x\n", bda[0], bda[1], + bda[2], bda[3], + bda[4], bda[5]); } - BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x\n",p_inq->remname_bda[0], p_inq->remname_bda[1], - p_inq->remname_bda[2], p_inq->remname_bda[3], - p_inq->remname_bda[4], p_inq->remname_bda[5]); + BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x\n", p_inq->remname_bda[0], p_inq->remname_bda[1], + p_inq->remname_bda[2], p_inq->remname_bda[3], + p_inq->remname_bda[4], p_inq->remname_bda[5]); /* If the inquire BDA and remote DBA are the same, then stop the timer and set the active to false */ - if ((p_inq->remname_active ==TRUE)&& - (((bda != NULL) && - (memcmp(bda, p_inq->remname_bda,BD_ADDR_LEN)==0)) || bda == NULL)) + if ((p_inq->remname_active == TRUE) && + (((bda != NULL) && + (memcmp(bda, p_inq->remname_bda, BD_ADDR_LEN) == 0)) || bda == NULL)) { #if BLE_INCLUDED == TRUE - if (BTM_UseLeLink(p_inq->remname_bda)) - { - if (hci_status == HCI_ERR_UNSPECIFIED) + if (BTM_UseLeLink(p_inq->remname_bda)) { + if (hci_status == HCI_ERR_UNSPECIFIED) { btm_ble_cancel_remote_name(p_inq->remname_bda); + } } #endif btu_stop_timer (&p_inq->rmt_name_timer_ent); p_inq->remname_active = FALSE; - /* Clean up and return the status if the command was not successful */ - /* Note: If part of the inquiry, the name is not stored, and the */ - /* inquiry complete callback is called. */ + /* Clean up and return the status if the command was not successful */ + /* Note: If part of the inquiry, the name is not stored, and the */ + /* inquiry complete callback is called. */ - if (hci_status == HCI_SUCCESS) - { + if (hci_status == HCI_SUCCESS) { /* Copy the name from the data stream into the return structure */ /* Note that even if it is not being returned, it is used as a */ /* temporary buffer. */ @@ -2377,8 +2309,7 @@ void btm_process_remote_name (BD_ADDR bda, BD_NAME bdn, UINT16 evt_len, UINT8 hc rem_name.status = BTM_SUCCESS; temp_evt_len = rem_name.length; - while (temp_evt_len > 0) - { + while (temp_evt_len > 0) { *p_n1++ = *bdn++; temp_evt_len--; } @@ -2387,8 +2318,7 @@ void btm_process_remote_name (BD_ADDR bda, BD_NAME bdn, UINT16 evt_len, UINT8 hc /* If processing a stand alone remote name then report the error in the callback */ - else - { + else { rem_name.status = BTM_BAD_VALUE_RET; rem_name.length = 0; rem_name.remote_bd_name[0] = 0; @@ -2397,8 +2327,9 @@ void btm_process_remote_name (BD_ADDR bda, BD_NAME bdn, UINT16 evt_len, UINT8 hc memset(p_inq->remname_bda, 0, BD_ADDR_LEN); p_inq->p_remname_cmpl_cb = NULL; - if (p_cb) + if (p_cb) { (p_cb)((tBTM_REMOTE_DEV_NAME *)&rem_name); + } } } @@ -2417,10 +2348,11 @@ void btm_inq_rmt_name_failed (void) { BTM_TRACE_ERROR ("btm_inq_rmt_name_failed() remname_active=%d\n", btm_cb.btm_inq_vars.remname_active); - if (btm_cb.btm_inq_vars.remname_active) + if (btm_cb.btm_inq_vars.remname_active) { btm_process_remote_name (btm_cb.btm_inq_vars.remname_bda, NULL, 0, HCI_ERR_UNSPECIFIED); - else + } else { btm_process_remote_name (NULL, NULL, 0, HCI_ERR_UNSPECIFIED); + } btm_sec_rmt_name_request_complete (NULL, NULL, HCI_ERR_UNSPECIFIED); } @@ -2442,20 +2374,18 @@ void btm_read_linq_tx_power_complete(UINT8 *p) /* If there was a callback registered for read inq tx power, call it */ btm_cb.devcb.p_txpwer_cmpl_cb = NULL; - if (p_cb) - { + if (p_cb) { STREAM_TO_UINT8 (results.hci_status, p); - if (results.hci_status == HCI_SUCCESS) - { + if (results.hci_status == HCI_SUCCESS) { results.status = BTM_SUCCESS; STREAM_TO_UINT8 (results.tx_power, p); BTM_TRACE_EVENT ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x\n", - results.tx_power, results.hci_status); - } - else + results.tx_power, results.hci_status); + } else { results.status = BTM_ERR_PROCESSING; + } (*p_cb)(&results); } @@ -2476,14 +2406,11 @@ void btm_read_linq_tx_power_complete(UINT8 *p) *******************************************************************************/ tBTM_STATUS BTM_WriteEIR( BT_HDR *p_buff ) { - if (controller_get_interface()->supports_extended_inquiry_response()) - { + if (controller_get_interface()->supports_extended_inquiry_response()) { BTM_TRACE_API("Write Extended Inquiry Response to controller\n"); btsnd_hcic_write_ext_inquiry_response (p_buff, BTM_EIR_DEFAULT_FEC_REQUIRED); return BTM_SUCCESS; - } - else - { + } else { GKI_freebuf(p_buff); return BTM_MODE_UNSUPPORTED; } @@ -2510,11 +2437,9 @@ UINT8 *BTM_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length ) BTM_TRACE_API("BTM_CheckEirData type=0x%02X\n", type); STREAM_TO_UINT8(length, p); - while( length && (p - p_eir <= HCI_EXT_INQ_RESPONSE_LEN)) - { + while ( length && (p - p_eir <= HCI_EXT_INQ_RESPONSE_LEN)) { STREAM_TO_UINT8(eir_type, p); - if( eir_type == type ) - { + if ( eir_type == type ) { /* length doesn't include itself */ *p_length = length - 1; /* minus the length of type */ return p; @@ -2543,10 +2468,8 @@ static UINT8 btm_convert_uuid_to_eir_service( UINT16 uuid16 ) { UINT8 xx; - for( xx = 0; xx < BTM_EIR_MAX_SERVICES; xx++ ) - { - if( uuid16 == BTM_EIR_UUID_LKUP_TBL[xx]) - { + for ( xx = 0; xx < BTM_EIR_MAX_SERVICES; xx++ ) { + if ( uuid16 == BTM_EIR_UUID_LKUP_TBL[xx]) { return xx; } } @@ -2571,10 +2494,11 @@ BOOLEAN BTM_HasEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ) UINT8 service_id; service_id = btm_convert_uuid_to_eir_service(uuid16); - if( service_id < BTM_EIR_MAX_SERVICES ) - return( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_id )); - else - return( FALSE ); + if ( service_id < BTM_EIR_MAX_SERVICES ) { + return ( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_id )); + } else { + return ( FALSE ); + } } /******************************************************************************* @@ -2593,16 +2517,13 @@ BOOLEAN BTM_HasEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ) *******************************************************************************/ tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService( tBTM_INQ_RESULTS *p_results, UINT16 uuid16 ) { - if( BTM_HasEirService( p_results->eir_uuid, uuid16 )) - { + if ( BTM_HasEirService( p_results->eir_uuid, uuid16 )) { return BTM_EIR_FOUND; - } - else if( p_results->eir_complete_list ) - { + } else if ( p_results->eir_complete_list ) { return BTM_EIR_NOT_FOUND; - } - else + } else { return BTM_EIR_UNKNOWN; + } } /******************************************************************************* @@ -2622,8 +2543,9 @@ void BTM_AddEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ) UINT8 service_id; service_id = btm_convert_uuid_to_eir_service(uuid16); - if( service_id < BTM_EIR_MAX_SERVICES ) + if ( service_id < BTM_EIR_MAX_SERVICES ) { BTM_EIR_SET_SERVICE( p_eir_uuid, service_id ); + } } /******************************************************************************* @@ -2643,8 +2565,9 @@ void BTM_RemoveEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ) UINT8 service_id; service_id = btm_convert_uuid_to_eir_service(uuid16); - if( service_id < BTM_EIR_MAX_SERVICES ) + if ( service_id < BTM_EIR_MAX_SERVICES ) { BTM_EIR_CLR_SERVICE( p_eir_uuid, service_id ); + } } /******************************************************************************* @@ -2669,18 +2592,14 @@ UINT8 BTM_GetEirSupportedServices( UINT32 *p_eir_uuid, UINT8 **p, *p_num_uuid16 = 0; - for(service_index = 0; service_index < BTM_EIR_MAX_SERVICES; service_index++) - { - if( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_index )) - { - if( *p_num_uuid16 < max_num_uuid16 ) - { + for (service_index = 0; service_index < BTM_EIR_MAX_SERVICES; service_index++) { + if ( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_index )) { + if ( *p_num_uuid16 < max_num_uuid16 ) { UINT16_TO_STREAM(*p, BTM_EIR_UUID_LKUP_TBL[service_index]); (*p_num_uuid16)++; } /* if max number of UUIDs are stored and found one more */ - else - { + else { return BTM_EIR_MORE_16BITS_UUID_TYPE; } } @@ -2710,7 +2629,7 @@ UINT8 BTM_GetEirSupportedServices( UINT32 *p_eir_uuid, UINT8 **p, ** *******************************************************************************/ UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid, - UINT8 *p_uuid_list, UINT8 max_num_uuid) + UINT8 *p_uuid_list, UINT8 max_num_uuid) { UINT8 *p_uuid_data; UINT8 type; @@ -2720,43 +2639,34 @@ UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid, char buff[LEN_UUID_128 * 2 + 1]; p_uuid_data = btm_eir_get_uuid_list( p_eir, uuid_size, p_num_uuid, &type ); - if( p_uuid_data == NULL ) - { + if ( p_uuid_data == NULL ) { return 0x00; } - if( *p_num_uuid > max_num_uuid ) - { + if ( *p_num_uuid > max_num_uuid ) { BTM_TRACE_WARNING("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d\n", - *p_num_uuid, max_num_uuid ); + *p_num_uuid, max_num_uuid ); *p_num_uuid = max_num_uuid; } BTM_TRACE_DEBUG("BTM_GetEirUuidList type = %02X, number of uuid = %d\n", type, *p_num_uuid ); - if( uuid_size == LEN_UUID_16 ) - { - for( yy = 0; yy < *p_num_uuid; yy++ ) - { + if ( uuid_size == LEN_UUID_16 ) { + for ( yy = 0; yy < *p_num_uuid; yy++ ) { STREAM_TO_UINT16(*(p_uuid16 + yy), p_uuid_data); BTM_TRACE_DEBUG(" 0x%04X\n", *(p_uuid16 + yy)); } - } - else if( uuid_size == LEN_UUID_32 ) - { - for( yy = 0; yy < *p_num_uuid; yy++ ) - { + } else if ( uuid_size == LEN_UUID_32 ) { + for ( yy = 0; yy < *p_num_uuid; yy++ ) { STREAM_TO_UINT32(*(p_uuid32 + yy), p_uuid_data); BTM_TRACE_DEBUG(" 0x%08X\n", *(p_uuid32 + yy)); } - } - else if( uuid_size == LEN_UUID_128 ) - { - for( yy = 0; yy < *p_num_uuid; yy++ ) - { + } else if ( uuid_size == LEN_UUID_128 ) { + for ( yy = 0; yy < *p_num_uuid; yy++ ) { STREAM_TO_ARRAY16(p_uuid_list + yy * LEN_UUID_128, p_uuid_data); - for( xx = 0; xx < LEN_UUID_128; xx++ ) - sprintf(buff + xx*2, "%02X", *(p_uuid_list + yy * LEN_UUID_128 + xx)); + for ( xx = 0; xx < LEN_UUID_128; xx++ ) { + sprintf(buff + xx * 2, "%02X", *(p_uuid_list + yy * LEN_UUID_128 + xx)); + } BTM_TRACE_DEBUG(" 0x%s\n", buff); } } @@ -2787,8 +2697,7 @@ static UINT8 *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size, UINT8 complete_type, more_type; UINT8 uuid_len; - switch( uuid_size ) - { + switch ( uuid_size ) { case LEN_UUID_16: complete_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE; more_type = BTM_EIR_MORE_16BITS_UUID_TYPE; @@ -2808,13 +2717,10 @@ static UINT8 *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size, } p_uuid_data = BTM_CheckEirData( p_eir, complete_type, &uuid_len ); - if(p_uuid_data == NULL) - { + if (p_uuid_data == NULL) { p_uuid_data = BTM_CheckEirData( p_eir, more_type, &uuid_len ); *p_uuid_list_type = more_type; - } - else - { + } else { *p_uuid_list_type = complete_type; } @@ -2838,37 +2744,34 @@ static UINT8 *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size, static UINT16 btm_convert_uuid_to_uuid16( UINT8 *p_uuid, UINT8 uuid_size ) { static const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; UINT16 uuid16 = 0; UINT32 uuid32; BOOLEAN is_base_uuid; UINT8 xx; - switch (uuid_size) - { + switch (uuid_size) { case LEN_UUID_16: STREAM_TO_UINT16 (uuid16, p_uuid); break; case LEN_UUID_32: STREAM_TO_UINT32 (uuid32, p_uuid); - if (uuid32 < 0x10000) + if (uuid32 < 0x10000) { uuid16 = (UINT16) uuid32; + } break; case LEN_UUID_128: /* See if we can compress his UUID down to 16 or 32bit UUIDs */ is_base_uuid = TRUE; - for (xx = 0; xx < LEN_UUID_128 - 4; xx++) - { - if (p_uuid[xx] != base_uuid[xx]) - { + for (xx = 0; xx < LEN_UUID_128 - 4; xx++) { + if (p_uuid[xx] != base_uuid[xx]) { is_base_uuid = FALSE; break; } } - if (is_base_uuid) - { - if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0)) - { + if (is_base_uuid) { + if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0)) { p_uuid += (LEN_UUID_128 - 4); STREAM_TO_UINT16(uuid16, p_uuid); } @@ -2879,7 +2782,7 @@ static UINT16 btm_convert_uuid_to_uuid16( UINT8 *p_uuid, UINT8 uuid_size ) break; } - return( uuid16); + return ( uuid16); } /******************************************************************************* @@ -2904,47 +2807,40 @@ void btm_set_eir_uuid( UINT8 *p_eir, tBTM_INQ_RESULTS *p_results ) p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_16, &num_uuid, &type ); - if(type == BTM_EIR_COMPLETE_16BITS_UUID_TYPE) - { + if (type == BTM_EIR_COMPLETE_16BITS_UUID_TYPE) { p_results->eir_complete_list = TRUE; - } - else - { + } else { p_results->eir_complete_list = FALSE; } BTM_TRACE_API("btm_set_eir_uuid eir_complete_list=0x%02X\n", p_results->eir_complete_list); - if( p_uuid_data ) - { - for( yy = 0; yy < num_uuid; yy++ ) - { + if ( p_uuid_data ) { + for ( yy = 0; yy < num_uuid; yy++ ) { STREAM_TO_UINT16(uuid16, p_uuid_data); BTM_AddEirService( p_results->eir_uuid, uuid16 ); } } p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_32, &num_uuid, &type ); - if( p_uuid_data ) - { - for( yy = 0; yy < num_uuid; yy++ ) - { + if ( p_uuid_data ) { + for ( yy = 0; yy < num_uuid; yy++ ) { uuid16 = btm_convert_uuid_to_uuid16( p_uuid_data, LEN_UUID_32 ); p_uuid_data += LEN_UUID_32; - if( uuid16 ) + if ( uuid16 ) { BTM_AddEirService( p_results->eir_uuid, uuid16 ); + } } } p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_128, &num_uuid, &type ); - if( p_uuid_data ) - { - for( yy = 0; yy < num_uuid; yy++ ) - { + if ( p_uuid_data ) { + for ( yy = 0; yy < num_uuid; yy++ ) { uuid16 = btm_convert_uuid_to_uuid16( p_uuid_data, LEN_UUID_128 ); p_uuid_data += LEN_UUID_128; - if( uuid16 ) + if ( uuid16 ) { BTM_AddEirService( p_results->eir_uuid, uuid16 ); + } } } } diff --git a/components/bt/bluedroid/stack/btm/btm_pm.c b/components/bt/bluedroid/stack/btm/btm_pm.c old mode 100755 new mode 100644 index c49cba4e6..a0aaa0610 --- a/components/bt/bluedroid/stack/btm/btm_pm.c +++ b/components/bt/bluedroid/stack/btm/btm_pm.c @@ -62,8 +62,7 @@ const UINT8 btm_pm_mode_msk[BTM_PM_NUM_SET_MODES] = {0x40, 0x80, 0x01}; #define BTM_PM_GET_MD2 2 #define BTM_PM_GET_COMP 3 -const UINT8 btm_pm_md_comp_matrix[BTM_PM_NUM_SET_MODES*BTM_PM_NUM_SET_MODES] = -{ +const UINT8 btm_pm_md_comp_matrix[BTM_PM_NUM_SET_MODES * BTM_PM_NUM_SET_MODES] = { BTM_PM_GET_COMP, BTM_PM_GET_MD2, BTM_PM_GET_MD2, @@ -90,8 +89,7 @@ static const char *mode_to_string(tBTM_PM_MODE mode); */ #if BTM_PM_DEBUG == TRUE -const char * btm_pm_state_str[] = -{ +const char *btm_pm_state_str[] = { "pm_active_state", "pm_hold_state", "pm_sniff_state", @@ -99,16 +97,14 @@ const char * btm_pm_state_str[] = "pm_pend_state" }; -const char * btm_pm_event_str[] = -{ +const char *btm_pm_event_str[] = { "pm_set_mode_event", "pm_hci_sts_event", "pm_mod_chg_event", "pm_update_event" }; -const char * btm_pm_action_str[] = -{ +const char *btm_pm_action_str[] = { "pm_set_mode_action", "pm_update_db_action", "pm_mod_chg_action", @@ -136,24 +132,22 @@ tBTM_STATUS BTM_PmRegister (UINT8 mask, UINT8 *p_pm_id, tBTM_PM_STATUS_CBACK *p_ int xx; /* de-register */ - if(mask & BTM_PM_DEREG) - { - if(*p_pm_id >= BTM_MAX_PM_RECORDS) + if (mask & BTM_PM_DEREG) { + if (*p_pm_id >= BTM_MAX_PM_RECORDS) { return BTM_ILLEGAL_VALUE; + } btm_cb.pm_reg_db[*p_pm_id].mask = BTM_PM_REC_NOT_USED; return BTM_SUCCESS; } - for(xx=0; xx= BTM_MAX_PM_RECORDS) + if (pm_id >= BTM_MAX_PM_RECORDS) { pm_id = BTM_PM_SET_ONLY_ID; + } - if(p_mode == NULL) + if (p_mode == NULL) { return BTM_ILLEGAL_VALUE; + } BTM_TRACE_API( "BTM_SetPowerMode: pm_id %d BDA: %08x mode:0x%x", pm_id, - (remote_bda[2]<<24)+(remote_bda[3]<<16)+(remote_bda[4]<<8)+remote_bda[5], p_mode->mode); + (remote_bda[2] << 24) + (remote_bda[3] << 16) + (remote_bda[4] << 8) + remote_bda[5], p_mode->mode); /* take out the force bit */ mode = p_mode->mode & ~BTM_PM_MD_FORCE; acl_ind = btm_pm_find_acl_ind(remote_bda); - if(acl_ind == MAX_L2CAP_LINKS) + if (acl_ind == MAX_L2CAP_LINKS) { return (BTM_UNKNOWN_ADDR); + } p_cb = &(btm_cb.pm_mode_db[acl_ind]); - if(mode != BTM_PM_MD_ACTIVE) - { + if (mode != BTM_PM_MD_ACTIVE) { /* check if the requested mode is supported */ ind = mode - BTM_PM_MD_HOLD; /* make it base 0 */ p_features = BTM_ReadLocalFeatures(); - if( !(p_features[ btm_pm_mode_off[ind] ] & btm_pm_mode_msk[ind] ) ) + if ( !(p_features[ btm_pm_mode_off[ind] ] & btm_pm_mode_msk[ind] ) ) { return BTM_MODE_UNSUPPORTED; + } } - if(mode == p_cb->state) /* the requested mode is current mode */ - { + if (mode == p_cb->state) { /* the requested mode is current mode */ /* already in the requested mode and the current interval has less latency than the max */ - if( (mode == BTM_PM_MD_ACTIVE) || - ((p_mode->mode & BTM_PM_MD_FORCE) && (p_mode->max >= p_cb->interval) && (p_mode->min <= p_cb->interval)) || - ((p_mode->mode & BTM_PM_MD_FORCE)==0 && (p_mode->max >= p_cb->interval)) ) - { + if ( (mode == BTM_PM_MD_ACTIVE) || + ((p_mode->mode & BTM_PM_MD_FORCE) && (p_mode->max >= p_cb->interval) && (p_mode->min <= p_cb->interval)) || + ((p_mode->mode & BTM_PM_MD_FORCE) == 0 && (p_mode->max >= p_cb->interval)) ) { BTM_TRACE_DEBUG( "BTM_SetPowerMode: mode:0x%x interval %d max:%d, min:%d", p_mode->mode, p_cb->interval, p_mode->max, p_mode->min); return BTM_SUCCESS; } } temp_pm_id = pm_id; - if(pm_id == BTM_PM_SET_ONLY_ID) + if (pm_id == BTM_PM_SET_ONLY_ID) { temp_pm_id = BTM_MAX_PM_RECORDS; + } /* update mode database */ - if( ((pm_id != BTM_PM_SET_ONLY_ID) && - (btm_cb.pm_reg_db[pm_id].mask & BTM_PM_REG_SET)) - || ((pm_id == BTM_PM_SET_ONLY_ID) && (btm_cb.pm_pend_link != MAX_L2CAP_LINKS)) ) - { + if ( ((pm_id != BTM_PM_SET_ONLY_ID) && + (btm_cb.pm_reg_db[pm_id].mask & BTM_PM_REG_SET)) + || ((pm_id == BTM_PM_SET_ONLY_ID) && (btm_cb.pm_pend_link != MAX_L2CAP_LINKS)) ) { #if BTM_PM_DEBUG == TRUE - BTM_TRACE_DEBUG( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind,temp_pm_id); + BTM_TRACE_DEBUG( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind, temp_pm_id); #endif // BTM_PM_DEBUG /* Make sure mask is set to BTM_PM_REG_SET */ btm_cb.pm_reg_db[temp_pm_id].mask |= BTM_PM_REG_SET; @@ -246,15 +241,13 @@ tBTM_STATUS BTM_SetPowerMode (UINT8 pm_id, BD_ADDR remote_bda, tBTM_PM_PWR_MD *p BTM_TRACE_DEBUG( "btm_pm state:0x%x, pm_pend_link: %d", p_cb->state, btm_cb.pm_pend_link); #endif // BTM_PM_DEBUG /* if mode == hold or pending, return */ - if( (p_cb->state == BTM_PM_STS_HOLD) || - (p_cb->state == BTM_PM_STS_PENDING) || - (btm_cb.pm_pend_link != MAX_L2CAP_LINKS) ) /* command pending */ - { - if(acl_ind != btm_cb.pm_pend_link) - { + if ( (p_cb->state == BTM_PM_STS_HOLD) || + (p_cb->state == BTM_PM_STS_PENDING) || + (btm_cb.pm_pend_link != MAX_L2CAP_LINKS) ) { /* command pending */ + if (acl_ind != btm_cb.pm_pend_link) { /* set the stored mask */ p_cb->state |= BTM_PM_STORED_MASK; - BTM_TRACE_DEBUG( "btm_pm state stored:%d",acl_ind); + BTM_TRACE_DEBUG( "btm_pm state stored:%d", acl_ind); } return BTM_CMD_STORED; } @@ -288,8 +281,9 @@ tBTM_STATUS BTM_ReadPowerMode (BD_ADDR remote_bda, tBTM_PM_MODE *p_mode) { int acl_ind; - if( (acl_ind = btm_pm_find_acl_ind(remote_bda)) == MAX_L2CAP_LINKS) + if ( (acl_ind = btm_pm_find_acl_ind(remote_bda)) == MAX_L2CAP_LINKS) { return (BTM_UNKNOWN_ADDR); + } *p_mode = btm_cb.pm_mode_db[acl_ind].state; return BTM_SUCCESS; @@ -320,17 +314,18 @@ tBTM_STATUS BTM_SetSsrParams (BD_ADDR remote_bda, UINT16 max_lat, int acl_ind; tBTM_PM_MCB *p_cb; - if( (acl_ind = btm_pm_find_acl_ind(remote_bda)) == MAX_L2CAP_LINKS) + if ( (acl_ind = btm_pm_find_acl_ind(remote_bda)) == MAX_L2CAP_LINKS) { return (BTM_UNKNOWN_ADDR); + } - if(BTM_PM_STS_ACTIVE == btm_cb.pm_mode_db[acl_ind].state || - BTM_PM_STS_SNIFF == btm_cb.pm_mode_db[acl_ind].state) - { + if (BTM_PM_STS_ACTIVE == btm_cb.pm_mode_db[acl_ind].state || + BTM_PM_STS_SNIFF == btm_cb.pm_mode_db[acl_ind].state) { if (btsnd_hcic_sniff_sub_rate(btm_cb.acl_db[acl_ind].hci_handle, max_lat, - min_rmt_to, min_loc_to)) + min_rmt_to, min_loc_to)) { return BTM_SUCCESS; - else + } else { return BTM_NO_RESOURCES; + } } p_cb = &btm_cb.pm_mode_db[acl_ind]; p_cb->max_lat = max_lat; @@ -357,21 +352,20 @@ void btm_pm_reset(void) tBTM_PM_STATUS_CBACK *cb = NULL; /* clear the pending request for application */ - if( (btm_cb.pm_pend_id != BTM_PM_SET_ONLY_ID) && - (btm_cb.pm_reg_db[btm_cb.pm_pend_id].mask & BTM_PM_REG_NOTIF) ) - { + if ( (btm_cb.pm_pend_id != BTM_PM_SET_ONLY_ID) && + (btm_cb.pm_reg_db[btm_cb.pm_pend_id].mask & BTM_PM_REG_NOTIF) ) { cb = btm_cb.pm_reg_db[btm_cb.pm_pend_id].cback; } /* clear the register record */ - for(xx=0; xxin_use) && (!memcmp (p->remote_addr, remote_bda, BD_ADDR_LEN)) #if (BLE_INCLUDED == TRUE) - && p->transport == BT_TRANSPORT_BR_EDR + && p->transport == BT_TRANSPORT_BR_EDR #endif // BLE_INCLUDED - ) - { + ) { #if BTM_PM_DEBUG == TRUE BTM_TRACE_DEBUG( "btm_pm_find_acl_ind ind:%d, st:%d", xx, btm_cb.pm_mode_db[xx].state); #endif // BTM_PM_DEBUG @@ -436,33 +428,29 @@ static int btm_pm_find_acl_ind(BD_ADDR remote_bda) ** Returns void ** *******************************************************************************/ -static tBTM_PM_PWR_MD * btm_pm_compare_modes(tBTM_PM_PWR_MD *p_md1, tBTM_PM_PWR_MD *p_md2, tBTM_PM_PWR_MD *p_res) +static tBTM_PM_PWR_MD *btm_pm_compare_modes(tBTM_PM_PWR_MD *p_md1, tBTM_PM_PWR_MD *p_md2, tBTM_PM_PWR_MD *p_res) { UINT8 res; - if(p_md1 == NULL) - { + if (p_md1 == NULL) { *p_res = *p_md2; p_res->mode &= ~BTM_PM_MD_FORCE; return p_md2; } - if(p_md2->mode == BTM_PM_MD_ACTIVE || p_md1->mode == BTM_PM_MD_ACTIVE) - { + if (p_md2->mode == BTM_PM_MD_ACTIVE || p_md1->mode == BTM_PM_MD_ACTIVE) { return NULL; } /* check if force bit is involved */ - if(p_md1->mode & BTM_PM_MD_FORCE) - { + if (p_md1->mode & BTM_PM_MD_FORCE) { *p_res = *p_md1; p_res->mode &= ~BTM_PM_MD_FORCE; return p_res; } - if(p_md2->mode & BTM_PM_MD_FORCE) - { + if (p_md2->mode & BTM_PM_MD_FORCE) { *p_res = *p_md2; p_res->mode &= ~BTM_PM_MD_FORCE; return p_res; @@ -470,8 +458,7 @@ static tBTM_PM_PWR_MD * btm_pm_compare_modes(tBTM_PM_PWR_MD *p_md1, tBTM_PM_PWR_ res = (p_md1->mode - 1) * BTM_PM_NUM_SET_MODES + (p_md2->mode - 1); res = btm_pm_md_comp_matrix[res]; - switch(res) - { + switch (res) { case BTM_PM_GET_MD1: *p_res = *p_md1; return p_md1; @@ -483,19 +470,19 @@ static tBTM_PM_PWR_MD * btm_pm_compare_modes(tBTM_PM_PWR_MD *p_md1, tBTM_PM_PWR_ case BTM_PM_GET_COMP: p_res->mode = p_md1->mode; /* min of the two */ - p_res->max = (p_md1->max < p_md2->max)? (p_md1->max) : (p_md2->max); + p_res->max = (p_md1->max < p_md2->max) ? (p_md1->max) : (p_md2->max); /* max of the two */ - p_res->min = (p_md1->min > p_md2->min)? (p_md1->min) : (p_md2->min); + p_res->min = (p_md1->min > p_md2->min) ? (p_md1->min) : (p_md2->min); /* the intersection is NULL */ - if( p_res->max < p_res->min) + if ( p_res->max < p_res->min) { return NULL; + } - if(p_res->mode == BTM_PM_MD_SNIFF) - { + if (p_res->mode == BTM_PM_MD_SNIFF) { /* max of the two */ - p_res->attempt = (p_md1->attempt > p_md2->attempt)? (p_md1->attempt) : (p_md2->attempt); - p_res->timeout = (p_md1->timeout > p_md2->timeout)? (p_md1->timeout) : (p_md2->timeout); + p_res->attempt = (p_md1->attempt > p_md2->attempt) ? (p_md1->attempt) : (p_md2->attempt); + p_res->timeout = (p_md1->timeout > p_md2->timeout) ? (p_md1->timeout) : (p_md2->timeout); } return p_res; } @@ -515,53 +502,48 @@ static tBTM_PM_MODE btm_pm_get_set_mode(UINT8 pm_id, tBTM_PM_MCB *p_cb, tBTM_PM_ int xx, loop_max; tBTM_PM_PWR_MD *p_md = NULL; - if(p_mode != NULL && p_mode->mode & BTM_PM_MD_FORCE) - { + if (p_mode != NULL && p_mode->mode & BTM_PM_MD_FORCE) { *p_res = *p_mode; p_res->mode &= ~BTM_PM_MD_FORCE; return p_res->mode; } - if(!p_mode) - loop_max = BTM_MAX_PM_RECORDS+1; - else + if (!p_mode) { + loop_max = BTM_MAX_PM_RECORDS + 1; + } else { loop_max = BTM_MAX_PM_RECORDS; + } - for( xx=0; xxreq_mode[xx].mode == BTM_PM_MD_ACTIVE) - { + if (btm_cb.pm_reg_db[xx].mask & BTM_PM_REG_SET) { + if (p_cb->req_mode[xx].mode == BTM_PM_MD_ACTIVE) { /* if at least one registered (SET) party says ACTIVE, stay active */ return BTM_PM_MD_ACTIVE; - } - else - { + } else { /* if registered parties give conflicting information, stay active */ - if( (btm_pm_compare_modes(p_md, &p_cb->req_mode[xx], p_res)) == NULL) + if ( (btm_pm_compare_modes(p_md, &p_cb->req_mode[xx], p_res)) == NULL) { return BTM_PM_MD_ACTIVE; + } p_md = p_res; } } } /* if the resulting mode is NULL(nobody registers SET), use the requested mode */ - if(p_md == NULL) - { - if(p_mode) + if (p_md == NULL) { + if (p_mode) { *p_res = *((tBTM_PM_PWR_MD *)p_mode); - else /* p_mode is NULL when btm_pm_snd_md_req is called from btm_pm_proc_mode_change */ + } else { /* p_mode is NULL when btm_pm_snd_md_req is called from btm_pm_proc_mode_change */ return BTM_PM_MD_ACTIVE; - } - else - { + } + } else { /* if the command is from unregistered party, compare the resulting mode from registered party*/ - if( (pm_id == BTM_PM_SET_ONLY_ID) && - ((btm_pm_compare_modes(p_mode, p_md, p_res)) == NULL) ) + if ( (pm_id == BTM_PM_SET_ONLY_ID) && + ((btm_pm_compare_modes(p_mode, p_md, p_res)) == NULL) ) { return BTM_PM_MD_ACTIVE; + } } return p_res->mode; @@ -586,29 +568,30 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * #if BTM_PM_DEBUG == TRUE BTM_TRACE_DEBUG( "btm_pm_snd_md_req link_ind:%d, mode: %d", - link_ind, mode); + link_ind, mode); #endif // BTM_PM_DEBUG - if( p_cb->state == mode) - { + if ( p_cb->state == mode) { /* already in the resulting mode */ - if( (mode == BTM_PM_MD_ACTIVE) || - ((md_res.max >= p_cb->interval) && (md_res.min <= p_cb->interval)) ) + if ( (mode == BTM_PM_MD_ACTIVE) || + ((md_res.max >= p_cb->interval) && (md_res.min <= p_cb->interval)) ) { return BTM_CMD_STORED; + } /* Otherwise, needs to wake, then sleep */ chg_ind = TRUE; } p_cb->chg_ind = chg_ind; - /* cannot go directly from current mode to resulting mode. */ - if( mode != BTM_PM_MD_ACTIVE && p_cb->state != BTM_PM_MD_ACTIVE) - p_cb->chg_ind = TRUE; /* needs to wake, then sleep */ + /* cannot go directly from current mode to resulting mode. */ + if ( mode != BTM_PM_MD_ACTIVE && p_cb->state != BTM_PM_MD_ACTIVE) { + p_cb->chg_ind = TRUE; /* needs to wake, then sleep */ + } - if(p_cb->chg_ind == TRUE) /* needs to wake first */ + if (p_cb->chg_ind == TRUE) { /* needs to wake first */ md_res.mode = BTM_PM_MD_ACTIVE; + } #if (BTM_SSR_INCLUDED == TRUE) - else if(BTM_PM_MD_SNIFF == md_res.mode && p_cb->max_lat) - { + else if (BTM_PM_MD_SNIFF == md_res.mode && p_cb->max_lat) { btsnd_hcic_sniff_sub_rate(btm_cb.acl_db[link_ind].hci_handle, p_cb->max_lat, p_cb->min_rmt_to, p_cb->min_loc_to); p_cb->max_lat = 0; @@ -625,20 +608,16 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * #endif // BTM_PM_DEBUG LOG_DEBUG("%s switching from %s to %s.", __func__, mode_to_string(p_cb->state), mode_to_string(md_res.mode)); - switch(md_res.mode) - { + switch (md_res.mode) { case BTM_PM_MD_ACTIVE: - switch(p_cb->state) - { + switch (p_cb->state) { case BTM_PM_MD_SNIFF: - if (btsnd_hcic_exit_sniff_mode(btm_cb.acl_db[link_ind].hci_handle)) - { + if (btsnd_hcic_exit_sniff_mode(btm_cb.acl_db[link_ind].hci_handle)) { btm_cb.pm_pend_link = link_ind; } break; case BTM_PM_MD_PARK: - if (btsnd_hcic_exit_park_mode(btm_cb.acl_db[link_ind].hci_handle)) - { + if (btsnd_hcic_exit_park_mode(btm_cb.acl_db[link_ind].hci_handle)) { btm_cb.pm_pend_link = link_ind; } break; @@ -650,8 +629,7 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * case BTM_PM_MD_HOLD: if (btsnd_hcic_hold_mode (btm_cb.acl_db[link_ind].hci_handle, - md_res.max, md_res.min)) - { + md_res.max, md_res.min)) { btm_cb.pm_pend_link = link_ind; } break; @@ -659,16 +637,14 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * case BTM_PM_MD_SNIFF: if (btsnd_hcic_sniff_mode (btm_cb.acl_db[link_ind].hci_handle, md_res.max, md_res.min, md_res.attempt, - md_res.timeout)) - { + md_res.timeout)) { btm_cb.pm_pend_link = link_ind; } break; case BTM_PM_MD_PARK: if (btsnd_hcic_park_mode (btm_cb.acl_db[link_ind].hci_handle, - md_res.max, md_res.min)) - { + md_res.max, md_res.min)) { btm_cb.pm_pend_link = link_ind; } break; @@ -677,11 +653,10 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * break; } - if(btm_cb.pm_pend_link == MAX_L2CAP_LINKS) - { + if (btm_cb.pm_pend_link == MAX_L2CAP_LINKS) { /* the command was not sent */ #if BTM_PM_DEBUG == TRUE - BTM_TRACE_DEBUG( "pm_pend_link: %d",btm_cb.pm_pend_link); + BTM_TRACE_DEBUG( "pm_pend_link: %d", btm_cb.pm_pend_link); #endif // BTM_PM_DEBUG return (BTM_NO_RESOURCES); } @@ -703,10 +678,8 @@ static tBTM_STATUS btm_pm_snd_md_req(UINT8 pm_id, int link_ind, tBTM_PM_PWR_MD * static void btm_pm_check_stored(void) { int xx; - for(xx=0; xx= MAX_L2CAP_LINKS) + if (btm_cb.pm_pend_link >= MAX_L2CAP_LINKS) { return; + } p_cb = &btm_cb.pm_mode_db[btm_cb.pm_pend_link]; - if(status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { p_cb->state = BTM_PM_ST_PENDING; pm_status = BTM_PM_STS_PENDING; #if BTM_PM_DEBUG == TRUE BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status new state:0x%x", p_cb->state); #endif // BTM_PM_DEBUG - } - else /* the command was not successfull. Stay in the same state */ - { + } else { /* the command was not successfull. Stay in the same state */ pm_status = BTM_PM_STS_ERROR; } /* notify the caller is appropriate */ - if( (btm_cb.pm_pend_id != BTM_PM_SET_ONLY_ID) && - (btm_cb.pm_reg_db[btm_cb.pm_pend_id].mask & BTM_PM_REG_NOTIF) ) - { + if ( (btm_cb.pm_pend_id != BTM_PM_SET_ONLY_ID) && + (btm_cb.pm_reg_db[btm_cb.pm_pend_id].mask & BTM_PM_REG_NOTIF) ) { (*btm_cb.pm_reg_db[btm_cb.pm_pend_id].cback)(btm_cb.acl_db[btm_cb.pm_pend_link].remote_addr, pm_status, 0, status); } /* no pending cmd now */ #if BTM_PM_DEBUG == TRUE BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status state:0x%x, pm_pend_link: %d(new: %d)", - p_cb->state, btm_cb.pm_pend_link, MAX_L2CAP_LINKS); + p_cb->state, btm_cb.pm_pend_link, MAX_L2CAP_LINKS); #endif // BTM_PM_DEBUG btm_cb.pm_pend_link = MAX_L2CAP_LINKS; @@ -791,8 +761,9 @@ void btm_pm_proc_mode_change (UINT8 hci_status, UINT16 hci_handle, UINT8 mode, U tL2C_LCB *p_lcb; /* get the index to acl_db */ - if ((xx = btm_handle_to_acl_index(hci_handle)) >= MAX_L2CAP_LINKS) + if ((xx = btm_handle_to_acl_index(hci_handle)) >= MAX_L2CAP_LINKS) { return; + } p = &btm_cb.acl_db[xx]; @@ -804,10 +775,8 @@ void btm_pm_proc_mode_change (UINT8 hci_status, UINT16 hci_handle, UINT8 mode, U LOG_DEBUG("%s switched from %s to %s.", __func__, mode_to_string(old_state), mode_to_string(p_cb->state)); - if ((p_lcb = l2cu_find_lcb_by_bd_addr(p->remote_addr, BT_TRANSPORT_BR_EDR)) != NULL) - { - if ((p_cb->state == BTM_PM_ST_ACTIVE) || (p_cb->state == BTM_PM_ST_SNIFF)) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr(p->remote_addr, BT_TRANSPORT_BR_EDR)) != NULL) { + if ((p_cb->state == BTM_PM_ST_ACTIVE) || (p_cb->state == BTM_PM_ST_SNIFF)) { /* There might be any pending packets due to SNIFF or PENDING state */ /* Trigger L2C to start transmission of the pending packets. */ BTM_TRACE_DEBUG("btm mode change to active; check l2c_link for outgoing packets"); @@ -816,27 +785,22 @@ void btm_pm_proc_mode_change (UINT8 hci_status, UINT16 hci_handle, UINT8 mode, U } /* notify registered parties */ - for(yy=0; yy<=BTM_MAX_PM_RECORDS; yy++) - { + for (yy = 0; yy <= BTM_MAX_PM_RECORDS; yy++) { /* set req_mode HOLD mode->ACTIVE */ - if( (mode == BTM_PM_MD_ACTIVE) && (p_cb->req_mode[yy].mode == BTM_PM_MD_HOLD) ) + if ( (mode == BTM_PM_MD_ACTIVE) && (p_cb->req_mode[yy].mode == BTM_PM_MD_HOLD) ) { p_cb->req_mode[yy].mode = BTM_PM_MD_ACTIVE; + } } /* new request has been made. - post a message to BTU task */ - if(old_state & BTM_PM_STORED_MASK) - { + if (old_state & BTM_PM_STORED_MASK) { #if BTM_PM_DEBUG == TRUE BTM_TRACE_DEBUG( "btm_pm_proc_mode_change: Sending stored req:%d", xx); #endif // BTM_PM_DEBUG btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, xx, NULL); - } - else - { - for(zz=0; zzremote_addr, mode, interval, hci_status); } } @@ -877,7 +839,7 @@ void btm_pm_proc_ssr_evt (UINT8 *p, UINT16 evt_len) UINT16 max_rx_lat; int xx, yy; tBTM_PM_MCB *p_cb; - tACL_CONN *p_acl=NULL; + tACL_CONN *p_acl = NULL; UINT16 use_ssr = TRUE; UNUSED(evt_len); @@ -885,27 +847,24 @@ void btm_pm_proc_ssr_evt (UINT8 *p, UINT16 evt_len) STREAM_TO_UINT16 (handle, p); /* get the index to acl_db */ - if ((xx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) + if ((xx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS) { return; + } p += 2; STREAM_TO_UINT16 (max_rx_lat, p); p_cb = &(btm_cb.pm_mode_db[xx]); p_acl = &btm_cb.acl_db[xx]; - if(p_cb->interval == max_rx_lat) - { + if (p_cb->interval == max_rx_lat) { /* using legacy sniff */ use_ssr = FALSE; } /* notify registered parties */ - for(yy=0; yyremote_addr, BTM_PM_STS_SSR, use_ssr, status); } } @@ -927,16 +886,14 @@ BOOLEAN btm_pm_device_in_active_or_sniff_mode(void) /* The active state is the highest state-includes connected device and sniff mode*/ /* Covers active and sniff modes */ - if (BTM_GetNumAclLinks() > 0) - { + if (BTM_GetNumAclLinks() > 0) { BTM_TRACE_DEBUG("%s - ACL links: %d", __func__, BTM_GetNumAclLinks()); return TRUE; } #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) /* Check BLE states */ - if (btm_ble_get_conn_st() != BLE_CONN_IDLE) - { + if (btm_ble_get_conn_st() != BLE_CONN_IDLE) { BTM_TRACE_DEBUG("%s - BLE state: %x", __func__, btm_ble_get_conn_st()); return TRUE; } @@ -960,15 +917,13 @@ BOOLEAN btm_pm_device_in_scan_state(void) /* Check for paging */ if (btm_cb.is_paging || GKI_queue_length(&btm_cb.page_queue) > 0 || - BTM_BL_PAGING_STARTED == btm_cb.busy_level) - { - BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- paging"); - return TRUE; + BTM_BL_PAGING_STARTED == btm_cb.busy_level) { + BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- paging"); + return TRUE; } /* Check for inquiry */ - if ((btm_cb.btm_inq_vars.inq_active & (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK)) != 0) - { + if ((btm_cb.btm_inq_vars.inq_active & (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK)) != 0) { BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- Inq active"); return TRUE; } @@ -987,21 +942,22 @@ BOOLEAN btm_pm_device_in_scan_state(void) *******************************************************************************/ tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void) { - if (TRUE == btm_pm_device_in_active_or_sniff_mode()) - return BTM_CONTRL_ACTIVE; - else - if (TRUE == btm_pm_device_in_scan_state()) - return BTM_CONTRL_SCAN; - else - return BTM_CONTRL_IDLE; + if (TRUE == btm_pm_device_in_active_or_sniff_mode()) { + return BTM_CONTRL_ACTIVE; + } else if (TRUE == btm_pm_device_in_scan_state()) { + return BTM_CONTRL_SCAN; + } else { + return BTM_CONTRL_IDLE; + } } -static const char *mode_to_string(tBTM_PM_MODE mode) { - switch (mode) { +static const char *mode_to_string(tBTM_PM_MODE mode) +{ + switch (mode) { case BTM_PM_MD_ACTIVE: return "ACTIVE"; case BTM_PM_MD_SNIFF: return "SNIFF"; case BTM_PM_MD_PARK: return "PARK"; case BTM_PM_MD_HOLD: return "HOLD"; default: return "UNKNOWN"; - } + } } diff --git a/components/bt/bluedroid/stack/btm/btm_sco.c b/components/bt/bluedroid/stack/btm/btm_sco.c old mode 100755 new mode 100644 index 12ec4fe55..076bb655d --- a/components/bt/bluedroid/stack/btm/btm_sco.c +++ b/components/bt/bluedroid/stack/btm/btm_sco.c @@ -54,19 +54,18 @@ /* L O C A L F U N C T I O N P R O T O T Y P E S */ /********************************************************************************/ -static const tBTM_ESCO_PARAMS btm_esco_defaults = -{ +static const tBTM_ESCO_PARAMS btm_esco_defaults = { BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ - BTM_SCO_PKT_TYPES_MASK_HV2 + - BTM_SCO_PKT_TYPES_MASK_HV3 + - BTM_SCO_PKT_TYPES_MASK_EV3 + - BTM_SCO_PKT_TYPES_MASK_EV4 + - BTM_SCO_PKT_TYPES_MASK_EV5), - BTM_ESCO_RETRANS_POWER /* Retransmission Effort (Power) */ + BTM_SCO_PKT_TYPES_MASK_HV2 + + BTM_SCO_PKT_TYPES_MASK_HV3 + + BTM_SCO_PKT_TYPES_MASK_EV3 + + BTM_SCO_PKT_TYPES_MASK_EV4 + + BTM_SCO_PKT_TYPES_MASK_EV5), + BTM_ESCO_RETRANS_POWER /* Retransmission Effort (Power) */ }; /******************************************************************************* @@ -85,13 +84,12 @@ void btm_sco_flush_sco_data(UINT16 sco_inx) tSCO_CONN *p ; BT_HDR *p_buf; - if (sco_inx < BTM_MAX_SCO_LINKS) - { + if (sco_inx < BTM_MAX_SCO_LINKS) { p = &btm_cb.sco_cb.sco_db[sco_inx]; - while (p->xmit_data_q.p_first) - { - if ((p_buf = (BT_HDR *)GKI_dequeue (&p->xmit_data_q)) != NULL) + while (p->xmit_data_q.p_first) { + if ((p_buf = (BT_HDR *)GKI_dequeue (&p->xmit_data_q)) != NULL) { GKI_freebuf (p_buf); + } } } #else @@ -146,42 +144,33 @@ static void btm_esco_conn_rsp (UINT16 sco_inx, UINT8 hci_status, BD_ADDR bda, tBTM_ESCO_PARAMS *p_setup; UINT16 temp_pkt_types; - if (sco_inx < BTM_MAX_SCO_LINKS) + if (sco_inx < BTM_MAX_SCO_LINKS) { p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; + } /* Reject the connect request if refused by caller or wrong state */ - if (hci_status != HCI_SUCCESS || p_sco == NULL) - { - if (p_sco) - { + if (hci_status != HCI_SUCCESS || p_sco == NULL) { + if (p_sco) { p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING - : SCO_ST_UNUSED; + : SCO_ST_UNUSED; } - if (!btm_cb.sco_cb.esco_supported) - { - if (!btsnd_hcic_reject_conn (bda, hci_status)) - { + if (!btm_cb.sco_cb.esco_supported) { + if (!btsnd_hcic_reject_conn (bda, hci_status)) { + BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!"); + } + } else { + if (!btsnd_hcic_reject_esco_conn (bda, hci_status)) { BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!"); } } - else - { - if (!btsnd_hcic_reject_esco_conn (bda, hci_status)) - { - BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!"); - } - } - } - else /* Connection is being accepted */ - { + } else { /* Connection is being accepted */ p_sco->state = SCO_ST_CONNECTING; p_setup = &p_sco->esco.setup; /* If parameters not specified use the default */ - if (p_parms) + if (p_parms) { *p_setup = *p_parms; - else /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ - { + } else { /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ *p_setup = btm_cb.sco_cb.def_esco_parms; } @@ -199,26 +188,20 @@ static void btm_esco_conn_rsp (UINT16 sco_inx, UINT8 hci_status, BD_ADDR bda, } */ /* If SCO request, remove eSCO packet types (conformance) */ - if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) - { + if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) { temp_pkt_types &= BTM_SCO_LINK_ONLY_MASK; temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; - } - else - { + } else { /* OR in any exception packet types */ temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | - (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); } if (btsnd_hcic_accept_esco_conn (bda, p_setup->tx_bw, p_setup->rx_bw, - p_setup->max_latency, p_setup->voice_contfmt, - p_setup->retrans_effort, temp_pkt_types)) - { + p_setup->max_latency, p_setup->voice_contfmt, + p_setup->retrans_effort, temp_pkt_types)) { p_setup->packet_types = temp_pkt_types; - } - else - { + } else { BTM_TRACE_ERROR("Could not accept SCO conn: No Buffer!!!"); } } @@ -244,8 +227,7 @@ void btm_sco_check_send_pkts (UINT16 sco_inx) tSCO_CONN *p_ccb = &p_cb->sco_db[sco_inx]; /* If there is data to send, send it now */ - while (p_ccb->xmit_data_q.p_first != NULL) - { + while (p_ccb->xmit_data_q.p_first != NULL) { p_buf = NULL; #if BTM_SCO_HCI_DEBUG @@ -282,19 +264,16 @@ void btm_route_sco_data(BT_HDR *p_msg) STREAM_TO_UINT8 (pkt_size, p); - if ((sco_inx = btm_find_scb_by_handle(handle)) != BTM_MAX_SCO_LINKS ) - { + if ((sco_inx = btm_find_scb_by_handle(handle)) != BTM_MAX_SCO_LINKS ) { /* send data callback */ if (!btm_cb.sco_cb.p_data_cb ) /* if no data callback registered, just free the buffer */ - GKI_freebuf (p_msg); - else { + GKI_freebuf (p_msg); + } else { (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, (tBTM_SCO_DATA_FLAG) pkt_status); } - } - else /* no mapping handle SCO connection is active, free the buffer */ - { + } else { /* no mapping handle SCO connection is active, free the buffer */ GKI_freebuf (p_msg); } #else @@ -331,17 +310,13 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) tBTM_STATUS status = BTM_SUCCESS; if (sco_inx < BTM_MAX_SCO_LINKS && btm_cb.sco_cb.p_data_cb && - p_ccb->state == SCO_ST_CONNECTED) - { + p_ccb->state == SCO_ST_CONNECTED) { /* Ensure we have enough space in the buffer for the SCO and HCI headers */ - if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) - { + if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) { BTM_TRACE_ERROR ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset); GKI_freebuf (p_buf); status = BTM_ILLEGAL_VALUE; - } - else /* write HCI header */ - { + } else { /* write HCI header */ /* Step back 3 bytes to add the headers */ p_buf->offset -= HCI_SCO_PREAMBLE_SIZE; /* Set the pointer to the beginning of the data */ @@ -350,8 +325,7 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) UINT16_TO_STREAM (p, p_ccb->hci_handle); /* only sent the first BTM_SCO_DATA_SIZE_MAX bytes data if more than max, and set warning status */ - if (p_buf->len > BTM_SCO_DATA_SIZE_MAX) - { + if (p_buf->len > BTM_SCO_DATA_SIZE_MAX) { p_buf->len = BTM_SCO_DATA_SIZE_MAX; status = BTM_SCO_BAD_LENGTH; } @@ -363,13 +337,11 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) btm_sco_check_send_pkts (sco_inx); } - } - else - { + } else { GKI_freebuf(p_buf); BTM_TRACE_WARNING ("BTM_WriteScoData, invalid sco index: %d at state [%d]", - sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); + sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); status = BTM_UNKNOWN_ADDR; } @@ -393,67 +365,58 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) ** *******************************************************************************/ static tBTM_STATUS btm_send_connect_request(UINT16 acl_handle, - tBTM_ESCO_PARAMS *p_setup) + tBTM_ESCO_PARAMS *p_setup) { UINT16 temp_pkt_types; UINT8 xx; tACL_CONN *p_acl; /* Send connect request depending on version of spec */ - if (!btm_cb.sco_cb.esco_supported) - { - if (!btsnd_hcic_add_SCO_conn (acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types))) + if (!btm_cb.sco_cb.esco_supported) { + if (!btsnd_hcic_add_SCO_conn (acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types))) { return (BTM_NO_RESOURCES); - } - else - { + } + } else { temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & - btm_cb.btm_sco_pkt_types_supported); + btm_cb.btm_sco_pkt_types_supported); /* OR in any exception packet types */ temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | - (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); /* Finally, remove EDR eSCO if the remote device doesn't support it */ /* UPF25: Only SCO was brought up in this case */ btm_handle_to_acl_index(acl_handle); - if ((xx = btm_handle_to_acl_index(acl_handle)) < MAX_L2CAP_LINKS) - { + if ((xx = btm_handle_to_acl_index(acl_handle)) < MAX_L2CAP_LINKS) { p_acl = &btm_cb.acl_db[xx]; - if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) - { + if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) { BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO"); temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5); } - if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) - { + if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) { BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO"); temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5); } - /* Check to see if BR/EDR Secure Connections is being used - ** If so, we cannot use SCO-only packet types (HFP 1.7) - */ - if (BTM_BothEndsSupportSecureConnections(p_acl->remote_addr)) - { + /* Check to see if BR/EDR Secure Connections is being used + ** If so, we cannot use SCO-only packet types (HFP 1.7) + */ + if (BTM_BothEndsSupportSecureConnections(p_acl->remote_addr)) { temp_pkt_types &= ~(BTM_SCO_PKT_TYPE_MASK); BTM_TRACE_DEBUG("%s: SCO Conn: pkt_types after removing SCO (0x%04x)", __FUNCTION__, - temp_pkt_types); + temp_pkt_types); /* Return error if no packet types left */ - if (temp_pkt_types == 0) - { + if (temp_pkt_types == 0) { BTM_TRACE_ERROR("%s: SCO Conn (BR/EDR SC): No packet types available", __FUNCTION__); return (BTM_WRONG_MODE); } - } - else - { + } else { BTM_TRACE_DEBUG("%s: SCO Conn(BR/EDR SC):local or peer does not support BR/EDR SC", __FUNCTION__); } @@ -461,9 +424,9 @@ static tBTM_STATUS btm_send_connect_request(UINT16 acl_handle, BTM_TRACE_API(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", - p_setup->tx_bw, p_setup->rx_bw, - p_setup->max_latency, p_setup->voice_contfmt, - p_setup->retrans_effort, temp_pkt_types); + p_setup->tx_bw, p_setup->rx_bw, + p_setup->max_latency, p_setup->voice_contfmt, + p_setup->retrans_effort, temp_pkt_types); if (!btsnd_hcic_setup_esco_conn(acl_handle, p_setup->tx_bw, @@ -471,10 +434,11 @@ static tBTM_STATUS btm_send_connect_request(UINT16 acl_handle, p_setup->max_latency, p_setup->voice_contfmt, p_setup->retrans_effort, - temp_pkt_types)) + temp_pkt_types)) { return (BTM_NO_RESOURCES); - else + } else { p_setup->packet_types = temp_pkt_types; + } } return (BTM_CMD_STARTED); @@ -512,8 +476,7 @@ void btm_accept_sco_link(UINT16 sco_inx, tBTM_ESCO_PARAMS *p_setup, #if (BTM_MAX_SCO_LINKS>0) tSCO_CONN *p_sco; - if (sco_inx >= BTM_MAX_SCO_LINKS) - { + if (sco_inx >= BTM_MAX_SCO_LINKS) { BTM_TRACE_ERROR("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx); return; } @@ -589,87 +552,75 @@ tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types *p_sco_inx = BTM_INVALID_SCO_INDEX; /* If originating, ensure that there is an ACL connection to the BD Address */ - if (is_orig) - { - if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF)) + if (is_orig) { + if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF)) { return (BTM_UNKNOWN_ADDR); + } } - if (remote_bda) - { + if (remote_bda) { /* If any SCO is being established to the remote BD address, refuse this */ - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) - || (p->state == SCO_ST_PEND_UNPARK)) - && (!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) - { + || (p->state == SCO_ST_PEND_UNPARK)) + && (!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) { + return (BTM_BUSY); + } + } + } else { + /* Support only 1 wildcard BD address at a time */ + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) { return (BTM_BUSY); } } } - else - { - /* Support only 1 wildcard BD address at a time */ - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) - return (BTM_BUSY); - } - } /* Now, try to find an unused control block, and kick off the SCO establishment */ - for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (p->state == SCO_ST_UNUSED) - { - if (remote_bda) - { - if (is_orig) - { + for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (p->state == SCO_ST_UNUSED) { + if (remote_bda) { + if (is_orig) { /* can not create SCO link if in park mode */ #if BTM_SCO_WAKE_PARKED_LINK == TRUE - if(BTM_ReadPowerMode(remote_bda, &md) == BTM_SUCCESS) - { - if (md == BTM_PM_MD_PARK || md == BTM_PM_MD_SNIFF) - { - memset( (void*)&pm, 0, sizeof(pm)); + if (BTM_ReadPowerMode(remote_bda, &md) == BTM_SUCCESS) { + if (md == BTM_PM_MD_PARK || md == BTM_PM_MD_SNIFF) { + memset( (void *)&pm, 0, sizeof(pm)); pm.mode = BTM_PM_MD_ACTIVE; BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm); p->state = SCO_ST_PEND_UNPARK; } } #else // BTM_SCO_WAKE_PARKED_LINK - if( (BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_PM_MD_PARK) ) + if ( (BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_PM_MD_PARK) ) { return (BTM_WRONG_MODE); + } #endif // BTM_SCO_WAKE_PARKED_LINK } memcpy (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN); p->rem_bd_known = TRUE; - } - else + } else { p->rem_bd_known = FALSE; + } /* Link role is ignored in for this message */ - if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE) + if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE) { pkt_types = btm_cb.sco_cb.def_esco_parms.packet_types; + } p_setup = &p->esco.setup; *p_setup = btm_cb.sco_cb.def_esco_parms; p_setup->packet_types = (btm_cb.sco_cb.desired_sco_mode == BTM_LINK_TYPE_SCO) - ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) : pkt_types; + ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) : pkt_types; temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & - btm_cb.btm_sco_pkt_types_supported); + btm_cb.btm_sco_pkt_types_supported); /* OR in any exception packet types */ - if (btm_cb.sco_cb.desired_sco_mode == HCI_LINK_TYPE_ESCO) - { + if (btm_cb.sco_cb.desired_sco_mode == HCI_LINK_TYPE_ESCO) { temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | - (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); - } - else /* Only using SCO packet types; turn off EDR also */ - { + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); + } else { /* Only using SCO packet types; turn off EDR also */ temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; } @@ -679,36 +630,32 @@ tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types p->hci_handle = BTM_INVALID_HCI_HANDLE; p->is_orig = is_orig; - if( p->state != SCO_ST_PEND_UNPARK ) - { - if (is_orig) - { + if ( p->state != SCO_ST_PEND_UNPARK ) { + if (is_orig) { /* If role change is in progress, do not proceed with SCO setup * Wait till role change is complete */ p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); - if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) - { - BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x",acl_handle); + if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) { + BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x", acl_handle); p->state = SCO_ST_PEND_ROLECHANGE; } } } - if( p->state != SCO_ST_PEND_UNPARK && p->state != SCO_ST_PEND_ROLECHANGE ) - { - if (is_orig) - { + if ( p->state != SCO_ST_PEND_UNPARK && p->state != SCO_ST_PEND_ROLECHANGE ) { + if (is_orig) { BTM_TRACE_API("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d", - acl_handle, btm_cb.sco_cb.desired_sco_mode); + acl_handle, btm_cb.sco_cb.desired_sco_mode); - if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED) + if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED) { return (BTM_NO_RESOURCES); + } p->state = SCO_ST_CONNECTING; - } - else + } else { p->state = SCO_ST_LISTENING; + } } *p_sco_inx = xx; @@ -740,17 +687,17 @@ void btm_sco_chk_pend_unpark (UINT8 hci_status, UINT16 hci_handle) UINT16 acl_handle; tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { if ((p->state == SCO_ST_PEND_UNPARK) && - ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) + ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) { BTM_TRACE_API("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x", - acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status); + acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status); - if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) + if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) { p->state = SCO_ST_CONNECTING; + } } } #endif // BTM_MAX_SCO_LINKS @@ -774,16 +721,16 @@ void btm_sco_chk_pend_rolechange (UINT16 hci_handle) UINT16 acl_handle; tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { if ((p->state == SCO_ST_PEND_ROLECHANGE) && - ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) + ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) { BTM_TRACE_API("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle); - if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) + if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) { p->state = SCO_ST_CONNECTING; + } } } #endif @@ -807,17 +754,15 @@ void btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type) UINT16 xx; tBTM_ESCO_CONN_REQ_EVT_DATA evt_data; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { /* * If the sco state is in the SCO_ST_CONNECTING state, we still need * to return accept sco to avoid race conditon for sco creation */ int rem_bd_matches = p->rem_bd_known && - !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN); + !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN); if (((p->state == SCO_ST_CONNECTING) && rem_bd_matches) || - ((p->state == SCO_ST_LISTENING) && (rem_bd_matches || !p->rem_bd_known))) - { + ((p->state == SCO_ST_LISTENING) && (rem_bd_matches || !p->rem_bd_known))) { /* If this guy was a wildcard, he is not one any more */ p->rem_bd_known = TRUE; p->esco.data.link_type = link_type; @@ -825,27 +770,21 @@ void btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type) memcpy (p->esco.data.bd_addr, bda, BD_ADDR_LEN); /* If no callback, auto-accept the connection if packet types match */ - if (!p->esco.p_esco_cback) - { + if (!p->esco.p_esco_cback) { /* If requesting eSCO reject if default parameters are SCO only */ if ((link_type == BTM_LINK_TYPE_ESCO - && !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK) - && ((p_sco->def_esco_parms.packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) - == BTM_SCO_EXCEPTION_PKTS_MASK)) + && !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK) + && ((p_sco->def_esco_parms.packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) + == BTM_SCO_EXCEPTION_PKTS_MASK)) - /* Reject request if SCO is desired but no SCO packets delected */ - || (link_type == BTM_LINK_TYPE_SCO - && !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK))) - { + /* Reject request if SCO is desired but no SCO packets delected */ + || (link_type == BTM_LINK_TYPE_SCO + && !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK))) { btm_esco_conn_rsp(xx, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL); - } - else /* Accept the request */ - { + } else { /* Accept the request */ btm_esco_conn_rsp(xx, HCI_SUCCESS, bda, NULL); } - } - else /* Notify upper layer of connect indication */ - { + } else { /* Notify upper layer of connect indication */ memcpy(evt_data.bd_addr, bda, BD_ADDR_LEN); memcpy(evt_data.dev_class, dev_class, DEV_CLASS_LEN); evt_data.link_type = link_type; @@ -858,13 +797,10 @@ void btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type) } /* TCS usage */ - if (btm_cb.sco_cb.app_sco_ind_cb) - { + if (btm_cb.sco_cb.app_sco_ind_cb) { /* Now, try to find an unused control block */ - for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (p->state == SCO_ST_UNUSED) - { + for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (p->state == SCO_ST_UNUSED) { p->is_orig = FALSE; p->state = SCO_ST_LISTENING; @@ -874,8 +810,7 @@ void btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type) break; } } - if( xx < BTM_MAX_SCO_LINKS) - { + if ( xx < BTM_MAX_SCO_LINKS) { btm_cb.sco_cb.app_sco_ind_cb(xx); return; } @@ -910,58 +845,48 @@ void btm_sco_connected (UINT8 hci_status, BD_ADDR bda, UINT16 hci_handle, btm_cb.sco_cb.sco_disc_reason = hci_status; #if (BTM_MAX_SCO_LINKS>0) - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { if (((p->state == SCO_ST_CONNECTING) || - (p->state == SCO_ST_LISTENING) || - (p->state == SCO_ST_W4_CONN_RSP)) - && (p->rem_bd_known) - && (!bda || !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) - { - if (hci_status != HCI_SUCCESS) - { + (p->state == SCO_ST_LISTENING) || + (p->state == SCO_ST_W4_CONN_RSP)) + && (p->rem_bd_known) + && (!bda || !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { + if (hci_status != HCI_SUCCESS) { /* Report the error if originator, otherwise remain in Listen mode */ - if (p->is_orig) - { + if (p->is_orig) { /* If role switch is pending, we need try again after role switch is complete */ - if(hci_status == HCI_ERR_ROLE_SWITCH_PENDING) - { - BTM_TRACE_API("Role Change pending for HCI handle 0x%04x",hci_handle); + if (hci_status == HCI_ERR_ROLE_SWITCH_PENDING) { + BTM_TRACE_API("Role Change pending for HCI handle 0x%04x", hci_handle); p->state = SCO_ST_PEND_ROLECHANGE; } /* avoid calling disconnect callback because of sco creation race */ - else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION) - { + else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION) { p->state = SCO_ST_UNUSED; (*p->p_disc_cb)(xx); } - } - else - { + } else { /* Notify the upper layer that incoming sco connection has failed. */ - if (p->state == SCO_ST_CONNECTING) - { + if (p->state == SCO_ST_CONNECTING) { p->state = SCO_ST_UNUSED; (*p->p_disc_cb)(xx); - } - else + } else { p->state = SCO_ST_LISTENING; + } } return; } - if (p->state == SCO_ST_LISTENING) + if (p->state == SCO_ST_LISTENING) { spt = TRUE; + } p->state = SCO_ST_CONNECTED; p->hci_handle = hci_handle; - if (!btm_cb.sco_cb.esco_supported) - { + if (!btm_cb.sco_cb.esco_supported) { p->esco.data.link_type = BTM_LINK_TYPE_SCO; - if (spt) - { + if (spt) { parms.packet_types = p->esco.setup.packet_types; /* Keep the other parameters the same for SCO */ parms.max_latency = p->esco.setup.max_latency; @@ -969,11 +894,10 @@ void btm_sco_connected (UINT8 hci_status, BD_ADDR bda, UINT16 hci_handle, BTM_ChangeEScoLinkParms(xx, &parms); } - } - else - { - if (p_esco_data) + } else { + if (p_esco_data) { p->esco.data = *p_esco_data; + } } (*p->p_conn_cb)(xx); @@ -1001,10 +925,8 @@ UINT16 btm_find_scb_by_handle (UINT16 handle) int xx; tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle)) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle)) { return (xx); } } @@ -1029,12 +951,12 @@ tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) UINT16 tempstate; /* Validity check */ - if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) + if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) { return (BTM_UNKNOWN_ADDR); + } /* If no HCI handle, simply drop the connection and return */ - if (p->hci_handle == BTM_INVALID_HCI_HANDLE || p->state == SCO_ST_PEND_UNPARK) - { + if (p->hci_handle == BTM_INVALID_HCI_HANDLE || p->state == SCO_ST_PEND_UNPARK) { p->hci_handle = BTM_INVALID_HCI_HANDLE; p->state = SCO_ST_UNUSED; p->esco.p_esco_cback = NULL; /* Deregister the eSCO event callback */ @@ -1044,8 +966,7 @@ tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) tempstate = p->state; p->state = SCO_ST_DISCONNECTING; - if (!btsnd_hcic_disconnect (p->hci_handle, HCI_ERR_PEER_USER)) - { + if (!btsnd_hcic_disconnect (p->hci_handle, HCI_ERR_PEER_USER)) { p->state = tempstate; return (BTM_NO_RESOURCES); } @@ -1071,10 +992,8 @@ void btm_remove_sco_links (BD_ADDR bda) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; UINT16 xx; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (p->rem_bd_known && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (p->rem_bd_known && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { BTM_RemoveSco(xx); } } @@ -1102,10 +1021,8 @@ void btm_sco_removed (UINT16 hci_handle, UINT8 reason) #if (BTM_MAX_SCO_LINKS>0) p = &btm_cb.sco_cb.sco_db[0]; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && (p->hci_handle == hci_handle)) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && (p->hci_handle == hci_handle)) { btm_sco_flush_sco_data(xx); p->state = SCO_ST_UNUSED; @@ -1140,12 +1057,9 @@ void btm_sco_acl_removed (BD_ADDR bda) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; UINT16 xx; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (p->state != SCO_ST_UNUSED) - { - if ((!bda) || (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN) && p->rem_bd_known)) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (p->state != SCO_ST_UNUSED) { + if ((!bda) || (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN) && p->rem_bd_known)) { btm_sco_flush_sco_data(xx); p->state = SCO_ST_UNUSED; @@ -1189,8 +1103,9 @@ tBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) tSCO_CONN *p; /* Validity check */ - if (sco_inx >= BTM_MAX_SCO_LINKS) + if (sco_inx >= BTM_MAX_SCO_LINKS) { return (BTM_UNKNOWN_ADDR); + } p = &btm_cb.sco_cb.sco_db[sco_inx]; parms.packet_types = pkt_types; @@ -1233,10 +1148,11 @@ UINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; /* Validity check */ - if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) + if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) { return (p->esco.setup.packet_types); - else + } else { return (0); + } #else return (0); #endif @@ -1302,10 +1218,11 @@ UINT16 BTM_ReadScoHandle (UINT16 sco_inx) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; /* Validity check */ - if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) + if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) { return (p->hci_handle); - else + } else { return (BTM_INVALID_HCI_HANDLE); + } #else return (BTM_INVALID_HCI_HANDLE); #endif @@ -1327,10 +1244,11 @@ UINT8 *BTM_ReadScoBdAddr (UINT16 sco_inx) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; /* Validity check */ - if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->rem_bd_known)) + if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->rem_bd_known)) { return (p->esco.data.bd_addr); - else + } else { return (NULL); + } #else return (NULL); #endif @@ -1356,14 +1274,11 @@ tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) tSCO_CB *p_esco = &btm_cb.sco_cb; tBTM_ESCO_PARAMS *p_def = &p_esco->def_esco_parms; - if (p_esco->esco_supported) - { - if (p_parms) - { - if (sco_mode == BTM_LINK_TYPE_ESCO) - *p_def = *p_parms; /* Save as the default parameters */ - else /* Load only the SCO packet types */ - { + if (p_esco->esco_supported) { + if (p_parms) { + if (sco_mode == BTM_LINK_TYPE_ESCO) { + *p_def = *p_parms; /* Save as the default parameters */ + } else { /* Load only the SCO packet types */ p_def->packet_types = p_parms->packet_types; p_def->tx_bw = BTM_64KBITS_RATE; p_def->rx_bw = BTM_64KBITS_RATE; @@ -1377,9 +1292,7 @@ tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) } p_esco->desired_sco_mode = sco_mode; BTM_TRACE_API("BTM_SetEScoMode -> mode %d", sco_mode); - } - else - { + } else { p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO; p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK; p_def->retrans_effort = 0; @@ -1387,9 +1300,9 @@ tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) } BTM_TRACE_DEBUG(" txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x", - p_def->tx_bw, p_def->rx_bw, p_def->max_latency, - p_def->voice_contfmt, p_def->packet_types, - p_def->retrans_effort); + p_def->tx_bw, p_def->rx_bw, p_def->max_latency, + p_def->voice_contfmt, p_def->packet_types, + p_def->retrans_effort); return (BTM_SUCCESS); } @@ -1414,15 +1327,13 @@ tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) tBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) { #if (BTM_MAX_SCO_LINKS>0) - if (!btm_cb.sco_cb.esco_supported) - { + if (!btm_cb.sco_cb.esco_supported) { btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = NULL; return (BTM_MODE_UNSUPPORTED); } if (sco_inx < BTM_MAX_SCO_LINKS && - btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED) - { + btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED) { btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = p_esco_cback; return (BTM_SUCCESS); } @@ -1456,19 +1367,15 @@ tBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx); if (sco_inx < BTM_MAX_SCO_LINKS && - btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) - { + btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) { *p_parms = btm_cb.sco_cb.sco_db[sco_inx].esco.data; return (BTM_SUCCESS); } - if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) - { - for (index = 0; index < BTM_MAX_SCO_LINKS; index++) - { - if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) - { - BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d",index); + if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) { + for (index = 0; index < BTM_MAX_SCO_LINKS; index++) { + if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) { + BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d", index); *p_parms = btm_cb.sco_cb.sco_db[index].esco.data; return (BTM_SUCCESS); } @@ -1510,50 +1417,50 @@ tBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_par /* Make sure sco handle is valid and on an active link */ if (sco_inx >= BTM_MAX_SCO_LINKS || - btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) + btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) { return (BTM_WRONG_MODE); + } p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; p_setup = &p_sco->esco.setup; /* If SCO connection OR eSCO not supported just send change packet types */ if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO || - !btm_cb.sco_cb.esco_supported) - { + !btm_cb.sco_cb.esco_supported) { p_setup->packet_types = p_parms->packet_types & - (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); BTM_TRACE_API("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x", - p_sco->hci_handle, p_setup->packet_types); + p_sco->hci_handle, p_setup->packet_types); if (!btsnd_hcic_change_conn_type (p_sco->hci_handle, - BTM_ESCO_2_SCO(p_setup->packet_types))) + BTM_ESCO_2_SCO(p_setup->packet_types))) { return (BTM_NO_RESOURCES); - } - else - { + } + } else { temp_pkt_types = (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & - btm_cb.btm_sco_pkt_types_supported); + btm_cb.btm_sco_pkt_types_supported); /* OR in any exception packet types */ temp_pkt_types |= ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | - (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle); BTM_TRACE_API(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", - p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, - p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); + p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, + p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); /* When changing an existing link, only change latency, retrans, and pkts */ if (!btsnd_hcic_setup_esco_conn(p_sco->hci_handle, p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, p_setup->voice_contfmt, p_parms->retrans_effort, - temp_pkt_types)) + temp_pkt_types)) { return (BTM_NO_RESOURCES); - else + } else { p_parms->packet_types = temp_pkt_types; + } } return (BTM_CMD_STARTED); @@ -1584,8 +1491,7 @@ void BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parm { #if (BTM_MAX_SCO_LINKS>0) if (sco_inx < BTM_MAX_SCO_LINKS && - btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) - { + btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) { btm_esco_conn_rsp(sco_inx, hci_status, btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, p_parms); @@ -1633,15 +1539,12 @@ void btm_esco_proc_conn_chg (UINT8 status, UINT16 handle, UINT8 tx_interval, UINT16 xx; BTM_TRACE_EVENT("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x", - handle, status); + handle, status); - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle) { /* If upper layer wants notification */ - if (p->esco.p_esco_cback) - { + if (p->esco.p_esco_cback) { memcpy(data.bd_addr, p->esco.data.bd_addr, BD_ADDR_LEN); data.hci_status = status; data.sco_inx = xx; @@ -1675,10 +1578,10 @@ BOOLEAN btm_is_sco_active (UINT16 handle) UINT16 xx; tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED) + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED) { return (TRUE); + } } #endif return (FALSE); @@ -1700,10 +1603,8 @@ UINT8 BTM_GetNumScoLinks (void) UINT16 xx; UINT8 num_scos = 0; - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - switch (p->state) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + switch (p->state) { case SCO_ST_W4_CONN_RSP: case SCO_ST_CONNECTING: case SCO_ST_CONNECTED: @@ -1735,10 +1636,8 @@ BOOLEAN btm_is_sco_active_by_bdaddr (BD_ADDR remote_bda) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; /* If any SCO is being established to the remote BD address, refuse this */ - for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) - { - if ((!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && (p->state == SCO_ST_CONNECTED)) - { + for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { + if ((!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && (p->state == SCO_ST_CONNECTED)) { return (TRUE); } } @@ -1750,19 +1649,58 @@ BOOLEAN btm_is_sco_active_by_bdaddr (BD_ADDR remote_bda) tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types, UINT16 *p_sco_inx, tBTM_SCO_CB *p_conn_cb, - tBTM_SCO_CB *p_disc_cb) {return (BTM_NO_RESOURCES);} -tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) {return (BTM_NO_RESOURCES);} -tBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) {return (BTM_NO_RESOURCES);} -UINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) {return (0);} -UINT16 BTM_ReadDeviceScoPacketTypes (void) {return (0);} -UINT16 BTM_ReadScoHandle (UINT16 sco_inx) {return (BTM_INVALID_HCI_HANDLE);} -UINT8 *BTM_ReadScoBdAddr(UINT16 sco_inx) {return((UINT8 *) NULL);} -UINT16 BTM_ReadScoDiscReason (void) {return (BTM_INVALID_SCO_DISC_REASON);} -tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) {return (BTM_MODE_UNSUPPORTED);} -tBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) { return (BTM_ILLEGAL_VALUE);} -tBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) { return (BTM_MODE_UNSUPPORTED);} -tBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms) { return (BTM_MODE_UNSUPPORTED);} + tBTM_SCO_CB *p_disc_cb) +{ + return (BTM_NO_RESOURCES); +} +tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) +{ + return (BTM_NO_RESOURCES); +} +tBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) +{ + return (BTM_NO_RESOURCES); +} +UINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) +{ + return (0); +} +UINT16 BTM_ReadDeviceScoPacketTypes (void) +{ + return (0); +} +UINT16 BTM_ReadScoHandle (UINT16 sco_inx) +{ + return (BTM_INVALID_HCI_HANDLE); +} +UINT8 *BTM_ReadScoBdAddr(UINT16 sco_inx) +{ + return ((UINT8 *) NULL); +} +UINT16 BTM_ReadScoDiscReason (void) +{ + return (BTM_INVALID_SCO_DISC_REASON); +} +tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) +{ + return (BTM_MODE_UNSUPPORTED); +} +tBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) +{ + return (BTM_ILLEGAL_VALUE); +} +tBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) +{ + return (BTM_MODE_UNSUPPORTED); +} +tBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms) +{ + return (BTM_MODE_UNSUPPORTED); +} void BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parms) {} -UINT8 BTM_GetNumScoLinks (void) {return (0);} +UINT8 BTM_GetNumScoLinks (void) +{ + return (0); +} #endif /* If SCO is being used */ diff --git a/components/bt/bluedroid/stack/btm/btm_sec.c b/components/bt/bluedroid/stack/btm/btm_sec.c old mode 100755 new mode 100644 index 083c276db..c0eee569d --- a/components/bt/bluedroid/stack/btm/btm_sec.c +++ b/components/bt/bluedroid/stack/btm/btm_sec.c @@ -42,7 +42,7 @@ #endif #if BLE_INCLUDED == TRUE - #include "gatt_int.h" +#include "gatt_int.h" #endif #define BTM_SEC_MAX_COLLISION_DELAY (5000) @@ -58,8 +58,8 @@ BOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); static tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm); static tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur); static tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, - UINT32 mx_proto_id, - UINT32 mx_chan_id); + UINT32 mx_proto_id, + UINT32 mx_chan_id); static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec); static BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec); @@ -77,8 +77,8 @@ static char *btm_pair_state_descr (tBTM_PAIRING_STATE state); static void btm_sec_check_pending_reqs(void); static BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, - UINT32 mx_proto_id, UINT32 mx_chan_id, - tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); + UINT32 mx_proto_id, UINT32 mx_chan_id, + tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); static void btm_sec_bond_cancel_complete (void); static void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec); static BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec); @@ -91,8 +91,8 @@ UINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec); tBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state); static BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, - UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, - UINT32 mx_chan_id); + UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, + UINT32 mx_chan_id); static BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec); static BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec); @@ -102,23 +102,22 @@ static BOOLEAN btm_sec_is_serv_level0 (UINT16 psm); static UINT16 btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator); static BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, - tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); + tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); static void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport) ; static void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, - UINT8 encr_enable); + UINT8 encr_enable); static BOOLEAN btm_sec_acceptor_rejects_bonding (tBTM_SEC_DEV_REC *p_dev_rec); static BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec); static BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec); /* TRUE - authenticated link key is possible */ -static const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = -{ +static const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = { /* OUT, IO, IN, NONE */ -/* OUT */ {FALSE, FALSE, TRUE, FALSE}, -/* IO */ {FALSE, TRUE, TRUE, FALSE}, -/* IN */ {TRUE, TRUE, TRUE, FALSE}, -/* NONE */ {FALSE, FALSE, FALSE, FALSE} + /* OUT */ {FALSE, FALSE, TRUE, FALSE}, + /* IO */ {FALSE, TRUE, TRUE, FALSE}, + /* IN */ {TRUE, TRUE, TRUE, FALSE}, + /* NONE */ {FALSE, FALSE, FALSE, FALSE} }; /* BTM_IO_CAP_OUT 0 DisplayOnly */ /* BTM_IO_CAP_IO 1 DisplayYesNo */ @@ -136,11 +135,10 @@ static const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = *******************************************************************************/ static BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) { - if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) - { - return(TRUE); + if (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) { + return (TRUE); } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -154,11 +152,10 @@ static BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) *******************************************************************************/ static BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) { - if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) - { - return(TRUE); + if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) { + return (TRUE); } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -172,11 +169,10 @@ static BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) *******************************************************************************/ static BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) { - if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) - { - return(TRUE); + if (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) { + return (TRUE); } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -191,11 +187,10 @@ static BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) static BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec) { // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used - if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) - { - return(TRUE); + if (p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) { + return (TRUE); } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -209,11 +204,10 @@ static BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec) *******************************************************************************/ static BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec) { - if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) - { - return(TRUE); + if (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) { + return (TRUE); } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -236,31 +230,27 @@ BOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info) BTM_TRACE_EVENT("%s application registered\n", __func__); #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - LOG_INFO("%s p_cb_info->p_le_callback == 0x%p\n", __func__, p_cb_info->p_le_callback); - if (p_cb_info->p_le_callback) - { + LOG_DEBUG("%s p_cb_info->p_le_callback == 0x%p\n", __func__, p_cb_info->p_le_callback); + if (p_cb_info->p_le_callback) { #if SMP_INCLUDED == TRUE - BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )\n", __func__); - SMP_Register(btm_proc_smp_cback); + BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )\n", __func__); + SMP_Register(btm_proc_smp_cback); #endif - /* if no IR is loaded, need to regenerate all the keys */ - if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) - { - btm_ble_reset_id(); - } - } - else - { - LOG_WARN("%s p_cb_info->p_le_callback == NULL\n", __func__); + /* if no IR is loaded, need to regenerate all the keys */ + if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) { + btm_ble_reset_id(); + } + } else { + LOG_WARN("%s p_cb_info->p_le_callback == NULL\n", __func__); } #endif btm_cb.api = *p_cb_info; #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - LOG_INFO("%s btm_cb.api.p_le_callback = 0x%p\n", __func__, btm_cb.api.p_le_callback); + LOG_DEBUG("%s btm_cb.api.p_le_callback = 0x%p\n", __func__, btm_cb.api.p_le_callback); #endif BTM_TRACE_EVENT("%s application registered\n", __func__); - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -294,16 +284,14 @@ BOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) { int i; - for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) - { - if (btm_cb.p_rmt_name_callback[i] == NULL) - { + for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { + if (btm_cb.p_rmt_name_callback[i] == NULL) { btm_cb.p_rmt_name_callback[i] = p_callback; - return(TRUE); + return (TRUE); } } - return(FALSE); + return (FALSE); } @@ -321,16 +309,14 @@ BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) { int i; - for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) - { - if (btm_cb.p_rmt_name_callback[i] == p_callback) - { + for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { + if (btm_cb.p_rmt_name_callback[i] == p_callback) { btm_cb.p_rmt_name_callback[i] = NULL; - return(TRUE); + return (TRUE); } } - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -342,17 +328,16 @@ BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) ** Returns BOOLEAN TRUE or FALSE is device found ** *******************************************************************************/ -BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) +BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 *p_sec_flags) { tBTM_SEC_DEV_REC *p_dev_rec; - if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) - { + if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) { *p_sec_flags = (UINT8) p_dev_rec->sec_flags; - return(TRUE); + return (TRUE); } BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -364,22 +349,22 @@ BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) ** Returns BOOLEAN TRUE or FALSE is device found ** *******************************************************************************/ -BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, - tBT_TRANSPORT transport) +BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 *p_sec_flags, + tBT_TRANSPORT transport) { tBTM_SEC_DEV_REC *p_dev_rec; - if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) - { - if (transport == BT_TRANSPORT_BR_EDR) + if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) { + if (transport == BT_TRANSPORT_BR_EDR) { *p_sec_flags = (UINT8) p_dev_rec->sec_flags; - else + } else { *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8); + } - return(TRUE); + return (TRUE); } BTM_TRACE_ERROR ("BTM_GetSecurityFlags false\n"); - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -394,12 +379,11 @@ BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, void BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len) { BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d\n", - pin_type, (char *) pin_code, pin_code_len); + pin_type, (char *) pin_code, pin_code_len); /* If device is not up security mode will be set as a part of startup */ if ( (btm_cb.cfg.pin_type != pin_type) - && controller_get_interface()->get_is_ready() ) - { + && controller_get_interface()->get_is_ready() ) { btsnd_hcic_write_pin_type (pin_type); } @@ -448,7 +432,7 @@ void BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired) void BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode) { BTM_TRACE_API("%s: Mode : %u\n", __FUNCTION__, - secure_connections_only_mode); + secure_connections_only_mode); btm_cb.devcb.secure_connections_only = secure_connections_only_mode; btm_cb.security_mode = BTM_SEC_MODE_SC; @@ -481,16 +465,17 @@ BOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service #if (L2CAP_UCD_INCLUDED == TRUE) CONNECTION_TYPE conn_type; - if (is_originator) + if (is_originator) { conn_type = CONN_ORIENT_ORIG; - else + } else { conn_type = CONN_ORIENT_TERM; + } - return(btm_sec_set_security_level (conn_type, p_name, service_id, - sec_level, psm, mx_proto_id, mx_chan_id)); + return (btm_sec_set_security_level (conn_type, p_name, service_id, + sec_level, psm, mx_proto_id, mx_chan_id)); #else - return(btm_sec_set_security_level (is_originator, p_name, service_id, - sec_level, psm, mx_proto_id, mx_chan_id)); + return (btm_sec_set_security_level (is_originator, p_name, service_id, + sec_level, psm, mx_proto_id, mx_chan_id)); #endif } @@ -514,8 +499,8 @@ BOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service ** *******************************************************************************/ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, - UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, - UINT32 mx_chan_id) + UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, + UINT32 mx_chan_id) { tBTM_SEC_SERV_REC *p_srec; UINT16 index; @@ -525,17 +510,15 @@ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_na #if (L2CAP_UCD_INCLUDED == TRUE) BOOLEAN is_ucd; - if (conn_type & CONNECTION_TYPE_ORIG_MASK) + if (conn_type & CONNECTION_TYPE_ORIG_MASK) { is_originator = TRUE; - else + } else { is_originator = FALSE; - - if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) - { - is_ucd = TRUE; } - else - { + + if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) { + is_ucd = TRUE; + } else { is_ucd = FALSE; } #else @@ -550,23 +533,21 @@ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_na p_srec = &btm_cb.sec_serv_rec[0]; - for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) - { + for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) { /* Check if there is already a record for this service */ - if (p_srec->security_flags & BTM_SEC_IN_USE) - { + if (p_srec->security_flags & BTM_SEC_IN_USE) { #if BTM_SEC_SERVICE_NAME_LEN > 0 if (p_srec->psm == psm && - p_srec->mx_proto_id == mx_proto_id && - service_id == p_srec->service_id && - (!strncmp (p_name, (char *) p_srec->orig_service_name, - BTM_SEC_SERVICE_NAME_LEN) || - !strncmp (p_name, (char *) p_srec->term_service_name, - BTM_SEC_SERVICE_NAME_LEN))) + p_srec->mx_proto_id == mx_proto_id && + service_id == p_srec->service_id && + (!strncmp (p_name, (char *) p_srec->orig_service_name, + BTM_SEC_SERVICE_NAME_LEN) || + !strncmp (p_name, (char *) p_srec->term_service_name, + BTM_SEC_SERVICE_NAME_LEN))) #else if (p_srec->psm == psm && - p_srec->mx_proto_id == mx_proto_id && - service_id == p_srec->service_id) + p_srec->mx_proto_id == mx_proto_id && + service_id == p_srec->service_id) #endif { record_allocated = TRUE; @@ -574,24 +555,21 @@ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_na } } /* Mark the first available service record */ - else if (!record_allocated) - { + else if (!record_allocated) { memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); record_allocated = TRUE; first_unused_record = index; } } - if (!record_allocated) - { + if (!record_allocated) { BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)\n", BTM_SEC_MAX_SERVICE_RECORDS); - return(record_allocated); + return (record_allocated); } /* Process the request if service record is valid */ /* If a duplicate service wasn't found, use the first available */ - if (index >= BTM_SEC_MAX_SERVICE_RECORDS) - { + if (index >= BTM_SEC_MAX_SERVICE_RECORDS) { index = first_unused_record; p_srec = &btm_cb.sec_serv_rec[index]; } @@ -600,43 +578,41 @@ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_na p_srec->service_id = service_id; p_srec->mx_proto_id = mx_proto_id; - if (is_originator) - { + if (is_originator) { p_srec->orig_mx_chan_id = mx_chan_id; #if BTM_SEC_SERVICE_NAME_LEN > 0 BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); #endif /* clear out the old setting, just in case it exists */ #if (L2CAP_UCD_INCLUDED == TRUE) - if ( is_ucd ) - { + if ( is_ucd ) { p_srec->ucd_security_flags &= - ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | - BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); - } - else + ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | + BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); + } else #endif { p_srec->security_flags &= - ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | - BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); + ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | + BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); } /* Parameter validation. Originator should not set requirements for incoming connections */ sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE - | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN ); + | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN ); if (btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) - { - if (sec_level & BTM_SEC_OUT_AUTHENTICATE) + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) { + if (sec_level & BTM_SEC_OUT_AUTHENTICATE) { sec_level |= BTM_SEC_OUT_MITM; + } } /* Make sure the authenticate bit is set, when encrypt bit is set */ - if (sec_level & BTM_SEC_OUT_ENCRYPT) + if (sec_level & BTM_SEC_OUT_ENCRYPT) { sec_level |= BTM_SEC_OUT_AUTHENTICATE; + } /* outgoing connections usually set the security level right before * the connection is initiated. @@ -647,82 +623,76 @@ static BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_na { btm_cb.p_out_serv = p_srec; } - } - else - { + } else { p_srec->term_mx_chan_id = mx_chan_id; #if BTM_SEC_SERVICE_NAME_LEN > 0 BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); #endif /* clear out the old setting, just in case it exists */ #if (L2CAP_UCD_INCLUDED == TRUE) - if ( is_ucd ) - { + if ( is_ucd ) { p_srec->ucd_security_flags &= - ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | - BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE - | BTM_SEC_IN_MIN_16_DIGIT_PIN); - } - else + ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | + BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE + | BTM_SEC_IN_MIN_16_DIGIT_PIN); + } else #endif { p_srec->security_flags &= - ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | - BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE - | BTM_SEC_IN_MIN_16_DIGIT_PIN); + ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | + BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE + | BTM_SEC_IN_MIN_16_DIGIT_PIN); } /* Parameter validation. Acceptor should not set requirements for outgoing connections */ sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); if (btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) - { - if (sec_level & BTM_SEC_IN_AUTHENTICATE) + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) { + if (sec_level & BTM_SEC_IN_AUTHENTICATE) { sec_level |= BTM_SEC_IN_MITM; + } } /* Make sure the authenticate bit is set, when encrypt bit is set */ - if (sec_level & BTM_SEC_IN_ENCRYPT) + if (sec_level & BTM_SEC_IN_ENCRYPT) { sec_level |= BTM_SEC_IN_AUTHENTICATE; + } } #if (L2CAP_UCD_INCLUDED == TRUE) - if ( is_ucd ) - { + if ( is_ucd ) { p_srec->security_flags |= (UINT16)(BTM_SEC_IN_USE); p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); - } - else - { + } else { p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); } BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d\n", - index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); + index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x\n", - p_srec->security_flags, p_srec->ucd_security_flags); + p_srec->security_flags, p_srec->ucd_security_flags); #if BTM_SEC_SERVICE_NAME_LEN > 0 BTM_TRACE_API(" : service name [%s] (up to %d chars saved)\n", - p_name, BTM_SEC_SERVICE_NAME_LEN); + p_name, BTM_SEC_SERVICE_NAME_LEN); #endif #else p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d\n", - index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); + index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); #if BTM_SEC_SERVICE_NAME_LEN > 0 BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)\n", - p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); + p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); #endif #endif - return(record_allocated); + return (record_allocated); } /******************************************************************************* @@ -749,12 +719,10 @@ UINT8 BTM_SecClrService (UINT8 service_id) UINT8 num_freed = 0; int i; - for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) - { + for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) { /* Delete services with specified name (if in use and not SDP) */ if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) && - (!service_id || (service_id == p_srec->service_id))) - { + (!service_id || (service_id == p_srec->service_id))) { BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d\n", i, service_id); p_srec->security_flags = 0; #if (L2CAP_UCD_INCLUDED == TRUE) @@ -764,7 +732,7 @@ UINT8 BTM_SecClrService (UINT8 service_id) } } - return(num_freed); + return (num_freed); } /******************************************************************************* @@ -789,11 +757,9 @@ UINT8 btm_sec_clr_service_by_psm (UINT16 psm) UINT8 num_freed = 0; int i; - for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) - { + for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) { /* Delete services with specified name (if in use and not SDP) */ - if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) - { + if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) { BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d\n", i, p_srec->service_id); p_srec->security_flags = 0; num_freed++; @@ -801,7 +767,7 @@ UINT8 btm_sec_clr_service_by_psm (UINT16 psm) } BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d\n", psm, num_freed); - return(num_freed); + return (num_freed); } /******************************************************************************* @@ -820,17 +786,15 @@ void btm_sec_clr_temp_auth_service (BD_ADDR bda) { tBTM_SEC_DEV_REC *p_dev_rec; - if ((p_dev_rec = btm_find_dev (bda)) == NULL) - { + if ((p_dev_rec = btm_find_dev (bda)) == NULL) { BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB\n"); return; } /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */ - if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) - { + if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) { BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]\n", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; } @@ -855,61 +819,55 @@ void BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d\n", - btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); + btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); /* If timeout already expired or has been canceled, ignore the reply */ - if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) - { + if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) { BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d\n", btm_cb.pairing_state); return; } - if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) - { + if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) { BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr\n"); return; } - if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) - { + if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) { BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB\n"); return; } - if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) + if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) { res = BTM_ILLEGAL_VALUE; + } - if (res != BTM_SUCCESS) - { + if (res != BTM_SUCCESS) { /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */ if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || - ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && - (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) - { + ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && + (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; btsnd_hcic_pin_code_neg_reply (bd_addr); - } - else - { + } else { p_dev_rec->security_required = BTM_SEC_NONE; btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); } return; } - if (trusted_mask) + if (trusted_mask) { BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); + } p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; if (pin_len >= 16) { p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; } if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) - && (btm_cb.security_mode_changed == FALSE) ) - { + && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) + && (btm_cb.security_mode_changed == FALSE) ) { /* This is start of the dedicated bonding if local device is 2.0 */ btm_cb.pin_code_len = pin_len; p_dev_rec->pin_code_length = pin_len; @@ -917,35 +875,31 @@ void BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, btm_cb.security_mode_changed = TRUE; #ifdef APPL_AUTH_WRITE_EXCEPTION - if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) + if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) #endif - btsnd_hcic_write_auth_enable (TRUE); + btsnd_hcic_write_auth_enable (TRUE); btm_cb.acl_disc_reason = 0xff ; /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ /* before originating */ - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) - { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) { BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection\n"); /* we change state little bit early so btm_sec_connected() will originate connection */ /* when existing ACL link is down completely */ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); } /* if we already accepted incoming connection from pairing device */ - else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) - { + else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer\n"); btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); - } - else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) - { + } else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; if (btm_cb.api.p_auth_complete_callback) (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); + p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); } return; } @@ -956,8 +910,9 @@ void BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, #ifdef PORCHE_PAIRING_CONFLICT BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d\n", pin_len, btm_cb.pin_code_len); /* if this was not pre-fetched, save the PIN */ - if (btm_cb.pin_code_len == 0) + if (btm_cb.pin_code_len == 0) { memcpy (btm_cb.pin_code, p_pin, pin_len); + } btm_cb.pin_code_len_saved = pin_len; #endif btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin); @@ -983,48 +938,45 @@ tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_STATUS status; UINT8 *p_features; UINT8 ii; - tACL_CONN *p= btm_bda_to_acl(bd_addr, transport); + tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x\n", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d\n" , transport); /* Other security process is in progress */ - if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - { + if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s\n", btm_pair_state_descr(btm_cb.pairing_state)); - return(BTM_WRONG_MODE); + return (BTM_WRONG_MODE); } - if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) - { - return(BTM_NO_RESOURCES); + if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) { + return (BTM_NO_RESOURCES); } BTM_TRACE_DEBUG ("before update sec_flags=0x%x\n", p_dev_rec->sec_flags); /* Finished if connection is active and already paired */ if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR - && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) + && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) #if (BLE_INCLUDED == TRUE) - ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE - && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) + || ((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE + && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) #endif - ) - { + ) { BTM_TRACE_WARNING("BTM_SecBond -> Already Paired\n"); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /* Tell controller to get rid of the link key if it has one stored */ - if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) - return(BTM_NO_RESOURCES); + if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) { + return (BTM_NO_RESOURCES); + } /* Save the PIN code if we got a valid one */ - if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) - { + if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) { btm_cb.pin_code_len = pin_len; p_dev_rec->pin_code_length = pin_len; memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN); @@ -1036,17 +988,16 @@ tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; p_dev_rec->is_originator = TRUE; - if (trusted_mask) + if (trusted_mask) { BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); + } #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { btm_ble_init_pseudo_addr (p_dev_rec, bd_addr); p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK; - if (SMP_Pair(bd_addr) == SMP_STARTED) - { + if (SMP_Pair(bd_addr) == SMP_STARTED) { btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); @@ -1054,36 +1005,33 @@ tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, } btm_cb.pairing_flags = 0; - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); } #endif p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED - | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); + | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); BTM_TRACE_DEBUG ("after update sec_flags=0x%x\n", p_dev_rec->sec_flags); - if (!controller_get_interface()->supports_simple_pairing()) - { + if (!controller_get_interface()->supports_simple_pairing()) { /* The special case when we authenticate keyboard. Set pin type to fixed */ /* It would be probably better to do it from the application, but it is */ /* complicated */ if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) - && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) - && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) - { + && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) + && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) { btm_cb.pin_type_changed = TRUE; btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED); } } - for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) - { + for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) { p_features = p_dev_rec->features[ii]; BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x\n", - ii, p_features[0], p_features[1], p_features[2], p_features[3]); + ii, p_features[0], p_features[1], p_features[2], p_features[3]); BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x\n", - p_features[4], p_features[5], p_features[6], p_features[7]); + p_features[4], p_features[5], p_features[6], p_features[7]); } BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x\n", p_dev_rec->sm4, p_dev_rec->hci_handle); @@ -1093,54 +1041,49 @@ tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, #endif /* If connection already exists... */ - if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) - { - if (!btm_sec_start_authentication (p_dev_rec)) - return(BTM_NO_RESOURCES); + if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) { + if (!btm_sec_start_authentication (p_dev_rec)) { + return (BTM_NO_RESOURCES); + } btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); /* Mark lcb as bonding */ l2cu_update_lcb_4_bonding (bd_addr, TRUE); - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x\n", btm_cb.security_mode, p_dev_rec->sm4); if (!controller_get_interface()->supports_simple_pairing() - || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) - { - if ( btm_sec_check_prefetch_pin (p_dev_rec) ) + || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) { + if ( btm_sec_check_prefetch_pin (p_dev_rec) ) { return (BTM_CMD_STARTED); + } } if ((btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) && - BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) - { + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) && + BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { /* local is 2.1 and peer is unknown */ - if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) - { + if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) { /* we are not accepting connection request from peer * -> RNR (to learn if peer is 2.1) * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); - } - else - { + } else { /* We are accepting connection request from peer */ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); } BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d\n", - btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); + btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); return BTM_CMD_STARTED; } /* both local and peer are 2.1 */ status = btm_sec_dd_create_conn(p_dev_rec); - if (status != BTM_CMD_STARTED) - { + if (status != BTM_CMD_STARTED) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); } @@ -1173,8 +1116,7 @@ tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport, BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); /* LE device, do SMP pairing */ if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || - (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) - { + (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) { return BTM_ILLEGAL_ACTION; } #endif @@ -1200,8 +1142,9 @@ tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 tr { tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; #if BLE_INCLUDED == TRUE - if (BTM_UseLeLink(bd_addr)) + if (BTM_UseLeLink(bd_addr)) { transport = BT_TRANSPORT_LE; + } #endif return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); } @@ -1221,20 +1164,18 @@ tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x\n", - btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); + btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL) - || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) + || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) { return BTM_UNKNOWN_ADDR; + } #if SMP_INCLUDED == TRUE - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) - { - if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) - { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) { + if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) { BTM_TRACE_DEBUG ("Cancel LE pairing\n"); - if (SMP_PairCancel(bd_addr)) - { + if (SMP_PairCancel(bd_addr)) { return BTM_CMD_STARTED; } } @@ -1244,8 +1185,7 @@ tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) #endif BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d\n", p_dev_rec->hci_handle, p_dev_rec->sec_state ); if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && - BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) - { + BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) { /* pre-fetching pin for dedicated bonding */ btm_sec_bond_cancel_complete(); return BTM_SUCCESS; @@ -1253,36 +1193,33 @@ tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) /* If this BDA is in a bonding procedure */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) - { + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { /* If the HCI link is up */ - if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) - { + if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) { /* If some other thread disconnecting, we do not send second command */ if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) || - (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) - return(BTM_CMD_STARTED); + (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) { + return (BTM_CMD_STARTED); + } /* If the HCI link was set up by Bonding process */ - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) { return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); - else + } else { l2cu_update_lcb_4_bonding(bd_addr, FALSE); + } return BTM_NOT_AUTHORIZED; - } - else /*HCI link is not up */ - { + } else { /*HCI link is not up */ /* If the HCI link creation was started by Bonding process */ - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) - { - if (btsnd_hcic_create_conn_cancel(bd_addr)) + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) { + if (btsnd_hcic_create_conn_cancel(bd_addr)) { return BTM_CMD_STARTED; + } return BTM_NO_RESOURCES; } - if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) - { + if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) { BTM_CancelRemoteDeviceName(); btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; return BTM_CMD_STARTED; @@ -1312,12 +1249,11 @@ tBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key) tBTM_SEC_DEV_REC *p_dev_rec; if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL) - && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) - { + && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } - return(BTM_UNKNOWN_ADDR); + return (BTM_UNKNOWN_ADDR); } /******************************************************************************* @@ -1338,8 +1274,7 @@ tBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); - if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) - { + if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { return p_dev_rec->link_key_type; } return BTM_LKEY_TYPE_IGNORE; @@ -1379,50 +1314,47 @@ tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SE tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); if (!p_dev_rec || - (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) + (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) #if BLE_INCLUDED == TRUE - || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) + || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) #endif - ) - { + ) { /* Connection should be up and runnning */ BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected\n"); - if (p_callback) + if (p_callback) { (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE); + } - return(BTM_WRONG_MODE); + return (BTM_WRONG_MODE); } if ((transport == BT_TRANSPORT_BR_EDR && - (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) + (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - || (transport == BT_TRANSPORT_LE && - (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)) + || (transport == BT_TRANSPORT_LE && + (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)) #endif - ) - { + ) { BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted\n"); - if (p_callback) + if (p_callback) { (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); + } - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /* enqueue security request if security is active */ - if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) - { + if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) { BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request\n"); - if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data)) - { + if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data)) { return BTM_CMD_STARTED; - } - else - { - if (p_callback) + } else { + if (p_callback) { (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES); + } return BTM_NO_RESOURCES; } } @@ -1433,37 +1365,30 @@ tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SE p_dev_rec->is_originator = FALSE; BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x\n", - p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, - p_dev_rec->security_required); + p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, + p_dev_rec->security_required); #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); - if (p) - { - rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role); - } - else - { + if (p) { + rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role); + } else { rc = BTM_WRONG_MODE; BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL\n", __FUNCTION__); } - } - else + } else #endif rc = btm_sec_execute_procedure (p_dev_rec); - if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) - { - if (p_callback) - { + if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) { + if (p_callback) { p_dev_rec->p_callback = NULL; (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc); } } - return(rc); + return (rc); } /******************************************************************************* @@ -1475,50 +1400,49 @@ static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UIN tBTM_STATUS status = BTM_CMD_STARTED; BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x\n", - conn_handle, reason); + conn_handle, reason); /* send HCI_Disconnect on a transport only once */ - switch (old_state) - { - case BTM_SEC_STATE_DISCONNECTING: - if (conn_handle == p_dev_rec->hci_handle) - return status; + switch (old_state) { + case BTM_SEC_STATE_DISCONNECTING: + if (conn_handle == p_dev_rec->hci_handle) { + return status; + } - p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; - break; + p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; + break; #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - case BTM_SEC_STATE_DISCONNECTING_BLE: - if (conn_handle == p_dev_rec->ble_hci_handle) - return status; - - p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; - break; - - case BTM_SEC_STATE_DISCONNECTING_BOTH: + case BTM_SEC_STATE_DISCONNECTING_BLE: + if (conn_handle == p_dev_rec->ble_hci_handle) { return status; + } + + p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; + break; + + case BTM_SEC_STATE_DISCONNECTING_BOTH: + return status; #endif - default: - p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ? - BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; + default: + p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ? + BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; - break; + break; } /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */ - if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle) - { + if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle) { BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect\n"); - p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; + p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; status = BTM_SUCCESS; } /* Tear down the HCI link */ - else if (!btsnd_hcic_disconnect (conn_handle, reason)) - { - /* could not send disconnect. restore old state */ - p_dev_rec->sec_state = old_state; - status = BTM_NO_RESOURCES; + else if (!btsnd_hcic_disconnect (conn_handle, reason)) { + /* could not send disconnect. restore old state */ + p_dev_rec->sec_state = old_state; + status = BTM_NO_RESOURCES; } return status; @@ -1540,30 +1464,28 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) tBTM_SEC_DEV_REC *p_dev_rec; BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u", - btm_pair_state_descr(btm_cb.pairing_state), res); + btm_pair_state_descr(btm_cb.pairing_state), res); /* If timeout already expired or has been canceled, ignore the reply */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) - || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) + || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) { return; + } btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); - if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) - { + if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) { btm_cb.acl_disc_reason = HCI_SUCCESS; - if (res == BTM_SUCCESS) - { - if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) + if (res == BTM_SUCCESS) { + if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) { p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; - p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; + } + p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; } btsnd_hcic_user_conf_reply (bd_addr, TRUE); - } - else - { + } else { /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; btsnd_hcic_user_conf_reply (bd_addr, FALSE); @@ -1587,43 +1509,41 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) void BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) { BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d\n", - btm_pair_state_descr(btm_cb.pairing_state), res); + btm_pair_state_descr(btm_cb.pairing_state), res); if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) - || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) - { + || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) { return; } /* If timeout already expired or has been canceled, ignore the reply */ - if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) - { + if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); - if (p_dev_rec != NULL) - { + if (p_dev_rec != NULL) { btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; - if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) + if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) { btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); - else + } else { BTM_SecBondCancel(bd_addr); + } p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); return; } - } - else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) + } else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) { return; + } - if (passkey > BTM_MAX_PASSKEY_VAL) + if (passkey > BTM_MAX_PASSKEY_VAL) { res = BTM_ILLEGAL_VALUE; + } btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); - if (res != BTM_SUCCESS) - { + if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; btsnd_hcic_user_passkey_neg_reply (bd_addr); @@ -1652,8 +1572,9 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) void BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) { /* This API only make sense between PASSKEY_REQ and SP complete */ - if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) + if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) { btsnd_hcic_send_keypress_notif (bd_addr, type); + } } #endif @@ -1676,19 +1597,20 @@ void BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) void BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) { BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d\n", - btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); + btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) - || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) + || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) { return; + } - if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) - { + if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) { btm_cb.devcb.loc_auth_req = auth_req; btm_cb.devcb.loc_io_caps = io_cap; - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT)); + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { + auth_req = (BTM_AUTH_DD_BOND | (auth_req & BTM_AUTH_YN_BIT)); + } btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req); } @@ -1706,8 +1628,9 @@ tBTM_STATUS BTM_ReadLocalOobData(void) { tBTM_STATUS status = BTM_SUCCESS; - if (btsnd_hcic_read_local_oob_data() == FALSE) + if (btsnd_hcic_read_local_oob_data() == FALSE) { status = BTM_NO_RESOURCES; + } return status; } @@ -1727,16 +1650,16 @@ tBTM_STATUS BTM_ReadLocalOobData(void) void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r) { BTM_TRACE_EVENT ("%s() - State: %s res: %d\n", __func__, - btm_pair_state_descr(btm_cb.pairing_state), res); + btm_pair_state_descr(btm_cb.pairing_state), res); /* If timeout already expired or has been canceled, ignore the reply */ - if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) + if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) { return; + } btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); - if (res != BTM_SUCCESS) - { + if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; btsnd_hcic_rem_oob_neg_reply (bd_addr); @@ -1774,8 +1697,7 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, UINT8 name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; #endif - if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) - { + if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) { /* add mandatory part */ UINT16_TO_STREAM(p, len); BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address); @@ -1787,8 +1709,7 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, /* add Hash C */ UINT16 delta = BTM_OOB_HASH_C_SIZE + 2; - if (max_len >= delta) - { + if (max_len >= delta) { *p++ = BTM_OOB_HASH_C_SIZE + 1; *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); @@ -1798,8 +1719,7 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, /* add Rand R */ delta = BTM_OOB_RAND_R_SIZE + 2; - if (max_len >= delta) - { + if (max_len >= delta) { *p++ = BTM_OOB_RAND_R_SIZE + 1; *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); @@ -1809,8 +1729,7 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, /* add class of device */ delta = BTM_OOB_COD_SIZE + 2; - if (max_len >= delta) - { + if (max_len >= delta) { *p++ = BTM_OOB_COD_SIZE + 1; *p++ = BTM_EIR_OOB_COD_TYPE; DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); @@ -1819,14 +1738,12 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, } #if BTM_MAX_LOC_BD_NAME_LEN > 0 name_size = name_len; - if (name_size > strlen(btm_cb.cfg.bd_name)) - { + if (name_size > strlen(btm_cb.cfg.bd_name)) { name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; name_size = (UINT16)strlen(btm_cb.cfg.bd_name); } delta = name_size + 2; - if (max_len >= delta) - { + if (max_len >= delta) { *p++ = name_size + 1; *p++ = name_type; ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size); @@ -1878,11 +1795,10 @@ BOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec; - if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL) - { + if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL) { BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x\n", __FUNCTION__, - (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3], - (bd_addr[4]<< 8) + bd_addr[5]); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); return FALSE; } @@ -1904,7 +1820,7 @@ BOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr) ** NULL, if the tag is not found. ** *******************************************************************************/ -UINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) +UINT8 *BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) { UINT8 *p = p_data; UINT16 max_len; @@ -1912,48 +1828,41 @@ UINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) UINT8 *p_ret = NULL; UINT8 ret_len = 0; - if (p_data) - { + if (p_data) { STREAM_TO_UINT16(max_len, p); - if (max_len >= BTM_OOB_MANDATORY_SIZE) - { - if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) - { + if (max_len >= BTM_OOB_MANDATORY_SIZE) { + if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) { p_ret = p; /* the location for bd_addr */ ret_len = BTM_OOB_BD_ADDR_SIZE; - } - else - { + } else { p += BD_ADDR_LEN; max_len -= BTM_OOB_MANDATORY_SIZE; /* now the optional data in EIR format */ - while (max_len > 0) - { + while (max_len > 0) { len = *p++; /* tag data len + 1 */ type = *p++; - if (eir_tag == type) - { + if (eir_tag == type) { p_ret = p; ret_len = len - 1; break; } /* the data size of this tag is len + 1 (tag data len + 2) */ - if (max_len > len) - { + if (max_len > len) { max_len -= len; max_len--; len--; p += len; - } - else + } else { max_len = 0; + } } } } } - if (p_len) + if (p_len) { *p_len = ret_len; + } return p_ret; } @@ -1981,17 +1890,16 @@ void BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id) btm_cb.p_out_serv = p_serv_rec; p_dev_rec = btm_find_dev (bd_addr); - for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) - { + for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) - && (p_serv_rec->service_id == service_id) - && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) - { + && (p_serv_rec->service_id == service_id) + && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) { BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d\n", - p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id); + p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id); btm_cb.p_out_serv = p_serv_rec; - if (p_dev_rec) + if (p_dev_rec) { p_dev_rec->p_cur_service = p_serv_rec; + } break; } } @@ -2015,32 +1923,28 @@ static BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN UINT16 mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; BOOLEAN is_possible = TRUE; - if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) - { + if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) { is_possible = FALSE; - if(p_dev_rec->p_cur_service) - { + if (p_dev_rec->p_cur_service) { BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x\n", - __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, - p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags); - } - else - { + __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, + p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags); + } else { BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x\n", - __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); + __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); } /* Already have a link key to the connected peer. Is the link key secure enough? ** Is a link key upgrade even possible? */ if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ - && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || - (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) - /* has unauthenticated - link key */ - && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ - && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) - /* authenticated - link key is possible */ + && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || + (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) + /* has unauthenticated + link key */ + && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ + && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) + /* authenticated + link key is possible */ { /* upgrade is possible: check if the application wants the upgrade. * If the application is configured to use a global MITM flag, @@ -2068,11 +1972,11 @@ static void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_origi BTM_TRACE_DEBUG ("%s()\n", __func__); /* Only check if link key already exists */ - if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) + if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { return; + } - if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) - { + if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) { BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x\n", p_dev_rec->sec_flags); /* upgrade is possible: check if the application wants the upgrade. * If the application is configured to use a global MITM flag, @@ -2080,12 +1984,12 @@ static void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_origi tBTM_SP_UPGRADE evt_data; memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); evt_data.upgrade = TRUE; - if (btm_cb.api.p_sp_callback) + if (btm_cb.api.p_sp_callback) { (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data); + } BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x\n", evt_data.upgrade); - if (evt_data.upgrade) - { + if (evt_data.upgrade) { /* if the application confirms the upgrade, set the upgrade bit */ p_dev_rec->sm4 |= BTM_SM4_UPGRADE; @@ -2140,10 +2044,11 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle BOOLEAN transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */ #if (L2CAP_UCD_INCLUDED == TRUE) - if (conn_type & CONNECTION_TYPE_ORIG_MASK) + if (conn_type & CONNECTION_TYPE_ORIG_MASK) { is_originator = TRUE; - else + } else { is_originator = FALSE; + } BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x\n", __func__, conn_type, p_ref_data); #else @@ -2161,83 +2066,67 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle p_serv_rec = btm_sec_find_first_serv (conn_type, psm); /* If there is no application registered with this PSM do not allow connection */ - if (!p_serv_rec) - { + if (!p_serv_rec) { BTM_TRACE_WARNING ("%s() PSM: %d no application registerd\n", __func__, psm); (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); - return(BTM_MODE_UNSUPPORTED); + return (BTM_MODE_UNSUPPORTED); } /* Services level0 by default have no security */ - if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only)) - { - (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); - return(BTM_SUCCESS); + if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only)) { + (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); + return (BTM_SUCCESS); } #if (L2CAP_UCD_INCLUDED == TRUE) - if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) - { - if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) { + if (btm_cb.security_mode == BTM_SEC_MODE_SC) { security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags, - is_originator); - } - else - { + is_originator); + } else { security_required = p_serv_rec->ucd_security_flags; } rc = BTM_CMD_STARTED; - if (is_originator) - { + if (is_originator) { if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || - ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || - ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || - ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) - { + ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || + ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || + ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) { rc = BTM_SUCCESS; } - } - else - { + } else { if (((security_required & BTM_SEC_IN_FLAGS) == 0) || - ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || - ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || - ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) - { + ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || + ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) || + ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) { // Check for 16 digits (or MITM) if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || - (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && - btm_dev_16_digit_authenticated(p_dev_rec))) { + (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && + btm_dev_16_digit_authenticated(p_dev_rec))) { rc = BTM_SUCCESS; } } } if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { rc = BTM_CMD_STARTED; } - if (rc == BTM_SUCCESS) - { - if (p_callback) + if (rc == BTM_SUCCESS) { + if (p_callback) { (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); + } - return(BTM_SUCCESS); + return (BTM_SUCCESS); } - } - else + } else #endif { - if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + if (btm_cb.security_mode == BTM_SEC_MODE_SC) { security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, - is_originator); - } - else - { + is_originator); + } else { security_required = p_serv_rec->security_flags; } } @@ -2245,19 +2134,17 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm 0x%04x\n", __FUNCTION__, security_required, is_originator, psm); - if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) - { + if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) { BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */ - if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) - { - BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d\n", + if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) { + BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d\n" "rmt_support_for_sc : %d -> fail pairing\n", __FUNCTION__, local_supports_sc, p_dev_rec->remote_supports_secure_connections); if (p_callback) (*p_callback) (bd_addr, transport, (void *)p_ref_data, - BTM_MODE4_LEVEL4_NOT_SUPPORTED); + BTM_MODE4_LEVEL4_NOT_SUPPORTED); return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); } @@ -2265,65 +2152,57 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle /* there are some devices (moto KRZR) which connects to several services at the same time */ /* we will process one after another */ - if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) - { + if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) { BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x\n", __func__, - psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); + psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x\n", security_required, p_dev_rec->sec_flags); rc = BTM_CMD_STARTED; if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || - btm_cb.security_mode == BTM_SEC_MODE_NONE || - btm_cb.security_mode == BTM_SEC_MODE_SERVICE || - btm_cb.security_mode == BTM_SEC_MODE_LINK) || - (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && - (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) - { + btm_cb.security_mode == BTM_SEC_MODE_NONE || + btm_cb.security_mode == BTM_SEC_MODE_SERVICE || + btm_cb.security_mode == BTM_SEC_MODE_LINK) || + (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && + (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) { /* legacy mode - local is legacy or local is lisbon/peer is legacy * or SM4 with no possibility of link key upgrade */ - if (is_originator) - { + if (is_originator) { if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || - ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || - ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || - ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) ) - { + ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || + ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || + ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) ) { rc = BTM_SUCCESS; } - } - else - { + } else { if (((security_required & BTM_SEC_IN_FLAGS) == 0) || - (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || - (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || - (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)))) - { + (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || + (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || + (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec)))) { // Check for 16 digits (or MITM) if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || - (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { + (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { rc = BTM_SUCCESS; } } } if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { rc = BTM_CMD_STARTED; } - if (rc == BTM_SUCCESS) - { - if (p_callback) + if (rc == BTM_SUCCESS) { + if (p_callback) { (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); - return(BTM_SUCCESS); + } + return (BTM_SUCCESS); } } btm_cb.sec_req_pending = TRUE; - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /* Save pointer to service record */ @@ -2331,26 +2210,19 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */ if (btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) - { - if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) - { - if (is_originator) - { + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) { + if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { + if (is_originator) { /* SM4 to SM4 -> always authenticate & encrypt */ security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); - } - else /* acceptor */ - { + } else { /* acceptor */ /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */ chk_acp_auth_done = TRUE; /* SM4 to SM4 -> always authenticate & encrypt */ security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); - } - } - else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) - { + } + } else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) { /* the remote features are not known yet */ BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x\n", __FUNCTION__, (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags); @@ -2361,7 +2233,7 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle } BTM_TRACE_DEBUG ("%s() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d\n", __func__, - p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); + p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); old_security_required = p_dev_rec->security_required; old_is_originator = p_dev_rec->is_originator; @@ -2370,24 +2242,24 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle p_dev_rec->is_originator = is_originator; #if (L2CAP_UCD_INCLUDED == TRUE) - if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) + if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) { p_dev_rec->is_ucd = TRUE; - else + } else { p_dev_rec->is_ucd = FALSE; + } #endif /* If there are multiple service records used through the same PSM */ /* leave security decision for the multiplexor on the top */ #if (L2CAP_UCD_INCLUDED == TRUE) if (((btm_sec_find_next_serv (p_serv_rec)) != NULL) - &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ + && (!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ #else if ((btm_sec_find_next_serv (p_serv_rec)) != NULL) #endif { BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d\n", p_dev_rec->sm4, chk_acp_auth_done); - if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) - { + if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) { BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer\n", psm); /* pre-Lisbon: restore the old settings */ p_dev_rec->security_required = old_security_required; @@ -2395,7 +2267,7 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } } @@ -2403,12 +2275,11 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle * The layer above L2CAP needs to carry out the security requirement after L2CAP connect * response is received */ if (is_originator && - ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || - btm_cb.security_mode == BTM_SEC_MODE_NONE || - btm_cb.security_mode == BTM_SEC_MODE_SERVICE || - btm_cb.security_mode == BTM_SEC_MODE_LINK) || - !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) - { + ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || + btm_cb.security_mode == BTM_SEC_MODE_NONE || + btm_cb.security_mode == BTM_SEC_MODE_SERVICE || + btm_cb.security_mode == BTM_SEC_MODE_LINK) || + !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) { BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer\n", psm); /* restore the old settings */ p_dev_rec->security_required = old_security_required; @@ -2416,18 +2287,16 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } - if (chk_acp_auth_done) - { + if (chk_acp_auth_done) { BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x\n", - (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); + (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); /* SM4, but we do not know for sure which level of security we need. * as long as we have a link key, it's OK */ if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) - ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) - { + || (0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) { rc = BTM_DELAY_CHECK; /* 2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence @@ -2445,8 +2314,7 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle p_dev_rec->p_callback = p_callback; if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID - || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) - { + || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) { /* Although authentication and encryption are per connection ** authorization is per access request. For example when serial connection ** is up and authorized and client requests to read file (access to other @@ -2455,38 +2323,32 @@ tBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; } - if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) - { + if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ - if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) - { + if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) { p_dev_rec->sm4 |= BTM_SM4_UPGRADE; } p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_AUTHENTICATED); BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); - } - else - { + } else { /* If we already have a link key to the connected peer, is it secure enough? */ btm_sec_check_upgrade(p_dev_rec, is_originator); } } BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d\n", - __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, - p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); + __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, + p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); - if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) - { + if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) { p_dev_rec->p_callback = NULL; (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc); } - return(rc); + return (rc); } /******************************************************************************* @@ -2530,86 +2392,73 @@ tBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_o p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id); /* If there is no application registered with this PSM do not allow connection */ - if (!p_serv_rec) - { - if (p_callback) + if (!p_serv_rec) { + if (p_callback) { (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); + } BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d\n", - psm, mx_proto_id, mx_chan_id); + psm, mx_proto_id, mx_chan_id); return BTM_NO_RESOURCES; } - if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm))) - { + if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm))) { security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, - is_originator); - } - else - { + is_originator); + } else { security_required = p_serv_rec->security_flags; } /* there are some devices (moto phone) which connects to several services at the same time */ /* we will process one after another */ - if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) - { + if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) { BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed state: %s\n", __func__, - psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); + psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); rc = BTM_CMD_STARTED; if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || - btm_cb.security_mode == BTM_SEC_MODE_NONE || - btm_cb.security_mode == BTM_SEC_MODE_SERVICE || - btm_cb.security_mode == BTM_SEC_MODE_LINK) || - (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && - (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) - { + btm_cb.security_mode == BTM_SEC_MODE_NONE || + btm_cb.security_mode == BTM_SEC_MODE_SERVICE || + btm_cb.security_mode == BTM_SEC_MODE_LINK) || + (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && + (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) { /* legacy mode - local is legacy or local is lisbon/peer is legacy * or SM4 with no possibility of link key upgrade */ - if (is_originator) - { + if (is_originator) { if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || - ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || - ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) - ) - { + ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || + ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) + ) { rc = BTM_SUCCESS; } - } - else - { + } else { if (((security_required & BTM_SEC_IN_FLAGS) == 0) || - ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || - (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) || - ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) - ) - { + ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) || + (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec) || btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) || + ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) + ) { // Check for 16 digits (or MITM) if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || - (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { + (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { rc = BTM_SUCCESS; } } } if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { rc = BTM_CMD_STARTED; } } - if (rc == BTM_SUCCESS) - { + if (rc == BTM_SUCCESS) { BTM_TRACE_EVENT("%s: allow to bypass, checking authorization\n", __FUNCTION__); /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */ /* btm_sec_execute_procedure */ if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) || - (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) - { + (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) { BTM_TRACE_EVENT("%s: still need authorization\n", __FUNCTION__); rc = BTM_CMD_STARTED; } @@ -2617,41 +2466,34 @@ tBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_o /* Check whether there is a pending security procedure, if so we should always queue */ /* the new security request */ - if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) - { + if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) { BTM_TRACE_EVENT("%s: There is a pending security procedure\n", __FUNCTION__); rc = BTM_CMD_STARTED; } - if (rc == BTM_CMD_STARTED) - { + if (rc == BTM_CMD_STARTED) { BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request\n", __FUNCTION__); btm_sec_queue_mx_request (bd_addr, psm, is_originator, mx_proto_id, mx_chan_id, p_callback, p_ref_data); - } - else /* rc == BTM_SUCCESS */ - { + } else { /* rc == BTM_SUCCESS */ /* access granted */ - if (p_callback) - { + if (p_callback) { (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc); } } BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s\n", __FUNCTION__, rc, - btm_pair_state_descr(btm_cb.pairing_state)); + btm_pair_state_descr(btm_cb.pairing_state)); return rc; } if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) || - (btm_cb.security_mode == BTM_SEC_MODE_SC))) - { + (btm_cb.security_mode == BTM_SEC_MODE_SC))) { BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); /* acceptor receives service connection establishment Request for */ /* Secure Connections Only service */ - if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) - { - BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,\n", - "remote_support_for_sc %d: fail pairing\n",__FUNCTION__, + if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) { + BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,\n" + "remote_support_for_sc %d: fail pairing\n", __FUNCTION__, local_supports_sc, p_dev_rec->remote_supports_secure_connections); if (p_callback) @@ -2666,26 +2508,20 @@ tBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_o p_dev_rec->security_required = security_required; if (btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) - { - if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) - { + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) { + if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) { if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ - if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) - { + if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) { p_dev_rec->sm4 |= BTM_SM4_UPGRADE; } p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_AUTHENTICATED); BTM_TRACE_DEBUG("%s: sec_flags:0x%x\n", __FUNCTION__, p_dev_rec->sec_flags); - } - else - { + } else { /* If we already have a link key, check if that link key is good enough */ btm_sec_check_upgrade(p_dev_rec, is_originator); } @@ -2703,15 +2539,13 @@ tBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_o p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d\n", - __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, - p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); + __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, + p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); - if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) - { - if (p_callback) - { + if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) { + if (p_callback) { p_dev_rec->p_callback = NULL; - (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc); + (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc); } } @@ -2731,10 +2565,9 @@ tBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_o void btm_sec_conn_req (UINT8 *bda, UINT8 *dc) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); - BTM_TRACE_ERROR ("%s\n",__func__); + BTM_TRACE_ERROR ("%s\n", __func__); /* Some device may request a connection before we are done with the HCI_Reset sequence */ - if (!controller_get_interface()->get_is_ready()) - { + if (!controller_get_interface()->get_is_ready()) { BTM_TRACE_ERROR ("Security Manager: connect request when device not ready\n"); btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); return; @@ -2743,10 +2576,8 @@ void btm_sec_conn_req (UINT8 *bda, UINT8 *dc) /* Security guys wants us not to allow connection from not paired devices */ /* Check if connection is allowed for only paired devices */ - if (btm_cb.connect_only_paired) - { - if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) - { + if (btm_cb.connect_only_paired) { + if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) { BTM_TRACE_ERROR ("Security Manager: connect request from non-paired device\n"); btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); return; @@ -2755,10 +2586,8 @@ void btm_sec_conn_req (UINT8 *bda, UINT8 *dc) #if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE /* If non-discoverable, only allow known devices to connect */ - if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) - { - if (!p_dev_rec) - { + if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) { + if (!p_dev_rec) { BTM_TRACE_ERROR ("Security Manager: connect request from not paired device\n"); btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); return; @@ -2767,9 +2596,8 @@ void btm_sec_conn_req (UINT8 *bda, UINT8 *dc) #endif if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) - { + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) + && (!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) { BTM_TRACE_ERROR ("Security Manager: reject connect request from bonding device\n"); /* incoming connection from bonding device is rejected */ @@ -2783,15 +2611,12 @@ void btm_sec_conn_req (UINT8 *bda, UINT8 *dc) memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN); memcpy (btm_cb.connecting_dc, dc, DEV_CLASS_LEN); - if (l2c_link_hci_conn_req (bda)) - { - if (!p_dev_rec) - { + if (l2c_link_hci_conn_req (bda)) { + if (!p_dev_rec) { /* accept the connection -> allocate a device record */ p_dev_rec = btm_sec_alloc_dev (bda); } - if (p_dev_rec) - { + if (p_dev_rec) { p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; } } @@ -2812,24 +2637,25 @@ static void btm_sec_bond_cancel_complete (void) tBTM_SEC_DEV_REC *p_dev_rec; if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || - (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && - BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || - (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && - BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) - { + (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && + BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || + (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && + BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) { /* for dedicated bonding in legacy mode, authentication happens at "link level" * btm_sec_connected is called with failed status. * In theory, the code that handles is_pairing_device/TRUE should clean out security related code. * However, this function may clean out the security related flags and btm_sec_connected would not know * this function also needs to do proper clean up. */ - if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) + if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) { p_dev_rec->security_required = BTM_SEC_NONE; + } btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); /* Notify application that the cancel succeeded */ - if (btm_cb.api.p_bond_cancel_cmpl_callback) + if (btm_cb.api.p_bond_cancel_cmpl_callback) { btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); + } } } @@ -2850,23 +2676,23 @@ void btm_create_conn_cancel_complete (UINT8 *p) STREAM_TO_UINT8 (status, p); BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d\n", - btm_pair_state_descr(btm_cb.pairing_state), status); + btm_pair_state_descr(btm_cb.pairing_state), status); /* if the create conn cancel cmd was issued by the bond cancel, ** the application needs to be notified that bond cancel succeeded */ - switch (status) - { - case HCI_SUCCESS: - btm_sec_bond_cancel_complete(); - break; - case HCI_ERR_CONNECTION_EXISTS: - case HCI_ERR_NO_CONNECTION: - default: - /* Notify application of the error */ - if (btm_cb.api.p_bond_cancel_cmpl_callback) - btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); - break; + switch (status) { + case HCI_SUCCESS: + btm_sec_bond_cancel_complete(); + break; + case HCI_ERR_CONNECTION_EXISTS: + case HCI_ERR_NO_CONNECTION: + default: + /* Notify application of the error */ + if (btm_cb.api.p_bond_cancel_cmpl_callback) { + btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); + } + break; } } @@ -2885,11 +2711,9 @@ void btm_sec_check_pending_reqs (void) tBTM_SEC_QUEUE_ENTRY *p_e; BUFFER_Q bq; - if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) - { + if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { /* First, resubmit L2CAP requests */ - if (btm_cb.sec_req_pending) - { + if (btm_cb.sec_req_pending) { btm_cb.sec_req_pending = FALSE; l2cu_resubmit_pending_sec_req (NULL); } @@ -2899,23 +2723,18 @@ void btm_sec_check_pending_reqs (void) GKI_init_q (&btm_cb.sec_pending_q); - while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL) - { + while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL) { /* Check that the ACL is still up before starting security procedures */ - if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) - { - if (p_e->psm != 0) - { + if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) { + if (p_e->psm != 0) { BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u\n", __FUNCTION__, p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id); btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig, - p_e->mx_proto_id, p_e->mx_chan_id, - p_e->p_callback, p_e->p_ref_data); - } - else - { + p_e->mx_proto_id, p_e->mx_chan_id, + p_e->p_callback, p_e->p_ref_data); + } else { BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback, p_e->p_ref_data); } @@ -2969,16 +2788,13 @@ void btm_sec_device_down (void) *******************************************************************************/ void btm_sec_dev_reset (void) { - if (controller_get_interface()->supports_simple_pairing()) - { + if (controller_get_interface()->supports_simple_pairing()) { /* set the default IO capabilities */ btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; /* add mx service to use no security */ BTM_SetSecurityLevel(FALSE, "RFC_MUX\n", BTM_SEC_SERVICE_RFC_MUX, BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); - } - else - { + } else { btm_cb.security_mode = BTM_SEC_MODE_SERVICE; } @@ -3001,12 +2817,14 @@ void btm_sec_abort_access_req (BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); - if (!p_dev_rec) + if (!p_dev_rec) { return; + } if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) - && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) + && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) { return; + } p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; p_dev_rec->p_callback = NULL; @@ -3025,44 +2843,41 @@ void btm_sec_abort_access_req (BD_ADDR bd_addr) static tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec) { tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); - if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING)) - { - BTM_TRACE_WARNING("%s Connection already exists\n", __func__); - return BTM_CMD_STARTED; + if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING)) { + BTM_TRACE_WARNING("%s Connection already exists\n", __func__); + return BTM_CMD_STARTED; } /* Make sure an L2cap link control block is available */ - if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) - { + if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) { BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]\n", - p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], - p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); + p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], + p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); } /* set up the control block to indicated dedicated bonding */ btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; - if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) - { + if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) { BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]\n", - p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], - p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); + p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], + p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); l2cu_release_lcb(p_lcb); - return(BTM_NO_RESOURCES); + return (BTM_NO_RESOURCES); } btm_acl_update_busy_level (BTM_BLI_PAGE_EVT); BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]\n", - p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], - p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); + p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], + p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /******************************************************************************* @@ -3084,91 +2899,80 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete\n"); if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) - || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) - { + || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) { btm_acl_resubmit_page(); } /* If remote name request failed, p_bd_addr is null and we need to search */ /* based on state assuming that we are doing 1 at a time */ - if (p_bd_addr) + if (p_bd_addr) { p_dev_rec = btm_find_dev (p_bd_addr); - else - { + } else { p_dev_rec = &btm_cb.sec_dev_rec[0]; - for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { + for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) - && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)) - { + && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)) { p_bd_addr = p_dev_rec->bd_addr; break; } } - if (i == BTM_SEC_MAX_DEVICE_RECORDS) + if (i == BTM_SEC_MAX_DEVICE_RECORDS) { p_dev_rec = NULL; + } } /* Commenting out trace due to obf/compilation problems. */ #if (BT_USE_TRACES == TRUE) - if (!p_bd_name) + if (!p_bd_name) { p_bd_name = (UINT8 *)""; - - if (p_dev_rec) - { - BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x \n", - btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, - status, p_dev_rec->sec_state, p_dev_rec); } - else - { + + if (p_dev_rec) { + BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x \n", + btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, + status, p_dev_rec->sec_state, p_dev_rec); + } else { BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d\n", - btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, - status); + btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, + status); } #endif - if (p_dev_rec) - { + if (p_dev_rec) { old_sec_state = p_dev_rec->sec_state; - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN); p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x\n", p_dev_rec->sec_flags); - } - else - { + } else { /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */ p_dev_rec->sec_bd_name[0] = 0; } - if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) + if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) { p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; + } /* Notify all clients waiting for name to be resolved */ - for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) - { + for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); } - } - else - { + } else { dev_class[0] = 0; dev_class[1] = 0; dev_class[2] = 0; /* Notify all clients waiting for name to be resolved even if not found so clients can continue */ - for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) - { - if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) + for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) { + if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) { (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)""); + } } return; @@ -3176,19 +2980,17 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT /* If we were delaying asking UI for a PIN because name was not resolved, ask now */ if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr - && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) - { + && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) { BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)\n", btm_cb.pairing_flags, btm_cb.api.p_pin_callback); if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) && - ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) && - btm_cb.api.p_pin_callback) - { + ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) && + btm_cb.api.p_pin_callback) { BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback\n"); btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name, - (p_dev_rec->p_cur_service==NULL) ? FALSE - : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN)); + (p_dev_rec->p_cur_service == NULL) ? FALSE + : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN)); } /* Set the same state again to force the timer to be restarted */ @@ -3197,19 +2999,15 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT } /* Check if we were delaying bonding because name was not resolved */ - if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) - { - if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) - { + if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) { + if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) { BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x\n", p_dev_rec->sm4, status); - if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) - { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) { btm_sec_bond_cancel_complete(); return; } - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); if (btm_cb.api.p_auth_complete_callback) @@ -3219,49 +3017,42 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT } /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */ - if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) - { + if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/ /* If it is set, there may be a race condition */ BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x\n", - btm_cb.pairing_flags); - if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) - { + btm_cb.pairing_flags); + if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) { p_dev_rec->sm4 |= BTM_SM4_KNOWN; } } - BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d\n",__FUNCTION__, - p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), - BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); + BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d\n", __FUNCTION__, + p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), + BTM_SEC_IS_SM4(p_dev_rec->sm4), BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN. ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed) */ - if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) - { + if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) { /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ /* before originating */ - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) - { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) { BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection\n"); } /* Both we and the peer are 2.1 - continue to create connection */ - else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) - { + else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection\n"); btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); if (btm_cb.api.p_auth_complete_callback) - (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); + (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); } } return; - } - else - { + } else { BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA\n"); BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR); @@ -3270,11 +3061,11 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT } /* check if we were delaying link_key_callback because name was not resolved */ - if (p_dev_rec->link_key_not_sent) - { + if (p_dev_rec->link_key_not_sent) { /* If HCI connection complete has not arrived, wait for it */ - if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) + if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) { return; + } p_dev_rec->link_key_not_sent = FALSE; btm_send_link_key_notif(p_dev_rec); @@ -3282,8 +3073,7 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT /* If its not us who perform authentication, we should tell stackserver */ /* that some authentication has been completed */ /* This is required when different entities receive link notification and auth complete */ - if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) - { + if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) { if (btm_cb.api.p_auth_complete_callback) (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, @@ -3294,26 +3084,24 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT /* If this is a bonding procedure can disconnect the link now */ if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) - { + && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) { BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)\n"); p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); l2cu_start_post_bond_timer(p_dev_rec->hci_handle); return; } - if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) + if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) { return; + } /* If get name failed, notify the waiting layer */ - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); return; } - if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) - { + if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) { BTM_TRACE_EVENT ("waiting for remote features!!\n"); return; } @@ -3322,8 +3110,9 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT status = (UINT8)btm_sec_execute_procedure (p_dev_rec); /* If result is pending reply from the user or from the device is pending */ - if (status == BTM_CMD_STARTED) + if (status == BTM_CMD_STARTED) { return; + } /* There is no next procedure or start of procedure failed, notify the waiting layer */ btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); @@ -3350,12 +3139,10 @@ void btm_sec_rmt_host_support_feat_evt (UINT8 *p) BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x\n", p_dev_rec->sm4, p[0]); - if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) - { + if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { p_dev_rec->sm4 = BTM_SM4_KNOWN; STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); - if (HCI_SSP_HOST_SUPPORTED(features)) - { + if (HCI_SSP_HOST_SUPPORTED(features)) { p_dev_rec->sm4 = BTM_SM4_TRUE; } BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x\n", p_dev_rec->sm4, features[0]); @@ -3395,12 +3182,11 @@ void btm_io_capabilities_req (UINT8 *p) p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d\n", __FUNCTION__, - btm_cb.security_mode, p_dev_rec->num_read_pages); + btm_cb.security_mode, p_dev_rec->num_read_pages); - if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0)) - { - BTM_TRACE_EVENT("%s: Device security mode is SC only.\n", - "To continue need to know remote features.\n", __FUNCTION__); + if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0)) { + BTM_TRACE_EVENT("%s: Device security mode is SC only.\n" + "To continue need to know remote features.\n", __FUNCTION__); p_dev_rec->remote_features_needed = TRUE; return; @@ -3409,69 +3195,59 @@ void btm_io_capabilities_req (UINT8 *p) p_dev_rec->sm4 |= BTM_SM4_TRUE; BTM_TRACE_EVENT("%s: State: %s Flags: 0x%04x p_cur_service: 0x%08x\n", - __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), - btm_cb.pairing_flags, p_dev_rec->p_cur_service); + __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), + btm_cb.pairing_flags, p_dev_rec->p_cur_service); - if (p_dev_rec->p_cur_service) - { + if (p_dev_rec->p_cur_service) { BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x\n", - __FUNCTION__, p_dev_rec->p_cur_service->psm, - p_dev_rec->p_cur_service->security_flags); + __FUNCTION__, p_dev_rec->p_cur_service->psm, + p_dev_rec->p_cur_service->security_flags); } - switch (btm_cb.pairing_state) - { - /* initiator connecting */ - case BTM_PAIR_STATE_IDLE: - //TODO: Handle Idle pairing state - //security_required = p_dev_rec->security_required; - break; + switch (btm_cb.pairing_state) { + /* initiator connecting */ + case BTM_PAIR_STATE_IDLE: + //TODO: Handle Idle pairing state + //security_required = p_dev_rec->security_required; + break; - /* received IO capability response already->acceptor */ - case BTM_PAIR_STATE_INCOMING_SSP: - is_orig = FALSE; + /* received IO capability response already->acceptor */ + case BTM_PAIR_STATE_INCOMING_SSP: + is_orig = FALSE; - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) - { - /* acceptor in dedicated bonding */ - evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; - } - break; + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) { + /* acceptor in dedicated bonding */ + evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; + } + break; - /* initiator, at this point it is expected to be dedicated bonding - initiated by local device */ - case BTM_PAIR_STATE_WAIT_PIN_REQ: - if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) - { - evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; - } - else - { - err_code = HCI_ERR_HOST_BUSY_PAIRING; - } - break; - - /* any other state is unexpected */ - default: + /* initiator, at this point it is expected to be dedicated bonding + initiated by local device */ + case BTM_PAIR_STATE_WAIT_PIN_REQ: + if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) { + evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; + } else { err_code = HCI_ERR_HOST_BUSY_PAIRING; - BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d\n", __FUNCTION__, - btm_cb.pairing_state); - break; + } + break; + + /* any other state is unexpected */ + default: + err_code = HCI_ERR_HOST_BUSY_PAIRING; + BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d\n", __FUNCTION__, + btm_cb.pairing_state); + break; } - if (btm_cb.pairing_disabled) - { + if (btm_cb.pairing_disabled) { /* pairing is not allowed */ BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.\n", __FUNCTION__); err_code = HCI_ERR_PAIRING_NOT_ALLOWED; - } - else if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + } else if (btm_cb.security_mode == BTM_SEC_MODE_SC) { BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); /* device in Secure Connections Only mode */ - if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) - { - BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,\n", + if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) { + BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,\n" " remote_support_for_sc 0x%02x -> fail pairing\n", __FUNCTION__, local_supports_sc, p_dev_rec->remote_supports_secure_connections); @@ -3479,34 +3255,28 @@ void btm_io_capabilities_req (UINT8 *p) } } - if (err_code != 0) - { -/* coverity[uninit_use_in_call] -Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" -False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); -*/ + if (err_code != 0) { + /* coverity[uninit_use_in_call] + Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" + False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); + */ btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); return; } evt_data.is_orig = is_orig; - if (is_orig) - { + if (is_orig) { /* local device initiated the pairing non-bonding -> use p_cur_service */ if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && - p_dev_rec->p_cur_service && - (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) - { - if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + p_dev_rec->p_cur_service && + (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) { + if (btm_cb.security_mode == BTM_SEC_MODE_SC) { /* SC only mode device requires MITM protection */ evt_data.auth_req = BTM_AUTH_SP_YES; - } - else - { + } else { evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags & - BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; + BTM_SEC_OUT_MITM) ? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; } } } @@ -3516,25 +3286,23 @@ False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDA memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); -/* coverity[uninit_use_in_call] -Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" -False-positive: False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); -*/ - if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) + /* coverity[uninit_use_in_call] + Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" + False-positive: False-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); + */ + if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) { memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); + } btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); callback_rc = BTM_SUCCESS; - if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) - { + if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) { p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */ evt_data.auth_req = BTM_AUTH_SPGB_YES; - } - else if (btm_cb.api.p_sp_callback) - { + } else if (btm_cb.api.p_sp_callback) { /* the callback function implementation may change the IO capability... */ callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data); } @@ -3545,18 +3313,16 @@ False-positive: False-positive: evt_data.bd_addr is set at the beginning with: if (callback_rc == BTM_SUCCESS) #endif { - if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) - { + if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) { evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); } - if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + if (btm_cb.security_mode == BTM_SEC_MODE_SC) { /* At this moment we know that both sides are SC capable, device in */ /* SC only mode requires MITM for any service so let's set MITM bit */ evt_data.auth_req |= BTM_AUTH_YN_BIT; BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x\n", - __FUNCTION__, evt_data.auth_req); + __FUNCTION__, evt_data.auth_req); } /* if the user does not indicate "reply later" by setting the oob_data to unknown */ @@ -3565,8 +3331,8 @@ False-positive: False-positive: evt_data.bd_addr is set at the beginning with: btm_cb.devcb.loc_io_caps = evt_data.io_cap; BTM_TRACE_EVENT("%s: State: %s IO_CAP:%d oob_data:%d auth_req:%d", - __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, - evt_data.oob_data, evt_data.auth_req); + __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, + evt_data.oob_data, evt_data.auth_req); btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, evt_data.oob_data, evt_data.auth_req); @@ -3597,8 +3363,7 @@ void btm_io_capabilities_rsp (UINT8 *p) p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); /* If no security is in progress, this indicates incoming security */ - if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) - { + if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP); @@ -3615,17 +3380,17 @@ void btm_io_capabilities_rsp (UINT8 *p) /* We must have a device record here. * Use the connecting device's CoD for the connection */ -/* coverity[uninit_use_in_call] -Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" -FALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); -*/ - if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) + /* coverity[uninit_use_in_call] + Event uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" + FALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); + */ + if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) { memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); + } /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */ if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ - && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) /* and dedicated bonding bit is set */ - { + && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) { /* and dedicated bonding bit is set */ btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; } @@ -3633,8 +3398,9 @@ FALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beg p_dev_rec->rmt_io_caps = evt_data.io_cap; p_dev_rec->rmt_auth_req = evt_data.auth_req; - if (btm_cb.api.p_sp_callback) + if (btm_cb.api.p_sp_callback) { (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data); + } } /******************************************************************************* @@ -3660,90 +3426,81 @@ void btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) STREAM_TO_BDADDR (p_bda, p); BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s\n", - (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], - event, btm_pair_state_descr(btm_cb.pairing_state)); + (p_bda[0] << 24) + (p_bda[1] << 16) + (p_bda[2] << 8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], + event, btm_pair_state_descr(btm_cb.pairing_state)); if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL) - && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) - { + && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) + && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) { memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); - switch (event) - { - case BTM_SP_CFM_REQ_EVT: - /* Numeric confirmation. Need user to conf the passkey */ - btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); + switch (event) { + case BTM_SP_CFM_REQ_EVT: + /* Numeric confirmation. Need user to conf the passkey */ + btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); - /* The device record must be allocated in the "IO cap exchange" step */ - STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); + /* The device record must be allocated in the "IO cap exchange" step */ + STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); - evt_data.cfm_req.just_works = TRUE; + evt_data.cfm_req.just_works = TRUE; - /* process user confirm req in association with the auth_req param */ + /* process user confirm req in association with the auth_req param */ #if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) - if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) - && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) - && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) - { - /* Both devices are DisplayYesNo and one or both devices want to authenticate - -> use authenticated link key */ - evt_data.cfm_req.just_works = FALSE; - } + if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) + && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) + && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) { + /* Both devices are DisplayYesNo and one or both devices want to authenticate + -> use authenticated link key */ + evt_data.cfm_req.just_works = FALSE; + } #endif - BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d\n", - evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, - btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); + BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d\n", + evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, + btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); - evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; - evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; - evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; - evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; - break; + evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; + evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; + evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; + evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; + break; - case BTM_SP_KEY_NOTIF_EVT: - /* Passkey notification (other side is a keyboard) */ - STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); + case BTM_SP_KEY_NOTIF_EVT: + /* Passkey notification (other side is a keyboard) */ + STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); - BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u\n", evt_data.key_notif.passkey); + BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u\n", evt_data.key_notif.passkey); - btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); - break; + btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); + break; #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) - case BTM_SP_KEY_REQ_EVT: - /* HCI_USER_PASSKEY_REQUEST_EVT */ - btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); - break; + case BTM_SP_KEY_REQ_EVT: + /* HCI_USER_PASSKEY_REQUEST_EVT */ + btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); + break; #endif } - if (btm_cb.api.p_sp_callback) - { + if (btm_cb.api.p_sp_callback) { status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data); - if (status != BTM_NOT_AUTHORIZED) - { + if (status != BTM_NOT_AUTHORIZED) { return; } /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */ - } - else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) - { + } else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) { /* automatically reply with just works if no sp_cback */ status = BTM_SUCCESS; } - if (event == BTM_SP_CFM_REQ_EVT) - { + if (event == BTM_SP_CFM_REQ_EVT) { BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d\n", status); BTM_ConfirmReqReply (status, p_bda); } #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) - else if (event == BTM_SP_KEY_REQ_EVT) - { + else if (event == BTM_SP_KEY_REQ_EVT) { BTM_PasskeyReqReply(status, p_bda, 0); } #endif @@ -3753,26 +3510,21 @@ void btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) /* Something bad. we can only fail this connection */ btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; - if (BTM_SP_CFM_REQ_EVT == event) - { + if (BTM_SP_CFM_REQ_EVT == event) { btsnd_hcic_user_conf_reply (p_bda, FALSE); - } - else if (BTM_SP_KEY_NOTIF_EVT == event) - { + } else if (BTM_SP_KEY_NOTIF_EVT == event) { /* do nothing -> it very unlikely to happen. This event is most likely to be received by a HID host when it first connects to a HID device. Usually the Host initiated the connection in this case. On Mobile platforms, if there's a security process happening, the host probably can not initiate another connection. BTW (PC) is another story. */ - if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) - { + if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) { btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); } } #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) - else - { + else { btsnd_hcic_user_passkey_neg_reply(p_bda); } #endif @@ -3794,8 +3546,7 @@ void btm_keypress_notif_evt (UINT8 *p) UINT8 *p_bda; /* parse & report BTM_SP_KEYPRESS_EVT */ - if (btm_cb.api.p_sp_callback) - { + if (btm_cb.api.p_sp_callback) { p_bda = evt_data.bd_addr; STREAM_TO_BDADDR (p_bda, p); @@ -3825,61 +3576,52 @@ void btm_simple_pair_complete (UINT8 *p) status = *p++; STREAM_TO_BDADDR (evt_data.bd_addr, p); - if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) - { + if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) { BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x\n", - (evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3], - (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); + (evt_data.bd_addr[0] << 24) + (evt_data.bd_addr[1] << 16) + (evt_data.bd_addr[2] << 8) + evt_data.bd_addr[3], + (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); return; } BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u\n", - btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); + btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); evt_data.status = BTM_ERR_PROCESSING; - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { evt_data.status = BTM_SUCCESS; p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; - } - else - { - if (status == HCI_ERR_PAIRING_NOT_ALLOWED) - { + } else { + if (status == HCI_ERR_PAIRING_NOT_ALLOWED) { /* The test spec wants the peer device to get this failure code. */ btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT); /* Change the timer to 1 second */ btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); - } - else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) - { + } else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) { /* stop the timer */ btu_stop_timer (&btm_cb.pairing_tle); - if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) - { + if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) { /* the initiating side: will receive auth complete event. disconnect ACL at that time */ disc = TRUE; } - } - else + } else { disc = TRUE; + } } /* Let the pairing state stay active, p_auth_complete_callback will report the failure */ memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); - if (btm_cb.api.p_sp_callback) + if (btm_cb.api.p_sp_callback) { (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data); + } - if (disc) - { + if (disc) { /* simple pairing failed */ /* Avoid sending disconnect on HCI_ERR_PEER_USER */ - if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) - { + if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) { btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); } } @@ -3909,19 +3651,17 @@ void btm_rem_oob_req (UINT8 *p) STREAM_TO_BDADDR (p_bda, p); BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x\n", - p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); + p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) && - btm_cb.api.p_sp_callback) - { + btm_cb.api.p_sp_callback) { memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); - BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1); + BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN + 1); evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); - if ((*btm_cb.api.p_sp_callback) (BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data) == BTM_NOT_AUTHORIZED) - { + if ((*btm_cb.api.p_sp_callback) (BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data) == BTM_NOT_AUTHORIZED) { BTM_RemoteOobDataReply(TRUE, p_bda, c, r); } return; @@ -3948,17 +3688,17 @@ void btm_read_local_oob_complete (UINT8 *p) UINT8 status = *p++; BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d\n", status); - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { evt_data.status = BTM_SUCCESS; STREAM_TO_ARRAY16(evt_data.c, p); STREAM_TO_ARRAY16(evt_data.r, p); - } - else + } else { evt_data.status = BTM_ERR_PROCESSING; + } - if (btm_cb.api.p_sp_callback) + if (btm_cb.api.p_sp_callback) { (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data); + } } #endif /* BTM_OOB_INCLUDED */ @@ -3976,25 +3716,25 @@ static void btm_sec_auth_collision (UINT16 handle) { tBTM_SEC_DEV_REC *p_dev_rec; - if (!btm_cb.collision_start_time) + if (!btm_cb.collision_start_time) { btm_cb.collision_start_time = GKI_get_os_tick_count(); + } - if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay) - { - if (handle == BTM_SEC_INVALID_HANDLE) - { - if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) + if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay) { + if (handle == BTM_SEC_INVALID_HANDLE) { + if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) { p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING); - } - else + } + } else { p_dev_rec = btm_find_dev_by_handle (handle); + } - if (p_dev_rec != NULL) - { + if (p_dev_rec != NULL) { BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)\n", p_dev_rec->sec_state); /* We will restart authentication after timeout */ - if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) + if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) { p_dev_rec->sec_state = 0; + } btm_cb.p_collided_dev_rec = p_dev_rec; btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout; @@ -4023,27 +3763,23 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) /* Commenting out trace due to obf/compilation problems. */ #if (BT_USE_TRACES == TRUE) - if (p_dev_rec) - { + if (p_dev_rec) { BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s\n", - btm_pair_state_descr (btm_cb.pairing_state), - handle, status, - p_dev_rec->sec_state, - (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5], - p_dev_rec->sec_bd_name); - } - else - { + btm_pair_state_descr (btm_cb.pairing_state), + handle, status, + p_dev_rec->sec_state, + (p_dev_rec->bd_addr[2] << 24) + (p_dev_rec->bd_addr[3] << 16) + (p_dev_rec->bd_addr[4] << 8) + p_dev_rec->bd_addr[5], + p_dev_rec->sec_bd_name); + } else { BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d\n", - btm_pair_state_descr (btm_cb.pairing_state), - handle, status); + btm_pair_state_descr (btm_cb.pairing_state), + handle, status); } #endif /* For transaction collision we need to wait and repeat. There is no need */ /* for random timeout because only slave should receive the result */ - if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) - { + if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) { btm_sec_auth_collision(handle); return; } @@ -4055,35 +3791,35 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) the connection that is up, this is the last event received. */ if (p_dev_rec - && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) - { + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) + && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) { p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; l2cu_start_post_bond_timer (p_dev_rec->hci_handle); } - if (!p_dev_rec) + if (!p_dev_rec) { return; + } /* keep the old sm4 flag and clear the retry bit in control block */ old_sm4 = p_dev_rec->sm4; p_dev_rec->sm4 &= ~BTM_SM4_RETRY; if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) + && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) { are_bonding = TRUE; + } if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) + && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + } - if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) - { + if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) { if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) - && (old_state != BTM_PAIR_STATE_IDLE) ) - { + && (old_state != BTM_PAIR_STATE_IDLE) ) { (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, status); @@ -4098,15 +3834,13 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) ** on the encrypted link, so device is correct. */ if ((status == HCI_ERR_COMMAND_DISALLOWED) - && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == - (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) - { + && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == + (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) { status = HCI_SUCCESS; } /* Currently we do not notify user if it is a keyboard which connects */ /* User probably Disabled the keyboard while it was asleap. Let her try */ - if (btm_cb.api.p_auth_complete_callback) - { + if (btm_cb.api.p_auth_complete_callback) { /* report the suthentication status */ if (old_state != BTM_PAIR_STATE_IDLE) (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, @@ -4117,29 +3851,24 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; /* If this is a bonding procedure can disconnect the link now */ - if (are_bonding) - { + if (are_bonding) { p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; - if (status != HCI_SUCCESS) - { - if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) + if (status != HCI_SUCCESS) { + if (((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) { btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); - } - else - { + } + } else { BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL\n"); if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec)) - /* no LE keys are available, do deriving */ - && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || - /* or BR key is higher security than existing LE keys */ - (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && - (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) - { + /* no LE keys are available, do deriving */ + && (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) || + /* or BR key is higher security than existing LE keys */ + (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && + (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) { BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL\n"); - if (btm_sec_is_master(p_dev_rec)) - { + if (btm_sec_is_master(p_dev_rec)) { // Encryption is required to start SM over BR/EDR // indicate that this is encryption after authentication BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL); @@ -4152,21 +3881,17 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) } /* If authentication failed, notify the waiting layer */ - if (status != HCI_SUCCESS) - { - if ((old_sm4 & BTM_SM4_RETRY) == 0) - { + if (status != HCI_SUCCESS) { + if ((old_sm4 & BTM_SM4_RETRY) == 0) { /* allow retry only once */ - if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) - { + if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) { /* not retried yet. set the retry bit */ p_dev_rec->sm4 |= BTM_SM4_RETRY; BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x\n", p_dev_rec->sm4, p_dev_rec->sec_flags); } /* this retry for missing key is for Lisbon or later only. * Legacy device do not need this. the controller will drive the retry automatically */ - else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) - { + else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) { /* not retried yet. set the retry bit */ p_dev_rec->sm4 |= BTM_SM4_RETRY; p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; @@ -4177,8 +3902,7 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) BTM_DeleteStoredLinkKey (bd_addr, NULL); */ } - if (p_dev_rec->sm4 & BTM_SM4_RETRY) - { + if (p_dev_rec->sm4 & BTM_SM4_RETRY) { btm_sec_execute_procedure (p_dev_rec); return; } @@ -4186,8 +3910,7 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) - { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) { btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); } return; @@ -4196,8 +3919,8 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; if (p_dev_rec->pin_code_length >= 16 || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { // If we have MITM protection we have a higher level of security than // provided by 16 digits PIN p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; @@ -4207,8 +3930,9 @@ void btm_sec_auth_complete (UINT16 handle, UINT8 status) status = btm_sec_execute_procedure (p_dev_rec); /* If there is no next procedure, or procedure failed to start, notify the caller */ - if (status != BTM_CMD_STARTED) + if (status != BTM_CMD_STARTED) { btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); + } } /******************************************************************************* @@ -4229,116 +3953,103 @@ void btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) UINT8 acl_idx = btm_handle_to_acl_index(handle); #endif BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d\n", - status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); + status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x\n", (p_dev_rec) ? p_dev_rec->sec_flags : 0 ); /* For transaction collision we need to wait and repeat. There is no need */ /* for random timeout because only slave should receive the result */ if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || - (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) - { + (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) { btm_sec_auth_collision(handle); return; } btm_cb.collision_start_time = 0; - if (!p_dev_rec) + if (!p_dev_rec) { return; + } - if ((status == HCI_SUCCESS) && encr_enable) - { + if ((status == HCI_SUCCESS) && encr_enable) { if (p_dev_rec->hci_handle == handle) { p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); if (p_dev_rec->pin_code_length >= 16 || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; } - } - else - { + } else { p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); } } /* It is possible that we decrypted the link to perform role switch */ /* mark link not to be encrypted, so that when we execute security next time it will kick in again */ - if ((status == HCI_SUCCESS) && !encr_enable) - { - if (p_dev_rec->hci_handle == handle) + if ((status == HCI_SUCCESS) && !encr_enable) { + if (p_dev_rec->hci_handle == handle) { p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; - else + } else { p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; + } } BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x\n", p_dev_rec->sec_flags ); #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - if (acl_idx != MAX_L2CAP_LINKS) + if (acl_idx != MAX_L2CAP_LINKS) { p_acl = &btm_cb.acl_db[acl_idx]; + } - if (p_acl != NULL) + if (p_acl != NULL) { btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable); + } - if (p_acl && p_acl->transport == BT_TRANSPORT_LE) - { + if (p_acl && p_acl->transport == BT_TRANSPORT_LE) { if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE || - status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) - { + status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) { p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN); p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; } btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable); return; - } - else - { + } else { /* BR/EDR connection, update the encryption key size to be 16 as always */ p_dev_rec->enc_key_size = 16; } - BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d\n", - __func__, p_dev_rec->new_encryption_key_is_p256); + BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d\n", + __func__, p_dev_rec->new_encryption_key_is_p256); - if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle)) - { - if (p_dev_rec->new_encryption_key_is_p256) - { + if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle)) { + if (p_dev_rec->new_encryption_key_is_p256) { if (btm_sec_use_smp_br_chnl(p_dev_rec) && - btm_sec_is_master(p_dev_rec) && - /* if LE key is not known, do deriving */ - (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || - /* or BR key is higher security than existing LE keys */ - (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) - && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) - { + btm_sec_is_master(p_dev_rec) && + /* if LE key is not known, do deriving */ + (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) || + /* or BR key is higher security than existing LE keys */ + (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) + && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) { /* BR/EDR is encrypted with LK that can be used to derive LE LTK */ p_dev_rec->new_encryption_key_is_p256 = FALSE; - if (p_dev_rec->no_smp_on_br) - { + if (p_dev_rec->no_smp_on_br) { BTM_TRACE_DEBUG ("%s NO SM over BR/EDR\n", __func__); - } - else - { + } else { BTM_TRACE_DEBUG ("%s start SM over BR/EDR\n", __func__); SMP_BR_PairWith(p_dev_rec->bd_addr); } } - } - else - { + } else { // BR/EDR is successfully encrypted. Correct LK type if needed // (BR/EDR LK derived from LE LTK was used for encryption) if ((encr_enable == 1) && /* encryption is ON for SSP */ - /* LK type is for BR/EDR SC */ - (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { - if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) + /* LK type is for BR/EDR SC */ + (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { + if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) { p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; - else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ + } else { /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; + } BTM_TRACE_DEBUG("updated link key type to %d\n", p_dev_rec->link_key_type); btm_send_link_key_notif(p_dev_rec); @@ -4350,10 +4061,8 @@ void btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) #endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */ /* If this encryption was started by peer do not need to do anything */ - if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) - { - if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) - { + if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) { + if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) { p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; p_dev_rec->p_callback = NULL; l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); @@ -4363,8 +4072,7 @@ void btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; /* If encryption setup failed, notify the waiting layer */ - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); return; } @@ -4372,8 +4080,9 @@ void btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) /* Encryption setup succeeded, execute the next security procedure, if any */ status = (UINT8)btm_sec_execute_procedure (p_dev_rec); /* If there is no next procedure, or procedure failed to start, notify the caller */ - if (status != BTM_CMD_STARTED) + if (status != BTM_CMD_STARTED) { btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); + } } /******************************************************************************* @@ -4395,15 +4104,14 @@ static void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle) btm_cb.sec_collision_tle.param = 0; btm_cb.p_collided_dev_rec = 0; - if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) - { + if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection\n"); btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); if (btm_cb.api.p_auth_complete_callback) - (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); + (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); } } @@ -4426,40 +4134,32 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) UINT8 bit_shift = 0; btm_acl_resubmit_page(); - - BTM_TRACE_ERROR ("%s\n",__func__); + + BTM_TRACE_ERROR ("%s\n", __func__); /* Commenting out trace due to obf/compilation problems. */ #if (BT_USE_TRACES == TRUE) - if (p_dev_rec) - { + if (p_dev_rec) { BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s\n", - btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, - (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], - p_dev_rec->sec_bd_name); - } - else - { + btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, + (bda[2] << 24) + (bda[3] << 16) + (bda[4] << 8) + bda[5], + p_dev_rec->sec_bd_name); + } else { BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x \n", - btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, - (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); + btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, + (bda[2] << 24) + (bda[3] << 16) + (bda[4] << 8) + bda[5]); } #endif - if (!p_dev_rec) - { + if (!p_dev_rec) { /* There is no device record for new connection. Allocate one */ - if (status == HCI_SUCCESS) - { + if (status == HCI_SUCCESS) { p_dev_rec = btm_sec_alloc_dev (bda); - } - else - { + } else { /* If the device matches with stored paring address * reset the paring state to idle */ if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && - (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0)) - { + (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0)) { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); } @@ -4467,38 +4167,30 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) * just ignore it */ return; } - } - else /* Update the timestamp for this device */ - { + } else { /* Update the timestamp for this device */ #if BLE_INCLUDED == TRUE - bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0; + bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 : 0; #endif p_dev_rec->timestamp = btm_cb.dev_rec_count++; - if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) - { + if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { /* tell L2CAP it's a bonding connection. */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) - && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) - { + && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) { /* if incoming connection failed while pairing, then try to connect and continue */ /* Motorola S9 disconnects without asking pin code */ - if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) - { + if ((status != HCI_SUCCESS) && (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) { BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN\n"); p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; - if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) - { + if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) { /* Start timer with 0 to initiate connection with new LCB */ /* because L2CAP will delete current LCB with this event */ btm_cb.p_collided_dev_rec = p_dev_rec; btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout; btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); - } - else - { + } else { btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR); } @@ -4506,9 +4198,7 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ #endif return; - } - else - { + } else { l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE); } } @@ -4528,18 +4218,15 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) - { + && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) { /* if we rejected incoming connection from bonding device */ if ((status == HCI_ERR_HOST_REJECT_DEVICE) - &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) - { + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) { BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x\n", - btm_cb.pairing_flags, p_dev_rec->sm4); + btm_cb.pairing_flags, p_dev_rec->sm4); btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; - if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) - { + if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR); @@ -4547,8 +4234,7 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) } /* if we already have pin code */ - if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) - { + if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) { /* Start timer with 0 to initiate connection with new LCB */ /* because L2CAP will delete current LCB with this event */ btm_cb.p_collided_dev_rec = p_dev_rec; @@ -4559,8 +4245,7 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) return; } /* wait for incoming connection without resetting pairing state */ - else if (status == HCI_ERR_CONNECTION_EXISTS) - { + else if (status == HCI_ERR_CONNECTION_EXISTS) { BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection\n"); return; } @@ -4572,11 +4257,9 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) btm_restore_mode(); /* if connection fails during pin request, notify application */ - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { /* If connection failed because of during pairing, need to tell user */ - if (is_pairing_device) - { + if (is_pairing_device) { p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); BTM_TRACE_DEBUG ("security_required:%x \n", p_dev_rec->security_required ); @@ -4584,44 +4267,40 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); /* We need to notify host that the key is not known any more */ - if (btm_cb.api.p_auth_complete_callback) - { + if (btm_cb.api.p_auth_complete_callback) { (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, status); } } - /* - Do not send authentication failure, if following conditions hold good - 1. BTM Sec Pairing state is idle - 2. Link key for the remote device is present. - 3. Remote is SSP capable. - */ + /* + Do not send authentication failure, if following conditions hold good + 1. BTM Sec Pairing state is idle + 2. Link key for the remote device is present. + 3. Remote is SSP capable. + */ else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && - (((status == HCI_ERR_AUTH_FAILURE) || - (status == HCI_ERR_KEY_MISSING) || - (status == HCI_ERR_HOST_REJECT_SECURITY) || - (status == HCI_ERR_PAIRING_NOT_ALLOWED) || - (status == HCI_ERR_UNIT_KEY_USED) || - (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || - (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || - (status == HCI_ERR_REPEATED_ATTEMPTS)))) - { + (((status == HCI_ERR_AUTH_FAILURE) || + (status == HCI_ERR_KEY_MISSING) || + (status == HCI_ERR_HOST_REJECT_SECURITY) || + (status == HCI_ERR_PAIRING_NOT_ALLOWED) || + (status == HCI_ERR_UNIT_KEY_USED) || + (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || + (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || + (status == HCI_ERR_REPEATED_ATTEMPTS)))) { p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); #ifdef BRCM_NOT_4_BTE /* If we rejected pairing, pass this special result code */ - if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) - { + if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) { status = HCI_ERR_HOST_REJECT_SECURITY; } #endif /* We need to notify host that the key is not known any more */ - if (btm_cb.api.p_auth_complete_callback) - { + if (btm_cb.api.p_auth_complete_callback) { (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, status); @@ -4629,10 +4308,11 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) } if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT || - status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) + status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) { btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); - else + } else { btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); + } return; } @@ -4640,10 +4320,8 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) /* If initiated dedicated bonding, return the link key now, and initiate disconnect */ /* If dedicated bonding, and we now have a link key, we are all done */ if ( is_pairing_device - && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) - { - if (p_dev_rec->link_key_not_sent) - { + && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) { + if (p_dev_rec->link_key_not_sent) { p_dev_rec->link_key_not_sent = FALSE; btm_send_link_key_notif(p_dev_rec); } @@ -4651,10 +4329,11 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; /* remember flag before it is initialized */ - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { res = TRUE; - else + } else { res = FALSE; + } if (btm_cb.api.p_auth_complete_callback) (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, @@ -4663,8 +4342,7 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - if ( res ) - { + if ( res ) { /* Let l2cap start bond timer */ l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE); } @@ -4678,8 +4356,7 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) /* notify btm_acl that link is up, so starting of rmt name request will not */ /* set paging flag up */ p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); - if (p_acl_cb) - { + if (p_acl_cb) { /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */ #if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) /* For now there are a some devices that do not like sending */ @@ -4687,8 +4364,9 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) /* Set the packet types to the default allowed by the device */ btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); - if (btm_cb.btm_def_link_policy) + if (btm_cb.btm_def_link_policy) { BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); + } #endif } btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR); @@ -4697,17 +4375,19 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) /* authorization complete could have come after the connection is dropped */ /* and that would set wrong flag that link has been authorized already */ p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | - BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); + BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); - if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) + if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) { p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); + } - if (btm_cb.security_mode == BTM_SEC_MODE_LINK) + if (btm_cb.security_mode == BTM_SEC_MODE_LINK) { p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); + } if (p_dev_rec->pin_code_length >= 16 || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift); } @@ -4717,10 +4397,10 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) /* the name, or if we are originator because some procedure can have */ /* been scheduled while connection was down */ BTM_TRACE_DEBUG ("is_originator:%d \n", p_dev_rec->is_originator); - if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) - { - if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) + if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) { + if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) { btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); + } } return; } @@ -4739,23 +4419,21 @@ tBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); /* In some weird race condition we may not have a record */ - if (!p_dev_rec) - { + if (!p_dev_rec) { btsnd_hcic_disconnect (handle, reason); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } /* If we are in the process of bonding we need to tell client that auth failed */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) - && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) - { + && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) + && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) { /* we are currently doing bonding. Link will be disconnected when done */ btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; - return(BTM_BUSY); + return (BTM_BUSY); } - return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); + return (btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); } /******************************************************************************* @@ -4781,10 +4459,11 @@ void btm_sec_disconnected (UINT16 handle, UINT8 reason) btm_acl_resubmit_page(); - if (!p_dev_rec) + if (!p_dev_rec) { return; + } - transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE; + transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR : BT_TRANSPORT_LE; p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ @@ -4798,29 +4477,24 @@ void btm_sec_disconnected (UINT16 handle, UINT8 reason) uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr; BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x" - " remote_name:%s\n", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), - reason, bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5], p_dev_rec->sec_bd_name); + " remote_name:%s\n", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), + reason, bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5], p_dev_rec->sec_bd_name); BTM_TRACE_EVENT("%s before update sec_flags=0x%x\n", __func__, p_dev_rec->sec_flags); /* If we are in the process of bonding we need to tell client that auth failed */ if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) - { + && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; - if (btm_cb.api.p_auth_complete_callback) - { + if (btm_cb.api.p_auth_complete_callback) { /* If the disconnection reason is REPEATED_ATTEMPTS, send this error message to complete callback function to display the error message of Repeated attempts. All others, send HCI_ERR_AUTH_FAILURE. */ - if (reason == HCI_ERR_REPEATED_ATTEMPTS) - { + if (reason == HCI_ERR_REPEATED_ATTEMPTS) { result = HCI_ERR_REPEATED_ATTEMPTS; - } - else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - { + } else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { result = HCI_ERR_HOST_REJECT_SECURITY; } (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, @@ -4832,25 +4506,22 @@ void btm_sec_disconnected (UINT16 handle, UINT8 reason) btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS); /* see sec_flags processing in btm_acl_removed */ - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; - p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED); + p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); p_dev_rec->enc_key_size = 0; - } - else + } else #endif { p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED - | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED); + | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED); } #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE - if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) - { + if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) { p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ? - BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; + BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; return; } #endif @@ -4860,8 +4531,7 @@ void btm_sec_disconnected (UINT16 handle, UINT8 reason) p_callback = p_dev_rec->p_callback; /* if security is pending, send callback to clean up the security state */ - if(p_callback) - { + if (p_callback) { p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before we do, this call back must be reset here */ (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING); @@ -4887,20 +4557,20 @@ void btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_t BOOLEAN ltk_derived_lk = FALSE; BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d\n", - (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5], - key_type); + (p_bda[0] << 8) + p_bda[1], (p_bda[2] << 24) + (p_bda[3] << 16) + (p_bda[4] << 8) + p_bda[5], + key_type); if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) && - (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { + (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) { ltk_derived_lk = TRUE; key_type -= BTM_LTK_DERIVED_LKEY_OFFSET; } /* If connection was made to do bonding restore link security if changed */ btm_restore_mode(); - if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) + if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) { p_dev_rec->link_key_type = key_type; + } p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; @@ -4909,8 +4579,8 @@ void btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_t * add the extended security flag here. */ if (p_dev_rec->pin_code_length >= 16 || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || - p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || + p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; } @@ -4921,54 +4591,48 @@ void btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_t memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) - { - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) + && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) { + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { we_are_bonding = TRUE; - else + } else { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + } } /* save LTK derived LK no matter what */ - if (ltk_derived_lk) - { - if (btm_cb.api.p_link_key_callback) - { - BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)\n", - __FUNCTION__, p_dev_rec->link_key_type); - (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, - p_link_key, p_dev_rec->link_key_type); + if (ltk_derived_lk) { + if (btm_cb.api.p_link_key_callback) { + BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)\n", + __FUNCTION__, p_dev_rec->link_key_type); + (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, + p_link_key, p_dev_rec->link_key_type); } - } - else - { + } else { if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) || - (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { - p_dev_rec->new_encryption_key_is_p256 = TRUE; - BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d\n", - __func__, p_dev_rec->new_encryption_key_is_p256); + (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { + p_dev_rec->new_encryption_key_is_p256 = TRUE; + BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d\n", + __func__, p_dev_rec->new_encryption_key_is_p256); } } /* If name is not known at this point delay calling callback until the name is */ /* resolved. Unless it is a HID Device and we really need to send all link keys. */ if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) - && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) - && !ltk_derived_lk) - { + && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) + && !ltk_derived_lk) { BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d\n", - (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], - (p_bda[4] << 8) + p_bda[5], key_type); + (p_bda[0] << 24) + (p_bda[1] << 16) + (p_bda[2] << 8) + p_bda[3], + (p_bda[4] << 8) + p_bda[5], key_type); p_dev_rec->link_key_not_sent = TRUE; /* If it is for bonding nothing else will follow, so we need to start name resolution */ - if (we_are_bonding) - { - if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) + if (we_are_bonding) { + if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) { btm_inq_rmt_name_failed(); + } } BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x\n", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1]) @@ -4979,9 +4643,8 @@ void btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_t /* that some authentication has been completed */ /* This is required when different entities receive link notification and auth complete */ if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE) - /* for derived key, always send authentication callback for BR channel */ - || ltk_derived_lk) - { + /* for derived key, always send authentication callback for BR channel */ + || ltk_derived_lk) { if (btm_cb.api.p_auth_complete_callback) (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, HCI_SUCCESS); @@ -4992,15 +4655,11 @@ void btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_t if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) #endif { - if (btm_cb.api.p_link_key_callback) - { - if (ltk_derived_lk) - { + if (btm_cb.api.p_link_key_callback) { + if (ltk_derived_lk) { BTM_TRACE_DEBUG ("btm_sec_link_key_notification() LTK derived LK is saved already" - " (key_type = %d)\n", p_dev_rec->link_key_type); - } - else - { + " (key_type = %d)\n", p_dev_rec->link_key_type); + } else { (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, p_link_key, p_dev_rec->link_key_type); @@ -5023,20 +4682,18 @@ void btm_sec_link_key_request (UINT8 *p_bda) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x\n", - p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); + p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); - if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && - (btm_cb.collision_start_time != 0) && - (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) - { + if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && + (btm_cb.collision_start_time != 0) && + (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) { BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req " - "State: %d START_TIMEOUT : %d\n", - btm_cb.pairing_state, btm_cb.collision_start_time); + "State: %d START_TIMEOUT : %d\n", + btm_cb.pairing_state, btm_cb.collision_start_time); btsnd_hcic_link_key_neg_reply (p_bda); return; } - if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) - { + if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) { btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); return; } @@ -5073,107 +4730,101 @@ static void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle) UNUSED(p_tle); p_cb->pairing_tle.param = 0; -/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ -/* coverity[UNUSED_VALUE] pointer p_dev_rec is actually used several times... This is a Coverity false-positive, i.e. a fake issue. -*/ + /* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ + /* coverity[UNUSED_VALUE] pointer p_dev_rec is actually used several times... This is a Coverity false-positive, i.e. a fake issue. + */ p_dev_rec = btm_find_dev (p_cb->pairing_bda); BTM_TRACE_EVENT ("btm_sec_pairing_timeout() State: %s Flags: %u\n", - btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); + btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); - switch (p_cb->pairing_state) - { - case BTM_PAIR_STATE_WAIT_PIN_REQ: - btm_sec_bond_cancel_complete(); - break; + switch (p_cb->pairing_state) { + case BTM_PAIR_STATE_WAIT_PIN_REQ: + btm_sec_bond_cancel_complete(); + break; - case BTM_PAIR_STATE_WAIT_LOCAL_PIN: - if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) - btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda); - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - /* We need to notify the UI that no longer need the PIN */ - if (btm_cb.api.p_auth_complete_callback) - { - if (p_dev_rec == NULL) - { - name[0] = 0; - (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, - NULL, - name, HCI_ERR_CONNECTION_TOUT); - } - else - (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, - p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); - } - break; + case BTM_PAIR_STATE_WAIT_LOCAL_PIN: + if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) { + btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda); + } + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + /* We need to notify the UI that no longer need the PIN */ + if (btm_cb.api.p_auth_complete_callback) { + if (p_dev_rec == NULL) { + name[0] = 0; + (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, + NULL, + name, HCI_ERR_CONNECTION_TOUT); + } else + (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, + p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); + } + break; - case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: - btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); - /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ - break; + case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: + btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); + /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ + break; #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) - case BTM_PAIR_STATE_KEY_ENTRY: - btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); - /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ - break; + case BTM_PAIR_STATE_KEY_ENTRY: + btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); + /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ + break; #endif /* !BTM_IO_CAP_NONE */ #if BTM_OOB_INCLUDED == TRUE - case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: - if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) - auth_req |= BTM_AUTH_DD_BOND; + case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: + if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { + auth_req |= BTM_AUTH_DD_BOND; + } - btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, - BTM_OOB_NONE, auth_req); - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - break; + btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, + BTM_OOB_NONE, auth_req); + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + break; - case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: - btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - break; + case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: + btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + break; #endif /* BTM_OOB_INCLUDED */ - case BTM_PAIR_STATE_WAIT_DISCONNECT: - /* simple pairing failed. Started a 1-sec timer at simple pairing complete. - * now it's time to tear down the ACL link*/ - if (p_dev_rec == NULL) - { - BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x\n", - (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3], - (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); - break; - } - btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + case BTM_PAIR_STATE_WAIT_DISCONNECT: + /* simple pairing failed. Started a 1-sec timer at simple pairing complete. + * now it's time to tear down the ACL link*/ + if (p_dev_rec == NULL) { + BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x\n", + (p_cb->pairing_bda[0] << 24) + (p_cb->pairing_bda[1] << 16) + (p_cb->pairing_bda[2] << 8) + p_cb->pairing_bda[3], + (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); break; + } + btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + break; - case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: - case BTM_PAIR_STATE_GET_REM_NAME: - /* We need to notify the UI that timeout has happened while waiting for authentication*/ - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - if (btm_cb.api.p_auth_complete_callback) - { - if (p_dev_rec == NULL) - { - name[0] = 0; - (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, - NULL, - name, HCI_ERR_CONNECTION_TOUT); - } - else - (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, - p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); - } - break; + case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: + case BTM_PAIR_STATE_GET_REM_NAME: + /* We need to notify the UI that timeout has happened while waiting for authentication*/ + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + if (btm_cb.api.p_auth_complete_callback) { + if (p_dev_rec == NULL) { + name[0] = 0; + (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, + NULL, + name, HCI_ERR_CONNECTION_TOUT); + } else + (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, + p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); + } + break; - default: - BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s\n", btm_pair_state_descr(btm_cb.pairing_state)); - btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); - break; + default: + BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s\n", btm_pair_state_descr(btm_cb.pairing_state)); + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + break; } } @@ -5196,43 +4847,33 @@ void btm_sec_pin_code_request (UINT8 *p_bda) PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30}; #endif BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x\n", - btm_pair_state_descr(btm_cb.pairing_state), - (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] ); + btm_pair_state_descr(btm_cb.pairing_state), + (p_bda[0] << 8) + p_bda[1], (p_bda[2] << 24) + (p_bda[3] << 16) + (p_bda[4] << 8) + p_bda[5] ); - if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) - { + if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) { if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) && - (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) - { - /* fake this out - porshe carkit issue - */ + (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) { + /* fake this out - porshe carkit issue - */ // btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; - if(! btm_cb.pin_code_len_saved) - { - btsnd_hcic_pin_code_neg_reply (p_bda); - return; - } - else - { - btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); - return; - } - } - else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) - || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) - { + if (! btm_cb.pin_code_len_saved) { + btsnd_hcic_pin_code_neg_reply (p_bda); + return; + } else { + btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); + return; + } + } else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) + || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) { BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s\n", - btm_pair_state_descr(btm_cb.pairing_state)); + btm_pair_state_descr(btm_cb.pairing_state)); #ifdef PORCHE_PAIRING_CONFLICT /* reply pin code again due to counter in_rand when local initiates pairing */ BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing\n"); - if(! btm_cb.pin_code_len_saved) - { + if (! btm_cb.pin_code_len_saved) { btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code); - } - else - { + } else { btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); } @@ -5247,8 +4888,7 @@ void btm_sec_pin_code_request (UINT8 *p_bda) /* received PIN code request. must be non-sm4 */ p_dev_rec->sm4 = BTM_SM4_KNOWN; - if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) - { + if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) { memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN); btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; @@ -5256,8 +4896,7 @@ void btm_sec_pin_code_request (UINT8 *p_bda) BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); } - if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) - { + if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) { BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying\n"); btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); @@ -5266,12 +4905,12 @@ void btm_sec_pin_code_request (UINT8 *p_bda) /* Use the connecting device's CoD for the connection */ if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN)) - && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) + && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) { memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); + } /* We could have started connection after asking user for the PIN code */ - if (btm_cb.pin_code_len != 0) - { + if (btm_cb.pin_code_len != 0) { BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply\n"); btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code); @@ -5299,16 +4938,14 @@ void btm_sec_pin_code_request (UINT8 *p_bda) /* for keyboard bonding */ || (!p_dev_rec->is_originator && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) - && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) - { + && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) { BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!\n", - p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); + p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); btsnd_hcic_pin_code_neg_reply (p_bda); } /* Notify upper layer of PIN request and start expiration timer */ - else - { + else { btm_cb.pin_code_len_saved = 0; btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* Pin code request can not come at the same time as connection request */ @@ -5320,20 +4957,17 @@ void btm_sec_pin_code_request (UINT8 *p_bda) /* this is the case when we are already getting something from the */ /* device, so HCI level is flow controlled */ /* Also cannot send remote name request while paging, i.e. connection is not completed */ - if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) - { + if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) { BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback\n"); btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; if (p_cb->api.p_pin_callback) { (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, - (p_dev_rec->p_cur_service == NULL) ? FALSE - : (p_dev_rec->p_cur_service->security_flags - & BTM_SEC_IN_MIN_16_DIGIT_PIN)); + (p_dev_rec->p_cur_service == NULL) ? FALSE + : (p_dev_rec->p_cur_service->security_flags + & BTM_SEC_IN_MIN_16_DIGIT_PIN)); } - } - else - { + } else { BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name\n"); /* We received PIN code request for the device with unknown name */ @@ -5341,8 +4975,7 @@ void btm_sec_pin_code_request (UINT8 *p_bda) /* try to get name at first */ if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr, HCI_PAGE_SCAN_REP_MODE_R1, - HCI_MANDATARY_PAGE_SCAN_MODE, 0)) - { + HCI_MANDATARY_PAGE_SCAN_MODE, 0)) { p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; p_dev_rec->sec_bd_name[0] = 'f'; p_dev_rec->sec_bd_name[1] = '0'; @@ -5351,9 +4984,9 @@ void btm_sec_pin_code_request (UINT8 *p_bda) btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; if (p_cb->api.p_pin_callback) (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE - : (p_dev_rec->p_cur_service->security_flags - & BTM_SEC_IN_MIN_16_DIGIT_PIN)); + p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE + : (p_dev_rec->p_cur_service->security_flags + & BTM_SEC_IN_MIN_16_DIGIT_PIN)); } } } @@ -5375,13 +5008,15 @@ void btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) tBTM_SEC_DEV_REC *p_dev_rec; tBTM_INQ_INFO *p_inq_info; - if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) + if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) { return; + } p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; - if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) + if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) { return; + } p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; } @@ -5409,34 +5044,32 @@ void btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) { BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d\n", - p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); + p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); /* There is a chance that we are getting name. Wait until done. */ - if (p_dev_rec->sec_state != 0) - return(BTM_CMD_STARTED); + if (p_dev_rec->sec_state != 0) { + return (BTM_CMD_STARTED); + } /* If any security is required, get the name first */ if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) - && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) - { + && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { BTM_TRACE_EVENT ("Security Manager: Start get name\n"); - if (!btm_sec_start_get_name (p_dev_rec)) - { - return(BTM_NO_RESOURCES); + if (!btm_sec_start_get_name (p_dev_rec)) { + return (BTM_NO_RESOURCES); } - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /* If connection is not authenticated and authentication is required */ /* start authentication and return PENDING to the caller */ if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) - && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) - || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) - || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) - && (!p_dev_rec->is_originator + && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) + || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) + || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) + && (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) - && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) - { + && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { /* * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use, * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the @@ -5446,8 +5079,9 @@ static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) #if (L2CAP_UCD_INCLUDED == TRUE) /* if incoming UCD packet, discard it */ - if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) - return(BTM_FAILED_ON_SECURITY); + if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) { + return (BTM_FAILED_ON_SECURITY); + } #endif BTM_TRACE_EVENT ("Security Manager: Start authentication\n"); @@ -5468,42 +5102,39 @@ static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) && (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) { p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED - | BTM_SEC_AUTHENTICATED); + | BTM_SEC_AUTHENTICATED); } - if (!btm_sec_start_authentication (p_dev_rec)) - { - return(BTM_NO_RESOURCES); + if (!btm_sec_start_authentication (p_dev_rec)) { + return (BTM_NO_RESOURCES); } - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /* If connection is not encrypted and encryption is required */ /* start encryption and return PENDING to the caller */ if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) - && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) - || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) - && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) - { + && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) + || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) + && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) { #if (L2CAP_UCD_INCLUDED == TRUE) /* if incoming UCD packet, discard it */ - if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) - return(BTM_FAILED_ON_SECURITY); + if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) { + return (BTM_FAILED_ON_SECURITY); + } #endif BTM_TRACE_EVENT ("Security Manager: Start encryption\n"); - if (!btm_sec_start_encryption (p_dev_rec)) - { - return(BTM_NO_RESOURCES); + if (!btm_sec_start_encryption (p_dev_rec)) { + return (BTM_NO_RESOURCES); } - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - { - BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -", + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { + BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -" "security failure\n", __FUNCTION__, p_dev_rec->link_key_type); return (BTM_FAILED_ON_SECURITY); } @@ -5511,20 +5142,18 @@ static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) /* If connection is not authorized and authorization is required */ /* start authorization and return PENDING to the caller */ if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) - && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) - || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) - { + && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) + || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) { BTM_TRACE_EVENT ("service id:%d, is trusted:%d\n", - p_dev_rec->p_cur_service->service_id, - (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, - p_dev_rec->p_cur_service->service_id))); + p_dev_rec->p_cur_service->service_id, + (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, + p_dev_rec->p_cur_service->service_id))); if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) && - (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && - (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, - p_dev_rec->p_cur_service->service_id) == FALSE)) - { + (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && + (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, + p_dev_rec->p_cur_service->service_id) == FALSE)) { BTM_TRACE_EVENT ("Security Manager: Start authorization\n"); - return(btm_sec_start_authorization (p_dev_rec)); + return (btm_sec_start_authorization (p_dev_rec)); } } @@ -5538,7 +5167,7 @@ static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x\n", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); BTM_TRACE_EVENT ("Security Manager: access granted\n"); - return(BTM_SUCCESS); + return (BTM_SUCCESS); } @@ -5560,13 +5189,12 @@ static BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec) /* Device should be connected, no need to provide correct page params */ /* 0 and NULL are as timeout and callback params because they are not used in security get name case */ if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC, - 0, NULL)) != BTM_CMD_STARTED) - { + 0, NULL)) != BTM_CMD_STARTED) { p_dev_rec->sec_state = tempstate; - return(FALSE); + return (FALSE); } - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -5582,7 +5210,7 @@ static BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) { p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; - return(btsnd_hcic_auth_request (p_dev_rec->hci_handle)); + return (btsnd_hcic_auth_request (p_dev_rec->hci_handle)); } /******************************************************************************* @@ -5596,11 +5224,12 @@ static BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) *******************************************************************************/ static BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec) { - if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) - return(FALSE); + if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) { + return (FALSE); + } p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; - return(TRUE); + return (TRUE); } @@ -5620,57 +5249,55 @@ static UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) UINT8 service_id; if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) - || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) - { - if (!btm_cb.api.p_authorize_callback) - return(BTM_MODE_UNSUPPORTED); + || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) { + if (!btm_cb.api.p_authorize_callback) { + return (BTM_MODE_UNSUPPORTED); + } - if (p_dev_rec->p_cur_service) - { + if (p_dev_rec->p_cur_service) { #if BTM_SEC_SERVICE_NAME_LEN > 0 - if (p_dev_rec->is_originator) + if (p_dev_rec->is_originator) { p_service_name = p_dev_rec->p_cur_service->orig_service_name; - else + } else { p_service_name = p_dev_rec->p_cur_service->term_service_name; + } #endif service_id = p_dev_rec->p_cur_service->service_id; - } - else + } else { service_id = 0; + } /* Send authorization request if not already sent during this service connection */ if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID - || p_dev_rec->last_author_service_id != service_id) - { + || p_dev_rec->last_author_service_id != service_id) { p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr, - p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, - p_service_name, - service_id, - p_dev_rec->is_originator); + p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, + p_service_name, + service_id, + p_dev_rec->is_originator); } - else /* Already authorized once for this L2CAP bringup */ - { + else { /* Already authorized once for this L2CAP bringup */ BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)\n", service_id); return (BTM_SUCCESS); } - if (result == BTM_SUCCESS) - { + if (result == BTM_SUCCESS) { p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; /* Save the currently authorized service in case we are asked again by another multiplexer layer */ - if (!p_dev_rec->is_originator) + if (!p_dev_rec->is_originator) { p_dev_rec->last_author_service_id = service_id; + } p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; } - return(result); + return (result); } btm_sec_start_get_name (p_dev_rec); - return(BTM_CMD_STARTED); + return (BTM_CMD_STARTED); } /******************************************************************************* @@ -5685,13 +5312,13 @@ static UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) BOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]) { UINT32 trusted_inx; - for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) - { - if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) - return(FALSE); + for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) { + if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) { + return (FALSE); + } } - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -5712,28 +5339,28 @@ static tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UI #if (L2CAP_UCD_INCLUDED == TRUE) - if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) + if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) { is_originator = TRUE; - else + } else { is_originator = FALSE; + } #else is_originator = conn_type; #endif - if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) - { + if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) { /* If this is outgoing connection and the PSM matches p_out_serv, * use it as the current service */ return btm_cb.p_out_serv; } /* otherwise, just find the first record with the specified PSM */ - for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) - { - if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) - return(p_serv_rec); + for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { + if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) { + return (p_serv_rec); + } } - return(NULL); + return (NULL); } @@ -5752,18 +5379,15 @@ static tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; int i; - for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) - { + for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) - && (p_serv_rec->psm == p_cur->psm) ) - { - if (p_cur != p_serv_rec) - { - return(p_serv_rec); + && (p_serv_rec->psm == p_cur->psm) ) { + if (p_cur != p_serv_rec) { + return (p_serv_rec); } } } - return(NULL); + return (NULL); } @@ -5778,7 +5402,7 @@ static tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) ** *******************************************************************************/ static tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, - UINT32 mx_proto_id, UINT32 mx_chan_id) + UINT32 mx_proto_id, UINT32 mx_chan_id) { tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv; tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; @@ -5786,27 +5410,24 @@ static tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, BTM_TRACE_DEBUG ("%s()\n", __func__); if (is_originator && p_out_serv && p_out_serv->psm == psm - && p_out_serv->mx_proto_id == mx_proto_id - && p_out_serv->orig_mx_chan_id == mx_chan_id) - { + && p_out_serv->mx_proto_id == mx_proto_id + && p_out_serv->orig_mx_chan_id == mx_chan_id) { /* If this is outgoing connection and the parameters match p_out_serv, * use it as the current service */ return btm_cb.p_out_serv; } /* otherwise, the old way */ - for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) - { + for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) { if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) - && (p_serv_rec->psm == psm) - && (p_serv_rec->mx_proto_id == mx_proto_id) - && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) - || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) - { - return(p_serv_rec); + && (p_serv_rec->psm == psm) + && (p_serv_rec->mx_proto_id == mx_proto_id) + && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) + || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) { + return (p_serv_rec); } } - return(NULL); + return (NULL); } @@ -5830,8 +5451,7 @@ static void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle) tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec); /* If result is pending reply from the user or from the device is pending */ - if (status != BTM_CMD_STARTED) - { + if (status != BTM_CMD_STARTED) { /* There is no next procedure or start of procedure failed, notify the waiting layer */ btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE); } @@ -5866,11 +5486,12 @@ static void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec) ** otherwise, the trusted mask ** *******************************************************************************/ -UINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) +UINT32 *BTM_ReadTrustedMask (BD_ADDR bd_addr) { tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); - if (p_dev_rec != NULL) - return(p_dev_rec->trusted_mask); + if (p_dev_rec != NULL) { + return (p_dev_rec->trusted_mask); + } return NULL; } @@ -5887,15 +5508,13 @@ UINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) *******************************************************************************/ static void btm_restore_mode(void) { - if (btm_cb.security_mode_changed) - { + if (btm_cb.security_mode_changed) { btm_cb.security_mode_changed = FALSE; BTM_TRACE_DEBUG("%s() Auth enable -> %d\n", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK)); btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); } - if (btm_cb.pin_type_changed) - { + if (btm_cb.pin_type_changed) { btm_cb.pin_type_changed = FALSE; btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type); } @@ -5916,13 +5535,13 @@ tBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state) { tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; - for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { + for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) - && (p_dev_rec->sec_state == state)) - return(p_dev_rec); + && (p_dev_rec->sec_state == state)) { + return (p_dev_rec); + } } - return(NULL); + return (NULL); } /******************************************************************************* @@ -5938,12 +5557,11 @@ static void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) BTM_TRACE_EVENT ("%s() Old: %s\n", __func__, btm_pair_state_descr(btm_cb.pairing_state)); BTM_TRACE_EVENT ("%s() New: %s pairing_flags:0x%x\n\n", __func__, - btm_pair_state_descr(new_state), btm_cb.pairing_flags); + btm_pair_state_descr(new_state), btm_cb.pairing_flags); btm_cb.pairing_state = new_state; - if (new_state == BTM_PAIR_STATE_IDLE) - { + if (new_state == BTM_PAIR_STATE_IDLE) { btu_stop_timer (&btm_cb.pairing_tle); btm_cb.pairing_flags = 0; @@ -5957,12 +5575,11 @@ static void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) btm_inq_clear_ssp(); memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN); - } - else - { + } else { /* If transitionng out of idle, mark the lcb as bonding */ - if (old_state == BTM_PAIR_STATE_IDLE) + if (old_state == BTM_PAIR_STATE_IDLE) { l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE); + } btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout; @@ -5982,26 +5599,25 @@ static void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) static char *btm_pair_state_descr (tBTM_PAIRING_STATE state) { #if (BT_TRACE_VERBOSE == TRUE) - switch (state) - { - case BTM_PAIR_STATE_IDLE: return("IDLE"); - case BTM_PAIR_STATE_GET_REM_NAME: return("GET_REM_NAME"); - case BTM_PAIR_STATE_WAIT_PIN_REQ: return("WAIT_PIN_REQ"); - case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return("WAIT_LOCAL_PIN"); - case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return("WAIT_NUM_CONFIRM"); - case BTM_PAIR_STATE_KEY_ENTRY: return("KEY_ENTRY"); - case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return("WAIT_LOCAL_OOB_RSP"); - case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return("WAIT_LOCAL_IOCAPS"); - case BTM_PAIR_STATE_INCOMING_SSP: return("INCOMING_SSP"); - case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return("WAIT_AUTH_COMPLETE"); - case BTM_PAIR_STATE_WAIT_DISCONNECT: return("WAIT_DISCONNECT"); + switch (state) { + case BTM_PAIR_STATE_IDLE: return ("IDLE"); + case BTM_PAIR_STATE_GET_REM_NAME: return ("GET_REM_NAME"); + case BTM_PAIR_STATE_WAIT_PIN_REQ: return ("WAIT_PIN_REQ"); + case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return ("WAIT_LOCAL_PIN"); + case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return ("WAIT_NUM_CONFIRM"); + case BTM_PAIR_STATE_KEY_ENTRY: return ("KEY_ENTRY"); + case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return ("WAIT_LOCAL_OOB_RSP"); + case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return ("WAIT_LOCAL_IOCAPS"); + case BTM_PAIR_STATE_INCOMING_SSP: return ("INCOMING_SSP"); + case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return ("WAIT_AUTH_COMPLETE"); + case BTM_PAIR_STATE_WAIT_DISCONNECT: return ("WAIT_DISCONNECT"); } - return("???"); + return ("???"); #else - sprintf(btm_cb.state_temp_buffer,"%d",state); + sprintf(btm_cb.state_temp_buffer, "%d", state); - return(btm_cb.state_temp_buffer); + return (btm_cb.state_temp_buffer); #endif } #endif @@ -6020,16 +5636,15 @@ void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEA { tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback; - if (p_dev_rec->p_callback) - { + if (p_dev_rec->p_callback) { p_dev_rec->p_callback = NULL; #if BLE_INCLUDED == TRUE - if (is_le_transport) - (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res); - else + if (is_le_transport) { + (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res); + } else #endif - (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res); + (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res); } btm_sec_check_pending_reqs(); @@ -6043,13 +5658,12 @@ void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEA ** *******************************************************************************/ static BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, - UINT32 mx_proto_id, UINT32 mx_chan_id, - tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) + UINT32 mx_proto_id, UINT32 mx_chan_id, + tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) { tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY)); - if (p_e) - { + if (p_e) { p_e->psm = psm; p_e->is_orig = is_orig; p_e->p_callback = p_callback; @@ -6061,14 +5675,14 @@ static BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN); BTM_TRACE_EVENT ("%s() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u\n", - __func__, psm, is_orig, mx_proto_id, mx_chan_id); + __func__, psm, is_orig, mx_proto_id, mx_chan_id); GKI_enqueue (&btm_cb.sec_pending_q, p_e); - return(TRUE); + return (TRUE); } - return(FALSE); + return (FALSE); } static BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) @@ -6078,41 +5692,34 @@ static BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) BOOLEAN rv = FALSE; if ((major == BTM_COD_MAJOR_AUDIO) - && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) - { + && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) { BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x\n", - __func__, major, minor); + __func__, major, minor); - if (btm_cb.security_mode_changed == FALSE) - { + if (btm_cb.security_mode_changed == FALSE) { btm_cb.security_mode_changed = TRUE; #ifdef APPL_AUTH_WRITE_EXCEPTION - if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) + if (!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) #endif btsnd_hcic_write_auth_enable (TRUE); } - } - else - { + } else { btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* If we got a PIN, use that, else try to get one */ - if (btm_cb.pin_code_len) - { + if (btm_cb.pin_code_len) { BTM_PINCodeReply (p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len, btm_cb.pin_code, p_dev_rec->trusted_mask); - } - else - { + } else { /* pin was not supplied - pre-fetch pin code now */ - if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) - { + if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) { BTM_TRACE_DEBUG("%s() PIN code callback called\n", __func__); - if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) - btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; + if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) { + btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; + } (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, - p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE - : (p_dev_rec->p_cur_service->security_flags - & BTM_SEC_IN_MIN_16_DIGIT_PIN)); + p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE + : (p_dev_rec->p_cur_service->security_flags + & BTM_SEC_IN_MIN_16_DIGIT_PIN)); } } @@ -6153,13 +5760,12 @@ void btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len) ** *******************************************************************************/ static BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, - tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) + tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) { tBTM_SEC_QUEUE_ENTRY *p_e; p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1); - if (p_e) - { + if (p_e) { p_e->psm = 0; /* if PSM 0, encryption request */ p_e->p_callback = p_callback; p_e->p_ref_data = (void *)(p_e + 1); @@ -6189,16 +5795,13 @@ void btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec) UINT8 *p_rem_bd_addr; if ((btm_cb.security_mode == BTM_SEC_MODE_SP || - btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || - btm_cb.security_mode == BTM_SEC_MODE_SC) && - HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])) - { + btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || + btm_cb.security_mode == BTM_SEC_MODE_SC) && + HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])) { p_dev_rec->sm4 = BTM_SM4_TRUE; p_dev_rec->remote_supports_secure_connections = (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])); - } - else - { + } else { p_dev_rec->sm4 = BTM_SM4_KNOWN; p_dev_rec->remote_supports_secure_connections = FALSE; } @@ -6207,13 +5810,12 @@ void btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec) p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections); - if (p_dev_rec->remote_features_needed) - { + if (p_dev_rec->remote_features_needed) { BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!\n", __FUNCTION__); - p_rem_bd_addr = (UINT8*) rem_bd_addr; + p_rem_bd_addr = (UINT8 *) rem_bd_addr; BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr); - p_rem_bd_addr = (UINT8*) rem_bd_addr; + p_rem_bd_addr = (UINT8 *) rem_bd_addr; btm_io_capabilities_req(p_rem_bd_addr); p_dev_rec->remote_features_needed = FALSE; } @@ -6236,14 +5838,12 @@ static void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT t p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq); - if (p_e != NULL) - { + if (p_e != NULL) { if (memcmp(p_e->bd_addr, remote_bda, BD_ADDR_LEN) == 0 #if BLE_INCLUDED == TRUE - && p_e->transport == transport + && p_e->transport == transport #endif - ) - { + ) { (*p_e->p_callback) (remote_bda, transport, p_e->p_ref_data, BTM_ERR_PROCESSING); GKI_remove_from_queue(bq, (void *)p_e); } @@ -6263,8 +5863,7 @@ static void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT t *******************************************************************************/ static BOOLEAN btm_sec_is_serv_level0(UINT16 psm) { - if (psm == BT_PSM_SDP) - { + if (psm == BT_PSM_SDP) { BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service\n", __FUNCTION__, psm); return TRUE; } @@ -6282,7 +5881,7 @@ static BOOLEAN btm_sec_is_serv_level0(UINT16 psm) ** *******************************************************************************/ static void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, - UINT8 encr_enable) + UINT8 encr_enable) { tBTM_SEC_QUEUE_ENTRY *p_e; BUFFER_Q *bq = &btm_cb.sec_pending_q; @@ -6290,26 +5889,23 @@ static void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRA p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq); - while (p_e != NULL) - { + while (p_e != NULL) { if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0 #if BLE_INCLUDED == TRUE - && p_e->transport == transport + && p_e->transport == transport #endif - ) - { + ) { #if BLE_INCLUDED == TRUE UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data); #endif if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR #if BLE_INCLUDED == TRUE - || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) - || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags - & BTM_SEC_LE_AUTHENTICATED) + || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) + || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags + & BTM_SEC_LE_AUTHENTICATED) #endif - ) - { + ) { (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res); GKI_remove_from_queue(bq, (void *)p_e); } @@ -6372,21 +5968,20 @@ void btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec) BOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) { - tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); - BOOLEAN is_bonded= FALSE; + tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); + BOOLEAN is_bonded = FALSE; if (p_dev_rec && #if (SMP_INCLUDED == TRUE) - ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))|| + ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN)) || #else - ( + ( #endif - (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) - { + (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) { is_bonded = TRUE; } BTM_TRACE_DEBUG ("%s() is_bonded=%d\n", __func__, is_bonded); - return(is_bonded); + return (is_bonded); } /******************************************************************************* @@ -6400,12 +5995,13 @@ BOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) *******************************************************************************/ BOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) { - tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); + tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); BOOLEAN le_capable = FALSE; #if (BLE_INCLUDED== TRUE) - if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) + if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) { le_capable = TRUE; + } #endif return le_capable; } @@ -6421,22 +6017,19 @@ BOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) *******************************************************************************/ BOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec) { - BOOLEAN found= FALSE; + BOOLEAN found = FALSE; #if (SMP_INCLUDED== TRUE) tBTM_SEC_DEV_REC *p_dev_rec; int i; - if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS) - { + if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS) { BTM_TRACE_DEBUG ("LE bonded device not found\n"); return found; } p_dev_rec = &btm_cb.sec_dev_rec[start_idx]; - for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) - { - if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) - { + for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) { + if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) { *p_found_idx = i; *p_rec = p_dev_rec; break; @@ -6444,7 +6037,7 @@ BOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_D } BTM_TRACE_DEBUG ("%s() found=%d\n", __func__, found); #endif - return(found); + return (found); } /******************************************************************************* @@ -6467,17 +6060,20 @@ static BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec) UINT8 chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE]; BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x\n", __func__, - p_dev_rec->link_key_type); + p_dev_rec->link_key_type); if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) && - (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) - return FALSE; - - if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask)) + (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) { return FALSE; + } - if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) + if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask)) { return FALSE; + } + + if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) { + return FALSE; + } return TRUE; } @@ -6494,7 +6090,7 @@ static BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec) *******************************************************************************/ static BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec) { - tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); + tACL_CONN *p = btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); return (p && (p->link_role == BTM_ROLE_MASTER)); } diff --git a/components/bt/bluedroid/stack/btu/btu_hcif.c b/components/bt/bluedroid/stack/btu/btu_hcif.c old mode 100755 new mode 100644 index ccbc90a9d..a3a4d9154 --- a/components/bt/bluedroid/stack/btu/btu_hcif.c +++ b/components/bt/bluedroid/stack/btu/btu_hcif.c @@ -150,199 +150,197 @@ void btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg) STREAM_TO_UINT8 (hci_evt_code, p); STREAM_TO_UINT8 (hci_evt_len, p); - switch (hci_evt_code) - { - case HCI_INQUIRY_COMP_EVT: - btu_hcif_inquiry_comp_evt (p); - break; - case HCI_INQUIRY_RESULT_EVT: - btu_hcif_inquiry_result_evt (p); - break; - case HCI_INQUIRY_RSSI_RESULT_EVT: - btu_hcif_inquiry_rssi_result_evt (p); - break; - case HCI_EXTENDED_INQUIRY_RESULT_EVT: - btu_hcif_extended_inquiry_result_evt (p); - break; - case HCI_CONNECTION_COMP_EVT: - btu_hcif_connection_comp_evt (p); - break; - case HCI_CONNECTION_REQUEST_EVT: - btu_hcif_connection_request_evt (p); - break; - case HCI_DISCONNECTION_COMP_EVT: - btu_hcif_disconnection_comp_evt (p); - break; - case HCI_AUTHENTICATION_COMP_EVT: - btu_hcif_authentication_comp_evt (p); - break; - case HCI_RMT_NAME_REQUEST_COMP_EVT: - btu_hcif_rmt_name_request_comp_evt (p, hci_evt_len); - break; - case HCI_ENCRYPTION_CHANGE_EVT: - btu_hcif_encryption_change_evt (p); - break; + switch (hci_evt_code) { + case HCI_INQUIRY_COMP_EVT: + btu_hcif_inquiry_comp_evt (p); + break; + case HCI_INQUIRY_RESULT_EVT: + btu_hcif_inquiry_result_evt (p); + break; + case HCI_INQUIRY_RSSI_RESULT_EVT: + btu_hcif_inquiry_rssi_result_evt (p); + break; + case HCI_EXTENDED_INQUIRY_RESULT_EVT: + btu_hcif_extended_inquiry_result_evt (p); + break; + case HCI_CONNECTION_COMP_EVT: + btu_hcif_connection_comp_evt (p); + break; + case HCI_CONNECTION_REQUEST_EVT: + btu_hcif_connection_request_evt (p); + break; + case HCI_DISCONNECTION_COMP_EVT: + btu_hcif_disconnection_comp_evt (p); + break; + case HCI_AUTHENTICATION_COMP_EVT: + btu_hcif_authentication_comp_evt (p); + break; + case HCI_RMT_NAME_REQUEST_COMP_EVT: + btu_hcif_rmt_name_request_comp_evt (p, hci_evt_len); + break; + case HCI_ENCRYPTION_CHANGE_EVT: + btu_hcif_encryption_change_evt (p); + break; #if BLE_INCLUDED == TRUE - case HCI_ENCRYPTION_KEY_REFRESH_COMP_EVT: - btu_hcif_encryption_key_refresh_cmpl_evt(p); - break; + case HCI_ENCRYPTION_KEY_REFRESH_COMP_EVT: + btu_hcif_encryption_key_refresh_cmpl_evt(p); + break; #endif - case HCI_READ_RMT_FEATURES_COMP_EVT: - btu_hcif_read_rmt_features_comp_evt (p); - break; - case HCI_READ_RMT_EXT_FEATURES_COMP_EVT: - btu_hcif_read_rmt_ext_features_comp_evt (p); - break; - case HCI_READ_RMT_VERSION_COMP_EVT: - btu_hcif_read_rmt_version_comp_evt (p); - break; - case HCI_QOS_SETUP_COMP_EVT: - btu_hcif_qos_setup_comp_evt (p); - break; - case HCI_COMMAND_COMPLETE_EVT: - //HCI_TRACE_ERROR("%s should not have received a command complete event. " - // "Someone didn't go through the hci transmit_command function.", __func__); - break; - case HCI_COMMAND_STATUS_EVT: - //HCI_TRACE_ERROR("%s should not have received a command status event. " - // "Someone didn't go through the hci transmit_command function.", __func__); - break; - case HCI_HARDWARE_ERROR_EVT: - btu_hcif_hardware_error_evt (p); - break; - case HCI_FLUSH_OCCURED_EVT: - btu_hcif_flush_occured_evt (); - break; - case HCI_ROLE_CHANGE_EVT: - btu_hcif_role_change_evt (p); - break; - case HCI_NUM_COMPL_DATA_PKTS_EVT: - btu_hcif_num_compl_data_pkts_evt (p); - break; - case HCI_MODE_CHANGE_EVT: - btu_hcif_mode_change_evt (p); - break; - case HCI_PIN_CODE_REQUEST_EVT: - btu_hcif_pin_code_request_evt (p); - break; - case HCI_LINK_KEY_REQUEST_EVT: - btu_hcif_link_key_request_evt (p); - break; - case HCI_LINK_KEY_NOTIFICATION_EVT: - btu_hcif_link_key_notification_evt (p); - break; - case HCI_LOOPBACK_COMMAND_EVT: - btu_hcif_loopback_command_evt (); - break; - case HCI_DATA_BUF_OVERFLOW_EVT: - btu_hcif_data_buf_overflow_evt (); - break; - case HCI_MAX_SLOTS_CHANGED_EVT: - btu_hcif_max_slots_changed_evt (); - break; - case HCI_READ_CLOCK_OFF_COMP_EVT: - btu_hcif_read_clock_off_comp_evt (p); - break; - case HCI_CONN_PKT_TYPE_CHANGE_EVT: - btu_hcif_conn_pkt_type_change_evt (); - break; - case HCI_QOS_VIOLATION_EVT: - btu_hcif_qos_violation_evt (p); - break; - case HCI_PAGE_SCAN_MODE_CHANGE_EVT: - btu_hcif_page_scan_mode_change_evt (); - break; - case HCI_PAGE_SCAN_REP_MODE_CHNG_EVT: - btu_hcif_page_scan_rep_mode_chng_evt (); - break; - case HCI_ESCO_CONNECTION_COMP_EVT: - btu_hcif_esco_connection_comp_evt (p); - break; - case HCI_ESCO_CONNECTION_CHANGED_EVT: - btu_hcif_esco_connection_chg_evt (p); - break; + case HCI_READ_RMT_FEATURES_COMP_EVT: + btu_hcif_read_rmt_features_comp_evt (p); + break; + case HCI_READ_RMT_EXT_FEATURES_COMP_EVT: + btu_hcif_read_rmt_ext_features_comp_evt (p); + break; + case HCI_READ_RMT_VERSION_COMP_EVT: + btu_hcif_read_rmt_version_comp_evt (p); + break; + case HCI_QOS_SETUP_COMP_EVT: + btu_hcif_qos_setup_comp_evt (p); + break; + case HCI_COMMAND_COMPLETE_EVT: + //HCI_TRACE_ERROR("%s should not have received a command complete event. " + // "Someone didn't go through the hci transmit_command function.", __func__); + break; + case HCI_COMMAND_STATUS_EVT: + //HCI_TRACE_ERROR("%s should not have received a command status event. " + // "Someone didn't go through the hci transmit_command function.", __func__); + break; + case HCI_HARDWARE_ERROR_EVT: + btu_hcif_hardware_error_evt (p); + break; + case HCI_FLUSH_OCCURED_EVT: + btu_hcif_flush_occured_evt (); + break; + case HCI_ROLE_CHANGE_EVT: + btu_hcif_role_change_evt (p); + break; + case HCI_NUM_COMPL_DATA_PKTS_EVT: + btu_hcif_num_compl_data_pkts_evt (p); + break; + case HCI_MODE_CHANGE_EVT: + btu_hcif_mode_change_evt (p); + break; + case HCI_PIN_CODE_REQUEST_EVT: + btu_hcif_pin_code_request_evt (p); + break; + case HCI_LINK_KEY_REQUEST_EVT: + btu_hcif_link_key_request_evt (p); + break; + case HCI_LINK_KEY_NOTIFICATION_EVT: + btu_hcif_link_key_notification_evt (p); + break; + case HCI_LOOPBACK_COMMAND_EVT: + btu_hcif_loopback_command_evt (); + break; + case HCI_DATA_BUF_OVERFLOW_EVT: + btu_hcif_data_buf_overflow_evt (); + break; + case HCI_MAX_SLOTS_CHANGED_EVT: + btu_hcif_max_slots_changed_evt (); + break; + case HCI_READ_CLOCK_OFF_COMP_EVT: + btu_hcif_read_clock_off_comp_evt (p); + break; + case HCI_CONN_PKT_TYPE_CHANGE_EVT: + btu_hcif_conn_pkt_type_change_evt (); + break; + case HCI_QOS_VIOLATION_EVT: + btu_hcif_qos_violation_evt (p); + break; + case HCI_PAGE_SCAN_MODE_CHANGE_EVT: + btu_hcif_page_scan_mode_change_evt (); + break; + case HCI_PAGE_SCAN_REP_MODE_CHNG_EVT: + btu_hcif_page_scan_rep_mode_chng_evt (); + break; + case HCI_ESCO_CONNECTION_COMP_EVT: + btu_hcif_esco_connection_comp_evt (p); + break; + case HCI_ESCO_CONNECTION_CHANGED_EVT: + btu_hcif_esco_connection_chg_evt (p); + break; #if (BTM_SSR_INCLUDED == TRUE) - case HCI_SNIFF_SUB_RATE_EVT: - btu_hcif_ssr_evt (p, hci_evt_len); - break; + case HCI_SNIFF_SUB_RATE_EVT: + btu_hcif_ssr_evt (p, hci_evt_len); + break; #endif /* BTM_SSR_INCLUDED == TRUE */ - case HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT: - btu_hcif_host_support_evt (p); - break; - case HCI_IO_CAPABILITY_REQUEST_EVT: - btu_hcif_io_cap_request_evt (p); - break; - case HCI_IO_CAPABILITY_RESPONSE_EVT: - btu_hcif_io_cap_response_evt (p); - break; - case HCI_USER_CONFIRMATION_REQUEST_EVT: - btu_hcif_user_conf_request_evt (p); - break; - case HCI_USER_PASSKEY_REQUEST_EVT: - btu_hcif_user_passkey_request_evt (p); - break; + case HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT: + btu_hcif_host_support_evt (p); + break; + case HCI_IO_CAPABILITY_REQUEST_EVT: + btu_hcif_io_cap_request_evt (p); + break; + case HCI_IO_CAPABILITY_RESPONSE_EVT: + btu_hcif_io_cap_response_evt (p); + break; + case HCI_USER_CONFIRMATION_REQUEST_EVT: + btu_hcif_user_conf_request_evt (p); + break; + case HCI_USER_PASSKEY_REQUEST_EVT: + btu_hcif_user_passkey_request_evt (p); + break; #if BTM_OOB_INCLUDED == TRUE - case HCI_REMOTE_OOB_DATA_REQUEST_EVT: - btu_hcif_rem_oob_request_evt (p); - break; + case HCI_REMOTE_OOB_DATA_REQUEST_EVT: + btu_hcif_rem_oob_request_evt (p); + break; #endif - case HCI_SIMPLE_PAIRING_COMPLETE_EVT: - btu_hcif_simple_pair_complete_evt (p); - break; - case HCI_USER_PASSKEY_NOTIFY_EVT: - btu_hcif_user_passkey_notif_evt (p); - break; - case HCI_KEYPRESS_NOTIFY_EVT: - btu_hcif_keypress_notif_evt (p); - break; + case HCI_SIMPLE_PAIRING_COMPLETE_EVT: + btu_hcif_simple_pair_complete_evt (p); + break; + case HCI_USER_PASSKEY_NOTIFY_EVT: + btu_hcif_user_passkey_notif_evt (p); + break; + case HCI_KEYPRESS_NOTIFY_EVT: + btu_hcif_keypress_notif_evt (p); + break; #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE - case HCI_ENHANCED_FLUSH_COMPLETE_EVT: - btu_hcif_enhanced_flush_complete_evt (); - break; + case HCI_ENHANCED_FLUSH_COMPLETE_EVT: + btu_hcif_enhanced_flush_complete_evt (); + break; #endif #if (BLE_INCLUDED == TRUE) - case HCI_BLE_EVENT: - STREAM_TO_UINT8 (ble_sub_code, p); + case HCI_BLE_EVENT: + STREAM_TO_UINT8 (ble_sub_code, p); - HCI_TRACE_DEBUG("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code, ble_sub_code); + HCI_TRACE_DEBUG("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code, ble_sub_code); - switch (ble_sub_code) - { - case HCI_BLE_ADV_PKT_RPT_EVT: /* result of inquiry */ - btu_ble_process_adv_pkt(p); - break; - case HCI_BLE_CONN_COMPLETE_EVT: - btu_ble_ll_conn_complete_evt(p, hci_evt_len); - break; - case HCI_BLE_LL_CONN_PARAM_UPD_EVT: - btu_ble_ll_conn_param_upd_evt(p, hci_evt_len); - break; - case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT: - btu_ble_read_remote_feat_evt(p); - break; - case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */ - btu_ble_proc_ltk_req(p); - break; + switch (ble_sub_code) { + case HCI_BLE_ADV_PKT_RPT_EVT: /* result of inquiry */ + btu_ble_process_adv_pkt(p); + break; + case HCI_BLE_CONN_COMPLETE_EVT: + btu_ble_ll_conn_complete_evt(p, hci_evt_len); + break; + case HCI_BLE_LL_CONN_PARAM_UPD_EVT: + btu_ble_ll_conn_param_upd_evt(p, hci_evt_len); + break; + case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT: + btu_ble_read_remote_feat_evt(p); + break; + case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */ + btu_ble_proc_ltk_req(p); + break; #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - case HCI_BLE_ENHANCED_CONN_COMPLETE_EVT: - btu_ble_proc_enhanced_conn_cmpl(p, hci_evt_len); - break; + case HCI_BLE_ENHANCED_CONN_COMPLETE_EVT: + btu_ble_proc_enhanced_conn_cmpl(p, hci_evt_len); + break; #endif #if (BLE_LLT_INCLUDED == TRUE) - case HCI_BLE_RC_PARAM_REQ_EVT: - btu_ble_rc_param_req_evt(p); - break; + case HCI_BLE_RC_PARAM_REQ_EVT: + btu_ble_rc_param_req_evt(p); + break; #endif - case HCI_BLE_DATA_LENGTH_CHANGE_EVT: - btu_ble_data_length_change_evt(p, hci_evt_len); - break; - } + case HCI_BLE_DATA_LENGTH_CHANGE_EVT: + btu_ble_data_length_change_evt(p, hci_evt_len); break; + } + break; #endif /* BLE_INCLUDED */ - case HCI_VENDOR_SPECIFIC_EVT: - btm_vendor_specific_evt (p, hci_evt_len); - break; + case HCI_VENDOR_SPECIFIC_EVT: + btm_vendor_specific_evt (p, hci_evt_len); + break; } } @@ -358,12 +356,13 @@ void btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg) *******************************************************************************/ void btu_hcif_send_cmd (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_buf) { - if (!p_buf) - return; + if (!p_buf) { + return; + } uint16_t opcode; uint8_t *stream = p_buf->data + p_buf->offset; - void * vsc_callback = NULL; + void *vsc_callback = NULL; STREAM_TO_UINT16(opcode, stream); @@ -371,18 +370,18 @@ void btu_hcif_send_cmd (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_buf) /* If command was a VSC, then extract command_complete callback */ if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC #if BLE_INCLUDED == TRUE - || (opcode == HCI_BLE_RAND) - || (opcode == HCI_BLE_ENCRYPT) + || (opcode == HCI_BLE_RAND) + || (opcode == HCI_BLE_ENCRYPT) #endif ) { vsc_callback = *((void **)(p_buf + 1)); } hci_layer_get_interface()->transmit_command( - p_buf, - btu_hcif_command_complete_evt, - btu_hcif_command_status_evt, - vsc_callback); + p_buf, + btu_hcif_command_complete_evt, + btu_hcif_command_status_evt, + vsc_callback); #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) btu_check_bt_sleep (); @@ -413,8 +412,7 @@ void btu_hcif_send_host_rdy_for_data(void) /* Get the SCO numbers */ /* No SCO for now ?? */ - if (num_ents) - { + if (num_ents) { btsnd_hcic_host_num_xmitted_pkts (num_ents, handles, num_pkts); } } @@ -512,15 +510,13 @@ static void btu_hcif_connection_comp_evt (UINT8 *p) handle = HCID_GET_HANDLE (handle); - if (link_type == HCI_LINK_TYPE_ACL) - { + if (link_type == HCI_LINK_TYPE_ACL) { btm_sec_connected (bda, handle, status, enc_mode); l2c_link_hci_conn_comp (status, handle, bda); } #if BTM_SCO_INCLUDED == TRUE - else - { + else { memset(&esco_data, 0, sizeof(tBTM_ESCO_DATA)); /* esco_data.link_type = HCI_LINK_TYPE_SCO; already zero */ memcpy (esco_data.bd_addr, bda, BD_ADDR_LEN); @@ -551,13 +547,11 @@ static void btu_hcif_connection_request_evt (UINT8 *p) /* Pass request to security manager to check connect filters before */ /* passing request to l2cap */ - if (link_type == HCI_LINK_TYPE_ACL) - { + if (link_type == HCI_LINK_TYPE_ACL) { btm_sec_conn_req (bda, dc); } #if BTM_SCO_INCLUDED == TRUE - else - { + else { btm_sco_conn_req (bda, dc, link_type); } #endif /* BTM_SCO_INCLUDED */ @@ -586,8 +580,9 @@ static void btu_hcif_disconnection_comp_evt (UINT8 *p) #if BTM_SCO_INCLUDED == TRUE /* If L2CAP doesn't know about it, send it to SCO */ - if (!l2c_link_hci_disc_comp (handle, reason)) + if (!l2c_link_hci_disc_comp (handle, reason)) { btm_sco_removed (handle, reason); + } #else l2c_link_hci_disc_comp (handle, reason); #endif /* BTM_SCO_INCLUDED */ @@ -696,10 +691,9 @@ static void btu_hcif_read_rmt_ext_features_comp_evt (UINT8 *p) STREAM_TO_UINT8 (status, p_cur); - if (status == HCI_SUCCESS) + if (status == HCI_SUCCESS) { btm_read_remote_ext_features_complete(p); - else - { + } else { STREAM_TO_UINT16 (handle, p_cur); btm_read_remote_ext_features_failed(status, handle); } @@ -824,118 +818,118 @@ static void btu_hcif_esco_connection_chg_evt (UINT8 *p) ** *******************************************************************************/ static void btu_hcif_hdl_command_complete (UINT16 opcode, UINT8 *p, UINT16 evt_len, - void *p_cplt_cback) + void *p_cplt_cback) { - switch (opcode) - { - case HCI_INQUIRY_CANCEL: - /* Tell inquiry processing that we are done */ - btm_process_cancel_complete(HCI_SUCCESS, BTM_BR_INQUIRY_MASK); - break; - case HCI_SET_EVENT_FILTER: - btm_event_filter_complete (p); - break; + switch (opcode) { + case HCI_INQUIRY_CANCEL: + /* Tell inquiry processing that we are done */ + btm_process_cancel_complete(HCI_SUCCESS, BTM_BR_INQUIRY_MASK); + break; + case HCI_SET_EVENT_FILTER: + btm_event_filter_complete (p); + break; - case HCI_DELETE_STORED_LINK_KEY: - btm_delete_stored_link_key_complete (p); - break; + case HCI_DELETE_STORED_LINK_KEY: + btm_delete_stored_link_key_complete (p); + break; - case HCI_READ_LOCAL_NAME: - btm_read_local_name_complete (p, evt_len); - break; + case HCI_READ_LOCAL_NAME: + btm_read_local_name_complete (p, evt_len); + break; - case HCI_GET_LINK_QUALITY: - btm_read_link_quality_complete (p); - break; + case HCI_GET_LINK_QUALITY: + btm_read_link_quality_complete (p); + break; - case HCI_READ_RSSI: - btm_read_rssi_complete (p); - break; + case HCI_READ_RSSI: + btm_read_rssi_complete (p); + break; - case HCI_READ_TRANSMIT_POWER_LEVEL: - btm_read_tx_power_complete(p, FALSE); - break; + case HCI_READ_TRANSMIT_POWER_LEVEL: + btm_read_tx_power_complete(p, FALSE); + break; - case HCI_CREATE_CONNECTION_CANCEL: - btm_create_conn_cancel_complete(p); - break; + case HCI_CREATE_CONNECTION_CANCEL: + btm_create_conn_cancel_complete(p); + break; - case HCI_READ_LOCAL_OOB_DATA: + case HCI_READ_LOCAL_OOB_DATA: #if BTM_OOB_INCLUDED == TRUE - btm_read_local_oob_complete(p); + btm_read_local_oob_complete(p); #endif - break; + break; - case HCI_READ_INQ_TX_POWER_LEVEL: - btm_read_linq_tx_power_complete (p); - break; + case HCI_READ_INQ_TX_POWER_LEVEL: + btm_read_linq_tx_power_complete (p); + break; #if (BLE_INCLUDED == TRUE) -/* BLE Commands sComplete*/ - case HCI_BLE_ADD_WHITE_LIST: - btm_ble_add_2_white_list_complete(*p); - break; + /* BLE Commands sComplete*/ + case HCI_BLE_ADD_WHITE_LIST: + btm_ble_add_2_white_list_complete(*p); + break; - case HCI_BLE_CLEAR_WHITE_LIST: - btm_ble_clear_white_list_complete(p, evt_len); - break; + case HCI_BLE_CLEAR_WHITE_LIST: + btm_ble_clear_white_list_complete(p, evt_len); + break; - case HCI_BLE_REMOVE_WHITE_LIST: - btm_ble_remove_from_white_list_complete(p, evt_len); - break; + case HCI_BLE_REMOVE_WHITE_LIST: + btm_ble_remove_from_white_list_complete(p, evt_len); + break; - case HCI_BLE_RAND: - case HCI_BLE_ENCRYPT: - btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback); - break; + case HCI_BLE_RAND: + case HCI_BLE_ENCRYPT: + btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback); + break; - case HCI_BLE_READ_ADV_CHNL_TX_POWER: - btm_read_tx_power_complete(p, TRUE); - break; + case HCI_BLE_READ_ADV_CHNL_TX_POWER: + btm_read_tx_power_complete(p, TRUE); + break; - case HCI_BLE_WRITE_ADV_ENABLE: - btm_ble_write_adv_enable_complete(p); - break; + case HCI_BLE_WRITE_ADV_ENABLE: + btm_ble_write_adv_enable_complete(p); + break; - case HCI_BLE_CREATE_LL_CONN: - btm_ble_create_ll_conn_complete(*p); - break; + case HCI_BLE_CREATE_LL_CONN: + btm_ble_create_ll_conn_complete(*p); + break; - case HCI_BLE_TRANSMITTER_TEST: - case HCI_BLE_RECEIVER_TEST: - case HCI_BLE_TEST_END: - btm_ble_test_command_complete(p); - break; + case HCI_BLE_TRANSMITTER_TEST: + case HCI_BLE_RECEIVER_TEST: + case HCI_BLE_TEST_END: + btm_ble_test_command_complete(p); + break; #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) - case HCI_BLE_ADD_DEV_RESOLVING_LIST: - btm_ble_add_resolving_list_entry_complete(p, evt_len); - break; + case HCI_BLE_ADD_DEV_RESOLVING_LIST: + btm_ble_add_resolving_list_entry_complete(p, evt_len); + break; - case HCI_BLE_RM_DEV_RESOLVING_LIST: - btm_ble_remove_resolving_list_entry_complete(p, evt_len); - break; + case HCI_BLE_RM_DEV_RESOLVING_LIST: + btm_ble_remove_resolving_list_entry_complete(p, evt_len); + break; - case HCI_BLE_CLEAR_RESOLVING_LIST: - btm_ble_clear_resolving_list_complete(p, evt_len); - break; + case HCI_BLE_CLEAR_RESOLVING_LIST: + btm_ble_clear_resolving_list_complete(p, evt_len); + break; - case HCI_BLE_READ_RESOLVABLE_ADDR_PEER: - btm_ble_read_resolving_list_entry_complete(p, evt_len); - break; + case HCI_BLE_READ_RESOLVABLE_ADDR_PEER: + btm_ble_read_resolving_list_entry_complete(p, evt_len); + break; - case HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL: - case HCI_BLE_SET_ADDR_RESOLUTION_ENABLE: - case HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT: - break; + case HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL: + case HCI_BLE_SET_ADDR_RESOLUTION_ENABLE: + case HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT: + break; #endif #endif /* (BLE_INCLUDED == TRUE) */ - default: - if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) - btm_vsc_complete (p, opcode, evt_len, (tBTM_CMPL_CB *)p_cplt_cback); - break; + default: + if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) { + btm_vsc_complete (p, opcode, evt_len, (tBTM_CMPL_CB *)p_cplt_cback); + } + break; } } @@ -957,13 +951,13 @@ static void btu_hcif_command_complete_evt_on_task(BT_HDR *event) STREAM_TO_UINT16(opcode, stream); btu_hcif_hdl_command_complete( - opcode, - stream, - hack->response->len - 5, // 3 for the command complete headers, 2 for the event headers - hack->context); + opcode, + stream, + hack->response->len - 5, // 3 for the command complete headers, 2 for the event headers + hack->context); - GKI_freebuf(hack->response); - osi_free(event); + GKI_freebuf(hack->response); + osi_free(event); } static void btu_hcif_command_complete_evt(BT_HDR *response, void *context) @@ -980,7 +974,7 @@ static void btu_hcif_command_complete_evt(BT_HDR *response, void *context) event->event = BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK; fixed_queue_enqueue(btu_hci_msg_queue, event); - // ke_event_set(KE_EVENT_BTU_TASK_THREAD); + // ke_event_set(KE_EVENT_BTU_TASK_THREAD); btu_task_post(SIG_BTU_WORK); } @@ -995,7 +989,7 @@ static void btu_hcif_command_complete_evt(BT_HDR *response, void *context) ** *******************************************************************************/ static void btu_hcif_hdl_command_status (UINT16 opcode, UINT8 status, UINT8 *p_cmd, - void *p_vsc_status_cback) + void *p_vsc_status_cback) { BD_ADDR bd_addr; UINT16 handle; @@ -1003,141 +997,133 @@ static void btu_hcif_hdl_command_status (UINT16 opcode, UINT8 status, UINT8 *p_c tBTM_ESCO_DATA esco_data; #endif - switch (opcode) - { - case HCI_EXIT_SNIFF_MODE: - case HCI_EXIT_PARK_MODE: + switch (opcode) { + case HCI_EXIT_SNIFF_MODE: + case HCI_EXIT_PARK_MODE: #if BTM_SCO_WAKE_PARKED_LINK == TRUE - if (status != HCI_SUCCESS) - { - /* Allow SCO initiation to continue if waiting for change mode event */ - if (p_cmd != NULL) - { - p_cmd++; /* bypass length field */ - STREAM_TO_UINT16 (handle, p_cmd); - btm_sco_chk_pend_unpark (status, handle); - } + if (status != HCI_SUCCESS) { + /* Allow SCO initiation to continue if waiting for change mode event */ + if (p_cmd != NULL) { + p_cmd++; /* bypass length field */ + STREAM_TO_UINT16 (handle, p_cmd); + btm_sco_chk_pend_unpark (status, handle); } + } #endif - /* Case Falls Through */ + /* Case Falls Through */ - case HCI_HOLD_MODE: - case HCI_SNIFF_MODE: - case HCI_PARK_MODE: - btm_pm_proc_cmd_status(status); - break; + case HCI_HOLD_MODE: + case HCI_SNIFF_MODE: + case HCI_PARK_MODE: + btm_pm_proc_cmd_status(status); + break; - default: - /* If command failed to start, we may need to tell BTM */ - if (status != HCI_SUCCESS) - { - switch (opcode) - { - case HCI_INQUIRY: - /* Tell inquiry processing that we are done */ - btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK); - break; + default: + /* If command failed to start, we may need to tell BTM */ + if (status != HCI_SUCCESS) { + switch (opcode) { + case HCI_INQUIRY: + /* Tell inquiry processing that we are done */ + btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK); + break; - case HCI_RMT_NAME_REQUEST: - /* Tell inquiry processing that we are done */ - btm_process_remote_name (NULL, NULL, 0, status); + case HCI_RMT_NAME_REQUEST: + /* Tell inquiry processing that we are done */ + btm_process_remote_name (NULL, NULL, 0, status); - btm_sec_rmt_name_request_complete (NULL, NULL, status); - break; + btm_sec_rmt_name_request_complete (NULL, NULL, status); + break; - case HCI_QOS_SETUP_COMP_EVT: - /* Tell qos setup that we are done */ - btm_qos_setup_complete(status,0,NULL); - break; + case HCI_QOS_SETUP_COMP_EVT: + /* Tell qos setup that we are done */ + btm_qos_setup_complete(status, 0, NULL); + break; - case HCI_SWITCH_ROLE: - /* Tell BTM that the command failed */ - /* read bd addr out of stored command */ - if (p_cmd != NULL) - { - p_cmd++; - STREAM_TO_BDADDR (bd_addr, p_cmd); - btm_acl_role_changed(status, bd_addr, BTM_ROLE_UNDEFINED); - } - else - btm_acl_role_changed(status, NULL, BTM_ROLE_UNDEFINED); - l2c_link_role_changed (NULL, BTM_ROLE_UNDEFINED, HCI_ERR_COMMAND_DISALLOWED); - break; + case HCI_SWITCH_ROLE: + /* Tell BTM that the command failed */ + /* read bd addr out of stored command */ + if (p_cmd != NULL) { + p_cmd++; + STREAM_TO_BDADDR (bd_addr, p_cmd); + btm_acl_role_changed(status, bd_addr, BTM_ROLE_UNDEFINED); + } else { + btm_acl_role_changed(status, NULL, BTM_ROLE_UNDEFINED); + } + l2c_link_role_changed (NULL, BTM_ROLE_UNDEFINED, HCI_ERR_COMMAND_DISALLOWED); + break; - case HCI_CREATE_CONNECTION: - /* read bd addr out of stored command */ - if (p_cmd != NULL) - { - p_cmd++; - STREAM_TO_BDADDR (bd_addr, p_cmd); - btm_sec_connected (bd_addr, HCI_INVALID_HANDLE, status, 0); - l2c_link_hci_conn_comp (status, HCI_INVALID_HANDLE, bd_addr); - } - break; + case HCI_CREATE_CONNECTION: + /* read bd addr out of stored command */ + if (p_cmd != NULL) { + p_cmd++; + STREAM_TO_BDADDR (bd_addr, p_cmd); + btm_sec_connected (bd_addr, HCI_INVALID_HANDLE, status, 0); + l2c_link_hci_conn_comp (status, HCI_INVALID_HANDLE, bd_addr); + } + break; - case HCI_READ_RMT_EXT_FEATURES: - if (p_cmd != NULL) - { - p_cmd++; /* skip command length */ - STREAM_TO_UINT16 (handle, p_cmd); - } - else - handle = HCI_INVALID_HANDLE; + case HCI_READ_RMT_EXT_FEATURES: + if (p_cmd != NULL) { + p_cmd++; /* skip command length */ + STREAM_TO_UINT16 (handle, p_cmd); + } else { + handle = HCI_INVALID_HANDLE; + } - btm_read_remote_ext_features_failed(status, handle); - break; + btm_read_remote_ext_features_failed(status, handle); + break; - case HCI_AUTHENTICATION_REQUESTED: - /* Device refused to start authentication. That should be treated as authentication failure. */ - btm_sec_auth_complete (BTM_INVALID_HCI_HANDLE, status); - break; + case HCI_AUTHENTICATION_REQUESTED: + /* Device refused to start authentication. That should be treated as authentication failure. */ + btm_sec_auth_complete (BTM_INVALID_HCI_HANDLE, status); + break; - case HCI_SET_CONN_ENCRYPTION: - /* Device refused to start encryption. That should be treated as encryption failure. */ - btm_sec_encrypt_change (BTM_INVALID_HCI_HANDLE, status, FALSE); - break; + case HCI_SET_CONN_ENCRYPTION: + /* Device refused to start encryption. That should be treated as encryption failure. */ + btm_sec_encrypt_change (BTM_INVALID_HCI_HANDLE, status, FALSE); + break; #if BLE_INCLUDED == TRUE - case HCI_BLE_CREATE_LL_CONN: - btm_ble_create_ll_conn_complete(status); - break; + case HCI_BLE_CREATE_LL_CONN: + btm_ble_create_ll_conn_complete(status); + break; #endif #if BTM_SCO_INCLUDED == TRUE - case HCI_SETUP_ESCO_CONNECTION: - /* read handle out of stored command */ - if (p_cmd != NULL) - { - p_cmd++; - STREAM_TO_UINT16 (handle, p_cmd); + case HCI_SETUP_ESCO_CONNECTION: + /* read handle out of stored command */ + if (p_cmd != NULL) { + p_cmd++; + STREAM_TO_UINT16 (handle, p_cmd); - /* Determine if initial connection failed or is a change of setup */ - if (btm_is_sco_active(handle)) - btm_esco_proc_conn_chg (status, handle, 0, 0, 0, 0); - else - btm_sco_connected (status, NULL, handle, &esco_data); - } - break; -#endif - -/* This is commented out until an upper layer cares about returning event -#if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE - case HCI_ENHANCED_FLUSH: + /* Determine if initial connection failed or is a change of setup */ + if (btm_is_sco_active(handle)) { + btm_esco_proc_conn_chg (status, handle, 0, 0, 0, 0); + } else { + btm_sco_connected (status, NULL, handle, &esco_data); + } + } break; #endif -*/ - default: - if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) - btm_vsc_complete (&status, opcode, 1, (tBTM_CMPL_CB *)p_vsc_status_cback); - break; - } - } - else - { - if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) + /* This is commented out until an upper layer cares about returning event + #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE + case HCI_ENHANCED_FLUSH: + break; + #endif + */ + default: + if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) { btm_vsc_complete (&status, opcode, 1, (tBTM_CMPL_CB *)p_vsc_status_cback); + } + break; } + + } else { + if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) { + btm_vsc_complete (&status, opcode, 1, (tBTM_CMPL_CB *)p_vsc_status_cback); + } + } } } @@ -1159,10 +1145,10 @@ static void btu_hcif_command_status_evt_on_task(BT_HDR *event) STREAM_TO_UINT16(opcode, stream); btu_hcif_hdl_command_status( - opcode, - hack->status, - stream, - hack->context); + opcode, + hack->status, + stream, + hack->context); GKI_freebuf(hack->command); osi_free(event); @@ -1202,8 +1188,9 @@ static void btu_hcif_hardware_error_evt (UINT8 *p) btm_report_device_status (BTM_DEV_STATUS_DOWN); /* Reset the controller */ - if (BTM_IsDeviceUp()) + if (BTM_IsDeviceUp()) { BTM_DeviceReset (NULL); + } } @@ -1289,11 +1276,11 @@ static void btu_hcif_mode_change_evt (UINT8 *p) #endif btm_pm_proc_mode_change (status, handle, current_mode, interval); -/* -#if (HID_DEV_INCLUDED == TRUE) && (HID_DEV_PM_INCLUDED == TRUE) - hidd_pm_proc_mode_change( status, current_mode, interval ) ; -#endif -*/ + /* + #if (HID_DEV_INCLUDED == TRUE) && (HID_DEV_PM_INCLUDED == TRUE) + hidd_pm_proc_mode_change( status, current_mode, interval ) ; + #endif + */ } /******************************************************************************* @@ -1305,12 +1292,12 @@ static void btu_hcif_mode_change_evt (UINT8 *p) ** Returns void ** *******************************************************************************/ - #if (BTM_SSR_INCLUDED == TRUE) +#if (BTM_SSR_INCLUDED == TRUE) static void btu_hcif_ssr_evt (UINT8 *p, UINT16 evt_len) { btm_pm_proc_ssr_evt(p, evt_len); } - #endif +#endif /******************************************************************************* ** @@ -1436,8 +1423,9 @@ static void btu_hcif_read_clock_off_comp_evt (UINT8 *p) STREAM_TO_UINT8 (status, p); /* If failed to get clock offset just drop the result */ - if (status != HCI_SUCCESS) + if (status != HCI_SUCCESS) { return; + } STREAM_TO_UINT16 (handle, p); STREAM_TO_UINT16 (clock_offset, p); @@ -1659,7 +1647,7 @@ static void btu_hcif_simple_pair_complete_evt (UINT8 *p) #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE static void btu_hcif_enhanced_flush_complete_evt (void) { -/* This is empty until an upper layer cares about returning event */ + /* This is empty until an upper layer cares about returning event */ } #endif /********************************************** @@ -1680,14 +1668,16 @@ static void btu_hcif_encryption_key_refresh_cmpl_evt (UINT8 *p) STREAM_TO_UINT8 (status, p); STREAM_TO_UINT16 (handle, p); - if (status == HCI_SUCCESS) enc_enable = 1; + if (status == HCI_SUCCESS) { + enc_enable = 1; + } btm_sec_encrypt_change (handle, status, enc_enable); } static void btu_ble_process_adv_pkt (UINT8 *p) { - HCI_TRACE_EVENT("btu_ble_process_adv_pkt"); + HCI_TRACE_DEBUG("btu_ble_process_adv_pkt\n"); btm_ble_process_adv_pkt(p); } @@ -1740,8 +1730,7 @@ static void btu_ble_data_length_change_evt(UINT8 *p, UINT16 evt_len) UINT16 tx_data_len; UINT16 rx_data_len; - if (!controller_get_interface()->supports_ble_packet_extension()) - { + if (!controller_get_interface()->supports_ble_packet_extension()) { HCI_TRACE_WARNING("%s, request not supported", __FUNCTION__); return; } diff --git a/components/bt/bluedroid/stack/btu/btu_init.c b/components/bt/bluedroid/stack/btu/btu_init.c old mode 100755 new mode 100644 index 660eb2ff1..122c2374c --- a/components/bt/bluedroid/stack/btu/btu_init.c +++ b/components/bt/bluedroid/stack/btu/btu_init.c @@ -129,12 +129,12 @@ void btu_init_core(void) ******************************************************************************/ void btu_free_core(void) { - // Free the mandatory core stack components - l2c_free(); + // Free the mandatory core stack components + l2c_free(); #if BLE_INCLUDED == TRUE #if (defined(GATT_INCLUDED) && GATT_INCLUDED == true) - gatt_free(); + gatt_free(); #endif #endif } @@ -157,91 +157,99 @@ void BTU_StartUp(void) btu_cb.trace_level = HCI_INITIAL_TRACE_LEVEL; btu_bta_msg_queue = fixed_queue_new(SIZE_MAX); - if (btu_bta_msg_queue == NULL) + if (btu_bta_msg_queue == NULL) { goto error_exit; + } btu_general_alarm_hash_map = hash_map_new(BTU_GENERAL_ALARM_HASH_MAP_SIZE, - hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); - if (btu_general_alarm_hash_map == NULL) + hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); + if (btu_general_alarm_hash_map == NULL) { goto error_exit; + } pthread_mutex_init(&btu_general_alarm_lock, NULL); btu_general_alarm_queue = fixed_queue_new(SIZE_MAX); - if (btu_general_alarm_queue == NULL) + if (btu_general_alarm_queue == NULL) { goto error_exit; + } btu_oneshot_alarm_hash_map = hash_map_new(BTU_ONESHOT_ALARM_HASH_MAP_SIZE, - hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); - if (btu_oneshot_alarm_hash_map == NULL) + hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); + if (btu_oneshot_alarm_hash_map == NULL) { goto error_exit; + } pthread_mutex_init(&btu_oneshot_alarm_lock, NULL); btu_oneshot_alarm_queue = fixed_queue_new(SIZE_MAX); - if (btu_oneshot_alarm_queue == NULL) + if (btu_oneshot_alarm_queue == NULL) { goto error_exit; + } btu_l2cap_alarm_hash_map = hash_map_new(BTU_L2CAP_ALARM_HASH_MAP_SIZE, - hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); - if (btu_l2cap_alarm_hash_map == NULL) + hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); + if (btu_l2cap_alarm_hash_map == NULL) { goto error_exit; + } pthread_mutex_init(&btu_l2cap_alarm_lock, NULL); btu_l2cap_alarm_queue = fixed_queue_new(SIZE_MAX); - if (btu_l2cap_alarm_queue == NULL) - goto error_exit; + if (btu_l2cap_alarm_queue == NULL) { + goto error_exit; + } xBtuQueue = xQueueCreate(60, sizeof(BtTaskEvt_t)); xTaskCreate(btu_task_thread_handler, "BtuT", 4096, NULL, configMAX_PRIORITIES - 1, &xBtuTaskHandle); btu_task_post(SIG_BTU_START_UP); -/* - // Continue startup on bt workqueue thread. - thread_post(bt_workqueue_thread, btu_task_start_up, NULL); -*/ + /* + // Continue startup on bt workqueue thread. + thread_post(bt_workqueue_thread, btu_task_start_up, NULL); + */ return; - error_exit:; +error_exit:; LOG_ERROR("%s Unable to allocate resources for bt_workqueue", __func__); BTU_ShutDown(); } -void BTU_ShutDown(void) { - btu_task_shut_down(); -/* - fixed_queue_free(btu_bta_msg_queue, NULL); -*/ - hash_map_free(btu_general_alarm_hash_map); - pthread_mutex_destroy(&btu_general_alarm_lock); - fixed_queue_free(btu_general_alarm_queue, NULL); +void BTU_ShutDown(void) +{ + btu_task_shut_down(); + /* + fixed_queue_free(btu_bta_msg_queue, NULL); + */ + hash_map_free(btu_general_alarm_hash_map); + pthread_mutex_destroy(&btu_general_alarm_lock); + fixed_queue_free(btu_general_alarm_queue, NULL); - hash_map_free(btu_oneshot_alarm_hash_map); - pthread_mutex_destroy(&btu_oneshot_alarm_lock); - fixed_queue_free(btu_oneshot_alarm_queue, NULL); + hash_map_free(btu_oneshot_alarm_hash_map); + pthread_mutex_destroy(&btu_oneshot_alarm_lock); + fixed_queue_free(btu_oneshot_alarm_queue, NULL); - hash_map_free(btu_l2cap_alarm_hash_map); - pthread_mutex_destroy(&btu_l2cap_alarm_lock); - fixed_queue_free(btu_l2cap_alarm_queue, NULL); + hash_map_free(btu_l2cap_alarm_hash_map); + pthread_mutex_destroy(&btu_l2cap_alarm_lock); + fixed_queue_free(btu_l2cap_alarm_queue, NULL); - //thread_free(bt_workqueue_thread); - vTaskDelete(xBtuTaskHandle); - vQueueDelete(xBtuQueue); + //thread_free(bt_workqueue_thread); + vTaskDelete(xBtuTaskHandle); + vQueueDelete(xBtuQueue); - btu_bta_msg_queue = NULL; + btu_bta_msg_queue = NULL; - btu_general_alarm_hash_map = NULL; - btu_general_alarm_queue = NULL; + btu_general_alarm_hash_map = NULL; + btu_general_alarm_queue = NULL; - btu_oneshot_alarm_hash_map = NULL; - btu_oneshot_alarm_queue = NULL; + btu_oneshot_alarm_hash_map = NULL; + btu_oneshot_alarm_queue = NULL; - btu_l2cap_alarm_hash_map = NULL; - btu_l2cap_alarm_queue = NULL; + btu_l2cap_alarm_hash_map = NULL; + btu_l2cap_alarm_queue = NULL; // bt_workqueue_thread = NULL; - xBtuTaskHandle = NULL; - xBtuQueue = 0; + xBtuTaskHandle = NULL; + xBtuQueue = 0; } /***************************************************************************** diff --git a/components/bt/bluedroid/stack/btu/btu_task.c b/components/bt/bluedroid/stack/btu/btu_task.c old mode 100755 new mode 100644 index 191b4302e..f6f6aeb64 --- a/components/bt/bluedroid/stack/btu/btu_task.c +++ b/components/bt/bluedroid/stack/btu/btu_task.c @@ -137,7 +137,8 @@ static void btu_hci_msg_process(BT_HDR *p_msg); static void btu_bta_alarm_process(TIMER_LIST_ENT *p_tle); #endif -void btu_hci_msg_ready(fixed_queue_t *queue) { +void btu_hci_msg_ready(fixed_queue_t *queue) +{ BT_HDR *p_msg; while (!fixed_queue_is_empty(queue)) { @@ -146,7 +147,8 @@ void btu_hci_msg_ready(fixed_queue_t *queue) { } } -void btu_general_alarm_ready(fixed_queue_t *queue) { +void btu_general_alarm_ready(fixed_queue_t *queue) +{ TIMER_LIST_ENT *p_tle; while (!fixed_queue_is_empty(queue)) { @@ -155,7 +157,8 @@ void btu_general_alarm_ready(fixed_queue_t *queue) { } } -void btu_oneshot_alarm_ready(fixed_queue_t *queue) { +void btu_oneshot_alarm_ready(fixed_queue_t *queue) +{ TIMER_LIST_ENT *p_tle; while (!fixed_queue_is_empty(queue)) { @@ -168,12 +171,11 @@ void btu_oneshot_alarm_ready(fixed_queue_t *queue) { btm_ble_timeout(p_tle); break; #endif - case BTU_TTYPE_USER_FUNC: - { - tUSER_TIMEOUT_FUNC *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param; - (*p_uf)(p_tle); - } - break; + case BTU_TTYPE_USER_FUNC: { + tUSER_TIMEOUT_FUNC *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param; + (*p_uf)(p_tle); + } + break; default: // FAIL @@ -184,7 +186,8 @@ void btu_oneshot_alarm_ready(fixed_queue_t *queue) { } } -void btu_l2cap_alarm_ready(fixed_queue_t *queue) { +void btu_l2cap_alarm_ready(fixed_queue_t *queue) +{ TIMER_LIST_ENT *p_tle; while (!fixed_queue_is_empty(queue)) { @@ -194,7 +197,8 @@ void btu_l2cap_alarm_ready(fixed_queue_t *queue) { } #if (defined(BTA_INCLUDED) && BTA_INCLUDED == TRUE) -void btu_bta_msg_ready(fixed_queue_t *queue) { +void btu_bta_msg_ready(fixed_queue_t *queue) +{ BT_HDR *p_msg; while (!fixed_queue_is_empty(queue)) { @@ -203,7 +207,8 @@ void btu_bta_msg_ready(fixed_queue_t *queue) { } } -void btu_bta_alarm_ready(fixed_queue_t *queue) { +void btu_bta_alarm_ready(fixed_queue_t *queue) +{ TIMER_LIST_ENT *p_tle; while (!fixed_queue_is_empty(queue)) { @@ -213,74 +218,74 @@ void btu_bta_alarm_ready(fixed_queue_t *queue) { } #endif -static void btu_hci_msg_process(BT_HDR *p_msg) { +static void btu_hci_msg_process(BT_HDR *p_msg) +{ /* Determine the input message type. */ - switch (p_msg->event & BT_EVT_MASK) - { - case BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK: // TODO(zachoverflow): remove this - ((post_to_task_hack_t *)(&p_msg->data[0]))->callback(p_msg); - break; - case BT_EVT_TO_BTU_HCI_ACL: - /* All Acl Data goes to L2CAP */ - l2c_rcv_acl_data (p_msg); - break; + switch (p_msg->event & BT_EVT_MASK) { + case BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK: // TODO(zachoverflow): remove this + ((post_to_task_hack_t *)(&p_msg->data[0]))->callback(p_msg); + break; + case BT_EVT_TO_BTU_HCI_ACL: + /* All Acl Data goes to L2CAP */ + l2c_rcv_acl_data (p_msg); + break; - case BT_EVT_TO_BTU_L2C_SEG_XMIT: - /* L2CAP segment transmit complete */ - l2c_link_segments_xmitted (p_msg); - break; + case BT_EVT_TO_BTU_L2C_SEG_XMIT: + /* L2CAP segment transmit complete */ + l2c_link_segments_xmitted (p_msg); + break; - case BT_EVT_TO_BTU_HCI_SCO: + case BT_EVT_TO_BTU_HCI_SCO: #if BTM_SCO_INCLUDED == TRUE - btm_route_sco_data (p_msg); - break; + btm_route_sco_data (p_msg); + break; #endif - case BT_EVT_TO_BTU_HCI_EVT: - btu_hcif_process_event ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); - GKI_freebuf(p_msg); + case BT_EVT_TO_BTU_HCI_EVT: + btu_hcif_process_event ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); + GKI_freebuf(p_msg); #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) - /* If host receives events which it doesn't response to, */ - /* host should start idle timer to enter sleep mode. */ - btu_check_bt_sleep (); + /* If host receives events which it doesn't response to, */ + /* host should start idle timer to enter sleep mode. */ + btu_check_bt_sleep (); #endif - break; + break; - case BT_EVT_TO_BTU_HCI_CMD: - btu_hcif_send_cmd ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); - break; + case BT_EVT_TO_BTU_HCI_CMD: + btu_hcif_send_cmd ((UINT8)(p_msg->event & BT_SUB_EVT_MASK), p_msg); + break; - default:; - int i = 0; - uint16_t mask = (UINT16) (p_msg->event & BT_EVT_MASK); - BOOLEAN handled = FALSE; + default:; + int i = 0; + uint16_t mask = (UINT16) (p_msg->event & BT_EVT_MASK); + BOOLEAN handled = FALSE; - for (; !handled && i < BTU_MAX_REG_EVENT; i++) - { - if (btu_cb.event_reg[i].event_cb == NULL) - continue; - - if (mask == btu_cb.event_reg[i].event_range) - { - if (btu_cb.event_reg[i].event_cb) - { - btu_cb.event_reg[i].event_cb(p_msg); - handled = TRUE; - } - } + for (; !handled && i < BTU_MAX_REG_EVENT; i++) { + if (btu_cb.event_reg[i].event_cb == NULL) { + continue; } - if (handled == FALSE) - GKI_freebuf (p_msg); + if (mask == btu_cb.event_reg[i].event_range) { + if (btu_cb.event_reg[i].event_cb) { + btu_cb.event_reg[i].event_cb(p_msg); + handled = TRUE; + } + } + } - break; + if (handled == FALSE) { + GKI_freebuf (p_msg); + } + + break; } } #if (defined(BTA_INCLUDED) && BTA_INCLUDED == TRUE) -static void btu_bta_alarm_process(TIMER_LIST_ENT *p_tle) { +static void btu_bta_alarm_process(TIMER_LIST_ENT *p_tle) +{ // call timer callback if (p_tle->p_cback) { (*p_tle->p_cback)(p_tle); @@ -318,8 +323,7 @@ void btu_task_thread_handler(void *arg) fixed_queue_process(btu_general_alarm_queue); fixed_queue_process(btu_oneshot_alarm_queue); fixed_queue_process(btu_l2cap_alarm_queue); - } - else if (e.sig == SIG_BTU_START_UP) { + } else if (e.sig == SIG_BTU_START_UP) { btu_task_start_up(); } } @@ -334,54 +338,57 @@ void btu_task_post(uint32_t sig) evt.sig = sig; evt.par = 0; - if (xQueueSend(xBtuQueue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { - LOG_ERROR("xBtuQueue failed\n"); + if (xQueueSend(xBtuQueue, &evt, 10 / portTICK_RATE_MS) != pdTRUE) { + LOG_ERROR("xBtuQueue failed\n"); } } -void btu_task_start_up(void) { +void btu_task_start_up(void) +{ #if (defined(BTA_INCLUDED) && BTA_INCLUDED == TRUE) - fixed_queue_register_dequeue(btu_bta_msg_queue, btu_bta_msg_ready); + fixed_queue_register_dequeue(btu_bta_msg_queue, btu_bta_msg_ready); #endif - fixed_queue_register_dequeue(btu_hci_msg_queue, btu_hci_msg_ready); - fixed_queue_register_dequeue(btu_general_alarm_queue, btu_general_alarm_ready); - fixed_queue_register_dequeue(btu_oneshot_alarm_queue, btu_oneshot_alarm_ready); - fixed_queue_register_dequeue(btu_l2cap_alarm_queue, btu_l2cap_alarm_ready); + fixed_queue_register_dequeue(btu_hci_msg_queue, btu_hci_msg_ready); + fixed_queue_register_dequeue(btu_general_alarm_queue, btu_general_alarm_ready); + fixed_queue_register_dequeue(btu_oneshot_alarm_queue, btu_oneshot_alarm_ready); + fixed_queue_register_dequeue(btu_l2cap_alarm_queue, btu_l2cap_alarm_ready); - /* Initialize the mandatory core stack control blocks - (BTU, BTM, L2CAP, and SDP) - */ - btu_init_core(); + /* Initialize the mandatory core stack control blocks + (BTU, BTM, L2CAP, and SDP) + */ + btu_init_core(); - /* Initialize any optional stack components */ - BTE_InitStack(); + /* Initialize any optional stack components */ + BTE_InitStack(); #if (defined(BTA_INCLUDED) && BTA_INCLUDED == TRUE) - bta_sys_init(); + bta_sys_init(); #endif - // Inform the bt jni thread initialization is ok. - // btif_transfer_context(btif_init_ok, 0, NULL, 0, NULL); + // Inform the bt jni thread initialization is ok. + // btif_transfer_context(btif_init_ok, 0, NULL, 0, NULL); #if(defined(BT_APP_DEMO) && BT_APP_DEMO == TRUE) - if (bluedroid_init_done_cb) - bluedroid_init_done_cb(); + if (bluedroid_init_done_cb) { + bluedroid_init_done_cb(); + } #endif } -void btu_task_shut_down(void) { - fixed_queue_unregister_dequeue(btu_hci_msg_queue); - fixed_queue_unregister_dequeue(btu_general_alarm_queue); - fixed_queue_unregister_dequeue(btu_oneshot_alarm_queue); - fixed_queue_unregister_dequeue(btu_l2cap_alarm_queue); +void btu_task_shut_down(void) +{ + fixed_queue_unregister_dequeue(btu_hci_msg_queue); + fixed_queue_unregister_dequeue(btu_general_alarm_queue); + fixed_queue_unregister_dequeue(btu_oneshot_alarm_queue); + fixed_queue_unregister_dequeue(btu_l2cap_alarm_queue); #if (defined(BTA_INCLUDED) && BTA_INCLUDED == TRUE) - fixed_queue_unregister_dequeue(btu_bta_msg_queue); - bta_sys_free(); + fixed_queue_unregister_dequeue(btu_bta_msg_queue); + bta_sys_free(); #endif - btu_free_core(); + btu_free_core(); } /******************************************************************************* @@ -395,145 +402,146 @@ void btu_task_shut_down(void) { ** Returns void ** *******************************************************************************/ -static void btu_general_alarm_process(TIMER_LIST_ENT *p_tle) { +static void btu_general_alarm_process(TIMER_LIST_ENT *p_tle) +{ assert(p_tle != NULL); switch (p_tle->event) { - case BTU_TTYPE_BTM_DEV_CTL: - btm_dev_timeout(p_tle); - break; + case BTU_TTYPE_BTM_DEV_CTL: + btm_dev_timeout(p_tle); + break; - case BTU_TTYPE_L2CAP_LINK: - case BTU_TTYPE_L2CAP_CHNL: - case BTU_TTYPE_L2CAP_HOLD: - case BTU_TTYPE_L2CAP_INFO: - case BTU_TTYPE_L2CAP_FCR_ACK: - l2c_process_timeout (p_tle); - break; + case BTU_TTYPE_L2CAP_LINK: + case BTU_TTYPE_L2CAP_CHNL: + case BTU_TTYPE_L2CAP_HOLD: + case BTU_TTYPE_L2CAP_INFO: + case BTU_TTYPE_L2CAP_FCR_ACK: + l2c_process_timeout (p_tle); + break; #if (defined(SDP_INCLUDED) && SDP_INCLUDED == TRUE) - case BTU_TTYPE_SDP: - sdp_conn_timeout ((tCONN_CB *)p_tle->param); - break; + case BTU_TTYPE_SDP: + sdp_conn_timeout ((tCONN_CB *)p_tle->param); + break; #endif - case BTU_TTYPE_BTM_RMT_NAME: - btm_inq_rmt_name_failed(); - break; + case BTU_TTYPE_BTM_RMT_NAME: + btm_inq_rmt_name_failed(); + break; #if (defined(RFCOMM_INCLUDED) && RFCOMM_INCLUDED == TRUE) - case BTU_TTYPE_RFCOMM_MFC: - case BTU_TTYPE_RFCOMM_PORT: - rfcomm_process_timeout (p_tle); - break; + case BTU_TTYPE_RFCOMM_MFC: + case BTU_TTYPE_RFCOMM_PORT: + rfcomm_process_timeout (p_tle); + break; #endif #if ((defined(BNEP_INCLUDED) && BNEP_INCLUDED == TRUE)) - case BTU_TTYPE_BNEP: - bnep_process_timeout(p_tle); - break; + case BTU_TTYPE_BNEP: + bnep_process_timeout(p_tle); + break; #endif #if (defined(AVDT_INCLUDED) && AVDT_INCLUDED == TRUE) - case BTU_TTYPE_AVDT_CCB_RET: - case BTU_TTYPE_AVDT_CCB_RSP: - case BTU_TTYPE_AVDT_CCB_IDLE: - case BTU_TTYPE_AVDT_SCB_TC: - avdt_process_timeout(p_tle); - break; + case BTU_TTYPE_AVDT_CCB_RET: + case BTU_TTYPE_AVDT_CCB_RSP: + case BTU_TTYPE_AVDT_CCB_IDLE: + case BTU_TTYPE_AVDT_SCB_TC: + avdt_process_timeout(p_tle); + break; #endif #if (defined(HID_HOST_INCLUDED) && HID_HOST_INCLUDED == TRUE) - case BTU_TTYPE_HID_HOST_REPAGE_TO : - hidh_proc_repage_timeout(p_tle); - break; + case BTU_TTYPE_HID_HOST_REPAGE_TO : + hidh_proc_repage_timeout(p_tle); + break; #endif #if (defined(BLE_INCLUDED) && BLE_INCLUDED == TRUE) - case BTU_TTYPE_BLE_INQUIRY: - case BTU_TTYPE_BLE_GAP_LIM_DISC: - case BTU_TTYPE_BLE_RANDOM_ADDR: - case BTU_TTYPE_BLE_GAP_FAST_ADV: - case BTU_TTYPE_BLE_OBSERVE: - btm_ble_timeout(p_tle); - break; + case BTU_TTYPE_BLE_INQUIRY: + case BTU_TTYPE_BLE_GAP_LIM_DISC: + case BTU_TTYPE_BLE_RANDOM_ADDR: + case BTU_TTYPE_BLE_GAP_FAST_ADV: + case BTU_TTYPE_BLE_OBSERVE: + btm_ble_timeout(p_tle); + break; - case BTU_TTYPE_ATT_WAIT_FOR_RSP: - gatt_rsp_timeout(p_tle); - break; + case BTU_TTYPE_ATT_WAIT_FOR_RSP: + gatt_rsp_timeout(p_tle); + break; - case BTU_TTYPE_ATT_WAIT_FOR_IND_ACK: - gatt_ind_ack_timeout(p_tle); - break; + case BTU_TTYPE_ATT_WAIT_FOR_IND_ACK: + gatt_ind_ack_timeout(p_tle); + break; #if (defined(SMP_INCLUDED) && SMP_INCLUDED == TRUE) - case BTU_TTYPE_SMP_PAIRING_CMD: - smp_rsp_timeout(p_tle); - break; + case BTU_TTYPE_SMP_PAIRING_CMD: + smp_rsp_timeout(p_tle); + break; #endif #endif #if (MCA_INCLUDED == TRUE) - case BTU_TTYPE_MCA_CCB_RSP: - mca_process_timeout(p_tle); - break; + case BTU_TTYPE_MCA_CCB_RSP: + mca_process_timeout(p_tle); + break; #endif - case BTU_TTYPE_USER_FUNC: - { - tUSER_TIMEOUT_FUNC *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param; - (*p_uf)(p_tle); + case BTU_TTYPE_USER_FUNC: { + tUSER_TIMEOUT_FUNC *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param; + (*p_uf)(p_tle); + } + break; + + default:; + int i = 0; + BOOLEAN handled = FALSE; + + for (; !handled && i < BTU_MAX_REG_TIMER; i++) { + if (btu_cb.timer_reg[i].timer_cb == NULL) { + continue; } - break; - - default:; - int i = 0; - BOOLEAN handled = FALSE; - - for (; !handled && i < BTU_MAX_REG_TIMER; i++) - { - if (btu_cb.timer_reg[i].timer_cb == NULL) - continue; - if (btu_cb.timer_reg[i].p_tle == p_tle) - { - btu_cb.timer_reg[i].timer_cb(p_tle); - handled = TRUE; - } - } - break; + if (btu_cb.timer_reg[i].p_tle == p_tle) { + btu_cb.timer_reg[i].timer_cb(p_tle); + handled = TRUE; + } + } + break; } } -void btu_general_alarm_cb(void *data) { - assert(data != NULL); - TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; +void btu_general_alarm_cb(void *data) +{ + assert(data != NULL); + TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; - fixed_queue_enqueue(btu_general_alarm_queue, p_tle); - //ke_event_set(KE_EVENT_BTU_TASK_THREAD); - btu_task_post(SIG_BTU_WORK); + fixed_queue_enqueue(btu_general_alarm_queue, p_tle); + //ke_event_set(KE_EVENT_BTU_TASK_THREAD); + btu_task_post(SIG_BTU_WORK); } -void btu_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) { - osi_alarm_t *alarm = NULL; +void btu_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) +{ + osi_alarm_t *alarm = NULL; - assert(p_tle != NULL); + assert(p_tle != NULL); - // Get the alarm for the timer list entry. - pthread_mutex_lock(&btu_general_alarm_lock); - if (!hash_map_has_key(btu_general_alarm_hash_map, p_tle)) { - alarm = osi_alarm_new("btu_gen", btu_general_alarm_cb, (void *)p_tle, 0, false); - hash_map_set(btu_general_alarm_hash_map, p_tle, alarm); - } - pthread_mutex_unlock(&btu_general_alarm_lock); + // Get the alarm for the timer list entry. + pthread_mutex_lock(&btu_general_alarm_lock); + if (!hash_map_has_key(btu_general_alarm_hash_map, p_tle)) { + alarm = osi_alarm_new("btu_gen", btu_general_alarm_cb, (void *)p_tle, 0, false); + hash_map_set(btu_general_alarm_hash_map, p_tle, alarm); + } + pthread_mutex_unlock(&btu_general_alarm_lock); - alarm = hash_map_get(btu_general_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_ERROR("%s Unable to create alarm", __func__); - return; - } - osi_alarm_cancel(alarm); + alarm = hash_map_get(btu_general_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_ERROR("%s Unable to create alarm", __func__); + return; + } + osi_alarm_cancel(alarm); - p_tle->event = type; - // NOTE: This value is in seconds but stored in a ticks field. - p_tle->ticks = timeout_sec; - p_tle->in_use = TRUE; - osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); + p_tle->event = type; + // NOTE: This value is in seconds but stored in a ticks field. + p_tle->ticks = timeout_sec; + p_tle->in_use = TRUE; + osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); } /******************************************************************************* @@ -545,20 +553,22 @@ void btu_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) { ** Returns void ** *******************************************************************************/ -void btu_stop_timer(TIMER_LIST_ENT *p_tle) { - assert(p_tle != NULL); +void btu_stop_timer(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); - if (p_tle->in_use == FALSE) - return; - p_tle->in_use = FALSE; + if (p_tle->in_use == FALSE) { + return; + } + p_tle->in_use = FALSE; - // Get the alarm for the timer list entry. - osi_alarm_t *alarm = hash_map_get(btu_general_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); - return; - } - osi_alarm_cancel(alarm); + // Get the alarm for the timer list entry. + osi_alarm_t *alarm = hash_map_get(btu_general_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); + return; + } + osi_alarm_cancel(alarm); } #if defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0) @@ -571,54 +581,57 @@ void btu_stop_timer(TIMER_LIST_ENT *p_tle) { ** Returns void ** *******************************************************************************/ -static void btu_l2cap_alarm_process(TIMER_LIST_ENT *p_tle) { - assert(p_tle != NULL); +static void btu_l2cap_alarm_process(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); - switch (p_tle->event) { + switch (p_tle->event) { case BTU_TTYPE_L2CAP_CHNL: /* monitor or retransmission timer */ case BTU_TTYPE_L2CAP_FCR_ACK: /* ack timer */ - l2c_process_timeout (p_tle); - break; + l2c_process_timeout (p_tle); + break; default: - break; - } + break; + } } -static void btu_l2cap_alarm_cb(void *data) { - assert(data != NULL); - TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; +static void btu_l2cap_alarm_cb(void *data) +{ + assert(data != NULL); + TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; - fixed_queue_enqueue(btu_l2cap_alarm_queue, p_tle); - //ke_event_set(KE_EVENT_BTU_TASK_THREAD); - btu_task_post(SIG_BTU_WORK); + fixed_queue_enqueue(btu_l2cap_alarm_queue, p_tle); + //ke_event_set(KE_EVENT_BTU_TASK_THREAD); + btu_task_post(SIG_BTU_WORK); } -void btu_start_quick_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_ticks) { - osi_alarm_t *alarm = NULL; +void btu_start_quick_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_ticks) +{ + osi_alarm_t *alarm = NULL; - assert(p_tle != NULL); + assert(p_tle != NULL); - // Get the alarm for the timer list entry. - pthread_mutex_lock(&btu_l2cap_alarm_lock); - if (!hash_map_has_key(btu_l2cap_alarm_hash_map, p_tle)) { - alarm = osi_alarm_new("btu_l2cap", btu_l2cap_alarm_cb, (void *)p_tle, 0, false); - hash_map_set(btu_l2cap_alarm_hash_map, p_tle, (void *)alarm); - } - pthread_mutex_unlock(&btu_l2cap_alarm_lock); + // Get the alarm for the timer list entry. + pthread_mutex_lock(&btu_l2cap_alarm_lock); + if (!hash_map_has_key(btu_l2cap_alarm_hash_map, p_tle)) { + alarm = osi_alarm_new("btu_l2cap", btu_l2cap_alarm_cb, (void *)p_tle, 0, false); + hash_map_set(btu_l2cap_alarm_hash_map, p_tle, (void *)alarm); + } + pthread_mutex_unlock(&btu_l2cap_alarm_lock); - alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_ERROR("%s Unable to create alarm", __func__); - return; - } - osi_alarm_cancel(alarm); + alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_ERROR("%s Unable to create alarm", __func__); + return; + } + osi_alarm_cancel(alarm); - p_tle->event = type; - p_tle->ticks = timeout_ticks; - p_tle->in_use = TRUE; - // The quick timer ticks are 100ms long. - osi_alarm_set(alarm, (period_ms_t)(timeout_ticks * 100)); + p_tle->event = type; + p_tle->ticks = timeout_ticks; + p_tle->in_use = TRUE; + // The quick timer ticks are 100ms long. + osi_alarm_set(alarm, (period_ms_t)(timeout_ticks * 100)); } /******************************************************************************* @@ -630,78 +643,84 @@ void btu_start_quick_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_ti ** Returns void ** *******************************************************************************/ -void btu_stop_quick_timer(TIMER_LIST_ENT *p_tle) { - assert(p_tle != NULL); +void btu_stop_quick_timer(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); - if (p_tle->in_use == FALSE) - return; - p_tle->in_use = FALSE; + if (p_tle->in_use == FALSE) { + return; + } + p_tle->in_use = FALSE; - // Get the alarm for the timer list entry. - osi_alarm_t *alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); - return; - } - osi_alarm_cancel(alarm); + // Get the alarm for the timer list entry. + osi_alarm_t *alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); + return; + } + osi_alarm_cancel(alarm); } #endif /* defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0) */ -void btu_oneshot_alarm_cb(void *data) { - assert(data != NULL); - TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; +void btu_oneshot_alarm_cb(void *data) +{ + assert(data != NULL); + TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; - btu_stop_timer_oneshot(p_tle); + btu_stop_timer_oneshot(p_tle); - fixed_queue_enqueue(btu_oneshot_alarm_queue, p_tle); - //ke_event_set(KE_EVENT_BTU_TASK_THREAD); - btu_task_post(SIG_BTU_WORK); + fixed_queue_enqueue(btu_oneshot_alarm_queue, p_tle); + //ke_event_set(KE_EVENT_BTU_TASK_THREAD); + btu_task_post(SIG_BTU_WORK); } /* * Starts a oneshot timer with a timeout in seconds. */ -void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) { - osi_alarm_t *alarm = NULL; +void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) +{ + osi_alarm_t *alarm = NULL; - assert(p_tle != NULL); + assert(p_tle != NULL); - // Get the alarm for the timer list entry. - pthread_mutex_lock(&btu_oneshot_alarm_lock); - if (!hash_map_has_key(btu_oneshot_alarm_hash_map, p_tle)) { - alarm = osi_alarm_new("btu_oneshot", btu_oneshot_alarm_cb, (void *)p_tle, 0, false); - hash_map_set(btu_oneshot_alarm_hash_map, p_tle, alarm); - } - pthread_mutex_unlock(&btu_oneshot_alarm_lock); + // Get the alarm for the timer list entry. + pthread_mutex_lock(&btu_oneshot_alarm_lock); + if (!hash_map_has_key(btu_oneshot_alarm_hash_map, p_tle)) { + alarm = osi_alarm_new("btu_oneshot", btu_oneshot_alarm_cb, (void *)p_tle, 0, false); + hash_map_set(btu_oneshot_alarm_hash_map, p_tle, alarm); + } + pthread_mutex_unlock(&btu_oneshot_alarm_lock); - alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_ERROR("%s Unable to create alarm", __func__); - return; - } - osi_alarm_cancel(alarm); + alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_ERROR("%s Unable to create alarm", __func__); + return; + } + osi_alarm_cancel(alarm); - p_tle->event = type; - p_tle->in_use = TRUE; - // NOTE: This value is in seconds but stored in a ticks field. - p_tle->ticks = timeout_sec; - osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); + p_tle->event = type; + p_tle->in_use = TRUE; + // NOTE: This value is in seconds but stored in a ticks field. + p_tle->ticks = timeout_sec; + osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); } -void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) { - assert(p_tle != NULL); +void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); - if (p_tle->in_use == FALSE) - return; - p_tle->in_use = FALSE; + if (p_tle->in_use == FALSE) { + return; + } + p_tle->in_use = FALSE; - // Get the alarm for the timer list entry. - osi_alarm_t *alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); - return; - } - osi_alarm_cancel(alarm); + // Get the alarm for the timer list entry. + osi_alarm_t *alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); + if (alarm == NULL) { + LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); + return; + } + osi_alarm_cancel(alarm); } #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) @@ -717,8 +736,7 @@ void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) { void btu_check_bt_sleep (void) { // TODO(zachoverflow) take pending commands into account? - if (l2cb.controller_xmit_window == l2cb.num_lm_acl_bufs) - { + if (l2cb.controller_xmit_window == l2cb.num_lm_acl_bufs) { bte_main_lpm_allow_bt_device_sleep(); } } diff --git a/components/bt/bluedroid/stack/gap/gap_api.c b/components/bt/bluedroid/stack/gap/gap_api.c old mode 100755 new mode 100644 index 10c392ba5..aff689c34 --- a/components/bt/bluedroid/stack/gap/gap_api.c +++ b/components/bt/bluedroid/stack/gap/gap_api.c @@ -36,8 +36,9 @@ tGAP_CB gap_cb; *******************************************************************************/ UINT8 GAP_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { gap_cb.trace_level = new_level; + } return (gap_cb.trace_level); } diff --git a/components/bt/bluedroid/stack/gap/gap_ble.c b/components/bt/bluedroid/stack/gap/gap_ble.c old mode 100755 new mode 100644 index 690f6982b..70c4a22f6 --- a/components/bt/bluedroid/stack/gap/gap_ble.c +++ b/components/bt/bluedroid/stack/gap/gap_ble.c @@ -44,11 +44,10 @@ static void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, tGATT /* client connection callback */ static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, - tGATT_DISCONN_REASON reason, tGATT_TRANSPORT transport); + tGATT_DISCONN_REASON reason, tGATT_TRANSPORT transport); static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data); -static tGATT_CBACK gap_cback = -{ +static tGATT_CBACK gap_cback = { gap_ble_c_connect_cback, gap_ble_c_cmpl_cback, NULL, @@ -74,10 +73,8 @@ tGAP_CLCB *gap_find_clcb_by_bd_addr(BD_ADDR bda) UINT8 i_clcb; tGAP_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) - { - if (p_clcb->in_use && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN)) - { + for (i_clcb = 0, p_clcb = gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) { + if (p_clcb->in_use && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN)) { return p_clcb; } } @@ -99,10 +96,8 @@ tGAP_CLCB *gap_ble_find_clcb_by_conn_id(UINT16 conn_id) UINT8 i_clcb; tGAP_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) - { - if (p_clcb->in_use && p_clcb->connected && p_clcb->conn_id == conn_id) - { + for (i_clcb = 0, p_clcb = gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) { + if (p_clcb->in_use && p_clcb->connected && p_clcb->conn_id == conn_id) { return p_clcb; } } @@ -124,10 +119,8 @@ tGAP_CLCB *gap_clcb_alloc (BD_ADDR bda) UINT8 i_clcb = 0; tGAP_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) - { - if (!p_clcb->in_use) - { + for (i_clcb = 0, p_clcb = gap_cb.clcb; i_clcb < GAP_MAX_CL; i_clcb++, p_clcb++) { + if (!p_clcb->in_use) { memset(p_clcb, 0, sizeof(tGAP_CLCB)); p_clcb->in_use = TRUE; memcpy (p_clcb->bda, bda, BD_ADDR_LEN); @@ -150,13 +143,13 @@ void gap_ble_dealloc_clcb(tGAP_CLCB *p_clcb) { tGAP_BLE_REQ *p_q; - while((p_q = (tGAP_BLE_REQ *)GKI_dequeue(&p_clcb->pending_req_q)) != NULL) - { - /* send callback to all pending requests if being removed*/ - if (p_q->p_cback != NULL) + while ((p_q = (tGAP_BLE_REQ *)GKI_dequeue(&p_clcb->pending_req_q)) != NULL) { + /* send callback to all pending requests if being removed*/ + if (p_q->p_cback != NULL) { (*p_q->p_cback)(FALSE, p_clcb->bda, 0, NULL); + } - GKI_freebuf (p_q); + GKI_freebuf (p_q); } memset(p_clcb, 0, sizeof(tGAP_CLCB)); @@ -175,8 +168,7 @@ BOOLEAN gap_ble_enqueue_request (tGAP_CLCB *p_clcb, UINT16 uuid, tGAP_BLE_CMPL_C { tGAP_BLE_REQ *p_q = (tGAP_BLE_REQ *)GKI_getbuf(sizeof(tGAP_BLE_REQ)); - if (p_q != NULL) - { + if (p_q != NULL) { p_q->p_cback = p_cback; p_q->uuid = uuid; GKI_enqueue(&p_clcb->pending_req_q, p_q); @@ -194,12 +186,11 @@ BOOLEAN gap_ble_enqueue_request (tGAP_CLCB *p_clcb, UINT16 uuid, tGAP_BLE_CMPL_C ** Returns TRUE is successul; FALSE otherwise ** *******************************************************************************/ -BOOLEAN gap_ble_dequeue_request (tGAP_CLCB *p_clcb, UINT16 * p_uuid, tGAP_BLE_CMPL_CBACK **p_cback) +BOOLEAN gap_ble_dequeue_request (tGAP_CLCB *p_clcb, UINT16 *p_uuid, tGAP_BLE_CMPL_CBACK **p_cback) { tGAP_BLE_REQ *p_q = (tGAP_BLE_REQ *)GKI_dequeue(&p_clcb->pending_req_q);; - if (p_q != NULL) - { + if (p_q != NULL) { *p_cback = p_q->p_cback; *p_uuid = p_q->uuid; GKI_freebuf((void *)p_q); @@ -219,52 +210,50 @@ tGATT_STATUS gap_read_attr_value (UINT16 handle, tGATT_VALUE *p_value, BOOLEAN i UINT16 offset = p_value->offset; UINT8 *p_dev_name = NULL; - for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) - { - if (handle == p_db_attr->handle) - { + for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) { + if (handle == p_db_attr->handle) { if (p_db_attr->uuid != GATT_UUID_GAP_DEVICE_NAME && - is_long == TRUE) + is_long == TRUE) { return GATT_NOT_LONG; + } - switch (p_db_attr->uuid) - { - case GATT_UUID_GAP_DEVICE_NAME: - BTM_ReadLocalDeviceName((char **)&p_dev_name); - if (strlen ((char *)p_dev_name) > GATT_MAX_ATTR_LEN) - p_value->len = GATT_MAX_ATTR_LEN; - else - p_value->len = (UINT16)strlen ((char *)p_dev_name); + switch (p_db_attr->uuid) { + case GATT_UUID_GAP_DEVICE_NAME: + BTM_ReadLocalDeviceName((char **)&p_dev_name); + if (strlen ((char *)p_dev_name) > GATT_MAX_ATTR_LEN) { + p_value->len = GATT_MAX_ATTR_LEN; + } else { + p_value->len = (UINT16)strlen ((char *)p_dev_name); + } - if (offset > p_value->len) - return GATT_INVALID_OFFSET; - else - { - p_value->len -= offset; - p_dev_name += offset; - ARRAY_TO_STREAM(p, p_dev_name, p_value->len); - GAP_TRACE_EVENT("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len); - } - break; + if (offset > p_value->len) { + return GATT_INVALID_OFFSET; + } else { + p_value->len -= offset; + p_dev_name += offset; + ARRAY_TO_STREAM(p, p_dev_name, p_value->len); + GAP_TRACE_EVENT("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len); + } + break; - case GATT_UUID_GAP_ICON: - UINT16_TO_STREAM(p, p_db_attr->attr_value.icon); - p_value->len = 2; - break; + case GATT_UUID_GAP_ICON: + UINT16_TO_STREAM(p, p_db_attr->attr_value.icon); + p_value->len = 2; + break; - case GATT_UUID_GAP_PREF_CONN_PARAM: - UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_min); /* int_min */ - UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_max); /* int_max */ - UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.latency); /* latency */ - UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.sp_tout); /* sp_tout */ - p_value->len =8; - break; + case GATT_UUID_GAP_PREF_CONN_PARAM: + UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_min); /* int_min */ + UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_max); /* int_max */ + UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.latency); /* latency */ + UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.sp_tout); /* sp_tout */ + p_value->len = 8; + break; - /* address resolution */ - case GATT_UUID_GAP_CENTRAL_ADDR_RESOL: - UINT8_TO_STREAM(p, p_db_attr->attr_value.addr_resolution); - p_value->len =1; - break; + /* address resolution */ + case GATT_UUID_GAP_CENTRAL_ADDR_RESOL: + UINT8_TO_STREAM(p, p_db_attr->attr_value.addr_resolution); + p_value->len = 1; + break; } return GATT_SUCCESS; } @@ -280,8 +269,9 @@ tGATT_STATUS gap_proc_read (tGATTS_REQ_TYPE type, tGATT_READ_REQ *p_data, tGATTS tGATT_STATUS status = GATT_NO_RESOURCES; UNUSED(type); - if (p_data->is_long) + if (p_data->is_long) { p_rsp->attr_value.offset = p_data->offset; + } p_rsp->attr_value.handle = p_data->handle; @@ -305,11 +295,9 @@ UINT8 gap_proc_write_req( tGATTS_REQ_TYPE type, tGATT_WRITE_REQ *p_data) UINT8 i; UNUSED(type); - for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) - { - if (p_data-> handle == p_db_attr->handle) - { - return GATT_WRITE_NOT_PERMIT; + for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) { + if (p_data-> handle == p_db_attr->handle) { + return GATT_WRITE_NOT_PERMIT; } } return GATT_NOT_FOUND; @@ -336,36 +324,37 @@ void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, memset(&rsp_msg, 0, sizeof(tGATTS_RSP)); - switch (type) - { - case GATTS_REQ_TYPE_READ: - status = gap_proc_read(type, &p_data->read_req, &rsp_msg); - break; + switch (type) { + case GATTS_REQ_TYPE_READ: + status = gap_proc_read(type, &p_data->read_req, &rsp_msg); + break; - case GATTS_REQ_TYPE_WRITE: - if (!p_data->write_req.need_rsp) - ignore = TRUE; - - status = gap_proc_write_req(type, &p_data->write_req); - break; - - case GATTS_REQ_TYPE_WRITE_EXEC: + case GATTS_REQ_TYPE_WRITE: + if (!p_data->write_req.need_rsp) { ignore = TRUE; - GAP_TRACE_EVENT("Ignore GATTS_REQ_TYPE_WRITE_EXEC" ); - break; + } - case GATTS_REQ_TYPE_MTU: - GAP_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu); - ignore = TRUE; - break; + status = gap_proc_write_req(type, &p_data->write_req); + break; - default: - GAP_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type); - break; + case GATTS_REQ_TYPE_WRITE_EXEC: + ignore = TRUE; + GAP_TRACE_EVENT("Ignore GATTS_REQ_TYPE_WRITE_EXEC" ); + break; + + case GATTS_REQ_TYPE_MTU: + GAP_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu); + ignore = TRUE; + break; + + default: + GAP_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type); + break; } - if (!ignore) + if (!ignore) { GATTS_SendRsp (conn_id, trans_id, status, &rsp_msg); + } } /******************************************************************************* @@ -379,8 +368,8 @@ void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, *******************************************************************************/ void gap_attr_db_init(void) { - tBT_UUID app_uuid = {LEN_UUID_128,{0}}; - tBT_UUID uuid = {LEN_UUID_16,{UUID_SERVCLASS_GAP_SERVER}}; + tBT_UUID app_uuid = {LEN_UUID_128, {0}}; + tBT_UUID uuid = {LEN_UUID_16, {UUID_SERVCLASS_GAP_SERVER}}; UINT16 service_handle; tGAP_ATTR *p_db_attr = &gap_cb.gatt_attr[0]; tGATT_STATUS status; @@ -409,9 +398,9 @@ void gap_attr_db_init(void) */ uuid.uu.uuid16 = p_db_attr->uuid = GATT_UUID_GAP_ICON; p_db_attr->handle = GATTS_AddCharacteristic(service_handle, - &uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ); + &uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ); p_db_attr ++; #if ((defined BTM_PERIPHERAL_ENABLED) && (BTM_PERIPHERAL_ENABLED == TRUE)) @@ -424,9 +413,9 @@ void gap_attr_db_init(void) p_db_attr->attr_value.conn_param.latency = GAP_PREFER_CONN_LATENCY; /* 0 */ p_db_attr->attr_value.conn_param.sp_tout = GAP_PREFER_CONN_SP_TOUT; /* 2000 */ p_db_attr->handle = GATTS_AddCharacteristic(service_handle, - &uuid, - GATT_PERM_READ, - GATT_CHAR_PROP_BIT_READ); + &uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ); p_db_attr ++; #endif @@ -434,7 +423,7 @@ void gap_attr_db_init(void) uuid.len = LEN_UUID_16; uuid.uu.uuid16 = p_db_attr->uuid = GATT_UUID_GAP_CENTRAL_ADDR_RESOL; p_db_attr->handle = GATTS_AddCharacteristic(service_handle, &uuid, - GATT_PERM_READ, GATT_CHAR_PROP_BIT_READ); + GATT_PERM_READ, GATT_CHAR_PROP_BIT_READ); p_db_attr->attr_value.addr_resolution = 0; p_db_attr++; @@ -444,7 +433,7 @@ void gap_attr_db_init(void) status = GATTS_StartService(gap_cb.gatt_if, service_handle, GAP_TRANSPORT_SUPPORTED ); GAP_TRACE_EVENT ("GAP App gatt_if: %d s_hdl = %d start_status=%d", - gap_cb.gatt_if, service_handle, status); + gap_cb.gatt_if, service_handle, status); @@ -466,14 +455,11 @@ void GAP_BleAttrDBUpdate(UINT16 attr_uuid, tGAP_BLE_ATTR_VALUE *p_value) GAP_TRACE_EVENT("GAP_BleAttrDBUpdate attr_uuid=0x%04x\n", attr_uuid); - for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) - { - if (p_db_attr->uuid == attr_uuid) - { + for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++) { + if (p_db_attr->uuid == attr_uuid) { GAP_TRACE_EVENT("Found attr_uuid=0x%04x\n", attr_uuid); - switch (attr_uuid) - { + switch (attr_uuid) { case GATT_UUID_GAP_ICON: p_db_attr->attr_value.icon = p_value->icon; break; @@ -514,8 +500,7 @@ BOOLEAN gap_ble_send_cl_read_request(tGAP_CLCB *p_clcb) UINT16 uuid = 0; BOOLEAN started = FALSE; - if (gap_ble_dequeue_request(p_clcb, &uuid, &p_clcb->p_cback)) - { + if (gap_ble_dequeue_request(p_clcb, &uuid, &p_clcb->p_cback)) { memset(¶m, 0, sizeof(tGATT_READ_PARAM)); param.service.uuid.len = LEN_UUID_16; @@ -524,8 +509,7 @@ BOOLEAN gap_ble_send_cl_read_request(tGAP_CLCB *p_clcb) param.service.e_handle = 0xFFFF; param.service.auth_req = 0; - if (GATTC_Read(p_clcb->conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS) - { + if (GATTC_Read(p_clcb->conn_id, GATT_READ_BY_TYPE, ¶m) == GATT_SUCCESS) { p_clcb->cl_op_uuid = uuid; started = TRUE; } @@ -551,19 +535,16 @@ void gap_ble_cl_op_cmpl(tGAP_CLCB *p_clcb, BOOLEAN status, UINT16 len, UINT8 *p_ GAP_TRACE_EVENT("gap_ble_cl_op_cmpl status: %d", status); p_clcb->cl_op_uuid = 0; - p_clcb->p_cback=NULL; + p_clcb->p_cback = NULL; - if (p_cback && op) - { + if (p_cback && op) { GAP_TRACE_EVENT("calling gap_ble_cl_op_cmpl"); (* p_cback)(status, p_clcb->bda, len, (char *)p_name); } /* if no further activity is requested in callback, drop the link */ - if (p_clcb->connected) - { - if (!gap_ble_send_cl_read_request(p_clcb)) - { + if (p_clcb->connected) { + if (!gap_ble_send_cl_read_request(p_clcb)) { GATT_Disconnect(p_clcb->conn_id); gap_ble_dealloc_clcb(p_clcb); } @@ -588,17 +569,13 @@ static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_ UNUSED(gatt_if); UNUSED(transport); - if (p_clcb != NULL) - { - if (connected) - { + if (p_clcb != NULL) { + if (connected) { p_clcb->conn_id = conn_id; p_clcb->connected = TRUE; /* start operation is pending */ gap_ble_send_cl_read_request(p_clcb); - } - else - { + } else { p_clcb->connected = FALSE; gap_ble_cl_op_cmpl(p_clcb, FALSE, 0, NULL); /* clean up clcb */ @@ -625,51 +602,52 @@ static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS UINT16 len; UINT8 *pp; - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } op_type = p_clcb->cl_op_uuid; GAP_TRACE_EVENT ("gap_ble_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x read_type: 0x%04x\n", op, status, op_type); /* Currently we only issue read commands */ - if (op != GATTC_OPTYPE_READ) + if (op != GATTC_OPTYPE_READ) { return; + } - if (status != GATT_SUCCESS) - { + if (status != GATT_SUCCESS) { gap_ble_cl_op_cmpl(p_clcb, FALSE, 0, NULL); return; } pp = p_data->att_value.value; - switch (op_type) - { - case GATT_UUID_GAP_PREF_CONN_PARAM: - GAP_TRACE_EVENT ("GATT_UUID_GAP_PREF_CONN_PARAM"); - /* Extract the peripheral preferred connection parameters and save them */ + switch (op_type) { + case GATT_UUID_GAP_PREF_CONN_PARAM: + GAP_TRACE_EVENT ("GATT_UUID_GAP_PREF_CONN_PARAM"); + /* Extract the peripheral preferred connection parameters and save them */ - STREAM_TO_UINT16 (min, pp); - STREAM_TO_UINT16 (max, pp); - STREAM_TO_UINT16 (latency, pp); - STREAM_TO_UINT16 (tout, pp); + STREAM_TO_UINT16 (min, pp); + STREAM_TO_UINT16 (max, pp); + STREAM_TO_UINT16 (latency, pp); + STREAM_TO_UINT16 (tout, pp); - BTM_BleSetPrefConnParams (p_clcb->bda, min, max, latency, tout); - /* release the connection here */ - gap_ble_cl_op_cmpl(p_clcb, TRUE, 0, NULL); - break; + BTM_BleSetPrefConnParams (p_clcb->bda, min, max, latency, tout); + /* release the connection here */ + gap_ble_cl_op_cmpl(p_clcb, TRUE, 0, NULL); + break; - case GATT_UUID_GAP_DEVICE_NAME: - GAP_TRACE_EVENT ("GATT_UUID_GAP_DEVICE_NAME\n"); - len = (UINT16)strlen((char *)pp); - if (len > GAP_CHAR_DEV_NAME_SIZE) - len = GAP_CHAR_DEV_NAME_SIZE; - gap_ble_cl_op_cmpl(p_clcb, TRUE, len, pp); - break; + case GATT_UUID_GAP_DEVICE_NAME: + GAP_TRACE_EVENT ("GATT_UUID_GAP_DEVICE_NAME\n"); + len = (UINT16)strlen((char *)pp); + if (len > GAP_CHAR_DEV_NAME_SIZE) { + len = GAP_CHAR_DEV_NAME_SIZE; + } + gap_ble_cl_op_cmpl(p_clcb, TRUE, len, pp); + break; - case GATT_UUID_GAP_CENTRAL_ADDR_RESOL: - gap_ble_cl_op_cmpl(p_clcb, TRUE, 1, pp); - break; + case GATT_UUID_GAP_CENTRAL_ADDR_RESOL: + gap_ble_cl_op_cmpl(p_clcb, TRUE, 1, pp); + break; } } @@ -688,39 +666,41 @@ BOOLEAN gap_ble_accept_cl_operation(BD_ADDR peer_bda, UINT16 uuid, tGAP_BLE_CMPL tGAP_CLCB *p_clcb; BOOLEAN started = FALSE; - if (p_cback == NULL && uuid != GATT_UUID_GAP_PREF_CONN_PARAM) - return(started); + if (p_cback == NULL && uuid != GATT_UUID_GAP_PREF_CONN_PARAM) { + return (started); + } - if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL) - { - if ((p_clcb = gap_clcb_alloc(peer_bda)) == NULL) - { + if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL) { + if ((p_clcb = gap_clcb_alloc(peer_bda)) == NULL) { GAP_TRACE_ERROR("gap_ble_accept_cl_operation max connection reached"); return started; } } GAP_TRACE_EVENT ("%s() - BDA: %08x%04x cl_op_uuid: 0x%04x", - __FUNCTION__, - (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], - (peer_bda[4]<<8)+peer_bda[5], uuid); + __FUNCTION__, + (peer_bda[0] << 24) + (peer_bda[1] << 16) + (peer_bda[2] << 8) + peer_bda[3], + (peer_bda[4] << 8) + peer_bda[5], uuid); - if (GATT_GetConnIdIfConnected(gap_cb.gatt_if, peer_bda, &p_clcb->conn_id, BT_TRANSPORT_LE)) + if (GATT_GetConnIdIfConnected(gap_cb.gatt_if, peer_bda, &p_clcb->conn_id, BT_TRANSPORT_LE)) { p_clcb->connected = TRUE; + } /* hold the link here */ - if (!GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE)) + if (!GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE)) { return started; + } /* enqueue the request */ gap_ble_enqueue_request(p_clcb, uuid, p_cback); - if (p_clcb->connected && p_clcb->cl_op_uuid == 0) + if (p_clcb->connected && p_clcb->cl_op_uuid == 0) { started = gap_ble_send_cl_read_request(p_clcb); - else /* wait for connection up or pending operation to finish */ + } else { /* wait for connection up or pending operation to finish */ started = TRUE; + } - return started; + return started; } /******************************************************************************* ** @@ -779,19 +759,16 @@ BOOLEAN GAP_BleCancelReadPeerDevName (BD_ADDR peer_bda) tGAP_CLCB *p_clcb = gap_find_clcb_by_bd_addr (peer_bda); GAP_TRACE_EVENT ("GAP_BleCancelReadPeerDevName() - BDA: %08x%04x cl_op_uuid: 0x%04x", - (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], - (peer_bda[4]<<8)+peer_bda[5], (p_clcb == NULL)? 0 : p_clcb->cl_op_uuid); + (peer_bda[0] << 24) + (peer_bda[1] << 16) + (peer_bda[2] << 8) + peer_bda[3], + (peer_bda[4] << 8) + peer_bda[5], (p_clcb == NULL) ? 0 : p_clcb->cl_op_uuid); - if (p_clcb == NULL) - { + if (p_clcb == NULL) { GAP_TRACE_ERROR ("Cannot cancel current op is not get dev name"); return FALSE; } - if (!p_clcb->connected) - { - if (!GATT_CancelConnect(gap_cb.gatt_if, peer_bda, TRUE)) - { + if (!p_clcb->connected) { + if (!GATT_CancelConnect(gap_cb.gatt_if, peer_bda, TRUE)) { GAP_TRACE_ERROR ("Cannot cancel where No connection id"); return FALSE; } @@ -799,7 +776,7 @@ BOOLEAN GAP_BleCancelReadPeerDevName (BD_ADDR peer_bda) gap_ble_cl_op_cmpl(p_clcb, FALSE, 0, NULL); - return(TRUE); + return (TRUE); } #endif /* BLE_INCLUDED */ diff --git a/components/bt/bluedroid/stack/gap/gap_conn.c b/components/bt/bluedroid/stack/gap/gap_conn.c old mode 100755 new mode 100644 index 213baa5f6..5ae8a81dc --- a/components/bt/bluedroid/stack/gap/gap_conn.c +++ b/components/bt/bluedroid/stack/gap/gap_conn.c @@ -132,55 +132,55 @@ UINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, GAP_TRACE_EVENT ("GAP_CONN - Open Request"); /* Allocate a new CCB. Return if none available. */ - if ((p_ccb = gap_allocate_ccb()) == NULL) + if ((p_ccb = gap_allocate_ccb()) == NULL) { return (GAP_INVALID_HANDLE); + } /* If caller specified a BD address, save it */ - if (p_rem_bda) - { + if (p_rem_bda) { /* the bd addr is not BT_BD_ANY, then a bd address was specified */ - if (memcmp (p_rem_bda, BT_BD_ANY, BD_ADDR_LEN)) + if (memcmp (p_rem_bda, BT_BD_ANY, BD_ADDR_LEN)) { p_ccb->rem_addr_specified = TRUE; + } memcpy (&p_ccb->rem_dev_address[0], p_rem_bda, BD_ADDR_LEN); - } - else if (!is_server) - { + } else if (!is_server) { /* remore addr is not specified and is not a server -> bad */ return (GAP_INVALID_HANDLE); } /* A client MUST have specified a bd addr to connect with */ - if (!p_ccb->rem_addr_specified && !is_server) - { + if (!p_ccb->rem_addr_specified && !is_server) { gap_release_ccb (p_ccb); GAP_TRACE_ERROR ("GAP ERROR: Client must specify a remote BD ADDR to connect to!"); return (GAP_INVALID_HANDLE); } /* Check if configuration was specified */ - if (p_cfg) + if (p_cfg) { p_ccb->cfg = *p_cfg; + } p_ccb->p_callback = p_cb; /* If originator, use a dynamic PSM */ #if ((defined AMP_INCLUDED) && (AMP_INCLUDED == TRUE)) - if (!is_server) + if (!is_server) { gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = NULL; - else + } else { gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = gap_connect_ind; + } #else - if (!is_server) + if (!is_server) { gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = NULL; - else + } else { gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = gap_connect_ind; + } #endif /* Register the PSM with L2CAP */ if ((p_ccb->psm = L2CA_REGISTER (psm, &gap_cb.conn.reg_info, - AMP_AUTOSWITCH_ALLOWED|AMP_USE_AMP_IF_POSSIBLE)) == 0) - { + AMP_AUTOSWITCH_ALLOWED | AMP_USE_AMP_IF_POSSIBLE)) == 0) { GAP_TRACE_ERROR ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm); gap_release_ccb (p_ccb); return (GAP_INVALID_HANDLE); @@ -189,17 +189,15 @@ UINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, /* Register with Security Manager for the specific security level */ p_ccb->service_id = service_id; if (!BTM_SetSecurityLevel ((UINT8)!is_server, p_serv_name, - p_ccb->service_id, security, p_ccb->psm, 0, 0)) - { + p_ccb->service_id, security, p_ccb->psm, 0, 0)) { GAP_TRACE_ERROR ("GAP_CONN - Security Error"); gap_release_ccb (p_ccb); return (GAP_INVALID_HANDLE); } /* Fill in eL2CAP parameter data */ - if( p_ccb->cfg.fcr_present ) - { - if(ertm_info == NULL) { + if ( p_ccb->cfg.fcr_present ) { + if (ertm_info == NULL) { p_ccb->ertm_info.preferred_mode = p_ccb->cfg.fcr.mode; p_ccb->ertm_info.user_rx_pool_id = GAP_DATA_POOL_ID; p_ccb->ertm_info.user_tx_pool_id = GAP_DATA_POOL_ID; @@ -211,19 +209,16 @@ UINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, } /* optional FCR channel modes */ - if(ertm_info != NULL) { + if (ertm_info != NULL) { p_ccb->ertm_info.allowed_modes = (chan_mode_mask) ? chan_mode_mask : (UINT8)L2CAP_FCR_CHAN_OPT_BASIC; } - if (is_server) - { + if (is_server) { p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; /* assume btm/l2cap would handle it */ p_ccb->con_state = GAP_CCB_STATE_LISTENING; return (p_ccb->gap_handle); - } - else - { + } else { /* We are the originator of this connection */ p_ccb->con_flags = GAP_CCB_FLAGS_IS_ORIG; @@ -231,17 +226,15 @@ UINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, p_ccb->con_state = GAP_CCB_STATE_CONN_SETUP; /* mark security done flag, when security is not required */ - if ((security & (BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT) ) == 0) + if ((security & (BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT) ) == 0) { p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; + } /* Check if L2CAP started the connection process */ - if (p_rem_bda && ((cid = L2CA_CONNECT_REQ (p_ccb->psm, p_rem_bda, &p_ccb->ertm_info, &bt_uuid)) != 0)) - { + if (p_rem_bda && ((cid = L2CA_CONNECT_REQ (p_ccb->psm, p_rem_bda, &p_ccb->ertm_info, &bt_uuid)) != 0)) { p_ccb->connection_id = cid; return (p_ccb->gap_handle); - } - else - { + } else { gap_release_ccb (p_ccb); return (GAP_INVALID_HANDLE); } @@ -267,11 +260,11 @@ UINT16 GAP_ConnClose (UINT16 gap_handle) GAP_TRACE_EVENT ("GAP_CONN - close handle: 0x%x", gap_handle); - if (p_ccb) - { + if (p_ccb) { /* Check if we have a connection ID */ - if (p_ccb->con_state != GAP_CCB_STATE_LISTENING) + if (p_ccb->con_state != GAP_CCB_STATE_LISTENING) { L2CA_DISCONNECT_REQ (p_ccb->connection_id); + } gap_release_ccb (p_ccb); @@ -306,38 +299,34 @@ UINT16 GAP_ConnReadData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT1 BT_HDR *p_buf; UINT16 copy_len; - if (!p_ccb) + if (!p_ccb) { return (GAP_ERR_BAD_HANDLE); + } *p_len = 0; p_buf = (BT_HDR *)GKI_getfirst (&p_ccb->rx_queue); - if (!p_buf) + if (!p_buf) { return (GAP_NO_DATA_AVAIL); + } GKI_disable(); - while (max_len && p_buf) - { - copy_len = (p_buf->len > max_len)?max_len:p_buf->len; + while (max_len && p_buf) { + copy_len = (p_buf->len > max_len) ? max_len : p_buf->len; max_len -= copy_len; *p_len += copy_len; - if (p_data) - { + if (p_data) { memcpy (p_data, (UINT8 *)(p_buf + 1) + p_buf->offset, copy_len); p_data += copy_len; } - if (p_buf->len > copy_len) - { + if (p_buf->len > copy_len) { p_buf->offset += copy_len; p_buf->len -= copy_len; break; - } - else - { - if (max_len) - { + } else { + if (max_len) { p_buf = (BT_HDR *)GKI_getnext (p_buf); } GKI_freebuf (GKI_dequeue (&p_ccb->rx_queue)); @@ -349,7 +338,7 @@ UINT16 GAP_ConnReadData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT1 GKI_enable(); GAP_TRACE_EVENT ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d", - p_ccb->rx_queue_size, *p_len); + p_ccb->rx_queue_size, *p_len); return (BT_PASS); } @@ -371,22 +360,20 @@ int GAP_GetRxQueueCnt (UINT16 handle, UINT32 *p_rx_queue_count) int rc = BT_PASS; /* Check that handle is valid */ - if (handle < GAP_MAX_CONNECTIONS) - { + if (handle < GAP_MAX_CONNECTIONS) { p_ccb = &gap_cb.conn.ccb_pool[handle]; - if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) - { + if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) { *p_rx_queue_count = p_ccb->rx_queue_size; - } - else + } else { rc = GAP_INVALID_HANDLE; - } - else + } + } else { rc = GAP_INVALID_HANDLE; + } GAP_TRACE_EVENT ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d", - rc , *p_rx_queue_count); + rc , *p_rx_queue_count); return (rc); } @@ -411,20 +398,18 @@ UINT16 GAP_ConnBTRead (UINT16 gap_handle, BT_HDR **pp_buf) tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); BT_HDR *p_buf; - if (!p_ccb) + if (!p_ccb) { return (GAP_ERR_BAD_HANDLE); + } p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->rx_queue); - if (p_buf) - { + if (p_buf) { *pp_buf = p_buf; p_ccb->rx_queue_size -= p_buf->len; return (BT_PASS); - } - else - { + } else { *pp_buf = NULL; return (GAP_NO_DATA_AVAIL); } @@ -449,28 +434,24 @@ UINT16 GAP_ConnBTWrite (UINT16 gap_handle, BT_HDR *p_buf) { tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); - if (!p_ccb) - { + if (!p_ccb) { GKI_freebuf (p_buf); return (GAP_ERR_BAD_HANDLE); } - if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) - { + if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) { GKI_freebuf (p_buf); return (GAP_ERR_BAD_STATE); } - if (p_buf->offset < L2CAP_MIN_OFFSET) - { + if (p_buf->offset < L2CAP_MIN_OFFSET) { GKI_freebuf (p_buf); return (GAP_ERR_BUF_OFFSET); } GKI_enqueue (&p_ccb->tx_queue, p_buf); - if (p_ccb->is_congested) - { + if (p_ccb->is_congested) { return (BT_PASS); } @@ -478,17 +459,15 @@ UINT16 GAP_ConnBTWrite (UINT16 gap_handle, BT_HDR *p_buf) #if (GAP_CONN_POST_EVT_INCLUDED == TRUE) gap_send_event (gap_handle); #else - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) - { + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) { UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); - if (status == L2CAP_DW_CONGESTED) - { + if (status == L2CAP_DW_CONGESTED) { p_ccb->is_congested = TRUE; break; - } - else if (status != L2CAP_DW_SUCCESS) + } else if (status != L2CAP_DW_SUCCESS) { return (GAP_ERR_BAD_STATE); + } } #endif return (BT_PASS); @@ -520,23 +499,23 @@ UINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT *p_len = 0; - if (!p_ccb) + if (!p_ccb) { return (GAP_ERR_BAD_HANDLE); + } - if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) + if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) { return (GAP_ERR_BAD_STATE); + } - while (max_len) - { - if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - { - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_tx_pool_id)) == NULL) + while (max_len) { + if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_tx_pool_id)) == NULL) { return (GAP_ERR_CONGESTED); - } - else - { - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (GAP_DATA_POOL_ID)) == NULL) + } + } else { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (GAP_DATA_POOL_ID)) == NULL) { return (GAP_ERR_CONGESTED); + } } p_buf->offset = L2CAP_MIN_OFFSET; @@ -554,8 +533,7 @@ UINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT GKI_enqueue (&p_ccb->tx_queue, p_buf); } - if (p_ccb->is_congested) - { + if (p_ccb->is_congested) { return (BT_PASS); } @@ -563,17 +541,15 @@ UINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT #if (GAP_CONN_POST_EVT_INCLUDED == TRUE) gap_send_event (gap_handle); #else - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) - { + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) { UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); - if (status == L2CAP_DW_CONGESTED) - { + if (status == L2CAP_DW_CONGESTED) { p_ccb->is_congested = TRUE; break; - } - else if (status != L2CAP_DW_SUCCESS) + } else if (status != L2CAP_DW_SUCCESS) { return (GAP_ERR_BAD_STATE); + } } #endif return (BT_PASS); @@ -597,13 +573,15 @@ UINT16 GAP_ConnReconfig (UINT16 gap_handle, tL2CAP_CFG_INFO *p_cfg) { tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); - if (!p_ccb) + if (!p_ccb) { return (GAP_ERR_BAD_HANDLE); + } p_ccb->cfg = *p_cfg; - if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) + if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) { L2CA_CONFIG_REQ (p_ccb->connection_id, p_cfg); + } return (BT_PASS); } @@ -635,13 +613,15 @@ UINT16 GAP_ConnSetIdleTimeout (UINT16 gap_handle, UINT16 timeout) { tGAP_CCB *p_ccb; - if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) + if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) { return (GAP_ERR_BAD_HANDLE); + } - if (L2CA_SetIdleTimeout (p_ccb->connection_id, timeout, FALSE)) + if (L2CA_SetIdleTimeout (p_ccb->connection_id, timeout, FALSE)) { return (BT_PASS); - else + } else { return (GAP_ERR_BAD_HANDLE); + } } @@ -665,15 +645,12 @@ UINT8 *GAP_ConnGetRemoteAddr (UINT16 gap_handle) GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle); - if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING)) - { + if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING)) { GAP_TRACE_EVENT("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \ - p_ccb->rem_dev_address[0],p_ccb->rem_dev_address[1],p_ccb->rem_dev_address[2], - p_ccb->rem_dev_address[3],p_ccb->rem_dev_address[4],p_ccb->rem_dev_address[5]); + p_ccb->rem_dev_address[0], p_ccb->rem_dev_address[1], p_ccb->rem_dev_address[2], + p_ccb->rem_dev_address[3], p_ccb->rem_dev_address[4], p_ccb->rem_dev_address[5]); return (p_ccb->rem_dev_address); - } - else - { + } else { GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr return Error "); return (NULL); } @@ -695,8 +672,9 @@ UINT16 GAP_ConnGetRemMtuSize (UINT16 gap_handle) { tGAP_CCB *p_ccb; - if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) + if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) { return (0); + } return (p_ccb->rem_mtu_size); } @@ -717,8 +695,9 @@ UINT16 GAP_ConnGetL2CAPCid (UINT16 gap_handle) { tGAP_CCB *p_ccb; - if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) + if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) { return (0); + } return (p_ccb->connection_id); } @@ -742,17 +721,16 @@ static void gap_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UIN tBT_UUID bt_uuid = {2, {GAP_PROTOCOL_ID}}; /* See if we have a CCB listening for the connection */ - for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) - { + for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) { if ((p_ccb->con_state == GAP_CCB_STATE_LISTENING) - && (p_ccb->psm == psm) - && ((p_ccb->rem_addr_specified == FALSE) - || (!memcmp (bd_addr, p_ccb->rem_dev_address, BD_ADDR_LEN)))) + && (p_ccb->psm == psm) + && ((p_ccb->rem_addr_specified == FALSE) + || (!memcmp (bd_addr, p_ccb->rem_dev_address, BD_ADDR_LEN)))) { break; + } } - if (xx == GAP_MAX_CONNECTIONS) - { + if (xx == GAP_MAX_CONNECTIONS) { GAP_TRACE_WARNING("*******"); GAP_TRACE_WARNING("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting"); GAP_TRACE_WARNING("*******"); @@ -792,8 +770,7 @@ static void gap_checks_con_flags (tGAP_CCB *p_ccb) { GAP_TRACE_EVENT ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags); /* if all the required con_flags are set, report the OPEN event now */ - if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE) - { + if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE) { p_ccb->con_state = GAP_CCB_STATE_CONNECTED; p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_OPENED); @@ -817,17 +794,15 @@ static void gap_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, vo UNUSED (transport); GAP_TRACE_EVENT ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d", - p_ccb->con_state, p_ccb->con_flags, res); - if (p_ccb->con_state == GAP_CCB_STATE_IDLE) + p_ccb->con_state, p_ccb->con_flags, res); + if (p_ccb->con_state == GAP_CCB_STATE_IDLE) { return; + } - if (res == BTM_SUCCESS) - { + if (res == BTM_SUCCESS) { p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; gap_checks_con_flags (p_ccb); - } - else - { + } else { /* security failed - disconnect the channel */ L2CA_DISCONNECT_REQ (p_ccb->connection_id); } @@ -849,30 +824,28 @@ static void gap_connect_cfm (UINT16 l2cap_cid, UINT16 result) tGAP_CCB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) + if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) { return; + } /* initiate security process, if needed */ - if ( (p_ccb->con_flags & GAP_CCB_FLAGS_SEC_DONE) == 0) - { + if ( (p_ccb->con_flags & GAP_CCB_FLAGS_SEC_DONE) == 0) { btm_sec_mx_access_request (p_ccb->rem_dev_address, p_ccb->psm, TRUE, 0, 0, &gap_sec_check_complete, p_ccb); } /* If the connection response contains success status, then */ /* Transition to the next state and startup the timer. */ - if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == GAP_CCB_STATE_CONN_SETUP)) - { + if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == GAP_CCB_STATE_CONN_SETUP)) { p_ccb->con_state = GAP_CCB_STATE_CFG_SETUP; /* Send a Configuration Request. */ L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg); - } - else - { + } else { /* Tell the user if he has a callback */ - if (p_ccb->p_callback) + if (p_ccb->p_callback) { (*p_ccb->p_callback) (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); + } gap_release_ccb (p_ccb); } @@ -894,25 +867,24 @@ static void gap_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) UINT16 local_mtu_size; /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) + if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) { return; + } /* Remember the remote MTU size */ - if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - { + if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { local_mtu_size = GKI_get_pool_bufsize (p_ccb->ertm_info.user_tx_pool_id) - - sizeof(BT_HDR) - L2CAP_MIN_OFFSET; - } - else + - sizeof(BT_HDR) - L2CAP_MIN_OFFSET; + } else { local_mtu_size = L2CAP_MTU_SIZE; - - if ((!p_cfg->mtu_present)||(p_cfg->mtu > local_mtu_size)) - { - p_ccb->rem_mtu_size = local_mtu_size; } - else + + if ((!p_cfg->mtu_present) || (p_cfg->mtu > local_mtu_size)) { + p_ccb->rem_mtu_size = local_mtu_size; + } else { p_ccb->rem_mtu_size = p_cfg->mtu; + } /* For now, always accept configuration from the other side */ p_cfg->flush_to_present = FALSE; @@ -943,23 +915,22 @@ static void gap_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) tGAP_CCB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) + if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) { return; + } - if (p_cfg->result == L2CAP_CFG_OK) - { + if (p_cfg->result == L2CAP_CFG_OK) { p_ccb->con_flags |= GAP_CCB_FLAGS_MY_CFG_DONE; - if (p_ccb->cfg.fcr_present) + if (p_ccb->cfg.fcr_present) { p_ccb->cfg.fcr.mode = p_cfg->fcr.mode; - else + } else { p_ccb->cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; + } gap_checks_con_flags (p_ccb); - } - else - { + } else { p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); gap_release_ccb (p_ccb); } @@ -983,11 +954,13 @@ static void gap_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) + if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) { return; + } - if (ack_needed) + if (ack_needed) { L2CA_DISCONNECT_RSP (l2cap_cid); + } p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); gap_release_ccb (p_ccb); @@ -1008,14 +981,12 @@ static void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) tGAP_CCB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) { GKI_freebuf (p_msg); return; } - if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) - { + if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) { GKI_enqueue (&p_ccb->rx_queue, p_msg); p_ccb->rx_queue_size += p_msg->len; @@ -1025,9 +996,7 @@ static void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) */ p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_DATA_AVAIL); - } - else - { + } else { GKI_freebuf (p_msg); } } @@ -1049,30 +1018,28 @@ static void gap_congestion_ind (UINT16 lcid, BOOLEAN is_congested) UINT8 status; GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x", - is_congested, lcid); + is_congested, lcid); /* Find CCB based on CID */ - if ((p_ccb = gap_find_ccb_by_cid (lcid)) == NULL) + if ((p_ccb = gap_find_ccb_by_cid (lcid)) == NULL) { return; + } p_ccb->is_congested = is_congested; event = (is_congested) ? GAP_EVT_CONN_CONGESTED : GAP_EVT_CONN_UNCONGESTED; p_ccb->p_callback (p_ccb->gap_handle, event); - if (!is_congested) - { - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) - { + if (!is_congested) { + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) { status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); - if (status == L2CAP_DW_CONGESTED) - { + if (status == L2CAP_DW_CONGESTED) { p_ccb->is_congested = TRUE; break; - } - else if (status != L2CAP_DW_SUCCESS) + } else if (status != L2CAP_DW_SUCCESS) { break; + } } } } @@ -1094,10 +1061,10 @@ static tGAP_CCB *gap_find_ccb_by_cid (UINT16 cid) tGAP_CCB *p_ccb; /* Look through each connection control block */ - for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->connection_id == cid)) + for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) { + if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->connection_id == cid)) { return (p_ccb); + } } /* If here, not found */ @@ -1120,12 +1087,12 @@ static tGAP_CCB *gap_find_ccb_by_handle (UINT16 handle) tGAP_CCB *p_ccb; /* Check that handle is valid */ - if (handle < GAP_MAX_CONNECTIONS) - { + if (handle < GAP_MAX_CONNECTIONS) { p_ccb = &gap_cb.conn.ccb_pool[handle]; - if (p_ccb->con_state != GAP_CCB_STATE_IDLE) + if (p_ccb->con_state != GAP_CCB_STATE_IDLE) { return (p_ccb); + } } /* If here, handle points to invalid connection */ @@ -1148,10 +1115,8 @@ static tGAP_CCB *gap_allocate_ccb (void) tGAP_CCB *p_ccb; /* Look through each connection control block for a free one */ - for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if (p_ccb->con_state == GAP_CCB_STATE_IDLE) - { + for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) { + if (p_ccb->con_state == GAP_CCB_STATE_IDLE) { memset (p_ccb, 0, sizeof (tGAP_CCB)); p_ccb->gap_handle = xx; @@ -1184,19 +1149,21 @@ static void gap_release_ccb (tGAP_CCB *p_ccb) /* Drop any buffers we may be holding */ p_ccb->rx_queue_size = 0; - while (p_ccb->rx_queue._p_first) + while (p_ccb->rx_queue._p_first) { GKI_freebuf (GKI_dequeue (&p_ccb->rx_queue)); + } - while (p_ccb->tx_queue._p_first) + while (p_ccb->tx_queue._p_first) { GKI_freebuf (GKI_dequeue (&p_ccb->tx_queue)); + } p_ccb->con_state = GAP_CCB_STATE_IDLE; /* If no-one else is using the PSM, deregister from L2CAP */ - for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->psm == psm)) + for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) { + if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->psm == psm)) { return; + } } /* Free the security record for this PSM */ @@ -1219,17 +1186,14 @@ void gap_send_event (UINT16 gap_handle) { BT_HDR *p_msg; - if ((p_msg = (BT_HDR*)GKI_getbuf(BT_HDR_SIZE)) != NULL) - { + if ((p_msg = (BT_HDR *)GKI_getbuf(BT_HDR_SIZE)) != NULL) { p_msg->event = BT_EVT_TO_GAP_MSG; p_msg->len = 0; p_msg->offset = 0; p_msg->layer_specific = gap_handle; GKI_send_msg(BTU_TASK, BTU_HCI_RCV_MBOX, p_msg); - } - else - { + } else { GAP_TRACE_ERROR("Unable to allocate message buffer for event."); } } @@ -1249,34 +1213,29 @@ void gap_proc_btu_event(BT_HDR *p_msg) UINT8 status; BT_HDR *p_buf; - if (!p_ccb) - { + if (!p_ccb) { return; } - if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) - { + if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) { return; } - if (p_ccb->is_congested) - { + if (p_ccb->is_congested) { return; } /* Send the buffer through L2CAP */ - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) - { + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) { status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); - if (status == L2CAP_DW_CONGESTED) - { + if (status == L2CAP_DW_CONGESTED) { p_ccb->is_congested = TRUE; break; - } - else if (status != L2CAP_DW_SUCCESS) + } else if (status != L2CAP_DW_SUCCESS) { break; + } } } diff --git a/components/bt/bluedroid/stack/gap/gap_utils.c b/components/bt/bluedroid/stack/gap/gap_utils.c old mode 100755 new mode 100644 index 16f157107..d441fa11e --- a/components/bt/bluedroid/stack/gap/gap_utils.c +++ b/components/bt/bluedroid/stack/gap/gap_utils.c @@ -35,10 +35,8 @@ tGAP_INFO *gap_allocate_cb (void) tGAP_INFO *p_cb = &gap_cb.blk[0]; UINT8 x; - for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++) - { - if (!p_cb->in_use) - { + for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++) { + if (!p_cb->in_use) { memset (p_cb, 0, sizeof (tGAP_INFO)); p_cb->in_use = TRUE; @@ -64,8 +62,7 @@ tGAP_INFO *gap_allocate_cb (void) *******************************************************************************/ void gap_free_cb (tGAP_INFO *p_cb) { - if (p_cb) - { + if (p_cb) { p_cb->gap_cback = NULL; p_cb->in_use = FALSE; } @@ -89,10 +86,10 @@ BOOLEAN gap_is_service_busy (UINT16 request) tGAP_INFO *p_cb = &gap_cb.blk[0]; UINT8 x; - for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++) - { - if (p_cb->in_use && p_cb->event == request) + for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++) { + if (p_cb->in_use && p_cb->event == request) { return (TRUE); + } } /* If here, service is not busy */ @@ -112,8 +109,7 @@ BOOLEAN gap_is_service_busy (UINT16 request) *******************************************************************************/ UINT16 gap_convert_btm_status (tBTM_STATUS btm_status) { - switch (btm_status) - { + switch (btm_status) { case BTM_SUCCESS: return (BT_PASS); diff --git a/components/bt/bluedroid/stack/gap/include/gap_int.h b/components/bt/bluedroid/stack/gap/include/gap_int.h old mode 100755 new mode 100644 index 36064c657..fbddf67c9 --- a/components/bt/bluedroid/stack/gap/include/gap_int.h +++ b/components/bt/bluedroid/stack/gap/include/gap_int.h @@ -26,8 +26,7 @@ #include "gatt_api.h" #define GAP_MAX_BLOCKS 2 /* Concurrent GAP commands pending at a time*/ /* Define the Generic Access Profile control structure */ -typedef struct -{ +typedef struct { void *p_data; /* Pointer to any data returned in callback */ tGAP_CALLBACK *gap_cback; /* Pointer to users callback function */ tGAP_CALLBACK *gap_inq_rslt_cback; /* Used for inquiry results */ @@ -37,8 +36,7 @@ typedef struct } tGAP_INFO; /* Define the control block for the FindAddrByName operation (Only 1 active at a time) */ -typedef struct -{ +typedef struct { tGAP_CALLBACK *p_cback; tBTM_INQ_INFO *p_cur_inq; /* Pointer to the current inquiry database entry */ tGAP_FINDADDR_RESULTS results; @@ -47,8 +45,7 @@ typedef struct /* Define the GAP Connection Control Block. */ -typedef struct -{ +typedef struct { #define GAP_CCB_STATE_IDLE 0 #define GAP_CCB_STATE_LISTENING 1 #define GAP_CCB_STATE_CONN_SETUP 2 @@ -85,8 +82,7 @@ typedef struct tL2CAP_ERTM_INFO ertm_info; /* Pools and modes for ertm */ } tGAP_CCB; -typedef struct -{ +typedef struct { #if ((defined AMP_INCLUDED) && (AMP_INCLUDED == TRUE)) tAMP_APPL_INFO reg_info; #else @@ -99,12 +95,11 @@ typedef struct #if BLE_INCLUDED == TRUE #define GAP_MAX_CHAR_NUM 4 -typedef struct -{ +typedef struct { UINT16 handle; UINT16 uuid; tGAP_BLE_ATTR_VALUE attr_value; -}tGAP_ATTR; +} tGAP_ATTR; #endif /********************************************************************** ** M A I N C O N T R O L B L O C K @@ -112,14 +107,12 @@ typedef struct #define GAP_MAX_CL GATT_CL_MAX_LCB -typedef struct -{ +typedef struct { UINT16 uuid; tGAP_BLE_CMPL_CBACK *p_cback; } tGAP_BLE_REQ; -typedef struct -{ +typedef struct { BD_ADDR bda; tGAP_BLE_CMPL_CBACK *p_cback; UINT16 conn_id; @@ -128,10 +121,9 @@ typedef struct BOOLEAN connected; BUFFER_Q pending_req_q; -}tGAP_CLCB; +} tGAP_CLCB; -typedef struct -{ +typedef struct { tGAP_INFO blk[GAP_MAX_BLOCKS]; tBTM_CMPL_CB *btm_cback[GAP_MAX_BLOCKS]; UINT8 trace_level; @@ -153,10 +145,10 @@ typedef struct extern tGAP_CB gap_cb; #if (GAP_CONN_INCLUDED == TRUE) - extern void gap_conn_init(void); +extern void gap_conn_init(void); #endif #if (BLE_INCLUDED == TRUE) - extern void gap_attr_db_init(void); +extern void gap_attr_db_init(void); #endif #endif diff --git a/components/bt/bluedroid/stack/gatt/att_protocol.c b/components/bt/bluedroid/stack/gatt/att_protocol.c old mode 100755 new mode 100644 index 00512e2c9..48ccfd49d --- a/components/bt/bluedroid/stack/gatt/att_protocol.c +++ b/components/bt/bluedroid/stack/gatt/att_protocol.c @@ -48,8 +48,7 @@ BT_HDR *attp_build_mtu_cmd(UINT8 op_code, UINT16 rx_mtu) BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + GATT_HDR_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + GATT_HDR_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, op_code); @@ -74,8 +73,7 @@ BT_HDR *attp_build_exec_write_cmd (UINT8 op_code, UINT8 flag) BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_BUF_POOL_ID)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_BUF_POOL_ID)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; p_buf->offset = L2CAP_MIN_OFFSET; @@ -83,8 +81,7 @@ BT_HDR *attp_build_exec_write_cmd (UINT8 op_code, UINT8 flag) UINT8_TO_STREAM (p, op_code); - if (op_code == GATT_REQ_EXEC_WRITE) - { + if (op_code == GATT_REQ_EXEC_WRITE) { flag &= GATT_PREP_WRITE_EXEC; UINT8_TO_STREAM (p, flag); p_buf->len += 1; @@ -109,8 +106,7 @@ BT_HDR *attp_build_err_cmd(UINT8 cmd_code, UINT16 err_handle, UINT8 reason) BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + 5)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + 5)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, GATT_RSP_ERROR); @@ -138,8 +134,7 @@ BT_HDR *attp_build_browse_cmd(UINT8 op_code, UINT16 s_hdl, UINT16 e_hdl, tBT_UUI BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 8 + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 8 + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; /* Describe the built message location and size */ p_buf->offset = L2CAP_MIN_OFFSET; @@ -168,8 +163,7 @@ BT_HDR *attp_build_read_by_type_value_cmd (UINT16 payload_size, tGATT_FIND_TYPE_ UINT8 *p; UINT16 len = p_value_type->value_len; - if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; p_buf->offset = L2CAP_MIN_OFFSET; @@ -181,8 +175,9 @@ BT_HDR *attp_build_read_by_type_value_cmd (UINT16 payload_size, tGATT_FIND_TYPE_ p_buf->len += gatt_build_uuid_to_stream(&p, p_value_type->uuid); - if (p_value_type->value_len + p_buf->len > payload_size ) + if (p_value_type->value_len + p_buf->len > payload_size ) { len = payload_size - p_buf->len; + } memcpy (p, p_value_type->value, len); p_buf->len += len; @@ -204,8 +199,7 @@ BT_HDR *attp_build_read_multi_cmd(UINT16 payload_size, UINT16 num_handle, UINT16 BT_HDR *p_buf = NULL; UINT8 *p, i = 0; - if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + num_handle * 2 + 1 + L2CAP_MIN_OFFSET))) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + num_handle * 2 + 1 + L2CAP_MIN_OFFSET))) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; p_buf->offset = L2CAP_MIN_OFFSET; @@ -213,8 +207,7 @@ BT_HDR *attp_build_read_multi_cmd(UINT16 payload_size, UINT16 num_handle, UINT16 UINT8_TO_STREAM (p, GATT_REQ_READ_MULTI); - for (i = 0; i < num_handle && p_buf->len + 2 <= payload_size; i ++) - { + for (i = 0; i < num_handle && p_buf->len + 2 <= payload_size; i ++) { UINT16_TO_STREAM (p, *(p_handle + i)); p_buf->len += 2; } @@ -236,8 +229,7 @@ BT_HDR *attp_build_handle_cmd(UINT8 op_code, UINT16 handle, UINT16 offset) BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 5 + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 5 + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; p_buf->offset = L2CAP_MIN_OFFSET; @@ -248,8 +240,7 @@ BT_HDR *attp_build_handle_cmd(UINT8 op_code, UINT16 handle, UINT16 offset) UINT16_TO_STREAM (p, handle); p_buf->len += 2; - if (op_code == GATT_REQ_READ_BLOB) - { + if (op_code == GATT_REQ_READ_BLOB) { UINT16_TO_STREAM (p, offset); p_buf->len += 2; } @@ -272,8 +263,7 @@ BT_HDR *attp_build_opcode_cmd(UINT8 op_code) BT_HDR *p_buf = NULL; UINT8 *p; - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 1 + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 1 + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; p_buf->offset = L2CAP_MIN_OFFSET; @@ -298,42 +288,37 @@ BT_HDR *attp_build_value_cmd (UINT16 payload_size, UINT8 op_code, UINT16 handle, BT_HDR *p_buf = NULL; UINT8 *p, *pp, pair_len, *p_pair_len; - if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) - { - p = pp =(UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; + if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET))) != NULL) { + p = pp = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, op_code); p_buf->offset = L2CAP_MIN_OFFSET; p_buf->len = 1; - if (op_code == GATT_RSP_READ_BY_TYPE) - { + if (op_code == GATT_RSP_READ_BY_TYPE) { p_pair_len = p; pair_len = len + 2; UINT8_TO_STREAM (p, pair_len); p_buf->len += 1; } - if (op_code != GATT_RSP_READ_BLOB && op_code != GATT_RSP_READ) - { + if (op_code != GATT_RSP_READ_BLOB && op_code != GATT_RSP_READ) { UINT16_TO_STREAM (p, handle); p_buf->len += 2; } - if (op_code == GATT_REQ_PREPARE_WRITE ||op_code == GATT_RSP_PREPARE_WRITE ) - { + if (op_code == GATT_REQ_PREPARE_WRITE || op_code == GATT_RSP_PREPARE_WRITE ) { UINT16_TO_STREAM (p, offset); p_buf->len += 2; } - if (len > 0 && p_data != NULL) - { + if (len > 0 && p_data != NULL) { /* ensure data not exceed MTU size */ - if (payload_size - p_buf->len < len) - { + if (payload_size - p_buf->len < len) { len = payload_size - p_buf->len; /* update handle value pair length */ - if (op_code == GATT_RSP_READ_BY_TYPE) + if (op_code == GATT_RSP_READ_BY_TYPE) { *p_pair_len = (len + 2); + } GATT_TRACE_WARNING("attribute value too long, to be truncated to %d", len); } @@ -357,19 +342,17 @@ tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP) UINT16 l2cap_ret; - if (p_tcb->att_lcid == L2CAP_ATT_CID) + if (p_tcb->att_lcid == L2CAP_ATT_CID) { l2cap_ret = L2CA_SendFixedChnlData (L2CAP_ATT_CID, p_tcb->peer_bda, p_toL2CAP); - else + } else { l2cap_ret = (UINT16) L2CA_DataWrite (p_tcb->att_lcid, p_toL2CAP); - - if (l2cap_ret == L2CAP_DW_FAILED) - { - GATT_TRACE_ERROR("ATT failed to pass msg:0x%0x to L2CAP", - *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset)); - return GATT_INTERNAL_ERROR; } - else if (l2cap_ret == L2CAP_DW_CONGESTED) - { + + if (l2cap_ret == L2CAP_DW_FAILED) { + GATT_TRACE_ERROR("ATT failed to pass msg:0x%0x to L2CAP", + *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset)); + return GATT_INTERNAL_ERROR; + } else if (l2cap_ret == L2CAP_DW_CONGESTED) { GATT_TRACE_DEBUG("ATT congested, message accepted"); return GATT_CONGESTED; } @@ -388,16 +371,15 @@ BT_HDR *attp_build_sr_msg(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_SR_MSG *p_msg) BT_HDR *p_cmd = NULL; UINT16 offset = 0; - switch (op_code) - { + switch (op_code) { case GATT_RSP_READ_BLOB: case GATT_RSP_PREPARE_WRITE: GATT_TRACE_EVENT ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d", - p_msg->attr_value.len, p_msg->attr_value.offset); + p_msg->attr_value.len, p_msg->attr_value.offset); offset = p_msg->attr_value.offset; -/* Coverity: [FALSE-POSITIVE error] intended fall through */ -/* Missing break statement between cases in switch statement */ - /* fall through */ + /* Coverity: [FALSE-POSITIVE error] intended fall through */ + /* Missing break statement between cases in switch statement */ + /* fall through */ case GATT_RSP_READ_BY_TYPE: case GATT_RSP_READ: case GATT_HANDLE_VALUE_NOTIF: @@ -431,8 +413,9 @@ BT_HDR *attp_build_sr_msg(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_SR_MSG *p_msg) break; } - if (!p_cmd) + if (!p_cmd) { GATT_TRACE_ERROR("No resources"); + } return p_cmd; } @@ -455,10 +438,8 @@ tGATT_STATUS attp_send_sr_msg (tGATT_TCB *p_tcb, BT_HDR *p_msg) { tGATT_STATUS cmd_sent = GATT_NO_RESOURCES; - if (p_tcb != NULL) - { - if (p_msg != NULL) - { + if (p_tcb != NULL) { + if (p_msg != NULL) { p_msg->offset = L2CAP_MIN_OFFSET; cmd_sent = attp_send_msg_to_l2cap (p_tcb, p_msg); } @@ -482,35 +463,29 @@ tGATT_STATUS attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, { tGATT_STATUS att_ret = GATT_SUCCESS; - if (p_tcb != NULL) - { + if (p_tcb != NULL) { cmd_code &= ~GATT_AUTH_SIGN_MASK; /* no pending request or value confirmation */ if (p_tcb->pending_cl_req == p_tcb->next_slot_inq || - cmd_code == GATT_HANDLE_VALUE_CONF) - { + cmd_code == GATT_HANDLE_VALUE_CONF) { att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd); - if (att_ret == GATT_CONGESTED || att_ret == GATT_SUCCESS) - { + if (att_ret == GATT_CONGESTED || att_ret == GATT_SUCCESS) { /* do not enq cmd if handle value confirmation or set request */ - if (cmd_code != GATT_HANDLE_VALUE_CONF && cmd_code != GATT_CMD_WRITE) - { + if (cmd_code != GATT_HANDLE_VALUE_CONF && cmd_code != GATT_CMD_WRITE) { gatt_start_rsp_timer (clcb_idx); gatt_cmd_enq(p_tcb, clcb_idx, FALSE, cmd_code, NULL); } - } - else + } else { att_ret = GATT_INTERNAL_ERROR; - } - else - { + } + } else { att_ret = GATT_CMD_STARTED; gatt_cmd_enq(p_tcb, clcb_idx, TRUE, cmd_code, p_cmd); } - } - else + } else { att_ret = GATT_ERROR; + } return att_ret; } @@ -536,48 +511,43 @@ tGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, BT_HDR *p_cmd = NULL; UINT16 offset = 0, handle; - if (p_tcb != NULL) - { - switch (op_code) - { + if (p_tcb != NULL) { + switch (op_code) { case GATT_REQ_MTU: - if (p_msg->mtu <= GATT_MAX_MTU_SIZE) - { + if (p_msg->mtu <= GATT_MAX_MTU_SIZE) { p_tcb->payload_size = p_msg->mtu; p_cmd = attp_build_mtu_cmd(GATT_REQ_MTU, p_msg->mtu); - } - else + } else { status = GATT_ILLEGAL_PARAMETER; + } break; case GATT_REQ_FIND_INFO: case GATT_REQ_READ_BY_TYPE: case GATT_REQ_READ_BY_GRP_TYPE: if (GATT_HANDLE_IS_VALID (p_msg->browse.s_handle) && - GATT_HANDLE_IS_VALID (p_msg->browse.e_handle) && - p_msg->browse.s_handle <= p_msg->browse.e_handle) - { + GATT_HANDLE_IS_VALID (p_msg->browse.e_handle) && + p_msg->browse.s_handle <= p_msg->browse.e_handle) { p_cmd = attp_build_browse_cmd(op_code, - p_msg->browse.s_handle, - p_msg->browse.e_handle, - p_msg->browse.uuid); - } - else + p_msg->browse.s_handle, + p_msg->browse.e_handle, + p_msg->browse.uuid); + } else { status = GATT_ILLEGAL_PARAMETER; + } break; case GATT_REQ_READ_BLOB: offset = p_msg->read_blob.offset; - /* fall through */ + /* fall through */ case GATT_REQ_READ: - handle = (op_code == GATT_REQ_READ) ? p_msg->handle: p_msg->read_blob.handle; + handle = (op_code == GATT_REQ_READ) ? p_msg->handle : p_msg->read_blob.handle; /* handle checking */ - if (GATT_HANDLE_IS_VALID (handle)) - { + if (GATT_HANDLE_IS_VALID (handle)) { p_cmd = attp_build_handle_cmd(op_code, handle, offset); - } - else + } else { status = GATT_ILLEGAL_PARAMETER; + } break; case GATT_HANDLE_VALUE_CONF: @@ -586,20 +556,19 @@ tGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, case GATT_REQ_PREPARE_WRITE: offset = p_msg->attr_value.offset; - /* fall through */ + /* fall through */ case GATT_REQ_WRITE: case GATT_CMD_WRITE: case GATT_SIGN_CMD_WRITE: - if (GATT_HANDLE_IS_VALID (p_msg->attr_value.handle)) - { + if (GATT_HANDLE_IS_VALID (p_msg->attr_value.handle)) { p_cmd = attp_build_value_cmd (p_tcb->payload_size, op_code, p_msg->attr_value.handle, offset, p_msg->attr_value.len, p_msg->attr_value.value); - } - else + } else { status = GATT_ILLEGAL_PARAMETER; + } break; case GATT_REQ_EXEC_WRITE: @@ -620,12 +589,11 @@ tGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, break; } - if (p_cmd != NULL) + if (p_cmd != NULL) { status = attp_cl_send_cmd(p_tcb, clcb_idx, op_code, p_cmd); + } - } - else - { + } else { GATT_TRACE_ERROR("Peer device not connected"); } diff --git a/components/bt/bluedroid/stack/gatt/gatt_api.c b/components/bt/bluedroid/stack/gatt/gatt_api.c old mode 100755 new mode 100644 index 72f9dfd22..1a61d60b1 --- a/components/bt/bluedroid/stack/gatt/gatt_api.c +++ b/components/bt/bluedroid/stack/gatt/gatt_api.c @@ -57,10 +57,11 @@ *******************************************************************************/ UINT8 GATT_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { gatt_cb.trace_level = new_level; + } - return(gatt_cb.trace_level); + return (gatt_cb.trace_level); } /***************************************************************************** @@ -84,10 +85,9 @@ UINT8 GATT_SetTraceLevel (UINT8 new_level) BOOLEAN GATTS_AddHandleRange(tGATTS_HNDL_RANGE *p_hndl_range) { tGATT_HDL_LIST_ELEM *p_buf; - BOOLEAN status= FALSE; + BOOLEAN status = FALSE; - if ((p_buf = gatt_alloc_hdl_buffer()) != NULL) - { + if ((p_buf = gatt_alloc_hdl_buffer()) != NULL) { p_buf->asgn_range = *p_hndl_range; status = gatt_add_an_item_to_list(&gatt_cb.hdl_list_info, p_buf); } @@ -110,9 +110,8 @@ BOOLEAN GATTS_AddHandleRange(tGATTS_HNDL_RANGE *p_hndl_range) *******************************************************************************/ BOOLEAN GATTS_NVRegister (tGATT_APPL_INFO *p_cb_info) { - BOOLEAN status= FALSE; - if (p_cb_info) - { + BOOLEAN status = FALSE; + if (p_cb_info) { gatt_cb.cb_info = *p_cb_info; status = TRUE; gatt_init_srv_chg(); @@ -142,123 +141,107 @@ UINT16 GATTS_CreateService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst, UINT16 num_handles, BOOLEAN is_pri) { - tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; - tGATT_HDL_LIST_ELEM *p_list=NULL; - UINT16 s_hdl=0; - BOOLEAN save_hdl=FALSE; - tGATTS_PENDING_NEW_SRV_START *p_buf=NULL; + tGATT_HDL_LIST_INFO *p_list_info = &gatt_cb.hdl_list_info; + tGATT_HDL_LIST_ELEM *p_list = NULL; + UINT16 s_hdl = 0; + BOOLEAN save_hdl = FALSE; + tGATTS_PENDING_NEW_SRV_START *p_buf = NULL; tGATT_REG *p_reg = gatt_get_regcb(gatt_if); tBT_UUID *p_app_uuid128; GATT_TRACE_API ("GATTS_CreateService" ); - if (p_reg == NULL) - { + if (p_reg == NULL) { GATT_TRACE_ERROR ("Inavlid gatt_if=%d", gatt_if); - return(0); + return (0); } p_app_uuid128 = &p_reg->app_uuid128; - if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL) - { + if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL) { s_hdl = p_list->asgn_range.s_handle; GATT_TRACE_DEBUG ("Service already been created!!"); - } - else - { - if ( (p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GATT_SERVER)) - { - s_hdl= gatt_cb.hdl_cfg.gatt_start_hdl; - } - else if ((p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GAP_SERVER)) - { - s_hdl= gatt_cb.hdl_cfg.gap_start_hdl; - } - else - { + } else { + if ( (p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GATT_SERVER)) { + s_hdl = gatt_cb.hdl_cfg.gatt_start_hdl; + } else if ((p_svc_uuid->len == LEN_UUID_16) && (p_svc_uuid->uu.uuid16 == UUID_SERVCLASS_GAP_SERVER)) { + s_hdl = gatt_cb.hdl_cfg.gap_start_hdl; + } else { p_list = p_list_info->p_first; - if (p_list) - { + if (p_list) { s_hdl = p_list->asgn_range.e_handle + 1; } - if (s_hdl < gatt_cb.hdl_cfg.app_start_hdl) - { + if (s_hdl < gatt_cb.hdl_cfg.app_start_hdl) { - s_hdl= gatt_cb.hdl_cfg.app_start_hdl; + s_hdl = gatt_cb.hdl_cfg.app_start_hdl; } save_hdl = TRUE; } /* check for space */ - if (num_handles > (0xFFFF - s_hdl + 1)) - { + if (num_handles > (0xFFFF - s_hdl + 1)) { GATT_TRACE_ERROR ("GATTS_ReserveHandles: no handles, s_hdl: %u needed: %u", s_hdl, num_handles); - return(0); + return (0); } - if ( (p_list = gatt_alloc_hdl_buffer()) == NULL) - { + if ( (p_list = gatt_alloc_hdl_buffer()) == NULL) { /* No free entry */ GATT_TRACE_ERROR ("GATTS_ReserveHandles: no free handle blocks"); - return(0); + return (0); } p_list->asgn_range.app_uuid128 = *p_app_uuid128; p_list->asgn_range.svc_uuid = *p_svc_uuid; p_list->asgn_range.svc_inst = svc_inst; p_list->asgn_range.s_handle = s_hdl; - p_list->asgn_range.e_handle = s_hdl+num_handles-1; + p_list->asgn_range.e_handle = s_hdl + num_handles - 1; p_list->asgn_range.is_primary = is_pri; gatt_add_an_item_to_list(p_list_info, p_list); - if (save_hdl) - { - if (gatt_cb.cb_info.p_nv_save_callback) + if (save_hdl) { + if (gatt_cb.cb_info.p_nv_save_callback) { (*gatt_cb.cb_info.p_nv_save_callback)(TRUE, &p_list->asgn_range); + } /* add a pending new service change item to the list */ - if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL) - { + if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL) { /* No free entry */ GATT_TRACE_ERROR ("gatt_add_pending_new_srv_start: no free blocks"); - if (p_list) - { + if (p_list) { gatt_remove_an_item_from_list(p_list_info, p_list); gatt_free_hdl_buffer(p_list); } - return(0); + return (0); } GATT_TRACE_DEBUG ("Add a new srv chg item"); } } - if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles)) - { + if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles)) { GATT_TRACE_ERROR ("GATTS_ReserveHandles: service DB initialization failed"); - if (p_list) - { + if (p_list) { gatt_remove_an_item_from_list(p_list_info, p_list); gatt_free_hdl_buffer(p_list); } - if (p_buf) + if (p_buf) { GKI_freebuf (GKI_remove_from_queue (&gatt_cb.pending_new_srv_start_q, p_buf)); - return(0); + } + return (0); } GATT_TRACE_DEBUG ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d", - num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle, - ((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16": "uuid128" ), - p_list->asgn_range.svc_uuid.uu.uuid16, - p_list->asgn_range.is_primary); + num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle, + ((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16" : "uuid128" ), + p_list->asgn_range.svc_uuid.uu.uuid16, + p_list->asgn_range.is_primary); - return(s_hdl); + return (s_hdl); } /******************************************************************************* @@ -279,13 +262,11 @@ UINT16 GATTS_AddIncludeService (UINT16 service_handle, UINT16 include_svc_handle { tGATT_HDL_LIST_ELEM *p_decl, *p_incl_decl; - if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) - { + if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) { GATT_TRACE_DEBUG("Service not created"); return 0; } - if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL) - { + if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL) { GATT_TRACE_DEBUG("Included Service not created"); return 0; } @@ -313,19 +294,17 @@ UINT16 GATTS_AddIncludeService (UINT16 service_handle, UINT16 include_svc_handle ** *******************************************************************************/ UINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *p_char_uuid, - tGATT_PERM perm,tGATT_CHAR_PROP property) + tGATT_PERM perm, tGATT_CHAR_PROP property) { tGATT_HDL_LIST_ELEM *p_decl; - if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) - { + if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) { GATT_TRACE_DEBUG("Service not created"); return 0; } /* data validity checking */ if ( ((property & GATT_CHAR_PROP_BIT_AUTH) && !(perm & GATT_WRITE_SIGNED_PERM)) || - ((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) ) - { + ((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) ) { GATT_TRACE_DEBUG("Invalid configuration property=0x%x perm=0x%x ", property, perm); return 0; } @@ -355,20 +334,18 @@ UINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *p_char_uuid, ** *******************************************************************************/ UINT16 GATTS_AddCharDescriptor (UINT16 service_handle, - tGATT_PERM perm, - tBT_UUID * p_descr_uuid) + tGATT_PERM perm, + tBT_UUID *p_descr_uuid) { tGATT_HDL_LIST_ELEM *p_decl; - if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) - { + if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) { GATT_TRACE_DEBUG("Service not created"); return 0; } if (p_descr_uuid == NULL || - (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len != LEN_UUID_16 - && p_descr_uuid->len != LEN_UUID_32)) - { + (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len != LEN_UUID_16 + && p_descr_uuid->len != LEN_UUID_32)) { GATT_TRACE_DEBUG("Illegal parameter"); return 0; } @@ -394,8 +371,8 @@ UINT16 GATTS_AddCharDescriptor (UINT16 service_handle, BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst) { - tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; - tGATT_HDL_LIST_ELEM *p_list=NULL; + tGATT_HDL_LIST_INFO *p_list_info = &gatt_cb.hdl_list_info; + tGATT_HDL_LIST_ELEM *p_list = NULL; UINT8 i_sreg; tGATTS_PENDING_NEW_SRV_START *p_buf; tGATT_REG *p_reg = gatt_get_regcb(gatt_if); @@ -403,49 +380,44 @@ BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_ GATT_TRACE_DEBUG ("GATTS_DeleteService"); - if (p_reg == NULL) - { + if (p_reg == NULL) { GATT_TRACE_ERROR ("Applicaiton not foud"); - return(FALSE); + return (FALSE); } p_app_uuid128 = &p_reg->app_uuid128; - if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL) - { + if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL) { GATT_TRACE_ERROR ("No Service found"); - return(FALSE); + return (FALSE); } if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128, &p_list->asgn_range.svc_uuid, - p_list->asgn_range.svc_inst)) != NULL) - { + p_list->asgn_range.svc_inst)) != NULL) { GATT_TRACE_DEBUG ("Delete a new service changed item - the service has not yet started"); GKI_freebuf (GKI_remove_from_queue (&gatt_cb.pending_new_srv_start_q, p_buf)); - } - else - { + } else { gatt_proc_srv_chg(); } if ((i_sreg = gatt_sr_find_i_rcb_by_app_id (p_app_uuid128, - p_svc_uuid, - svc_inst)) != GATT_MAX_SR_PROFILES) - { + p_svc_uuid, + svc_inst)) != GATT_MAX_SR_PROFILES) { GATTS_StopService(gatt_cb.sr_reg[i_sreg].s_hdl); } GATT_TRACE_DEBUG ("released handles s_hdl=%u e_hdl=%u", - p_list->asgn_range.s_handle , p_list->asgn_range.e_handle ); + p_list->asgn_range.s_handle , p_list->asgn_range.e_handle ); if ( (p_list->asgn_range.s_handle >= gatt_cb.hdl_cfg.app_start_hdl) - && gatt_cb.cb_info.p_nv_save_callback) + && gatt_cb.cb_info.p_nv_save_callback) { (*gatt_cb.cb_info.p_nv_save_callback)(FALSE, &p_list->asgn_range); + } gatt_remove_an_item_from_list(p_list_info, p_list); gatt_free_hdl_buffer(p_list); - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -465,7 +437,7 @@ tGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, tGATT_TRANSPORT sup_transport) { tGATT_SR_REG *p_sreg; - tGATT_HDL_LIST_ELEM *p_list=NULL; + tGATT_HDL_LIST_ELEM *p_list = NULL; UINT8 i_sreg; tBT_UUID *p_uuid; tGATT_REG *p_reg = gatt_get_regcb(gatt_if); @@ -474,15 +446,13 @@ tGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, GATT_TRACE_API ("GATTS_StartService"); - if (p_reg == NULL) - { + if (p_reg == NULL) { /* Not found */ GATT_TRACE_ERROR ("Applicaiton not found "); return GATT_NOT_FOUND; } - if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) - { + if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL) { /* Not found */ GATT_TRACE_ERROR ("no service found"); return GATT_NOT_FOUND; @@ -490,15 +460,13 @@ tGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, if (gatt_sr_find_i_rcb_by_app_id (&p_list->asgn_range.app_uuid128, &p_list->asgn_range.svc_uuid, - p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES) - { + p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES) { GATT_TRACE_ERROR ("Duplicate Service start - Service already started"); return GATT_SERVICE_STARTED; } /*this is a new application servoce start */ - if ((i_sreg = gatt_sr_alloc_rcb(p_list)) == GATT_MAX_SR_PROFILES) - { + if ((i_sreg = gatt_sr_alloc_rcb(p_list)) == GATT_MAX_SR_PROFILES) { GATT_TRACE_ERROR ("GATTS_StartService: no free server registration block"); return GATT_NO_RESOURCES; } @@ -506,19 +474,17 @@ tGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, p_sreg = &gatt_cb.sr_reg[i_sreg]; p_sreg->gatt_if = gatt_if; - switch (sup_transport) - { - case GATT_TRANSPORT_BR_EDR: - case GATT_TRANSPORT_LE_BR_EDR: - if (p_sreg->type == GATT_UUID_PRI_SERVICE) - { - p_uuid = gatts_get_service_uuid (p_sreg->p_db); + switch (sup_transport) { + case GATT_TRANSPORT_BR_EDR: + case GATT_TRANSPORT_LE_BR_EDR: + if (p_sreg->type == GATT_UUID_PRI_SERVICE) { + p_uuid = gatts_get_service_uuid (p_sreg->p_db); - p_sreg->sdp_handle = gatt_add_sdp_record(p_uuid, p_sreg->s_hdl, p_sreg->e_hdl); - } - break; - default: - break; + p_sreg->sdp_handle = gatt_add_sdp_record(p_uuid, p_sreg->s_hdl, p_sreg->e_hdl); + } + break; + default: + break; } gatts_update_srv_list_elem(i_sreg, p_sreg->s_hdl, @@ -526,18 +492,17 @@ tGATT_STATUS GATTS_StartService (tGATT_IF gatt_if, UINT16 service_handle, gatt_add_a_srv_to_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[i_sreg]); - GATT_TRACE_DEBUG ("allocated i_sreg=%d ",i_sreg); + GATT_TRACE_DEBUG ("allocated i_sreg=%d ", i_sreg); GATT_TRACE_DEBUG ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x", - p_sreg->s_hdl,p_sreg->e_hdl, - p_sreg->type, p_sreg->service_instance, - p_sreg->sdp_handle); + p_sreg->s_hdl, p_sreg->e_hdl, + p_sreg->type, p_sreg->service_instance, + p_sreg->sdp_handle); if ( (p_buf = gatt_sr_is_new_srv_chg(&p_list->asgn_range.app_uuid128, &p_list->asgn_range.svc_uuid, - p_list->asgn_range.svc_inst)) != NULL) - { + p_list->asgn_range.svc_inst)) != NULL) { gatt_proc_srv_chg(); /* remove the new service element after the srv changed processing is completed*/ @@ -564,18 +529,14 @@ void GATTS_StopService (UINT16 service_handle) GATT_TRACE_API("GATTS_StopService %u", service_handle); /* Index 0 is reserved for GATT, and is never stopped */ - if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) ) - { - if (gatt_cb.sr_reg[ii].sdp_handle) - { + if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) ) { + if (gatt_cb.sr_reg[ii].sdp_handle) { SDP_DeleteRecord(gatt_cb.sr_reg[ii].sdp_handle); } gatt_remove_a_srv_from_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[ii]); gatt_cb.srv_list[ii].in_use = FALSE; memset (&gatt_cb.sr_reg[ii], 0, sizeof(tGATT_SR_REG)); - } - else - { + } else { GATT_TRACE_ERROR("GATTS_StopService service_handle: %u is not in use", service_handle); } } @@ -607,14 +568,14 @@ tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_handle, U GATT_TRACE_API ("GATTS_HandleValueIndication"); - if ( (p_reg == NULL) || (p_tcb == NULL)) - { + if ( (p_reg == NULL) || (p_tcb == NULL)) { GATT_TRACE_ERROR ("GATTS_HandleValueIndication Unknown conn_id: %u ", conn_id); - return(tGATT_STATUS) GATT_INVALID_CONN_ID; + return (tGATT_STATUS) GATT_INVALID_CONN_ID; } - if (! GATT_HANDLE_IS_VALID (attr_handle)) + if (! GATT_HANDLE_IS_VALID (attr_handle)) { return GATT_ILLEGAL_PARAMETER; + } indication.conn_id = conn_id; indication.handle = attr_handle; @@ -622,27 +583,19 @@ tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_handle, U memcpy (indication.value, p_val, val_len); indication.auth_req = GATT_AUTH_REQ_NONE; - if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle)) - { + if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle)) { GATT_TRACE_DEBUG ("Add a pending indication"); - if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL) - { + if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) != NULL) { cmd_status = GATT_SUCCESS; - } - else - { + } else { cmd_status = GATT_NO_RESOURCES; } - } - else - { + } else { - if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL) - { + if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL) { cmd_status = attp_send_sr_msg (p_tcb, p_msg); - if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED) - { + if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED) { p_tcb->indicate_handle = indication.handle; gatt_start_conf_timer(p_tcb); } @@ -666,7 +619,7 @@ tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_handle, U ** *******************************************************************************/ tGATT_STATUS GATTS_HandleValueNotification (UINT16 conn_id, UINT16 attr_handle, - UINT16 val_len, UINT8 *p_val) + UINT16 val_len, UINT8 *p_val) { tGATT_STATUS cmd_sent = GATT_ILLEGAL_PARAMETER; BT_HDR *p_buf; @@ -678,26 +631,23 @@ tGATT_STATUS GATTS_HandleValueNotification (UINT16 conn_id, UINT16 attr_handle, GATT_TRACE_API ("GATTS_HandleValueNotification"); - if ( (p_reg == NULL) || (p_tcb == NULL)) - { + if ( (p_reg == NULL) || (p_tcb == NULL)) { GATT_TRACE_ERROR ("GATTS_HandleValueNotification Unknown conn_id: %u \n", conn_id); - return(tGATT_STATUS) GATT_INVALID_CONN_ID; + return (tGATT_STATUS) GATT_INVALID_CONN_ID; } - if (GATT_HANDLE_IS_VALID (attr_handle)) - { + if (GATT_HANDLE_IS_VALID (attr_handle)) { notif.handle = attr_handle; notif.len = val_len; memcpy (notif.value, p_val, val_len); notif.auth_req = GATT_AUTH_REQ_NONE; if ((p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)¬if)) - != NULL) - { + != NULL) { cmd_sent = attp_send_sr_msg (p_tcb, p_buf); - } - else + } else { cmd_sent = GATT_NO_RESOURCES; + } } return cmd_sent; } @@ -726,20 +676,18 @@ tGATT_STATUS GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id, tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); GATT_TRACE_API ("GATTS_SendRsp: conn_id: %u trans_id: %u Status: 0x%04x", - conn_id, trans_id, status); + conn_id, trans_id, status); - if ( (p_reg == NULL) || (p_tcb == NULL)) - { + if ( (p_reg == NULL) || (p_tcb == NULL)) { GATT_TRACE_ERROR ("GATTS_SendRsp Unknown conn_id: %u ", conn_id); - return(tGATT_STATUS) GATT_INVALID_CONN_ID; + return (tGATT_STATUS) GATT_INVALID_CONN_ID; } - if (p_tcb->sr_cmd.trans_id != trans_id) - { + if (p_tcb->sr_cmd.trans_id != trans_id) { GATT_TRACE_ERROR ("GATTS_SendRsp conn_id: %u waiting for op_code = %02x", - conn_id, p_tcb->sr_cmd.op_code); + conn_id, p_tcb->sr_cmd.op_code); - return(GATT_WRONG_STATE); + return (GATT_WRONG_STATE); } /* Process App response */ cmd_sent = gatt_sr_process_app_rsp (p_tcb, gatt_if, trans_id, p_tcb->sr_cmd.op_code, status, p_msg); @@ -773,7 +721,7 @@ tGATT_STATUS GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id, tGATT_STATUS GATTC_ConfigureMTU (UINT16 conn_id, UINT16 mtu) { UINT8 ret = GATT_NO_RESOURCES; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); @@ -783,24 +731,20 @@ tGATT_STATUS GATTC_ConfigureMTU (UINT16 conn_id, UINT16 mtu) GATT_TRACE_API ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu ); /* Validate that the link is BLE, not BR/EDR */ - if (p_tcb->transport != BT_TRANSPORT_LE) - { + if (p_tcb->transport != BT_TRANSPORT_LE) { return GATT_ERROR; } - if ( (p_tcb == NULL) || (p_reg==NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE)) - { + if ( (p_tcb == NULL) || (p_reg == NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE)) { return GATT_ILLEGAL_PARAMETER; } - if (gatt_is_clcb_allocated(conn_id)) - { + if (gatt_is_clcb_allocated(conn_id)) { GATT_TRACE_ERROR("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id); return GATT_BUSY; } - if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) - { + if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) { p_clcb->p_tcb->payload_size = mtu; p_clcb->operation = GATTC_OPTYPE_CONFIG; @@ -828,37 +772,33 @@ tGATT_STATUS GATTC_Discover (UINT16 conn_id, tGATT_DISC_TYPE disc_type, { tGATT_STATUS status = GATT_SUCCESS; tGATT_CLCB *p_clcb; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); - GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type); + GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d", conn_id, disc_type); - if ( (p_tcb == NULL) || (p_reg==NULL) ||(p_param == NULL) || - (disc_type >= GATT_DISC_MAX)) - { + if ( (p_tcb == NULL) || (p_reg == NULL) || (p_param == NULL) || + (disc_type >= GATT_DISC_MAX)) { GATT_TRACE_ERROR("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id); return GATT_ILLEGAL_PARAMETER; } - if (gatt_is_clcb_allocated(conn_id)) - { + if (gatt_is_clcb_allocated(conn_id)) { GATT_TRACE_ERROR("GATTC_Discover GATT_BUSY conn_id = %d", conn_id); return GATT_BUSY; } - if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) - { + if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) { if (!GATT_HANDLE_IS_VALID(p_param->s_handle) || - !GATT_HANDLE_IS_VALID(p_param->e_handle) || - /* search by type does not have a valid UUID param */ - (disc_type == GATT_DISC_SRVC_BY_UUID && - p_param->service.len == 0)) - { + !GATT_HANDLE_IS_VALID(p_param->e_handle) || + /* search by type does not have a valid UUID param */ + (disc_type == GATT_DISC_SRVC_BY_UUID && + p_param->service.len == 0)) { gatt_clcb_dealloc(p_clcb); return GATT_ILLEGAL_PARAMETER; } @@ -870,9 +810,7 @@ tGATT_STATUS GATTC_Discover (UINT16 conn_id, tGATT_DISC_TYPE disc_type, p_clcb->uuid = p_param->service; gatt_act_discovery(p_clcb); - } - else - { + } else { status = GATT_NO_RESOURCES; } return status; @@ -897,7 +835,7 @@ tGATT_STATUS GATTC_Read (UINT16 conn_id, tGATT_READ_TYPE type, tGATT_READ_PARAM tGATT_STATUS status = GATT_SUCCESS; tGATT_CLCB *p_clcb; tGATT_READ_MULTI *p_read_multi; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); @@ -905,62 +843,54 @@ tGATT_STATUS GATTC_Read (UINT16 conn_id, tGATT_READ_TYPE type, tGATT_READ_PARAM GATT_TRACE_API ("GATTC_Read conn_id=%d type=%d", conn_id, type); - if ( (p_tcb == NULL) || (p_reg==NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0))) - { + if ( (p_tcb == NULL) || (p_reg == NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0))) { GATT_TRACE_ERROR("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type); return GATT_ILLEGAL_PARAMETER; } - if (gatt_is_clcb_allocated(conn_id)) - { + if (gatt_is_clcb_allocated(conn_id)) { GATT_TRACE_ERROR("GATTC_Read GATT_BUSY conn_id = %d", conn_id); return GATT_BUSY; } - if ( (p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) - { + if ( (p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) { p_clcb->operation = GATTC_OPTYPE_READ; p_clcb->op_subtype = type; p_clcb->auth_req = p_read->by_handle.auth_req; p_clcb->counter = 0; - switch (type) - { - case GATT_READ_BY_TYPE: - case GATT_READ_CHAR_VALUE: - p_clcb->s_handle = p_read->service.s_handle; - p_clcb->e_handle = p_read->service.e_handle; - memcpy(&p_clcb->uuid, &p_read->service.uuid, sizeof(tBT_UUID)); - break; - case GATT_READ_MULTIPLE: - p_clcb->s_handle = 0; - /* copy multiple handles in CB */ - p_read_multi = (tGATT_READ_MULTI *)GKI_getbuf(sizeof(tGATT_READ_MULTI)); - p_clcb->p_attr_buf = (UINT8*)p_read_multi; - memcpy (p_read_multi, &p_read->read_multiple, sizeof(tGATT_READ_MULTI)); - case GATT_READ_BY_HANDLE: - case GATT_READ_PARTIAL: - memset(&p_clcb->uuid, 0, sizeof(tBT_UUID)); - p_clcb->s_handle = p_read->by_handle.handle; + switch (type) { + case GATT_READ_BY_TYPE: + case GATT_READ_CHAR_VALUE: + p_clcb->s_handle = p_read->service.s_handle; + p_clcb->e_handle = p_read->service.e_handle; + memcpy(&p_clcb->uuid, &p_read->service.uuid, sizeof(tBT_UUID)); + break; + case GATT_READ_MULTIPLE: + p_clcb->s_handle = 0; + /* copy multiple handles in CB */ + p_read_multi = (tGATT_READ_MULTI *)GKI_getbuf(sizeof(tGATT_READ_MULTI)); + p_clcb->p_attr_buf = (UINT8 *)p_read_multi; + memcpy (p_read_multi, &p_read->read_multiple, sizeof(tGATT_READ_MULTI)); + case GATT_READ_BY_HANDLE: + case GATT_READ_PARTIAL: + memset(&p_clcb->uuid, 0, sizeof(tBT_UUID)); + p_clcb->s_handle = p_read->by_handle.handle; - if (type == GATT_READ_PARTIAL) - { - p_clcb->counter = p_read->partial.offset; - } + if (type == GATT_READ_PARTIAL) { + p_clcb->counter = p_read->partial.offset; + } - break; - default: - break; + break; + default: + break; } /* start security check */ - if (gatt_security_check_start(p_clcb) == FALSE) - { + if (gatt_security_check_start(p_clcb) == FALSE) { status = GATT_NO_RESOURCES; gatt_clcb_dealloc(p_clcb); } - } - else - { + } else { status = GATT_NO_RESOURCES; } return status; @@ -985,56 +915,47 @@ tGATT_STATUS GATTC_Write (UINT16 conn_id, tGATT_WRITE_TYPE type, tGATT_VALUE *p_ tGATT_STATUS status = GATT_SUCCESS; tGATT_CLCB *p_clcb; tGATT_VALUE *p; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); - if ( (p_tcb == NULL) || (p_reg==NULL) || (p_write == NULL) || - ((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) ) - { + if ( (p_tcb == NULL) || (p_reg == NULL) || (p_write == NULL) || + ((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) ) { GATT_TRACE_ERROR("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type); return GATT_ILLEGAL_PARAMETER; } - if (gatt_is_clcb_allocated(conn_id)) - { + if (gatt_is_clcb_allocated(conn_id)) { GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id); return GATT_BUSY; } - if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) - { + if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL ) { p_clcb->operation = GATTC_OPTYPE_WRITE; p_clcb->op_subtype = type; p_clcb->auth_req = p_write->auth_req; - if (( p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL) - { + if (( p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL) { memcpy(p_clcb->p_attr_buf, (void *)p_write, sizeof(tGATT_VALUE)); p = (tGATT_VALUE *)p_clcb->p_attr_buf; - if (type == GATT_WRITE_PREPARE) - { + if (type == GATT_WRITE_PREPARE) { p_clcb->start_offset = p_write->offset; p->offset = 0; } - if (gatt_security_check_start(p_clcb) == FALSE) - { + if (gatt_security_check_start(p_clcb) == FALSE) { status = GATT_NO_RESOURCES; } - } - else - { + } else { status = GATT_NO_RESOURCES; } - if (status == GATT_NO_RESOURCES) + if (status == GATT_NO_RESOURCES) { gatt_clcb_dealloc(p_clcb); - } - else - { + } + } else { status = GATT_NO_RESOURCES; } return status; @@ -1059,33 +980,28 @@ tGATT_STATUS GATTC_ExecuteWrite (UINT16 conn_id, BOOLEAN is_execute) tGATT_STATUS status = GATT_SUCCESS; tGATT_CLCB *p_clcb; tGATT_EXEC_FLAG flag; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); GATT_TRACE_API ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute); - if ( (p_tcb == NULL) || (p_reg==NULL) ) - { + if ( (p_tcb == NULL) || (p_reg == NULL) ) { GATT_TRACE_ERROR("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id); return GATT_ILLEGAL_PARAMETER; } - if (gatt_is_clcb_allocated(conn_id)) - { + if (gatt_is_clcb_allocated(conn_id)) { GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id); return GATT_BUSY; } - if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) - { + if ((p_clcb = gatt_clcb_alloc(conn_id)) != NULL) { p_clcb->operation = GATTC_OPTYPE_EXE_WRITE; flag = is_execute ? GATT_PREP_WRITE_EXEC : GATT_PREP_WRITE_CANCEL; gatt_send_queue_write_cancel (p_clcb->p_tcb, p_clcb, flag); - } - else - { + } else { GATT_TRACE_ERROR("Unable to allocate client CB for conn_id %d ", conn_id); status = GATT_NO_RESOURCES; } @@ -1108,14 +1024,12 @@ tGATT_STATUS GATTC_ExecuteWrite (UINT16 conn_id, BOOLEAN is_execute) tGATT_STATUS GATTC_SendHandleValueConfirm (UINT16 conn_id, UINT16 handle) { tGATT_STATUS ret = GATT_ILLEGAL_PARAMETER; - tGATT_TCB *p_tcb=gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id)); + tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id)); GATT_TRACE_API ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle); - if (p_tcb) - { - if (p_tcb->ind_count > 0 ) - { + if (p_tcb) { + if (p_tcb->ind_count > 0 ) { btu_stop_timer (&p_tcb->ind_ack_timer_ent); GATT_TRACE_DEBUG ("notif_count=%d ", p_tcb->ind_count); @@ -1124,15 +1038,11 @@ tGATT_STATUS GATTC_SendHandleValueConfirm (UINT16 conn_id, UINT16 handle) p_tcb->ind_count = 0; - } - else - { + } else { GATT_TRACE_DEBUG ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id); ret = GATT_SUCCESS; } - } - else - { + } else { GATT_TRACE_ERROR ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id); } return ret; @@ -1162,18 +1072,14 @@ void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT trans tGATT_TCB *p_tcb; BOOLEAN status = FALSE; - if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL) - { - if (p_tcb->att_lcid == L2CAP_ATT_CID) - { + if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL) { + if (p_tcb->att_lcid == L2CAP_ATT_CID) { status = L2CA_SetFixedChannelTout (bd_addr, L2CAP_ATT_CID, idle_tout); if (idle_tout == GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP) L2CA_SetIdleTimeoutByBdAddr(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, BT_TRANSPORT_LE); - } - else - { + } else { status = L2CA_SetIdleTimeout (p_tcb->att_lcid, idle_tout, FALSE); } } @@ -1199,30 +1105,26 @@ void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT trans tGATT_IF GATT_Register (tBT_UUID *p_app_uuid128, tGATT_CBACK *p_cb_info) { tGATT_REG *p_reg; - UINT8 i_gatt_if=0; - tGATT_IF gatt_if=0; + UINT8 i_gatt_if = 0; + tGATT_IF gatt_if = 0; GATT_TRACE_API ("GATT_Register"); gatt_dbg_display_uuid(*p_app_uuid128); - for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) - { - if (p_reg->in_use && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128)) - { + for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) { + if (p_reg->in_use && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128)) { GATT_TRACE_ERROR("application already registered."); return 0; } } - for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) - { - if (!p_reg->in_use) - { + for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++) { + if (!p_reg->in_use) { memset(p_reg, 0 , sizeof(tGATT_REG)); i_gatt_if++; /* one based number */ p_reg->app_uuid128 = *p_app_uuid128; gatt_if = - p_reg->gatt_if = (tGATT_IF)i_gatt_if; + p_reg->gatt_if = (tGATT_IF)i_gatt_if; p_reg->app_cb = *p_cb_info; p_reg->in_use = TRUE; @@ -1255,8 +1157,7 @@ void GATT_Deregister (tGATT_IF gatt_if) GATT_TRACE_API ("GATT_Deregister gatt_if=%d", gatt_if); /* Index 0 is GAP and is never deregistered */ - if ( (gatt_if == 0) || (p_reg == NULL) ) - { + if ( (gatt_if == 0) || (p_reg == NULL) ) { GATT_TRACE_ERROR ("GATT_Deregister with invalid gatt_if: %u", gatt_if); return; } @@ -1266,10 +1167,8 @@ void GATT_Deregister (tGATT_IF gatt_if) deregisteration need to bed performed in an orderly fashion no check for now */ - for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) - { - if (p_sreg->in_use && (p_sreg->gatt_if == gatt_if)) - { + for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) { + if (p_sreg->in_use && (p_sreg->gatt_if == gatt_if)) { GATTS_StopService(p_sreg->s_hdl); } } @@ -1279,26 +1178,20 @@ void GATT_Deregister (tGATT_IF gatt_if) /* When an application deregisters, check remove the link associated with the app */ - for (i=0, p_tcb = gatt_cb.tcb; i < GATT_MAX_PHY_CHANNEL; i++, p_tcb++) - { - if (p_tcb->in_use) - { - if (gatt_get_ch_state(p_tcb) != GATT_CH_CLOSE) - { + for (i = 0, p_tcb = gatt_cb.tcb; i < GATT_MAX_PHY_CHANNEL; i++, p_tcb++) { + if (p_tcb->in_use) { + if (gatt_get_ch_state(p_tcb) != GATT_CH_CLOSE) { gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); - if (!gatt_num_apps_hold_link(p_tcb)) - { + if (!gatt_num_apps_hold_link(p_tcb)) { /* this will disconnect the link or cancel the pending connect request at lower layer*/ gatt_disconnect(p_tcb); } } - for (j = 0, p_clcb= &gatt_cb.clcb[j]; j < GATT_CL_MAX_LCB; j++, p_clcb++) - { + for (j = 0, p_clcb = &gatt_cb.clcb[j]; j < GATT_CL_MAX_LCB; j++, p_clcb++) { if (p_clcb->in_use && - (p_clcb->p_reg->gatt_if == gatt_if) && - (p_clcb->p_tcb->tcb_idx == p_tcb->tcb_idx)) - { + (p_clcb->p_reg->gatt_if == gatt_if) && + (p_clcb->p_tcb->tcb_idx == p_tcb->tcb_idx)) { btu_stop_timer(&p_clcb->rsp_timer_ent); gatt_clcb_dealloc (p_clcb); break; @@ -1340,14 +1233,11 @@ void GATT_StartIf (tGATT_IF gatt_if) tGATT_TRANSPORT transport ; GATT_TRACE_API ("GATT_StartIf gatt_if=%d", gatt_if); - if ((p_reg = gatt_get_regcb(gatt_if)) != NULL) - { + if ((p_reg = gatt_get_regcb(gatt_if)) != NULL) { start_idx = 0; - while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) - { + while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) { p_tcb = gatt_find_tcb_by_addr(bda, transport); - if (p_reg->app_cb.p_conn_cb && p_tcb) - { + if (p_reg->app_cb.p_conn_cb && p_tcb) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0, transport); } @@ -1379,20 +1269,17 @@ BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_ GATT_TRACE_API ("GATT_Connect gatt_if=%d", gatt_if); /* Make sure app is registered */ - if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) - { + if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) { GATT_TRACE_ERROR("GATT_Connect - gatt_if =%d is not registered", gatt_if); - return(FALSE); + return (FALSE); } - if (is_direct) + if (is_direct) { status = gatt_act_connect (p_reg, bd_addr, transport); - else - { - if (transport == BT_TRANSPORT_LE) - status = gatt_update_auto_connect_dev(gatt_if,TRUE, bd_addr, TRUE); - else - { + } else { + if (transport == BT_TRANSPORT_LE) { + status = gatt_update_auto_connect_dev(gatt_if, TRUE, bd_addr, TRUE); + } else { GATT_TRACE_ERROR("Unsupported transport for background connection"); } } @@ -1415,7 +1302,8 @@ BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_ ** Returns TRUE if connection started; FALSE if connection start failure. ** *******************************************************************************/ -BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct){ +BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct) +{ tGATT_REG *p_reg; tGATT_TCB *p_tcb; BOOLEAN status = TRUE; @@ -1424,56 +1312,40 @@ BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct GATT_TRACE_API ("GATT_CancelConnect gatt_if=%d", gatt_if); - if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL)) - { + if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL)) { GATT_TRACE_ERROR("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if); - return(FALSE); + return (FALSE); } - if (is_direct) - { - if (!gatt_if) - { + if (is_direct) { + if (!gatt_if) { GATT_TRACE_DEBUG("GATT_CancelConnect - unconditional"); start_idx = 0; /* only LE connection can be cancelled */ p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE); - if (p_tcb && gatt_num_apps_hold_link(p_tcb)) - { - while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if)) - { + if (p_tcb && gatt_num_apps_hold_link(p_tcb)) { + while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if)) { status = gatt_cancel_open(temp_gatt_if, bd_addr); start_idx = ++found_idx; } - } - else - { + } else { GATT_TRACE_ERROR("GATT_CancelConnect - no app found"); status = FALSE; } - } - else - { + } else { status = gatt_cancel_open(gatt_if, bd_addr); } - } - else - { - if (!gatt_if) - { - if (gatt_get_num_apps_for_bg_dev(bd_addr)) - { - while (gatt_find_app_for_bg_dev(bd_addr, &temp_gatt_if)) + } else { + if (!gatt_if) { + if (gatt_get_num_apps_for_bg_dev(bd_addr)) { + while (gatt_find_app_for_bg_dev(bd_addr, &temp_gatt_if)) { gatt_remove_bg_dev_for_app(temp_gatt_if, bd_addr); - } - else - { + } + } else { GATT_TRACE_ERROR("GATT_CancelConnect -no app associated with the bg device for unconditional removal"); status = FALSE; } - } - else - { + } else { status = gatt_remove_bg_dev_for_app(gatt_if, bd_addr); } } @@ -1496,19 +1368,17 @@ BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct tGATT_STATUS GATT_Disconnect (UINT16 conn_id) { tGATT_STATUS ret = GATT_ILLEGAL_PARAMETER; - tGATT_TCB *p_tcb=NULL; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_TCB *p_tcb = NULL; + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); GATT_TRACE_API ("GATT_Disconnect conn_id=%d ", conn_id); p_tcb = gatt_get_tcb_by_idx(tcb_idx); - if (p_tcb) - { + if (p_tcb) { gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); - if (!gatt_num_apps_hold_link(p_tcb)) - { + if (!gatt_num_apps_hold_link(p_tcb)) { gatt_disconnect(p_tcb); } ret = GATT_SUCCESS; @@ -1538,13 +1408,12 @@ BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_ tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); - tGATT_TCB *p_tcb= gatt_get_tcb_by_idx(tcb_idx); - BOOLEAN status=FALSE; + tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); + BOOLEAN status = FALSE; GATT_TRACE_API ("GATT_GetConnectionInfor conn_id=%d", conn_id); - if (p_tcb && p_reg ) - { + if (p_tcb && p_reg ) { memcpy(bd_addr, p_tcb->peer_bda, BD_ADDR_LEN); *p_gatt_if = gatt_if; *p_transport = p_tcb->transport; @@ -1573,11 +1442,10 @@ BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_c tBT_TRANSPORT transport) { tGATT_REG *p_reg = gatt_get_regcb(gatt_if); - tGATT_TCB *p_tcb= gatt_find_tcb_by_addr(bd_addr, transport); - BOOLEAN status=FALSE; + tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, transport); + BOOLEAN status = FALSE; - if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) ) - { + if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) ) { *p_conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); status = TRUE; } @@ -1609,18 +1477,14 @@ BOOLEAN GATT_Listen (tGATT_IF gatt_if, BOOLEAN start, BD_ADDR_PTR bd_addr) GATT_TRACE_API ("GATT_Listen gatt_if=%d", gatt_if); /* Make sure app is registered */ - if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) - { + if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) { GATT_TRACE_ERROR("GATT_Listen - gatt_if =%d is not registered", gatt_if); - return(FALSE); + return (FALSE); } - if (bd_addr != NULL) - { - gatt_update_auto_connect_dev(gatt_if,start, bd_addr, FALSE); - } - else - { + if (bd_addr != NULL) { + gatt_update_auto_connect_dev(gatt_if, start, bd_addr, FALSE); + } else { p_reg->listening = start ? GATT_LISTEN_TO_ALL : GATT_LISTEN_TO_NONE; } diff --git a/components/bt/bluedroid/stack/gatt/gatt_attr.c b/components/bt/bluedroid/stack/gatt/gatt_attr.c old mode 100755 new mode 100644 index a6cc271ae..b7a87192b --- a/components/bt/bluedroid/stack/gatt/gatt_attr.c +++ b/components/bt/bluedroid/stack/gatt/gatt_attr.c @@ -42,17 +42,16 @@ static void gatt_request_cback(UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data); static void gatt_connect_cback(tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, - tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport); + tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport); static void gatt_disc_res_cback(UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data); static void gatt_disc_cmpl_cback(UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status); static void gatt_cl_op_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, - tGATT_CL_COMPLETE *p_data); + tGATT_CL_COMPLETE *p_data); static void gatt_cl_start_config_ccc(tGATT_PROFILE_CLCB *p_clcb); -static tGATT_CBACK gatt_profile_cback = -{ +static tGATT_CBACK gatt_profile_cback = { gatt_connect_cback, gatt_cl_op_cmpl_cback, gatt_disc_res_cback, @@ -92,10 +91,10 @@ static tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_conn_id(UINT16 conn_id) UINT8 i_clcb; tGATT_PROFILE_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) - { - if (p_clcb->in_use && p_clcb->conn_id == conn_id) + for (i_clcb = 0, p_clcb = gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) { + if (p_clcb->in_use && p_clcb->conn_id == conn_id) { return p_clcb; + } } return NULL; @@ -115,11 +114,11 @@ static tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda, tBT_TR UINT8 i_clcb; tGATT_PROFILE_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) - { + for (i_clcb = 0, p_clcb = gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) { if (p_clcb->in_use && p_clcb->transport == transport && - p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN)) + p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN)) { return p_clcb; + } } return NULL; @@ -139,10 +138,8 @@ tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TR UINT8 i_clcb = 0; tGATT_PROFILE_CLCB *p_clcb = NULL; - for (i_clcb = 0, p_clcb= gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) - { - if (!p_clcb->in_use) - { + for (i_clcb = 0, p_clcb = gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++) { + if (!p_clcb->in_use) { p_clcb->in_use = TRUE; p_clcb->conn_id = conn_id; p_clcb->connected = TRUE; @@ -151,8 +148,9 @@ tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TR break; } } - if(i_clcb < GATT_MAX_APPS) + if (i_clcb < GATT_MAX_APPS) { return p_clcb; + } return NULL; } @@ -181,7 +179,7 @@ void gatt_profile_clcb_dealloc (tGATT_PROFILE_CLCB *p_clcb) ** *******************************************************************************/ static void gatt_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type, - tGATTS_DATA *p_data) + tGATTS_DATA *p_data) { UINT8 status = GATT_INVALID_PDU; tGATTS_RSP rsp_msg ; @@ -189,34 +187,34 @@ static void gatt_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE memset(&rsp_msg, 0, sizeof(tGATTS_RSP)); - switch (type) - { - case GATTS_REQ_TYPE_READ: - status = GATT_READ_NOT_PERMIT; - break; + switch (type) { + case GATTS_REQ_TYPE_READ: + status = GATT_READ_NOT_PERMIT; + break; - case GATTS_REQ_TYPE_WRITE: - status = GATT_WRITE_NOT_PERMIT; - break; + case GATTS_REQ_TYPE_WRITE: + status = GATT_WRITE_NOT_PERMIT; + break; - case GATTS_REQ_TYPE_WRITE_EXEC: - case GATT_CMD_WRITE: - ignore = TRUE; - GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" ); - break; + case GATTS_REQ_TYPE_WRITE_EXEC: + case GATT_CMD_WRITE: + ignore = TRUE; + GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" ); + break; - case GATTS_REQ_TYPE_MTU: - GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu); - ignore = TRUE; - break; + case GATTS_REQ_TYPE_MTU: + GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu); + ignore = TRUE; + break; - default: - GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type); - break; + default: + GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type); + break; } - if (!ignore) + if (!ignore) { GATTS_SendRsp (conn_id, trans_id, status, &rsp_msg); + } } @@ -230,26 +228,25 @@ static void gatt_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE ** *******************************************************************************/ static void gatt_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, - BOOLEAN connected, tGATT_DISCONN_REASON reason, - tBT_TRANSPORT transport) + BOOLEAN connected, tGATT_DISCONN_REASON reason, + tBT_TRANSPORT transport) { UNUSED(gatt_if); GATT_TRACE_EVENT ("%s: from %08x%04x connected:%d conn_id=%d reason = 0x%04x", __FUNCTION__, - (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3], - (bda[4]<<8)+bda[5], connected, conn_id, reason); + (bda[0] << 24) + (bda[1] << 16) + (bda[2] << 8) + bda[3], + (bda[4] << 8) + bda[5], connected, conn_id, reason); tGATT_PROFILE_CLCB *p_clcb = gatt_profile_find_clcb_by_bd_addr(bda, transport); - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } - if (connected) - { + if (connected) { p_clcb->conn_id = conn_id; p_clcb->connected = TRUE; - if (p_clcb->ccc_stage == GATT_SVC_CHANGED_CONNECTING) - { + if (p_clcb->ccc_stage == GATT_SVC_CHANGED_CONNECTING) { p_clcb->ccc_stage ++; gatt_cl_start_config_ccc(p_clcb); } @@ -286,17 +283,17 @@ void gatt_profile_db_init (void) uuid.uu.uuid16 = gatt_cb.gattp_attr.uuid = GATT_UUID_GATT_SRV_CHGD; gatt_cb.gattp_attr.service_change = 0; gatt_cb.gattp_attr.handle = - gatt_cb.handle_of_h_r = GATTS_AddCharacteristic(service_handle, &uuid, 0, GATT_CHAR_PROP_BIT_INDICATE); + gatt_cb.handle_of_h_r = GATTS_AddCharacteristic(service_handle, &uuid, 0, GATT_CHAR_PROP_BIT_INDICATE); GATT_TRACE_DEBUG ("gatt_profile_db_init: handle of service changed%d", - gatt_cb.handle_of_h_r ); + gatt_cb.handle_of_h_r ); /* start service */ status = GATTS_StartService (gatt_cb.gatt_if, service_handle, GATTP_TRANSPORT_SUPPORTED ); GATT_TRACE_DEBUG ("gatt_profile_db_init: gatt_if=%d start status%d", - gatt_cb.gatt_if, status); + gatt_cb.gatt_if, status); } /******************************************************************************* @@ -327,11 +324,11 @@ static void gatt_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGAT { tGATT_PROFILE_CLCB *p_clcb = gatt_profile_find_clcb_by_conn_id(conn_id); - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } - switch (disc_type) - { + switch (disc_type) { case GATT_DISC_SRVC_BY_UUID:/* stage 1 */ p_clcb->e_handle = p_data->value.group_value.e_handle; p_clcb->ccc_result ++; @@ -343,8 +340,7 @@ static void gatt_disc_res_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGAT break; case GATT_DISC_CHAR_DSCPT: /* stage 3 */ - if (p_data->type.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) - { + if (p_data->type.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { p_clcb->s_handle = p_data->handle; p_clcb->ccc_result ++; } @@ -365,11 +361,11 @@ static void gatt_disc_cmpl_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGA { tGATT_PROFILE_CLCB *p_clcb = gatt_profile_find_clcb_by_conn_id(conn_id); - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } - if (status == GATT_SUCCESS && p_clcb->ccc_result > 0) - { + if (status == GATT_SUCCESS && p_clcb->ccc_result > 0) { p_clcb->ccc_result = 0; p_clcb->ccc_stage ++; gatt_cl_start_config_ccc(p_clcb); @@ -390,15 +386,15 @@ static void gatt_disc_cmpl_cback (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGA ** *******************************************************************************/ static void gatt_cl_op_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, - tGATT_STATUS status, tGATT_CL_COMPLETE *p_data) + tGATT_STATUS status, tGATT_CL_COMPLETE *p_data) { tGATT_PROFILE_CLCB *p_clcb = gatt_profile_find_clcb_by_conn_id(conn_id); - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } - if (op == GATTC_OPTYPE_WRITE) - { + if (op == GATTC_OPTYPE_WRITE) { GATT_TRACE_DEBUG("%s() - ccc write status : %d", __FUNCTION__, status); } @@ -425,15 +421,13 @@ static void gatt_cl_start_config_ccc(tGATT_PROFILE_CLCB *p_clcb) memset (&srvc_disc_param, 0 , sizeof(tGATT_DISC_PARAM)); memset (&ccc_value, 0 , sizeof(tGATT_VALUE)); - switch(p_clcb->ccc_stage) - { + switch (p_clcb->ccc_stage) { case GATT_SVC_CHANGED_SERVICE: /* discover GATT service */ srvc_disc_param.s_handle = 1; srvc_disc_param.e_handle = 0xffff; srvc_disc_param.service.len = 2; srvc_disc_param.service.uu.uuid16 = UUID_SERVCLASS_GATT_SERVER; - if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_SRVC_BY_UUID, &srvc_disc_param) != GATT_SUCCESS) - { + if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_SRVC_BY_UUID, &srvc_disc_param) != GATT_SUCCESS) { GATT_TRACE_ERROR("%s() - ccc service error", __FUNCTION__); gatt_config_ccc_complete(p_clcb); } @@ -444,8 +438,7 @@ static void gatt_cl_start_config_ccc(tGATT_PROFILE_CLCB *p_clcb) srvc_disc_param.e_handle = p_clcb->e_handle; srvc_disc_param.service.len = 2; srvc_disc_param.service.uu.uuid16 = GATT_UUID_GATT_SRV_CHGD; - if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_CHAR, &srvc_disc_param) != GATT_SUCCESS) - { + if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_CHAR, &srvc_disc_param) != GATT_SUCCESS) { GATT_TRACE_ERROR("%s() - ccc char error", __FUNCTION__); gatt_config_ccc_complete(p_clcb); } @@ -454,8 +447,7 @@ static void gatt_cl_start_config_ccc(tGATT_PROFILE_CLCB *p_clcb) case GATT_SVC_CHANGED_DESCRIPTOR: /* discover service change ccc */ srvc_disc_param.s_handle = p_clcb->s_handle; srvc_disc_param.e_handle = p_clcb->e_handle; - if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_CHAR_DSCPT, &srvc_disc_param) != GATT_SUCCESS) - { + if (GATTC_Discover (p_clcb->conn_id, GATT_DISC_CHAR_DSCPT, &srvc_disc_param) != GATT_SUCCESS) { GATT_TRACE_ERROR("%s() - ccc char descriptor error", __FUNCTION__); gatt_config_ccc_complete(p_clcb); } @@ -465,8 +457,7 @@ static void gatt_cl_start_config_ccc(tGATT_PROFILE_CLCB *p_clcb) ccc_value.handle = p_clcb->s_handle; ccc_value.len = 2; ccc_value.value[0] = GATT_CLT_CONFIG_INDICATION; - if (GATTC_Write (p_clcb->conn_id, GATT_WRITE, &ccc_value) != GATT_SUCCESS) - { + if (GATTC_Write (p_clcb->conn_id, GATT_WRITE, &ccc_value) != GATT_SUCCESS) { GATT_TRACE_ERROR("%s() - write ccc error", __FUNCTION__); gatt_config_ccc_complete(p_clcb); } @@ -488,22 +479,22 @@ void GATT_ConfigServiceChangeCCC (BD_ADDR remote_bda, BOOLEAN enable, tBT_TRANSP UINT16 conn_id = GATT_INVALID_CONN_ID; tGATT_PROFILE_CLCB *p_clcb = gatt_profile_find_clcb_by_bd_addr (remote_bda, transport); - if (p_clcb == NULL) + if (p_clcb == NULL) { p_clcb = gatt_profile_clcb_alloc (0, remote_bda, transport); + } - if (p_clcb == NULL) + if (p_clcb == NULL) { return; + } - if (GATT_GetConnIdIfConnected (gatt_cb.gatt_if, remote_bda, &p_clcb->conn_id, transport)) - { + if (GATT_GetConnIdIfConnected (gatt_cb.gatt_if, remote_bda, &p_clcb->conn_id, transport)) { p_clcb->connected = TRUE; } /* hold the link here */ GATT_Connect(gatt_cb.gatt_if, remote_bda, TRUE, transport); p_clcb->ccc_stage = GATT_SVC_CHANGED_CONNECTING; - if (!p_clcb->connected) - { + if (!p_clcb->connected) { /* wait for connection */ return; } diff --git a/components/bt/bluedroid/stack/gatt/gatt_auth.c b/components/bt/bluedroid/stack/gatt/gatt_auth.c old mode 100755 new mode 100644 index 42a19939d..c7bdc13cd --- a/components/bt/bluedroid/stack/gatt/gatt_auth.c +++ b/components/bt/bluedroid/stack/gatt/gatt_auth.c @@ -54,29 +54,26 @@ static BOOLEAN gatt_sign_data (tGATT_CLCB *p_clcb) p_data = (UINT8 *)GKI_getbuf((UINT16)(p_attr->len + 3)); /* 3 = 2 byte handle + opcode */ - if (p_data != NULL) - { + if (p_data != NULL) { p = p_data; UINT8_TO_STREAM(p, GATT_SIGN_CMD_WRITE); UINT16_TO_STREAM(p, p_attr->handle); ARRAY_TO_STREAM(p, p_attr->value, p_attr->len); /* sign data length should be attribulte value length plus 2B handle + 1B op code */ - if ((payload_size - GATT_AUTH_SIGN_LEN - 3) < p_attr->len) + if ((payload_size - GATT_AUTH_SIGN_LEN - 3) < p_attr->len) { p_attr->len = payload_size - GATT_AUTH_SIGN_LEN - 3; + } p_signature = p_attr->value + p_attr->len; if (BTM_BleDataSignature(p_clcb->p_tcb->peer_bda, - p_data, - (UINT16)(p_attr->len + 3), /* 3 = 2 byte handle + opcode */ - p_signature)) - { + p_data, + (UINT16)(p_attr->len + 3), /* 3 = 2 byte handle + opcode */ + p_signature)) { p_attr->len += BTM_BLE_AUTH_SIGN_LEN; gatt_set_ch_state(p_clcb->p_tcb, GATT_CH_OPEN); gatt_act_write(p_clcb, GATT_SEC_SIGN_DATA); - } - else - { + } else { gatt_end_operation(p_clcb, GATT_INTERNAL_ERROR, NULL); } @@ -112,13 +109,10 @@ void gatt_verify_signature(tGATT_TCB *p_tcb, BT_HDR *p_buf) p = p_orig + cmd_len - 4; STREAM_TO_UINT32(counter, p); - if (BTM_BleVerifySignature(p_tcb->peer_bda, p_orig, cmd_len, counter, p)) - { + if (BTM_BleVerifySignature(p_tcb->peer_bda, p_orig, cmd_len, counter, p)) { STREAM_TO_UINT8(op_code, p_orig); gatt_server_handle_client_req (p_tcb, op_code, (UINT16)(p_buf->len - 1), p_orig); - } - else - { + } else { /* if this is a bad signature, assume from attacker, ignore it */ GATT_TRACE_ERROR("Signature Verification Failed, data ignored"); } @@ -136,19 +130,15 @@ void gatt_verify_signature(tGATT_TCB *p_tcb, BT_HDR *p_buf) *******************************************************************************/ void gatt_sec_check_complete(BOOLEAN sec_check_ok, tGATT_CLCB *p_clcb, UINT8 sec_act) { - if (p_clcb && p_clcb->p_tcb && GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb)) + if (p_clcb && p_clcb->p_tcb && GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb)) { gatt_set_sec_act(p_clcb->p_tcb, GATT_SEC_NONE); + } - if (!sec_check_ok) - { + if (!sec_check_ok) { gatt_end_operation(p_clcb, GATT_AUTH_FAIL, NULL); - } - else if (p_clcb->operation == GATTC_OPTYPE_WRITE) - { + } else if (p_clcb->operation == GATTC_OPTYPE_WRITE) { gatt_act_write(p_clcb, sec_act); - } - else if (p_clcb->operation == GATTC_OPTYPE_READ) - { + } else if (p_clcb->operation == GATTC_OPTYPE_READ) { gatt_act_read(p_clcb, p_clcb->counter); } } @@ -171,26 +161,20 @@ void gatt_enc_cmpl_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_d UNUSED(p_ref_data); GATT_TRACE_DEBUG("gatt_enc_cmpl_cback"); - if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) - { - if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) + if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) { + if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) { return; + } - if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) - { - if (result == BTM_SUCCESS) - { - if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENCRYPT_MITM ) - { + if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) { + if (result == BTM_SUCCESS) { + if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENCRYPT_MITM ) { BTM_GetSecurityFlagsByTransport(bd_addr, &sec_flag, transport); - if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) - { + if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) { status = TRUE; } - } - else - { + } else { status = TRUE; } } @@ -198,24 +182,18 @@ void gatt_enc_cmpl_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_d GKI_freebuf(p_buf); /* start all other pending operation in queue */ count = GKI_queue_length(&p_tcb->pending_enc_clcb); - for (; count > 0; count --) - { - if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) - { + for (; count > 0; count --) { + if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) { gatt_security_check_start(p_buf->p_clcb); GKI_freebuf(p_buf); - } - else + } else { break; + } } - } - else - { + } else { GATT_TRACE_ERROR("Unknown operation encryption completed"); } - } - else - { + } else { GATT_TRACE_ERROR("enc callback for unknown bd_addr"); } } @@ -237,36 +215,28 @@ void gatt_notify_enc_cmpl(BD_ADDR bd_addr) UINT16 count; UINT8 i = 0; - if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE)) != NULL) - { - for (i = 0; i < GATT_MAX_APPS; i++) - { - if (gatt_cb.cl_rcb[i].in_use && gatt_cb.cl_rcb[i].app_cb.p_enc_cmpl_cb) - { + if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE)) != NULL) { + for (i = 0; i < GATT_MAX_APPS; i++) { + if (gatt_cb.cl_rcb[i].in_use && gatt_cb.cl_rcb[i].app_cb.p_enc_cmpl_cb) { (*gatt_cb.cl_rcb[i].app_cb.p_enc_cmpl_cb)(gatt_cb.cl_rcb[i].gatt_if, bd_addr); } } - if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) - { + if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING) { gatt_set_sec_act(p_tcb, GATT_SEC_NONE); count = GKI_queue_length(&p_tcb->pending_enc_clcb); - for (; count > 0; count --) - { - if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) - { + for (; count > 0; count --) { + if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_dequeue (&p_tcb->pending_enc_clcb)) != NULL) { gatt_security_check_start(p_buf->p_clcb); GKI_freebuf(p_buf); - } - else + } else { break; + } } } - } - else - { + } else { GATT_TRACE_DEBUG("notify GATT for encryption completion of unknown device"); } return; @@ -282,8 +252,7 @@ void gatt_notify_enc_cmpl(BD_ADDR bd_addr) *******************************************************************************/ void gatt_set_sec_act(tGATT_TCB *p_tcb, tGATT_SEC_ACTION sec_act) { - if (p_tcb) - { + if (p_tcb) { p_tcb->sec_act = sec_act; } } @@ -299,8 +268,7 @@ void gatt_set_sec_act(tGATT_TCB *p_tcb, tGATT_SEC_ACTION sec_act) tGATT_SEC_ACTION gatt_get_sec_act(tGATT_TCB *p_tcb) { tGATT_SEC_ACTION sec_act = GATT_SEC_NONE; - if (p_tcb) - { + if (p_tcb) { sec_act = p_tcb->sec_act; } return sec_act; @@ -321,14 +289,15 @@ tGATT_SEC_ACTION gatt_determine_sec_act(tGATT_CLCB *p_clcb ) UINT8 sec_flag; tGATT_TCB *p_tcb = p_clcb->p_tcb; tGATT_AUTH_REQ auth_req = p_clcb->auth_req; - BOOLEAN is_link_encrypted= FALSE; - BOOLEAN is_link_key_known=FALSE; - BOOLEAN is_key_mitm=FALSE; + BOOLEAN is_link_encrypted = FALSE; + BOOLEAN is_link_key_known = FALSE; + BOOLEAN is_key_mitm = FALSE; UINT8 key_type; tBTM_BLE_SEC_REQ_ACT sec_act = BTM_LE_SEC_NONE; - if (auth_req == GATT_AUTH_REQ_NONE ) + if (auth_req == GATT_AUTH_REQ_NONE ) { return act; + } BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_clcb->p_tcb->transport); @@ -336,67 +305,61 @@ tGATT_SEC_ACTION gatt_determine_sec_act(tGATT_CLCB *p_clcb ) /* if a encryption is pending, need to wait */ if (sec_act == BTM_BLE_SEC_REQ_ACT_DISCARD && - auth_req != GATT_AUTH_REQ_NONE) + auth_req != GATT_AUTH_REQ_NONE) { return GATT_SEC_ENC_PENDING; + } - if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED| BTM_SEC_FLAG_LKEY_KNOWN)) - { - if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) + if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED | BTM_SEC_FLAG_LKEY_KNOWN)) { + if (sec_flag & BTM_SEC_FLAG_ENCRYPTED) { is_link_encrypted = TRUE; + } is_link_key_known = TRUE; - if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) + if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) { is_key_mitm = TRUE; + } } /* first check link key upgrade required or not */ - switch (auth_req) - { - case GATT_AUTH_REQ_MITM: - case GATT_AUTH_REQ_SIGNED_MITM: - if (!is_key_mitm) - act = GATT_SEC_ENCRYPT_MITM; - break; + switch (auth_req) { + case GATT_AUTH_REQ_MITM: + case GATT_AUTH_REQ_SIGNED_MITM: + if (!is_key_mitm) { + act = GATT_SEC_ENCRYPT_MITM; + } + break; - case GATT_AUTH_REQ_NO_MITM: - case GATT_AUTH_REQ_SIGNED_NO_MITM: - if (!is_link_key_known) - act = GATT_SEC_ENCRYPT_NO_MITM; - break; - default: - break; + case GATT_AUTH_REQ_NO_MITM: + case GATT_AUTH_REQ_SIGNED_NO_MITM: + if (!is_link_key_known) { + act = GATT_SEC_ENCRYPT_NO_MITM; + } + break; + default: + break; } /* now check link needs to be encrypted or not if the link key upgrade is not required */ - if (act == GATT_SEC_OK) - { + if (act == GATT_SEC_OK) { if (p_tcb->transport == BT_TRANSPORT_LE && - (p_clcb->operation == GATTC_OPTYPE_WRITE) && - (p_clcb->op_subtype == GATT_WRITE_NO_RSP)) - { + (p_clcb->operation == GATTC_OPTYPE_WRITE) && + (p_clcb->op_subtype == GATT_WRITE_NO_RSP)) { /* this is a write command request check data signing required or not */ - if (!is_link_encrypted) - { + if (!is_link_encrypted) { btm_ble_get_enc_key_type(p_tcb->peer_bda, &key_type); if ( (key_type & BTM_LE_KEY_LCSRK) && - ((auth_req == GATT_AUTH_REQ_SIGNED_NO_MITM) || - (auth_req == GATT_AUTH_REQ_SIGNED_MITM))) - { + ((auth_req == GATT_AUTH_REQ_SIGNED_NO_MITM) || + (auth_req == GATT_AUTH_REQ_SIGNED_MITM))) { act = GATT_SEC_SIGN_DATA; - } - else - { + } else { act = GATT_SEC_ENCRYPT; } } - } - else - { - if (!is_link_encrypted) - { + } else { + if (!is_link_encrypted) { act = GATT_SEC_ENCRYPT; } } @@ -422,18 +385,18 @@ tGATT_SEC_ACTION gatt_determine_sec_act(tGATT_CLCB *p_clcb ) tGATT_STATUS gatt_get_link_encrypt_status(tGATT_TCB *p_tcb) { tGATT_STATUS encrypt_status = GATT_NOT_ENCRYPTED; - UINT8 sec_flag=0; + UINT8 sec_flag = 0; BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_tcb->transport); - if ((sec_flag & BTM_SEC_FLAG_ENCRYPTED) && (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) - { + if ((sec_flag & BTM_SEC_FLAG_ENCRYPTED) && (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)) { encrypt_status = GATT_ENCRYPED_NO_MITM; - if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) + if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) { encrypt_status = GATT_ENCRYPED_MITM; + } } - GATT_TRACE_DEBUG("gatt_get_link_encrypt_status status=0x%x",encrypt_status); + GATT_TRACE_DEBUG("gatt_get_link_encrypt_status status=0x%x", encrypt_status); return encrypt_status ; } @@ -450,20 +413,19 @@ tGATT_STATUS gatt_get_link_encrypt_status(tGATT_TCB *p_tcb) static BOOLEAN gatt_convert_sec_action(tGATT_SEC_ACTION gatt_sec_act, tBTM_BLE_SEC_ACT *p_btm_sec_act ) { BOOLEAN status = TRUE; - switch (gatt_sec_act) - { - case GATT_SEC_ENCRYPT: - *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT; - break; - case GATT_SEC_ENCRYPT_NO_MITM: - *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM; - break; - case GATT_SEC_ENCRYPT_MITM: - *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_MITM; - break; - default: - status = FALSE; - break; + switch (gatt_sec_act) { + case GATT_SEC_ENCRYPT: + *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT; + break; + case GATT_SEC_ENCRYPT_NO_MITM: + *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_NO_MITM; + break; + case GATT_SEC_ENCRYPT_MITM: + *p_btm_sec_act = BTM_BLE_SEC_ENCRYPT_MITM; + break; + default: + status = FALSE; + break; } return status; @@ -488,43 +450,41 @@ BOOLEAN gatt_security_check_start(tGATT_CLCB *p_clcb) gatt_sec_act = gatt_determine_sec_act(p_clcb); - if (sec_act_old == GATT_SEC_NONE) + if (sec_act_old == GATT_SEC_NONE) { gatt_set_sec_act(p_tcb, gatt_sec_act); - - switch (gatt_sec_act ) - { - case GATT_SEC_SIGN_DATA: - GATT_TRACE_DEBUG("gatt_security_check_start: Do data signing"); - gatt_sign_data(p_clcb); - break; - case GATT_SEC_ENCRYPT: - case GATT_SEC_ENCRYPT_NO_MITM: - case GATT_SEC_ENCRYPT_MITM: - if (sec_act_old < GATT_SEC_ENCRYPT) - { - GATT_TRACE_DEBUG("gatt_security_check_start: Encrypt now or key upgreade first"); - gatt_convert_sec_action(gatt_sec_act, &btm_ble_sec_act); - btm_status = BTM_SetEncryption(p_tcb->peer_bda, p_tcb->transport , gatt_enc_cmpl_cback, &btm_ble_sec_act); - if ( (btm_status != BTM_SUCCESS) && (btm_status != BTM_CMD_STARTED)) - { - GATT_TRACE_ERROR("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status); - status = FALSE; - } - } - if (status) - gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); - break; - case GATT_SEC_ENC_PENDING: - gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); - /* wait for link encrypotion to finish */ - break; - default: - gatt_sec_check_complete(TRUE, p_clcb, gatt_sec_act); - break; } - if (status == FALSE) - { + switch (gatt_sec_act ) { + case GATT_SEC_SIGN_DATA: + GATT_TRACE_DEBUG("gatt_security_check_start: Do data signing"); + gatt_sign_data(p_clcb); + break; + case GATT_SEC_ENCRYPT: + case GATT_SEC_ENCRYPT_NO_MITM: + case GATT_SEC_ENCRYPT_MITM: + if (sec_act_old < GATT_SEC_ENCRYPT) { + GATT_TRACE_DEBUG("gatt_security_check_start: Encrypt now or key upgreade first"); + gatt_convert_sec_action(gatt_sec_act, &btm_ble_sec_act); + btm_status = BTM_SetEncryption(p_tcb->peer_bda, p_tcb->transport , gatt_enc_cmpl_cback, &btm_ble_sec_act); + if ( (btm_status != BTM_SUCCESS) && (btm_status != BTM_CMD_STARTED)) { + GATT_TRACE_ERROR("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status); + status = FALSE; + } + } + if (status) { + gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); + } + break; + case GATT_SEC_ENC_PENDING: + gatt_add_pending_enc_channel_clcb (p_tcb, p_clcb); + /* wait for link encrypotion to finish */ + break; + default: + gatt_sec_check_complete(TRUE, p_clcb, gatt_sec_act); + break; + } + + if (status == FALSE) { gatt_set_sec_act(p_tcb, GATT_SEC_NONE); gatt_set_ch_state(p_tcb, GATT_CH_OPEN); } diff --git a/components/bt/bluedroid/stack/gatt/gatt_cl.c b/components/bt/bluedroid/stack/gatt/gatt_cl.c old mode 100755 new mode 100644 index 5db6969f7..095b87dee --- a/components/bt/bluedroid/stack/gatt/gatt_cl.c +++ b/components/bt/bluedroid/stack/gatt/gatt_cl.c @@ -48,8 +48,7 @@ *********************************************************************************/ void gatt_send_prepare_write(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb); -UINT8 disc_type_to_att_opcode[GATT_DISC_MAX] = -{ +UINT8 disc_type_to_att_opcode[GATT_DISC_MAX] = { 0, GATT_REQ_READ_BY_GRP_TYPE, /* GATT_DISC_SRVC_ALL = 1, */ GATT_REQ_FIND_TYPE_VALUE, /* GATT_DISC_SRVC_BY_UUID, */ @@ -58,8 +57,7 @@ UINT8 disc_type_to_att_opcode[GATT_DISC_MAX] = GATT_REQ_FIND_INFO /* GATT_DISC_CHAR_DSCPT, */ }; -UINT16 disc_type_to_uuid[GATT_DISC_MAX] = -{ +UINT16 disc_type_to_uuid[GATT_DISC_MAX] = { 0, /* reserved */ GATT_UUID_PRI_SERVICE, /* DISC_SRVC_ALL */ GATT_UUID_PRI_SERVICE, /* for DISC_SERVC_BY_UUID */ @@ -84,45 +82,40 @@ void gatt_act_discovery(tGATT_CLCB *p_clcb) tGATT_CL_MSG cl_req; tGATT_STATUS st; - if (p_clcb->s_handle <= p_clcb->e_handle && p_clcb->s_handle != 0) - { + if (p_clcb->s_handle <= p_clcb->e_handle && p_clcb->s_handle != 0) { memset(&cl_req, 0, sizeof(tGATT_CL_MSG)); cl_req.browse.s_handle = p_clcb->s_handle; cl_req.browse.e_handle = p_clcb->e_handle; - if (disc_type_to_uuid[p_clcb->op_subtype] != 0) - { + if (disc_type_to_uuid[p_clcb->op_subtype] != 0) { cl_req.browse.uuid.len = 2; cl_req.browse.uuid.uu.uuid16 = disc_type_to_uuid[p_clcb->op_subtype]; } - if (p_clcb->op_subtype == GATT_DISC_SRVC_BY_UUID) /* fill in the FindByTypeValue request info*/ - { + if (p_clcb->op_subtype == GATT_DISC_SRVC_BY_UUID) { /* fill in the FindByTypeValue request info*/ cl_req.find_type_value.uuid.len = 2; cl_req.find_type_value.uuid.uu.uuid16 = disc_type_to_uuid[p_clcb->op_subtype]; cl_req.find_type_value.s_handle = p_clcb->s_handle; cl_req.find_type_value.e_handle = p_clcb->e_handle; cl_req.find_type_value.value_len = p_clcb->uuid.len; /* if service type is 32 bits UUID, convert it now */ - if (p_clcb->uuid.len == LEN_UUID_32) - { + if (p_clcb->uuid.len == LEN_UUID_32) { cl_req.find_type_value.value_len = LEN_UUID_128; gatt_convert_uuid32_to_uuid128(cl_req.find_type_value.value, p_clcb->uuid.uu.uuid32); + } else { + memcpy (cl_req.find_type_value.value, &p_clcb->uuid.uu, p_clcb->uuid.len); } - else - memcpy (cl_req.find_type_value.value, &p_clcb->uuid.uu, p_clcb->uuid.len); } st = attp_send_cl_msg(p_clcb->p_tcb, p_clcb->clcb_idx, op_code, &cl_req); - if (st != GATT_SUCCESS && st != GATT_CMD_STARTED) - { + if (st != GATT_SUCCESS && st != GATT_CMD_STARTED) { gatt_end_operation(p_clcb, GATT_ERROR, NULL); } - } - else /* end of handle range */ + } else { /* end of handle range */ gatt_end_operation(p_clcb, GATT_SUCCESS, NULL); + } } /******************************************************************************* @@ -143,72 +136,68 @@ void gatt_act_read (tGATT_CLCB *p_clcb, UINT16 offset) memset (&msg, 0, sizeof(tGATT_CL_MSG)); - switch (p_clcb->op_subtype) - { - case GATT_READ_CHAR_VALUE: - case GATT_READ_BY_TYPE: - op_code = GATT_REQ_READ_BY_TYPE; - msg.browse.s_handle = p_clcb->s_handle; - msg.browse.e_handle = p_clcb->e_handle; - if (p_clcb->op_subtype == GATT_READ_BY_TYPE) - memcpy(&msg.browse.uuid, &p_clcb->uuid, sizeof(tBT_UUID)); - else - { - msg.browse.uuid.len = LEN_UUID_16; - msg.browse.uuid.uu.uuid16 = GATT_UUID_CHAR_DECLARE; - } - break; + switch (p_clcb->op_subtype) { + case GATT_READ_CHAR_VALUE: + case GATT_READ_BY_TYPE: + op_code = GATT_REQ_READ_BY_TYPE; + msg.browse.s_handle = p_clcb->s_handle; + msg.browse.e_handle = p_clcb->e_handle; + if (p_clcb->op_subtype == GATT_READ_BY_TYPE) { + memcpy(&msg.browse.uuid, &p_clcb->uuid, sizeof(tBT_UUID)); + } else { + msg.browse.uuid.len = LEN_UUID_16; + msg.browse.uuid.uu.uuid16 = GATT_UUID_CHAR_DECLARE; + } + break; - case GATT_READ_CHAR_VALUE_HDL: - case GATT_READ_BY_HANDLE: - if (!p_clcb->counter) - { - op_code = GATT_REQ_READ; - msg.handle = p_clcb->s_handle; - } - else - { - if (!p_clcb->first_read_blob_after_read) - p_clcb->first_read_blob_after_read = TRUE; - else - p_clcb->first_read_blob_after_read = FALSE; - - GATT_TRACE_DEBUG("gatt_act_read first_read_blob_after_read=%d", - p_clcb->first_read_blob_after_read); - op_code = GATT_REQ_READ_BLOB; - msg.read_blob.offset = offset; - msg.read_blob.handle = p_clcb->s_handle; - } - p_clcb->op_subtype &= ~ 0x80; - break; - - case GATT_READ_PARTIAL: - op_code = GATT_REQ_READ_BLOB; - msg.read_blob.handle = p_clcb->s_handle; - msg.read_blob.offset = offset; - break; - - case GATT_READ_MULTIPLE: - op_code = GATT_REQ_READ_MULTI; - memcpy (&msg.read_multi, p_clcb->p_attr_buf, sizeof(tGATT_READ_MULTI)); - break; - - case GATT_READ_INC_SRV_UUID128: + case GATT_READ_CHAR_VALUE_HDL: + case GATT_READ_BY_HANDLE: + if (!p_clcb->counter) { op_code = GATT_REQ_READ; msg.handle = p_clcb->s_handle; - p_clcb->op_subtype &= ~ 0x90; - break; + } else { + if (!p_clcb->first_read_blob_after_read) { + p_clcb->first_read_blob_after_read = TRUE; + } else { + p_clcb->first_read_blob_after_read = FALSE; + } - default: - GATT_TRACE_ERROR("Unknown read type: %d", p_clcb->op_subtype); - break; + GATT_TRACE_DEBUG("gatt_act_read first_read_blob_after_read=%d", + p_clcb->first_read_blob_after_read); + op_code = GATT_REQ_READ_BLOB; + msg.read_blob.offset = offset; + msg.read_blob.handle = p_clcb->s_handle; + } + p_clcb->op_subtype &= ~ 0x80; + break; + + case GATT_READ_PARTIAL: + op_code = GATT_REQ_READ_BLOB; + msg.read_blob.handle = p_clcb->s_handle; + msg.read_blob.offset = offset; + break; + + case GATT_READ_MULTIPLE: + op_code = GATT_REQ_READ_MULTI; + memcpy (&msg.read_multi, p_clcb->p_attr_buf, sizeof(tGATT_READ_MULTI)); + break; + + case GATT_READ_INC_SRV_UUID128: + op_code = GATT_REQ_READ; + msg.handle = p_clcb->s_handle; + p_clcb->op_subtype &= ~ 0x90; + break; + + default: + GATT_TRACE_ERROR("Unknown read type: %d", p_clcb->op_subtype); + break; } - if (op_code != 0) + if (op_code != 0) { rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, op_code, &msg); + } - if ( op_code == 0 || (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED)) - { + if ( op_code == 0 || (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED)) { gatt_end_operation(p_clcb, rt, NULL); } } @@ -228,59 +217,52 @@ void gatt_act_write (tGATT_CLCB *p_clcb, UINT8 sec_act) UINT8 rt = GATT_SUCCESS, op_code = 0; tGATT_VALUE *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf; - if (p_attr) - { - switch (p_clcb->op_subtype) - { - case GATT_WRITE_NO_RSP: + if (p_attr) { + switch (p_clcb->op_subtype) { + case GATT_WRITE_NO_RSP: + p_clcb->s_handle = p_attr->handle; + op_code = (sec_act == GATT_SEC_SIGN_DATA) ? GATT_SIGN_CMD_WRITE : GATT_CMD_WRITE; + rt = gatt_send_write_msg(p_tcb, + p_clcb->clcb_idx, + op_code, + p_attr->handle, + p_attr->len, + 0, + p_attr->value); + break; + + case GATT_WRITE: + if (p_attr->len <= (p_tcb->payload_size - GATT_HDR_SIZE)) { p_clcb->s_handle = p_attr->handle; - op_code = (sec_act == GATT_SEC_SIGN_DATA) ? GATT_SIGN_CMD_WRITE : GATT_CMD_WRITE; + rt = gatt_send_write_msg(p_tcb, p_clcb->clcb_idx, - op_code, + GATT_REQ_WRITE, p_attr->handle, p_attr->len, 0, p_attr->value); - break; - - case GATT_WRITE: - if (p_attr->len <= (p_tcb->payload_size - GATT_HDR_SIZE)) - { - p_clcb->s_handle = p_attr->handle; - - rt = gatt_send_write_msg(p_tcb, - p_clcb->clcb_idx, - GATT_REQ_WRITE, - p_attr->handle, - p_attr->len, - 0, - p_attr->value); - } - else /* prepare write for long attribute */ - { - gatt_send_prepare_write(p_tcb, p_clcb); - } - break; - - case GATT_WRITE_PREPARE: + } else { /* prepare write for long attribute */ gatt_send_prepare_write(p_tcb, p_clcb); - break; + } + break; - default: - rt = GATT_INTERNAL_ERROR; - GATT_TRACE_ERROR("Unknown write type: %d", p_clcb->op_subtype); - break; + case GATT_WRITE_PREPARE: + gatt_send_prepare_write(p_tcb, p_clcb); + break; + + default: + rt = GATT_INTERNAL_ERROR; + GATT_TRACE_ERROR("Unknown write type: %d", p_clcb->op_subtype); + break; } - } - else + } else { rt = GATT_INTERNAL_ERROR; + } if ((rt != GATT_SUCCESS && rt != GATT_CMD_STARTED && rt != GATT_CONGESTED) - || (rt != GATT_CMD_STARTED && p_clcb->op_subtype == GATT_WRITE_NO_RSP)) - { - if (rt != GATT_SUCCESS) - { + || (rt != GATT_CMD_STARTED && p_clcb->op_subtype == GATT_WRITE_NO_RSP)) { + if (rt != GATT_SUCCESS) { GATT_TRACE_ERROR("gatt_act_write() failed op_code=0x%x rt=%d", op_code, rt); } gatt_end_operation(p_clcb, rt, NULL); @@ -303,8 +285,7 @@ void gatt_send_queue_write_cancel (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, tGATT_E rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, GATT_REQ_EXEC_WRITE, (tGATT_CL_MSG *)&flag); - if (rt != GATT_SUCCESS) - { + if (rt != GATT_SUCCESS) { gatt_end_operation(p_clcb, rt, NULL); } } @@ -325,27 +306,23 @@ BOOLEAN gatt_check_write_long_terminate(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, t GATT_TRACE_DEBUG("gatt_check_write_long_terminate "); /* check the first write response status */ - if (p_rsp_value != NULL) - { + if (p_rsp_value != NULL) { if (p_rsp_value->handle != p_attr->handle || - p_rsp_value->len != p_clcb->counter || - memcmp(p_rsp_value->value, p_attr->value + p_attr->offset, p_rsp_value->len)) - { + p_rsp_value->len != p_clcb->counter || + memcmp(p_rsp_value->value, p_attr->value + p_attr->offset, p_rsp_value->len)) { /* data does not match */ p_clcb->status = GATT_ERROR; flag = GATT_PREP_WRITE_CANCEL; exec = TRUE; - } - else /* response checking is good */ - { + } else { /* response checking is good */ p_clcb->status = GATT_SUCCESS; /* update write offset and check if end of attribute value */ - if ((p_attr->offset += p_rsp_value->len) >= p_attr->len) + if ((p_attr->offset += p_rsp_value->len) >= p_attr->len) { exec = TRUE; + } } } - if (exec) - { + if (exec) { gatt_send_queue_write_cancel (p_tcb, p_clcb, flag); return TRUE; } @@ -370,14 +347,14 @@ void gatt_send_prepare_write(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb) GATT_TRACE_DEBUG("gatt_send_prepare_write type=0x%x", type ); to_send = p_attr->len - p_attr->offset; - if (to_send > (p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE)) /* 2 = UINT16 offset bytes */ + if (to_send > (p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE)) { /* 2 = UINT16 offset bytes */ to_send = p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE; + } p_clcb->s_handle = p_attr->handle; offset = p_attr->offset; - if (type == GATT_WRITE_PREPARE) - { + if (type == GATT_WRITE_PREPARE) { offset += p_clcb->start_offset; } @@ -394,8 +371,7 @@ void gatt_send_prepare_write(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb) /* remember the write long attribute length */ p_clcb->counter = to_send; - if (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED) - { + if (rt != GATT_SUCCESS && rt != GATT_CMD_STARTED) { gatt_end_operation(p_clcb, rt, NULL); } } @@ -420,24 +396,25 @@ void gatt_process_find_type_value_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UIN GATT_TRACE_DEBUG("gatt_process_find_type_value_rsp "); /* unexpected response */ - if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_SRVC_BY_UUID) + if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_SRVC_BY_UUID) { return; + } memset (&result, 0, sizeof(tGATT_DISC_RES)); result.type.len = 2; result.type.uu.uuid16 = GATT_UUID_PRI_SERVICE; /* returns a series of handle ranges */ - while (len >= 4) - { + while (len >= 4) { STREAM_TO_UINT16 (result.handle, p); STREAM_TO_UINT16 (result.value.group_value.e_handle, p); memcpy (&result.value.group_value.service_type, &p_clcb->uuid, sizeof(tBT_UUID)); len -= 4; - if (p_clcb->p_reg->app_cb.p_disc_res_cb) + if (p_clcb->p_reg->app_cb.p_disc_res_cb) { (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result); + } } /* last handle + 1 */ @@ -465,43 +442,44 @@ void gatt_process_read_info_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_c UNUSED(p_tcb); UNUSED(op_code); - if (len < GATT_INFO_RSP_MIN_LEN) - { + if (len < GATT_INFO_RSP_MIN_LEN) { GATT_TRACE_ERROR("invalid Info Response PDU received, discard."); gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL); return; } /* unexpected response */ - if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_CHAR_DSCPT) + if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_CHAR_DSCPT) { return; + } STREAM_TO_UINT8(type, p); len -= 1; - if (type == GATT_INFO_TYPE_PAIR_16) + if (type == GATT_INFO_TYPE_PAIR_16) { uuid_len = LEN_UUID_16; - else if (type == GATT_INFO_TYPE_PAIR_128) + } else if (type == GATT_INFO_TYPE_PAIR_128) { uuid_len = LEN_UUID_128; + } - while (len >= uuid_len + 2) - { + while (len >= uuid_len + 2) { STREAM_TO_UINT16 (result.handle, p); - if (uuid_len > 0) - { - if (!gatt_parse_uuid_from_cmd(&result.type, uuid_len, &p)) + if (uuid_len > 0) { + if (!gatt_parse_uuid_from_cmd(&result.type, uuid_len, &p)) { break; - } - else + } + } else { memcpy (&result.type, &p_clcb->uuid, sizeof(tBT_UUID)); + } len -= (uuid_len + 2); - if (p_clcb->p_reg->app_cb.p_disc_res_cb) + if (p_clcb->p_reg->app_cb.p_disc_res_cb) { (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result); + } } - p_clcb->s_handle = (result.handle == 0) ? 0 :(result.handle + 1); + p_clcb->s_handle = (result.handle == 0) ? 0 : (result.handle + 1); /* initiate another request */ gatt_act_discovery(p_clcb) ; } @@ -525,21 +503,19 @@ void gatt_proc_disc_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 opcode GATT_TRACE_DEBUG("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode); - switch (opcode) - { - case GATT_REQ_READ_BY_GRP_TYPE: - case GATT_REQ_FIND_TYPE_VALUE: - case GATT_REQ_READ_BY_TYPE: - case GATT_REQ_FIND_INFO: - if (reason == GATT_NOT_FOUND) - { - status = GATT_SUCCESS; - GATT_TRACE_DEBUG("Discovery completed"); - } - break; - default: - GATT_TRACE_ERROR("Incorrect discovery opcode %04x", opcode); - break; + switch (opcode) { + case GATT_REQ_READ_BY_GRP_TYPE: + case GATT_REQ_FIND_TYPE_VALUE: + case GATT_REQ_READ_BY_TYPE: + case GATT_REQ_FIND_INFO: + if (reason == GATT_NOT_FOUND) { + status = GATT_SUCCESS; + GATT_TRACE_DEBUG("Discovery completed"); + } + break; + default: + GATT_TRACE_ERROR("Incorrect discovery opcode %04x", opcode); + break; } gatt_end_operation(p_clcb, status, NULL); @@ -558,7 +534,7 @@ void gatt_proc_disc_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 opcode void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code, UINT16 len, UINT8 *p_data) { - UINT8 opcode, reason, * p= p_data; + UINT8 opcode, reason, * p = p_data; UINT16 handle; tGATT_VALUE *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf; @@ -570,32 +546,26 @@ void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code, STREAM_TO_UINT16(handle, p); STREAM_TO_UINT8(reason, p); - if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) - { + if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) { gatt_proc_disc_error_rsp(p_tcb, p_clcb, opcode, handle, reason); - } - else - { + } else { if ( (p_clcb->operation == GATTC_OPTYPE_WRITE) && - (p_clcb->op_subtype == GATT_WRITE) && - (opcode == GATT_REQ_PREPARE_WRITE) && - (p_attr) && - (handle == p_attr->handle) ) - { + (p_clcb->op_subtype == GATT_WRITE) && + (opcode == GATT_REQ_PREPARE_WRITE) && + (p_attr) && + (handle == p_attr->handle) ) { p_clcb->status = reason; gatt_send_queue_write_cancel(p_tcb, p_clcb, GATT_PREP_WRITE_CANCEL); - } - else if ((p_clcb->operation == GATTC_OPTYPE_READ) && - ((p_clcb->op_subtype == GATT_READ_CHAR_VALUE_HDL) || - (p_clcb->op_subtype == GATT_READ_BY_HANDLE)) && - (opcode == GATT_REQ_READ_BLOB) && - p_clcb->first_read_blob_after_read && - (reason == GATT_NOT_LONG)) - { + } else if ((p_clcb->operation == GATTC_OPTYPE_READ) && + ((p_clcb->op_subtype == GATT_READ_CHAR_VALUE_HDL) || + (p_clcb->op_subtype == GATT_READ_BY_HANDLE)) && + (opcode == GATT_REQ_READ_BLOB) && + p_clcb->first_read_blob_after_read && + (reason == GATT_NOT_LONG)) { gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p_clcb->p_attr_buf); - } - else + } else { gatt_end_operation(p_clcb, reason, NULL); + } } } /******************************************************************************* @@ -612,12 +582,11 @@ void gatt_process_prep_write_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op UINT16 len, UINT8 *p_data) { tGATT_VALUE value = {0}; - UINT8 *p= p_data; + UINT8 *p = p_data; GATT_TRACE_ERROR("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len); - if (len < GATT_PREP_WRITE_RSP_MIN_LEN) - { + if (len < GATT_PREP_WRITE_RSP_MIN_LEN) { GATT_TRACE_ERROR("illegal prepare write response length, discard"); gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value); return; @@ -630,18 +599,16 @@ void gatt_process_prep_write_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op memcpy (value.value, p, value.len); - if (p_clcb->op_subtype == GATT_WRITE_PREPARE) - { + if (p_clcb->op_subtype == GATT_WRITE_PREPARE) { p_clcb->status = GATT_SUCCESS; /* application should verify handle offset and value are matched or not */ gatt_end_operation(p_clcb, p_clcb->status, &value); - } - else if (p_clcb->op_subtype == GATT_WRITE ) - { - if (!gatt_check_write_long_terminate(p_tcb, p_clcb, &value)) + } else if (p_clcb->op_subtype == GATT_WRITE ) { + if (!gatt_check_write_long_terminate(p_tcb, p_clcb, &value)) { gatt_send_prepare_write(p_tcb, p_clcb); + } } } @@ -663,13 +630,12 @@ void gatt_process_notification(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_REG *p_reg; UINT16 conn_id; tGATT_STATUS encrypt_status; - UINT8 *p= p_data, i, - event = (op_code == GATT_HANDLE_VALUE_NOTIF) ? GATTC_OPTYPE_NOTIFICATION : GATTC_OPTYPE_INDICATION; + UINT8 *p = p_data, i, + event = (op_code == GATT_HANDLE_VALUE_NOTIF) ? GATTC_OPTYPE_NOTIFICATION : GATTC_OPTYPE_INDICATION; GATT_TRACE_DEBUG("gatt_process_notification "); - if (len < GATT_NOTIFICATION_MIN_LEN) - { + if (len < GATT_NOTIFICATION_MIN_LEN) { GATT_TRACE_ERROR("illegal notification PDU length, discard"); return; } @@ -678,18 +644,16 @@ void gatt_process_notification(tGATT_TCB *p_tcb, UINT8 op_code, value.len = len - 2; memcpy (value.value, p, value.len); - if (!GATT_HANDLE_IS_VALID(value.handle)) - { + if (!GATT_HANDLE_IS_VALID(value.handle)) { /* illegal handle, send ack now */ - if (op_code == GATT_HANDLE_VALUE_IND) + if (op_code == GATT_HANDLE_VALUE_IND) { attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, NULL); + } return; } - if (event == GATTC_OPTYPE_INDICATION) - { - if (p_tcb->ind_count) - { + if (event == GATTC_OPTYPE_INDICATION) { + if (p_tcb->ind_count) { /* this is an error case that receiving an indication but we still has an indication not being acked yet. For now, just log the error reset the counter. @@ -704,26 +668,24 @@ void gatt_process_notification(tGATT_TCB *p_tcb, UINT8 op_code, Note: need to do the indication count and start timer first then do callback */ - for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++) - { - if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb && (event == GATTC_OPTYPE_INDICATION)) + for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++) { + if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb && (event == GATTC_OPTYPE_INDICATION)) { p_tcb->ind_count++; + } } - if (event == GATTC_OPTYPE_INDICATION) - { + if (event == GATTC_OPTYPE_INDICATION) { /* start a timer for app confirmation */ - if (p_tcb->ind_count > 0) + if (p_tcb->ind_count > 0) { gatt_start_ind_ack_timer(p_tcb); - else /* no app to indicate, or invalid handle */ + } else { /* no app to indicate, or invalid handle */ attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, NULL); + } } encrypt_status = gatt_get_link_encrypt_status(p_tcb); - for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++) - { - if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb) - { + for (i = 0, p_reg = gatt_cb.cl_rcb; i < GATT_MAX_APPS; i++, p_reg++) { + if (p_reg->in_use && p_reg->app_cb.p_cmpl_cb) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); (*p_reg->app_cb.p_cmpl_cb) (conn_id, event, encrypt_status, (tGATT_CL_COMPLETE *)&value); } @@ -751,11 +713,11 @@ void gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 UINT16 handle = 0; /* discovery procedure and no callback function registered */ - if (((!p_clcb->p_reg) || (!p_clcb->p_reg->app_cb.p_disc_res_cb)) && (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)) + if (((!p_clcb->p_reg) || (!p_clcb->p_reg->app_cb.p_disc_res_cb)) && (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)) { return; + } - if (len < GATT_READ_BY_TYPE_RSP_MIN_LEN) - { + if (len < GATT_READ_BY_TYPE_RSP_MIN_LEN) { GATT_TRACE_ERROR("Illegal ReadByType/ReadByGroupType Response length, discard"); gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL); return; @@ -763,28 +725,26 @@ void gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 STREAM_TO_UINT8(value_len, p); - if ((value_len > (p_tcb->payload_size - 2)) || (value_len > (len-1)) ) - { + if ((value_len > (p_tcb->payload_size - 2)) || (value_len > (len - 1)) ) { /* this is an error case that server's response containing a value length which is larger than MTU-2 or value_len > message total length -1 */ GATT_TRACE_ERROR("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)", - op_code, value_len, (p_tcb->payload_size - 2), (len-1)); + op_code, value_len, (p_tcb->payload_size - 2), (len - 1)); gatt_end_operation(p_clcb, GATT_ERROR, NULL); return; } - if (op_code == GATT_RSP_READ_BY_GRP_TYPE) + if (op_code == GATT_RSP_READ_BY_GRP_TYPE) { handle_len = 4; + } value_len -= handle_len; /* substract the handle pairs bytes */ len -= 1; - while (len >= (handle_len + value_len)) - { + while (len >= (handle_len + value_len)) { STREAM_TO_UINT16(handle, p); - if (!GATT_HANDLE_IS_VALID(handle)) - { + if (!GATT_HANDLE_IS_VALID(handle)) { gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL); return; } @@ -798,46 +758,36 @@ void gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 /* discover all services */ if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && - p_clcb->op_subtype == GATT_DISC_SRVC_ALL && - op_code == GATT_RSP_READ_BY_GRP_TYPE) - { + p_clcb->op_subtype == GATT_DISC_SRVC_ALL && + op_code == GATT_RSP_READ_BY_GRP_TYPE) { STREAM_TO_UINT16(handle, p); - if (!GATT_HANDLE_IS_VALID(handle)) - { + if (!GATT_HANDLE_IS_VALID(handle)) { gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL); return; - } - else - { + } else { record_value.group_value.e_handle = handle; - if (!gatt_parse_uuid_from_cmd(&record_value.group_value.service_type, value_len, &p)) - { + if (!gatt_parse_uuid_from_cmd(&record_value.group_value.service_type, value_len, &p)) { GATT_TRACE_ERROR("discover all service response parsing failure"); break; } } } /* discover included service */ - else if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->op_subtype == GATT_DISC_INC_SRVC) - { + else if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->op_subtype == GATT_DISC_INC_SRVC) { STREAM_TO_UINT16(record_value.incl_service.s_handle, p); STREAM_TO_UINT16(record_value.incl_service.e_handle, p); if (!GATT_HANDLE_IS_VALID(record_value.incl_service.s_handle) || - !GATT_HANDLE_IS_VALID(record_value.incl_service.e_handle)) - { + !GATT_HANDLE_IS_VALID(record_value.incl_service.e_handle)) { gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL); return; } - if(value_len == 6) - { + if (value_len == 6) { STREAM_TO_UINT16(record_value.incl_service.service_type.uu.uuid16, p); record_value.incl_service.service_type.len = LEN_UUID_16; - } - else if (value_len == 4) - { + } else if (value_len == 4) { p_clcb->s_handle = record_value.incl_service.s_handle; p_clcb->read_uuid128.wait_for_read_rsp = TRUE; p_clcb->read_uuid128.next_disc_start_hdl = handle + 1; @@ -846,62 +796,50 @@ void gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 p_clcb->op_subtype |= 0x90; gatt_act_read(p_clcb, 0); return; - } - else - { - GATT_TRACE_ERROR("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len); - gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p); - return; + } else { + GATT_TRACE_ERROR("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len); + gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p); + return; } } /* read by type */ - else if (p_clcb->operation == GATTC_OPTYPE_READ && p_clcb->op_subtype == GATT_READ_BY_TYPE) - { + else if (p_clcb->operation == GATTC_OPTYPE_READ && p_clcb->op_subtype == GATT_READ_BY_TYPE) { p_clcb->counter = len - 2; p_clcb->s_handle = handle; - if ( p_clcb->counter == (p_clcb->p_tcb->payload_size -4)) - { + if ( p_clcb->counter == (p_clcb->p_tcb->payload_size - 4)) { p_clcb->op_subtype = GATT_READ_BY_HANDLE; - if (!p_clcb->p_attr_buf) + if (!p_clcb->p_attr_buf) { p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf(GATT_MAX_ATTR_LEN); - if (p_clcb->p_attr_buf && p_clcb->counter <= GATT_MAX_ATTR_LEN) - { + } + if (p_clcb->p_attr_buf && p_clcb->counter <= GATT_MAX_ATTR_LEN) { memcpy(p_clcb->p_attr_buf, p, p_clcb->counter); gatt_act_read(p_clcb, p_clcb->counter); + } else { + gatt_end_operation(p_clcb, GATT_INTERNAL_ERROR, (void *)p); } - else - gatt_end_operation(p_clcb, GATT_INTERNAL_ERROR, (void *)p); - } - else - { - gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p); + } else { + gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p); } return; - } - else /* discover characterisitic */ - { + } else { /* discover characterisitic */ STREAM_TO_UINT8 (record_value.dclr_value.char_prop, p); STREAM_TO_UINT16(record_value.dclr_value.val_handle, p); - if (!GATT_HANDLE_IS_VALID(record_value.dclr_value.val_handle)) - { + if (!GATT_HANDLE_IS_VALID(record_value.dclr_value.val_handle)) { gatt_end_operation(p_clcb, GATT_INVALID_HANDLE, NULL); return; } - if (!gatt_parse_uuid_from_cmd(&record_value.dclr_value.char_uuid, (UINT16)(value_len - 3), &p)) - { + if (!gatt_parse_uuid_from_cmd(&record_value.dclr_value.char_uuid, (UINT16)(value_len - 3), &p)) { gatt_end_operation(p_clcb, GATT_SUCCESS, NULL); /* invalid format, and skip the result */ return; } /* UUID not matching */ - if (!gatt_uuid_compare(record_value.dclr_value.char_uuid, p_clcb->uuid)) - { + if (!gatt_uuid_compare(record_value.dclr_value.char_uuid, p_clcb->uuid)) { len -= (value_len + 2); continue; /* skip the result, and look for next one */ - } - else if (p_clcb->operation == GATTC_OPTYPE_READ) - /* UUID match for read characteristic value */ + } else if (p_clcb->operation == GATTC_OPTYPE_READ) + /* UUID match for read characteristic value */ { /* only read the first matching UUID characteristic value, and discard the rest results */ @@ -917,19 +855,17 @@ void gatt_process_read_by_type_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 memcpy (&result.value, &record_value, sizeof (result.value)); /* send callback if is discover procedure */ - if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->p_reg->app_cb.p_disc_res_cb) + if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && p_clcb->p_reg->app_cb.p_disc_res_cb) { (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &result); + } } p_clcb->s_handle = (handle == 0) ? 0 : (handle + 1); - if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) - { + if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) { /* initiate another request */ gatt_act_discovery(p_clcb) ; - } - else /* read characteristic value */ - { + } else { /* read characteristic value */ gatt_act_read(p_clcb, 0); } } @@ -948,29 +884,26 @@ void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code, UINT16 len, UINT8 *p_data) { UINT16 offset = p_clcb->counter; - UINT8 * p= p_data; + UINT8 *p = p_data; UNUSED(op_code); - if (p_clcb->operation == GATTC_OPTYPE_READ) - { - if (p_clcb->op_subtype != GATT_READ_BY_HANDLE) - { + if (p_clcb->operation == GATTC_OPTYPE_READ) { + if (p_clcb->op_subtype != GATT_READ_BY_HANDLE) { p_clcb->counter = len; gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p); - } - else - { + } else { /* allocate GKI buffer holding up long attribute value */ - if (!p_clcb->p_attr_buf) + if (!p_clcb->p_attr_buf) { p_clcb->p_attr_buf = (UINT8 *)GKI_getbuf(GATT_MAX_ATTR_LEN); + } /* copy attrobute value into cb buffer */ - if (p_clcb->p_attr_buf && offset < GATT_MAX_ATTR_LEN) - { - if ((len + offset) > GATT_MAX_ATTR_LEN) + if (p_clcb->p_attr_buf && offset < GATT_MAX_ATTR_LEN) { + if ((len + offset) > GATT_MAX_ATTR_LEN) { len = GATT_MAX_ATTR_LEN - offset; + } p_clcb->counter += len; @@ -979,43 +912,33 @@ void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code, /* send next request if needed */ if (len == (p_tcb->payload_size - 1) && /* full packet for read or read blob rsp */ - len + offset < GATT_MAX_ATTR_LEN) - { + len + offset < GATT_MAX_ATTR_LEN) { GATT_TRACE_DEBUG("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d", - offset, len, p_clcb->counter); + offset, len, p_clcb->counter); gatt_act_read(p_clcb, p_clcb->counter); - } - else /* end of request, send callback */ - { + } else { /* end of request, send callback */ gatt_end_operation(p_clcb, GATT_SUCCESS, (void *)p_clcb->p_attr_buf); } - } - else /* exception, should not happen */ - { + } else { /* exception, should not happen */ GATT_TRACE_ERROR("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf); gatt_end_operation(p_clcb, GATT_NO_RESOURCES, (void *)p_clcb->p_attr_buf); } } - } - else - { + } else { if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && - p_clcb->op_subtype == GATT_DISC_INC_SRVC && - p_clcb->read_uuid128.wait_for_read_rsp ) - { + p_clcb->op_subtype == GATT_DISC_INC_SRVC && + p_clcb->read_uuid128.wait_for_read_rsp ) { p_clcb->s_handle = p_clcb->read_uuid128.next_disc_start_hdl; p_clcb->read_uuid128.wait_for_read_rsp = FALSE; - if (len == LEN_UUID_128) - { + if (len == LEN_UUID_128) { memcpy(p_clcb->read_uuid128.result.value.incl_service.service_type.uu.uuid128, p, len); p_clcb->read_uuid128.result.value.incl_service.service_type.len = LEN_UUID_128; - if ( p_clcb->p_reg->app_cb.p_disc_res_cb) + if ( p_clcb->p_reg->app_cb.p_disc_res_cb) { (*p_clcb->p_reg->app_cb.p_disc_res_cb)(p_clcb->conn_id, p_clcb->op_subtype, &p_clcb->read_uuid128.result); + } gatt_act_discovery(p_clcb) ; - } - else - { + } else { gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p); } } @@ -1053,17 +976,15 @@ void gatt_process_mtu_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT UINT16 mtu; tGATT_STATUS status = GATT_SUCCESS; - if (len < GATT_MTU_RSP_MIN_LEN) - { + if (len < GATT_MTU_RSP_MIN_LEN) { GATT_TRACE_ERROR("invalid MTU response PDU received, discard."); status = GATT_INVALID_PDU; - } - else - { - STREAM_TO_UINT16(mtu, p_data); + } else { + STREAM_TO_UINT16(mtu, p_data); - if (mtu < p_tcb->payload_size && mtu >= GATT_DEF_BLE_MTU_SIZE) - p_tcb->payload_size = mtu; + if (mtu < p_tcb->payload_size && mtu >= GATT_DEF_BLE_MTU_SIZE) { + p_tcb->payload_size = mtu; + } } l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size); @@ -1083,8 +1004,7 @@ UINT8 gatt_cmd_to_rsp_code (UINT8 cmd_code) { UINT8 rsp_code = 0; - if (cmd_code > 1 && cmd_code != GATT_CMD_WRITE) - { + if (cmd_code > 1 && cmd_code != GATT_CMD_WRITE) { rsp_code = cmd_code + 1; } return rsp_code; @@ -1107,37 +1027,31 @@ BOOLEAN gatt_cl_send_next_cmd_inq(tGATT_TCB *p_tcb) tGATT_STATUS att_ret = GATT_SUCCESS; while (!sent && - p_tcb->pending_cl_req != p_tcb->next_slot_inq && - p_cmd->to_send && p_cmd->p_cmd != NULL) - { + p_tcb->pending_cl_req != p_tcb->next_slot_inq && + p_cmd->to_send && p_cmd->p_cmd != NULL) { att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd->p_cmd); - if (att_ret == GATT_SUCCESS || att_ret == GATT_CONGESTED) - { + if (att_ret == GATT_SUCCESS || att_ret == GATT_CONGESTED) { sent = TRUE; p_cmd->to_send = FALSE; p_cmd->p_cmd = NULL; /* dequeue the request if is write command or sign write */ - if (p_cmd->op_code != GATT_CMD_WRITE && p_cmd->op_code != GATT_SIGN_CMD_WRITE) - { + if (p_cmd->op_code != GATT_CMD_WRITE && p_cmd->op_code != GATT_SIGN_CMD_WRITE) { gatt_start_rsp_timer (p_cmd->clcb_idx); - } - else - { + } else { p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code); /* if no ack needed, keep sending */ - if (att_ret == GATT_SUCCESS) + if (att_ret == GATT_SUCCESS) { sent = FALSE; + } p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req]; /* send command complete callback here */ gatt_end_operation(p_clcb, att_ret, NULL); } - } - else - { + } else { GATT_TRACE_ERROR("gatt_cl_send_next_cmd_inq: L2CAP sent error"); memset(p_cmd, 0, sizeof(tGATT_CMD_Q)); @@ -1166,90 +1080,82 @@ void gatt_client_handle_server_rsp (tGATT_TCB *p_tcb, UINT8 op_code, tGATT_CLCB *p_clcb = NULL; UINT8 rsp_code; - if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF) - { + if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF) { p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code); rsp_code = gatt_cmd_to_rsp_code(rsp_code); - if (p_clcb == NULL || (rsp_code != op_code && op_code != GATT_RSP_ERROR)) - { + if (p_clcb == NULL || (rsp_code != op_code && op_code != GATT_RSP_ERROR)) { GATT_TRACE_WARNING ("ATT - Ignore wrong response. Receives (%02x) \ Request(%02x) Ignored", op_code, rsp_code); return; - } - else - { + } else { btu_stop_timer (&p_clcb->rsp_timer_ent); p_clcb->retry_count = 0; } } /* the size of the message may not be bigger than the local max PDU size*/ /* The message has to be smaller than the agreed MTU, len does not count op_code */ - if (len >= p_tcb->payload_size) - { + if (len >= p_tcb->payload_size) { GATT_TRACE_ERROR("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size); if (op_code != GATT_HANDLE_VALUE_NOTIF && - op_code != GATT_HANDLE_VALUE_IND) + op_code != GATT_HANDLE_VALUE_IND) { gatt_end_operation(p_clcb, GATT_ERROR, NULL); - } - else - { - switch (op_code) - { - case GATT_RSP_ERROR: - gatt_process_error_rsp(p_tcb, p_clcb, op_code, len, p_data); - break; + } + } else { + switch (op_code) { + case GATT_RSP_ERROR: + gatt_process_error_rsp(p_tcb, p_clcb, op_code, len, p_data); + break; - case GATT_RSP_MTU: /* 2 bytes mtu */ - gatt_process_mtu_rsp(p_tcb, p_clcb, len ,p_data); - break; + case GATT_RSP_MTU: /* 2 bytes mtu */ + gatt_process_mtu_rsp(p_tcb, p_clcb, len , p_data); + break; - case GATT_RSP_FIND_INFO: - gatt_process_read_info_rsp(p_tcb, p_clcb, op_code, len, p_data); - break; + case GATT_RSP_FIND_INFO: + gatt_process_read_info_rsp(p_tcb, p_clcb, op_code, len, p_data); + break; - case GATT_RSP_READ_BY_TYPE: - case GATT_RSP_READ_BY_GRP_TYPE: - gatt_process_read_by_type_rsp(p_tcb, p_clcb, op_code, len, p_data); - break; + case GATT_RSP_READ_BY_TYPE: + case GATT_RSP_READ_BY_GRP_TYPE: + gatt_process_read_by_type_rsp(p_tcb, p_clcb, op_code, len, p_data); + break; - case GATT_RSP_READ: - case GATT_RSP_READ_BLOB: - case GATT_RSP_READ_MULTI: - gatt_process_read_rsp(p_tcb, p_clcb, op_code, len, p_data); - break; + case GATT_RSP_READ: + case GATT_RSP_READ_BLOB: + case GATT_RSP_READ_MULTI: + gatt_process_read_rsp(p_tcb, p_clcb, op_code, len, p_data); + break; - case GATT_RSP_FIND_TYPE_VALUE: /* disc service with UUID */ - gatt_process_find_type_value_rsp(p_tcb, p_clcb, len, p_data); - break; + case GATT_RSP_FIND_TYPE_VALUE: /* disc service with UUID */ + gatt_process_find_type_value_rsp(p_tcb, p_clcb, len, p_data); + break; - case GATT_RSP_WRITE: - gatt_process_handle_rsp(p_clcb); - break; + case GATT_RSP_WRITE: + gatt_process_handle_rsp(p_clcb); + break; - case GATT_RSP_PREPARE_WRITE: - gatt_process_prep_write_rsp(p_tcb, p_clcb, op_code, len, p_data); - break; + case GATT_RSP_PREPARE_WRITE: + gatt_process_prep_write_rsp(p_tcb, p_clcb, op_code, len, p_data); + break; - case GATT_RSP_EXEC_WRITE: - gatt_end_operation(p_clcb, p_clcb->status, NULL); - break; + case GATT_RSP_EXEC_WRITE: + gatt_end_operation(p_clcb, p_clcb->status, NULL); + break; - case GATT_HANDLE_VALUE_NOTIF: - case GATT_HANDLE_VALUE_IND: - gatt_process_notification(p_tcb, op_code, len, p_data); - break; + case GATT_HANDLE_VALUE_NOTIF: + case GATT_HANDLE_VALUE_IND: + gatt_process_notification(p_tcb, op_code, len, p_data); + break; - default: - GATT_TRACE_ERROR("Unknown opcode = %d", op_code); - break; + default: + GATT_TRACE_ERROR("Unknown opcode = %d", op_code); + break; } } - if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF) - { + if (op_code != GATT_HANDLE_VALUE_IND && op_code != GATT_HANDLE_VALUE_NOTIF) { gatt_cl_send_next_cmd_inq(p_tcb); } diff --git a/components/bt/bluedroid/stack/gatt/gatt_db.c b/components/bt/bluedroid/stack/gatt/gatt_db.c old mode 100755 new mode 100644 index 0efee4898..2e74c7d2d --- a/components/bt/bluedroid/stack/gatt/gatt_db.c +++ b/components/bt/bluedroid/stack/gatt/gatt_db.c @@ -45,7 +45,7 @@ static BOOLEAN copy_extra_byte_in_db(tGATT_SVC_DB *p_db, void **p_dst, UINT16 le static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri); static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code, - UINT16 handle, UINT16 offset, UINT32 trans_id); + UINT16 handle, UINT16 offset, UINT32 trans_id); /******************************************************************************* ** @@ -64,8 +64,7 @@ BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN { GKI_init_q(&p_db->svc_buffer); - if (!allocate_svc_db_buf(p_db)) - { + if (!allocate_svc_db_buf(p_db)) { GATT_TRACE_ERROR("gatts_init_service_db failed, no resources"); return FALSE; } @@ -92,16 +91,13 @@ BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN ** Returns Status of te operation. ** *******************************************************************************/ -tBT_UUID * gatts_get_service_uuid (tGATT_SVC_DB *p_db) +tBT_UUID *gatts_get_service_uuid (tGATT_SVC_DB *p_db) { - if (!p_db || !p_db->p_attr_list) - { + if (!p_db || !p_db->p_attr_list) { GATT_TRACE_ERROR("service DB empty"); return NULL; - } - else - { + } else { return &((tGATT_ATTR16 *)p_db->p_attr_list)->p_value->uuid; } } @@ -116,70 +112,62 @@ tBT_UUID * gatts_get_service_uuid (tGATT_SVC_DB *p_db) ** *******************************************************************************/ static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr, - UINT16 offset, - BOOLEAN read_long, - tGATT_SEC_FLAG sec_flag, - UINT8 key_size) + UINT16 offset, + BOOLEAN read_long, + tGATT_SEC_FLAG sec_flag, + UINT8 key_size) { UINT16 min_key_size; tGATT_PERM perm = p_attr->permission; UNUSED(offset); min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); - if (min_key_size != 0 ) - { - min_key_size +=6; + if (min_key_size != 0 ) { + min_key_size += 6; } - if (!(perm & GATT_READ_ALLOWED)) - { + if (!(perm & GATT_READ_ALLOWED)) { GATT_TRACE_ERROR( "GATT_READ_NOT_PERMIT"); return GATT_READ_NOT_PERMIT; } if ((perm & GATT_READ_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED) && - !(sec_flag & BTM_SEC_FLAG_ENCRYPTED)) - { + !(sec_flag & BTM_SEC_FLAG_ENCRYPTED)) { GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION"); return GATT_INSUF_AUTHENTICATION; } - if ((perm & GATT_READ_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED)) - { + if ((perm & GATT_READ_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED)) { GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION: MITM Required"); return GATT_INSUF_AUTHENTICATION; } - if ((perm & GATT_READ_ENCRYPTED_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)) - { + if ((perm & GATT_READ_ENCRYPTED_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)) { GATT_TRACE_ERROR( "GATT_INSUF_ENCRYPTION"); return GATT_INSUF_ENCRYPTION; } - if ( (perm & GATT_READ_ENCRYPTED_REQUIRED) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size)) - { + if ( (perm & GATT_READ_ENCRYPTED_REQUIRED) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size)) { GATT_TRACE_ERROR( "GATT_INSUF_KEY_SIZE"); return GATT_INSUF_KEY_SIZE; } - if (read_long) - { - switch (p_attr->uuid) - { - case GATT_UUID_PRI_SERVICE: - case GATT_UUID_SEC_SERVICE: - case GATT_UUID_CHAR_DECLARE: - case GATT_UUID_INCLUDE_SERVICE: - case GATT_UUID_CHAR_EXT_PROP: - case GATT_UUID_CHAR_CLIENT_CONFIG: - case GATT_UUID_CHAR_SRVR_CONFIG: - case GATT_UUID_CHAR_PRESENT_FORMAT: - GATT_TRACE_ERROR("GATT_NOT_LONG"); - return GATT_NOT_LONG; + if (read_long) { + switch (p_attr->uuid) { + case GATT_UUID_PRI_SERVICE: + case GATT_UUID_SEC_SERVICE: + case GATT_UUID_CHAR_DECLARE: + case GATT_UUID_INCLUDE_SERVICE: + case GATT_UUID_CHAR_EXT_PROP: + case GATT_UUID_CHAR_CLIENT_CONFIG: + case GATT_UUID_CHAR_SRVR_CONFIG: + case GATT_UUID_CHAR_PRESENT_FORMAT: + GATT_TRACE_ERROR("GATT_NOT_LONG"); + return GATT_NOT_LONG; - default: - break; + default: + break; } } @@ -216,82 +204,70 @@ static tGATT_STATUS read_attr_value (void *p_attr, UINT16 len = 0, uuid16 = 0; UINT8 *p = *p_data; tGATT_STATUS status; - tGATT_ATTR16 *p_attr16 = (tGATT_ATTR16 *)p_attr; + tGATT_ATTR16 *p_attr16 = (tGATT_ATTR16 *)p_attr; GATT_TRACE_DEBUG("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d", - p_attr16->uuid, - p_attr16->permission, - sec_flag, - offset, - read_long); + p_attr16->uuid, + p_attr16->permission, + sec_flag, + offset, + read_long); status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, offset, read_long, sec_flag, key_size); - if (status != GATT_SUCCESS) + if (status != GATT_SUCCESS) { return status; + } - if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16) + if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16) { uuid16 = p_attr16->uuid; + } status = GATT_NO_RESOURCES; - if (uuid16 == GATT_UUID_PRI_SERVICE || uuid16 == GATT_UUID_SEC_SERVICE) - { + if (uuid16 == GATT_UUID_PRI_SERVICE || uuid16 == GATT_UUID_SEC_SERVICE) { len = p_attr16->p_value->uuid.len; - if (mtu >= p_attr16->p_value->uuid.len) - { + if (mtu >= p_attr16->p_value->uuid.len) { gatt_build_uuid_to_stream(&p, p_attr16->p_value->uuid); status = GATT_SUCCESS; } - } - else if (uuid16 == GATT_UUID_CHAR_DECLARE) - { - len = (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16) ? 5 :19; + } else if (uuid16 == GATT_UUID_CHAR_DECLARE) { + len = (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16) ? 5 : 19; - if (mtu >= len) - { + if (mtu >= len) { UINT8_TO_STREAM(p, p_attr16->p_value->char_decl.property); UINT16_TO_STREAM(p, p_attr16->p_value->char_decl.char_val_handle); - if (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16) - { + if (((tGATT_ATTR16 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_16) { UINT16_TO_STREAM(p, ((tGATT_ATTR16 *)(p_attr16->p_next))->uuid); } /* convert a 32bits UUID to 128 bits */ - else if (((tGATT_ATTR32 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_32) - { + else if (((tGATT_ATTR32 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_32) { gatt_convert_uuid32_to_uuid128 (p, ((tGATT_ATTR32 *)(p_attr16->p_next))->uuid); p += LEN_UUID_128; - } - else - { + } else { ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *)(p_attr16->p_next))->uuid, LEN_UUID_128); } status = GATT_SUCCESS; } - } - else if (uuid16 == GATT_UUID_INCLUDE_SERVICE) - { - if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16) + } else if (uuid16 == GATT_UUID_INCLUDE_SERVICE) { + if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16) { len = 6; - else + } else { len = 4; + } - if (mtu >= len) - { + if (mtu >= len) { UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.s_handle); UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.e_handle); - if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16) - { + if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16) { UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.service_type.uu.uuid16); } status = GATT_SUCCESS; } - } - else /* characteristic description or characteristic value */ - { + } else { /* characteristic description or characteristic value */ status = GATT_PENDING; } @@ -319,17 +295,17 @@ static tGATT_STATUS read_attr_value (void *p_attr, ** *******************************************************************************/ tGATT_STATUS gatts_db_read_attr_value_by_type (tGATT_TCB *p_tcb, - tGATT_SVC_DB *p_db, - UINT8 op_code, - BT_HDR *p_rsp, - UINT16 s_handle, - UINT16 e_handle, - tBT_UUID type, - UINT16 *p_len, - tGATT_SEC_FLAG sec_flag, - UINT8 key_size, - UINT32 trans_id, - UINT16 *p_cur_handle) + tGATT_SVC_DB *p_db, + UINT8 op_code, + BT_HDR *p_rsp, + UINT16 s_handle, + UINT16 e_handle, + tBT_UUID type, + UINT16 *p_len, + tGATT_SEC_FLAG sec_flag, + UINT8 key_size, + UINT32 trans_id, + UINT16 *p_cur_handle) { tGATT_STATUS status = GATT_NOT_FOUND; tGATT_ATTR16 *p_attr; @@ -340,66 +316,50 @@ tGATT_STATUS gatts_db_read_attr_value_by_type (tGATT_TCB *p_tcb, UINT8 flag; #endif - if (p_db && p_db->p_attr_list) - { + if (p_db && p_db->p_attr_list) { p_attr = (tGATT_ATTR16 *)p_db->p_attr_list; - while (p_attr && p_attr->handle <= e_handle) - { - if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) - { + while (p_attr && p_attr->handle <= e_handle) { + if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) { attr_uuid.len = LEN_UUID_16; attr_uuid.uu.uuid16 = p_attr->uuid; - } - else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) - { + } else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) { attr_uuid.len = LEN_UUID_32; attr_uuid.uu.uuid32 = ((tGATT_ATTR32 *)p_attr)->uuid; - } - else - { + } else { attr_uuid.len = LEN_UUID_128; memcpy(attr_uuid.uu.uuid128, ((tGATT_ATTR128 *)p_attr)->uuid, LEN_UUID_128); } - if (p_attr->handle >= s_handle && gatt_uuid_compare(type, attr_uuid)) - { - if (*p_len <= 2) - { + if (p_attr->handle >= s_handle && gatt_uuid_compare(type, attr_uuid)) { + if (*p_len <= 2) { status = GATT_NO_RESOURCES; break; } UINT16_TO_STREAM (p, p_attr->handle); - status = read_attr_value ((void *)p_attr, 0, &p, FALSE, (UINT16)(*p_len -2), &len, sec_flag, key_size); + status = read_attr_value ((void *)p_attr, 0, &p, FALSE, (UINT16)(*p_len - 2), &len, sec_flag, key_size); - if (status == GATT_PENDING) - { + if (status == GATT_PENDING) { status = gatts_send_app_read_request(p_tcb, op_code, p_attr->handle, 0, trans_id); /* one callback at a time */ break; - } - else if (status == GATT_SUCCESS) - { - if (p_rsp->offset == 0) + } else if (status == GATT_SUCCESS) { + if (p_rsp->offset == 0) { p_rsp->offset = len + 2; + } - if (p_rsp->offset == len + 2) - { + if (p_rsp->offset == len + 2) { p_rsp->len += (len + 2); *p_len -= (len + 2); - } - else - { + } else { GATT_TRACE_ERROR("format mismatch"); status = GATT_NO_RESOURCES; break; } - } - else - { + } else { *p_cur_handle = p_attr->handle; break; } @@ -409,18 +369,14 @@ tGATT_STATUS gatts_db_read_attr_value_by_type (tGATT_TCB *p_tcb, } #if (defined(BLE_DELAY_REQUEST_ENC) && (BLE_DELAY_REQUEST_ENC == TRUE)) - if (BTM_GetSecurityFlags(p_tcb->peer_bda, &flag)) - { + if (BTM_GetSecurityFlags(p_tcb->peer_bda, &flag)) { if ((p_tcb->att_lcid == L2CAP_ATT_CID) && (status == GATT_PENDING) && - (type.uu.uuid16 == GATT_UUID_GAP_DEVICE_NAME)) - { + (type.uu.uuid16 == GATT_UUID_GAP_DEVICE_NAME)) { if ((flag & (BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_FLAG_ENCRYPTED)) == - BTM_SEC_LINK_KEY_KNOWN) - { + BTM_SEC_LINK_KEY_KNOWN) { tACL_CONN *p; p = btm_bda_to_acl(p_tcb->peer_bda, BT_TRANSPORT_LE); - if ((p != NULL) && (p->link_role == BTM_ROLE_MASTER)) - { + if ((p != NULL) && (p->link_role == BTM_ROLE_MASTER)) { tBTM_BLE_SEC_ACT sec_act = BTM_BLE_SEC_ENCRYPT; btm_ble_set_encryption(p_tcb->peer_bda, &sec_act, p->link_role); } @@ -450,26 +406,21 @@ UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, UINT16 e tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_INCLUDE_SERVICE}}; GATT_TRACE_DEBUG("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x", - s_handle, e_handle, service.uu.uuid16); + s_handle, e_handle, service.uu.uuid16); - if (service.len == 0 || s_handle == 0 || e_handle == 0) - { + if (service.len == 0 || s_handle == 0 || e_handle == 0) { GATT_TRACE_ERROR("gatts_add_included_service Illegal Params."); return 0; } - if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL) - { - if (copy_extra_byte_in_db(p_db, (void **)&p_attr->p_value, sizeof(tGATT_INCL_SRVC))) - { + if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL) { + if (copy_extra_byte_in_db(p_db, (void **)&p_attr->p_value, sizeof(tGATT_INCL_SRVC))) { p_attr->p_value->incl_handle.s_handle = s_handle; p_attr->p_value->incl_handle.e_handle = e_handle; memcpy(&p_attr->p_value->incl_handle.service_type, &service, sizeof(tBT_UUID)); return p_attr->handle; - } - else - { + } else { deallocate_attr_in_db(p_db, p_attr); } } @@ -494,25 +445,22 @@ UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, UINT16 e *******************************************************************************/ UINT16 gatts_add_characteristic (tGATT_SVC_DB *p_db, tGATT_PERM perm, tGATT_CHAR_PROP property, - tBT_UUID * p_char_uuid) + tBT_UUID *p_char_uuid) { tGATT_ATTR16 *p_char_decl, *p_char_val; tBT_UUID uuid = {LEN_UUID_16, {GATT_UUID_CHAR_DECLARE}}; GATT_TRACE_DEBUG("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property); - if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL) - { - if (!copy_extra_byte_in_db(p_db, (void **)&p_char_decl->p_value, sizeof(tGATT_CHAR_DECL))) - { + if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL) { + if (!copy_extra_byte_in_db(p_db, (void **)&p_char_decl->p_value, sizeof(tGATT_CHAR_DECL))) { deallocate_attr_in_db(p_db, p_char_decl); return 0; } p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, p_char_uuid, perm); - if (p_char_val == NULL) - { + if (p_char_val == NULL) { deallocate_attr_in_db(p_db, p_char_decl); return 0; } @@ -541,32 +489,39 @@ UINT8 gatt_convertchar_descr_type(tBT_UUID *p_descr_uuid) { tBT_UUID std_descr = {LEN_UUID_16, {GATT_UUID_CHAR_EXT_PROP}}; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_EXT_DSCPTOR; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_USER_DSCPTOR; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_CLT_CONFIG; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_SVR_CONFIG; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_PRES_FORMAT; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_AGGR_FORMAT; + } std_descr.uu.uuid16 ++; - if (gatt_uuid_compare(std_descr, * p_descr_uuid)) + if (gatt_uuid_compare(std_descr, * p_descr_uuid)) { return GATT_DESCR_VALID_RANGE; + } return GATT_DESCR_UNKNOWN; @@ -587,7 +542,7 @@ UINT8 gatt_convertchar_descr_type(tBT_UUID *p_descr_uuid) ** *******************************************************************************/ UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, - tBT_UUID * p_descr_uuid) + tBT_UUID *p_descr_uuid) { tGATT_ATTR16 *p_char_dscptr; @@ -595,15 +550,12 @@ UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, /* Add characteristic descriptors */ if ((p_char_dscptr = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, - p_descr_uuid, - perm)) - == NULL) - { + p_descr_uuid, + perm)) + == NULL) { GATT_TRACE_DEBUG("gatts_add_char_descr Fail for adding char descriptors."); return 0; - } - else - { + } else { return p_char_dscptr->handle; } } @@ -631,33 +583,29 @@ UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, ** *******************************************************************************/ tGATT_STATUS gatts_read_attr_value_by_handle(tGATT_TCB *p_tcb, - tGATT_SVC_DB *p_db, - UINT8 op_code, - UINT16 handle, UINT16 offset, - UINT8 *p_value, UINT16 *p_len, - UINT16 mtu, - tGATT_SEC_FLAG sec_flag, - UINT8 key_size, - UINT32 trans_id) + tGATT_SVC_DB *p_db, + UINT8 op_code, + UINT16 handle, UINT16 offset, + UINT8 *p_value, UINT16 *p_len, + UINT16 mtu, + tGATT_SEC_FLAG sec_flag, + UINT8 key_size, + UINT32 trans_id) { tGATT_STATUS status = GATT_NOT_FOUND; tGATT_ATTR16 *p_attr; UINT8 *pp = p_value; - if (p_db && p_db->p_attr_list) - { + if (p_db && p_db->p_attr_list) { p_attr = (tGATT_ATTR16 *)p_db->p_attr_list; - while (p_attr && handle >= p_attr->handle) - { - if (p_attr->handle == handle) - { + while (p_attr && handle >= p_attr->handle) { + if (p_attr->handle == handle) { status = read_attr_value (p_attr, offset, &pp, (BOOLEAN)(op_code == GATT_REQ_READ_BLOB), mtu, p_len, sec_flag, key_size); - if (status == GATT_PENDING) - { + if (status == GATT_PENDING) { status = gatts_send_app_read_request(p_tcb, op_code, p_attr->handle, offset, trans_id); } break; @@ -697,14 +645,11 @@ tGATT_STATUS gatts_read_attr_perm_check(tGATT_SVC_DB *p_db, tGATT_STATUS status = GATT_NOT_FOUND; tGATT_ATTR16 *p_attr; - if (p_db && p_db->p_attr_list) - { + if (p_db && p_db->p_attr_list) { p_attr = (tGATT_ATTR16 *)p_db->p_attr_list; - while (p_attr && handle >= p_attr->handle) - { - if (p_attr->handle == handle) - { + while (p_attr && handle >= p_attr->handle) { + if (p_attr->handle == handle) { status = gatts_check_attr_readability (p_attr, 0, is_long, sec_flag, key_size); @@ -735,8 +680,8 @@ tGATT_STATUS gatts_read_attr_perm_check(tGATT_SVC_DB *p_db, ** *******************************************************************************/ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, - UINT16 handle, UINT16 offset, UINT8 *p_data, - UINT16 len, tGATT_SEC_FLAG sec_flag, UINT8 key_size) + UINT16 handle, UINT16 offset, UINT8 *p_data, + UINT16 len, tGATT_SEC_FLAG sec_flag, UINT8 key_size) { tGATT_STATUS status = GATT_NOT_FOUND; tGATT_ATTR16 *p_attr; @@ -745,106 +690,83 @@ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, UINT16 min_key_size; GATT_TRACE_DEBUG( "gatts_write_attr_perm_check op_code=0x%0x handle=0x%04x offset=%d len=%d sec_flag=0x%0x key_size=%d", - op_code, handle, offset, len, sec_flag, key_size); + op_code, handle, offset, len, sec_flag, key_size); - if (p_db != NULL) - { + if (p_db != NULL) { p_attr = (tGATT_ATTR16 *) p_db->p_attr_list; - while (p_attr != NULL) - { - if (p_attr->handle == handle) - { + while (p_attr != NULL) { + if (p_attr->handle == handle) { perm = p_attr->permission; min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); - if (min_key_size != 0 ) - { - min_key_size +=6; + if (min_key_size != 0 ) { + min_key_size += 6; } GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x", - p_attr->permission, - min_key_size); + p_attr->permission, + min_key_size); if ((op_code == GATT_CMD_WRITE || op_code == GATT_REQ_WRITE) - && (perm & GATT_WRITE_SIGNED_PERM)) - { + && (perm & GATT_WRITE_SIGNED_PERM)) { /* use the rules for the mixed security see section 10.2.3*/ /* use security mode 1 level 2 when the following condition follows */ /* LE security mode 2 level 1 and LE security mode 1 level 2 */ - if ((perm & GATT_PERM_WRITE_SIGNED) && (perm & GATT_PERM_WRITE_ENCRYPTED)) - { + if ((perm & GATT_PERM_WRITE_SIGNED) && (perm & GATT_PERM_WRITE_ENCRYPTED)) { perm = GATT_PERM_WRITE_ENCRYPTED; } /* use security mode 1 level 3 when the following condition follows */ /* LE security mode 2 level 2 and security mode 1 and LE */ else if (((perm & GATT_PERM_WRITE_SIGNED_MITM) && (perm & GATT_PERM_WRITE_ENCRYPTED)) || - /* LE security mode 2 and security mode 1 level 3 */ - ((perm & GATT_WRITE_SIGNED_PERM) && (perm & GATT_PERM_WRITE_ENC_MITM))) - { + /* LE security mode 2 and security mode 1 level 3 */ + ((perm & GATT_WRITE_SIGNED_PERM) && (perm & GATT_PERM_WRITE_ENC_MITM))) { perm = GATT_PERM_WRITE_ENC_MITM; } } - if ((op_code == GATT_SIGN_CMD_WRITE) && !(perm & GATT_WRITE_SIGNED_PERM)) - { + if ((op_code == GATT_SIGN_CMD_WRITE) && !(perm & GATT_WRITE_SIGNED_PERM)) { status = GATT_WRITE_NOT_PERMIT; GATT_TRACE_DEBUG( "gatts_write_attr_perm_check - sign cmd write not allowed"); } - if ((op_code == GATT_SIGN_CMD_WRITE) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED)) - { + if ((op_code == GATT_SIGN_CMD_WRITE) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED)) { status = GATT_INVALID_PDU; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - Error!! sign cmd write sent on a encypted link"); - } - else if (!(perm & GATT_WRITE_ALLOWED)) - { + } else if (!(perm & GATT_WRITE_ALLOWED)) { status = GATT_WRITE_NOT_PERMIT; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT"); } /* require authentication, but not been authenticated */ - else if ((perm & GATT_WRITE_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED)) - { + else if ((perm & GATT_WRITE_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED)) { status = GATT_INSUF_AUTHENTICATION; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION"); - } - else if ((perm & GATT_WRITE_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED)) - { + } else if ((perm & GATT_WRITE_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED)) { status = GATT_INSUF_AUTHENTICATION; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: MITM required"); - } - else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)) - { + } else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)) { status = GATT_INSUF_ENCRYPTION; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_ENCRYPTION"); - } - else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size)) - { + } else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size)) { status = GATT_INSUF_KEY_SIZE; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_KEY_SIZE"); } /* LE security mode 2 attribute */ else if (perm & GATT_WRITE_SIGNED_PERM && op_code != GATT_SIGN_CMD_WRITE && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED) - && (perm & GATT_WRITE_ALLOWED) == 0) - { + && (perm & GATT_WRITE_ALLOWED) == 0) { status = GATT_INSUF_AUTHENTICATION; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: LE security mode 2 required"); - } - else /* writable: must be char value declaration or char descritpors */ - { - if(p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) - { - switch (p_attr->uuid) - { + } else { /* writable: must be char value declaration or char descritpors */ + if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) { + switch (p_attr->uuid) { case GATT_UUID_CHAR_PRESENT_FORMAT:/* should be readable only */ case GATT_UUID_CHAR_EXT_PROP:/* should be readable only */ case GATT_UUID_CHAR_AGG_FORMAT: /* should be readable only */ - case GATT_UUID_CHAR_VALID_RANGE: + case GATT_UUID_CHAR_VALID_RANGE: status = GATT_WRITE_NOT_PERMIT; break; case GATT_UUID_CHAR_CLIENT_CONFIG: -/* coverity[MISSING_BREAK] */ -/* intnended fall through, ignored */ - /* fall through */ + /* coverity[MISSING_BREAK] */ + /* intnended fall through, ignored */ + /* fall through */ case GATT_UUID_CHAR_SRVR_CONFIG: max_size = 2; case GATT_UUID_CHAR_DESCRIPTION: @@ -852,19 +774,14 @@ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, status = GATT_SUCCESS; break; } - } - else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 || - p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) - { - status = GATT_SUCCESS; - } - else - { + } else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 || + p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) { + status = GATT_SUCCESS; + } else { status = GATT_INVALID_PDU; } - if (p_data == NULL && len > 0) - { + if (p_data == NULL && len > 0) { status = GATT_INVALID_PDU; } /* these attribute does not allow write blob */ @@ -874,26 +791,21 @@ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, p_attr->uuid == GATT_UUID_CHAR_SRVR_CONFIG) ) // btla-specific -- { - if (op_code == GATT_REQ_PREPARE_WRITE && offset != 0) /* does not allow write blob */ - { + if (op_code == GATT_REQ_PREPARE_WRITE && offset != 0) { /* does not allow write blob */ status = GATT_NOT_LONG; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_NOT_LONG"); - } - else if (len != max_size) /* data does not match the required format */ - { + } else if (len != max_size) { /* data does not match the required format */ status = GATT_INVALID_ATTR_LEN; GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INVALID_PDU"); - } - else - { + } else { status = GATT_SUCCESS; } } } break; - } - else + } else { p_attr = (tGATT_ATTR16 *)p_attr->p_next; + } } } @@ -922,30 +834,27 @@ static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PER tGATT_ATTR128 *p_attr128 = NULL; UINT16 len = sizeof(tGATT_ATTR128); - if (p_uuid == NULL) - { + if (p_uuid == NULL) { GATT_TRACE_ERROR("illegal UUID"); return NULL; } - if (p_uuid->len == LEN_UUID_16) + if (p_uuid->len == LEN_UUID_16) { len = sizeof(tGATT_ATTR16); - else if (p_uuid->len == LEN_UUID_32) + } else if (p_uuid->len == LEN_UUID_32) { len = sizeof(tGATT_ATTR32); + } - GATT_TRACE_DEBUG("allocate attr %d bytes ",len); + GATT_TRACE_DEBUG("allocate attr %d bytes ", len); - if (p_db->end_handle <= p_db->next_handle) - { + if (p_db->end_handle <= p_db->next_handle) { GATT_TRACE_DEBUG("handle space full. handle_max = %d next_handle = %d", - p_db->end_handle, p_db->next_handle); + p_db->end_handle, p_db->next_handle); return NULL; } - if (p_db->mem_free < len) - { - if (!allocate_svc_db_buf(p_db)) - { + if (p_db->mem_free < len) { + if (!allocate_svc_db_buf(p_db)) { GATT_TRACE_ERROR("allocate_attr_in_db failed, no resources"); return NULL; } @@ -953,19 +862,14 @@ static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PER memset(p_db->p_free_mem, 0, len); p_attr16 = (tGATT_ATTR16 *) p_db->p_free_mem; - if (p_uuid->len == LEN_UUID_16 && p_uuid->uu.uuid16 != GATT_ILLEGAL_UUID) - { + if (p_uuid->len == LEN_UUID_16 && p_uuid->uu.uuid16 != GATT_ILLEGAL_UUID) { p_attr16->uuid_type = GATT_ATTR_UUID_TYPE_16; p_attr16->uuid = p_uuid->uu.uuid16; - } - else if (p_uuid->len == LEN_UUID_32) - { + } else if (p_uuid->len == LEN_UUID_32) { p_attr32 = (tGATT_ATTR32 *) p_db->p_free_mem; p_attr32->uuid_type = GATT_ATTR_UUID_TYPE_32; p_attr32->uuid = p_uuid->uu.uuid32; - } - else if (p_uuid->len == LEN_UUID_128) - { + } else if (p_uuid->len == LEN_UUID_128) { p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem; p_attr128->uuid_type = GATT_ATTR_UUID_TYPE_128; memcpy(p_attr128->uuid, p_uuid->uu.uuid128, LEN_UUID_128); @@ -979,35 +883,30 @@ static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PER p_attr16->p_next = NULL; /* link the attribute record into the end of DB */ - if (p_db->p_attr_list == NULL) + if (p_db->p_attr_list == NULL) { p_db->p_attr_list = p_attr16; - else - { + } else { p_last = (tGATT_ATTR16 *)p_db->p_attr_list; - while (p_last != NULL && p_last->p_next != NULL) + while (p_last != NULL && p_last->p_next != NULL) { p_last = (tGATT_ATTR16 *)p_last->p_next; + } p_last->p_next = p_attr16; } - if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16) - { + if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16) { GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid16 = [0x%04x] perm=0x%02x ", - p_attr16->handle, p_attr16->uuid, p_attr16->permission); - } - else if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_32) - { + p_attr16->handle, p_attr16->uuid, p_attr16->permission); + } else if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_32) { GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid32 = [0x%08x] perm=0x%02x ", - p_attr32->handle, p_attr32->uuid, p_attr32->permission); - } - else - { + p_attr32->handle, p_attr32->uuid, p_attr32->permission); + } else { GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ", - p_attr128->handle, p_attr128->uuid[0],p_attr128->uuid[1], - p_attr128->permission); + p_attr128->handle, p_attr128->uuid[0], p_attr128->uuid[1], + p_attr128->permission); } - return(void *)p_attr16; + return (void *)p_attr16; } /******************************************************************************* @@ -1027,29 +926,28 @@ static BOOLEAN deallocate_attr_in_db(tGATT_SVC_DB *p_db, void *p_attr) tGATT_ATTR16 *p_cur, *p_next; BOOLEAN found = FALSE; - if (p_db->p_attr_list == NULL) + if (p_db->p_attr_list == NULL) { return found; + } p_cur = (tGATT_ATTR16 *) p_db->p_attr_list; p_next = (tGATT_ATTR16 *) p_cur->p_next; for (; p_cur != NULL && p_next != NULL; - p_cur = p_next, p_next = (tGATT_ATTR16 *)p_next->p_next) - { - if (p_next == p_attr) - { + p_cur = p_next, p_next = (tGATT_ATTR16 *)p_next->p_next) { + if (p_next == p_attr) { p_cur->p_next = p_next->p_next; found = TRUE; } } - if (p_cur == p_attr && p_cur == p_db->p_attr_list) - { + if (p_cur == p_attr && p_cur == p_db->p_attr_list) { p_db->p_attr_list = p_cur->p_next; found = TRUE; } /* else attr not found */ - if ( found) + if ( found) { p_db->next_handle --; + } return found; } @@ -1074,10 +972,8 @@ static BOOLEAN copy_extra_byte_in_db(tGATT_SVC_DB *p_db, void **p_dst, UINT16 le { UINT8 *p = (UINT8 *)*p_dst; - if (p_db->mem_free < len) - { - if (!allocate_svc_db_buf(p_db)) - { + if (p_db->mem_free < len) { + if (!allocate_svc_db_buf(p_db)) { GATT_TRACE_ERROR("copy_extra_byte_in_db failed, no resources"); return FALSE; } @@ -1107,8 +1003,7 @@ static BOOLEAN allocate_svc_db_buf(tGATT_SVC_DB *p_db) GATT_TRACE_DEBUG("allocate_svc_db_buf allocating extra buffer"); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL) { GATT_TRACE_ERROR("allocate_svc_db_buf failed, no resources"); return FALSE; } @@ -1133,7 +1028,7 @@ static BOOLEAN allocate_svc_db_buf(tGATT_SVC_DB *p_db) ** *******************************************************************************/ static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code, - UINT16 handle, UINT16 offset, UINT32 trans_id) + UINT16 handle, UINT16 offset, UINT32 trans_id) { tGATTS_DATA sr_data; UINT8 i_rcb; @@ -1144,14 +1039,12 @@ static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code, p_sreg = &gatt_cb.sr_reg[i_rcb]; conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_sreg->gatt_if); - if (trans_id == 0) - { + if (trans_id == 0) { trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle); gatt_sr_update_cback_cnt(p_tcb, p_sreg->gatt_if, TRUE, TRUE); } - if (trans_id != 0 ) - { + if (trans_id != 0 ) { memset(&sr_data, 0, sizeof(tGATTS_DATA)); sr_data.read_req.handle = handle; @@ -1160,10 +1053,10 @@ static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code, gatt_sr_send_req_callback(conn_id, trans_id, GATTS_REQ_TYPE_READ, &sr_data); - return(tGATT_STATUS) GATT_PENDING; + return (tGATT_STATUS) GATT_PENDING; + } else { + return (tGATT_STATUS) GATT_BUSY; /* max pending command, application error */ } - else - return(tGATT_STATUS) GATT_BUSY; /* max pending command, application error */ } @@ -1187,28 +1080,22 @@ static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_ GATT_TRACE_DEBUG( "add_service_declaration"); - if (is_pri) + if (is_pri) { uuid.uu.uuid16 = GATT_UUID_PRI_SERVICE; - else + } else { uuid.uu.uuid16 = GATT_UUID_SEC_SERVICE; + } /* add service declration record */ - if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL) - { - if (copy_extra_byte_in_db (p_db, (void **)&p_attr->p_value, sizeof(tBT_UUID))) - { - if (p_service->len == LEN_UUID_16) - { + if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL) { + if (copy_extra_byte_in_db (p_db, (void **)&p_attr->p_value, sizeof(tBT_UUID))) { + if (p_service->len == LEN_UUID_16) { p_attr->p_value->uuid.len = LEN_UUID_16; p_attr->p_value->uuid.uu.uuid16 = p_service->uu.uuid16; - } - else if (p_service->len == LEN_UUID_32) - { + } else if (p_service->len == LEN_UUID_32) { p_attr->p_value->uuid.len = LEN_UUID_128; gatt_convert_uuid32_to_uuid128(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid32); - } - else - { + } else { p_attr->p_value->uuid.len = LEN_UUID_128; memcpy(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid128, LEN_UUID_128); } diff --git a/components/bt/bluedroid/stack/gatt/gatt_main.c b/components/bt/bluedroid/stack/gatt/gatt_main.c old mode 100755 new mode 100644 index 953b95037..8b40ed0e5 --- a/components/bt/bluedroid/stack/gatt/gatt_main.c +++ b/components/bt/bluedroid/stack/gatt/gatt_main.c @@ -45,7 +45,7 @@ /* L O C A L F U N C T I O N P R O T O T Y P E S */ /********************************************************************************/ static void gatt_le_connect_cback (UINT16 chan, BD_ADDR bd_addr, BOOLEAN connected, - UINT16 reason, tBT_TRANSPORT transport); + UINT16 reason, tBT_TRANSPORT transport); static void gatt_le_data_ind (UINT16 chan, BD_ADDR bd_addr, BT_HDR *p_buf); static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congest); @@ -60,8 +60,7 @@ static void gatt_l2cif_data_ind_cback (UINT16 l2cap_cid, BT_HDR *p_msg); static void gatt_send_conn_cback (tGATT_TCB *p_tcb); static void gatt_l2cif_congest_cback (UINT16 cid, BOOLEAN congested); -static const tL2CAP_APPL_INFO dyn_info = -{ +static const tL2CAP_APPL_INFO dyn_info = { gatt_l2cif_connect_ind_cback, gatt_l2cif_connect_cfm_cback, NULL, @@ -123,8 +122,7 @@ void gatt_init (void) L2CA_RegisterFixedChannel (L2CAP_ATT_CID, &fixed_reg); /* Now, register with L2CAP for ATT PSM over BR/EDR */ - if (!L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info)) - { + if (!L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info)) { GATT_TRACE_ERROR ("ATT Dynamic Registration failed"); } @@ -152,8 +150,7 @@ void gatt_free(void) { int i; GATT_TRACE_DEBUG("gatt_free()"); - for (i = 0; i < GATT_MAX_SR_PROFILES; i++) - { + for (i = 0; i < GATT_MAX_SR_PROFILES; i++) { gatt_free_hdl_buffer(&gatt_cb.hdl_list[i]); } } @@ -173,18 +170,17 @@ BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb, tBT_TRANSPORT transport { BOOLEAN gatt_ret = FALSE; - if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN) + if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN) { gatt_set_ch_state(p_tcb, GATT_CH_CONN); + } - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { p_tcb->att_lcid = L2CAP_ATT_CID; gatt_ret = L2CA_ConnectFixedChnl (L2CAP_ATT_CID, rem_bda); - } - else - { - if ((p_tcb->att_lcid = L2CA_ConnectReq(BT_PSM_ATT, rem_bda)) != 0) + } else { + if ((p_tcb->att_lcid = L2CA_ConnectReq(BT_PSM_ATT, rem_bda)) != 0) { gatt_ret = TRUE; + } } return gatt_ret; @@ -208,31 +204,21 @@ BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb) tGATT_CH_STATE ch_state; GATT_TRACE_DEBUG ("gatt_disconnect "); - if (p_tcb != NULL) - { + if (p_tcb != NULL) { ret = TRUE; - if ( (ch_state = gatt_get_ch_state(p_tcb)) != GATT_CH_CLOSING ) - { - if (p_tcb->att_lcid == L2CAP_ATT_CID) - { - if (ch_state == GATT_CH_OPEN) - { + if ( (ch_state = gatt_get_ch_state(p_tcb)) != GATT_CH_CLOSING ) { + if (p_tcb->att_lcid == L2CAP_ATT_CID) { + if (ch_state == GATT_CH_OPEN) { /* only LCB exist between remote device and local */ ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, p_tcb->peer_bda); - } - else - { + } else { gatt_set_ch_state(p_tcb, GATT_CH_CLOSING); ret = L2CA_CancelBleConnectReq (p_tcb->peer_bda); } - } - else - { + } else { ret = L2CA_DisconnectReq(p_tcb->att_lcid); } - } - else - { + } else { GATT_TRACE_DEBUG ("gatt_disconnect already in closing state"); } } @@ -252,34 +238,27 @@ BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb) void gatt_update_app_hold_link_status (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add) { UINT8 i; - BOOLEAN found=FALSE; + BOOLEAN found = FALSE; - if (p_tcb == NULL) - { + if (p_tcb == NULL) { GATT_TRACE_ERROR("gatt_update_app_hold_link_status p_tcb=NULL"); return; } - for (i=0; iapp_hold_link[i] == gatt_if) - { + for (i = 0; i < GATT_MAX_APPS; i++) { + if (p_tcb->app_hold_link[i] == gatt_if) { found = TRUE; - if (!is_add) - { + if (!is_add) { p_tcb->app_hold_link[i] = 0; break; } } } - if (!found && is_add) - { - for (i=0; iapp_hold_link[i] == 0) - { + if (!found && is_add) { + for (i = 0; i < GATT_MAX_APPS; i++) { + if (p_tcb->app_hold_link[i] == 0) { p_tcb->app_hold_link[i] = gatt_if; found = TRUE; break; @@ -304,25 +283,20 @@ void gatt_update_app_hold_link_status (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLE void gatt_update_app_use_link_flag (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link) { GATT_TRACE_DEBUG("gatt_update_app_use_link_flag is_add=%d chk_link=%d", - is_add, check_acl_link); + is_add, check_acl_link); gatt_update_app_hold_link_status(gatt_if, p_tcb, is_add); if (check_acl_link && - p_tcb && - p_tcb->att_lcid == L2CAP_ATT_CID && /* only update link idle timer for fixed channel */ - (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) != GATT_INVALID_ACL_HANDLE)) - { - if (is_add) - { + p_tcb && + p_tcb->att_lcid == L2CAP_ATT_CID && /* only update link idle timer for fixed channel */ + (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) != GATT_INVALID_ACL_HANDLE)) { + if (is_add) { GATT_TRACE_DEBUG("GATT disables link idle timer"); /* acl link is connected disable the idle timeout */ GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport); - } - else - { - if (!gatt_num_apps_hold_link(p_tcb)) - { + } else { + if (!gatt_num_apps_hold_link(p_tcb)) { /* acl link is connected but no application needs to use the link so set the timeout value to GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP seconds */ GATT_TRACE_DEBUG("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP); @@ -348,45 +322,35 @@ BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT trans tGATT_TCB *p_tcb; UINT8 st; - if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL) { ret = TRUE; st = gatt_get_ch_state(p_tcb); /* before link down, another app try to open a GATT connection */ - if(st == GATT_CH_OPEN && gatt_num_apps_hold_link(p_tcb) == 0 && - transport == BT_TRANSPORT_LE ) - { - if (!gatt_connect(bd_addr, p_tcb, transport)) + if (st == GATT_CH_OPEN && gatt_num_apps_hold_link(p_tcb) == 0 && + transport == BT_TRANSPORT_LE ) { + if (!gatt_connect(bd_addr, p_tcb, transport)) { ret = FALSE; - } - else if(st == GATT_CH_CLOSING) - { + } + } else if (st == GATT_CH_CLOSING) { /* need to complete the closing first */ ret = FALSE; } - } - else - { - if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, transport)) != NULL) - { - if (!gatt_connect(bd_addr, p_tcb, transport)) - { + } else { + if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, transport)) != NULL) { + if (!gatt_connect(bd_addr, p_tcb, transport)) { GATT_TRACE_ERROR("gatt_connect failed"); memset(p_tcb, 0, sizeof(tGATT_TCB)); - } - else + } else { ret = TRUE; - } - else - { + } + } else { ret = 0; GATT_TRACE_ERROR("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if); } } - if (ret) - { + if (ret) { gatt_update_app_use_link_flag(p_reg->gatt_if, p_tcb, TRUE, FALSE); } @@ -408,49 +372,44 @@ static void gatt_le_connect_cback (UINT16 chan, BD_ADDR bd_addr, BOOLEAN connect tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, transport); BOOLEAN check_srv_chg = FALSE; - tGATTS_SRV_CHG *p_srv_chg_clt=NULL; + tGATTS_SRV_CHG *p_srv_chg_clt = NULL; /* ignore all fixed channel connect/disconnect on BR/EDR link for GATT */ - if (transport == BT_TRANSPORT_BR_EDR) + if (transport == BT_TRANSPORT_BR_EDR) { return; + } GATT_TRACE_DEBUG ("GATT ATT protocol channel with BDA: %08x%04x is %s", - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected"); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], (connected) ? "connected" : "disconnected"); - if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) - { + if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) { check_srv_chg = TRUE; - } - else - { - if (btm_sec_is_a_bonded_dev(bd_addr)) + } else { + if (btm_sec_is_a_bonded_dev(bd_addr)) { gatt_add_a_bonded_dev_for_srv_chg(bd_addr); + } } - if (connected) - { + if (connected) { /* do we have a channel initiating a connection? */ - if (p_tcb) - { + if (p_tcb) { /* we are initiating connection */ - if ( gatt_get_ch_state(p_tcb) == GATT_CH_CONN) - { + if ( gatt_get_ch_state(p_tcb) == GATT_CH_CONN) { /* send callback */ gatt_set_ch_state(p_tcb, GATT_CH_OPEN); p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; gatt_send_conn_cback(p_tcb); } - if (check_srv_chg) + if (check_srv_chg) { gatt_chk_srv_chg (p_srv_chg_clt); + } } /* this is incoming connection or background connection callback */ - else - { - if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_LE)) != NULL) - { + else { + if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_LE)) != NULL) { p_tcb->att_lcid = L2CAP_ATT_CID; gatt_set_ch_state(p_tcb, GATT_CH_OPEN); @@ -458,19 +417,14 @@ static void gatt_le_connect_cback (UINT16 chan, BD_ADDR bd_addr, BOOLEAN connect p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; gatt_send_conn_cback (p_tcb); - if (check_srv_chg) - { + if (check_srv_chg) { gatt_chk_srv_chg (p_srv_chg_clt); } - } - else - { + } else { GATT_TRACE_ERROR("CCB max out, no rsources"); } } - } - else - { + } else { gatt_cleanup_upon_disc(bd_addr, reason, transport); GATT_TRACE_DEBUG ("ATT disconnected"); } @@ -489,21 +443,17 @@ static void gatt_le_connect_cback (UINT16 chan, BD_ADDR bd_addr, BOOLEAN connect static void gatt_channel_congestion(tGATT_TCB *p_tcb, BOOLEAN congested) { UINT8 i = 0; - tGATT_REG *p_reg=NULL; + tGATT_REG *p_reg = NULL; UINT16 conn_id; /* if uncongested, check to see if there is any more pending data */ - if (p_tcb != NULL && congested == FALSE) - { + if (p_tcb != NULL && congested == FALSE) { gatt_cl_send_next_cmd_inq(p_tcb); } /* notifying all applications for the connection up event */ - for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) - { - if (p_reg->in_use) - { - if (p_reg->app_cb.p_congestion_cb) - { + for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) { + if (p_reg->in_use) { + if (p_reg->app_cb.p_congestion_cb) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); (*p_reg->app_cb.p_congestion_cb)(conn_id, congested); } @@ -526,8 +476,7 @@ static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congested) tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(remote_bda, BT_TRANSPORT_LE); /* if uncongested, check to see if there is any more pending data */ - if (p_tcb != NULL) - { + if (p_tcb != NULL) { gatt_channel_congestion(p_tcb, congested); } } @@ -553,18 +502,14 @@ static void gatt_le_data_ind (UINT16 chan, BD_ADDR bd_addr, BT_HDR *p_buf) /* Find CCB based on bd addr */ if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, BT_TRANSPORT_LE)) != NULL && - gatt_get_ch_state(p_tcb) >= GATT_CH_OPEN) - { + gatt_get_ch_state(p_tcb) >= GATT_CH_OPEN) { gatt_data_process(p_tcb, p_buf); - } - else - { + } else { GKI_freebuf (p_buf); - if (p_tcb != NULL) - { + if (p_tcb != NULL) { GATT_TRACE_WARNING ("ATT - Ignored L2CAP data while in state: %d", - gatt_get_ch_state(p_tcb)); + gatt_get_ch_state(p_tcb)); } } } @@ -590,20 +535,16 @@ static void gatt_l2cif_connect_ind_cback (BD_ADDR bd_addr, UINT16 lcid, UINT16 GATT_TRACE_ERROR("Connection indication cid = %d", lcid); /* new connection ? */ - if (p_tcb == NULL) - { + if (p_tcb == NULL) { /* allocate tcb */ - if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { /* no tcb available, reject L2CAP connection */ result = L2CAP_CONN_NO_RESOURCES; - } - else + } else { p_tcb->att_lcid = lcid; + } - } - else /* existing connection , reject it */ - { + } else { /* existing connection , reject it */ result = L2CAP_CONN_NO_RESOURCES; } @@ -611,8 +552,7 @@ static void gatt_l2cif_connect_ind_cback (BD_ADDR bd_addr, UINT16 lcid, UINT16 L2CA_ConnectRsp(bd_addr, id, lcid, result, 0); /* if result ok, proceed with connection */ - if (result == L2CAP_CONN_OK) - { + if (result == L2CAP_CONN_OK) { /* transition to configuration state */ gatt_set_ch_state(p_tcb, GATT_CH_CFG); @@ -641,16 +581,13 @@ static void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result) tL2CAP_CFG_INFO cfg; /* look up clcb for this channel */ - if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { GATT_TRACE_DEBUG("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid); /* if in correct state */ - if (gatt_get_ch_state(p_tcb) == GATT_CH_CONN) - { + if (gatt_get_ch_state(p_tcb) == GATT_CH_CONN) { /* if result successful */ - if (result == L2CAP_CONN_OK) - { + if (result == L2CAP_CONN_OK) { /* set channel state */ gatt_set_ch_state(p_tcb, GATT_CH_CFG); @@ -661,15 +598,11 @@ static void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result) L2CA_ConfigReq(lcid, &cfg); } /* else initiating connection failure */ - else - { + else { gatt_cleanup_upon_disc(p_tcb->peer_bda, result, GATT_TRANSPORT_BR_EDR); } - } - else /* wrong state, disconnect it */ - { - if (result == L2CAP_CONN_OK) - { + } else { /* wrong state, disconnect it */ + if (result == L2CAP_CONN_OK) { /* just in case the peer also accepts our connection - Send L2CAP disconnect req */ L2CA_DisconnectReq(lcid); } @@ -690,33 +623,27 @@ static void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result) void gatt_l2cif_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) { tGATT_TCB *p_tcb; - tGATTS_SRV_CHG *p_srv_chg_clt=NULL; + tGATTS_SRV_CHG *p_srv_chg_clt = NULL; /* look up clcb for this channel */ - if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { /* if in correct state */ - if ( gatt_get_ch_state(p_tcb) == GATT_CH_CFG) - { + if ( gatt_get_ch_state(p_tcb) == GATT_CH_CFG) { /* if result successful */ - if (p_cfg->result == L2CAP_CFG_OK) - { + if (p_cfg->result == L2CAP_CFG_OK) { /* update flags */ p_tcb->ch_flags |= GATT_L2C_CFG_CFM_DONE; /* if configuration complete */ - if (p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) - { + if (p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) { gatt_set_ch_state(p_tcb, GATT_CH_OPEN); - if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) - { + if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) { gatt_chk_srv_chg(p_srv_chg_clt); - } - else - { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + } else { + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* send callback */ @@ -724,8 +651,7 @@ void gatt_l2cif_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) } } /* else failure */ - else - { + else { /* Send L2CAP disconnect req */ L2CA_DisconnectReq(lcid); } @@ -746,16 +672,16 @@ void gatt_l2cif_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) void gatt_l2cif_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) { tGATT_TCB *p_tcb; - tGATTS_SRV_CHG *p_srv_chg_clt=NULL; + tGATTS_SRV_CHG *p_srv_chg_clt = NULL; /* look up clcb for this channel */ - if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { /* GATT uses the smaller of our MTU and peer's MTU */ if ( p_cfg->mtu_present && - (p_cfg->mtu >= GATT_MIN_BR_MTU_SIZE && p_cfg->mtu < L2CAP_DEFAULT_MTU)) + (p_cfg->mtu >= GATT_MIN_BR_MTU_SIZE && p_cfg->mtu < L2CAP_DEFAULT_MTU)) { p_tcb->payload_size = p_cfg->mtu; - else + } else { p_tcb->payload_size = L2CAP_DEFAULT_MTU; + } /* send L2CAP configure response */ memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO)); @@ -763,23 +689,19 @@ void gatt_l2cif_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) L2CA_ConfigRsp(lcid, p_cfg); /* if first config ind */ - if ((p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) == 0) - { + if ((p_tcb->ch_flags & GATT_L2C_CFG_IND_DONE) == 0) { /* update flags */ p_tcb->ch_flags |= GATT_L2C_CFG_IND_DONE; /* if configuration complete */ - if (p_tcb->ch_flags & GATT_L2C_CFG_CFM_DONE) - { + if (p_tcb->ch_flags & GATT_L2C_CFG_CFM_DONE) { gatt_set_ch_state(p_tcb, GATT_CH_OPEN); - if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) - { + if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) { gatt_chk_srv_chg(p_srv_chg_clt); - } - else - { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + } else { + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* send callback */ @@ -805,21 +727,20 @@ void gatt_l2cif_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed) UINT16 reason; /* look up clcb for this channel */ - if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) - { - if (ack_needed) - { + if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { + if (ack_needed) { /* send L2CAP disconnect response */ L2CA_DisconnectRsp(lcid); } - if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) - { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) { + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ - if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) + if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) { reason = GATT_CONN_TERMINATE_PEER_USER; + } /* send disconnect callback */ gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR); @@ -843,19 +764,19 @@ static void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result) UNUSED(result); /* look up clcb for this channel */ - if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { /* If the device is not in the service changed client list, add it... */ - if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) - { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL) { + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* send disconnect callback */ /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ - if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) + if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0) { reason = GATT_CONN_TERMINATE_LOCAL_HOST; + } gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR); } @@ -877,13 +798,12 @@ static void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf) /* look up clcb for this channel */ if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL && - gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) - { + gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) { /* process the data */ gatt_data_process(p_tcb, p_buf); - } - else /* prevent buffer leak */ + } else { /* prevent buffer leak */ GKI_freebuf(p_buf); + } } /******************************************************************************* @@ -899,8 +819,7 @@ static void gatt_l2cif_congest_cback (UINT16 lcid, BOOLEAN congested) { tGATT_TCB *p_tcb = gatt_find_tcb_by_cid(lcid); - if (p_tcb != NULL) - { + if (p_tcb != NULL) { gatt_channel_congestion(p_tcb, congested); } } @@ -919,31 +838,28 @@ static void gatt_send_conn_cback(tGATT_TCB *p_tcb) { UINT8 i; tGATT_REG *p_reg; - tGATT_BG_CONN_DEV *p_bg_dev=NULL; + tGATT_BG_CONN_DEV *p_bg_dev = NULL; UINT16 conn_id; p_bg_dev = gatt_find_bg_dev(p_tcb->peer_bda); /* notifying all applications for the connection up event */ - for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) - { - if (p_reg->in_use) - { - if (p_bg_dev && gatt_is_bg_dev_for_app(p_bg_dev, p_reg->gatt_if)) + for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) { + if (p_reg->in_use) { + if (p_bg_dev && gatt_is_bg_dev_for_app(p_bg_dev, p_reg->gatt_if)) { gatt_update_app_use_link_flag(p_reg->gatt_if, p_tcb, TRUE, TRUE); + } - if (p_reg->app_cb.p_conn_cb) - { + if (p_reg->app_cb.p_conn_cb) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id, - TRUE, 0, p_tcb->transport); + TRUE, 0, p_tcb->transport); } } } - if (gatt_num_apps_hold_link(p_tcb) && p_tcb->att_lcid == L2CAP_ATT_CID ) - { + if (gatt_num_apps_hold_link(p_tcb) && p_tcb->att_lcid == L2CAP_ATT_CID ) { /* disable idle timeout if one or more clients are holding the link disable the idle timer */ GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport); } @@ -971,36 +887,28 @@ void gatt_data_process (tGATT_TCB *p_tcb, BT_HDR *p_buf) UINT16 msg_len; - if (p_buf->len > 0) - { + if (p_buf->len > 0) { msg_len = p_buf->len - 1; STREAM_TO_UINT8(op_code, p); /* remove the two MSBs associated with sign write and write cmd */ pseudo_op_code = op_code & (~GATT_WRITE_CMD_MASK); - if (pseudo_op_code < GATT_OP_CODE_MAX) - { - if (op_code == GATT_SIGN_CMD_WRITE) - { + if (pseudo_op_code < GATT_OP_CODE_MAX) { + if (op_code == GATT_SIGN_CMD_WRITE) { gatt_verify_signature(p_tcb, p_buf); - } - else - { + } else { /* message from client */ - if ((op_code % 2) == 0) + if ((op_code % 2) == 0) { gatt_server_handle_client_req (p_tcb, op_code, msg_len, p); - else + } else { gatt_client_handle_server_rsp (p_tcb, op_code, msg_len, p); + } } - } - else - { + } else { GATT_TRACE_ERROR ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code); } - } - else - { + } else { GATT_TRACE_ERROR ("invalid data length, ignore"); } @@ -1023,12 +931,12 @@ void gatt_add_a_bonded_dev_for_srv_chg (BD_ADDR bda) memcpy(srv_chg_clt.bda, bda, BD_ADDR_LEN); srv_chg_clt.srv_changed = FALSE; - if (gatt_add_srv_chg_clt(&srv_chg_clt) != NULL) - { + if (gatt_add_srv_chg_clt(&srv_chg_clt) != NULL) { memcpy(req.srv_chg.bda, bda, BD_ADDR_LEN); req.srv_chg.srv_changed = FALSE; - if (gatt_cb.cb_info.p_srv_chg_callback) + if (gatt_cb.cb_info.p_srv_chg_callback) { (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_ADD_CLIENT, &req, NULL); + } } } @@ -1050,22 +958,18 @@ void gatt_send_srv_chg_ind (BD_ADDR peer_bda) GATT_TRACE_DEBUG("gatt_send_srv_chg_ind"); - if (gatt_cb.handle_of_h_r) - { - if ((conn_id = gatt_profile_find_conn_id_by_bd_addr(peer_bda)) != GATT_INVALID_CONN_ID) - { + if (gatt_cb.handle_of_h_r) { + if ((conn_id = gatt_profile_find_conn_id_by_bd_addr(peer_bda)) != GATT_INVALID_CONN_ID) { UINT16_TO_STREAM (p, 1); UINT16_TO_STREAM (p, 0xFFFF); GATTS_HandleValueIndication (conn_id, gatt_cb.handle_of_h_r, GATT_SIZE_OF_SRV_CHG_HNDL_RANGE, handle_range); - } - else - { + } else { GATT_TRACE_ERROR("Unable to find conn_id for %08x%04x ", - (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], - (peer_bda[4]<<8)+peer_bda[5] ); + (peer_bda[0] << 24) + (peer_bda[1] << 16) + (peer_bda[2] << 8) + peer_bda[3], + (peer_bda[4] << 8) + peer_bda[5] ); } } } @@ -1084,8 +988,7 @@ void gatt_chk_srv_chg(tGATTS_SRV_CHG *p_srv_chg_clt) { GATT_TRACE_DEBUG("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed ); - if (p_srv_chg_clt->srv_changed) - { + if (p_srv_chg_clt->srv_changed) { gatt_send_srv_chg_ind(p_srv_chg_clt->bda); } } @@ -1105,27 +1008,22 @@ void gatt_init_srv_chg (void) tGATTS_SRV_CHG_REQ req; tGATTS_SRV_CHG_RSP rsp; BOOLEAN status; - UINT8 num_clients,i; + UINT8 num_clients, i; tGATTS_SRV_CHG srv_chg_clt; GATT_TRACE_DEBUG("gatt_init_srv_chg"); - if (gatt_cb.cb_info.p_srv_chg_callback) - { + if (gatt_cb.cb_info.p_srv_chg_callback) { status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_NUM_CLENTS, NULL, &rsp); - if (status && rsp.num_clients) - { + if (status && rsp.num_clients) { GATT_TRACE_DEBUG("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients); num_clients = rsp.num_clients; i = 1; /* use one based index */ - while ((i <= num_clients) && status) - { + while ((i <= num_clients) && status) { req.client_read_index = i; - if ((status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_CLENT, &req, &rsp)) == TRUE) - { - memcpy(&srv_chg_clt, &rsp.srv_chg ,sizeof(tGATTS_SRV_CHG)); - if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL) - { + if ((status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_CLENT, &req, &rsp)) == TRUE) { + memcpy(&srv_chg_clt, &rsp.srv_chg , sizeof(tGATTS_SRV_CHG)); + if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL) { GATT_TRACE_ERROR("Unable to add a service change client"); status = FALSE; } @@ -1133,9 +1031,7 @@ void gatt_init_srv_chg (void) i++; } } - } - else - { + } else { GATT_TRACE_DEBUG("gatt_init_srv_chg callback not registered yet"); } } @@ -1153,27 +1049,22 @@ void gatt_proc_srv_chg (void) { UINT8 start_idx, found_idx; BD_ADDR bda; - BOOLEAN srv_chg_ind_pending=FALSE; + BOOLEAN srv_chg_ind_pending = FALSE; tGATT_TCB *p_tcb; tBT_TRANSPORT transport; GATT_TRACE_DEBUG ("gatt_proc_srv_chg"); - if (gatt_cb.cb_info.p_srv_chg_callback && gatt_cb.handle_of_h_r) - { + if (gatt_cb.cb_info.p_srv_chg_callback && gatt_cb.handle_of_h_r) { gatt_set_srv_chg(); - start_idx =0; - while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) - { + start_idx = 0; + while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport)) { p_tcb = &gatt_cb.tcb[found_idx];; srv_chg_ind_pending = gatt_is_srv_chg_ind_pending(p_tcb); - if (!srv_chg_ind_pending) - { + if (!srv_chg_ind_pending) { gatt_send_srv_chg_ind(bda); - } - else - { + } else { GATT_TRACE_DEBUG ("discard srv chg - already has one in the queue"); } start_idx = ++found_idx; @@ -1192,8 +1083,7 @@ void gatt_proc_srv_chg (void) *******************************************************************************/ void gatt_set_ch_state(tGATT_TCB *p_tcb, tGATT_CH_STATE ch_state) { - if (p_tcb) - { + if (p_tcb) { GATT_TRACE_DEBUG ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state); p_tcb->ch_state = ch_state; } @@ -1211,8 +1101,7 @@ void gatt_set_ch_state(tGATT_TCB *p_tcb, tGATT_CH_STATE ch_state) tGATT_CH_STATE gatt_get_ch_state(tGATT_TCB *p_tcb) { tGATT_CH_STATE ch_state = GATT_CH_CLOSE; - if (p_tcb) - { + if (p_tcb) { GATT_TRACE_DEBUG ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state); ch_state = p_tcb->ch_state; } diff --git a/components/bt/bluedroid/stack/gatt/gatt_sr.c b/components/bt/bluedroid/stack/gatt/gatt_sr.c old mode 100755 new mode 100644 index a48d8896f..49ad3a230 --- a/components/bt/bluedroid/stack/gatt/gatt_sr.c +++ b/components/bt/bluedroid/stack/gatt/gatt_sr.c @@ -49,17 +49,13 @@ UINT32 gatt_sr_enqueue_cmd (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 handle) UINT32 trans_id = 0; if ( (p_cmd->op_code == 0) || - (op_code == GATT_HANDLE_VALUE_CONF)) /* no pending request */ - { + (op_code == GATT_HANDLE_VALUE_CONF)) { /* no pending request */ if (op_code == GATT_CMD_WRITE || - op_code == GATT_SIGN_CMD_WRITE || - op_code == GATT_REQ_MTU || - op_code == GATT_HANDLE_VALUE_CONF) - { + op_code == GATT_SIGN_CMD_WRITE || + op_code == GATT_REQ_MTU || + op_code == GATT_HANDLE_VALUE_CONF) { trans_id = ++p_tcb->trans_id; - } - else - { + } else { p_cmd->trans_id = ++p_tcb->trans_id; p_cmd->op_code = op_code; p_cmd->handle = handle; @@ -83,7 +79,7 @@ UINT32 gatt_sr_enqueue_cmd (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 handle) *******************************************************************************/ BOOLEAN gatt_sr_cmd_empty (tGATT_TCB *p_tcb) { - return(p_tcb->sr_cmd.op_code == 0); + return (p_tcb->sr_cmd.op_code == 0); } /******************************************************************************* @@ -99,15 +95,15 @@ void gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb) { /* Double check in case any buffers are queued */ GATT_TRACE_DEBUG("gatt_dequeue_sr_cmd" ); - if (p_tcb->sr_cmd.p_rsp_msg) - { + if (p_tcb->sr_cmd.p_rsp_msg) { GATT_TRACE_ERROR("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg); GKI_freebuf (p_tcb->sr_cmd.p_rsp_msg); } - while (GKI_getfirst(&p_tcb->sr_cmd.multi_rsp_q)) + while (GKI_getfirst(&p_tcb->sr_cmd.multi_rsp_q)) { GKI_freebuf (GKI_dequeue (&p_tcb->sr_cmd.multi_rsp_q)); + } memset( &p_tcb->sr_cmd, 0, sizeof(tGATT_SR_CMD)); } @@ -131,8 +127,7 @@ static BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status, GATT_TRACE_DEBUG ("process_read_multi_rsp status=%d mtu=%d", status, mtu); - if (p_buf == NULL) - { + if (p_buf == NULL) { p_cmd->status = GATT_INSUF_RESOURCE; return FALSE; } @@ -142,18 +137,15 @@ static BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status, GKI_enqueue (&p_cmd->multi_rsp_q, p_buf); p_cmd->status = status; - if (status == GATT_SUCCESS) - { + if (status == GATT_SUCCESS) { GATT_TRACE_DEBUG ("Multi read count=%d num_hdls=%d", - GKI_queue_length(&p_cmd->multi_rsp_q), p_cmd->multi_req.num_handles); + GKI_queue_length(&p_cmd->multi_rsp_q), p_cmd->multi_req.num_handles); /* Wait till we get all the responses */ - if (GKI_queue_length(&p_cmd->multi_rsp_q) == p_cmd->multi_req.num_handles) - { + if (GKI_queue_length(&p_cmd->multi_rsp_q) == p_cmd->multi_req.num_handles) { len = sizeof(BT_HDR) + L2CAP_MIN_OFFSET + mtu; - if ((p_buf = (BT_HDR *)GKI_getbuf(len)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(len)) == NULL) { p_cmd->status = GATT_INSUF_RESOURCE; - return(TRUE); + return (TRUE); } memset(p_buf, 0, len); @@ -165,53 +157,42 @@ static BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status, p_buf->len = 1; /* Now walk through the buffers puting the data into the response in order */ - for (ii = 0; ii < p_cmd->multi_req.num_handles; ii++) - { - if (ii==0) - { + for (ii = 0; ii < p_cmd->multi_req.num_handles; ii++) { + if (ii == 0) { p_rsp = (tGATTS_RSP *)GKI_getfirst (&p_cmd->multi_rsp_q); - } - else - { + } else { p_rsp = (tGATTS_RSP *)GKI_getnext (p_rsp); } - if (p_rsp != NULL) - { + if (p_rsp != NULL) { total_len = (p_buf->len + p_rsp->attr_value.len); - if (total_len > mtu) - { + if (total_len > mtu) { /* just send the partial response for the overflow case */ len = p_rsp->attr_value.len - (total_len - mtu); is_overflow = TRUE; GATT_TRACE_DEBUG ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len ); - } - else - { + } else { len = p_rsp->attr_value.len; } - if (p_rsp->attr_value.handle == p_cmd->multi_req.handles[ii]) - { + if (p_rsp->attr_value.handle == p_cmd->multi_req.handles[ii]) { memcpy (p, p_rsp->attr_value.value, len); - if (!is_overflow) + if (!is_overflow) { p += len; + } p_buf->len += len; - } - else - { + } else { p_cmd->status = GATT_NOT_FOUND; break; } - if (is_overflow) + if (is_overflow) { break; + } - } - else - { + } else { p_cmd->status = GATT_NOT_FOUND; break; } @@ -220,32 +201,25 @@ static BOOLEAN process_read_multi_rsp (tGATT_SR_CMD *p_cmd, tGATT_STATUS status, /* Sanity check on the buffer length */ - if (p_buf->len == 0) - { + if (p_buf->len == 0) { GATT_TRACE_ERROR("process_read_multi_rsp - nothing found!!"); p_cmd->status = GATT_NOT_FOUND; GKI_freebuf (p_buf); GATT_TRACE_DEBUG(" GKI_freebuf (p_buf)"); - } - else if (p_cmd->p_rsp_msg != NULL) - { + } else if (p_cmd->p_rsp_msg != NULL) { GKI_freebuf (p_buf); - } - else - { + } else { p_cmd->p_rsp_msg = p_buf; } - return(TRUE); + return (TRUE); } - } - else /* any handle read exception occurs, return error */ - { - return(TRUE); + } else { /* any handle read exception occurs, return error */ + return (TRUE); } /* If here, still waiting */ - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -269,44 +243,36 @@ tGATT_STATUS gatt_sr_process_app_rsp (tGATT_TCB *p_tcb, tGATT_IF gatt_if, gatt_sr_update_cback_cnt(p_tcb, gatt_if, FALSE, FALSE); - if (op_code == GATT_REQ_READ_MULTI) - { + if (op_code == GATT_REQ_READ_MULTI) { /* If no error and still waiting, just return */ - if (!process_read_multi_rsp (&p_tcb->sr_cmd, status, p_msg, p_tcb->payload_size)) - return(GATT_SUCCESS); - } - else - { - if (op_code == GATT_REQ_PREPARE_WRITE && status == GATT_SUCCESS) + if (!process_read_multi_rsp (&p_tcb->sr_cmd, status, p_msg, p_tcb->payload_size)) { + return (GATT_SUCCESS); + } + } else { + if (op_code == GATT_REQ_PREPARE_WRITE && status == GATT_SUCCESS) { gatt_sr_update_prep_cnt(p_tcb, gatt_if, TRUE, FALSE); + } - if (op_code == GATT_REQ_EXEC_WRITE && status != GATT_SUCCESS) + if (op_code == GATT_REQ_EXEC_WRITE && status != GATT_SUCCESS) { gatt_sr_reset_cback_cnt(p_tcb); + } p_tcb->sr_cmd.status = status; if (gatt_sr_is_cback_cnt_zero(p_tcb) - && status == GATT_SUCCESS) - { - if (p_tcb->sr_cmd.p_rsp_msg == NULL) - { + && status == GATT_SUCCESS) { + if (p_tcb->sr_cmd.p_rsp_msg == NULL) { p_tcb->sr_cmd.p_rsp_msg = attp_build_sr_msg (p_tcb, (UINT8)(op_code + 1), (tGATT_SR_MSG *)p_msg); - } - else - { + } else { GATT_TRACE_ERROR("Exception!!! already has respond message"); } } } - if (gatt_sr_is_cback_cnt_zero(p_tcb)) - { - if ( (p_tcb->sr_cmd.status == GATT_SUCCESS) && (p_tcb->sr_cmd.p_rsp_msg) ) - { + if (gatt_sr_is_cback_cnt_zero(p_tcb)) { + if ( (p_tcb->sr_cmd.status == GATT_SUCCESS) && (p_tcb->sr_cmd.p_rsp_msg) ) { ret_code = attp_send_sr_msg (p_tcb, p_tcb->sr_cmd.p_rsp_msg); p_tcb->sr_cmd.p_rsp_msg = NULL; - } - else - { + } else { ret_code = gatt_send_error_rsp (p_tcb, status, op_code, p_tcb->sr_cmd.handle, FALSE); } @@ -338,10 +304,9 @@ void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U UNUSED(len); #if GATT_CONFORMANCE_TESTING == TRUE - if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) - { + if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) { GATT_TRACE_DEBUG("Conformance tst: forced err rspv for Execute Write: error status=%d", - gatt_cb.err_status); + gatt_cb.err_status); gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, gatt_cb.handle, FALSE); @@ -356,27 +321,22 @@ void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U /* no prep write is queued */ - if (!gatt_sr_is_prep_cnt_zero(p_tcb)) - { + if (!gatt_sr_is_prep_cnt_zero(p_tcb)) { trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, 0); gatt_sr_copy_prep_cnt_to_cback_cnt(p_tcb); - for (i=0; iprep_cnt[i]) - { - gatt_if = (tGATT_IF) (i+1); + for (i = 0; i < GATT_MAX_APPS; i++) { + if (p_tcb->prep_cnt[i]) { + gatt_if = (tGATT_IF) (i + 1); conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if); gatt_sr_send_req_callback(conn_id, trans_id, GATTS_REQ_TYPE_WRITE_EXEC, (tGATTS_DATA *)&flag); - p_tcb->prep_cnt[i]= 0; + p_tcb->prep_cnt[i] = 0; } } - } - else /* nothing needs to be executed , send response now */ - { + } else { /* nothing needs to be executed , send response now */ GATT_TRACE_ERROR("gatt_process_exec_write_req: no prepare write pending"); gatt_send_error_rsp(p_tcb, GATT_ERROR, GATT_REQ_EXEC_WRITE, 0, FALSE); } @@ -410,8 +370,7 @@ void gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U &key_size); #if GATT_CONFORMANCE_TESTING == TRUE - if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) - { + if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) { GATT_TRACE_DEBUG("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status); STREAM_TO_UINT16(handle, p); @@ -422,28 +381,23 @@ void gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U } #endif - while (ll >= 2 && p_tcb->sr_cmd.multi_req.num_handles < GATT_MAX_READ_MULTI_HANDLES) - { + while (ll >= 2 && p_tcb->sr_cmd.multi_req.num_handles < GATT_MAX_READ_MULTI_HANDLES) { STREAM_TO_UINT16(handle, p); - if ((i_rcb = gatt_sr_find_i_rcb_by_handle(handle)) < GATT_MAX_SR_PROFILES) - { + if ((i_rcb = gatt_sr_find_i_rcb_by_handle(handle)) < GATT_MAX_SR_PROFILES) { p_tcb->sr_cmd.multi_req.handles[p_tcb->sr_cmd.multi_req.num_handles++] = handle; /* check read permission */ if ((err = gatts_read_attr_perm_check( gatt_cb.sr_reg[i_rcb].p_db, - FALSE, - handle, - sec_flag, - key_size)) - != GATT_SUCCESS) - { + FALSE, + handle, + sec_flag, + key_size)) + != GATT_SUCCESS) { GATT_TRACE_DEBUG("read permission denied : 0x%02x", err); break; } - } - else - { + } else { /* invalid handle */ err = GATT_INVALID_HANDLE; break; @@ -451,24 +405,20 @@ void gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U ll -= 2; } - if (ll != 0) - { + if (ll != 0) { GATT_TRACE_ERROR("max attribute handle reached in ReadMultiple Request."); } - if (p_tcb->sr_cmd.multi_req.num_handles == 0) + if (p_tcb->sr_cmd.multi_req.num_handles == 0) { err = GATT_INVALID_HANDLE; + } - if (err == GATT_SUCCESS) - { - if ((trans_id = gatt_sr_enqueue_cmd (p_tcb, op_code, p_tcb->sr_cmd.multi_req.handles[0])) != 0) - { + if (err == GATT_SUCCESS) { + if ((trans_id = gatt_sr_enqueue_cmd (p_tcb, op_code, p_tcb->sr_cmd.multi_req.handles[0])) != 0) { gatt_sr_reset_cback_cnt(p_tcb); /* read multiple use multi_rsp_q's count*/ - for (ll = 0; ll < p_tcb->sr_cmd.multi_req.num_handles; ll ++) - { - if ((p_msg = (tGATTS_RSP *)GKI_getbuf(sizeof(tGATTS_RSP))) != NULL) - { + for (ll = 0; ll < p_tcb->sr_cmd.multi_req.num_handles; ll ++) { + if ((p_msg = (tGATTS_RSP *)GKI_getbuf(sizeof(tGATTS_RSP))) != NULL) { memset(p_msg, 0, sizeof(tGATTS_RSP)) ; handle = p_tcb->sr_cmd.multi_req.handles[ll]; @@ -487,28 +437,26 @@ void gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U key_size, trans_id); - if (err == GATT_SUCCESS) - { - gatt_sr_process_app_rsp(p_tcb, gatt_cb.sr_reg[i_rcb].gatt_if ,trans_id, op_code, GATT_SUCCESS, p_msg); + if (err == GATT_SUCCESS) { + gatt_sr_process_app_rsp(p_tcb, gatt_cb.sr_reg[i_rcb].gatt_if , trans_id, op_code, GATT_SUCCESS, p_msg); } /* either not using or done using the buffer, release it now */ GKI_freebuf(p_msg); - } - else - { + } else { err = GATT_NO_RESOURCES; gatt_dequeue_sr_cmd(p_tcb); break; } } - } - else + } else { err = GATT_NO_RESOURCES; + } } /* in theroy BUSY is not possible(should already been checked), protected check */ - if (err != GATT_SUCCESS && err != GATT_PENDING && err != GATT_BUSY) + if (err != GATT_SUCCESS && err != GATT_PENDING && err != GATT_BUSY) { gatt_send_error_rsp(p_tcb, err, op_code, handle, FALSE); + } } /******************************************************************************* @@ -522,14 +470,14 @@ void gatt_process_read_multi_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, U ** *******************************************************************************/ static tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_tcb, - UINT8 op_code, UINT16 s_hdl, - UINT16 e_hdl, UINT8 *p_data, tBT_UUID value) + UINT8 op_code, UINT16 s_hdl, + UINT16 e_hdl, UINT8 *p_data, tBT_UUID value) { tGATT_STATUS status = GATT_NOT_FOUND; - UINT8 handle_len =4, *p ; + UINT8 handle_len = 4, *p ; tGATT_SR_REG *p_rcb; - tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; - tGATT_SRV_LIST_ELEM *p_srv=NULL; + tGATT_SRV_LIST_INFO *p_list = &gatt_cb.srv_list_info; + tGATT_SRV_LIST_ELEM *p_srv = NULL; tBT_UUID *p_uuid; UNUSED(p_data); @@ -538,62 +486,54 @@ static tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_ p_srv = p_list->p_first; - while (p_srv) - { + while (p_srv) { p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); if (p_rcb->in_use && - p_rcb->s_hdl >= s_hdl && - p_rcb->s_hdl <= e_hdl && - p_rcb->type == GATT_UUID_PRI_SERVICE) - { - if ((p_uuid = gatts_get_service_uuid (p_rcb->p_db)) != NULL) - { - if (op_code == GATT_REQ_READ_BY_GRP_TYPE) + p_rcb->s_hdl >= s_hdl && + p_rcb->s_hdl <= e_hdl && + p_rcb->type == GATT_UUID_PRI_SERVICE) { + if ((p_uuid = gatts_get_service_uuid (p_rcb->p_db)) != NULL) { + if (op_code == GATT_REQ_READ_BY_GRP_TYPE) { handle_len = 4 + p_uuid->len; + } /* get the length byte in the repsonse */ - if (p_msg->offset ==0) - { + if (p_msg->offset == 0) { *p ++ = op_code + 1; p_msg->len ++; p_msg->offset = handle_len; - if (op_code == GATT_REQ_READ_BY_GRP_TYPE) - { + if (op_code == GATT_REQ_READ_BY_GRP_TYPE) { *p ++ = (UINT8)p_msg->offset; /* length byte */ p_msg->len ++; } } if (p_msg->len + p_msg->offset <= p_tcb->payload_size && - handle_len == p_msg->offset) - { + handle_len == p_msg->offset) { if (op_code != GATT_REQ_FIND_TYPE_VALUE || - gatt_uuid_compare(value, *p_uuid)) - { + gatt_uuid_compare(value, *p_uuid)) { UINT16_TO_STREAM(p, p_rcb->s_hdl); if (p_list->p_last_primary == p_srv && - p_list->p_last_primary == p_list->p_last) - { + p_list->p_last_primary == p_list->p_last) { GATT_TRACE_DEBUG("Use 0xFFFF for the last primary attribute"); UINT16_TO_STREAM(p, 0xFFFF); /* see GATT ERRATA 4065, 4063, ATT ERRATA 4062 */ - } - else - { + } else { UINT16_TO_STREAM(p, p_rcb->e_hdl); } - if (op_code == GATT_REQ_READ_BY_GRP_TYPE) + if (op_code == GATT_REQ_READ_BY_GRP_TYPE) { gatt_build_uuid_to_stream(&p, *p_uuid); + } status = GATT_SUCCESS; p_msg->len += p_msg->offset; } - } - else + } else { break; + } } } p_srv = p_srv->p_next; @@ -615,7 +555,7 @@ static tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_ ** *******************************************************************************/ static tGATT_STATUS gatt_build_find_info_rsp(tGATT_SR_REG *p_rcb, BT_HDR *p_msg, UINT16 *p_len, - UINT16 s_hdl, UINT16 e_hdl) + UINT16 s_hdl, UINT16 e_hdl) { tGATT_STATUS status = GATT_NOT_FOUND; UINT8 *p; @@ -623,46 +563,37 @@ static tGATT_STATUS gatt_build_find_info_rsp(tGATT_SR_REG *p_rcb, BT_HDR *p_msg, tGATT_ATTR16 *p_attr = NULL; UINT8 info_pair_len[2] = {4, 18}; - if (!p_rcb->p_db || !p_rcb->p_db->p_attr_list) + if (!p_rcb->p_db || !p_rcb->p_db->p_attr_list) { return status; + } /* check the attribute database */ p_attr = (tGATT_ATTR16 *) p_rcb->p_db->p_attr_list; p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET + p_msg->len; - while (p_attr) - { - if (p_attr->handle > e_hdl) - { + while (p_attr) { + if (p_attr->handle > e_hdl) { break; } - if (p_attr->handle >= s_hdl) - { - if (p_msg->offset == 0) + if (p_attr->handle >= s_hdl) { + if (p_msg->offset == 0) { p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) ? GATT_INFO_TYPE_PAIR_16 : GATT_INFO_TYPE_PAIR_128; + } - if (len >= info_pair_len[p_msg->offset - 1]) - { - if (p_msg->offset == GATT_INFO_TYPE_PAIR_16 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) - { + if (len >= info_pair_len[p_msg->offset - 1]) { + if (p_msg->offset == GATT_INFO_TYPE_PAIR_16 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) { UINT16_TO_STREAM(p, p_attr->handle); UINT16_TO_STREAM(p, p_attr->uuid); - } - else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ) - { + } else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ) { UINT16_TO_STREAM(p, p_attr->handle); ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *) p_attr)->uuid, LEN_UUID_128); - } - else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) - { + } else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32) { UINT16_TO_STREAM(p, p_attr->handle); gatt_convert_uuid32_to_uuid128(p, ((tGATT_ATTR32 *) p_attr)->uuid); p += LEN_UUID_128; - } - else - { + } else { GATT_TRACE_ERROR("format mismatch"); status = GATT_NO_RESOURCES; break; @@ -672,9 +603,7 @@ static tGATT_STATUS gatt_build_find_info_rsp(tGATT_SR_REG *p_rcb, BT_HDR *p_msg, len -= info_pair_len[p_msg->offset - 1]; status = GATT_SUCCESS; - } - else - { + } else { status = GATT_NO_RESOURCES; break; } @@ -696,50 +625,45 @@ static tGATT_STATUS gatt_build_find_info_rsp(tGATT_SR_REG *p_rcb, BT_HDR *p_msg, ** *******************************************************************************/ static tGATT_STATUS gatts_validate_packet_format(UINT8 op_code, UINT16 *p_len, - UINT8 **p_data, tBT_UUID *p_uuid_filter, - UINT16 *p_s_hdl, UINT16 *p_e_hdl) + UINT8 **p_data, tBT_UUID *p_uuid_filter, + UINT16 *p_s_hdl, UINT16 *p_e_hdl) { tGATT_STATUS reason = GATT_SUCCESS; UINT16 uuid_len, s_hdl = 0, e_hdl = 0; UINT16 len = *p_len; UINT8 *p = *p_data; - if (len >= 4) - { + if (len >= 4) { /* obtain starting handle, and ending handle */ STREAM_TO_UINT16(s_hdl, p); STREAM_TO_UINT16(e_hdl, p); len -= 4; - if (s_hdl > e_hdl || !GATT_HANDLE_IS_VALID(s_hdl) || !GATT_HANDLE_IS_VALID(e_hdl)) - { + if (s_hdl > e_hdl || !GATT_HANDLE_IS_VALID(s_hdl) || !GATT_HANDLE_IS_VALID(e_hdl)) { reason = GATT_INVALID_HANDLE; } /* for these PDUs, uuid filter must present */ else if (op_code == GATT_REQ_READ_BY_GRP_TYPE || op_code == GATT_REQ_FIND_TYPE_VALUE || - op_code == GATT_REQ_READ_BY_TYPE) - { - if (len >= 2 && p_uuid_filter != NULL) - { + op_code == GATT_REQ_READ_BY_TYPE) { + if (len >= 2 && p_uuid_filter != NULL) { uuid_len = (op_code == GATT_REQ_FIND_TYPE_VALUE) ? 2 : len; /* parse uuid now */ if (gatt_parse_uuid_from_cmd (p_uuid_filter, uuid_len, &p) == FALSE || - p_uuid_filter->len == 0) - { + p_uuid_filter->len == 0) { GATT_TRACE_DEBUG("UUID filter does not exsit"); reason = GATT_INVALID_PDU; - } - else + } else { len -= p_uuid_filter->len; - } - else + } + } else { reason = GATT_INVALID_PDU; + } } - } - else + } else { reason = GATT_INVALID_PDU; + } *p_data = p; *p_len = len; @@ -770,39 +694,28 @@ void gatts_process_primary_service_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 l memset (&value, 0, sizeof(tBT_UUID)); reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl); - if (reason == GATT_SUCCESS) - { - if (gatt_uuid_compare(uuid, primary_service)) - { - if (op_code == GATT_REQ_FIND_TYPE_VALUE) - { - if (gatt_parse_uuid_from_cmd(&value, len, &p_data) == FALSE) + if (reason == GATT_SUCCESS) { + if (gatt_uuid_compare(uuid, primary_service)) { + if (op_code == GATT_REQ_FIND_TYPE_VALUE) { + if (gatt_parse_uuid_from_cmd(&value, len, &p_data) == FALSE) { reason = GATT_INVALID_PDU; + } } - if (reason == GATT_SUCCESS) - { - if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) - { + if (reason == GATT_SUCCESS) { + if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) { GATT_TRACE_ERROR("gatts_process_primary_service_req failed. no resources."); reason = GATT_NO_RESOURCES; - } - else - { + } else { memset(p_msg, 0, msg_len); reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, p_data, value); } } - } - else - { - if (op_code == GATT_REQ_READ_BY_GRP_TYPE) - { + } else { + if (op_code == GATT_REQ_READ_BY_GRP_TYPE) { reason = GATT_UNSUPPORT_GRP_TYPE; GATT_TRACE_DEBUG("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16); - } - else - { + } else { /* we do not support ReadByTypeValue with any non-primamry_service type */ reason = GATT_NOT_FOUND; GATT_TRACE_DEBUG("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16); @@ -810,13 +723,14 @@ void gatts_process_primary_service_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 l } } - if (reason != GATT_SUCCESS) - { - if (p_msg) GKI_freebuf(p_msg); + if (reason != GATT_SUCCESS) { + if (p_msg) { + GKI_freebuf(p_msg); + } gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); - } - else + } else { attp_send_sr_msg(p_tcb, p_msg); + } } @@ -836,21 +750,17 @@ static void gatts_process_find_info(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT16 s_hdl = 0, e_hdl = 0, buf_len; BT_HDR *p_msg = NULL; tGATT_SR_REG *p_rcb; - tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; - tGATT_SRV_LIST_ELEM *p_srv=NULL; + tGATT_SRV_LIST_INFO *p_list = &gatt_cb.srv_list_info; + tGATT_SRV_LIST_ELEM *p_srv = NULL; reason = gatts_validate_packet_format(op_code, &len, &p_data, NULL, &s_hdl, &e_hdl); - if (reason == GATT_SUCCESS) - { + if (reason == GATT_SUCCESS) { buf_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET); - if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) - { + if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) { reason = GATT_NO_RESOURCES; - } - else - { + } else { reason = GATT_NOT_FOUND; memset(p_msg, 0, buf_len); @@ -862,17 +772,14 @@ static void gatts_process_find_info(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, p_srv = p_list->p_first; - while (p_srv) - { + while (p_srv) { p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); if (p_rcb->in_use && - !(p_rcb->s_hdl > e_hdl || - p_rcb->e_hdl < s_hdl)) - { + !(p_rcb->s_hdl > e_hdl || + p_rcb->e_hdl < s_hdl)) { reason = gatt_build_find_info_rsp(p_rcb, p_msg, &buf_len, s_hdl, e_hdl); - if (reason == GATT_NO_RESOURCES) - { + if (reason == GATT_NO_RESOURCES) { reason = GATT_SUCCESS; break; } @@ -885,13 +792,14 @@ static void gatts_process_find_info(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, } } - if (reason != GATT_SUCCESS) - { - if (p_msg) GKI_freebuf(p_msg); + if (reason != GATT_SUCCESS) { + if (p_msg) { + GKI_freebuf(p_msg); + } gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); - } - else + } else { attp_send_sr_msg(p_tcb, p_msg); + } } @@ -913,41 +821,34 @@ static void gatts_process_mtu_req (tGATT_TCB *p_tcb, UINT16 len, UINT8 *p_data) UINT16 conn_id; /* BR/EDR conenction, send error response */ - if (p_tcb->att_lcid != L2CAP_ATT_CID) - { + if (p_tcb->att_lcid != L2CAP_ATT_CID) { gatt_send_error_rsp (p_tcb, GATT_REQ_NOT_SUPPORTED, GATT_REQ_MTU, 0, FALSE); - } - else if (len < GATT_MTU_REQ_MIN_LEN) - { + } else if (len < GATT_MTU_REQ_MIN_LEN) { GATT_TRACE_ERROR("invalid MTU request PDU received.\n"); gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, GATT_REQ_MTU, 0, FALSE); - } - else - { + } else { STREAM_TO_UINT16 (mtu, p); /* mtu must be greater than default MTU which is 23/48 */ - if (mtu < GATT_DEF_BLE_MTU_SIZE) + if (mtu < GATT_DEF_BLE_MTU_SIZE) { p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; - else if (mtu > GATT_MAX_MTU_SIZE) + } else if (mtu > GATT_MAX_MTU_SIZE) { p_tcb->payload_size = GATT_MAX_MTU_SIZE; - else + } else { p_tcb->payload_size = mtu; + } GATT_TRACE_ERROR("MTU request PDU with MTU size %d\n", p_tcb->payload_size); l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size); - if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) - { + if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) { attp_send_sr_msg (p_tcb, p_buf); /* Notify all registered applicaiton with new MTU size. Us a transaction ID */ /* of 0, as no response is allowed from applcations */ - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (gatt_cb.cl_rcb[i].in_use ) - { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (gatt_cb.cl_rcb[i].in_use ) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_cb.cl_rcb[i].gatt_if); gatt_sr_send_req_callback(conn_id, 0, GATTS_REQ_TYPE_MTU, (tGATTS_DATA *)&p_tcb->payload_size); @@ -978,20 +879,19 @@ void gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, tBT_UUID uuid; tGATT_SR_REG *p_rcb; UINT16 msg_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET), - buf_len, - s_hdl, e_hdl, err_hdl = 0; + buf_len, + s_hdl, e_hdl, err_hdl = 0; BT_HDR *p_msg = NULL; tGATT_STATUS reason, ret; UINT8 *p; UINT8 sec_flag, key_size; - tGATT_SRV_LIST_INFO *p_list= &gatt_cb.srv_list_info; - tGATT_SRV_LIST_ELEM *p_srv=NULL; + tGATT_SRV_LIST_INFO *p_list = &gatt_cb.srv_list_info; + tGATT_SRV_LIST_ELEM *p_srv = NULL; reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl); #if GATT_CONFORMANCE_TESTING == TRUE - if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) - { + if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) { GATT_TRACE_DEBUG("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status); gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, s_hdl, FALSE); @@ -1000,16 +900,12 @@ void gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, } #endif - if (reason == GATT_SUCCESS) - { - if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) - { + if (reason == GATT_SUCCESS) { + if ((p_msg = (BT_HDR *)GKI_getbuf(msg_len)) == NULL) { GATT_TRACE_ERROR("gatts_process_find_info failed. no resources."); reason = GATT_NO_RESOURCES; - } - else - { + } else { memset(p_msg, 0, msg_len); p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; @@ -1022,14 +918,12 @@ void gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, p_srv = p_list->p_first; - while (p_srv) - { + while (p_srv) { p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); if (p_rcb->in_use && - !(p_rcb->s_hdl > e_hdl || - p_rcb->e_hdl < s_hdl)) - { + !(p_rcb->s_hdl > e_hdl || + p_rcb->e_hdl < s_hdl)) { gatt_sr_get_sec_info(p_tcb->peer_bda, p_tcb->transport, &sec_flag, @@ -1047,15 +941,14 @@ void gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, key_size, 0, &err_hdl); - if (ret != GATT_NOT_FOUND) - { + if (ret != GATT_NOT_FOUND) { reason = ret; - if (ret == GATT_NO_RESOURCES) + if (ret == GATT_NO_RESOURCES) { reason = GATT_SUCCESS; + } } - if (ret != GATT_SUCCESS && ret != GATT_NOT_FOUND) - { + if (ret != GATT_SUCCESS && ret != GATT_NOT_FOUND) { s_hdl = err_hdl; break; } @@ -1066,16 +959,18 @@ void gatts_process_read_by_type_req(tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, p_msg->offset = L2CAP_MIN_OFFSET; } } - if (reason != GATT_SUCCESS) - { - if (p_msg) GKI_freebuf(p_msg); + if (reason != GATT_SUCCESS) { + if (p_msg) { + GKI_freebuf(p_msg); + } /* in theroy BUSY is not possible(should already been checked), protected check */ - if (reason != GATT_PENDING && reason != GATT_BUSY) + if (reason != GATT_PENDING && reason != GATT_BUSY) { gatt_send_error_rsp (p_tcb, reason, op_code, s_hdl, FALSE); - } - else + } + } else { attp_send_sr_msg(p_tcb, p_msg); + } } @@ -1101,31 +996,29 @@ void gatts_process_write_req (tGATT_TCB *p_tcb, UINT8 i_rcb, UINT16 handle, memset(&sr_data, 0, sizeof(tGATTS_DATA)); - switch (op_code) - { - case GATT_REQ_PREPARE_WRITE: - sr_data.write_req.is_prep = TRUE; - STREAM_TO_UINT16(sr_data.write_req.offset, p); - len -= 2; - /* fall through */ - case GATT_SIGN_CMD_WRITE: - if (op_code == GATT_SIGN_CMD_WRITE) - { - GATT_TRACE_DEBUG("Write CMD with data sigining" ); - len -= GATT_AUTH_SIGN_LEN; - } - /* fall through */ - case GATT_CMD_WRITE: - case GATT_REQ_WRITE: - if (op_code == GATT_REQ_WRITE || op_code == GATT_REQ_PREPARE_WRITE) - sr_data.write_req.need_rsp = TRUE; - sr_data.write_req.handle = handle; - sr_data.write_req.len = len; - if (len != 0 && p != NULL) - { - memcpy (sr_data.write_req.value, p, len); - } - break; + switch (op_code) { + case GATT_REQ_PREPARE_WRITE: + sr_data.write_req.is_prep = TRUE; + STREAM_TO_UINT16(sr_data.write_req.offset, p); + len -= 2; + /* fall through */ + case GATT_SIGN_CMD_WRITE: + if (op_code == GATT_SIGN_CMD_WRITE) { + GATT_TRACE_DEBUG("Write CMD with data sigining" ); + len -= GATT_AUTH_SIGN_LEN; + } + /* fall through */ + case GATT_CMD_WRITE: + case GATT_REQ_WRITE: + if (op_code == GATT_REQ_WRITE || op_code == GATT_REQ_PREPARE_WRITE) { + sr_data.write_req.need_rsp = TRUE; + } + sr_data.write_req.handle = handle; + sr_data.write_req.len = len; + if (len != 0 && p != NULL) { + memcpy (sr_data.write_req.value, p, len); + } + break; } gatt_sr_get_sec_info(p_tcb->peer_bda, @@ -1142,10 +1035,8 @@ void gatts_process_write_req (tGATT_TCB *p_tcb, UINT8 i_rcb, UINT16 handle, sec_flag, key_size); - if (status == GATT_SUCCESS) - { - if ((trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle)) != 0) - { + if (status == GATT_SUCCESS) { + if ((trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle)) != 0) { p_sreg = &gatt_cb.sr_reg[i_rcb]; conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_sreg->gatt_if); gatt_sr_send_req_callback(conn_id, @@ -1154,9 +1045,7 @@ void gatts_process_write_req (tGATT_TCB *p_tcb, UINT8 i_rcb, UINT16 handle, &sr_data); status = GATT_PENDING; - } - else - { + } else { GATT_TRACE_ERROR("max pending command, send error"); status = GATT_BUSY; /* max pending command, application error */ } @@ -1164,8 +1053,7 @@ void gatts_process_write_req (tGATT_TCB *p_tcb, UINT8 i_rcb, UINT16 handle, /* in theroy BUSY is not possible(should already been checked), protected check */ if (status != GATT_PENDING && status != GATT_BUSY && - (op_code == GATT_REQ_PREPARE_WRITE || op_code == GATT_REQ_WRITE)) - { + (op_code == GATT_REQ_PREPARE_WRITE || op_code == GATT_REQ_WRITE)) { gatt_send_error_rsp (p_tcb, status, op_code, handle, FALSE); } return; @@ -1191,16 +1079,14 @@ static void gatts_process_read_req(tGATT_TCB *p_tcb, tGATT_SR_REG *p_rcb, UINT8 UINT16 offset = 0, value_len = 0; UNUSED (len); - if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) - { + if ((p_msg = (BT_HDR *)GKI_getbuf(buf_len)) == NULL) { GATT_TRACE_ERROR("gatts_process_find_info failed. no resources."); reason = GATT_NO_RESOURCES; - } - else - { - if (op_code == GATT_REQ_READ_BLOB) + } else { + if (op_code == GATT_REQ_READ_BLOB) { STREAM_TO_UINT16(offset, p_data); + } memset(p_msg, 0, buf_len); p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET; @@ -1214,30 +1100,32 @@ static void gatts_process_read_req(tGATT_TCB *p_tcb, tGATT_SR_REG *p_rcb, UINT8 &key_size); reason = gatts_read_attr_value_by_handle(p_tcb, - p_rcb->p_db, - op_code, - handle, - offset, - p, - &value_len, - buf_len, - sec_flag, - key_size, - 0); + p_rcb->p_db, + op_code, + handle, + offset, + p, + &value_len, + buf_len, + sec_flag, + key_size, + 0); p_msg->len += value_len; } - if (reason != GATT_SUCCESS) - { - if (p_msg) GKI_freebuf(p_msg); + if (reason != GATT_SUCCESS) { + if (p_msg) { + GKI_freebuf(p_msg); + } /* in theroy BUSY is not possible(should already been checked), protected check */ - if (reason != GATT_PENDING && reason != GATT_BUSY) + if (reason != GATT_PENDING && reason != GATT_BUSY) { gatt_send_error_rsp (p_tcb, reason, op_code, handle, FALSE); - } - else + } + } else { attp_send_sr_msg(p_tcb, p_msg); + } } @@ -1260,21 +1148,17 @@ void gatts_process_attribute_req (tGATT_TCB *p_tcb, UINT8 op_code, tGATT_STATUS status = GATT_INVALID_HANDLE; tGATT_ATTR16 *p_attr; - if (len < 2) - { + if (len < 2) { GATT_TRACE_ERROR("Illegal PDU length, discard request"); status = GATT_INVALID_PDU; - } - else - { + } else { STREAM_TO_UINT16(handle, p); len -= 2; } #if GATT_CONFORMANCE_TESTING == TRUE gatt_cb.handle = handle; - if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) - { + if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code) { GATT_TRACE_DEBUG("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status); gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, handle, FALSE); @@ -1283,33 +1167,27 @@ void gatts_process_attribute_req (tGATT_TCB *p_tcb, UINT8 op_code, } #endif - if (GATT_HANDLE_IS_VALID(handle)) - { - for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) - { - if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) - { + if (GATT_HANDLE_IS_VALID(handle)) { + for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) { + if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) { p_attr = (tGATT_ATTR16 *)p_rcb->p_db->p_attr_list; - while (p_attr) - { - if (p_attr->handle == handle) - { - switch (op_code) - { - case GATT_REQ_READ: /* read char/char descriptor value */ - case GATT_REQ_READ_BLOB: - gatts_process_read_req(p_tcb, p_rcb, op_code, handle, len, p); - break; + while (p_attr) { + if (p_attr->handle == handle) { + switch (op_code) { + case GATT_REQ_READ: /* read char/char descriptor value */ + case GATT_REQ_READ_BLOB: + gatts_process_read_req(p_tcb, p_rcb, op_code, handle, len, p); + break; - case GATT_REQ_WRITE: /* write char/char descriptor value */ - case GATT_CMD_WRITE: - case GATT_SIGN_CMD_WRITE: - case GATT_REQ_PREPARE_WRITE: - gatts_process_write_req(p_tcb, i, handle, op_code, len, p); - break; - default: - break; + case GATT_REQ_WRITE: /* write char/char descriptor value */ + case GATT_CMD_WRITE: + case GATT_SIGN_CMD_WRITE: + case GATT_REQ_PREPARE_WRITE: + gatts_process_write_req(p_tcb, i, handle, op_code, len, p); + break; + default: + break; } status = GATT_SUCCESS; break; @@ -1321,8 +1199,9 @@ void gatts_process_attribute_req (tGATT_TCB *p_tcb, UINT8 op_code, } } - if (status != GATT_SUCCESS && op_code != GATT_CMD_WRITE && op_code != GATT_SIGN_CMD_WRITE) + if (status != GATT_SUCCESS && op_code != GATT_CMD_WRITE && op_code != GATT_SIGN_CMD_WRITE) { gatt_send_error_rsp (p_tcb, status, op_code, handle, FALSE); + } } /******************************************************************************* @@ -1341,13 +1220,13 @@ static void gatts_proc_srv_chg_ind_ack(tGATT_TCB *p_tcb ) GATT_TRACE_DEBUG("gatts_proc_srv_chg_ind_ack"); - if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) - { + if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL) { GATT_TRACE_DEBUG("NV update set srv chg = FALSE"); p_buf->srv_changed = FALSE; memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG)); - if (gatt_cb.cb_info.p_srv_chg_callback) - (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT,&req, NULL); + if (gatt_cb.cb_info.p_srv_chg_callback) { + (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT, &req, NULL); + } } } @@ -1366,8 +1245,7 @@ static void gatts_chk_pending_ind(tGATT_TCB *p_tcb ) tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q); GATT_TRACE_DEBUG("gatts_chk_pending_ind"); - if (p_buf ) - { + if (p_buf ) { GATTS_HandleValueIndication (p_buf->conn_id, p_buf->handle, p_buf->len, @@ -1392,8 +1270,7 @@ static BOOLEAN gatts_proc_ind_ack(tGATT_TCB *p_tcb, UINT16 ack_handle) GATT_TRACE_DEBUG ("gatts_proc_ind_ack ack handle=%d", ack_handle); - if (ack_handle == gatt_cb.handle_of_h_r) - { + if (ack_handle == gatt_cb.handle_of_h_r) { gatts_proc_srv_chg_ind_ack(p_tcb); /* there is no need to inform the application since srv chg is handled internally by GATT */ continue_processing = FALSE; @@ -1422,17 +1299,13 @@ void gatts_process_value_conf(tGATT_TCB *p_tcb, UINT8 op_code) UINT16 conn_id; btu_stop_timer (&p_tcb->conf_timer_ent); - if (GATT_HANDLE_IS_VALID(handle)) - { + if (GATT_HANDLE_IS_VALID(handle)) { p_tcb->indicate_handle = 0; continue_processing = gatts_proc_ind_ack(p_tcb, handle); - if (continue_processing) - { - for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) - { - if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) - { + if (continue_processing) { + for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_rcb ++) { + if (p_rcb->in_use && p_rcb->s_hdl <= handle && p_rcb->e_hdl >= handle) { trans_id = gatt_sr_enqueue_cmd(p_tcb, op_code, handle); conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_rcb->gatt_if); gatt_sr_send_req_callback(conn_id, @@ -1440,9 +1313,7 @@ void gatts_process_value_conf(tGATT_TCB *p_tcb, UINT8 op_code) } } } - } - else - { + } else { GATT_TRACE_ERROR("unexpected handle value confirmation"); } } @@ -1462,69 +1333,65 @@ void gatt_server_handle_client_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data) { /* there is pending command, discard this one */ - if (!gatt_sr_cmd_empty(p_tcb) && op_code != GATT_HANDLE_VALUE_CONF) + if (!gatt_sr_cmd_empty(p_tcb) && op_code != GATT_HANDLE_VALUE_CONF) { return; + } /* the size of the message may not be bigger than the local max PDU size*/ /* The message has to be smaller than the agreed MTU, len does not include op code */ - if (len >= p_tcb->payload_size) - { + if (len >= p_tcb->payload_size) { GATT_TRACE_ERROR("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size ); /* for invalid request expecting response, send it now */ if (op_code != GATT_CMD_WRITE && - op_code != GATT_SIGN_CMD_WRITE && - op_code != GATT_HANDLE_VALUE_CONF) - { + op_code != GATT_SIGN_CMD_WRITE && + op_code != GATT_HANDLE_VALUE_CONF) { gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, op_code, 0, FALSE); } /* otherwise, ignore the pkt */ - } - else - { - switch (op_code) - { - case GATT_REQ_READ_BY_GRP_TYPE: /* discover primary services */ - case GATT_REQ_FIND_TYPE_VALUE: /* discover service by UUID */ - gatts_process_primary_service_req (p_tcb, op_code, len, p_data); - break; + } else { + switch (op_code) { + case GATT_REQ_READ_BY_GRP_TYPE: /* discover primary services */ + case GATT_REQ_FIND_TYPE_VALUE: /* discover service by UUID */ + gatts_process_primary_service_req (p_tcb, op_code, len, p_data); + break; - case GATT_REQ_FIND_INFO:/* discover char descrptor */ - gatts_process_find_info(p_tcb, op_code, len, p_data); - break; + case GATT_REQ_FIND_INFO:/* discover char descrptor */ + gatts_process_find_info(p_tcb, op_code, len, p_data); + break; - case GATT_REQ_READ_BY_TYPE: /* read characteristic value, char descriptor value */ - /* discover characteristic, discover char by UUID */ - gatts_process_read_by_type_req(p_tcb, op_code, len, p_data); - break; + case GATT_REQ_READ_BY_TYPE: /* read characteristic value, char descriptor value */ + /* discover characteristic, discover char by UUID */ + gatts_process_read_by_type_req(p_tcb, op_code, len, p_data); + break; - case GATT_REQ_READ: /* read char/char descriptor value */ - case GATT_REQ_READ_BLOB: - case GATT_REQ_WRITE: /* write char/char descriptor value */ - case GATT_CMD_WRITE: - case GATT_SIGN_CMD_WRITE: - case GATT_REQ_PREPARE_WRITE: - gatts_process_attribute_req (p_tcb, op_code, len, p_data); - break; + case GATT_REQ_READ: /* read char/char descriptor value */ + case GATT_REQ_READ_BLOB: + case GATT_REQ_WRITE: /* write char/char descriptor value */ + case GATT_CMD_WRITE: + case GATT_SIGN_CMD_WRITE: + case GATT_REQ_PREPARE_WRITE: + gatts_process_attribute_req (p_tcb, op_code, len, p_data); + break; - case GATT_HANDLE_VALUE_CONF: - gatts_process_value_conf (p_tcb, op_code); - break; + case GATT_HANDLE_VALUE_CONF: + gatts_process_value_conf (p_tcb, op_code); + break; - case GATT_REQ_MTU: - gatts_process_mtu_req (p_tcb, len, p_data); - break; + case GATT_REQ_MTU: + gatts_process_mtu_req (p_tcb, len, p_data); + break; - case GATT_REQ_EXEC_WRITE: - gatt_process_exec_write_req (p_tcb, op_code, len, p_data); - break; + case GATT_REQ_EXEC_WRITE: + gatt_process_exec_write_req (p_tcb, op_code, len, p_data); + break; - case GATT_REQ_READ_MULTI: - gatt_process_read_multi_req (p_tcb, op_code, len, p_data); - break; + case GATT_REQ_READ_MULTI: + gatt_process_read_multi_req (p_tcb, op_code, len, p_data); + break; - default: - break; + default: + break; } } } diff --git a/components/bt/bluedroid/stack/gatt/gatt_utils.c b/components/bt/bluedroid/stack/gatt/gatt_utils.c old mode 100755 new mode 100644 index c882a1b3d..7b55a097c --- a/components/bt/bluedroid/stack/gatt/gatt_utils.c +++ b/components/bt/bluedroid/stack/gatt/gatt_utils.c @@ -25,23 +25,22 @@ //#include "bt_utils.h" #if BLE_INCLUDED == TRUE - #include - #include - #include "gki.h" +#include +#include +#include "gki.h" - #include "l2cdefs.h" - #include "gatt_int.h" - #include "gatt_api.h" - #include "gattdefs.h" - #include "sdp_api.h" - #include "btm_int.h" +#include "l2cdefs.h" +#include "gatt_int.h" +#include "gatt_api.h" +#include "gattdefs.h" +#include "sdp_api.h" +#include "btm_int.h" /* check if [x, y] and [a, b] have overlapping range */ - #define GATT_VALIDATE_HANDLE_RANGE(x, y, a, b) (y >= a && x <= b) +#define GATT_VALIDATE_HANDLE_RANGE(x, y, a, b) (y >= a && x <= b) - #define GATT_GET_NEXT_VALID_HANDLE(x) (((x)/10 + 1) * 10) +#define GATT_GET_NEXT_VALID_HANDLE(x) (((x)/10 + 1) * 10) -const char * const op_code_name[] = -{ +const char *const op_code_name[] = { "UNKNOWN", "ATT_RSP_ERROR", "ATT_REQ_MTU", @@ -77,7 +76,8 @@ const char * const op_code_name[] = }; static const UINT8 base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; /******************************************************************************* @@ -93,8 +93,9 @@ void gatt_free_pending_ind(tGATT_TCB *p_tcb) { GATT_TRACE_DEBUG("gatt_free_pending_ind"); /* release all queued indications */ - while (!GKI_queue_is_empty(&p_tcb->pending_ind_q)) + while (!GKI_queue_is_empty(&p_tcb->pending_ind_q)) { GKI_freebuf (GKI_dequeue (&p_tcb->pending_ind_q)); + } } /******************************************************************************* @@ -110,8 +111,9 @@ void gatt_free_pending_enc_queue(tGATT_TCB *p_tcb) { GATT_TRACE_DEBUG("gatt_free_pending_enc_queue"); /* release all queued indications */ - while (!GKI_queue_is_empty(&p_tcb->pending_enc_clcb)) + while (!GKI_queue_is_empty(&p_tcb->pending_enc_clcb)) { GKI_freebuf (GKI_dequeue (&p_tcb->pending_enc_clcb)); + } } /******************************************************************************* @@ -129,13 +131,11 @@ void gatt_delete_dev_from_srv_chg_clt_list(BD_ADDR bd_addr) tGATTS_SRV_CHG_REQ req; GATT_TRACE_DEBUG ("gatt_delete_dev_from_srv_chg_clt_list"); - if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) - { - if (gatt_cb.cb_info.p_srv_chg_callback) - { + if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL) { + if (gatt_cb.cb_info.p_srv_chg_callback) { /* delete from NV */ memcpy(req.srv_chg.bda, bd_addr, BD_ADDR_LEN); - (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_REMOVE_CLIENT,&req, NULL); + (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_REMOVE_CLIENT, &req, NULL); } GKI_freebuf (GKI_remove_from_queue (&gatt_cb.srv_chg_clt_q, p_buf)); } @@ -157,16 +157,15 @@ void gatt_set_srv_chg(void) tGATTS_SRV_CHG_REQ req; GATT_TRACE_DEBUG ("gatt_set_srv_chg"); - while (p_buf) - { + while (p_buf) { GATT_TRACE_DEBUG ("found a srv_chg clt"); - if (!p_buf->srv_changed) - { + if (!p_buf->srv_changed) { GATT_TRACE_DEBUG ("set srv_changed to TRUE"); - p_buf->srv_changed= TRUE; + p_buf->srv_changed = TRUE; memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG)); - if (gatt_cb.cb_info.p_srv_chg_callback) - (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT,&req, NULL); + if (gatt_cb.cb_info.p_srv_chg_callback) { + (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT, &req, NULL); + } } p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf); } @@ -186,13 +185,11 @@ tGATTS_PENDING_NEW_SRV_START *gatt_sr_is_new_srv_chg(tBT_UUID *p_app_uuid128, tB tGATTS_HNDL_RANGE *p; tGATTS_PENDING_NEW_SRV_START *p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getfirst(&gatt_cb.pending_new_srv_start_q); - while (p_buf != NULL) - { + while (p_buf != NULL) { p = p_buf->p_new_srv_start; if ( gatt_uuid_compare (*p_app_uuid128, p->app_uuid128) - && gatt_uuid_compare (*p_svc_uuid, p->svc_uuid) - && (svc_inst == p->svc_inst) ) - { + && gatt_uuid_compare (*p_svc_uuid, p->svc_uuid) + && (svc_inst == p->svc_inst) ) { GATT_TRACE_DEBUG ("gatt_sr_is_new_srv_chg: Yes"); break; } @@ -216,8 +213,7 @@ tGATT_VALUE *gatt_add_pending_ind(tGATT_TCB *p_tcb, tGATT_VALUE *p_ind) { tGATT_VALUE *p_buf; GATT_TRACE_DEBUG ("gatt_add_pending_ind"); - if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL) - { + if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL) { GATT_TRACE_DEBUG ("enqueue a pending indication"); memcpy(p_buf, p_ind, sizeof(tGATT_VALUE)); GKI_enqueue (&p_tcb->pending_ind_q, p_buf); @@ -240,8 +236,7 @@ tGATTS_PENDING_NEW_SRV_START *gatt_add_pending_new_srv_start(tGATTS_HNDL_RANGE * tGATTS_PENDING_NEW_SRV_START *p_buf; GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start"); - if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL) - { + if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL) { GATT_TRACE_DEBUG ("enqueue a new pending new srv start"); p_buf->p_new_srv_start = p_new_srv_start; GKI_enqueue (&gatt_cb.pending_new_srv_start_q, p_buf); @@ -263,8 +258,7 @@ tGATTS_SRV_CHG *gatt_add_srv_chg_clt(tGATTS_SRV_CHG *p_srv_chg) { tGATTS_SRV_CHG *p_buf; GATT_TRACE_DEBUG ("gatt_add_srv_chg_clt"); - if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL) - { + if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL) { GATT_TRACE_DEBUG ("enqueue a srv chg client"); memcpy(p_buf, p_srv_chg, sizeof(tGATTS_SRV_CHG)); GKI_enqueue (&gatt_cb.srv_chg_clt_q, p_buf); @@ -287,12 +281,10 @@ tGATT_HDL_LIST_ELEM *gatt_alloc_hdl_buffer(void) { UINT8 i; tGATT_CB *p_cb = &gatt_cb; - tGATT_HDL_LIST_ELEM * p_elem= &p_cb->hdl_list[0]; + tGATT_HDL_LIST_ELEM *p_elem = &p_cb->hdl_list[0]; - for (i = 0; i < GATT_MAX_SR_PROFILES; i++, p_elem ++) - { - if (!p_cb->hdl_list[i].in_use) - { + for (i = 0; i < GATT_MAX_SR_PROFILES; i++, p_elem ++) { + if (!p_cb->hdl_list[i].in_use) { memset(p_elem, 0, sizeof(tGATT_HDL_LIST_ELEM)); p_elem->in_use = TRUE; return p_elem; @@ -313,16 +305,14 @@ tGATT_HDL_LIST_ELEM *gatt_alloc_hdl_buffer(void) *******************************************************************************/ tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_handle(UINT16 handle) { - tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; + tGATT_HDL_LIST_INFO *p_list_info = &gatt_cb.hdl_list_info; tGATT_HDL_LIST_ELEM *p_list = NULL; p_list = p_list_info->p_first; - while (p_list != NULL) - { - if (p_list->in_use && p_list->asgn_range.s_handle == handle) - { - return(p_list); + while (p_list != NULL) { + if (p_list->in_use && p_list->asgn_range.s_handle == handle) { + return (p_list); } p_list = p_list->p_next; } @@ -338,22 +328,20 @@ tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_handle(UINT16 handle) ** *******************************************************************************/ tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128, - tBT_UUID *p_svc_uuid, - UINT16 svc_inst) + tBT_UUID *p_svc_uuid, + UINT16 svc_inst) { - tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info; + tGATT_HDL_LIST_INFO *p_list_info = &gatt_cb.hdl_list_info; tGATT_HDL_LIST_ELEM *p_list = NULL; p_list = p_list_info->p_first; - while (p_list != NULL) - { + while (p_list != NULL) { if ( gatt_uuid_compare (*p_app_uuid128, p_list->asgn_range.app_uuid128) - && gatt_uuid_compare (*p_svc_uuid, p_list->asgn_range.svc_uuid) - && (svc_inst == p_list->asgn_range.svc_inst) ) - { + && gatt_uuid_compare (*p_svc_uuid, p_list->asgn_range.svc_uuid) + && (svc_inst == p_list->asgn_range.svc_inst) ) { GATT_TRACE_DEBUG ("Already allocated handles for this service before!!"); - return(p_list); + return (p_list); } p_list = p_list->p_next; } @@ -371,10 +359,10 @@ tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128, void gatt_free_hdl_buffer(tGATT_HDL_LIST_ELEM *p) { - if (p) - { - while (!GKI_queue_is_empty(&p->svc_db.svc_buffer)) + if (p) { + while (!GKI_queue_is_empty(&p->svc_db.svc_buffer)) { GKI_freebuf (GKI_dequeue (&p->svc_db.svc_buffer)); + } memset(p, 0, sizeof(tGATT_HDL_LIST_ELEM)); } } @@ -393,12 +381,11 @@ void gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id) tGATT_HDL_LIST_ELEM *p_elem = &gatt_cb.hdl_list[0]; UINT8 i; - for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_elem ++) - { - if (memcmp(p_app_id, &p_elem->asgn_range.app_uuid128, sizeof(tBT_UUID)) == 0) - { - while (!GKI_queue_is_empty(&p_elem->svc_db.svc_buffer)) + for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_elem ++) { + if (memcmp(p_app_id, &p_elem->asgn_range.app_uuid128, sizeof(tBT_UUID)) == 0) { + while (!GKI_queue_is_empty(&p_elem->svc_db.svc_buffer)) { GKI_freebuf (GKI_dequeue (&p_elem->svc_db.svc_buffer)); + } p_elem->svc_db.mem_free = 0; p_elem->svc_db.p_attr_list = p_elem->svc_db.p_free_mem = NULL; @@ -416,21 +403,19 @@ void gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id) *******************************************************************************/ BOOLEAN gatt_is_last_attribute(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_start, tBT_UUID value) { - tGATT_SRV_LIST_ELEM *p_srv= p_start->p_next; + tGATT_SRV_LIST_ELEM *p_srv = p_start->p_next; BOOLEAN is_last_attribute = TRUE; tGATT_SR_REG *p_rcb = NULL; tBT_UUID *p_svc_uuid; p_list->p_last_primary = NULL; - while (p_srv) - { + while (p_srv) { p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg); p_svc_uuid = gatts_get_service_uuid (p_rcb->p_db); - if (gatt_uuid_compare(value, *p_svc_uuid)) - { + if (gatt_uuid_compare(value, *p_svc_uuid)) { is_last_attribute = FALSE; break; @@ -453,14 +438,12 @@ BOOLEAN gatt_is_last_attribute(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *******************************************************************************/ void gatt_update_last_pri_srv_info(tGATT_SRV_LIST_INFO *p_list) { - tGATT_SRV_LIST_ELEM *p_srv= p_list->p_first; + tGATT_SRV_LIST_ELEM *p_srv = p_list->p_first; p_list->p_last_primary = NULL; - while (p_srv) - { - if (p_srv->is_primary) - { + while (p_srv) { + if (p_srv->is_primary) { p_list->p_last_primary = p_srv; } p_srv = p_srv->p_next; @@ -501,42 +484,34 @@ BOOLEAN gatt_add_a_srv_to_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM { tGATT_SRV_LIST_ELEM *p_old; - if (!p_new) - { + if (!p_new) { GATT_TRACE_DEBUG("p_new==NULL"); return FALSE; } - if (!p_list->p_first) - { + if (!p_list->p_first) { /* this is an empty list */ p_list->p_first = - p_list->p_last = p_new; + p_list->p_last = p_new; p_new->p_next = - p_new->p_prev = NULL; - } - else - { + p_new->p_prev = NULL; + } else { p_old = p_list->p_first; - while (1) - { - if (p_old == NULL) - { + while (1) { + if (p_old == NULL) { p_list->p_last->p_next = p_new; p_new->p_prev = p_list->p_last; p_new->p_next = NULL; p_list->p_last = p_new; break; - } - else - { - if (p_new->s_hdl < p_old->s_hdl) - { + } else { + if (p_new->s_hdl < p_old->s_hdl) { /* if not the first in list */ - if (p_old->p_prev != NULL) + if (p_old->p_prev != NULL) { p_old->p_prev->p_next = p_new; - else + } else { p_list->p_first = p_new; + } p_new->p_prev = p_old->p_prev; p_new->p_next = p_old; @@ -565,25 +540,20 @@ BOOLEAN gatt_add_a_srv_to_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *******************************************************************************/ BOOLEAN gatt_remove_a_srv_from_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_remove) { - if (!p_remove || !p_list->p_first) - { + if (!p_remove || !p_list->p_first) { GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL"); return FALSE; } - if (p_remove->p_prev == NULL) - { + if (p_remove->p_prev == NULL) { p_list->p_first = p_remove->p_next; - if (p_remove->p_next) + if (p_remove->p_next) { p_remove->p_next->p_prev = NULL; - } - else if (p_remove->p_next == NULL) - { + } + } else if (p_remove->p_next == NULL) { p_list->p_last = p_remove->p_prev; p_remove->p_prev->p_next = NULL; - } - else - { + } else { p_remove->p_next->p_prev = p_remove->p_prev; p_remove->p_prev->p_next = p_remove->p_next; } @@ -606,27 +576,21 @@ BOOLEAN gatt_remove_a_srv_from_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ BOOLEAN gatt_add_an_item_to_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_new) { tGATT_HDL_LIST_ELEM *p_old; - if (!p_new) - { + if (!p_new) { GATT_TRACE_DEBUG("p_new==NULL"); return FALSE; } - if (!p_list->p_first) - { + if (!p_list->p_first) { /* this is an empty list */ p_list->p_first = - p_list->p_last = p_new; + p_list->p_last = p_new; p_new->p_next = - p_new->p_prev = NULL; - } - else - { + p_new->p_prev = NULL; + } else { p_old = p_list->p_first; - while (1) - { - if (p_old == NULL) - { + while (1) { + if (p_old == NULL) { p_list->p_last->p_next = p_new; p_new->p_prev = p_list->p_last; p_new->p_next = NULL; @@ -634,13 +598,11 @@ BOOLEAN gatt_add_an_item_to_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELE break; - } - else - { - if (p_new->asgn_range.s_handle > p_old->asgn_range.s_handle) - { - if (p_old == p_list->p_first) + } else { + if (p_new->asgn_range.s_handle > p_old->asgn_range.s_handle) { + if (p_old == p_list->p_first) { p_list->p_first = p_new; + } p_new->p_prev = p_old->p_prev; p_new->p_next = p_old; @@ -669,25 +631,20 @@ BOOLEAN gatt_add_an_item_to_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELE *******************************************************************************/ BOOLEAN gatt_remove_an_item_from_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_remove) { - if (!p_remove || !p_list->p_first) - { + if (!p_remove || !p_list->p_first) { GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL"); return FALSE; } - if (p_remove->p_prev == NULL) - { + if (p_remove->p_prev == NULL) { p_list->p_first = p_remove->p_next; - if (p_remove->p_next) + if (p_remove->p_next) { p_remove->p_next->p_prev = NULL; - } - else if (p_remove->p_next == NULL) - { + } + } else if (p_remove->p_next == NULL) { p_list->p_last = p_remove->p_prev; p_remove->p_prev->p_next = NULL; - } - else - { + } else { p_remove->p_next->p_prev = p_remove->p_prev; p_remove->p_prev->p_next = p_remove->p_next; } @@ -710,18 +667,16 @@ BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found { UINT8 i; BOOLEAN found = FALSE; - GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d",start_idx); + GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d", start_idx); - for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++) - { - if (gatt_cb.tcb[i].in_use && gatt_cb.tcb[i].ch_state == GATT_CH_OPEN) - { + for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++) { + if (gatt_cb.tcb[i].in_use && gatt_cb.tcb[i].ch_state == GATT_CH_OPEN) { memcpy( bda, gatt_cb.tcb[i].peer_bda, BD_ADDR_LEN); *p_found_idx = i; *p_transport = gatt_cb.tcb[i].transport; found = TRUE; GATT_TRACE_DEBUG("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); break; } } @@ -748,16 +703,11 @@ BOOLEAN gatt_is_srv_chg_ind_pending (tGATT_TCB *p_tcb) GATT_TRACE_DEBUG("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) ); - if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r) - { + if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r) { srv_chg_ind_pending = TRUE; - } - else - { - while (p_buf) - { - if (p_buf->handle == gatt_cb.handle_of_h_r) - { + } else { + while (p_buf) { + if (p_buf->handle == gatt_cb.handle_of_h_r) { srv_chg_ind_pending = TRUE; break; } @@ -784,12 +734,10 @@ tGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda) tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q); GATT_TRACE_DEBUG("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x", - bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); + bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); - while (p_buf != NULL) - { - if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN)) - { + while (p_buf != NULL) { + if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN)) { GATT_TRACE_DEBUG("bda is in the srv chg clt list"); break; } @@ -812,13 +760,11 @@ tGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda) BOOLEAN gatt_is_bda_connected(BD_ADDR bda) { UINT8 i = 0; - BOOLEAN connected=FALSE; + BOOLEAN connected = FALSE; - for ( i=0; i < GATT_MAX_PHY_CHANNEL; i ++) - { + for ( i = 0; i < GATT_MAX_PHY_CHANNEL; i ++) { if (gatt_cb.tcb[i].in_use && - !memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN)) - { + !memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN)) { connected = TRUE; break; } @@ -839,11 +785,9 @@ UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) { UINT8 i = 0; - for ( ; i < GATT_MAX_PHY_CHANNEL; i ++) - { + for ( ; i < GATT_MAX_PHY_CHANNEL; i ++) { if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN) && - gatt_cb.tcb[i].transport == transport) - { + gatt_cb.tcb[i].transport == transport) { return i; } } @@ -860,12 +804,13 @@ UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) ** Returns NULL if not found. Otherwise index to the tcb. ** *******************************************************************************/ -tGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx) +tGATT_TCB *gatt_get_tcb_by_idx(UINT8 tcb_idx) { tGATT_TCB *p_tcb = NULL; - if ( (tcb_idx < GATT_MAX_PHY_CHANNEL) && gatt_cb.tcb[tcb_idx].in_use) + if ( (tcb_idx < GATT_MAX_PHY_CHANNEL) && gatt_cb.tcb[tcb_idx].in_use) { p_tcb = &gatt_cb.tcb[tcb_idx]; + } return p_tcb; } @@ -879,13 +824,14 @@ tGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx) ** Returns NULL if not found. Otherwise index to the tcb. ** *******************************************************************************/ -tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) +tGATT_TCB *gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport) { tGATT_TCB *p_tcb = NULL; UINT8 i = 0; - if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID) + if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID) { p_tcb = &gatt_cb.tcb[i]; + } return p_tcb; } @@ -902,10 +848,8 @@ UINT8 gatt_find_i_tcb_free(void) { UINT8 i = 0, j = GATT_INDEX_INVALID; - for (i = 0; i < GATT_MAX_PHY_CHANNEL; i ++) - { - if (!gatt_cb.tcb[i].in_use) - { + for (i = 0; i < GATT_MAX_PHY_CHANNEL; i ++) { + if (!gatt_cb.tcb[i].in_use) { j = i; break; } @@ -921,7 +865,7 @@ UINT8 gatt_find_i_tcb_free(void) ** Returns GATT_INDEX_INVALID if not found. Otherwise index to the tcb. ** *******************************************************************************/ -tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport) +tGATT_TCB *gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport) { UINT8 i = 0; BOOLEAN allocated = FALSE; @@ -930,17 +874,14 @@ tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport) /* search for existing tcb with matching bda */ i = gatt_find_i_tcb_by_addr(bda, transport); /* find free tcb */ - if (i == GATT_INDEX_INVALID) - { + if (i == GATT_INDEX_INVALID) { i = gatt_find_i_tcb_free(); allocated = TRUE; } - if (i != GATT_INDEX_INVALID) - { + if (i != GATT_INDEX_INVALID) { p_tcb = &gatt_cb.tcb[i]; - if (allocated) - { + if (allocated) { memset(p_tcb, 0, sizeof(tGATT_TCB)); GKI_init_q (&p_tcb->pending_enc_clcb); GKI_init_q (&p_tcb->pending_ind_q); @@ -1003,54 +944,45 @@ BOOLEAN gatt_uuid_compare (tBT_UUID src, tBT_UUID tar) UINT8 *ps, *pt; /* any of the UUID is unspecified */ - if (src.len == 0 || tar.len == 0) - { + if (src.len == 0 || tar.len == 0) { return TRUE; } /* If both are 16-bit, we can do a simple compare */ - if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16) - { + if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16) { return src.uu.uuid16 == tar.uu.uuid16; } /* If both are 32-bit, we can do a simple compare */ - if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32) - { + if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32) { return src.uu.uuid32 == tar.uu.uuid32; } /* One or both of the UUIDs is 128-bit */ - if (src.len == LEN_UUID_16) - { + if (src.len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16); ps = su; - } - else if (src.len == LEN_UUID_32) - { + } else if (src.len == LEN_UUID_32) { gatt_convert_uuid32_to_uuid128(su, src.uu.uuid32); ps = su; - } - else + } else { ps = src.uu.uuid128; + } - if (tar.len == LEN_UUID_16) - { + if (tar.len == LEN_UUID_16) { /* convert a 16 bits UUID to 128 bits value */ gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16); pt = tu; - } - else if (tar.len == LEN_UUID_32) - { + } else if (tar.len == LEN_UUID_32) { /* convert a 32 bits UUID to 128 bits value */ gatt_convert_uuid32_to_uuid128(tu, tar.uu.uuid32); pt = tu; - } - else + } else { pt = tar.uu.uuid128; + } - return(memcmp(ps, pt, LEN_UUID_128) == 0); + return (memcmp(ps, pt, LEN_UUID_128) == 0); } /******************************************************************************* @@ -1067,19 +999,14 @@ UINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid) UINT8 *p = *p_dst; UINT8 len = 0; - if (uuid.len == LEN_UUID_16) - { + if (uuid.len == LEN_UUID_16) { UINT16_TO_STREAM (p, uuid.uu.uuid16); len = LEN_UUID_16; - } - else if (uuid.len == LEN_UUID_32) /* always convert 32 bits into 128 bits as alwats */ - { + } else if (uuid.len == LEN_UUID_32) { /* always convert 32 bits into 128 bits as alwats */ gatt_convert_uuid32_to_uuid128(p, uuid.uu.uuid32); p += LEN_UUID_128; len = LEN_UUID_128; - } - else if (uuid.len == LEN_UUID_128) - { + } else if (uuid.len == LEN_UUID_128) { ARRAY_TO_STREAM (p, uuid.uu.uuid128, LEN_UUID_128); len = LEN_UUID_128; } @@ -1105,59 +1032,53 @@ BOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid_rec, UINT16 uuid_size, UINT8 * memset(p_uuid_rec, 0, sizeof(tBT_UUID)); - switch (uuid_size) - { - case LEN_UUID_16: - p_uuid_rec->len = uuid_size; - STREAM_TO_UINT16 (p_uuid_rec->uu.uuid16, p_uuid); - *p_data += LEN_UUID_16; - break; + switch (uuid_size) { + case LEN_UUID_16: + p_uuid_rec->len = uuid_size; + STREAM_TO_UINT16 (p_uuid_rec->uu.uuid16, p_uuid); + *p_data += LEN_UUID_16; + break; - case LEN_UUID_128: - /* See if we can compress his UUID down to 16 or 32bit UUIDs */ - is_base_uuid = TRUE; - for (xx = 0; xx < LEN_UUID_128 - 4; xx++) - { - if (p_uuid[xx] != base_uuid[xx]) - { - is_base_uuid = FALSE; - break; - } + case LEN_UUID_128: + /* See if we can compress his UUID down to 16 or 32bit UUIDs */ + is_base_uuid = TRUE; + for (xx = 0; xx < LEN_UUID_128 - 4; xx++) { + if (p_uuid[xx] != base_uuid[xx]) { + is_base_uuid = FALSE; + break; } - if (is_base_uuid) - { - if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0)) - { - p_uuid += (LEN_UUID_128 - 4); - p_uuid_rec->len = LEN_UUID_16; - STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid); - } - else - { - p_uuid += (LEN_UUID_128 - LEN_UUID_32); - p_uuid_rec->len = LEN_UUID_32; - STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid); - } + } + if (is_base_uuid) { + if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0)) { + p_uuid += (LEN_UUID_128 - 4); + p_uuid_rec->len = LEN_UUID_16; + STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid); + } else { + p_uuid += (LEN_UUID_128 - LEN_UUID_32); + p_uuid_rec->len = LEN_UUID_32; + STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid); } - if (!is_base_uuid) - { - p_uuid_rec->len = LEN_UUID_128; - memcpy(p_uuid_rec->uu.uuid128, p_uuid, LEN_UUID_128); - } - *p_data += LEN_UUID_128; - break; + } + if (!is_base_uuid) { + p_uuid_rec->len = LEN_UUID_128; + memcpy(p_uuid_rec->uu.uuid128, p_uuid, LEN_UUID_128); + } + *p_data += LEN_UUID_128; + break; - /* do not allow 32 bits UUID in ATT PDU now */ - case LEN_UUID_32: - GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU"); - case 0: - default: - if (uuid_size != 0) ret = FALSE; - GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size"); - break; + /* do not allow 32 bits UUID in ATT PDU now */ + case LEN_UUID_32: + GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU"); + case 0: + default: + if (uuid_size != 0) { + ret = FALSE; + } + GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size"); + break; } - return( ret); + return ( ret); } /******************************************************************************* @@ -1175,8 +1096,7 @@ void gatt_start_rsp_timer(UINT16 clcb_idx) UINT32 timeout = GATT_WAIT_FOR_RSP_TOUT; p_clcb->rsp_timer_ent.param = (TIMER_PARAM_TYPE)p_clcb; if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && - p_clcb->op_subtype == GATT_DISC_SRVC_ALL) - { + p_clcb->op_subtype == GATT_DISC_SRVC_ALL) { timeout = GATT_WAIT_FOR_DISC_RSP_TOUT; } btu_start_timer (&p_clcb->rsp_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_RSP, @@ -1226,23 +1146,18 @@ void gatt_start_ind_ack_timer(tGATT_TCB *p_tcb) void gatt_rsp_timeout(TIMER_LIST_ENT *p_tle) { tGATT_CLCB *p_clcb = (tGATT_CLCB *)p_tle->param; - if (p_clcb == NULL || p_clcb->p_tcb == NULL) - { + if (p_clcb == NULL || p_clcb->p_tcb == NULL) { GATT_TRACE_WARNING("gatt_rsp_timeout clcb is already deleted"); return; } if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY && - p_clcb->op_subtype == GATT_DISC_SRVC_ALL && - p_clcb->retry_count < GATT_REQ_RETRY_LIMIT) - { + p_clcb->op_subtype == GATT_DISC_SRVC_ALL && + p_clcb->retry_count < GATT_REQ_RETRY_LIMIT) { UINT8 rsp_code; GATT_TRACE_WARNING("gatt_rsp_timeout retry discovery primary service"); - if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code)) - { + if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code)) { GATT_TRACE_ERROR("gatt_rsp_timeout command queue out of sync, disconnect"); - } - else - { + } else { p_clcb->retry_count++; gatt_act_discovery(p_clcb); return; @@ -1264,12 +1179,13 @@ void gatt_rsp_timeout(TIMER_LIST_ENT *p_tle) *******************************************************************************/ void gatt_ind_ack_timeout(TIMER_LIST_ENT *p_tle) { - tGATT_TCB * p_tcb = (tGATT_TCB *)p_tle->param; + tGATT_TCB *p_tcb = (tGATT_TCB *)p_tle->param; GATT_TRACE_WARNING("gatt_ind_ack_timeout send ack now"); - if (p_tcb != NULL) + if (p_tcb != NULL) { p_tcb->ind_count = 0; + } attp_send_cl_msg(((tGATT_TCB *)p_tle->param), 0, GATT_HANDLE_VALUE_CONF, NULL); } @@ -1286,12 +1202,10 @@ UINT8 gatt_sr_find_i_rcb_by_handle(UINT16 handle) { UINT8 i_rcb = 0; - for ( ; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++) - { + for ( ; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++) { if (gatt_cb.sr_reg[i_rcb].in_use && - gatt_cb.sr_reg[i_rcb].s_hdl <= handle && - gatt_cb.sr_reg[i_rcb].e_hdl >= handle ) - { + gatt_cb.sr_reg[i_rcb].s_hdl <= handle && + gatt_cb.sr_reg[i_rcb].e_hdl >= handle ) { break; } } @@ -1313,17 +1227,14 @@ UINT8 gatt_sr_find_i_rcb_by_app_id(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid tGATT_SR_REG *p_sreg; tBT_UUID *p_this_uuid; - for (i_rcb = 0, p_sreg = gatt_cb.sr_reg; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++, p_sreg++) - { - if ( p_sreg->in_use ) - { + for (i_rcb = 0, p_sreg = gatt_cb.sr_reg; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++, p_sreg++) { + if ( p_sreg->in_use ) { p_this_uuid = gatts_get_service_uuid (p_sreg->p_db); if (p_this_uuid && - gatt_uuid_compare (*p_app_uuid128, p_sreg->app_uuid ) && - gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) && - (svc_inst == p_sreg->service_instance)) - { + gatt_uuid_compare (*p_app_uuid128, p_sreg->app_uuid ) && + gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) && + (svc_inst == p_sreg->service_instance)) { GATT_TRACE_ERROR ("Active Service Found "); gatt_dbg_display_uuid(*p_svc_uuid); @@ -1348,22 +1259,20 @@ UINT8 gatt_sr_alloc_rcb(tGATT_HDL_LIST_ELEM *p_list ) tGATT_SR_REG *p_sreg = NULL; /*this is a new application servoce start */ - for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) - { - if (!p_sreg->in_use) - { + for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++) { + if (!p_sreg->in_use) { memset (p_sreg, 0, sizeof(tGATT_SR_REG)); p_sreg->in_use = TRUE; memcpy (&p_sreg->app_uuid, &p_list->asgn_range.app_uuid128, sizeof(tBT_UUID)); p_sreg->service_instance = p_list->asgn_range.svc_inst; - p_sreg->type = p_list->asgn_range.is_primary ? GATT_UUID_PRI_SERVICE: GATT_UUID_SEC_SERVICE; + p_sreg->type = p_list->asgn_range.is_primary ? GATT_UUID_PRI_SERVICE : GATT_UUID_SEC_SERVICE; p_sreg->s_hdl = p_list->asgn_range.s_handle; p_sreg->e_hdl = p_list->asgn_range.e_handle; p_sreg->p_db = &p_list->svc_db; - GATT_TRACE_DEBUG ("total GKI buffer in db [%d]",GKI_queue_length(&p_sreg->p_db->svc_buffer)); + GATT_TRACE_DEBUG ("total GKI buffer in db [%d]", GKI_queue_length(&p_sreg->p_db->svc_buffer)); break; } } @@ -1408,19 +1317,15 @@ void gatt_sr_send_req_callback(UINT16 conn_id, tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); - if (!p_reg ) - { + if (!p_reg ) { GATT_TRACE_ERROR ("p_reg not found discard request"); return; } if ( p_reg->in_use && - p_reg->app_cb.p_req_cb) - { + p_reg->app_cb.p_req_cb) { (*p_reg->app_cb.p_req_cb)(conn_id, trans_id, type, p_data); - } - else - { + } else { GATT_TRACE_WARNING("Call back not found for application conn_id=%d", conn_id); } @@ -1444,17 +1349,17 @@ tGATT_STATUS gatt_send_error_rsp (tGATT_TCB *p_tcb, UINT8 err_code, UINT8 op_cod error.cmd_code = op_code; error.reason = err_code; - error.handle =handle; + error.handle = handle; - if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_ERROR, (tGATT_SR_MSG *)&error)) != NULL) - { + if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_ERROR, (tGATT_SR_MSG *)&error)) != NULL) { status = attp_send_sr_msg (p_tcb, p_buf); - } - else + } else { status = GATT_INSUF_RESOURCE; + } - if (deq) + if (deq) { gatt_dequeue_sr_cmd(p_tcb); + } return status; } @@ -1477,36 +1382,36 @@ UINT32 gatt_add_sdp_record (tBT_UUID *p_uuid, UINT16 start_hdl, UINT16 end_hdl) UINT8 buff[60]; UINT8 *p = buff; - GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x s_hdl=0x%x",start_hdl, end_hdl); + GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x s_hdl=0x%x", start_hdl, end_hdl); - if ((sdp_handle = SDP_CreateRecord()) == 0) + if ((sdp_handle = SDP_CreateRecord()) == 0) { return 0; + } - switch (p_uuid->len) - { - case LEN_UUID_16: - SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16); - break; + switch (p_uuid->len) { + case LEN_UUID_16: + SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16); + break; - case LEN_UUID_32: - UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES); - UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32); - SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, - (UINT32) (p - buff), buff); - break; + case LEN_UUID_32: + UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES); + UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32); + SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, + (UINT32) (p - buff), buff); + break; - case LEN_UUID_128: - UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES); - ARRAY_TO_BE_STREAM_REVERSE (p, p_uuid->uu.uuid128, LEN_UUID_128); - SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, - (UINT32) (p - buff), buff); - break; + case LEN_UUID_128: + UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES); + ARRAY_TO_BE_STREAM_REVERSE (p, p_uuid->uu.uuid128, LEN_UUID_128); + SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, + (UINT32) (p - buff), buff); + break; - default: - GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len); - SDP_DeleteRecord(sdp_handle); - return 0; - break; + default: + GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len); + SDP_DeleteRecord(sdp_handle); + return 0; + break; } /*** Fill out the protocol element sequence for SDP ***/ @@ -1523,11 +1428,11 @@ UINT32 gatt_add_sdp_record (tBT_UUID *p_uuid, UINT16 start_hdl, UINT16 end_hdl) /* Make the service browseable */ SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &list); - return(sdp_handle); + return (sdp_handle); } - #if GATT_CONFORMANCE_TESTING == TRUE +#if GATT_CONFORMANCE_TESTING == TRUE /******************************************************************************* ** ** Function gatt_set_err_rsp @@ -1544,7 +1449,7 @@ void gatt_set_err_rsp(BOOLEAN enable, UINT8 req_op_code, UINT8 err_status) gatt_cb.req_op_code = req_op_code; gatt_cb.err_status = err_status; } - #endif +#endif @@ -1592,12 +1497,10 @@ tGATT_REG *gatt_get_regcb (tGATT_IF gatt_if) BOOLEAN gatt_is_clcb_allocated (UINT16 conn_id) { UINT8 i = 0; - BOOLEAN is_allocated= FALSE; + BOOLEAN is_allocated = FALSE; - for (i = 0; i < GATT_CL_MAX_LCB; i++) - { - if (gatt_cb.clcb[i].in_use && (gatt_cb.clcb[i].conn_id == conn_id)) - { + for (i = 0; i < GATT_CL_MAX_LCB; i++) { + if (gatt_cb.clcb[i].in_use && (gatt_cb.clcb[i].conn_id == conn_id)) { is_allocated = TRUE; break; } @@ -1619,15 +1522,13 @@ tGATT_CLCB *gatt_clcb_alloc (UINT16 conn_id) { UINT8 i = 0; tGATT_CLCB *p_clcb = NULL; - tGATT_IF gatt_if=GATT_GET_GATT_IF(conn_id); + tGATT_IF gatt_if = GATT_GET_GATT_IF(conn_id); UINT8 tcb_idx = GATT_GET_TCB_IDX(conn_id); tGATT_TCB *p_tcb = gatt_get_tcb_by_idx(tcb_idx); tGATT_REG *p_reg = gatt_get_regcb(gatt_if); - for (i = 0; i < GATT_CL_MAX_LCB; i++) - { - if (!gatt_cb.clcb[i].in_use) - { + for (i = 0; i < GATT_CL_MAX_LCB; i++) { + if (!gatt_cb.clcb[i].in_use) { p_clcb = &gatt_cb.clcb[i]; p_clcb->in_use = TRUE; @@ -1652,8 +1553,7 @@ tGATT_CLCB *gatt_clcb_alloc (UINT16 conn_id) *******************************************************************************/ void gatt_clcb_dealloc (tGATT_CLCB *p_clcb) { - if (p_clcb && p_clcb->in_use) - { + if (p_clcb && p_clcb->in_use) { memset(p_clcb, 0, sizeof(tGATT_CLCB)); } } @@ -1670,15 +1570,13 @@ void gatt_clcb_dealloc (tGATT_CLCB *p_clcb) ** Returns NULL if not found. Otherwise pointer to the rcb. ** *******************************************************************************/ -tGATT_TCB * gatt_find_tcb_by_cid (UINT16 lcid) +tGATT_TCB *gatt_find_tcb_by_cid (UINT16 lcid) { UINT16 xx = 0; tGATT_TCB *p_tcb = NULL; - for (xx = 0; xx < GATT_MAX_PHY_CHANNEL; xx++) - { - if (gatt_cb.tcb[xx].in_use && gatt_cb.tcb[xx].att_lcid == lcid) - { + for (xx = 0; xx < GATT_MAX_PHY_CHANNEL; xx++) { + if (gatt_cb.tcb[xx].in_use && gatt_cb.tcb[xx].att_lcid == lcid) { p_tcb = &gatt_cb.tcb[xx]; break; } @@ -1700,10 +1598,10 @@ UINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb) { UINT8 i, num = 0; - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_tcb->app_hold_link[i]) + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_tcb->app_hold_link[i]) { num ++; + } } GATT_TRACE_DEBUG("gatt_num_apps_hold_link num=%d", num); @@ -1724,10 +1622,10 @@ UINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda) { UINT8 i, num = 0; - for (i = 0; i < GATT_CL_MAX_LCB; i ++) - { - if (gatt_cb.clcb[i].in_use && memcmp(gatt_cb.clcb[i].p_tcb->peer_bda, bda, BD_ADDR_LEN) == 0) + for (i = 0; i < GATT_CL_MAX_LCB; i ++) { + if (gatt_cb.clcb[i].in_use && memcmp(gatt_cb.clcb[i].p_tcb->peer_bda, bda, BD_ADDR_LEN) == 0) { num ++; + } } return num; } @@ -1745,13 +1643,10 @@ void gatt_sr_copy_prep_cnt_to_cback_cnt(tGATT_TCB *p_tcb ) { UINT8 i; - if (p_tcb) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_tcb->prep_cnt[i]) - { - p_tcb->sr_cmd.cback_cnt[i]=1; + if (p_tcb) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_tcb->prep_cnt[i]) { + p_tcb->sr_cmd.cback_cnt[i] = 1; } } } @@ -1772,19 +1667,14 @@ BOOLEAN gatt_sr_is_cback_cnt_zero(tGATT_TCB *p_tcb ) BOOLEAN status = TRUE; UINT8 i; - if (p_tcb) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_tcb->sr_cmd.cback_cnt[i]) - { + if (p_tcb) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_tcb->sr_cmd.cback_cnt[i]) { status = FALSE; break; } } - } - else - { + } else { status = FALSE; } return status; @@ -1804,19 +1694,14 @@ BOOLEAN gatt_sr_is_prep_cnt_zero(tGATT_TCB *p_tcb) BOOLEAN status = TRUE; UINT8 i; - if (p_tcb) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_tcb->prep_cnt[i]) - { + if (p_tcb) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_tcb->prep_cnt[i]) { status = FALSE; break; } } - } - else - { + } else { status = FALSE; } return status; @@ -1836,11 +1721,9 @@ void gatt_sr_reset_cback_cnt(tGATT_TCB *p_tcb ) { UINT8 i; - if (p_tcb) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - p_tcb->sr_cmd.cback_cnt[i]=0; + if (p_tcb) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + p_tcb->sr_cmd.cback_cnt[i] = 0; } } } @@ -1857,11 +1740,9 @@ void gatt_sr_reset_cback_cnt(tGATT_TCB *p_tcb ) void gatt_sr_reset_prep_cnt(tGATT_TCB *p_tcb ) { UINT8 i; - if (p_tcb) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - p_tcb->prep_cnt[i]=0; + if (p_tcb) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + p_tcb->prep_cnt[i] = 0; } } } @@ -1881,20 +1762,14 @@ void gatt_sr_update_cback_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc UINT8 idx = ((UINT8) gatt_if) - 1 ; - if (p_tcb) - { - if (is_reset_first) - { + if (p_tcb) { + if (is_reset_first) { gatt_sr_reset_cback_cnt(p_tcb); } - if (is_inc) - { + if (is_inc) { p_tcb->sr_cmd.cback_cnt[idx]++; - } - else - { - if ( p_tcb->sr_cmd.cback_cnt[idx]) - { + } else { + if ( p_tcb->sr_cmd.cback_cnt[idx]) { p_tcb->sr_cmd.cback_cnt[idx]--; } } @@ -1916,22 +1791,16 @@ void gatt_sr_update_prep_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, UINT8 idx = ((UINT8) gatt_if) - 1 ; GATT_TRACE_DEBUG("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d", - p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first); + p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first); - if (p_tcb) - { - if (is_reset_first) - { + if (p_tcb) { + if (is_reset_first) { gatt_sr_reset_prep_cnt(p_tcb); } - if (is_inc) - { + if (is_inc) { p_tcb->prep_cnt[idx]++; - } - else - { - if (p_tcb->prep_cnt[idx]) - { + } else { + if (p_tcb->prep_cnt[idx]) { p_tcb->prep_cnt[idx]--; } } @@ -1948,23 +1817,18 @@ void gatt_sr_update_prep_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, *******************************************************************************/ BOOLEAN gatt_cancel_open(tGATT_IF gatt_if, BD_ADDR bda) { - tGATT_TCB *p_tcb=NULL; - BOOLEAN status= TRUE; + tGATT_TCB *p_tcb = NULL; + BOOLEAN status = TRUE; p_tcb = gatt_find_tcb_by_addr(bda, BT_TRANSPORT_LE); - if (p_tcb) - { - if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) - { + if (p_tcb) { + if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) { GATT_TRACE_ERROR("GATT_CancelConnect - link connected Too late to cancel"); status = FALSE; - } - else - { + } else { gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); - if (!gatt_num_apps_hold_link(p_tcb)) - { + if (!gatt_num_apps_hold_link(p_tcb)) { gatt_disconnect(p_tcb); } } @@ -1985,12 +1849,10 @@ BOOLEAN gatt_cancel_open(tGATT_IF gatt_if, BD_ADDR bda) BOOLEAN gatt_find_app_hold_link(tGATT_TCB *p_tcb, UINT8 start_idx, UINT8 *p_found_idx, tGATT_IF *p_gatt_if) { UINT8 i; - BOOLEAN found= FALSE; + BOOLEAN found = FALSE; - for (i = start_idx; i < GATT_MAX_APPS; i ++) - { - if (p_tcb->app_hold_link[i]) - { + for (i = start_idx; i < GATT_MAX_APPS; i ++) { + if (p_tcb->app_hold_link[i]) { *p_gatt_if = gatt_cb.clcb[i].p_reg->gatt_if; *p_found_idx = i; found = TRUE; @@ -2018,8 +1880,7 @@ BOOLEAN gatt_cmd_enq(tGATT_TCB *p_tcb, UINT16 clcb_idx, BOOLEAN to_send, UINT8 o p_cmd->p_cmd = p_buf; p_cmd->clcb_idx = clcb_idx; - if (!to_send) - { + if (!to_send) { p_tcb->pending_cl_req = p_tcb->next_slot_inq; } @@ -2038,13 +1899,12 @@ BOOLEAN gatt_cmd_enq(tGATT_TCB *p_tcb, UINT16 clcb_idx, BOOLEAN to_send, UINT8 o ** Returns total number of clcb found. ** *******************************************************************************/ -tGATT_CLCB * gatt_cmd_dequeue(tGATT_TCB *p_tcb, UINT8 *p_op_code) +tGATT_CLCB *gatt_cmd_dequeue(tGATT_TCB *p_tcb, UINT8 *p_op_code) { tGATT_CMD_Q *p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req]; tGATT_CLCB *p_clcb = NULL; - if (p_tcb->pending_cl_req != p_tcb->next_slot_inq) - { + if (p_tcb->pending_cl_req != p_tcb->next_slot_inq) { p_clcb = &gatt_cb.clcb[p_cmd->clcb_idx]; *p_op_code = p_cmd->op_code; @@ -2118,55 +1978,48 @@ void gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data) { tGATT_CL_COMPLETE cb_data; tGATT_CMPL_CBACK *p_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_cmpl_cb : NULL; - UINT8 op = p_clcb->operation, disc_type=GATT_DISC_MAX; + UINT8 op = p_clcb->operation, disc_type = GATT_DISC_MAX; tGATT_DISC_CMPL_CB *p_disc_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_disc_cmpl_cb : NULL; UINT16 conn_id; UINT8 operation; GATT_TRACE_DEBUG ("gatt_end_operation status=%d op=%d subtype=%d", - status, p_clcb->operation, p_clcb->op_subtype); + status, p_clcb->operation, p_clcb->op_subtype); memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE)); - if (p_cmpl_cb != NULL && p_clcb->operation != 0) - { - if (p_clcb->operation == GATTC_OPTYPE_READ) - { + if (p_cmpl_cb != NULL && p_clcb->operation != 0) { + if (p_clcb->operation == GATTC_OPTYPE_READ) { cb_data.att_value.handle = p_clcb->s_handle; cb_data.att_value.len = p_clcb->counter; - if (p_data && p_clcb->counter) + if (p_data && p_clcb->counter) { memcpy (cb_data.att_value.value, p_data, cb_data.att_value.len); + } } - if (p_clcb->operation == GATTC_OPTYPE_WRITE) - { + if (p_clcb->operation == GATTC_OPTYPE_WRITE) { memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE)); cb_data.handle = - cb_data.att_value.handle = p_clcb->s_handle; - if (p_clcb->op_subtype == GATT_WRITE_PREPARE) - { - if (p_data) - { + cb_data.att_value.handle = p_clcb->s_handle; + if (p_clcb->op_subtype == GATT_WRITE_PREPARE) { + if (p_data) { cb_data.att_value = *((tGATT_VALUE *) p_data); - } - else - { + } else { GATT_TRACE_DEBUG("Rcv Prepare write rsp but no data"); } } } - if (p_clcb->operation == GATTC_OPTYPE_CONFIG) + if (p_clcb->operation == GATTC_OPTYPE_CONFIG) { cb_data.mtu = p_clcb->p_tcb->payload_size; + } - if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) - { + if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY) { disc_type = p_clcb->op_subtype; } } - if (p_clcb->p_attr_buf) - { + if (p_clcb->p_attr_buf) { GKI_freebuf(p_clcb->p_attr_buf); } @@ -2176,13 +2029,13 @@ void gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data) gatt_clcb_dealloc(p_clcb); - if (p_disc_cmpl_cb && (op == GATTC_OPTYPE_DISCOVERY)) + if (p_disc_cmpl_cb && (op == GATTC_OPTYPE_DISCOVERY)) { (*p_disc_cmpl_cb)(conn_id, disc_type, status); - else if (p_cmpl_cb && op) + } else if (p_cmpl_cb && op) { (*p_cmpl_cb)(conn_id, op, status, &cb_data); - else + } else GATT_TRACE_WARNING ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p", - operation, p_disc_cmpl_cb, p_cmpl_cb); + operation, p_disc_cmpl_cb, p_cmpl_cb); } /******************************************************************************* @@ -2201,24 +2054,22 @@ void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport) tGATT_CLCB *p_clcb; UINT8 i; UINT16 conn_id; - tGATT_REG *p_reg=NULL; + tGATT_REG *p_reg = NULL; GATT_TRACE_DEBUG ("gatt_cleanup_upon_disc "); - if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL) - { + if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL) { GATT_TRACE_DEBUG ("found p_tcb "); gatt_set_ch_state(p_tcb, GATT_CH_CLOSE); - for (i = 0; i < GATT_CL_MAX_LCB; i ++) - { + for (i = 0; i < GATT_CL_MAX_LCB; i ++) { p_clcb = &gatt_cb.clcb[i]; - if (p_clcb->in_use && p_clcb->p_tcb == p_tcb) - { + if (p_clcb->in_use && p_clcb->p_tcb == p_tcb) { btu_stop_timer(&p_clcb->rsp_timer_ent); GATT_TRACE_DEBUG ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx); - if (p_clcb->operation != GATTC_OPTYPE_NONE) + if (p_clcb->operation != GATTC_OPTYPE_NONE) { gatt_end_operation(p_clcb, GATT_ERROR, NULL); + } gatt_clcb_dealloc(p_clcb); @@ -2230,11 +2081,9 @@ void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport) gatt_free_pending_ind(p_tcb); gatt_free_pending_enc_queue(p_tcb); - for (i = 0; i < GATT_MAX_APPS; i ++) - { + for (i = 0; i < GATT_MAX_APPS; i ++) { p_reg = &gatt_cb.cl_rcb[i]; - if (p_reg->in_use && p_reg->app_cb.p_conn_cb) - { + if (p_reg->in_use && p_reg->app_cb.p_conn_cb) { conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if); GATT_TRACE_DEBUG ("found p_reg tcb_idx=%d gatt_if=%d conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id); (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, bda, conn_id, FALSE, reason, transport); @@ -2254,25 +2103,24 @@ void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport) ** Returns UINT8 *: name of the operation. ** *******************************************************************************/ -UINT8 * gatt_dbg_op_name(UINT8 op_code) +UINT8 *gatt_dbg_op_name(UINT8 op_code) { UINT8 pseduo_op_code_idx = op_code & (~GATT_WRITE_CMD_MASK); - if (op_code == GATT_CMD_WRITE ) - { + if (op_code == GATT_CMD_WRITE ) { pseduo_op_code_idx = 0x14; /* just an index to op_code_name */ } - if (op_code == GATT_SIGN_CMD_WRITE) - { + if (op_code == GATT_SIGN_CMD_WRITE) { pseduo_op_code_idx = 0x15; /* just an index to op_code_name */ } - if (pseduo_op_code_idx <= GATT_OP_CODE_MAX) - return(UINT8*) op_code_name[pseduo_op_code_idx]; - else - return(UINT8 *)"Op Code Exceed Max"; + if (pseduo_op_code_idx <= GATT_OP_CODE_MAX) { + return (UINT8 *) op_code_name[pseduo_op_code_idx]; + } else { + return (UINT8 *)"Op Code Exceed Max"; + } } /******************************************************************************* @@ -2289,16 +2137,11 @@ void gatt_dbg_display_uuid(tBT_UUID bt_uuid) char str_buf[50]; int x = 0; - if (bt_uuid.len == LEN_UUID_16) - { + if (bt_uuid.len == LEN_UUID_16) { sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16); - } - else if (bt_uuid.len == LEN_UUID_32) - { + } else if (bt_uuid.len == LEN_UUID_32) { sprintf(str_buf, "0x%08x", (unsigned int)bt_uuid.uu.uuid32); - } - else if (bt_uuid.len == LEN_UUID_128) - { + } else if (bt_uuid.len == LEN_UUID_128) { x += sprintf(&str_buf[x], "0x%02x%02x%02x%02x%02x%02x%02x%02x", bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14], bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12], @@ -2309,9 +2152,9 @@ void gatt_dbg_display_uuid(tBT_UUID bt_uuid) bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4], bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]); - } - else + } else { BCM_STRNCPY_S(str_buf, sizeof(str_buf), "Unknown UUID 0", 15); + } GATT_TRACE_DEBUG ("UUID=[%s]", str_buf); @@ -2331,10 +2174,8 @@ BOOLEAN gatt_is_bg_dev_for_app(tGATT_BG_CONN_DEV *p_dev, tGATT_IF gatt_if) { UINT8 i; - for (i = 0; i < GATT_MAX_APPS; i ++ ) - { - if (p_dev->in_use && (p_dev->gatt_if[i] == gatt_if)) - { + for (i = 0; i < GATT_MAX_APPS; i ++ ) { + if (p_dev->in_use && (p_dev->gatt_if[i] == gatt_if)) { return TRUE; } } @@ -2349,15 +2190,13 @@ BOOLEAN gatt_is_bg_dev_for_app(tGATT_BG_CONN_DEV *p_dev, tGATT_IF gatt_if) ** Returns pointer to the device record ** *******************************************************************************/ -tGATT_BG_CONN_DEV * gatt_find_bg_dev(BD_ADDR remote_bda) +tGATT_BG_CONN_DEV *gatt_find_bg_dev(BD_ADDR remote_bda) { tGATT_BG_CONN_DEV *p_dev_list = &gatt_cb.bgconn_dev[0]; UINT8 i; - for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) - { - if (p_dev_list->in_use && !memcmp(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN)) - { + for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) { + if (p_dev_list->in_use && !memcmp(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN)) { return p_dev_list; } } @@ -2372,15 +2211,13 @@ tGATT_BG_CONN_DEV * gatt_find_bg_dev(BD_ADDR remote_bda) ** Returns pointer to the device record ** *******************************************************************************/ -tGATT_BG_CONN_DEV * gatt_alloc_bg_dev(BD_ADDR remote_bda) +tGATT_BG_CONN_DEV *gatt_alloc_bg_dev(BD_ADDR remote_bda) { tGATT_BG_CONN_DEV *p_dev_list = &gatt_cb.bgconn_dev[0]; UINT8 i; - for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) - { - if (!p_dev_list->in_use) - { + for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++) { + if (!p_dev_list->in_use) { p_dev_list->in_use = TRUE; memcpy(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN); @@ -2406,58 +2243,47 @@ BOOLEAN gatt_add_bg_dev_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN is_init UINT8 i; BOOLEAN ret = FALSE; - if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) - { + if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) { p_dev = gatt_alloc_bg_dev(bd_addr); } - if (p_dev) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (is_initator) - { - if (p_dev->gatt_if[i] == gatt_if) - { + if (p_dev) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (is_initator) { + if (p_dev->gatt_if[i] == gatt_if) { GATT_TRACE_ERROR("device already in iniator white list"); return TRUE; - } - else if (p_dev->gatt_if[i] == 0) - { + } else if (p_dev->gatt_if[i] == 0) { p_dev->gatt_if[i] = gatt_if; - if (i == 0) + if (i == 0) { ret = BTM_BleUpdateBgConnDev(TRUE, bd_addr); - else + } else { ret = TRUE; + } break; } - } - else - { - if (p_dev->listen_gif[i] == gatt_if) - { + } else { + if (p_dev->listen_gif[i] == gatt_if) { GATT_TRACE_ERROR("device already in adv white list"); return TRUE; - } - else if (p_dev->listen_gif[i] == 0) - { - if (p_reg->listening == GATT_LISTEN_TO_ALL) + } else if (p_dev->listen_gif[i] == 0) { + if (p_reg->listening == GATT_LISTEN_TO_ALL) { p_reg->listening = GATT_LISTEN_TO_NONE; + } p_reg->listening ++; p_dev->listen_gif[i] = gatt_if; - if (i == 0) + if (i == 0) { ret = BTM_BleUpdateAdvWhitelist(TRUE, bd_addr); - else + } else { ret = TRUE; + } break; } } } - } - else - { + } else { GATT_TRACE_ERROR("no device record available"); } @@ -2478,8 +2304,9 @@ BOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr) tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE); BOOLEAN status; - if (p_tcb) + if (p_tcb) { gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE); + } status = gatt_update_auto_connect_dev(gatt_if, FALSE, bd_addr, TRUE); return status; } @@ -2500,12 +2327,11 @@ UINT8 gatt_get_num_apps_for_bg_dev(BD_ADDR bd_addr) UINT8 i; UINT8 cnt = 0; - if ((p_dev = gatt_find_bg_dev(bd_addr)) != NULL) - { - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_dev->gatt_if[i]) + if ((p_dev = gatt_find_bg_dev(bd_addr)) != NULL) { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_dev->gatt_if[i]) { cnt++; + } } } return cnt; @@ -2526,15 +2352,12 @@ BOOLEAN gatt_find_app_for_bg_dev(BD_ADDR bd_addr, tGATT_IF *p_gatt_if) UINT8 i; BOOLEAN ret = FALSE; - if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) - { + if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) { return ret; } - for (i = 0; i < GATT_MAX_APPS; i ++) - { - if (p_dev->gatt_if[i] != 0 ) - { + for (i = 0; i < GATT_MAX_APPS; i ++) { + if (p_dev->gatt_if[i] != 0 ) { *p_gatt_if = p_dev->gatt_if[i]; ret = TRUE; break; @@ -2561,51 +2384,47 @@ BOOLEAN gatt_remove_bg_dev_from_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN UINT8 i, j; BOOLEAN ret = FALSE; - if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) - { + if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL) { return ret; } - for (i = 0; i < GATT_MAX_APPS && (p_dev->gatt_if[i] > 0 || p_dev->listen_gif[i]); i ++) - { - if (is_initiator) - { - if (p_dev->gatt_if[i] == gatt_if) - { + for (i = 0; i < GATT_MAX_APPS && (p_dev->gatt_if[i] > 0 || p_dev->listen_gif[i]); i ++) { + if (is_initiator) { + if (p_dev->gatt_if[i] == gatt_if) { p_dev->gatt_if[i] = 0; /* move all element behind one forward */ - for (j = i + 1; j < GATT_MAX_APPS; j ++) + for (j = i + 1; j < GATT_MAX_APPS; j ++) { p_dev->gatt_if[j - 1] = p_dev->gatt_if[j]; + } - if (p_dev->gatt_if[0] == 0) + if (p_dev->gatt_if[0] == 0) { ret = BTM_BleUpdateBgConnDev(FALSE, p_dev->remote_bda); - else + } else { ret = TRUE; + } break; } - } - else - { - if (p_dev->listen_gif[i] == gatt_if) - { + } else { + if (p_dev->listen_gif[i] == gatt_if) { p_dev->listen_gif[i] = 0; p_reg->listening --; /* move all element behind one forward */ - for (j = i + 1; j < GATT_MAX_APPS; j ++) + for (j = i + 1; j < GATT_MAX_APPS; j ++) { p_dev->listen_gif[j - 1] = p_dev->listen_gif[j]; + } - if (p_dev->listen_gif[0] == 0) + if (p_dev->listen_gif[0] == 0) { ret = BTM_BleUpdateAdvWhitelist(FALSE, p_dev->remote_bda); - else + } else { ret = TRUE; + } break; } } } - if (i != GATT_MAX_APPS && p_dev->gatt_if[0] == 0 && p_dev->listen_gif[0] == 0) - { + if (i != GATT_MAX_APPS && p_dev->gatt_if[0] == 0 && p_dev->listen_gif[0] == 0) { memset(p_dev, 0, sizeof(tGATT_BG_CONN_DEV)); } @@ -2627,37 +2446,38 @@ void gatt_deregister_bgdev_list(tGATT_IF gatt_if) tGATT_REG *p_reg = gatt_get_regcb(gatt_if); /* update the BG conn device list */ - for (i = 0 ; i in_use) - { - for (j = 0; j < GATT_MAX_APPS; j ++) - { - if (p_dev_list->gatt_if[j] == 0 && p_dev_list->listen_gif[j] == 0) + for (i = 0 ; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++ ) { + if (p_dev_list->in_use) { + for (j = 0; j < GATT_MAX_APPS; j ++) { + if (p_dev_list->gatt_if[j] == 0 && p_dev_list->listen_gif[j] == 0) { break; - - if (p_dev_list->gatt_if[j] == gatt_if) - { - for (k = j + 1; k < GATT_MAX_APPS; k ++) - p_dev_list->gatt_if[k - 1] = p_dev_list->gatt_if[k]; - - if (p_dev_list->gatt_if[0] == 0) - BTM_BleUpdateBgConnDev(FALSE, p_dev_list->remote_bda); } - if (p_dev_list->listen_gif[j] == gatt_if) - { + if (p_dev_list->gatt_if[j] == gatt_if) { + for (k = j + 1; k < GATT_MAX_APPS; k ++) { + p_dev_list->gatt_if[k - 1] = p_dev_list->gatt_if[k]; + } + + if (p_dev_list->gatt_if[0] == 0) { + BTM_BleUpdateBgConnDev(FALSE, p_dev_list->remote_bda); + } + } + + if (p_dev_list->listen_gif[j] == gatt_if) { p_dev_list->listen_gif[j] = 0; - if (p_reg != NULL && p_reg->listening > 0) + if (p_reg != NULL && p_reg->listening > 0) { p_reg->listening --; + } /* move all element behind one forward */ - for (k = j + 1; k < GATT_MAX_APPS; k ++) + for (k = j + 1; k < GATT_MAX_APPS; k ++) { p_dev_list->listen_gif[k - 1] = p_dev_list->listen_gif[k]; + } - if (p_dev_list->listen_gif[0] == 0) + if (p_dev_list->listen_gif[0] == 0) { BTM_BleUpdateAdvWhitelist(FALSE, p_dev_list->remote_bda); + } } } } @@ -2701,24 +2521,19 @@ BOOLEAN gatt_update_auto_connect_dev (tGATT_IF gatt_if, BOOLEAN add, BD_ADDR bd_ GATT_TRACE_API ("gatt_update_auto_connect_dev "); /* Make sure app is registered */ - if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) - { - GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if); - return(FALSE); + if ((p_reg = gatt_get_regcb(gatt_if)) == NULL) { + GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if %d is not registered", gatt_if); + return (FALSE); } - if (add) - { + if (add) { ret = gatt_add_bg_dev_list(p_reg, bd_addr, is_initator); - if (ret && p_tcb != NULL) - { + if (ret && p_tcb != NULL) { /* if a connected device, update the link holding number */ gatt_update_app_use_link_flag(gatt_if, p_tcb, TRUE, TRUE); } - } - else - { + } else { ret = gatt_remove_bg_dev_from_list(p_reg, bd_addr, is_initator); } return ret; @@ -2735,13 +2550,12 @@ BOOLEAN gatt_update_auto_connect_dev (tGATT_IF gatt_if, BOOLEAN add, BD_ADDR bd_ ** Returns Pointer to the new service start buffer, NULL no buffer available ** *******************************************************************************/ -tGATT_PENDING_ENC_CLCB* gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb ) +tGATT_PENDING_ENC_CLCB *gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb ) { tGATT_PENDING_ENC_CLCB *p_buf; GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start"); - if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL) - { + if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL) { GATT_TRACE_DEBUG ("enqueue a new pending encryption channel clcb"); p_buf->p_clcb = p_clcb; GKI_enqueue (&p_tcb->pending_enc_clcb, p_buf); @@ -2765,32 +2579,28 @@ BOOLEAN gatt_update_listen_mode(void) UINT16 connectability, window, interval; BOOLEAN rt = TRUE; - for (; ii < GATT_MAX_APPS; ii ++, p_reg ++) - { - if ( p_reg->in_use && p_reg->listening > listening) - { + for (; ii < GATT_MAX_APPS; ii ++, p_reg ++) { + if ( p_reg->in_use && p_reg->listening > listening) { listening = p_reg->listening; } } if (listening == GATT_LISTEN_TO_ALL || - listening == GATT_LISTEN_TO_NONE) + listening == GATT_LISTEN_TO_NONE) { BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_ALL); - else + } else { BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_WL); + } - if (rt) - { + if (rt) { connectability = BTM_ReadConnectability (&window, &interval); - if (listening != GATT_LISTEN_TO_NONE) - { + if (listening != GATT_LISTEN_TO_NONE) { connectability |= BTM_BLE_CONNECTABLE; - } - else - { - if ((connectability & BTM_BLE_CONNECTABLE) == 0) - connectability &= ~BTM_BLE_CONNECTABLE; + } else { + if ((connectability & BTM_BLE_CONNECTABLE) == 0) { + connectability &= ~BTM_BLE_CONNECTABLE; + } } /* turning on the adv now */ btm_ble_set_connectability(connectability); diff --git a/components/bt/bluedroid/stack/gatt/include/gatt_int.h b/components/bt/bluedroid/stack/gatt/include/gatt_int.h old mode 100755 new mode 100644 index a1fbb9d02..1ac8431b3 --- a/components/bt/bluedroid/stack/gatt/include/gatt_int.h +++ b/components/bt/bluedroid/stack/gatt/include/gatt_int.h @@ -100,8 +100,7 @@ typedef UINT8 tGATT_SEC_FLAG; #define GATT_INFO_TYPE_PAIR_128 0x02 /* GATT client FIND_TYPE_VALUE_Request data */ -typedef struct -{ +typedef struct { tBT_UUID uuid; /* type of attribute to be found */ UINT16 s_handle; /* starting handle */ UINT16 e_handle; /* ending handle */ @@ -111,35 +110,32 @@ typedef struct /* client request message to ATT protocol */ -typedef union -{ +typedef union { tGATT_READ_BY_TYPE browse; /* read by type request */ tGATT_FIND_TYPE_VALUE find_type_value;/* find by type value */ tGATT_READ_MULTI read_multi; /* read multiple request */ tGATT_READ_PARTIAL read_blob; /* read blob */ tGATT_VALUE attr_value; /* write request */ - /* prepare write */ + /* prepare write */ /* write blob */ UINT16 handle; /* read, handle value confirmation */ UINT16 mtu; tGATT_EXEC_FLAG exec_write; /* execute write */ -}tGATT_CL_MSG; +} tGATT_CL_MSG; /* error response strucutre */ -typedef struct -{ +typedef struct { UINT16 handle; UINT8 cmd_code; UINT8 reason; -}tGATT_ERROR; +} tGATT_ERROR; /* server response message to ATT protocol */ -typedef union -{ +typedef union { /* data type member event */ tGATT_VALUE attr_value; /* READ, HANDLE_VALUE_IND, PREPARE_WRITE */ - /* READ_BLOB, READ_BY_TYPE */ + /* READ_BLOB, READ_BY_TYPE */ tGATT_ERROR error; /* ERROR_RSP */ UINT16 handle; /* WRITE, WRITE_BLOB */ UINT16 mtu; /* exchange MTU request */ @@ -147,16 +143,14 @@ typedef union /* Characteristic declaration attribute value */ -typedef struct -{ +typedef struct { tGATT_CHAR_PROP property; UINT16 char_val_handle; } tGATT_CHAR_DECL; /* attribute value maintained in the server database */ -typedef union -{ +typedef union { tBT_UUID uuid; /* service declaration */ tGATT_CHAR_DECL char_decl; /* characteristic declaration */ tGATT_INCL_SRVC incl_handle; /* included service */ @@ -172,8 +166,7 @@ typedef UINT8 tGATT_ATTR_UUID_TYPE; /* 16 bits UUID Attribute in server database */ -typedef struct -{ +typedef struct { void *p_next; /* pointer to the next attribute, either tGATT_ATTR16 or tGATT_ATTR128 */ tGATT_ATTR_VALUE *p_value; @@ -185,8 +178,7 @@ typedef struct /* 32 bits UUID Attribute in server database */ -typedef struct -{ +typedef struct { void *p_next; /* pointer to the next attribute, either tGATT_ATTR16, tGATT_ATTR32 or tGATT_ATTR128 */ tGATT_ATTR_VALUE *p_value; @@ -199,8 +191,7 @@ typedef struct /* 128 bits UUID Attribute in server database */ -typedef struct -{ +typedef struct { void *p_next; /* pointer to the next attribute, either tGATT_ATTR16 or tGATT_ATTR128 */ tGATT_ATTR_VALUE *p_value; @@ -212,8 +203,7 @@ typedef struct /* Service Database definition */ -typedef struct -{ +typedef struct { void *p_attr_list; /* pointer to the first attribute, either tGATT_ATTR16 or tGATT_ATTR128 */ UINT8 *p_free_mem; /* Pointer to free memory */ @@ -227,8 +217,7 @@ typedef struct /* A GATT registration record consists of a handle, and 1 or more attributes */ /* A service registration information record consists of beginning and ending */ /* attribute handle, service UUID and a set of GATT server callback. */ -typedef struct -{ +typedef struct { tGATT_SVC_DB *p_db; /* pointer to the service database */ tBT_UUID app_uuid; /* applicatino UUID */ UINT32 sdp_handle; /* primamry service SDP handle */ @@ -248,8 +237,7 @@ typedef struct /* A service registration information record consists of beginning and ending */ /* attribute handle, service UUID and a set of GATT server callback. */ -typedef struct -{ +typedef struct { tBT_UUID app_uuid128; tGATT_CBACK app_cb; tGATT_IF gatt_if; /* one based */ @@ -261,13 +249,12 @@ typedef struct /* command queue for each connection */ -typedef struct -{ +typedef struct { BT_HDR *p_cmd; UINT16 clcb_idx; UINT8 op_code; BOOLEAN to_send; -}tGATT_CMD_Q; +} tGATT_CMD_Q; #if GATT_MAX_SR_PROFILES <= 8 @@ -279,8 +266,7 @@ typedef UINT32 tGATT_APP_MASK; #endif /* command details for each connection */ -typedef struct -{ +typedef struct { BT_HDR *p_rsp_msg; UINT32 trans_id; tGATT_READ_MULTI multi_req; @@ -303,51 +289,45 @@ typedef UINT8 tGATT_CH_STATE; #define GATT_GAP_START_HANDLE 20 #define GATT_APP_START_HANDLE 40 -typedef struct hdl_cfg -{ +typedef struct hdl_cfg { UINT16 gatt_start_hdl; UINT16 gap_start_hdl; UINT16 app_start_hdl; -}tGATT_HDL_CFG; +} tGATT_HDL_CFG; -typedef struct hdl_list_elem -{ +typedef struct hdl_list_elem { struct hdl_list_elem *p_next; struct hdl_list_elem *p_prev; tGATTS_HNDL_RANGE asgn_range; /* assigned handle range */ tGATT_SVC_DB svc_db; BOOLEAN in_use; -}tGATT_HDL_LIST_ELEM; +} tGATT_HDL_LIST_ELEM; -typedef struct -{ +typedef struct { tGATT_HDL_LIST_ELEM *p_first; tGATT_HDL_LIST_ELEM *p_last; UINT16 count; -}tGATT_HDL_LIST_INFO; +} tGATT_HDL_LIST_INFO; -typedef struct srv_list_elem -{ +typedef struct srv_list_elem { struct srv_list_elem *p_next; struct srv_list_elem *p_prev; UINT16 s_hdl; UINT8 i_sreg; BOOLEAN in_use; BOOLEAN is_primary; -}tGATT_SRV_LIST_ELEM; +} tGATT_SRV_LIST_ELEM; -typedef struct -{ +typedef struct { tGATT_SRV_LIST_ELEM *p_last_primary; tGATT_SRV_LIST_ELEM *p_first; tGATT_SRV_LIST_ELEM *p_last; UINT16 count; -}tGATT_SRV_LIST_INFO; +} tGATT_SRV_LIST_INFO; -typedef struct -{ +typedef struct { BUFFER_Q pending_enc_clcb; /* pending encryption channel q */ tGATT_SEC_ACTION sec_act; BD_ADDR peer_bda; @@ -384,14 +364,12 @@ typedef struct /* logic channel */ -typedef struct -{ +typedef struct { UINT16 next_disc_start_hdl; /* starting handle for the next inc srvv discovery */ tGATT_DISC_RES result; BOOLEAN wait_for_read_rsp; } tGATT_READ_INC_UUID128; -typedef struct -{ +typedef struct { tGATT_TCB *p_tcb; /* associated TCB of this CLCB */ tGATT_REG *p_reg; /* owner of this CLCB */ UINT8 sccb_idx; @@ -415,50 +393,44 @@ typedef struct } tGATT_CLCB; -typedef struct -{ +typedef struct { tGATT_CLCB *p_clcb; -}tGATT_PENDING_ENC_CLCB; +} tGATT_PENDING_ENC_CLCB; #define GATT_SIGN_WRITE 1 #define GATT_VERIFY_SIGN_DATA 2 -typedef struct -{ +typedef struct { BT_HDR hdr; tGATT_CLCB *p_clcb; -}tGATT_SIGN_WRITE_OP; +} tGATT_SIGN_WRITE_OP; -typedef struct -{ +typedef struct { BT_HDR hdr; tGATT_TCB *p_tcb; BT_HDR *p_data; -}tGATT_VERIFY_SIGN_OP; +} tGATT_VERIFY_SIGN_OP; -typedef struct -{ +typedef struct { UINT16 clcb_idx; BOOLEAN in_use; } tGATT_SCCB; -typedef struct -{ +typedef struct { UINT16 handle; UINT16 uuid; UINT32 service_change; -}tGATT_SVC_CHG; +} tGATT_SVC_CHG; -typedef struct -{ +typedef struct { tGATT_IF gatt_if[GATT_MAX_APPS]; tGATT_IF listen_gif[GATT_MAX_APPS]; BD_ADDR remote_bda; BOOLEAN in_use; -}tGATT_BG_CONN_DEV; +} tGATT_BG_CONN_DEV; #define GATT_SVC_CHANGED_CONNECTING 1 /* wait for connection */ #define GATT_SVC_CHANGED_SERVICE 2 /* GATT service discovery */ @@ -466,8 +438,7 @@ typedef struct #define GATT_SVC_CHANGED_DESCRIPTOR 4 /* service change CCC discoery */ #define GATT_SVC_CHANGED_CONFIGURE_CCCD 5 /* config CCC */ -typedef struct -{ +typedef struct { UINT16 conn_id; BOOLEAN in_use; BOOLEAN connected; @@ -479,10 +450,9 @@ typedef struct UINT8 ccc_result; UINT16 s_handle; UINT16 e_handle; -}tGATT_PROFILE_CLCB; +} tGATT_PROFILE_CLCB; -typedef struct -{ +typedef struct { tGATT_TCB tcb[GATT_MAX_PHY_CHANNEL]; BUFFER_Q sign_op_queue; @@ -576,7 +546,7 @@ extern tGATT_STATUS attp_send_sr_msg (tGATT_TCB *p_tcb, BT_HDR *p_msg); extern tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP); /* utility functions */ -extern UINT8 * gatt_dbg_op_name(UINT8 op_code); +extern UINT8 *gatt_dbg_op_name(UINT8 op_code); extern UINT32 gatt_add_sdp_record (tBT_UUID *p_uuid, UINT16 start_hdl, UINT16 end_hdl); extern BOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid, UINT16 len, UINT8 **p_data); extern UINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid); @@ -590,7 +560,7 @@ extern void gatt_ind_ack_timeout(TIMER_LIST_ENT *p_tle); extern void gatt_start_ind_ack_timer(tGATT_TCB *p_tcb); extern tGATT_STATUS gatt_send_error_rsp(tGATT_TCB *p_tcb, UINT8 err_code, UINT8 op_code, UINT16 handle, BOOLEAN deq); extern void gatt_dbg_display_uuid(tBT_UUID bt_uuid); -extern tGATT_PENDING_ENC_CLCB* gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb ); +extern tGATT_PENDING_ENC_CLCB *gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb ); extern tGATTS_PENDING_NEW_SRV_START *gatt_sr_is_new_srv_chg(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst); @@ -625,7 +595,7 @@ extern BOOLEAN gatt_is_bg_dev_for_app(tGATT_BG_CONN_DEV *p_dev, tGATT_IF gatt_if extern BOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr); extern UINT8 gatt_get_num_apps_for_bg_dev(BD_ADDR bd_addr); extern BOOLEAN gatt_find_app_for_bg_dev(BD_ADDR bd_addr, tGATT_IF *p_gatt_if); -extern tGATT_BG_CONN_DEV * gatt_find_bg_dev(BD_ADDR remote_bda); +extern tGATT_BG_CONN_DEV *gatt_find_bg_dev(BD_ADDR remote_bda); extern void gatt_deregister_bgdev_list(tGATT_IF gatt_if); extern void gatt_reset_bgdev_list(void); @@ -635,7 +605,7 @@ extern UINT8 gatt_sr_find_i_rcb_by_app_id(tBT_UUID *p_app_uuid128, tBT_UUID *p_s extern UINT8 gatt_sr_alloc_rcb(tGATT_HDL_LIST_ELEM *p_list); extern tGATT_STATUS gatt_sr_process_app_rsp (tGATT_TCB *p_tcb, tGATT_IF gatt_if, UINT32 trans_id, UINT8 op_code, tGATT_STATUS status, tGATTS_RSP *p_msg); extern void gatt_server_handle_client_req (tGATT_TCB *p_tcb, UINT8 op_code, - UINT16 len, UINT8 *p_data); + UINT16 len, UINT8 *p_data); extern void gatt_sr_send_req_callback(UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_req_data); extern UINT32 gatt_sr_enqueue_cmd (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 handle); @@ -659,10 +629,10 @@ extern void gatt_sr_update_prep_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN extern BOOLEAN gatt_find_app_hold_link(tGATT_TCB *p_tcb, UINT8 start_idx, UINT8 *p_found_idx, tGATT_IF *p_gatt_if); extern UINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb); extern UINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda); -extern tGATT_TCB * gatt_find_tcb_by_cid(UINT16 lcid); -extern tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport); -extern tGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx); -extern tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport); +extern tGATT_TCB *gatt_find_tcb_by_cid(UINT16 lcid); +extern tGATT_TCB *gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport); +extern tGATT_TCB *gatt_get_tcb_by_idx(UINT8 tcb_idx); +extern tGATT_TCB *gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport); extern BOOLEAN gatt_send_ble_burst_data (BD_ADDR remote_bda, BT_HDR *p_buf); /* GATT client functions */ @@ -680,7 +650,7 @@ extern UINT8 gatt_act_send_browse(tGATT_TCB *p_tcb, UINT16 index, UINT8 op, UINT extern tGATT_CLCB *gatt_cmd_dequeue(tGATT_TCB *p_tcb, UINT8 *p_opcode); extern BOOLEAN gatt_cmd_enq(tGATT_TCB *p_tcb, UINT16 clcb_idx, BOOLEAN to_send, UINT8 op_code, BT_HDR *p_buf); extern void gatt_client_handle_server_rsp (tGATT_TCB *p_tcb, UINT8 op_code, - UINT16 len, UINT8 *p_data); + UINT16 len, UINT8 *p_data); extern void gatt_send_queue_write_cancel (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, tGATT_EXEC_FLAG flag); /* gatt_auth.c */ @@ -697,14 +667,14 @@ extern UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, U extern UINT16 gatts_add_characteristic (tGATT_SVC_DB *p_db, tGATT_PERM perm, tGATT_CHAR_PROP property, tBT_UUID *p_char_uuid); extern UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, tBT_UUID *p_dscp_uuid); extern tGATT_STATUS gatts_db_read_attr_value_by_type (tGATT_TCB *p_tcb, tGATT_SVC_DB *p_db, UINT8 op_code, BT_HDR *p_rsp, UINT16 s_handle, - UINT16 e_handle, tBT_UUID type, UINT16 *p_len, tGATT_SEC_FLAG sec_flag, UINT8 key_size,UINT32 trans_id, UINT16 *p_cur_handle); -extern tGATT_STATUS gatts_read_attr_value_by_handle(tGATT_TCB *p_tcb,tGATT_SVC_DB *p_db, UINT8 op_code, UINT16 handle, UINT16 offset, - UINT8 *p_value, UINT16 *p_len, UINT16 mtu,tGATT_SEC_FLAG sec_flag,UINT8 key_size,UINT32 trans_id); -extern tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code,UINT16 handle, UINT16 offset, UINT8 *p_data, - UINT16 len, tGATT_SEC_FLAG sec_flag, UINT8 key_size); -extern tGATT_STATUS gatts_read_attr_perm_check(tGATT_SVC_DB *p_db, BOOLEAN is_long, UINT16 handle, tGATT_SEC_FLAG sec_flag,UINT8 key_size); + UINT16 e_handle, tBT_UUID type, UINT16 *p_len, tGATT_SEC_FLAG sec_flag, UINT8 key_size, UINT32 trans_id, UINT16 *p_cur_handle); +extern tGATT_STATUS gatts_read_attr_value_by_handle(tGATT_TCB *p_tcb, tGATT_SVC_DB *p_db, UINT8 op_code, UINT16 handle, UINT16 offset, + UINT8 *p_value, UINT16 *p_len, UINT16 mtu, tGATT_SEC_FLAG sec_flag, UINT8 key_size, UINT32 trans_id); +extern tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, UINT16 handle, UINT16 offset, UINT8 *p_data, + UINT16 len, tGATT_SEC_FLAG sec_flag, UINT8 key_size); +extern tGATT_STATUS gatts_read_attr_perm_check(tGATT_SVC_DB *p_db, BOOLEAN is_long, UINT16 handle, tGATT_SEC_FLAG sec_flag, UINT8 key_size); extern void gatts_update_srv_list_elem(UINT8 i_sreg, UINT16 handle, BOOLEAN is_primary); -extern tBT_UUID * gatts_get_service_uuid (tGATT_SVC_DB *p_db); +extern tBT_UUID *gatts_get_service_uuid (tGATT_SVC_DB *p_db); extern void gatt_reset_bgdev_list(void); #endif diff --git a/components/bt/bluedroid/stack/hcic/hciblecmds.c b/components/bt/bluedroid/stack/hcic/hciblecmds.c old mode 100755 new mode 100644 index 5ee0159c5..8fa4ae8b3 --- a/components/bt/bluedroid/stack/hcic/hciblecmds.c +++ b/components/bt/bluedroid/stack/hcic/hciblecmds.c @@ -40,8 +40,9 @@ BOOLEAN btsnd_hcic_ble_set_local_used_feat (UINT8 feat_set[8]) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_USED_FEAT_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_USED_FEAT_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -60,8 +61,9 @@ BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_bda) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -78,15 +80,16 @@ BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_bda) } BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max, - UINT8 adv_type, UINT8 addr_type_own, - UINT8 addr_type_dir, BD_ADDR direct_bda, - UINT8 channel_map, UINT8 adv_filter_policy) + UINT8 adv_type, UINT8 addr_type_own, + UINT8 addr_type_dir, BD_ADDR direct_bda, + UINT8 channel_map, UINT8 adv_filter_policy) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -113,8 +116,9 @@ BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -134,13 +138,13 @@ BOOLEAN btsnd_hcic_ble_set_adv_data (UINT8 data_len, UINT8 *p_data) BT_HDR *p; UINT8 *pp; - for (int i = 0; i < data_len; i++) - { - LOG_DEBUG("p_data[%d] = %x\n", i,p_data[i]); + for (int i = 0; i < data_len; i++) { + LOG_DEBUG("p_data[%d] = %x\n", i, p_data[i]); } - - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1)) == NULL) + + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -152,10 +156,10 @@ BOOLEAN btsnd_hcic_ble_set_adv_data (UINT8 data_len, UINT8 *p_data) memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA); - if (p_data != NULL && data_len > 0) - { - if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA) + if (p_data != NULL && data_len > 0) { + if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA) { data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA; + } UINT8_TO_STREAM (pp, data_len); @@ -170,8 +174,9 @@ BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -183,11 +188,11 @@ BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp) memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP); - if (p_scan_rsp != NULL && data_len > 0) - { + if (p_scan_rsp != NULL && data_len > 0) { - if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP ) + if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP ) { data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP; + } UINT8_TO_STREAM (pp, data_len); @@ -204,8 +209,9 @@ BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_ADV_ENABLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_ADV_ENABLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -221,14 +227,15 @@ BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable) return (TRUE); } BOOLEAN btsnd_hcic_ble_set_scan_params (UINT8 scan_type, - UINT16 scan_int, UINT16 scan_win, - UINT8 addr_type_own, UINT8 scan_filter_policy) + UINT16 scan_int, UINT16 scan_win, + UINT8 addr_type_own, UINT8 scan_filter_policy) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -253,8 +260,9 @@ BOOLEAN btsnd_hcic_ble_set_scan_enable (UINT8 scan_enable, UINT8 duplicate) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -283,8 +291,9 @@ BOOLEAN btsnd_hcic_ble_create_ll_conn (UINT16 scan_int, UINT16 scan_win, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -319,8 +328,9 @@ BOOLEAN btsnd_hcic_ble_create_conn_cancel (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -339,8 +349,9 @@ BOOLEAN btsnd_hcic_ble_clear_white_list (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CLEAR_WHITE_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CLEAR_WHITE_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -359,8 +370,9 @@ BOOLEAN btsnd_hcic_ble_add_white_list (UINT8 addr_type, BD_ADDR bda) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_WHITE_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_WHITE_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -382,8 +394,9 @@ BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REMOVE_WHITE_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REMOVE_WHITE_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -401,15 +414,16 @@ BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda) } BOOLEAN btsnd_hcic_ble_upd_ll_conn_params (UINT16 handle, - UINT16 conn_int_min, UINT16 conn_int_max, - UINT16 conn_latency, UINT16 conn_timeout, - UINT16 min_ce_len, UINT16 max_ce_len) + UINT16 conn_int_min, UINT16 conn_int_max, + UINT16 conn_latency, UINT16 conn_timeout, + UINT16 min_ce_len, UINT16 max_ce_len) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -437,8 +451,9 @@ BOOLEAN btsnd_hcic_ble_set_host_chnl_class (UINT8 chnl_map[HCIC_BLE_CHNL_MAP_SI BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -459,8 +474,9 @@ BOOLEAN btsnd_hcic_ble_read_chnl_map (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CHNL_MAP)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CHNL_MAP)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -481,8 +497,9 @@ BOOLEAN btsnd_hcic_ble_read_remote_feat (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -507,8 +524,9 @@ BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len, UINT8 *pp; if ((p = HCI_GET_CMD_BUF(sizeof(BT_HDR) + sizeof (void *) + - HCIC_PARAM_SIZE_BLE_ENCRYPT)) == NULL) + HCIC_PARAM_SIZE_BLE_ENCRYPT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -524,8 +542,12 @@ BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len, memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT); - if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) key_len = HCIC_BLE_ENCRYT_KEY_SIZE; - if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) pt_len = HCIC_BLE_ENCRYT_KEY_SIZE; + if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) { + key_len = HCIC_BLE_ENCRYT_KEY_SIZE; + } + if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) { + pt_len = HCIC_BLE_ENCRYT_KEY_SIZE; + } ARRAY_TO_STREAM (pp, key, key_len); pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len); @@ -541,8 +563,9 @@ BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback) UINT8 *pp; if ((p = HCI_GET_CMD_BUF(sizeof(BT_HDR) + sizeof (void *) + - HCIC_PARAM_SIZE_BLE_RAND)) == NULL) + HCIC_PARAM_SIZE_BLE_RAND)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -560,13 +583,14 @@ BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback) } BOOLEAN btsnd_hcic_ble_start_enc (UINT16 handle, UINT8 rand[HCIC_BLE_RAND_DI_SIZE], - UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) + UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_START_ENC)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_START_ENC)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -590,8 +614,9 @@ BOOLEAN btsnd_hcic_ble_ltk_req_reply (UINT16 handle, UINT8 ltk[HCIC_BLE_ENCRYT_K BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -613,8 +638,9 @@ BOOLEAN btsnd_hcic_ble_ltk_req_neg_reply (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -635,8 +661,9 @@ BOOLEAN btsnd_hcic_ble_receiver_test(UINT8 rx_freq) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -657,8 +684,9 @@ BOOLEAN btsnd_hcic_ble_transmitter_test(UINT8 tx_freq, UINT8 test_data_len, UINT BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -681,8 +709,9 @@ BOOLEAN btsnd_hcic_ble_test_end(void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -701,8 +730,9 @@ BOOLEAN btsnd_hcic_ble_read_host_supported (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -719,15 +749,16 @@ BOOLEAN btsnd_hcic_ble_read_host_supported (void) #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) BOOLEAN btsnd_hcic_ble_rc_param_req_reply( UINT16 handle, - UINT16 conn_int_min, UINT16 conn_int_max, - UINT16 conn_latency, UINT16 conn_timeout, - UINT16 min_ce_len, UINT16 max_ce_len ) + UINT16 conn_int_min, UINT16 conn_int_max, + UINT16 conn_latency, UINT16 conn_timeout, + UINT16 min_ce_len, UINT16 max_ce_len ) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -754,8 +785,9 @@ BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -774,14 +806,15 @@ BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason) #endif BOOLEAN btsnd_hcic_ble_add_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer, - UINT8 irk_peer[HCIC_BLE_IRK_SIZE], - UINT8 irk_local[HCIC_BLE_IRK_SIZE]) + UINT8 irk_peer[HCIC_BLE_IRK_SIZE], + UINT8 irk_local[HCIC_BLE_IRK_SIZE]) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -805,8 +838,9 @@ BOOLEAN btsnd_hcic_ble_rm_device_resolving_list (UINT8 addr_type_peer, BD_ADDR b BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -828,8 +862,9 @@ BOOLEAN btsnd_hcic_ble_clear_resolving_list (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -849,8 +884,9 @@ BOOLEAN btsnd_hcic_ble_read_resolvable_addr_peer (UINT8 addr_type_peer, BD_ADDR BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -872,8 +908,9 @@ BOOLEAN btsnd_hcic_ble_read_resolvable_addr_local (UINT8 addr_type_peer, BD_ADDR BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -895,8 +932,9 @@ BOOLEAN btsnd_hcic_ble_set_addr_resolution_enable (UINT8 addr_resolution_enable) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -917,8 +955,9 @@ BOOLEAN btsnd_hcic_ble_set_rand_priv_addr_timeout (UINT16 rpa_timout) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT)) == NULL) + if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -939,8 +978,9 @@ BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, UIN BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH)) == NULL) { return FALSE; + } pp = p->data; diff --git a/components/bt/bluedroid/stack/hcic/hcicmds.c b/components/bt/bluedroid/stack/hcic/hcicmds.c old mode 100755 new mode 100644 index 4ea85ff9c..920feaea2 --- a/components/bt/bluedroid/stack/hcic/hcicmds.c +++ b/components/bt/bluedroid/stack/hcic/hcicmds.c @@ -41,8 +41,9 @@ BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, UINT8 response_cnt BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -65,8 +66,9 @@ BOOLEAN btsnd_hcic_inq_cancel(void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -85,8 +87,9 @@ BOOLEAN btsnd_hcic_per_inq_mode (UINT16 max_period, UINT16 min_period, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -111,8 +114,9 @@ BOOLEAN btsnd_hcic_exit_per_inq (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -133,8 +137,9 @@ BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -168,8 +173,9 @@ BOOLEAN btsnd_hcic_disconnect (UINT16 handle, UINT8 reason) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -191,8 +197,9 @@ BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -215,8 +222,9 @@ BOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -237,8 +245,9 @@ BOOLEAN btsnd_hcic_accept_conn (BD_ADDR dest, UINT8 role) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -261,8 +270,9 @@ BOOLEAN btsnd_hcic_reject_conn (BD_ADDR dest, UINT8 reason) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -286,8 +296,9 @@ BOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, LINK_KEY link_key) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -309,8 +320,9 @@ BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -327,14 +339,15 @@ BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr) } BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len, - PIN_CODE pin_code) + PIN_CODE pin_code) { BT_HDR *p; UINT8 *pp; int i; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -347,11 +360,13 @@ BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len, BDADDR_TO_STREAM (pp, bd_addr); UINT8_TO_STREAM (pp, pin_code_len); - for (i = 0; i < pin_code_len; i++) + for (i = 0; i < pin_code_len; i++) { *pp++ = *pin_code++; + } - for (; i < PIN_CODE_LEN; i++) + for (; i < PIN_CODE_LEN; i++) { *pp++ = 0; + } btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); @@ -363,8 +378,9 @@ BOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -385,8 +401,9 @@ BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -408,8 +425,9 @@ BOOLEAN btsnd_hcic_auth_request (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -430,8 +448,9 @@ BOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -454,8 +473,9 @@ BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, UINT8 page_scan_rep_mode, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -479,8 +499,9 @@ BOOLEAN btsnd_hcic_rmt_name_req_cancel (BD_ADDR bd_addr) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -501,8 +522,9 @@ BOOLEAN btsnd_hcic_rmt_features_req (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -523,8 +545,9 @@ BOOLEAN btsnd_hcic_rmt_ext_features (UINT16 handle, UINT8 page_num) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -546,8 +569,9 @@ BOOLEAN btsnd_hcic_rmt_ver_req (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -568,8 +592,9 @@ BOOLEAN btsnd_hcic_read_rmt_clk_offset (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -590,8 +615,9 @@ BOOLEAN btsnd_hcic_read_lmp_handle (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -614,8 +640,9 @@ BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, UINT32 tx_bw, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -645,8 +672,9 @@ BOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, UINT32 tx_bw, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -673,8 +701,9 @@ BOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -697,8 +726,9 @@ BOOLEAN btsnd_hcic_hold_mode (UINT16 handle, UINT16 max_hold_period, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -723,8 +753,9 @@ BOOLEAN btsnd_hcic_sniff_mode (UINT16 handle, UINT16 max_sniff_period, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -749,8 +780,9 @@ BOOLEAN btsnd_hcic_exit_sniff_mode (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -772,8 +804,9 @@ BOOLEAN btsnd_hcic_park_mode (UINT16 handle, UINT16 beacon_max_interval, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -796,8 +829,9 @@ BOOLEAN btsnd_hcic_exit_park_mode (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -820,8 +854,9 @@ BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, UINT8 service_type, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -848,8 +883,9 @@ BOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -871,8 +907,9 @@ BOOLEAN btsnd_hcic_write_policy_set (UINT16 handle, UINT16 settings) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -893,8 +930,9 @@ BOOLEAN btsnd_hcic_write_def_policy_set (UINT16 settings) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -916,8 +954,9 @@ BOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type, UINT8 *pp; /* Use buffer large enough to hold all sizes in this command */ - if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL) + if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -925,36 +964,31 @@ BOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type, UINT16_TO_STREAM (pp, HCI_SET_EVENT_FILTER); - if (filt_type) - { + if (filt_type) { p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len); UINT8_TO_STREAM (pp, (UINT8)(2 + filt_cond_len)); UINT8_TO_STREAM (pp, filt_type); UINT8_TO_STREAM (pp, filt_cond_type); - if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS) - { + if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS) { DEVCLASS_TO_STREAM (pp, filt_cond); filt_cond += DEV_CLASS_LEN; DEVCLASS_TO_STREAM (pp, filt_cond); filt_cond += DEV_CLASS_LEN; filt_cond_len -= (2 * DEV_CLASS_LEN); - } - else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR) - { + } else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR) { BDADDR_TO_STREAM (pp, filt_cond); filt_cond += BD_ADDR_LEN; filt_cond_len -= BD_ADDR_LEN; } - if (filt_cond_len) + if (filt_cond_len) { ARRAY_TO_STREAM (pp, filt_cond, filt_cond_len); - } - else - { + } + } else { p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 1); UINT8_TO_STREAM (pp, 1); @@ -970,8 +1004,9 @@ BOOLEAN btsnd_hcic_write_pin_type (UINT8 type) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -992,8 +1027,9 @@ BOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1016,8 +1052,9 @@ BOOLEAN btsnd_hcic_change_name (BD_NAME name) UINT8 *pp; UINT16 len = strlen ((char *)name) + 1; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME); @@ -1028,8 +1065,9 @@ BOOLEAN btsnd_hcic_change_name (BD_NAME name) UINT16_TO_STREAM (pp, HCI_CHANGE_LOCAL_NAME); UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CHANGE_NAME); - if (len > HCIC_PARAM_SIZE_CHANGE_NAME) + if (len > HCIC_PARAM_SIZE_CHANGE_NAME) { len = HCIC_PARAM_SIZE_CHANGE_NAME; + } ARRAY_TO_STREAM (pp, name, len); @@ -1042,8 +1080,9 @@ BOOLEAN btsnd_hcic_read_name (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1062,8 +1101,9 @@ BOOLEAN btsnd_hcic_write_page_tout (UINT16 timeout) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1084,8 +1124,9 @@ BOOLEAN btsnd_hcic_write_scan_enable (UINT8 flag) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1106,8 +1147,9 @@ BOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, UINT16 window) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1129,8 +1171,9 @@ BOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1152,8 +1195,9 @@ BOOLEAN btsnd_hcic_write_auth_enable (UINT8 flag) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1174,8 +1218,9 @@ BOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev_class) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1196,8 +1241,9 @@ BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1218,8 +1264,9 @@ BOOLEAN btsnd_hcic_write_auto_flush_tout (UINT16 handle, UINT16 tout) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1241,8 +1288,9 @@ BOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1260,14 +1308,15 @@ BOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type) } BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, UINT16 *handle, - UINT16 *num_pkts) + UINT16 *num_pkts) { BT_HDR *p; UINT8 *pp; int j; - if ((p = HCI_GET_CMD_BUF(1 + (num_handles * 4))) == NULL) + if ((p = HCI_GET_CMD_BUF(1 + (num_handles * 4))) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1279,8 +1328,7 @@ BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, UINT16 *handle, UINT8_TO_STREAM (pp, num_handles); - for (j = 0; j < num_handles; j++) - { + for (j = 0; j < num_handles; j++) { UINT16_TO_STREAM (pp, handle[j]); UINT16_TO_STREAM (pp, num_pkts[j]); } @@ -1294,8 +1342,9 @@ BOOLEAN btsnd_hcic_write_link_super_tout (UINT8 local_controller_id, UINT16 hand BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1312,14 +1361,15 @@ BOOLEAN btsnd_hcic_write_link_super_tout (UINT8 local_controller_id, UINT16 hand return (TRUE); } -BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP * const iac_lap) +BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP *const iac_lap) { BT_HDR *p; UINT8 *pp; int i; - if ((p = HCI_GET_CMD_BUF(1 + (LAP_LEN * num_cur_iac))) == NULL) + if ((p = HCI_GET_CMD_BUF(1 + (LAP_LEN * num_cur_iac))) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1331,8 +1381,9 @@ BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP * const iac_lap) UINT8_TO_STREAM (pp, num_cur_iac); - for (i = 0; i < num_cur_iac; i++) + for (i = 0; i < num_cur_iac; i++) { LAP_TO_STREAM (pp, iac_lap[i]); + } btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p); return (TRUE); @@ -1349,8 +1400,9 @@ BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat, BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_SUB_RATE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_SUB_RATE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1388,13 +1440,14 @@ void btsnd_hcic_write_ext_inquiry_response (void *buffer, UINT8 fec_req) } BOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability, - UINT8 oob_present, UINT8 auth_req) + UINT8 oob_present, UINT8 auth_req) { BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_RESP)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_RESP)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1418,8 +1471,9 @@ BOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1441,8 +1495,9 @@ BOOLEAN btsnd_hcic_read_local_oob_data (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_LOCAL_OOB)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_LOCAL_OOB)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1461,21 +1516,19 @@ BOOLEAN btsnd_hcic_user_conf_reply (BD_ADDR bd_addr, BOOLEAN is_yes) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_UCONF_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_UCONF_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY; p->offset = 0; - if (!is_yes) - { + if (!is_yes) { /* Negative reply */ UINT16_TO_STREAM (pp, HCI_USER_CONF_VALUE_NEG_REPLY); - } - else - { + } else { /* Confirmation */ UINT16_TO_STREAM (pp, HCI_USER_CONF_REQUEST_REPLY); } @@ -1493,8 +1546,9 @@ BOOLEAN btsnd_hcic_user_passkey_reply (BD_ADDR bd_addr, UINT32 value) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1516,8 +1570,9 @@ BOOLEAN btsnd_hcic_user_passkey_neg_reply (BD_ADDR bd_addr) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1538,8 +1593,9 @@ BOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, UINT8 *p_r) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1562,8 +1618,9 @@ BOOLEAN btsnd_hcic_rem_oob_neg_reply (BD_ADDR bd_addr) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1585,8 +1642,9 @@ BOOLEAN btsnd_hcic_read_inq_tx_power (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_TX_POWER)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_TX_POWER)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1605,8 +1663,9 @@ BOOLEAN btsnd_hcic_send_keypress_notif (BD_ADDR bd_addr, UINT8 notif) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1631,8 +1690,9 @@ BOOLEAN btsnd_hcic_enhanced_flush (UINT16 handle, UINT8 packet_type) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ENHANCED_FLUSH)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ENHANCED_FLUSH)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1658,8 +1718,9 @@ BOOLEAN btsnd_hcic_get_link_quality (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1680,8 +1741,9 @@ BOOLEAN btsnd_hcic_read_rssi (UINT16 handle) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1702,8 +1764,9 @@ BOOLEAN btsnd_hcic_enable_test_mode (void) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1722,8 +1785,9 @@ BOOLEAN btsnd_hcic_write_inqscan_type (UINT8 type) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1744,8 +1808,9 @@ BOOLEAN btsnd_hcic_write_inquiry_mode (UINT8 mode) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); @@ -1766,8 +1831,9 @@ BOOLEAN btsnd_hcic_write_pagescan_type (UINT8 type) BT_HDR *p; UINT8 *pp; - if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) + if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) { return (FALSE); + } pp = (UINT8 *)(p + 1); diff --git a/components/bt/bluedroid/stack/include/bt_types.h b/components/bt/bluedroid/stack/include/bt_types.h old mode 100755 new mode 100644 index 78c144d2a..fdcd15629 --- a/components/bt/bluedroid/stack/include/bt_types.h +++ b/components/bt/bluedroid/stack/include/bt_types.h @@ -58,8 +58,8 @@ typedef bool BOOLEAN; */ #define BT_EVT_MASK 0xFF00 #define BT_SUB_EVT_MASK 0x00FF - /* To Bluetooth Upper Layers */ - /************************************/ +/* To Bluetooth Upper Layers */ +/************************************/ #define BT_EVT_TO_BTU_L2C_EVT 0x0900 /* L2CAP event */ #define BT_EVT_TO_BTU_HCI_EVT 0x1000 /* HCI Event */ #define BT_EVT_TO_BTU_HCI_BR_EDR_EVT (0x0000 | BT_EVT_TO_BTU_HCI_EVT) /* event from BR/EDR controller */ @@ -84,8 +84,8 @@ typedef bool BOOLEAN; #define BT_EVT_BTSIM 0x1B00 /* Insight BTSIM event */ #define BT_EVT_BTISE 0x1C00 /* Insight Script Engine event */ - /* To LM */ - /************************************/ +/* To LM */ +/************************************/ #define BT_EVT_TO_LM_HCI_CMD 0x2000 /* HCI Command */ #define BT_EVT_TO_LM_HCI_ACL 0x2100 /* HCI ACL Data */ #define BT_EVT_TO_LM_HCI_SCO 0x2200 /* HCI SCO Data */ @@ -122,7 +122,7 @@ typedef bool BOOLEAN; #define BT_EVT_TO_GAP_MSG 0x3b00 /* for NFC */ - /************************************/ +/************************************/ #define BT_EVT_TO_NFC_NCI 0x4000 /* NCI Command, Notification or Data*/ #define BT_EVT_TO_NFC_INIT 0x4100 /* Initialization message */ #define BT_EVT_TO_NCI_LP 0x4200 /* Low power */ @@ -194,8 +194,7 @@ typedef bool BOOLEAN; /* Define the header of each buffer used in the Bluetooth stack. */ -typedef struct -{ +typedef struct { uint16_t event; uint16_t len; uint16_t offset; @@ -416,16 +415,14 @@ typedef UINT8 ACCESS_CODE[ACCESS_CODE_BYTE_LEN]; /* Maximum UUID size - 16 bytes, and structure to hold any type of UUID. */ #define MAX_UUID_SIZE 16 -typedef struct -{ +typedef struct { #define LEN_UUID_16 2 #define LEN_UUID_32 4 #define LEN_UUID_128 16 UINT16 len; - union - { + union { UINT16 uuid16; UINT32 uuid32; UINT8 uuid128[MAX_UUID_SIZE]; @@ -463,8 +460,8 @@ typedef struct /* We will not allocate a PSM in the reserved range to 3rd party apps */ -#define BRCM_RESERVED_PSM_START 0x5AE1 -#define BRCM_RESERVED_PSM_END 0x5AFF +#define BRCM_RESERVED_PSM_START 0x5AE1 +#define BRCM_RESERVED_PSM_END 0x5AFF #define BRCM_UTILITY_SERVICE_PSM 0x5AE1 #define BRCM_MATCHER_PSM 0x5AE3 @@ -480,8 +477,7 @@ typedef struct #define BT_CONNECTED_USING_BREDR 1 #define BT_CONNECTED_USING_AMP 2 -typedef struct -{ +typedef struct { UINT32 is_connected; INT32 rssi; UINT32 bytes_sent; @@ -511,8 +507,7 @@ typedef UINT8 tBT_TRANSPORT; #define BLE_ADDR_IS_STATIC(x) ((x[0] & 0xC0) == 0xC0) -typedef struct -{ +typedef struct { tBLE_ADDR_TYPE type; BD_ADDR bda; } tBLE_BD_ADDR; @@ -620,7 +615,7 @@ typedef UINT8 tBT_DEVICE_TYPE; #define TRACE_ORG_USER_SCR 0x00000800 #define TRACE_ORG_TESTER 0x00000900 #define TRACE_ORG_MAX_NUM 10 /* 32-bit mask; must be < 32 */ -#define TRACE_LITE_ORG_MAX_NUM 6 +#define TRACE_LITE_ORG_MAX_NUM 6 #define TRACE_ORG_ALL 0x03ff #define TRACE_ORG_RPC_TRANS 0x04 @@ -715,7 +710,7 @@ typedef uint8_t BD_ADDR[BD_ADDR_LEN]; /* global constant for "any" bd addr */ static const BD_ADDR bd_addr_any = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; -static const BD_ADDR bd_addr_null= {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static const BD_ADDR bd_addr_null = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /***************************************************************************** ** Functions @@ -735,8 +730,7 @@ static inline void bdcpy(BD_ADDR a, const BD_ADDR b) { int i; - for (i = BD_ADDR_LEN; i != 0; i--) - { + for (i = BD_ADDR_LEN; i != 0; i--) { *a++ = *b++; } } @@ -755,10 +749,8 @@ static inline int bdcmp(const BD_ADDR a, const BD_ADDR b) { int i; - for (i = BD_ADDR_LEN; i != 0; i--) - { - if (*a++ != *b++) - { + for (i = BD_ADDR_LEN; i != 0; i--) { + if (*a++ != *b++) { return -1; } } diff --git a/components/bt/bluedroid/stack/include/btm_api.h b/components/bt/bluedroid/stack/include/btm_api.h old mode 100755 new mode 100644 index 02ca5dd8e..2d1edcb60 --- a/components/bt/bluedroid/stack/include/btm_api.h +++ b/components/bt/bluedroid/stack/include/btm_api.h @@ -46,8 +46,7 @@ #define BTM_MAX_VENDOR_SPECIFIC_LEN HCI_COMMAND_SIZE /* BTM application return status codes */ -enum -{ +enum { BTM_SUCCESS = 0, /* 0 Command succeeded */ BTM_CMD_STARTED, /* 1 Command started OK. */ BTM_BUSY, /* 2 Device busy with another command */ @@ -74,15 +73,14 @@ enum typedef uint8_t tBTM_STATUS; #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE) -typedef enum -{ +typedef enum { BTM_BR_ONE, /*0 First state or BR/EDR scan 1*/ BTM_BLE_ONE, /*1BLE scan 1*/ BTM_BR_TWO, /*2 BR/EDR scan 2*/ BTM_BLE_TWO, /*3 BLE scan 2*/ BTM_FINISH, /*4 End of Interleave Scan, or normal scan*/ BTM_NO_INTERLEAVING /*5 No Interleaving*/ -}btm_inq_state; +} btm_inq_state; #endif @@ -99,8 +97,7 @@ typedef UINT8 tBTM_DEVICE_ROLE; typedef UINT8 tBTM_BD_NAME[BTM_MAX_REM_BD_NAME_LEN + 1]; /* Structure returned with local version information */ -typedef struct -{ +typedef struct { UINT8 hci_version; UINT16 hci_revision; UINT8 lmp_version; @@ -109,8 +106,7 @@ typedef struct } tBTM_VERSION_INFO; /* Structure returned with Vendor Specific Command complete callback */ -typedef struct -{ +typedef struct { UINT16 opcode; UINT16 param_len; UINT8 *p_param_buf; @@ -125,8 +121,7 @@ typedef struct ** has detected that the controller status has changed. This asynchronous event ** is enabled/disabled by calling BTM_RegisterForDeviceStatusNotif(). */ -enum -{ +enum { BTM_DEV_STATUS_UP, BTM_DEV_STATUS_DOWN, BTM_DEV_STATUS_CMD_TOUT @@ -415,11 +410,10 @@ typedef UINT8 (tBTM_FILTER_CB) (BD_ADDR bd_addr, DEV_CLASS dc); /* BTM service definitions ** Used for storing EIR data to bit mask */ -enum -{ +enum { BTM_EIR_UUID_SERVCLASS_SERVICE_DISCOVERY_SERVER, -/* BTM_EIR_UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR, */ -/* BTM_EIR_UUID_SERVCLASS_PUBLIC_BROWSE_GROUP, */ + /* BTM_EIR_UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR, */ + /* BTM_EIR_UUID_SERVCLASS_PUBLIC_BROWSE_GROUP, */ BTM_EIR_UUID_SERVCLASS_SERIAL_PORT, BTM_EIR_UUID_SERVCLASS_LAN_ACCESS_USING_PPP, BTM_EIR_UUID_SERVCLASS_DIALUP_NETWORKING, @@ -432,19 +426,19 @@ enum BTM_EIR_UUID_SERVCLASS_AUDIO_SOURCE, BTM_EIR_UUID_SERVCLASS_AUDIO_SINK, BTM_EIR_UUID_SERVCLASS_AV_REM_CTRL_TARGET, -/* BTM_EIR_UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, */ + /* BTM_EIR_UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, */ BTM_EIR_UUID_SERVCLASS_AV_REMOTE_CONTROL, -/* BTM_EIR_UUID_SERVCLASS_VIDEO_CONFERENCING, */ + /* BTM_EIR_UUID_SERVCLASS_VIDEO_CONFERENCING, */ BTM_EIR_UUID_SERVCLASS_INTERCOM, BTM_EIR_UUID_SERVCLASS_FAX, BTM_EIR_UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, -/* BTM_EIR_UUID_SERVCLASS_WAP, */ -/* BTM_EIR_UUID_SERVCLASS_WAP_CLIENT, */ + /* BTM_EIR_UUID_SERVCLASS_WAP, */ + /* BTM_EIR_UUID_SERVCLASS_WAP_CLIENT, */ BTM_EIR_UUID_SERVCLASS_PANU, BTM_EIR_UUID_SERVCLASS_NAP, BTM_EIR_UUID_SERVCLASS_GN, BTM_EIR_UUID_SERVCLASS_DIRECT_PRINTING, -/* BTM_EIR_UUID_SERVCLASS_REFERENCE_PRINTING, */ + /* BTM_EIR_UUID_SERVCLASS_REFERENCE_PRINTING, */ BTM_EIR_UUID_SERVCLASS_IMAGING, BTM_EIR_UUID_SERVCLASS_IMAGING_RESPONDER, BTM_EIR_UUID_SERVCLASS_IMAGING_AUTO_ARCHIVE, @@ -452,39 +446,39 @@ enum BTM_EIR_UUID_SERVCLASS_HF_HANDSFREE, BTM_EIR_UUID_SERVCLASS_AG_HANDSFREE, BTM_EIR_UUID_SERVCLASS_DIR_PRT_REF_OBJ_SERVICE, -/* BTM_EIR_UUID_SERVCLASS_REFLECTED_UI, */ + /* BTM_EIR_UUID_SERVCLASS_REFLECTED_UI, */ BTM_EIR_UUID_SERVCLASS_BASIC_PRINTING, BTM_EIR_UUID_SERVCLASS_PRINTING_STATUS, BTM_EIR_UUID_SERVCLASS_HUMAN_INTERFACE, BTM_EIR_UUID_SERVCLASS_CABLE_REPLACEMENT, BTM_EIR_UUID_SERVCLASS_HCRP_PRINT, BTM_EIR_UUID_SERVCLASS_HCRP_SCAN, -/* BTM_EIR_UUID_SERVCLASS_COMMON_ISDN_ACCESS, */ -/* BTM_EIR_UUID_SERVCLASS_VIDEO_CONFERENCING_GW, */ -/* BTM_EIR_UUID_SERVCLASS_UDI_MT, */ -/* BTM_EIR_UUID_SERVCLASS_UDI_TA, */ -/* BTM_EIR_UUID_SERVCLASS_VCP, */ + /* BTM_EIR_UUID_SERVCLASS_COMMON_ISDN_ACCESS, */ + /* BTM_EIR_UUID_SERVCLASS_VIDEO_CONFERENCING_GW, */ + /* BTM_EIR_UUID_SERVCLASS_UDI_MT, */ + /* BTM_EIR_UUID_SERVCLASS_UDI_TA, */ + /* BTM_EIR_UUID_SERVCLASS_VCP, */ BTM_EIR_UUID_SERVCLASS_SAP, BTM_EIR_UUID_SERVCLASS_PBAP_PCE, BTM_EIR_UUID_SERVCLASS_PBAP_PSE, -/* BTM_EIR_UUID_SERVCLASS_TE_PHONE_ACCESS, */ -/* BTM_EIR_UUID_SERVCLASS_ME_PHONE_ACCESS, */ + /* BTM_EIR_UUID_SERVCLASS_TE_PHONE_ACCESS, */ + /* BTM_EIR_UUID_SERVCLASS_ME_PHONE_ACCESS, */ BTM_EIR_UUID_SERVCLASS_PHONE_ACCESS, BTM_EIR_UUID_SERVCLASS_HEADSET_HS, BTM_EIR_UUID_SERVCLASS_PNP_INFORMATION, -/* BTM_EIR_UUID_SERVCLASS_GENERIC_NETWORKING, */ -/* BTM_EIR_UUID_SERVCLASS_GENERIC_FILETRANSFER, */ -/* BTM_EIR_UUID_SERVCLASS_GENERIC_AUDIO, */ -/* BTM_EIR_UUID_SERVCLASS_GENERIC_TELEPHONY, */ -/* BTM_EIR_UUID_SERVCLASS_UPNP_SERVICE, */ -/* BTM_EIR_UUID_SERVCLASS_UPNP_IP_SERVICE, */ -/* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_PAN, */ -/* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_LAP, */ -/* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP, */ + /* BTM_EIR_UUID_SERVCLASS_GENERIC_NETWORKING, */ + /* BTM_EIR_UUID_SERVCLASS_GENERIC_FILETRANSFER, */ + /* BTM_EIR_UUID_SERVCLASS_GENERIC_AUDIO, */ + /* BTM_EIR_UUID_SERVCLASS_GENERIC_TELEPHONY, */ + /* BTM_EIR_UUID_SERVCLASS_UPNP_SERVICE, */ + /* BTM_EIR_UUID_SERVCLASS_UPNP_IP_SERVICE, */ + /* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_PAN, */ + /* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_LAP, */ + /* BTM_EIR_UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP, */ BTM_EIR_UUID_SERVCLASS_VIDEO_SOURCE, BTM_EIR_UUID_SERVCLASS_VIDEO_SINK, -/* BTM_EIR_UUID_SERVCLASS_VIDEO_DISTRIBUTION */ -/* BTM_EIR_UUID_SERVCLASS_HDP_PROFILE */ + /* BTM_EIR_UUID_SERVCLASS_VIDEO_DISTRIBUTION */ + /* BTM_EIR_UUID_SERVCLASS_HDP_PROFILE */ BTM_EIR_UUID_SERVCLASS_MESSAGE_ACCESS, BTM_EIR_UUID_SERVCLASS_MESSAGE_NOTIFICATION, BTM_EIR_UUID_SERVCLASS_HDP_SOURCE, @@ -562,22 +556,19 @@ typedef UINT8 tBTM_BLE_SEC_ACT; /* Definitions of the parameters passed to BTM_StartInquiry and ** BTM_SetPeriodicInquiryMode. */ -typedef struct /* contains the two device class condition fields */ -{ +typedef struct { /* contains the two device class condition fields */ DEV_CLASS dev_class; DEV_CLASS dev_class_mask; } tBTM_COD_COND; -typedef union /* contains the inquiry filter condition */ -{ +typedef union { /* contains the inquiry filter condition */ BD_ADDR bdaddr_cond; tBTM_COD_COND cod_cond; } tBTM_INQ_FILT_COND; -typedef struct /* contains the parameters passed to the inquiry functions */ -{ +typedef struct { /* contains the parameters passed to the inquiry functions */ UINT8 mode; /* general or limited */ UINT8 duration; /* duration of the inquiry (1.28 sec increments) */ UINT8 max_resps; /* maximum number of responses to return */ @@ -604,8 +595,7 @@ typedef UINT8 tBTM_BLE_EVT_TYPE; /* These are the fields returned in each device's response to the inquiry. It ** is returned in the results callback if registered. */ -typedef struct -{ +typedef struct { UINT16 clock_offset; BD_ADDR remote_bd_addr; DEV_CLASS dev_class; @@ -628,8 +618,7 @@ typedef struct /* This is the inquiry response information held in its database by BTM, and available ** to applications via BTM_InqDbRead, BTM_InqDbFirst, and BTM_InqDbNext. */ -typedef struct -{ +typedef struct { tBTM_INQ_RESULTS results; BOOLEAN appl_knows_rem_name; /* set by application if it knows the remote name of the peer device. @@ -646,31 +635,28 @@ typedef struct /* Structure returned with inquiry complete callback */ -typedef struct -{ +typedef struct { tBTM_STATUS status; UINT8 num_resp; /* Number of results from the current inquiry */ } tBTM_INQUIRY_CMPL; /* Structure returned with remote name request */ -typedef struct -{ +typedef struct { UINT16 status; BD_ADDR bd_addr; UINT16 length; BD_NAME remote_bd_name; } tBTM_REMOTE_DEV_NAME; -typedef struct -{ +typedef struct { UINT8 pcm_intf_rate; /* PCM interface rate: 0: 128kbps, 1: 256 kbps; 2:512 bps; 3: 1024kbps; 4: 2048kbps */ UINT8 frame_type; /* frame type: 0: short; 1: long */ UINT8 sync_mode; /* sync mode: 0: slave; 1: master */ UINT8 clock_mode; /* clock mode: 0: slave; 1: master */ -}tBTM_SCO_PCM_PARAM; +} tBTM_SCO_PCM_PARAM; /**************************************** ** Device Discovery Callback Functions @@ -725,8 +711,7 @@ typedef void (tBTM_INQ_RESULTS_CB) (tBTM_INQ_RESULTS *p_inq_results, UINT8 *p_ei /* Structure returned with Role Switch information (in tBTM_CMPL_CB callback function) ** in response to BTM_SwitchRole call. */ -typedef struct -{ +typedef struct { UINT8 hci_status; /* HCI status returned with the event */ UINT8 role; /* BTM_ROLE_MASTER or BTM_ROLE_SLAVE */ BD_ADDR remote_bd_addr; /* Remote BD addr involved with the switch */ @@ -735,8 +720,7 @@ typedef struct /* Structure returned with QoS information (in tBTM_CMPL_CB callback function) ** in response to BTM_SetQoS call. */ -typedef struct -{ +typedef struct { FLOW_SPEC flow; UINT16 handle; UINT8 status; @@ -746,8 +730,7 @@ typedef struct /* Structure returned with read RSSI event (in tBTM_CMPL_CB callback function) ** in response to BTM_ReadRSSI call. */ -typedef struct -{ +typedef struct { tBTM_STATUS status; UINT8 hci_status; INT8 rssi; @@ -757,8 +740,7 @@ typedef struct /* Structure returned with read current TX power event (in tBTM_CMPL_CB callback function) ** in response to BTM_ReadTxPower call. */ -typedef struct -{ +typedef struct { tBTM_STATUS status; UINT8 hci_status; INT8 tx_power; @@ -768,8 +750,7 @@ typedef struct /* Structure returned with read link quality event (in tBTM_CMPL_CB callback function) ** in response to BTM_ReadLinkQuality call. */ -typedef struct -{ +typedef struct { tBTM_STATUS status; UINT8 hci_status; UINT8 link_quality; @@ -779,15 +760,13 @@ typedef struct /* Structure returned with read inq tx power quality event (in tBTM_CMPL_CB callback function) ** in response to BTM_ReadInquiryRspTxPower call. */ -typedef struct -{ +typedef struct { tBTM_STATUS status; UINT8 hci_status; INT8 tx_power; } tBTM_INQ_TXPWR_RESULTS; -enum -{ +enum { BTM_BL_CONN_EVT, BTM_BL_DISCN_EVT, BTM_BL_UPDATE_EVT, @@ -807,8 +786,7 @@ typedef UINT16 tBTM_BL_EVENT_MASK; #define BTM_EXT_FEATURES_PAGE_MAX HCI_EXT_FEATURES_PAGE_MAX /* the data type associated with BTM_BL_CONN_EVT */ -typedef struct -{ +typedef struct { tBTM_BL_EVENT event; /* The event reported. */ BD_ADDR_PTR p_bda; /* The address of the newly connected device */ DEV_CLASS_PTR p_dc; /* The device class */ @@ -821,8 +799,7 @@ typedef struct } tBTM_BL_CONN_DATA; /* the data type associated with BTM_BL_DISCN_EVT */ -typedef struct -{ +typedef struct { tBTM_BL_EVENT event; /* The event reported. */ BD_ADDR_PTR p_bda; /* The address of the disconnected device */ #if BLE_INCLUDED == TRUE @@ -840,8 +817,7 @@ typedef struct #define BTM_BL_PAGING_STARTED (BTM_BL_INQUIRY_PAGING_MASK | 0x4) #define BTM_BL_PAGING_COMPLETE (BTM_BL_INQUIRY_PAGING_MASK | 0x5) /* the data type associated with BTM_BL_UPDATE_EVT */ -typedef struct -{ +typedef struct { tBTM_BL_EVENT event; /* The event reported. */ UINT8 busy_level;/* when paging or inquiring, level is 10. * Otherwise, the number of ACL links. */ @@ -849,16 +825,14 @@ typedef struct } tBTM_BL_UPDATE_DATA; /* the data type associated with BTM_BL_ROLE_CHG_EVT */ -typedef struct -{ +typedef struct { tBTM_BL_EVENT event; /* The event reported. */ BD_ADDR_PTR p_bda; /* The address of the peer connected device */ UINT8 new_role; UINT8 hci_status; /* HCI status returned with the event */ } tBTM_BL_ROLE_CHG_DATA; -typedef union -{ +typedef union { tBTM_BL_EVENT event; /* The event reported. */ tBTM_BL_CONN_DATA conn; /* The data associated with BTM_BL_CONN_EVT */ tBTM_BL_DISCN_DATA discn; /* The data associated with BTM_BL_DISCN_EVT */ @@ -986,8 +960,7 @@ typedef UINT8 tBTM_SCO_AIR_MODE_TYPE; /******************* ** SCO Data Status ********************/ -enum -{ +enum { BTM_SCO_DATA_CORRECT, BTM_SCO_DATA_PAR_ERR, BTM_SCO_DATA_NONE, @@ -1024,8 +997,7 @@ typedef void (tBTM_SCO_DATA_CB) (UINT16 sco_inx, BT_HDR *p_data, tBTM_SCO_DATA_F typedef UINT8 tBTM_ESCO_EVT; /* Passed into BTM_SetEScoMode() */ -typedef struct -{ +typedef struct { UINT32 tx_bw; UINT32 rx_bw; UINT16 max_latency; @@ -1034,16 +1006,14 @@ typedef struct UINT8 retrans_effort; } tBTM_ESCO_PARAMS; -typedef struct -{ +typedef struct { UINT16 max_latency; UINT16 packet_types; UINT8 retrans_effort; } tBTM_CHG_ESCO_PARAMS; /* Returned by BTM_ReadEScoLinkParms() */ -typedef struct -{ +typedef struct { UINT16 rx_pkt_len; UINT16 tx_pkt_len; BD_ADDR bd_addr; @@ -1053,8 +1023,7 @@ typedef struct UINT8 air_mode; } tBTM_ESCO_DATA; -typedef struct -{ +typedef struct { UINT16 sco_inx; UINT16 rx_pkt_len; UINT16 tx_pkt_len; @@ -1064,16 +1033,14 @@ typedef struct UINT8 retrans_window; } tBTM_CHG_ESCO_EVT_DATA; -typedef struct -{ +typedef struct { UINT16 sco_inx; BD_ADDR bd_addr; DEV_CLASS dev_class; tBTM_SCO_TYPE link_type; } tBTM_ESCO_CONN_REQ_EVT_DATA; -typedef union -{ +typedef union { tBTM_CHG_ESCO_EVT_DATA chg_evt; tBTM_ESCO_CONN_REQ_EVT_DATA conn_evt; } tBTM_ESCO_EVT_DATA; @@ -1328,8 +1295,8 @@ typedef UINT8 tBTM_LINK_KEY_TYPE; ** Result of the operation */ typedef UINT8 (tBTM_AUTHORIZE_CALLBACK) (BD_ADDR bd_addr, DEV_CLASS dev_class, - tBTM_BD_NAME bd_name, UINT8 *service_name, - UINT8 service_id, BOOLEAN is_originator); + tBTM_BD_NAME bd_name, UINT8 *service_name, + UINT8 service_id, BOOLEAN is_originator); /* Get PIN for the connection. Parameters are ** BD Address of remote @@ -1365,10 +1332,9 @@ typedef void (tBTM_RMT_NAME_CALLBACK) (BD_ADDR bd_addr, DEV_CLASS dc, ** */ typedef UINT8 (tBTM_AUTH_COMPLETE_CALLBACK) (BD_ADDR bd_addr, DEV_CLASS dev_class, - tBTM_BD_NAME bd_name, int result); + tBTM_BD_NAME bd_name, int result); -enum -{ +enum { BTM_SP_IO_REQ_EVT, /* received IO_CAPABILITY_REQUEST event */ BTM_SP_IO_RSP_EVT, /* received IO_CAPABILITY_RESPONSE event */ BTM_SP_CFM_REQ_EVT, /* received USER_CONFIRMATION_REQUEST event */ @@ -1421,19 +1387,17 @@ typedef UINT8 tBTM_IO_CAP; typedef UINT8 tBTM_AUTH_REQ; -enum -{ +enum { BTM_OOB_NONE, BTM_OOB_PRESENT #if BTM_OOB_INCLUDED == TRUE - ,BTM_OOB_UNKNOWN + , BTM_OOB_UNKNOWN #endif }; typedef UINT8 tBTM_OOB_DATA; /* data type for BTM_SP_IO_REQ_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ tBTM_IO_CAP io_cap; /* local IO capabilities */ tBTM_OOB_DATA oob_data; /* OOB data present (locally) for the peer device */ @@ -1442,8 +1406,7 @@ typedef struct } tBTM_SP_IO_REQ; /* data type for BTM_SP_IO_RSP_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ tBTM_IO_CAP io_cap; /* peer IO capabilities */ tBTM_OOB_DATA oob_data; /* OOB data present at peer device for the local device */ @@ -1451,8 +1414,7 @@ typedef struct } tBTM_SP_IO_RSP; /* data type for BTM_SP_CFM_REQ_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ tBTM_BD_NAME bd_name; /* peer device name */ @@ -1465,24 +1427,21 @@ typedef struct } tBTM_SP_CFM_REQ; /* data type for BTM_SP_KEY_REQ_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ tBTM_BD_NAME bd_name; /* peer device name */ } tBTM_SP_KEY_REQ; /* data type for BTM_SP_KEY_NOTIF_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ tBTM_BD_NAME bd_name; /* peer device name */ UINT32 passkey; /* passkey */ } tBTM_SP_KEY_NOTIF; -enum -{ +enum { BTM_SP_KEY_STARTED, /* 0 - passkey entry started */ BTM_SP_KEY_ENTERED, /* 1 - passkey digit entered */ BTM_SP_KEY_ERASED, /* 2 - passkey digit erased */ @@ -1493,23 +1452,20 @@ enum typedef UINT8 tBTM_SP_KEY_TYPE; /* data type for BTM_SP_KEYPRESS_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ tBTM_SP_KEY_TYPE notif_type; } tBTM_SP_KEYPRESS; /* data type for BTM_SP_LOC_OOB_EVT */ -typedef struct -{ +typedef struct { tBTM_STATUS status; /* */ BT_OCTET16 c; /* Simple Pairing Hash C */ BT_OCTET16 r; /* Simple Pairing Randomnizer R */ } tBTM_SP_LOC_OOB; /* data type for BTM_SP_RMT_OOB_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ tBTM_BD_NAME bd_name; /* peer device name */ @@ -1517,8 +1473,7 @@ typedef struct /* data type for BTM_SP_COMPLT_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ DEV_CLASS dev_class; /* peer CoD */ tBTM_BD_NAME bd_name; /* peer device name */ @@ -1526,14 +1481,12 @@ typedef struct } tBTM_SP_COMPLT; /* data type for BTM_SP_UPGRADE_EVT */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* peer address */ BOOLEAN upgrade; /* TRUE, to upgrade the link key */ } tBTM_SP_UPGRADE; -typedef union -{ +typedef union { tBTM_SP_IO_REQ io_req; /* BTM_SP_IO_REQ_EVT */ tBTM_SP_IO_RSP io_rsp; /* BTM_SP_IO_RSP_EVT */ tBTM_SP_CFM_REQ cfm_req; /* BTM_SP_CFM_REQ_EVT */ @@ -1561,7 +1514,7 @@ typedef void (tBTM_MKEY_CALLBACK) (BD_ADDR bd_addr, UINT8 status, UINT8 key_flag ** tBTM_STATUS - result of the operation */ typedef void (tBTM_SEC_CBACK) (BD_ADDR bd_addr, tBT_TRANSPORT trasnport, - void *p_ref_data, tBTM_STATUS result); + void *p_ref_data, tBTM_STATUS result); /* Bond Cancel complete. Parameters are ** Result of the cancel operation @@ -1619,8 +1572,7 @@ typedef UINT8 tBTM_LE_AUTH_REQ; typedef UINT8 tBTM_LE_SEC; -typedef struct -{ +typedef struct { tBTM_IO_CAP io_cap; /* local IO capabilities */ UINT8 oob_data; /* OOB data present (locally) for the peer device */ tBTM_LE_AUTH_REQ auth_req; /* Authentication request (for local device) contain bonding and MITM info */ @@ -1631,80 +1583,71 @@ typedef struct #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE /* data type for tBTM_LE_COMPLT */ -typedef struct -{ +typedef struct { UINT8 reason; UINT8 sec_level; BOOLEAN is_pair_cancel; BOOLEAN smp_over_br; -}tBTM_LE_COMPLT; +} tBTM_LE_COMPLT; #endif /* BLE encryption keys */ -typedef struct -{ +typedef struct { BT_OCTET16 ltk; BT_OCTET8 rand; UINT16 ediv; UINT8 sec_level; UINT8 key_size; -}tBTM_LE_PENC_KEYS; +} tBTM_LE_PENC_KEYS; /* BLE CSRK keys */ -typedef struct -{ +typedef struct { UINT32 counter; BT_OCTET16 csrk; UINT8 sec_level; -}tBTM_LE_PCSRK_KEYS; +} tBTM_LE_PCSRK_KEYS; /* BLE Encryption reproduction keys */ -typedef struct -{ +typedef struct { BT_OCTET16 ltk; UINT16 div; UINT8 key_size; UINT8 sec_level; -}tBTM_LE_LENC_KEYS; +} tBTM_LE_LENC_KEYS; /* BLE SRK keys */ -typedef struct -{ +typedef struct { UINT32 counter; UINT16 div; UINT8 sec_level; BT_OCTET16 csrk; -}tBTM_LE_LCSRK_KEYS; +} tBTM_LE_LCSRK_KEYS; -typedef struct -{ +typedef struct { BT_OCTET16 irk; tBLE_ADDR_TYPE addr_type; BD_ADDR static_addr; -}tBTM_LE_PID_KEYS; +} tBTM_LE_PID_KEYS; -typedef union -{ +typedef union { tBTM_LE_PENC_KEYS penc_key; /* received peer encryption key */ tBTM_LE_PCSRK_KEYS pcsrk_key; /* received peer device SRK */ tBTM_LE_PID_KEYS pid_key; /* peer device ID key */ tBTM_LE_LENC_KEYS lenc_key; /* local encryption reproduction keys LTK = = d1(ER,DIV,0)*/ tBTM_LE_LCSRK_KEYS lcsrk_key; /* local device CSRK = d1(ER,DIV,1)*/ -}tBTM_LE_KEY_VALUE; +} tBTM_LE_KEY_VALUE; -typedef struct -{ +typedef struct { tBTM_LE_KEY_TYPE key_type; tBTM_LE_KEY_VALUE *p_key_value; -}tBTM_LE_KEY; +} tBTM_LE_KEY; -typedef union -{ +typedef union { tBTM_LE_IO_REQ io_req; /* BTM_LE_IO_REQ_EVT */ UINT32 key_notif; /* BTM_LE_KEY_NOTIF_EVT */ - /* BTM_LE_NC_REQ_EVT */ - /* no callback data for BTM_LE_KEY_REQ_EVT */ - /* and BTM_LE_OOB_REQ_EVT */ + /* BTM_LE_NC_REQ_EVT */ + /* no callback data for BTM_LE_KEY_REQ_EVT */ + /* and BTM_LE_OOB_REQ_EVT */ #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE tBTM_LE_COMPLT complt; /* BTM_LE_COMPLT_EVT */ tSMP_OOB_DATA_TYPE req_oob_type; @@ -1721,19 +1664,17 @@ typedef UINT8 (tBTM_LE_CALLBACK) (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DA #define BTM_BLE_KEY_TYPE_ER 2 #define BTM_BLE_KEY_TYPE_COUNTER 3 //tobe obsolete -typedef struct -{ +typedef struct { BT_OCTET16 ir; BT_OCTET16 irk; BT_OCTET16 dhk; -}tBTM_BLE_LOCAL_ID_KEYS; +} tBTM_BLE_LOCAL_ID_KEYS; -typedef union -{ +typedef union { tBTM_BLE_LOCAL_ID_KEYS id_keys; BT_OCTET16 er; -}tBTM_BLE_LOCAL_KEYS; +} tBTM_BLE_LOCAL_KEYS; /* New LE identity key for local device. @@ -1745,8 +1686,7 @@ typedef void (tBTM_LE_KEY_CALLBACK) (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key) ** Security Manager Types ****************************/ /* Structure that applications use to register with BTM_SecRegister */ -typedef struct -{ +typedef struct { tBTM_AUTHORIZE_CALLBACK *p_authorize_callback; tBTM_PIN_CALLBACK *p_pin_callback; tBTM_LINK_KEY_CALLBACK *p_link_key_callback; @@ -1773,8 +1713,7 @@ typedef void (tBTM_LSTO_CBACK) (BD_ADDR remote_bda, UINT16 timeout); ** Power Manager Constants *****************************/ /* BTM Power manager status codes */ -enum -{ +enum { BTM_PM_STS_ACTIVE = HCI_MODE_ACTIVE, BTM_PM_STS_HOLD = HCI_MODE_HOLD, BTM_PM_STS_SNIFF = HCI_MODE_SNIFF, @@ -1786,8 +1725,7 @@ enum typedef UINT8 tBTM_PM_STATUS; /* BTM Power manager modes */ -enum -{ +enum { BTM_PM_MD_ACTIVE = BTM_PM_STS_ACTIVE, BTM_PM_MD_HOLD = BTM_PM_STS_HOLD, BTM_PM_MD_SNIFF = BTM_PM_STS_SNIFF, @@ -1806,8 +1744,7 @@ typedef UINT8 tBTM_PM_MODE; /************************ ** Power Manager Types *************************/ -typedef struct -{ +typedef struct { UINT16 max; UINT16 min; UINT16 attempt; @@ -1827,8 +1764,7 @@ typedef void (tBTM_PM_STATUS_CBACK) (BD_ADDR p_bda, tBTM_PM_STATUS status, *************************/ #define BTM_CB_EVT_DELETE_STORED_LINK_KEYS 4 -typedef struct -{ +typedef struct { UINT8 event; UINT8 status; UINT16 num_keys; @@ -1836,8 +1772,7 @@ typedef struct } tBTM_DELETE_STORED_LINK_KEY_COMPLETE; /* MIP evnets, callbacks */ -enum -{ +enum { BTM_MIP_MODE_CHG_EVT, BTM_MIP_DISCONNECT_EVT, BTM_MIP_PKTS_COMPL_EVT, @@ -1845,15 +1780,13 @@ enum }; typedef UINT8 tBTM_MIP_EVT; -typedef struct -{ +typedef struct { tBTM_MIP_EVT event; BD_ADDR bd_addr; UINT16 mip_id; } tBTM_MIP_MODE_CHANGE; -typedef struct -{ +typedef struct { tBTM_MIP_EVT event; UINT16 mip_id; UINT8 disc_reason; @@ -1861,29 +1794,25 @@ typedef struct #define BTM_MIP_MAX_RX_LEN 17 -typedef struct -{ +typedef struct { tBTM_MIP_EVT event; UINT16 mip_id; UINT8 rx_len; UINT8 rx_data[BTM_MIP_MAX_RX_LEN]; } tBTM_MIP_RXDATA; -typedef struct -{ +typedef struct { tBTM_MIP_EVT event; BD_ADDR bd_addr; UINT8 data[11]; /* data[0] shows Vender-specific device type */ } tBTM_MIP_EIR_HANDSHAKE; -typedef struct -{ +typedef struct { tBTM_MIP_EVT event; UINT16 num_sent; /* Number of packets completed at the controller */ } tBTM_MIP_PKTS_COMPL; -typedef union -{ +typedef union { tBTM_MIP_EVT event; tBTM_MIP_MODE_CHANGE mod_chg; tBTM_MIP_CONN_TIMEOUT conn_tmo; @@ -1927,7 +1856,7 @@ extern "C" { ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_DeviceReset (tBTM_CMPL_CB *p_cb); @@ -1940,7 +1869,7 @@ void BTM_DeviceReset (tBTM_CMPL_CB *p_cb); ** Returns TRUE if device is up, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_IsDeviceUp (void); @@ -1953,7 +1882,7 @@ BOOLEAN BTM_IsDeviceUp (void); ** Returns BTM_CMD_STARTED if successful, otherwise an error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetLocalDeviceName (char *p_name); /******************************************************************************* @@ -1965,7 +1894,7 @@ tBTM_STATUS BTM_SetLocalDeviceName (char *p_name); ** Returns BTM_SUCCESS if successful, otherwise an error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class); @@ -1982,7 +1911,7 @@ tBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class); ** is returned and p_name is set to NULL ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name); /******************************************************************************* @@ -1995,7 +1924,7 @@ tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name); ** Returns BTM_CMD_STARTED if successful, otherwise an error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback); /******************************************************************************* @@ -2007,7 +1936,7 @@ tBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cbac ** Returns pointer to the device class ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadDeviceClass (void); @@ -2020,7 +1949,7 @@ UINT8 *BTM_ReadDeviceClass (void); ** Returns pointer to the local features string ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadLocalFeatures (void); /******************************************************************************* @@ -2034,7 +1963,7 @@ UINT8 *BTM_ReadLocalFeatures (void); ** registration. ** *******************************************************************************/ -//extern +//extern tBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb); @@ -2053,7 +1982,7 @@ tBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb); ** registered. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register); @@ -2071,11 +2000,11 @@ tBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register); ** prior command. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, - UINT8 param_len, - UINT8 *p_param_buf, - tBTM_VSC_CMPL_CB *p_cb); + UINT8 param_len, + UINT8 *p_param_buf, + tBTM_VSC_CMPL_CB *p_cb); /******************************************************************************* @@ -2088,7 +2017,7 @@ tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, ** Returns Allocated SCN number or 0 if none. ** *******************************************************************************/ -//extern +//extern UINT8 BTM_AllocateSCN(void); // btla-specific ++ @@ -2101,7 +2030,7 @@ UINT8 BTM_AllocateSCN(void); ** Returns Returns TRUE if server channel was available ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_TryAllocateSCN(UINT8 scn); // btla-specific -- @@ -2115,7 +2044,7 @@ BOOLEAN BTM_TryAllocateSCN(UINT8 scn); ** Returns TRUE if successful, FALSE if SCN is not in use or invalid ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_FreeSCN(UINT8 scn); @@ -2129,7 +2058,7 @@ BOOLEAN BTM_FreeSCN(UINT8 scn); ** Returns The new or current trace level ** *******************************************************************************/ -//extern +//extern UINT8 BTM_SetTraceLevel (UINT8 new_level); @@ -2144,7 +2073,7 @@ UINT8 BTM_SetTraceLevel (UINT8 new_level); ** BTM_NO_RESOURCES If out of resources to send the command. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout); /******************************************************************************* @@ -2160,7 +2089,7 @@ tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout); ** ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings); /******************************************************************************* @@ -2178,7 +2107,7 @@ tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings); ** ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_EnableTestMode(void); @@ -2202,9 +2131,9 @@ tBTM_STATUS BTM_EnableTestMode(void); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, - UINT16 interval); + UINT16 interval); /******************************************************************************* @@ -2221,9 +2150,9 @@ tBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, ** BTM_GENERAL_DISCOVERABLE ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadDiscoverability (UINT16 *p_window, - UINT16 *p_interval); + UINT16 *p_interval); /******************************************************************************* @@ -2253,10 +2182,10 @@ UINT16 BTM_ReadDiscoverability (UINT16 *p_window, ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetPeriodicInquiryMode (tBTM_INQ_PARMS *p_inqparms, - UINT16 max_delay, UINT16 min_delay, - tBTM_INQ_RESULTS_CB *p_results_cb); + UINT16 max_delay, UINT16 min_delay, + tBTM_INQ_RESULTS_CB *p_results_cb); /******************************************************************************* @@ -2288,10 +2217,10 @@ tBTM_STATUS BTM_SetPeriodicInquiryMode (tBTM_INQ_PARMS *p_inqparms, ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, - tBTM_INQ_RESULTS_CB *p_results_cb, - tBTM_CMPL_CB *p_cmpl_cb); + tBTM_INQ_RESULTS_CB *p_results_cb, + tBTM_CMPL_CB *p_cmpl_cb); /******************************************************************************* @@ -2306,7 +2235,7 @@ tBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, ** BTM_PERIODIC_INQUIRY_ACTIVE if a periodic inquiry is active ** *******************************************************************************/ -//extern +//extern UINT16 BTM_IsInquiryActive (void); @@ -2321,7 +2250,7 @@ UINT16 BTM_IsInquiryActive (void); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_CancelInquiry(void); @@ -2337,7 +2266,7 @@ tBTM_STATUS BTM_CancelInquiry(void); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_CancelPeriodicInquiry(void); @@ -2354,9 +2283,9 @@ tBTM_STATUS BTM_CancelPeriodicInquiry(void); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, - UINT16 interval); + UINT16 interval); /******************************************************************************* @@ -2371,7 +2300,7 @@ tBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, ** Returns BTM_NON_CONNECTABLE or BTM_CONNECTABLE ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval); @@ -2391,7 +2320,7 @@ UINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetInquiryMode (UINT8 mode); /******************************************************************************* @@ -2408,7 +2337,7 @@ tBTM_STATUS BTM_SetInquiryMode (UINT8 mode); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type); /******************************************************************************* @@ -2426,7 +2355,7 @@ tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type); ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetPageScanType (UINT16 scan_type); /******************************************************************************* @@ -2451,10 +2380,10 @@ tBTM_STATUS BTM_SetPageScanType (UINT16 scan_type); ** BTM_WRONG_MODE if the device is not up. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, - tBTM_CMPL_CB *p_cb, - tBT_TRANSPORT transport); + tBTM_CMPL_CB *p_cb, + tBT_TRANSPORT transport); /******************************************************************************* @@ -2473,7 +2402,7 @@ tBTM_STATUS BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, ** BTM_WRONG_MODE if there is not an active remote name request. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_CancelRemoteDeviceName (void); /******************************************************************************* @@ -2485,11 +2414,11 @@ tBTM_STATUS BTM_CancelRemoteDeviceName (void); ** Returns BTM_SUCCESS if successful, otherwise an error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, - UINT8 *lmp_version, - UINT16 *manufacturer, - UINT16 *lmp_sub_version); + UINT8 *lmp_version, + UINT16 *manufacturer, + UINT16 *lmp_sub_version); /******************************************************************************* ** @@ -2504,7 +2433,7 @@ tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, ** Returns pointer to the remote supported features mask ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr); /******************************************************************************* @@ -2524,7 +2453,7 @@ UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr); ** or NULL if page_number is not valid ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number); /******************************************************************************* @@ -2537,7 +2466,7 @@ UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number); ** Returns number of features pages read from the remote device ** *******************************************************************************/ -//extern +//extern UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr); /******************************************************************************* @@ -2553,7 +2482,7 @@ UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr); ** BTM_FEATURE_BYTES_PER_PAGE * (BTM_EXT_FEATURES_PAGE_MAX + 1). ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr); /******************************************************************************* @@ -2567,7 +2496,7 @@ UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr); ** Returns pointer to entry, or NULL if not found ** *******************************************************************************/ -//extern +//extern tBTM_INQ_INFO *BTM_InqDbRead (BD_ADDR p_bda); @@ -2583,7 +2512,7 @@ tBTM_INQ_INFO *BTM_InqDbRead (BD_ADDR p_bda); ** Returns pointer to first in-use entry, or NULL if DB is empty ** *******************************************************************************/ -//extern +//extern tBTM_INQ_INFO *BTM_InqDbFirst (void); @@ -2598,7 +2527,7 @@ tBTM_INQ_INFO *BTM_InqDbFirst (void); ** Returns pointer to next in-use entry, or NULL if no more found. ** *******************************************************************************/ -//extern +//extern tBTM_INQ_INFO *BTM_InqDbNext (tBTM_INQ_INFO *p_cur); @@ -2616,7 +2545,7 @@ tBTM_INQ_INFO *BTM_InqDbNext (tBTM_INQ_INFO *p_cur); ** is active, otherwise BTM_SUCCESS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ClearInqDb (BD_ADDR p_bda); /******************************************************************************* @@ -2630,7 +2559,7 @@ tBTM_STATUS BTM_ClearInqDb (BD_ADDR p_bda); ** Returns BTM_SUCCESS if successful ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadInquiryRspTxPower (tBTM_CMPL_CB *p_cb); #if SDP_INCLUDED == TRUE @@ -2649,9 +2578,9 @@ tBTM_STATUS BTM_ReadInquiryRspTxPower (tBTM_CMPL_CB *p_cb); ** BTM_ERR_PROCESSING if err initiating the command ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_StartDiscovery (tBTM_CMPL_CB *p_cmpl_cb, - BD_ADDR_PTR p_rem_addr); + BD_ADDR_PTR p_rem_addr); /******************************************************************************* @@ -2665,9 +2594,9 @@ tBTM_STATUS BTM_StartDiscovery (tBTM_CMPL_CB *p_cmpl_cb, ** Returns Pointer to matching record, or NULL ** *******************************************************************************/ -//extern +//extern tSDP_DISC_REC *BTM_FindAttribute (UINT16 attr_id, - tSDP_DISC_REC *p_start_rec); + tSDP_DISC_REC *p_start_rec); /******************************************************************************* @@ -2681,9 +2610,9 @@ tSDP_DISC_REC *BTM_FindAttribute (UINT16 attr_id, ** Returns Pointer to matching record, or NULL ** *******************************************************************************/ -//extern +//extern tSDP_DISC_REC *BTM_FindService (UINT16 service_uuid, - tSDP_DISC_REC *p_start_rec); + tSDP_DISC_REC *p_start_rec); /******************************************************************************* @@ -2697,9 +2626,9 @@ tSDP_DISC_REC *BTM_FindService (UINT16 service_uuid, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetDiscoveryParams (UINT16 num_uuid, tSDP_UUID *p_uuid_list, - UINT16 num_attr, UINT16 *p_attr_list); + UINT16 num_attr, UINT16 *p_attr_list); #endif /*SDP_INCLUDED*/ /***************************************************************************** @@ -2714,9 +2643,9 @@ void BTM_SetDiscoveryParams (UINT16 num_uuid, tSDP_UUID *p_uuid_list, ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetLinkPolicy (BD_ADDR remote_bda, - UINT16 *settings); + UINT16 *settings); /******************************************************************************* ** @@ -2728,7 +2657,7 @@ tBTM_STATUS BTM_SetLinkPolicy (BD_ADDR remote_bda, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetDefaultLinkPolicy (UINT16 settings); @@ -2742,7 +2671,7 @@ void BTM_SetDefaultLinkPolicy (UINT16 settings); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetDefaultLinkSuperTout (UINT16 timeout); @@ -2755,9 +2684,9 @@ void BTM_SetDefaultLinkSuperTout (UINT16 timeout); ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, - UINT16 timeout); + UINT16 timeout); /******************************************************************************* ** ** Function BTM_GetLinkSuperTout @@ -2767,9 +2696,9 @@ tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, ** Returns status of the operation ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, - UINT16 *p_timeout); + UINT16 *p_timeout); /******************************************************************************* ** @@ -2781,7 +2710,7 @@ tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, ** Returns TRUE if connection is up, else FALSE. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport); @@ -2796,7 +2725,7 @@ BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport); ** BTM_UNKNOWN_ADDR if no active link with bd addr specified ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role); @@ -2817,10 +2746,10 @@ tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role); ** BTM_MODE_UNSUPPORTED if local device does not support role switching ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, - UINT8 new_role, - tBTM_CMPL_CB *p_cb); + UINT8 new_role, + tBTM_CMPL_CB *p_cb); /******************************************************************************* ** @@ -2836,7 +2765,7 @@ tBTM_STATUS BTM_SwitchRole (BD_ADDR remote_bd_addr, ** BTM_BUSY if command is already in progress ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb); @@ -2855,9 +2784,9 @@ tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb); ** BTM_BUSY if command is already in progress ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, - tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb); + tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb); /******************************************************************************* ** @@ -2873,7 +2802,7 @@ tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, ** BTM_BUSY if command is already in progress ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadLinkQuality (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb); /******************************************************************************* @@ -2886,9 +2815,9 @@ tBTM_STATUS BTM_ReadLinkQuality (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb); ** Returns BTM_SUCCESS if successfully registered, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level, - tBTM_BL_EVENT_MASK evt_mask); + tBTM_BL_EVENT_MASK evt_mask); /******************************************************************************* ** @@ -2900,7 +2829,7 @@ tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level, ** Returns BTM_SUCCESS if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_AclRegisterForChanges (tBTM_ACL_DB_CHANGE_CB *p_cb); /******************************************************************************* @@ -2913,7 +2842,7 @@ tBTM_STATUS BTM_AclRegisterForChanges (tBTM_ACL_DB_CHANGE_CB *p_cb); ** Returns UINT16 Number of active ACL links ** *******************************************************************************/ -//extern +//extern UINT16 BTM_GetNumAclLinks (void); /******************************************************************************* @@ -2925,9 +2854,9 @@ UINT16 BTM_GetNumAclLinks (void); ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetQoS(BD_ADDR bd, FLOW_SPEC *p_flow, - tBTM_CMPL_CB *p_cb); + tBTM_CMPL_CB *p_cb); /***************************************************************************** @@ -2950,11 +2879,11 @@ tBTM_STATUS BTM_SetQoS(BD_ADDR bd, FLOW_SPEC *p_flow, ** with the sco index used for the connection. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, - UINT16 pkt_types, UINT16 *p_sco_inx, - tBTM_SCO_CB *p_conn_cb, - tBTM_SCO_CB *p_disc_cb); + UINT16 pkt_types, UINT16 *p_sco_inx, + tBTM_SCO_CB *p_conn_cb, + tBTM_SCO_CB *p_disc_cb); /******************************************************************************* @@ -2966,7 +2895,7 @@ tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx); @@ -2990,7 +2919,7 @@ tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx); ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types); @@ -3012,7 +2941,7 @@ tBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types); ** Returns packet types supported for the connection ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx); @@ -3026,7 +2955,7 @@ UINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx); ** Returns packet types supported by the device. ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadDeviceScoPacketTypes (void); @@ -3040,7 +2969,7 @@ UINT16 BTM_ReadDeviceScoPacketTypes (void); ** Returns handle for the connection, or 0xFFFF if invalid SCO index. ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadScoHandle (UINT16 sco_inx); @@ -3054,7 +2983,7 @@ UINT16 BTM_ReadScoHandle (UINT16 sco_inx); ** Returns pointer to BD address or NULL if not known ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_ReadScoBdAddr (UINT16 sco_inx); @@ -3069,7 +2998,7 @@ UINT8 *BTM_ReadScoBdAddr (UINT16 sco_inx); ** Returns HCI reason or BTM_INVALID_SCO_DISC_REASON if not set. ** *******************************************************************************/ -//extern +//extern UINT16 BTM_ReadScoDiscReason (void); @@ -3086,9 +3015,9 @@ UINT16 BTM_ReadScoDiscReason (void); ** BTM_BUSY if there are one or more active (e)SCO links. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, - tBTM_ESCO_PARAMS *p_parms); + tBTM_ESCO_PARAMS *p_parms); /******************************************************************************* ** @@ -3101,7 +3030,7 @@ tBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, ** ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetWBSCodec (tBTM_SCO_CODEC_TYPE codec_type); /******************************************************************************* @@ -3117,9 +3046,9 @@ tBTM_STATUS BTM_SetWBSCodec (tBTM_SCO_CODEC_TYPE codec_type); ** BTM_ILLEGAL_VALUE if there is an illegal sco_inx ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, - tBTM_ESCO_CBACK *p_esco_cback); + tBTM_ESCO_CBACK *p_esco_cback); /******************************************************************************* ** @@ -3142,9 +3071,9 @@ tBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, ** 1.2 specification. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, - tBTM_ESCO_DATA *p_parms); + tBTM_ESCO_DATA *p_parms); /******************************************************************************* ** @@ -3165,9 +3094,9 @@ tBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, ** 1.2 specification. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, - tBTM_CHG_ESCO_PARAMS *p_parms); + tBTM_CHG_ESCO_PARAMS *p_parms); /******************************************************************************* ** @@ -3187,9 +3116,9 @@ tBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, - tBTM_ESCO_PARAMS *p_parms); + tBTM_ESCO_PARAMS *p_parms); /******************************************************************************* ** @@ -3200,7 +3129,7 @@ void BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, ** Returns UINT8 ** *******************************************************************************/ -//extern +//extern UINT8 BTM_GetNumScoLinks (void); /***************************************************************************** @@ -3217,7 +3146,7 @@ UINT8 BTM_GetNumScoLinks (void); ** Returns TRUE if registered OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecRegister (tBTM_APPL_INFO *p_cb_info); /******************************************************************************* @@ -3230,9 +3159,9 @@ BOOLEAN BTM_SecRegister (tBTM_APPL_INFO *p_cb_info); ** Returns TRUE if registered OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback( - tBTM_LINK_KEY_CALLBACK *p_callback); + tBTM_LINK_KEY_CALLBACK *p_callback); /******************************************************************************* ** @@ -3244,7 +3173,7 @@ BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback( ** Returns TRUE if registered OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback); @@ -3258,7 +3187,7 @@ BOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback); ** Returns TRUE if OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback); /******************************************************************************* @@ -3270,8 +3199,8 @@ BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback); ** Returns BOOLEAN TRUE or FALSE is device found ** *******************************************************************************/ -//extern -BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags); +//extern +BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 *p_sec_flags); /******************************************************************************* ** @@ -3286,9 +3215,9 @@ BOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags); ** Returns BOOLEAN TRUE or FALSE is device found ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, - UINT8 * p_sec_flags, tBT_TRANSPORT transport); + UINT8 *p_sec_flags, tBT_TRANSPORT transport); /******************************************************************************* ** @@ -3300,8 +3229,8 @@ BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, ** otherwise, the trusted mask ** *******************************************************************************/ -//extern -UINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr); +//extern +UINT32 *BTM_ReadTrustedMask (BD_ADDR bd_addr); /******************************************************************************* ** @@ -3312,7 +3241,7 @@ UINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len); @@ -3330,7 +3259,7 @@ void BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired); /******************************************************************************* @@ -3348,7 +3277,7 @@ void BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode); /******************************************************************************* @@ -3363,11 +3292,11 @@ void BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode); ** Returns TRUE if registered OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, - UINT8 service_id, UINT16 sec_level, - UINT16 psm, UINT32 mx_proto_id, - UINT32 mx_chan_id); + UINT8 service_id, UINT16 sec_level, + UINT16 psm, UINT32 mx_proto_id, + UINT32 mx_chan_id); /******************************************************************************* ** @@ -3379,7 +3308,7 @@ BOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id); /******************************************************************************* @@ -3395,7 +3324,7 @@ void BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id); ** Returns Number of records that were freed. ** *******************************************************************************/ -//extern +//extern UINT8 BTM_SecClrService (UINT8 service_id); /******************************************************************************* @@ -3410,11 +3339,11 @@ UINT8 BTM_SecClrService (UINT8 service_id); ** Returns TRUE if added OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, - BD_NAME bd_name, UINT8 *features, - UINT32 trusted_mask[], LINK_KEY link_key, - UINT8 key_type, tBTM_IO_CAP io_cap, UINT8 pin_length); + BD_NAME bd_name, UINT8 *features, + UINT32 trusted_mask[], LINK_KEY link_key, + UINT8 key_type, tBTM_IO_CAP io_cap, UINT8 pin_length); /******************************************************************************* @@ -3426,7 +3355,7 @@ BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, ** Returns TRUE if rmoved OK, FALSE if not found ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr); @@ -3442,9 +3371,9 @@ BOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr); ** Returns BTM_SUCCESS if successful, otherwise error code ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, - LINK_KEY link_key); + LINK_KEY link_key); /******************************************************************************* @@ -3461,7 +3390,7 @@ tBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, ** otherwise. ** *******************************************************************************/ -//extern +//extern tBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr); @@ -3481,9 +3410,9 @@ tBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, - UINT8 *p_pin, UINT32 trusted_mask[]); + UINT8 *p_pin, UINT32 trusted_mask[]); /******************************************************************************* @@ -3500,10 +3429,10 @@ void BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, - UINT8 pin_len, UINT8 *p_pin, - UINT32 trusted_mask[]); + UINT8 pin_len, UINT8 *p_pin, + UINT32 trusted_mask[]); /******************************************************************************* ** @@ -3520,11 +3449,11 @@ tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, - tBT_TRANSPORT transport, - UINT8 pin_len, UINT8 *p_pin, - UINT32 trusted_mask[]); + tBT_TRANSPORT transport, + UINT8 pin_len, UINT8 *p_pin, + UINT32 trusted_mask[]); /******************************************************************************* ** @@ -3536,7 +3465,7 @@ tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, ** Returns BTM_CMD_STARTED if successfully initiated, otherwise error ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr); /******************************************************************************* @@ -3564,9 +3493,9 @@ tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr); ** BTM_MODE_UNSUPPORTED - if security manager not linked in. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, - tBTM_SEC_CBACK *p_callback, void *p_ref_data); + tBTM_SEC_CBACK *p_callback, void *p_ref_data); /******************************************************************************* ** @@ -3579,7 +3508,7 @@ tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, ** bd_addr - Address of the peer device ** *******************************************************************************/ -//extern +//extern void BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr); /******************************************************************************* @@ -3594,7 +3523,7 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr); ** passkey - numeric value in the range of 0 - 999999(0xF423F). ** *******************************************************************************/ -//extern +//extern void BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey); /******************************************************************************* @@ -3611,7 +3540,7 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey); ** type - notification type ** *******************************************************************************/ -//extern +//extern void BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type); /******************************************************************************* @@ -3629,9 +3558,9 @@ void BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type); ** auth_req- MITM protection required or not. ** *******************************************************************************/ -//extern +//extern void BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, - tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req); + tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req); /******************************************************************************* ** @@ -3641,7 +3570,7 @@ void BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, ** LM ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadLocalOobData(void); /******************************************************************************* @@ -3656,9 +3585,9 @@ tBTM_STATUS BTM_ReadLocalOobData(void); ** r - simple pairing Randomizer C. ** *******************************************************************************/ -//extern +//extern void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, - BT_OCTET16 c, BT_OCTET16 r); + BT_OCTET16 c, BT_OCTET16 r); /******************************************************************************* ** @@ -3678,9 +3607,9 @@ void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, ** Returns Number of bytes in p_data. ** *******************************************************************************/ -//extern +//extern UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, - BT_OCTET16 r, UINT8 name_len); + BT_OCTET16 r, UINT8 name_len); /******************************************************************************* ** @@ -3696,7 +3625,7 @@ UINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, ** else FALSE. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr); /******************************************************************************* @@ -3712,7 +3641,7 @@ BOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr); ** else FALSE. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr); /******************************************************************************* @@ -3730,8 +3659,8 @@ BOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr); ** NULL, if the tag is not found. ** *******************************************************************************/ -//extern -UINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len); +//extern +UINT8 *BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len); /******************************************************************************* ** @@ -3743,7 +3672,7 @@ UINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len); ** Returns Pointer to the name or NULL ** *******************************************************************************/ -//extern +//extern char *BTM_SecReadDevName (BD_ADDR bd_addr); @@ -3761,9 +3690,9 @@ char *BTM_SecReadDevName (BD_ADDR bd_addr); ** BTM_ILLEGAL_VALUE ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_PmRegister (UINT8 mask, UINT8 *p_pm_id, - tBTM_PM_STATUS_CBACK *p_cb); + tBTM_PM_STATUS_CBACK *p_cb); /******************************************************************************* @@ -3777,9 +3706,9 @@ tBTM_STATUS BTM_PmRegister (UINT8 mask, UINT8 *p_pm_id, ** BTM_UNKNOWN_ADDR if bd addr is not active or bad ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetPowerMode (UINT8 pm_id, BD_ADDR remote_bda, - tBTM_PM_PWR_MD *p_mode); + tBTM_PM_PWR_MD *p_mode); /******************************************************************************* @@ -3802,9 +3731,9 @@ tBTM_STATUS BTM_SetPowerMode (UINT8 pm_id, BD_ADDR remote_bda, ** BTM_UNKNOWN_ADDR if bd addr is not active or bad ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ReadPowerMode (BD_ADDR remote_bda, - tBTM_PM_MODE *p_mode); + tBTM_PM_MODE *p_mode); /******************************************************************************* ** @@ -3824,9 +3753,9 @@ tBTM_STATUS BTM_ReadPowerMode (BD_ADDR remote_bda, ** BTM_CMD_STORED if the command is stored ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetSsrParams (BD_ADDR remote_bda, UINT16 max_lat, - UINT16 min_rmt_to, UINT16 min_loc_to); + UINT16 min_rmt_to, UINT16 min_loc_to); /******************************************************************************* ** @@ -3838,7 +3767,7 @@ tBTM_STATUS BTM_SetSsrParams (BD_ADDR remote_bda, UINT16 max_lat, ** Returns the handle of the connection, or 0xFFFF if none. ** *******************************************************************************/ -//extern +//extern UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport); /******************************************************************************* @@ -3854,7 +3783,7 @@ UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport); ** the results ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb); /******************************************************************************* @@ -3870,8 +3799,8 @@ tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb); ** BTM_MODE_UNSUPPORTED - if local device cannot support it ** *******************************************************************************/ -//extern -tBTM_STATUS BTM_WriteEIR( BT_HDR * p_buff ); +//extern +tBTM_STATUS BTM_WriteEIR( BT_HDR *p_buff ); /******************************************************************************* ** @@ -3886,7 +3815,7 @@ tBTM_STATUS BTM_WriteEIR( BT_HDR * p_buff ); ** Returns pointer of EIR data ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length ); /******************************************************************************* @@ -3902,7 +3831,7 @@ UINT8 *BTM_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length ); ** FALSE - if not found ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_HasEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); /******************************************************************************* @@ -3919,9 +3848,9 @@ BOOLEAN BTM_HasEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); ** BTM_EIR_UNKNOWN - if not found and it is not complete list ** *******************************************************************************/ -//extern +//extern tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService( tBTM_INQ_RESULTS *p_results, - UINT16 uuid16 ); + UINT16 uuid16 ); /******************************************************************************* ** @@ -3935,7 +3864,7 @@ tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService( tBTM_INQ_RESULTS *p_results, ** Returns None ** *******************************************************************************/ -//extern +//extern void BTM_AddEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); /******************************************************************************* @@ -3950,7 +3879,7 @@ void BTM_AddEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); ** Returns None ** *******************************************************************************/ -//extern +//extern void BTM_RemoveEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); /******************************************************************************* @@ -3968,9 +3897,9 @@ void BTM_RemoveEirService( UINT32 *p_eir_uuid, UINT16 uuid16 ); ** BTM_EIR_COMPLETE_16BITS_UUID_TYPE, otherwise ** *******************************************************************************/ -//extern +//extern UINT8 BTM_GetEirSupportedServices( UINT32 *p_eir_uuid, UINT8 **p, - UINT8 max_num_uuid16, UINT8 *p_num_uuid16); + UINT8 max_num_uuid16, UINT8 *p_num_uuid16); /******************************************************************************* ** @@ -3993,9 +3922,9 @@ UINT8 BTM_GetEirSupportedServices( UINT32 *p_eir_uuid, UINT8 **p, ** BTM_EIR_MORE_128BITS_UUID_TYPE ** *******************************************************************************/ -//extern +//extern UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid, - UINT8 *p_uuid_list, UINT8 max_num_uuid); + UINT8 *p_uuid_list, UINT8 max_num_uuid); /***************************************************************************** ** SCO OVER HCI @@ -4024,11 +3953,11 @@ UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid, ** ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_ConfigScoPath (tBTM_SCO_ROUTE_TYPE path, - tBTM_SCO_DATA_CB *p_sco_data_cb, - tBTM_SCO_PCM_PARAM *p_pcm_param, - BOOLEAN err_data_rpt); + tBTM_SCO_DATA_CB *p_sco_data_cb, + tBTM_SCO_PCM_PARAM *p_pcm_param, + BOOLEAN err_data_rpt); /******************************************************************************* ** @@ -4051,7 +3980,7 @@ tBTM_STATUS BTM_ConfigScoPath (tBTM_SCO_ROUTE_TYPE path, ** ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf); /******************************************************************************* @@ -4063,7 +3992,7 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_SetARCMode (UINT8 iface, UINT8 arc_mode, tBTM_VSC_CMPL_CB *p_arc_cb); @@ -4076,7 +4005,7 @@ void BTM_SetARCMode (UINT8 iface, UINT8 arc_mode, tBTM_VSC_CMPL_CB *p_arc_cb); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_PCM2Setup_Write (BOOLEAN clk_master, tBTM_VSC_CMPL_CB *p_arc_cb); @@ -4089,7 +4018,7 @@ void BTM_PCM2Setup_Write (BOOLEAN clk_master, tBTM_VSC_CMPL_CB *p_arc_cb); ** Returns Controller state (BTM_CONTRL_ACTIVE, BTM_CONTRL_SCAN, and BTM_CONTRL_IDLE) ** *******************************************************************************/ -//extern +//extern tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void); /* #ifdef __cplusplus diff --git a/components/bt/bluedroid/stack/include/btm_ble_api.h b/components/bt/bluedroid/stack/include/btm_ble_api.h old mode 100755 new mode 100644 index 966b85572..2c4d1f1d5 --- a/components/bt/bluedroid/stack/include/btm_ble_api.h +++ b/components/bt/bluedroid/stack/include/btm_ble_api.h @@ -41,7 +41,7 @@ typedef UINT8 tBTM_BLE_CHNL_MAP[CHANNEL_MAP_LEN]; #define BTM_BLE_NON_CONNECT_EVT 0x03 /* Non connectable undirected advertising */ #define BTM_BLE_CONNECT_LO_DUTY_DIR_EVT 0x04 /* Connectable low duty cycle directed advertising */ - /* 0x00 - 0x05 can be received on adv event type */ +/* 0x00 - 0x05 can be received on adv event type */ #define BTM_BLE_SCAN_RSP_EVT 0x04 #define BTM_BLE_SCAN_REQ_EVT 0x05 #define BTM_BLE_UNKNOWN_EVT 0xff @@ -91,14 +91,14 @@ typedef UINT8 tBTM_BLE_AFP; /* scanning filter policy */ #define SP_ADV_ALL 0x00 /* 0: accept adv packet from all, directed adv pkt not directed */ - /* to local device is ignored */ +/* to local device is ignored */ #define SP_ADV_WL 0x01 /* 1: accept adv packet from device in white list, directed adv */ - /* packet not directed to local device is ignored */ +/* packet not directed to local device is ignored */ #define SP_ADV_ALL_RPA_DIR_ADV 0x02 /* 2: accept adv packet from all, directed adv pkt */ - /* not directed to me is ignored except direct adv with RPA */ +/* not directed to me is ignored except direct adv with RPA */ #define SP_ADV_WL_RPA_DIR_ADV 0x03 /* 3: accept adv packet from device in white list, directed */ - /* adv pkt not directed to me is ignored except direct adv */ - /* with RPA */ +/* adv pkt not directed to me is ignored except direct adv */ +/* with RPA */ typedef UINT8 tBTM_BLE_SFP; #ifndef BTM_BLE_DEFAULT_SFP @@ -259,8 +259,7 @@ typedef UINT8 BLE_SIGNATURE[BTM_BLE_AUTH_SIGN_LEN]; /* Device address */ /* Structure returned with Rand/Encrypt complete callback */ -typedef struct -{ +typedef struct { UINT8 status; UINT8 param_len; UINT16 opcode; @@ -363,8 +362,7 @@ typedef UINT8 tBTM_BLE_AD_TYPE; typedef UINT8 tBTM_BLE_ADV_TX_POWER; /* adv tx power in dBm */ -typedef struct -{ +typedef struct { UINT8 adv_inst_max; /* max adv instance supported in controller */ UINT8 rpa_offloading; UINT16 tot_scan_results_strg; @@ -377,68 +375,59 @@ typedef struct UINT16 total_trackable_advertisers; UINT8 extended_scan_support; UINT8 debug_logging_supported; -}tBTM_BLE_VSC_CB; +} tBTM_BLE_VSC_CB; /* slave preferred connection interval range */ -typedef struct -{ +typedef struct { UINT16 low; UINT16 hi; -}tBTM_BLE_INT_RANGE; +} tBTM_BLE_INT_RANGE; /* Service tag supported in the device */ -typedef struct -{ +typedef struct { UINT8 num_service; BOOLEAN list_cmpl; UINT16 *p_uuid; -}tBTM_BLE_SERVICE; +} tBTM_BLE_SERVICE; /* 32 bits Service supported in the device */ -typedef struct -{ +typedef struct { UINT8 num_service; BOOLEAN list_cmpl; UINT32 *p_uuid; -}tBTM_BLE_32SERVICE; +} tBTM_BLE_32SERVICE; /* 128 bits Service supported in the device */ -typedef struct -{ +typedef struct { BOOLEAN list_cmpl; UINT8 uuid128[MAX_UUID_SIZE]; -}tBTM_BLE_128SERVICE; +} tBTM_BLE_128SERVICE; -typedef struct -{ +typedef struct { UINT8 len; UINT8 *p_val; -}tBTM_BLE_MANU; +} tBTM_BLE_MANU; -typedef struct -{ +typedef struct { tBT_UUID service_uuid; UINT8 len; UINT8 *p_val; -}tBTM_BLE_SERVICE_DATA; +} tBTM_BLE_SERVICE_DATA; -typedef struct -{ +typedef struct { UINT8 adv_type; UINT8 len; UINT8 *p_val; /* number of len byte */ -}tBTM_BLE_PROP_ELEM; +} tBTM_BLE_PROP_ELEM; -typedef struct -{ +typedef struct { UINT8 num_elem; tBTM_BLE_PROP_ELEM *p_elem; -}tBTM_BLE_PROPRIETARY; +} tBTM_BLE_PROPRIETARY; -typedef struct -{ +typedef struct { tBTM_BLE_INT_RANGE int_range; /* slave prefered conn interval range */ tBTM_BLE_MANU *p_manu; /* manufactuer data */ tBTM_BLE_SERVICE *p_services; /* services */ @@ -452,7 +441,7 @@ typedef struct UINT16 appearance; UINT8 flag; UINT8 tx_power; -}tBTM_BLE_ADV_DATA; +} tBTM_BLE_ADV_DATA; #ifndef BTM_BLE_MULTI_ADV_MAX #define BTM_BLE_MULTI_ADV_MAX 16 /* controller returned adv_inst_max should be less @@ -469,29 +458,26 @@ typedef UINT8 tBTM_BLE_MULTI_ADV_EVT; #define BTM_BLE_MULTI_ADV_DEFAULT_STD 0 -typedef struct -{ +typedef struct { UINT16 adv_int_min; UINT16 adv_int_max; UINT8 adv_type; tBTM_BLE_ADV_CHNL_MAP channel_map; tBTM_BLE_AFP adv_filter_policy; tBTM_BLE_ADV_TX_POWER tx_power; -}tBTM_BLE_ADV_PARAMS; +} tBTM_BLE_ADV_PARAMS; -typedef struct -{ +typedef struct { UINT8 *p_sub_code; /* dynamic array to store sub code */ UINT8 *p_inst_id; /* dynamic array to store instance id */ UINT8 pending_idx; UINT8 next_idx; -}tBTM_BLE_MULTI_ADV_OPQ; +} tBTM_BLE_MULTI_ADV_OPQ; typedef void (tBTM_BLE_MULTI_ADV_CBACK)(tBTM_BLE_MULTI_ADV_EVT evt, UINT8 inst_id, - void *p_ref, tBTM_STATUS status); + void *p_ref, tBTM_STATUS status); -typedef struct -{ +typedef struct { UINT8 inst_id; BOOLEAN in_use; UINT8 adv_evt; @@ -500,27 +486,25 @@ typedef struct tBTM_BLE_MULTI_ADV_CBACK *p_cback; void *p_ref; UINT8 index; -}tBTM_BLE_MULTI_ADV_INST; +} tBTM_BLE_MULTI_ADV_INST; -typedef struct -{ +typedef struct { UINT8 inst_index_queue[BTM_BLE_MULTI_ADV_MAX]; int front; int rear; -}tBTM_BLE_MULTI_ADV_INST_IDX_Q; +} tBTM_BLE_MULTI_ADV_INST_IDX_Q; -typedef struct -{ +typedef struct { tBTM_BLE_MULTI_ADV_INST *p_adv_inst; /* dynamic array to store adv instance */ tBTM_BLE_MULTI_ADV_OPQ op_q; -}tBTM_BLE_MULTI_ADV_CB; +} tBTM_BLE_MULTI_ADV_CB; typedef UINT8 tGATT_IF; typedef void (tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value); typedef void (tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, UINT8 report_format, UINT8 num_records, UINT16 total_len, - UINT8* p_rep_data, UINT8 status); + UINT8 *p_rep_data, UINT8 status); typedef void (tBTM_BLE_SCAN_SETUP_CBACK)(UINT8 evt, tBTM_BLE_REF_VALUE ref_value, UINT8 status); #ifndef BTM_BLE_BATCH_SCAN_MAX @@ -531,33 +515,29 @@ typedef void (tBTM_BLE_SCAN_SETUP_CBACK)(UINT8 evt, tBTM_BLE_REF_VALUE ref_value #define BTM_BLE_BATCH_REP_MAIN_Q_SIZE 2 #endif -typedef enum -{ - BTM_BLE_SCAN_INVALID_STATE=0, - BTM_BLE_SCAN_ENABLE_CALLED=1, - BTM_BLE_SCAN_ENABLED_STATE=2, - BTM_BLE_SCAN_DISABLE_CALLED=3, - BTM_BLE_SCAN_DISABLED_STATE=4 -}tBTM_BLE_BATCH_SCAN_STATE; +typedef enum { + BTM_BLE_SCAN_INVALID_STATE = 0, + BTM_BLE_SCAN_ENABLE_CALLED = 1, + BTM_BLE_SCAN_ENABLED_STATE = 2, + BTM_BLE_SCAN_DISABLE_CALLED = 3, + BTM_BLE_SCAN_DISABLED_STATE = 4 +} tBTM_BLE_BATCH_SCAN_STATE; -enum -{ +enum { BTM_BLE_DISCARD_OLD_ITEMS, BTM_BLE_DISCARD_LOWER_RSSI_ITEMS }; typedef UINT8 tBTM_BLE_DISCARD_RULE; -typedef struct -{ +typedef struct { UINT8 sub_code[BTM_BLE_BATCH_SCAN_MAX]; tBTM_BLE_BATCH_SCAN_STATE cur_state[BTM_BLE_BATCH_SCAN_MAX]; tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_SCAN_MAX]; UINT8 pending_idx; UINT8 next_idx; -}tBTM_BLE_BATCH_SCAN_OPQ; +} tBTM_BLE_BATCH_SCAN_OPQ; -typedef struct -{ +typedef struct { UINT8 rep_mode[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; UINT8 num_records[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; @@ -565,10 +545,9 @@ typedef struct UINT8 *p_data[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; UINT8 pending_idx; UINT8 next_idx; -}tBTM_BLE_BATCH_SCAN_REP_Q; +} tBTM_BLE_BATCH_SCAN_REP_Q; -typedef struct -{ +typedef struct { tBTM_BLE_BATCH_SCAN_STATE cur_state; tBTM_BLE_BATCH_SCAN_MODE scan_mode; UINT32 scan_interval; @@ -581,7 +560,7 @@ typedef struct tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback; tBTM_BLE_SCAN_REP_CBACK *p_scan_rep_cback; tBTM_BLE_REF_VALUE ref_value; -}tBTM_BLE_BATCH_SCAN_CB; +} tBTM_BLE_BATCH_SCAN_CB; /* filter selection bit index */ #define BTM_BLE_PF_ADDR_FILTER 0 @@ -645,8 +624,7 @@ typedef UINT16 tBTM_BLE_PF_TIMEOUT; typedef UINT8 tBTM_BLE_PF_TIMEOUT_CNT; typedef UINT16 tBTM_BLE_PF_ADV_TRACK_ENTRIES; -typedef struct -{ +typedef struct { tBTM_BLE_PF_FEAT_SEL feat_seln; tBTM_BLE_PF_LIST_LOGIC_TYPE logic_type; tBTM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type; @@ -657,18 +635,16 @@ typedef struct tBTM_BLE_PF_TIMEOUT lost_timeout; tBTM_BLE_PF_TIMEOUT_CNT found_timeout_cnt; tBTM_BLE_PF_ADV_TRACK_ENTRIES num_of_tracking_entries; -}tBTM_BLE_PF_FILT_PARAMS; +} tBTM_BLE_PF_FILT_PARAMS; -enum -{ +enum { BTM_BLE_SCAN_COND_ADD, BTM_BLE_SCAN_COND_DELETE, BTM_BLE_SCAN_COND_CLEAR = 2 }; typedef UINT8 tBTM_BLE_SCAN_COND_OP; -enum -{ +enum { BTM_BLE_FILT_ENABLE_DISABLE = 1, BTM_BLE_FILT_CFG = 2, BTM_BLE_FILT_ADV_PARAM = 3 @@ -685,36 +661,32 @@ typedef void (tBTM_BLE_PF_CMPL_CBACK) (tBTM_BLE_PF_CFG_CBACK); /* BLE adv payload filtering status setup complete callback */ typedef void (tBTM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTM_STATUS status, - tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_REF_VALUE ref_value); /* BLE adv payload filtering param setup complete callback */ typedef void (tBTM_BLE_PF_PARAM_CBACK) (tBTM_BLE_PF_ACTION action_type, tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_BLE_REF_VALUE ref_value, tBTM_STATUS status); -typedef union -{ - UINT16 uuid16_mask; - UINT32 uuid32_mask; - UINT8 uuid128_mask[LEN_UUID_128]; -}tBTM_BLE_PF_COND_MASK; +typedef union { + UINT16 uuid16_mask; + UINT32 uuid32_mask; + UINT8 uuid128_mask[LEN_UUID_128]; +} tBTM_BLE_PF_COND_MASK; -typedef struct -{ +typedef struct { tBLE_BD_ADDR *p_target_addr; /* target address, if NULL, generic UUID filter */ tBT_UUID uuid; /* UUID condition */ tBTM_BLE_PF_LOGIC_TYPE cond_logic; /* AND/OR */ tBTM_BLE_PF_COND_MASK *p_uuid_mask; /* UUID mask */ -}tBTM_BLE_PF_UUID_COND; +} tBTM_BLE_PF_UUID_COND; -typedef struct -{ +typedef struct { UINT8 data_len; /* <= 20 bytes */ UINT8 *p_data; -}tBTM_BLE_PF_LOCAL_NAME_COND; +} tBTM_BLE_PF_LOCAL_NAME_COND; -typedef struct -{ +typedef struct { UINT16 company_id; /* company ID */ UINT8 data_len; /* <= 20 bytes */ UINT8 *p_pattern; @@ -722,30 +694,27 @@ typedef struct UINT8 *p_pattern_mask; /* Manufacturer data matching mask, same length as data pattern, set to all 0xff, match exact data */ -}tBTM_BLE_PF_MANU_COND; +} tBTM_BLE_PF_MANU_COND; -typedef struct -{ +typedef struct { UINT16 uuid; /* service ID */ UINT8 data_len; /* <= 20 bytes */ UINT8 *p_pattern; UINT8 *p_pattern_mask; /* Service data matching mask, same length as data pattern, set to all 0xff, match exact data */ -}tBTM_BLE_PF_SRVC_PATTERN_COND; +} tBTM_BLE_PF_SRVC_PATTERN_COND; -typedef union -{ +typedef union { tBLE_BD_ADDR target_addr; tBTM_BLE_PF_LOCAL_NAME_COND local_name; /* lcoal name filtering */ tBTM_BLE_PF_MANU_COND manu_data; /* manufactuer data filtering */ tBTM_BLE_PF_UUID_COND srvc_uuid; /* service UUID filtering */ tBTM_BLE_PF_UUID_COND solicitate_uuid; /* solicitated service UUID filtering */ tBTM_BLE_PF_SRVC_PATTERN_COND srvc_data; /* service data pattern */ -}tBTM_BLE_PF_COND_PARAM; +} tBTM_BLE_PF_COND_PARAM; -typedef struct -{ +typedef struct { UINT8 action_ocf[BTM_BLE_PF_TYPE_MAX]; tBTM_BLE_REF_VALUE ref_value[BTM_BLE_PF_TYPE_MAX]; tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback[BTM_BLE_PF_TYPE_MAX]; @@ -753,7 +722,7 @@ typedef struct UINT8 cb_evt[BTM_BLE_PF_TYPE_MAX]; UINT8 pending_idx; UINT8 next_idx; -}tBTM_BLE_ADV_FILTER_ADV_OPQ; +} tBTM_BLE_ADV_FILTER_ADV_OPQ; #define BTM_BLE_MAX_FILTER_COUNTER (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */ @@ -761,22 +730,20 @@ typedef struct #define BTM_CS_IRK_LIST_MAX 0x20 #endif -typedef struct -{ +typedef struct { BOOLEAN in_use; BD_ADDR bd_addr; UINT8 pf_counter[BTM_BLE_PF_TYPE_MAX]; /* number of filter indexed by tBTM_BLE_PF_COND_TYPE */ -}tBTM_BLE_PF_COUNT; +} tBTM_BLE_PF_COUNT; -typedef struct -{ +typedef struct { BOOLEAN enable; UINT8 op_type; tBTM_BLE_PF_COUNT *p_addr_filter_count; /* per BDA filter array */ tBLE_BD_ADDR cur_filter_target; tBTM_BLE_PF_STATUS_CBACK *p_filt_stat_cback; tBTM_BLE_ADV_FILTER_ADV_OPQ op_q; -}tBTM_BLE_ADV_FILTER_CB; +} tBTM_BLE_ADV_FILTER_CB; /* Sub codes */ #define BTM_BLE_META_PF_ENABLE 0x00 @@ -797,8 +764,7 @@ typedef UINT16 BTM_BLE_ADV_INFO_TIMESTAMP; /* These are the fields returned in each device adv packet. It ** is returned in the results callback if registered. */ -typedef struct -{ +typedef struct { UINT8 conn_mode; tBTM_BLE_AD_MASK ad_mask; /* mask of the valid adv data field */ UINT8 flag; @@ -808,8 +774,7 @@ typedef struct tBTM_BLE_SERVICE service; } tBTM_BLE_INQ_DATA; -enum -{ +enum { BTM_BLE_CONN_NONE, BTM_BLE_CONN_AUTO, BTM_BLE_CONN_SELECTIVE @@ -825,14 +790,12 @@ typedef void (tBTM_BLE_TRACK_ADV_CBACK)(tBTM_BLE_TRACK_ADV_DATA *p_track_adv_dat typedef UINT8 tBTM_BLE_TRACK_ADV_EVT; -typedef struct -{ +typedef struct { tBTM_BLE_REF_VALUE ref_value; tBTM_BLE_TRACK_ADV_CBACK *p_track_cback; -}tBTM_BLE_ADV_TRACK_CB; +} tBTM_BLE_ADV_TRACK_CB; -enum -{ +enum { BTM_BLE_TRACK_ADV_ADD, BTM_BLE_TRACK_ADV_REMOVE }; @@ -856,14 +819,13 @@ typedef UINT32 tBTM_BLE_IDLE_TIME_MS; typedef UINT32 tBTM_BLE_ENERGY_USED; typedef void (tBTM_BLE_ENERGY_INFO_CBACK)(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_RX_TIME_MS rx_time, - tBTM_BLE_IDLE_TIME_MS idle_time, - tBTM_BLE_ENERGY_USED energy_used, - tBTM_STATUS status); + tBTM_BLE_IDLE_TIME_MS idle_time, + tBTM_BLE_ENERGY_USED energy_used, + tBTM_STATUS status); -typedef struct -{ +typedef struct { tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback; -}tBTM_BLE_ENERGY_INFO_CB; +} tBTM_BLE_ENERGY_INFO_CB; typedef BOOLEAN (tBTM_BLE_SEL_CBACK)(BD_ADDR random_bda, UINT8 *p_remote_name); typedef void (tBTM_BLE_CTRL_FEATURES_CBACK)(tBTM_STATUS status); @@ -903,9 +865,9 @@ extern "C" { ** Returns TRUE if added OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, - tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type); + tBT_DEVICE_TYPE dev_type, tBLE_ADDR_TYPE addr_type); /******************************************************************************* ** @@ -922,9 +884,9 @@ BOOLEAN BTM_SecAddBleDevice (BD_ADDR bd_addr, BD_NAME bd_name, ** Returns TRUE if added OK, else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_SecAddBleKey (BD_ADDR bd_addr, tBTM_LE_KEY_VALUE *p_le_key, - tBTM_LE_KEY_TYPE key_type); + tBTM_LE_KEY_TYPE key_type); /******************************************************************************* ** @@ -937,9 +899,9 @@ BOOLEAN BTM_SecAddBleKey (BD_ADDR bd_addr, tBTM_LE_KEY_VALUE *p_le_key, ** Returns void ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, - tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP chnl_map); + tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP chnl_map); @@ -955,8 +917,8 @@ tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max, ** *******************************************************************************/ tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max, UINT8 adv_type, - tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda, - tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp); + tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda, + tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp); /******************************************************************************* @@ -970,9 +932,9 @@ tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max, ** Returns void ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, - tBTM_BLE_ADV_DATA *p_data); + tBTM_BLE_ADV_DATA *p_data); BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr); @@ -991,9 +953,9 @@ BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max, - tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map); + tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map); /******************************************************************************* ** @@ -1006,7 +968,7 @@ void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleObtainVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb); /******************************************************************************* @@ -1024,10 +986,10 @@ void BTM_BleObtainVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, - UINT32 scan_window, tBLE_SCAN_MODE scan_type, - tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback); + UINT32 scan_window, tBLE_SCAN_MODE scan_type, + tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback); @@ -1041,16 +1003,16 @@ void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, ** scan_interval - Scan interval ** scan_window - Scan window ** scan_type - Scan type -** addr_type_own - owner address type -** scan_filter_policy - scan filter policy +** addr_type_own - owner address type +** scan_filter_policy - scan filter policy ** scan_setup_status_cback - Scan setup status callback ** ** Returns void ** *******************************************************************************/ void BTM_BleSetScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window, - tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, tBTM_BLE_SFP scan_filter_policy, - tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback); + tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, tBTM_BLE_SFP scan_filter_policy, + tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback); /******************************************************************************* @@ -1064,7 +1026,7 @@ void BTM_BleSetScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb); /******************************************************************************* ** @@ -1082,14 +1044,14 @@ void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb); ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, - UINT8 batch_scan_trunc_max, - UINT8 batch_scan_notify_threshold, - tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback, - tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, - tBTM_BLE_SCAN_REP_CBACK* p_cback, - tBTM_BLE_REF_VALUE ref_value); + UINT8 batch_scan_trunc_max, + UINT8 batch_scan_notify_threshold, + tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback, + tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, + tBTM_BLE_SCAN_REP_CBACK *p_cback, + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1106,12 +1068,12 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - UINT32 scan_interval, UINT32 scan_window, - tBTM_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value); + UINT32 scan_interval, UINT32 scan_window, + tBTM_BLE_DISCARD_RULE discard_rule, + tBLE_ADDR_TYPE addr_type, + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1124,7 +1086,7 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, ** Returns void ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* @@ -1139,9 +1101,9 @@ tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value); ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1155,9 +1117,9 @@ tBTM_STATUS BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode, ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback, - tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1170,9 +1132,9 @@ tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback, ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, - tBTM_BLE_ADV_DATA *p_data); + tBTM_BLE_ADV_DATA *p_data); /******************************************************************************* ** @@ -1186,9 +1148,9 @@ tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, ** Returns void ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration, - tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb); + tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb); /******************************************************************************* @@ -1202,7 +1164,7 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration, ** the local device ER is copied into er ** *******************************************************************************/ -//extern +//extern void BTM_GetDeviceIDRoot (BT_OCTET16 ir); /******************************************************************************* @@ -1216,7 +1178,7 @@ void BTM_GetDeviceIDRoot (BT_OCTET16 ir); ** the local device ER is copied into er ** *******************************************************************************/ -//extern +//extern void BTM_GetDeviceEncRoot (BT_OCTET16 er); /******************************************************************************* @@ -1229,7 +1191,7 @@ void BTM_GetDeviceEncRoot (BT_OCTET16 er); ** the local device DHK is copied into dhk ** *******************************************************************************/ -//extern +//extern void BTM_GetDeviceDHK (BT_OCTET16 dhk); /******************************************************************************* @@ -1245,7 +1207,7 @@ void BTM_GetDeviceDHK (BT_OCTET16 dhk); ** Returns None ** *******************************************************************************/ -//extern +//extern void BTM_SecurityGrant(BD_ADDR bd_addr, UINT8 res); /******************************************************************************* @@ -1261,7 +1223,7 @@ void BTM_SecurityGrant(BD_ADDR bd_addr, UINT8 res); ** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). ** *******************************************************************************/ -//extern +//extern void BTM_BlePasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey); /******************************************************************************* @@ -1276,7 +1238,7 @@ void BTM_BlePasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey); ** res - comparison result BTM_SUCCESS if success ** *******************************************************************************/ -//extern +//extern void BTM_BleConfirmReply (BD_ADDR bd_addr, UINT8 res); /******************************************************************************* @@ -1291,7 +1253,7 @@ void BTM_BleConfirmReply (BD_ADDR bd_addr, UINT8 res); ** p_data - simple pairing Randomizer C. ** *******************************************************************************/ -//extern +//extern void BTM_BleOobDataReply(BD_ADDR bd_addr, UINT8 res, UINT8 len, UINT8 *p_data); @@ -1311,9 +1273,9 @@ void BTM_BleOobDataReply(BD_ADDR bd_addr, UINT8 res, UINT8 len, UINT8 *p_data); ** Returns TRUE if signing sucessul, otherwise FALSE. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len, - BLE_SIGNATURE signature); + BLE_SIGNATURE signature); /******************************************************************************* ** @@ -1330,10 +1292,10 @@ BOOLEAN BTM_BleDataSignature (BD_ADDR bd_addr, UINT8 *p_text, UINT16 len, ** Returns TRUE if signature verified correctly; otherwise FALSE. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleVerifySignature (BD_ADDR bd_addr, UINT8 *p_orig, - UINT16 len, UINT32 counter, - UINT8 *p_comp); + UINT16 len, UINT32 counter, + UINT8 *p_comp); /******************************************************************************* ** @@ -1345,9 +1307,9 @@ BOOLEAN BTM_BleVerifySignature (BD_ADDR bd_addr, UINT8 *p_orig, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, - tBLE_ADDR_TYPE *p_addr_type); + tBLE_ADDR_TYPE *p_addr_type); @@ -1361,10 +1323,10 @@ void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, ** Returns void ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, - BD_ADDR conn_addr, - tBLE_ADDR_TYPE *p_addr_type); + BD_ADDR conn_addr, + tBLE_ADDR_TYPE *p_addr_type); /******************************************************************************* ** @@ -1379,7 +1341,7 @@ BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, ** Returns non2. ** *******************************************************************************/ -//extern +//extern void BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key); @@ -1397,9 +1359,9 @@ void BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key); ** Returns void ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE conn_type, - tBTM_BLE_SEL_CBACK *p_select_cback); + tBTM_BLE_SEL_CBACK *p_select_cback); /******************************************************************************* ** @@ -1416,7 +1378,7 @@ BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE conn_type, ** Returns void ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda); /******************************************************************************* @@ -1432,7 +1394,7 @@ BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleClearBgConnDev(void); /******************************************************** @@ -1453,10 +1415,10 @@ void BTM_BleClearBgConnDev(void); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleSetPrefConnParams (BD_ADDR bd_addr, - UINT16 min_conn_int, UINT16 max_conn_int, - UINT16 slave_latency, UINT16 supervision_tout); + UINT16 min_conn_int, UINT16 max_conn_int, + UINT16 slave_latency, UINT16 supervision_tout); /****************************************************************************** ** @@ -1470,7 +1432,7 @@ void BTM_BleSetPrefConnParams (BD_ADDR bd_addr, ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleSetConnScanParams (UINT32 scan_interval, UINT32 scan_window); /****************************************************************************** @@ -1484,7 +1446,7 @@ void BTM_BleSetConnScanParams (UINT32 scan_interval, UINT32 scan_window); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback); /******************************************************************************* @@ -1500,7 +1462,7 @@ void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback); ** Returns pointer of ADV data ** *******************************************************************************/ -//extern +//extern UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length); /******************************************************************************* @@ -1526,7 +1488,7 @@ UINT16 BTM_BleReadDiscoverability(); ** Returns BTM_BLE_NON_CONNECTABLE or BTM_BLE_CONNECTABLE ** *******************************************************************************/ -//extern +//extern UINT16 BTM_BleReadConnectability (); /******************************************************************************* @@ -1541,9 +1503,9 @@ UINT16 BTM_BleReadConnectability (); ** p_addr_type: output parameter to read the address type. ** *******************************************************************************/ -//extern +//extern void BTM_ReadDevInfo (BD_ADDR remote_bda, tBT_DEVICE_TYPE *p_dev_type, - tBLE_ADDR_TYPE *p_addr_type); + tBLE_ADDR_TYPE *p_addr_type); /******************************************************************************* @@ -1559,9 +1521,9 @@ void BTM_ReadDevInfo (BD_ADDR remote_bda, tBT_DEVICE_TYPE *p_dev_type, ** Return TRUE if an active link is identified; FALSE otherwise ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_ReadConnectedTransportAddress(BD_ADDR remote_bda, - tBT_TRANSPORT transport); + tBT_TRANSPORT transport); /******************************************************************************* ** @@ -1574,7 +1536,7 @@ BOOLEAN BTM_ReadConnectedTransportAddress(BD_ADDR remote_bda, ** Returns status. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleBroadcast(BOOLEAN start); /******************************************************************************* @@ -1589,7 +1551,7 @@ tBTM_STATUS BTM_BleBroadcast(BOOLEAN start); ** Returns BOOLEAN privacy mode set success; otherwise failed. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleConfigPrivacy(BOOLEAN enable); /******************************************************************************* @@ -1601,7 +1563,7 @@ BOOLEAN BTM_BleConfigPrivacy(BOOLEAN enable); ** Returns Return TRUE if local privacy is enabled else FALSE ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleLocalPrivacyEnabled(void); /******************************************************************************* @@ -1616,7 +1578,7 @@ BOOLEAN BTM_BleLocalPrivacyEnabled(void); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleEnableMixedPrivacyMode(BOOLEAN mixed_on); /******************************************************************************* @@ -1628,7 +1590,7 @@ void BTM_BleEnableMixedPrivacyMode(BOOLEAN mixed_on); ** Returns Max multi adv instance count ** *******************************************************************************/ -//extern +//extern UINT8 BTM_BleMaxMultiAdvInstanceCount(); /******************************************************************************* @@ -1646,7 +1608,7 @@ UINT8 BTM_BleMaxMultiAdvInstanceCount(); ** BTM_SUCCESS is status set successfully; otherwise failure. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode); /******************************************************************************* @@ -1662,9 +1624,9 @@ tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode); ** Returns void ** *******************************************************************************/ -//extern +//extern void BTM_BleTurnOnPrivacyOnRemote(BD_ADDR bd_addr, - BOOLEAN privacy_on); + BOOLEAN privacy_on); /******************************************************************************* ** @@ -1675,7 +1637,7 @@ void BTM_BleTurnOnPrivacyOnRemote(BD_ADDR bd_addr, ** Returns void ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR emote_bda); /******************************************************************************* @@ -1688,7 +1650,7 @@ BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR emote_bda); ** ** Return void *******************************************************************************/ -//extern +//extern void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy); /******************************************************************************* @@ -1717,7 +1679,7 @@ void BTM_BleReceiverTest(UINT8 rx_freq, tBTM_CMPL_CB *p_cmd_cmpl_cback); ** *******************************************************************************/ void BTM_BleTransmitterTest(UINT8 tx_freq, UINT8 test_data_len, - UINT8 packet_payload, tBTM_CMPL_CB *p_cmd_cmpl_cback); + UINT8 packet_payload, tBTM_CMPL_CB *p_cmd_cmpl_cback); /******************************************************************************* ** @@ -1739,7 +1701,7 @@ void BTM_BleTestEnd(tBTM_CMPL_CB *p_cmd_cmpl_cback); ** Returns TRUE to use LE, FALSE use BR/EDR. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_UseLeLink (BD_ADDR bd_addr); /******************************************************************************* @@ -1754,7 +1716,7 @@ BOOLEAN BTM_UseLeLink (BD_ADDR bd_addr); ** Returns TRUE if added OK, else FALSE ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleStackEnable (BOOLEAN enable); /******************************************************************************* @@ -1767,10 +1729,10 @@ tBTM_STATUS BTM_BleStackEnable (BOOLEAN enable); ** Returns BOOLEAN TRUE if LE device is found, FALSE otherwise. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_GetLeSecurityState (BD_ADDR bd_addr, - UINT8 *p_le_dev_sec_flags, - UINT8 *p_le_key_size); + UINT8 *p_le_dev_sec_flags, + UINT8 *p_le_key_size); /******************************************************************************* ** @@ -1782,7 +1744,7 @@ BOOLEAN BTM_GetLeSecurityState (BD_ADDR bd_addr, ** Returns BOOLEAN TRUE if security procedure is running, FALSE otherwise. ** *******************************************************************************/ -//extern +//extern BOOLEAN BTM_BleSecurityProcedureIsRunning (BD_ADDR bd_addr); /******************************************************************************* @@ -1796,7 +1758,7 @@ BOOLEAN BTM_BleSecurityProcedureIsRunning (BD_ADDR bd_addr); ** Returns the key size or 0 if the size can't be retrieved. ** *******************************************************************************/ -//extern +//extern UINT8 BTM_BleGetSupportedKeySize (BD_ADDR bd_addr); /*******************************************************************************/ @@ -1816,7 +1778,7 @@ UINT8 BTM_BleGetSupportedKeySize (BD_ADDR bd_addr); ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params, tBTM_BLE_MULTI_ADV_CBACK *p_cback, void *p_ref); @@ -1834,7 +1796,7 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params, ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params); /******************************************************************************* @@ -1852,10 +1814,10 @@ tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_par ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, - tBTM_BLE_AD_MASK data_mask, - tBTM_BLE_ADV_DATA *p_data); + tBTM_BLE_AD_MASK data_mask, + tBTM_BLE_ADV_DATA *p_data); /******************************************************************************* ** @@ -1868,7 +1830,7 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id); /******************************************************************************* @@ -1885,12 +1847,12 @@ tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id); ** Returns void ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_FILT_PARAMS *p_filt_params, - tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_PF_FILT_INDEX filt_index, + tBTM_BLE_PF_FILT_PARAMS *p_filt_params, + tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback, + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1906,7 +1868,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_COND_TYPE cond_type, tBTM_BLE_PF_FILT_INDEX filt_index, @@ -1926,10 +1888,10 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action, ** Returns tBTM_STATUS ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable, - tBTM_BLE_PF_STATUS_CBACK *p_stat_cback, - tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_PF_STATUS_CBACK *p_stat_cback, + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* ** @@ -1942,7 +1904,7 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable, ** Returns status ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback); /******************************************************************************* @@ -1954,7 +1916,7 @@ tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback); ** Returns BTM_SUCCESS if success; otherwise failed. ** *******************************************************************************/ -//extern +//extern tBTM_STATUS BTM_SetBleDataLength(BD_ADDR bd_addr, UINT16 tx_pdu_length); /* diff --git a/components/bt/bluedroid/stack/include/btm_ble_int.h b/components/bt/bluedroid/stack/include/btm_ble_int.h old mode 100755 new mode 100644 index 18dffb48c..adedc6add --- a/components/bt/bluedroid/stack/include/btm_ble_int.h +++ b/components/bt/bluedroid/stack/include/btm_ble_int.h @@ -101,20 +101,18 @@ typedef UINT8 tBTM_BLE_SEC_REQ_ACT; #define BTM_VSC_CHIP_CAPABILITY_L_VERSION 55 #define BTM_VSC_CHIP_CAPABILITY_M_VERSION 95 -typedef struct -{ +typedef struct { UINT16 data_mask; UINT8 *p_flags; UINT8 ad_data[BTM_BLE_AD_DATA_LEN]; UINT8 *p_pad; -}tBTM_BLE_LOCAL_ADV_DATA; +} tBTM_BLE_LOCAL_ADV_DATA; -typedef struct -{ +typedef struct { UINT32 inq_count; /* Used for determining if a response has already been */ - /* received for the current inquiry operation. (We do not */ - /* want to flood the caller with multiple responses from */ - /* the same device. */ + /* received for the current inquiry operation. (We do not */ + /* want to flood the caller with multiple responses from */ + /* the same device. */ BOOLEAN scan_rsp; tBLE_BD_ADDR le_bda; } tINQ_LE_BDADDR; @@ -126,8 +124,7 @@ typedef struct #define BTM_BLE_PRIVATE_ADDR_INT 900 /* 15 minutes minimum for random address refreshing */ -typedef struct -{ +typedef struct { UINT16 discoverable_mode; UINT16 connectable_mode; UINT32 scan_window; @@ -164,13 +161,12 @@ typedef struct /* random address resolving complete callback */ -typedef void (tBTM_BLE_RESOLVE_CBACK) (void * match_rec, void *p); +typedef void (tBTM_BLE_RESOLVE_CBACK) (void *match_rec, void *p); typedef void (tBTM_BLE_ADDR_CBACK) (BD_ADDR_PTR static_random, void *p); /* random address management control block */ -typedef struct -{ +typedef struct { tBLE_ADDR_TYPE own_addr_type; /* local device LE address type */ BD_ADDR private_addr; BD_ADDR random_bda; @@ -184,25 +180,23 @@ typedef struct #define BTM_BLE_MAX_BG_CONN_DEV_NUM 2 -typedef struct -{ +typedef struct { UINT16 min_conn_int; UINT16 max_conn_int; UINT16 slave_latency; UINT16 supervision_tout; -}tBTM_LE_CONN_PRAMS; +} tBTM_LE_CONN_PRAMS; -typedef struct -{ +typedef struct { BD_ADDR bd_addr; UINT8 attr; BOOLEAN is_connected; BOOLEAN in_use; -}tBTM_LE_BG_CONN_DEV; +} tBTM_LE_BG_CONN_DEV; - /* white list using state as a bit mask */ +/* white list using state as a bit mask */ #define BTM_BLE_WL_IDLE 0 #define BTM_BLE_WL_INIT 1 #define BTM_BLE_WL_SCAN 2 @@ -223,10 +217,9 @@ typedef UINT8 tBTM_BLE_RL_STATE; #define BLE_CONN_CANCEL 3 typedef UINT8 tBTM_BLE_CONN_ST; -typedef struct -{ +typedef struct { void *p_param; -}tBTM_BLE_CONN_REQ; +} tBTM_BLE_CONN_REQ; /* LE state request */ #define BTM_BLE_STATE_INVALID 0 @@ -264,21 +257,19 @@ typedef UINT16 tBTM_BLE_STATE_MASK; #define BTM_LE_RESOLVING_LIST_MAX 0x20 #endif -typedef struct -{ +typedef struct { BD_ADDR *resolve_q_random_pseudo; UINT8 *resolve_q_action; UINT8 q_next; UINT8 q_pending; } tBTM_BLE_RESOLVE_Q; -typedef struct -{ +typedef struct { BOOLEAN in_use; BOOLEAN to_add; BD_ADDR bd_addr; UINT8 attr; -}tBTM_BLE_WL_OP; +} tBTM_BLE_WL_OP; /* BLE privacy mode */ #define BTM_PRIVACY_NONE 0 /* BLE no privacy */ @@ -292,8 +283,7 @@ typedef void (tBTM_DATA_LENGTH_CHANGE_CBACK) (UINT16 max_tx_length, UINT16 max_r /* Define BLE Device Management control structure */ -typedef struct -{ +typedef struct { UINT8 scan_activity; /* LE scan activity mask */ /***************************************************** @@ -359,19 +349,19 @@ void btm_clear_all_pending_le_entry(void); void btm_ble_stop_scan(); BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int, - UINT32 scan_win, UINT8 addr_type_own, - UINT8 scan_filter_policy); + UINT32 scan_win, UINT8 addr_type_own, + UINT8 scan_filter_policy); void btm_ble_stop_inquiry(void); void btm_ble_init (void); void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, tBLE_ADDR_TYPE addr_type, BOOLEAN addr_matched); void btm_ble_read_remote_features_complete(UINT8 *p); -void btm_ble_write_adv_enable_complete(UINT8 * p); +void btm_ble_write_adv_enable_complete(UINT8 *p); void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len, BOOLEAN enhanced); void btm_read_ble_local_supported_states_complete(UINT8 *p, UINT16 evt_len); tBTM_BLE_CONN_ST btm_ble_get_conn_st(void); void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st); UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, - tBTM_BLE_ADV_DATA *p_data); + tBTM_BLE_ADV_DATA *p_data); tBTM_STATUS btm_ble_start_adv(void); tBTM_STATUS btm_ble_stop_adv(void); tBTM_STATUS btm_ble_start_scan(void); @@ -419,7 +409,7 @@ BOOLEAN btm_ble_suspend_bg_conn(void); BOOLEAN btm_ble_resume_bg_conn(void); void btm_ble_initiate_select_conn(BD_ADDR bda); BOOLEAN btm_ble_start_auto_conn(BOOLEAN start); -BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK *p_select_cback); +BOOLEAN btm_ble_start_select_conn(BOOLEAN start, tBTM_BLE_SEL_CBACK *p_select_cback); BOOLEAN btm_ble_renew_bg_conn_params(BOOLEAN add, BD_ADDR bd_addr); void btm_write_dir_conn_wl(BD_ADDR target_addr); void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, UINT8 status); @@ -433,7 +423,7 @@ void btm_ble_enqueue_direct_conn_req(void *p_param); /* BLE address management */ void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback); void btm_gen_non_resolvable_private_addr (tBTM_BLE_ADDR_CBACK *p_cback, void *p); -void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p); +void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK *p_cback, void *p); void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p); /* privacy function */ @@ -457,7 +447,7 @@ void btm_ble_resolving_list_cleanup(void); void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst); void btm_ble_multi_adv_init(void); -void* btm_ble_multi_adv_get_ref(UINT8 inst_id); +void *btm_ble_multi_adv_get_ref(UINT8 inst_id); void btm_ble_multi_adv_cleanup(void); void btm_ble_multi_adv_reenable(UINT8 inst_id); void btm_ble_multi_adv_enb_privacy(BOOLEAN enable); diff --git a/components/bt/bluedroid/stack/include/btm_int.h b/components/bt/bluedroid/stack/include/btm_int.h old mode 100755 new mode 100644 index acc0e05a0..827114f0c --- a/components/bt/bluedroid/stack/include/btm_int.h +++ b/components/bt/bluedroid/stack/include/btm_int.h @@ -75,25 +75,24 @@ typedef char tBTM_LOC_BD_NAME[BTM_MAX_LOC_BD_NAME_LEN + 1]; /* Define the ACL Management control structure */ -typedef struct -{ - UINT16 hci_handle; - UINT16 pkt_types_mask; - UINT16 clock_offset; - BD_ADDR remote_addr; - DEV_CLASS remote_dc; - BD_NAME remote_name; +typedef struct { +UINT16 hci_handle; +UINT16 pkt_types_mask; +UINT16 clock_offset; +BD_ADDR remote_addr; +DEV_CLASS remote_dc; +BD_NAME remote_name; - UINT16 manufacturer; - UINT16 lmp_subversion; - UINT16 link_super_tout; - BD_FEATURES peer_lmp_features[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Peer LMP Extended features mask table for the device */ - UINT8 num_read_pages; - UINT8 lmp_version; +UINT16 manufacturer; +UINT16 lmp_subversion; +UINT16 link_super_tout; +BD_FEATURES peer_lmp_features[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Peer LMP Extended features mask table for the device */ +UINT8 num_read_pages; +UINT8 lmp_version; - BOOLEAN in_use; - UINT8 link_role; - BOOLEAN link_up_issued; /* True if busy_level link up has been issued */ +BOOLEAN in_use; +UINT8 link_role; +BOOLEAN link_up_issued; /* True if busy_level link up has been issued */ #define BTM_ACL_SWKEY_STATE_IDLE 0 #define BTM_ACL_SWKEY_STATE_MODE_CHANGE 1 @@ -101,21 +100,21 @@ typedef struct #define BTM_ACL_SWKEY_STATE_SWITCHING 3 #define BTM_ACL_SWKEY_STATE_ENCRYPTION_ON 4 #define BTM_ACL_SWKEY_STATE_IN_PROGRESS 5 - UINT8 switch_role_state; +UINT8 switch_role_state; #define BTM_ACL_ENCRYPT_STATE_IDLE 0 #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF 1 /* encryption turning off */ #define BTM_ACL_ENCRYPT_STATE_TEMP_FUNC 2 /* temporarily off for change link key or role switch */ #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON 3 /* encryption turning on */ - UINT8 encrypt_state; /* overall BTM encryption state */ +UINT8 encrypt_state; /* overall BTM encryption state */ #if BLE_INCLUDED == TRUE - tBT_TRANSPORT transport; - BD_ADDR conn_addr; /* local device address used for this connection */ - UINT8 conn_addr_type; /* local device address type for this connection */ - BD_ADDR active_remote_addr; /* remote address used on this connection */ - UINT8 active_remote_addr_type; /* local device address type for this connection */ - BD_FEATURES peer_le_features; /* Peer LE Used features mask for the device */ +tBT_TRANSPORT transport; +BD_ADDR conn_addr; /* local device address used for this connection */ +UINT8 conn_addr_type; /* local device address type for this connection */ +BD_ADDR active_remote_addr; /* remote address used on this connection */ +UINT8 active_remote_addr_type; /* local device address type for this connection */ +BD_FEATURES peer_le_features; /* Peer LE Used features mask for the device */ #endif @@ -130,48 +129,47 @@ typedef struct /* Define the Device Management control structure */ -typedef struct -{ - tBTM_DEV_STATUS_CB *p_dev_status_cb; /* Device status change callback */ - tBTM_VS_EVT_CB *p_vend_spec_cb[BTM_MAX_VSE_CALLBACKS]; /* Register for vendor specific events */ +typedef struct { +tBTM_DEV_STATUS_CB *p_dev_status_cb; /* Device status change callback */ +tBTM_VS_EVT_CB *p_vend_spec_cb[BTM_MAX_VSE_CALLBACKS]; /* Register for vendor specific events */ - tBTM_CMPL_CB *p_stored_link_key_cmpl_cb; /* Read/Write/Delete stored link key */ +tBTM_CMPL_CB *p_stored_link_key_cmpl_cb; /* Read/Write/Delete stored link key */ - TIMER_LIST_ENT reset_timer; - tBTM_CMPL_CB *p_reset_cmpl_cb; +TIMER_LIST_ENT reset_timer; +tBTM_CMPL_CB *p_reset_cmpl_cb; - TIMER_LIST_ENT rln_timer; - tBTM_CMPL_CB *p_rln_cmpl_cb; /* Callback function to be called when */ - /* read local name function complete */ - TIMER_LIST_ENT rssi_timer; - tBTM_CMPL_CB *p_rssi_cmpl_cb; /* Callback function to be called when */ - /* read rssi function completes */ - TIMER_LIST_ENT lnk_quality_timer; - tBTM_CMPL_CB *p_lnk_qual_cmpl_cb;/* Callback function to be called when */ - /* read link quality function completes */ - TIMER_LIST_ENT txpwer_timer; - tBTM_CMPL_CB *p_txpwer_cmpl_cb; /* Callback function to be called when */ - /* read inq tx power function completes */ +TIMER_LIST_ENT rln_timer; +tBTM_CMPL_CB *p_rln_cmpl_cb; /* Callback function to be called when */ +/* read local name function complete */ +TIMER_LIST_ENT rssi_timer; +tBTM_CMPL_CB *p_rssi_cmpl_cb; /* Callback function to be called when */ +/* read rssi function completes */ +TIMER_LIST_ENT lnk_quality_timer; +tBTM_CMPL_CB *p_lnk_qual_cmpl_cb;/* Callback function to be called when */ +/* read link quality function completes */ +TIMER_LIST_ENT txpwer_timer; +tBTM_CMPL_CB *p_txpwer_cmpl_cb; /* Callback function to be called when */ +/* read inq tx power function completes */ - TIMER_LIST_ENT qossu_timer; - tBTM_CMPL_CB *p_qossu_cmpl_cb; /* Callback function to be called when */ - /* qos setup function completes */ +TIMER_LIST_ENT qossu_timer; +tBTM_CMPL_CB *p_qossu_cmpl_cb; /* Callback function to be called when */ +/* qos setup function completes */ - tBTM_ROLE_SWITCH_CMPL switch_role_ref_data; - tBTM_CMPL_CB *p_switch_role_cb; /* Callback function to be called when */ - /* requested switch role is completed */ +tBTM_ROLE_SWITCH_CMPL switch_role_ref_data; +tBTM_CMPL_CB *p_switch_role_cb; /* Callback function to be called when */ +/* requested switch role is completed */ - TIMER_LIST_ENT tx_power_timer; - tBTM_CMPL_CB *p_tx_power_cmpl_cb;/* Callback function to be called */ +TIMER_LIST_ENT tx_power_timer; +tBTM_CMPL_CB *p_tx_power_cmpl_cb;/* Callback function to be called */ - DEV_CLASS dev_class; /* Local device class */ +DEV_CLASS dev_class; /* Local device class */ #if BLE_INCLUDED == TRUE - tBTM_CMPL_CB *p_le_test_cmd_cmpl_cb; /* Callback function to be called when +tBTM_CMPL_CB *p_le_test_cmd_cmpl_cb; /* Callback function to be called when LE test mode command has been sent successfully */ - BD_ADDR read_tx_pwr_addr; /* read TX power target address */ +BD_ADDR read_tx_pwr_addr; /* read TX power target address */ #define BTM_LE_SUPPORT_STATE_SIZE 8 UINT8 le_supported_states[BTM_LE_SUPPORT_STATE_SIZE]; @@ -180,20 +178,20 @@ tBTM_BLE_LOCAL_ID_KEYS id_keys; /* local BLE ID keys */ BT_OCTET16 ble_encryption_key_value; /* BLE encryption key */ #if BTM_BLE_CONFORMANCE_TESTING == TRUE - BOOLEAN no_disc_if_pair_fail; - BOOLEAN enable_test_mac_val; - BT_OCTET8 test_mac; - BOOLEAN enable_test_local_sign_cntr; - UINT32 test_local_sign_cntr; +BOOLEAN no_disc_if_pair_fail; +BOOLEAN enable_test_mac_val; +BT_OCTET8 test_mac; +BOOLEAN enable_test_local_sign_cntr; +UINT32 test_local_sign_cntr; #endif #endif /* BLE_INCLUDED */ - tBTM_IO_CAP loc_io_caps; /* IO capability of the local device */ - tBTM_AUTH_REQ loc_auth_req; /* the auth_req flag */ - BOOLEAN secure_connections_only; /* Rejects service level 0 connections if */ - /* itself or peer device doesn't support */ - /* secure connections */ +tBTM_IO_CAP loc_io_caps; /* IO capability of the local device */ +tBTM_AUTH_REQ loc_auth_req; /* the auth_req flag */ +BOOLEAN secure_connections_only; /* Rejects service level 0 connections if */ +/* itself or peer device doesn't support */ +/* secure connections */ } tBTM_DEVCB; @@ -211,42 +209,38 @@ BT_OCTET16 ble_encryption_key_value; /* BLE encryption key */ #define BTM_MIN_INQ_TX_POWER -70 #define BTM_MAX_INQ_TX_POWER 20 -typedef struct -{ - UINT32 inq_count; /* Used for determining if a response has already been */ - /* received for the current inquiry operation. (We do not */ - /* want to flood the caller with multiple responses from */ - /* the same device. */ - BD_ADDR bd_addr; +typedef struct { +UINT32 inq_count; /* Used for determining if a response has already been */ +/* received for the current inquiry operation. (We do not */ +/* want to flood the caller with multiple responses from */ +/* the same device. */ +BD_ADDR bd_addr; } tINQ_BDADDR; -typedef struct -{ - UINT32 time_of_resp; - UINT32 inq_count; /* "timestamps" the entry with a particular inquiry count */ - /* Used for determining if a response has already been */ - /* received for the current inquiry operation. (We do not */ - /* want to flood the caller with multiple responses from */ - /* the same device. */ - tBTM_INQ_INFO inq_info; - BOOLEAN in_use; +typedef struct { +UINT32 time_of_resp; +UINT32 inq_count; /* "timestamps" the entry with a particular inquiry count */ +/* Used for determining if a response has already been */ +/* received for the current inquiry operation. (We do not */ +/* want to flood the caller with multiple responses from */ +/* the same device. */ +tBTM_INQ_INFO inq_info; +BOOLEAN in_use; #if (BLE_INCLUDED == TRUE) - BOOLEAN scan_rsp; +BOOLEAN scan_rsp; #endif } tINQ_DB_ENT; -enum -{ - INQ_NONE, - INQ_LE_OBSERVE, - INQ_GENERAL +enum { +INQ_NONE, +INQ_LE_OBSERVE, +INQ_GENERAL }; typedef UINT8 tBTM_INQ_TYPE; -typedef struct -{ +typedef struct { tBTM_CMPL_CB *p_remname_cmpl_cb; #define BTM_EXT_RMT_NAME_TIMEOUT 40 @@ -277,8 +271,8 @@ typedef struct tBTM_INQ_RESULTS_CB *p_inq_ble_results_cb;/*results callback exclusively for LE observe*/ tBTM_CMPL_CB *p_inqfilter_cmpl_cb; /* Called (if not NULL) after inquiry filter completed */ UINT32 inq_counter; /* Counter incremented each time an inquiry completes */ - /* Used for determining whether or not duplicate devices */ - /* have responded to the same inquiry */ + /* Used for determining whether or not duplicate devices */ + /* have responded to the same inquiry */ TIMER_LIST_ENT inq_timer_ent; tINQ_BDADDR *p_bd_db; /* Pointer to memory that holds bdaddrs */ UINT16 num_bd_entries; /* Number of entries in database */ @@ -291,12 +285,12 @@ typedef struct UINT16 per_max_delay; /* Current periodic maximum delay */ BOOLEAN inqfilt_active; UINT8 pending_filt_complete_event; /* to take care of btm_event_filter_complete corresponding to */ - /* inquiry that has been cancelled*/ + /* inquiry that has been cancelled*/ UINT8 inqfilt_type; /* Contains the inquiry filter type (BD ADDR, COD, or Clear) */ #define BTM_INQ_INACTIVE_STATE 0 #define BTM_INQ_CLR_FILT_STATE 1 /* Currently clearing the inquiry filter preceeding the inquiry request */ - /* (bypassed if filtering is not used) */ + /* (bypassed if filtering is not used) */ #define BTM_INQ_SET_FILT_STATE 2 /* Sets the new filter (or turns off filtering) in this state */ #define BTM_INQ_ACTIVE_STATE 3 /* Actual inquiry or periodic inquiry is in progress */ #define BTM_INQ_REMNAME_STATE 4 /* Remote name requests are active */ @@ -359,8 +353,7 @@ typedef void (tBTM_SCO_IND_CBACK) (UINT16 sco_inx) ; #define BTM_SCO_ROUTE_UNKNOWN 0xff /* Define the structure that contains (e)SCO data */ -typedef struct -{ +typedef struct { tBTM_ESCO_CBACK *p_esco_cback; /* Callback for eSCO events */ tBTM_ESCO_PARAMS setup; tBTM_ESCO_DATA data; /* Connection complete information */ @@ -369,8 +362,7 @@ typedef struct /* Define the structure used for SCO Management */ -typedef struct -{ +typedef struct { tBTM_ESCO_INFO esco; /* Current settings */ #if BTM_SCO_HCI_INCLUDED == TRUE BUFFER_Q xmit_data_q; /* SCO data transmitting queue */ @@ -385,8 +377,7 @@ typedef struct } tSCO_CONN; /* SCO Management control block */ -typedef struct -{ +typedef struct { tBTM_SCO_IND_CBACK *app_sco_ind_cb; #if BTM_SCO_HCI_INCLUDED == TRUE tBTM_SCO_DATA_CB *p_data_cb; /* Callback for SCO data over HCI */ @@ -411,7 +402,7 @@ typedef struct #if BTM_SCO_INCLUDED == TRUE void btm_set_sco_ind_cback( tBTM_SCO_IND_CBACK *sco_ind_cb ); void btm_accept_sco_link(UINT16 sco_inx, tBTM_ESCO_PARAMS *p_setup, - tBTM_SCO_CB *p_conn_cb, tBTM_SCO_CB *p_disc_cb); + tBTM_SCO_CB *p_conn_cb, tBTM_SCO_CB *p_disc_cb); void btm_reject_sco_link(UINT16 sco_inx ); void btm_sco_chk_pend_rolechange (UINT16 hci_handle); #else @@ -425,8 +416,7 @@ void btm_sco_chk_pend_rolechange (UINT16 hci_handle); ** Define structure for Security Service Record. ** A record exists for each service registered with the Security Manager */ -typedef struct -{ +typedef struct { UINT32 mx_proto_id; /* Service runs over this multiplexer protocol */ UINT32 orig_mx_chan_id; /* Channel on the multiplexer protocol */ UINT32 term_mx_chan_id; /* Channel on the multiplexer protocol */ @@ -444,8 +434,7 @@ typedef struct #if BLE_INCLUDED == TRUE /* LE Security information of device in Slave Role */ -typedef struct -{ +typedef struct { BT_OCTET16 irk; /* peer diverified identity root */ BT_OCTET16 pltk; /* peer long term key */ BT_OCTET16 pcsrk; /* peer SRK peer device used to secured sign local data */ @@ -463,10 +452,9 @@ typedef struct UINT32 counter; /* peer sign counter for verifying rcv signed cmd */ UINT32 local_counter; /* local sign counter for sending signed write cmd*/ -}tBTM_SEC_BLE_KEYS; +} tBTM_SEC_BLE_KEYS; -typedef struct -{ +typedef struct { BD_ADDR pseudo_addr; /* LE pseudo address of the device if different from device address */ tBLE_ADDR_TYPE ble_addr_type; /* LE device type: public or random address */ tBLE_ADDR_TYPE static_addr_type; /* static address type */ @@ -495,8 +483,7 @@ typedef struct #endif /* BLE_INCLUDED */ /* Peering bond type */ -enum -{ +enum { BOND_TYPE_UNKNOWN, BOND_TYPE_PERSISTENT, BOND_TYPE_TEMPORARY @@ -507,8 +494,7 @@ typedef UINT8 tBTM_BOND_TYPE; ** Define structure for Security Device Record. ** A record exists for each device authenticated with this device */ -typedef struct -{ +typedef struct { tBTM_SEC_SERV_REC *p_cur_service; tBTM_SEC_CALLBACK *p_callback; void *p_ref_data; @@ -551,7 +537,7 @@ typedef struct #define BTM_SEC_STATE_SWITCHING_ROLE 5 #define BTM_SEC_STATE_DISCONNECTING 6 /* disconnecting BR/EDR */ #define BTM_SEC_STATE_DELAY_FOR_ENC 7 /* delay to check for encryption to work around */ - /* controller problems */ + /* controller problems */ #define BTM_SEC_STATE_DISCONNECTING_BLE 8 /* disconnecting BLE */ #define BTM_SEC_STATE_DISCONNECTING_BOTH 9 /* disconnecting BR/EDR and BLE */ @@ -559,7 +545,7 @@ typedef struct BOOLEAN is_originator; /* TRUE if device is originating connection */ #if (L2CAP_UCD_INCLUDED == TRUE) BOOLEAN is_ucd; /* TRUE if device is sending or receiving UCD */ - /* if incoming security failed, received UCD will be discarded */ + /* if incoming security failed, received UCD will be discarded */ #endif BOOLEAN role_master; /* TRUE if current mode is master */ UINT16 security_required; /* Security required for connection */ @@ -582,9 +568,9 @@ typedef struct tBTM_AUTH_REQ rmt_auth_req; /* the auth_req flag as in the IO caps rsp evt */ BOOLEAN remote_supports_secure_connections; BOOLEAN remote_features_needed; /* set to true if the local device is in */ - /* "Secure Connections Only" mode and it receives */ - /* HCI_IO_CAPABILITY_REQUEST_EVT from the peer before */ - /* it knows peer's support for Secure Connections */ + /* "Secure Connections Only" mode and it receives */ + /* HCI_IO_CAPABILITY_REQUEST_EVT from the peer before */ + /* it knows peer's support for Secure Connections */ UINT16 ble_hci_handle; /* use in DUMO connection */ UINT8 enc_key_size; /* current link encryption key size */ @@ -595,8 +581,8 @@ typedef struct ** for SM over BR/EDR. */ BOOLEAN no_smp_on_br; /* if set to TRUE then SMP on BR/EDR doesn't */ - /* work, i.e. link keys crosspairing */ - /* SC BR/EDR->SC LE doesn't happen */ + /* work, i.e. link keys crosspairing */ + /* SC BR/EDR->SC LE doesn't happen */ tBTM_BOND_TYPE bond_type; /* peering bond type */ #if BLE_INCLUDED == TRUE @@ -626,8 +612,7 @@ typedef struct /* ** Define device configuration structure */ -typedef struct -{ +typedef struct { #if BTM_MAX_LOC_BD_NAME_LEN > 0 tBTM_LOC_BD_NAME bd_name; /* local Bluetooth device name */ #endif @@ -638,8 +623,7 @@ typedef struct UINT8 def_inq_scan_mode; /* ??? limited/general/none */ } tBTM_CFG; -enum -{ +enum { BTM_PM_ST_ACTIVE = BTM_PM_STS_ACTIVE, BTM_PM_ST_HOLD = BTM_PM_STS_HOLD, BTM_PM_ST_SNIFF = BTM_PM_STS_SNIFF, @@ -648,43 +632,37 @@ enum }; typedef UINT8 tBTM_PM_STATE; -enum -{ +enum { BTM_PM_SET_MODE_EVT, /* Set power mode API is called. */ BTM_PM_UPDATE_EVT, BTM_PM_RD_MODE_EVT /* Read power mode API is called. */ }; typedef UINT8 tBTM_PM_EVENT; -typedef struct -{ +typedef struct { UINT16 event; UINT16 len; UINT8 link_ind; } tBTM_PM_MSG_DATA; -typedef struct -{ +typedef struct { UINT8 hci_status; UINT8 mode; UINT16 interval; } tBTM_PM_MD_CHG_DATA; -typedef struct -{ +typedef struct { UINT8 pm_id; /* the entity that calls SetPowerMode API */ tBTM_PM_PWR_MD *p_pmd; } tBTM_PM_SET_MD_DATA; -typedef struct -{ +typedef struct { void *p_data; UINT8 link_ind; } tBTM_PM_SM_DATA; -typedef struct -{ - tBTM_PM_PWR_MD req_mode[BTM_MAX_PM_RECORDS+1]; /* the desired mode and parameters of the connection*/ +typedef struct { + tBTM_PM_PWR_MD req_mode[BTM_MAX_PM_RECORDS + 1]; /* the desired mode and parameters of the connection*/ tBTM_PM_PWR_MD set_mode; /* the mode and parameters sent down to the host controller. */ UINT16 interval; /* the interval from last mode change event. */ #if (BTM_SSR_INCLUDED == TRUE) @@ -697,14 +675,12 @@ typedef struct } tBTM_PM_MCB; #define BTM_PM_REC_NOT_USED 0 -typedef struct -{ +typedef struct { tBTM_PM_STATUS_CBACK *cback;/* to notify the registered party of mode change event */ UINT8 mask; /* registered request mask. 0, if this entry is not used */ } tBTM_PM_RCB; -enum -{ +enum { BTM_BLI_ACL_UP_EVT, BTM_BLI_ACL_DOWN_EVT, BTM_BLI_PAGE_EVT, @@ -716,8 +692,7 @@ enum typedef UINT8 tBTM_BLI_EVENT; /* Pairing State */ -enum -{ +enum { BTM_PAIR_STATE_IDLE, /* Idle */ BTM_PAIR_STATE_GET_REM_NAME, /* Getting the remote name (to check for SM4) */ BTM_PAIR_STATE_WAIT_PIN_REQ, /* Started authentication, waiting for PIN req (PIN is pre-fetched) */ @@ -742,8 +717,7 @@ typedef UINT8 tBTM_PAIRING_STATE; #define BTM_PAIR_FLAGS_LE_ACTIVE 0x80 /* use this bit when SMP pairing is active */ -typedef struct -{ +typedef struct { BOOLEAN is_mux; BD_ADDR bd_addr; UINT16 psm; @@ -778,8 +752,7 @@ typedef BOOLEAN CONNECTION_TYPE; #define BTM_STATE_BUFFER_SIZE 5 /* size of state buffer */ -typedef struct -{ +typedef struct { tBTM_CFG cfg; /* Device configuration */ /**************************************************** @@ -797,7 +770,7 @@ typedef struct ** Power Management ****************************************************/ tBTM_PM_MCB pm_mode_db[MAX_L2CAP_LINKS]; /* per ACL link */ - tBTM_PM_RCB pm_reg_db[BTM_MAX_PM_RECORDS+1]; /* per application/module */ + tBTM_PM_RCB pm_reg_db[BTM_MAX_PM_RECORDS + 1]; /* per application/module */ UINT8 pm_pend_link; /* the index of acl_db, which has a pending PM cmd */ UINT8 pm_pend_id; /* the id pf the module, which has a pending PM cmd */ @@ -819,7 +792,7 @@ typedef struct tBTM_BLE_VSC_CB cmn_ble_vsc_cb; #endif - /* Packet types supported by the local device */ + /* Packet types supported by the local device */ UINT16 btm_acl_pkt_types_supported; UINT16 btm_sco_pkt_types_supported; @@ -915,12 +888,12 @@ void btm_init (void); ******************************************* */ tBTM_STATUS btm_initiate_rem_name (BD_ADDR remote_bda, - tBTM_INQ_INFO *p_cur, - UINT8 origin, UINT32 timeout, - tBTM_CMPL_CB *p_cb); + tBTM_INQ_INFO *p_cur, + UINT8 origin, UINT32 timeout, + tBTM_CMPL_CB *p_cb); void btm_process_remote_name (BD_ADDR bda, BD_NAME name, UINT16 evt_len, - UINT8 hci_status); + UINT8 hci_status); void btm_inq_rmt_name_failed(void); /* Inquiry related functions */ @@ -942,14 +915,14 @@ BOOLEAN btm_lookup_eir(BD_ADDR_PTR p_rem_addr); */ void btm_acl_init (void); void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn, - UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport); + UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport); void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport); void btm_acl_device_down (void); void btm_acl_update_busy_level (tBTM_BLI_EVENT event); void btm_cont_rswitch (tACL_CONN *p, - tBTM_SEC_DEV_REC *p_dev_rec, - UINT8 hci_status); + tBTM_SEC_DEV_REC *p_dev_rec, + UINT8 hci_status); UINT8 btm_handle_to_acl_index (UINT16 hci_handle); void btm_read_link_policy_complete (UINT8 *p); @@ -980,7 +953,7 @@ void btm_pm_reset(void); void btm_pm_sm_alloc(UINT8 ind); void btm_pm_proc_cmd_status(UINT8 status); void btm_pm_proc_mode_change (UINT8 hci_status, UINT16 hci_handle, UINT8 mode, - UINT16 interval); + UINT16 interval); void btm_pm_proc_ssr_evt (UINT8 *p, UINT16 evt_len); #if BTM_SCO_INCLUDED == TRUE void btm_sco_chk_pend_unpark (UINT8 hci_status, UINT16 hci_handle); @@ -995,10 +968,10 @@ void btm_qos_setup_complete (UINT8 status, UINT16 handle, FLOW_SPEC *p_flow); */ void btm_sco_init (void); void btm_sco_connected (UINT8 hci_status, BD_ADDR bda, UINT16 hci_handle, - tBTM_ESCO_DATA *p_esco_data); + tBTM_ESCO_DATA *p_esco_data); void btm_esco_proc_conn_chg (UINT8 status, UINT16 handle, UINT8 tx_interval, - UINT8 retrans_window, UINT16 rx_pkt_len, - UINT16 tx_pkt_len); + UINT8 retrans_window, UINT16 rx_pkt_len, + UINT16 tx_pkt_len); void btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type); void btm_sco_removed (UINT16 hci_handle, UINT8 reason); void btm_sco_acl_removed (BD_ADDR bda); @@ -1030,7 +1003,7 @@ void btm_ble_resolving_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec); /* Vendor Specific Command complete evt handler */ void btm_vsc_complete (UINT8 *p, UINT16 cc_opcode, UINT16 evt_len, - tBTM_CMPL_CB *p_vsc_cplt_cback); + tBTM_CMPL_CB *p_vsc_cplt_cback); void btm_inq_db_reset (void); void btm_vendor_specific_evt (UINT8 *p, UINT8 evt_len); void btm_delete_stored_link_key_complete (UINT8 *p); @@ -1049,7 +1022,7 @@ tBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr); tBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle); tBTM_BOND_TYPE btm_get_bond_type_dev(BD_ADDR bd_addr); BOOLEAN btm_set_bond_type_dev(BD_ADDR bd_addr, - tBTM_BOND_TYPE bond_type); + tBTM_BOND_TYPE bond_type); /* Internal functions provided by btm_sec.c ********************************************** diff --git a/components/bt/bluedroid/stack/include/btu.h b/components/bt/bluedroid/stack/include/btu.h old mode 100755 new mode 100644 index 176c12120..d82d96d79 --- a/components/bt/bluedroid/stack/include/btu.h +++ b/components/bt/bluedroid/stack/include/btu.h @@ -33,20 +33,20 @@ // HACK(zachoverflow): temporary dark magic #define BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK 0x1700 // didn't look used in bt_types...here goes nothing typedef struct { - void (*callback)(BT_HDR *); + void (*callback)(BT_HDR *); } post_to_task_hack_t; typedef struct { - void (*callback)(BT_HDR *); - BT_HDR *response; - void *context; + void (*callback)(BT_HDR *); + BT_HDR *response; + void *context; } command_complete_hack_t; typedef struct { - void (*callback)(BT_HDR *); - uint8_t status; - BT_HDR *command; - void *context; + void (*callback)(BT_HDR *); + uint8_t status; + BT_HDR *command; + void *context; } command_status_hack_t; /* callbacks @@ -164,8 +164,7 @@ typedef void (*tBTU_EVENT_CALLBACK)(BT_HDR *p_hdr); /* This is the inquiry response information held by BTU, and available ** to applications. */ -typedef struct -{ +typedef struct { BD_ADDR remote_bd_addr; UINT8 page_scan_rep_mode; UINT8 page_scan_per_mode; @@ -185,15 +184,13 @@ typedef struct #endif /* structure to hold registered timers */ -typedef struct -{ +typedef struct { TIMER_LIST_ENT *p_tle; /* timer entry */ tBTU_TIMER_CALLBACK timer_cb; /* callback triggered when timer expires */ } tBTU_TIMER_REG; /* structure to hold registered event callbacks */ -typedef struct -{ +typedef struct { UINT16 event_range; /* start of event range */ tBTU_EVENT_CALLBACK event_cb; /* callback triggered when event is in range */ } tBTU_EVENT_REG; @@ -206,8 +203,7 @@ typedef struct /* Define structure holding BTU variables */ -typedef struct -{ +typedef struct { tBTU_TIMER_REG timer_reg[BTU_MAX_REG_TIMER]; tBTU_EVENT_REG event_reg[BTU_MAX_REG_EVENT]; diff --git a/components/bt/bluedroid/stack/include/gap_api.h b/components/bt/bluedroid/stack/include/gap_api.h old mode 100755 new mode 100644 index 755c49c0b..2dc9836a8 --- a/components/bt/bluedroid/stack/include/gap_api.h +++ b/components/bt/bluedroid/stack/include/gap_api.h @@ -99,30 +99,27 @@ typedef void (tGAP_CALLBACK) (UINT16 event, void *p_data); /* Definition of the GAP_FindAddrByName results structure */ -typedef struct -{ +typedef struct { UINT16 status; BD_ADDR bd_addr; tBTM_BD_NAME devname; } tGAP_FINDADDR_RESULTS; -typedef struct -{ +typedef struct { UINT16 int_min; UINT16 int_max; UINT16 latency; UINT16 sp_tout; -}tGAP_BLE_PREF_PARAM; +} tGAP_BLE_PREF_PARAM; -typedef union -{ +typedef union { tGAP_BLE_PREF_PARAM conn_param; BD_ADDR reconn_bda; UINT16 icon; UINT8 *p_dev_name; UINT8 addr_resolution; -}tGAP_BLE_ATTR_VALUE; +} tGAP_BLE_ATTR_VALUE; typedef void (tGAP_BLE_CMPL_CBACK)(BOOLEAN status, BD_ADDR addr, UINT16 length, char *p_name); @@ -143,9 +140,9 @@ typedef void (tGAP_BLE_CMPL_CBACK)(BOOLEAN status, BD_ADDR addr, UINT16 length, ** *******************************************************************************/ extern UINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, - BD_ADDR p_rem_bda, UINT16 psm, tL2CAP_CFG_INFO *p_cfg, - tL2CAP_ERTM_INFO *ertm_info, - UINT16 security, UINT8 chan_mode_mask, tGAP_CONN_CALLBACK *p_cb); + BD_ADDR p_rem_bda, UINT16 psm, tL2CAP_CFG_INFO *p_cfg, + tL2CAP_ERTM_INFO *ertm_info, + UINT16 security, UINT8 chan_mode_mask, tGAP_CONN_CALLBACK *p_cb); /******************************************************************************* ** @@ -173,7 +170,7 @@ extern UINT16 GAP_ConnClose (UINT16 gap_handle); ** *******************************************************************************/ extern UINT16 GAP_ConnReadData (UINT16 gap_handle, UINT8 *p_data, - UINT16 max_len, UINT16 *p_len); + UINT16 max_len, UINT16 *p_len); /******************************************************************************* ** @@ -232,7 +229,7 @@ extern UINT16 GAP_ConnBTWrite (UINT16 gap_handle, BT_HDR *p_buf); ** *******************************************************************************/ extern UINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, - UINT16 max_len, UINT16 *p_len); + UINT16 max_len, UINT16 *p_len); /******************************************************************************* ** @@ -374,7 +371,7 @@ extern BOOLEAN GAP_BleReadPeerDevName (BD_ADDR peer_bda, tGAP_BLE_CMPL_CBACK *p_ ** *******************************************************************************/ extern BOOLEAN GAP_BleReadPeerAddressResolutionCap (BD_ADDR peer_bda, - tGAP_BLE_CMPL_CBACK *p_cback); + tGAP_BLE_CMPL_CBACK *p_cback); /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/include/gatt_api.h b/components/bt/bluedroid/stack/include/gatt_api.h old mode 100755 new mode 100644 index 339700047..8eea25cee --- a/components/bt/bluedroid/stack/include/gatt_api.h +++ b/components/bt/bluedroid/stack/include/gatt_api.h @@ -64,7 +64,7 @@ #define GATT_NOT_ENCRYPTED 0x8e #define GATT_CONGESTED 0x8f - /* 0xE0 ~ 0xFC reserved for future use */ +/* 0xE0 ~ 0xFC reserved for future use */ #define GATT_CCC_CFG_ERR 0xFD /* Client Characteristic Configuration Descriptor Improperly Configured */ #define GATT_PRC_IN_PROGRESS 0xFE /* Procedure Already in progress */ #define GATT_OUT_OF_RANGE 0xFF /* Attribute value out of range */ @@ -117,13 +117,13 @@ typedef UINT16 tGATT_DISCONN_REASON; /* MAX GATT MTU size */ #ifndef GATT_MAX_MTU_SIZE - #define GATT_MAX_MTU_SIZE 517 +#define GATT_MAX_MTU_SIZE 517 #endif /* max legth of an attribute value */ #ifndef GATT_MAX_ATTR_LEN - #define GATT_MAX_ATTR_LEN 600 +#define GATT_MAX_ATTR_LEN 600 #endif /* default GATT MTU size over LE link @@ -146,7 +146,7 @@ typedef UINT16 tGATT_DISCONN_REASON; /* GATT notification caching timer, default to be three seconds */ #ifndef GATTC_NOTIF_TIMEOUT - #define GATTC_NOTIF_TIMEOUT 3 +#define GATTC_NOTIF_TIMEOUT 3 #endif /***************************************************************************** @@ -200,8 +200,7 @@ typedef UINT8 tGATT_CHAR_PROP; /* Format of the value of a characteristic. enumeration type */ -enum -{ +enum { GATT_FORMAT_RES, /* rfu */ GATT_FORMAT_BOOL, /* 0x01 boolean */ GATT_FORMAT_2BITS, /* 0x02 2 bit */ @@ -236,8 +235,7 @@ typedef UINT8 tGATT_FORMAT; /* Characteristic Presentation Format Descriptor value */ -typedef struct -{ +typedef struct { UINT16 unit; /* as UUIUD defined by SIG */ UINT16 descr; /* as UUID as defined by SIG */ tGATT_FORMAT format; @@ -247,16 +245,14 @@ typedef struct /* Characteristic Report reference Descriptor format */ -typedef struct -{ +typedef struct { UINT8 rpt_id; /* report ID */ UINT8 rpt_type; /* report type */ } tGATT_CHAR_RPT_REF; #define GATT_VALID_RANGE_MAX_SIZE 16 -typedef struct -{ +typedef struct { UINT8 format; UINT16 len; UINT8 lower_range[GATT_VALID_RANGE_MAX_SIZE]; /* in little endian format */ @@ -266,8 +262,7 @@ typedef struct /* Characteristic Aggregate Format attribute value */ #define GATT_AGGR_HANDLE_NUM_MAX 10 -typedef struct -{ +typedef struct { UINT8 num_handle; UINT16 handle_list[GATT_AGGR_HANDLE_NUM_MAX]; } tGATT_CHAR_AGGRE; @@ -308,8 +303,7 @@ typedef UINT8 tGATT_AUTH_REQ; /* Attribute Value structure */ -typedef struct -{ +typedef struct { UINT16 conn_id; UINT16 handle; /* attribute handle */ UINT16 offset; /* attribute value offset, if no offfset is needed for the command, ignore it */ @@ -320,11 +314,10 @@ typedef struct /* Union of the event data which is used in the server respond API to carry the server response information */ -typedef union -{ +typedef union { /* data type member event */ tGATT_VALUE attr_value; /* READ, HANDLE_VALUE_IND, PREPARE_WRITE */ - /* READ_BLOB, READ_BY_TYPE */ + /* READ_BLOB, READ_BY_TYPE */ UINT16 handle; /* WRITE, WRITE_BLOB */ } tGATTS_RSP; @@ -340,16 +333,14 @@ typedef UINT8 tGATT_TRANSPORT; typedef UINT8 tGATT_EXEC_FLAG; /* read request always based on UUID */ -typedef struct -{ +typedef struct { UINT16 handle; UINT16 offset; BOOLEAN is_long; } tGATT_READ_REQ; /* write request data */ -typedef struct -{ +typedef struct { UINT16 handle; /* attribute handle */ UINT16 offset; /* attribute value offset, if no offfset is needed for the command, ignore it */ UINT16 len; /* length of attribute value */ @@ -359,13 +350,12 @@ typedef struct } tGATT_WRITE_REQ; /* callback data for server access request from client */ -typedef union -{ +typedef union { tGATT_READ_REQ read_req; /* read request, read by Type, read blob */ tGATT_WRITE_REQ write_req; /* write */ - /* prepare write */ - /* write blob */ + /* prepare write */ + /* write blob */ UINT16 handle; /* handle value confirmation */ UINT16 mtu; /* MTU exchange request */ tGATT_EXEC_FLAG exec_write; /* execute write */ @@ -373,8 +363,7 @@ typedef union typedef UINT8 tGATT_SERV_IF; /* GATT Service Interface */ -enum -{ +enum { GATTS_REQ_TYPE_READ = 1, /* Attribute read request */ GATTS_REQ_TYPE_WRITE, /* Attribute write request */ GATTS_REQ_TYPE_WRITE_EXEC, /* Execute write */ @@ -388,8 +377,7 @@ typedef UINT8 tGATTS_REQ_TYPE; /* Client Used Data Structure */ /* definition of different discovery types */ -enum -{ +enum { GATT_DISC_SRVC_ALL = 1, /* discover all services */ GATT_DISC_SRVC_BY_UUID, /* discover service of a special type */ GATT_DISC_INC_SRVC, /* discover the included service within a service */ @@ -401,17 +389,15 @@ typedef UINT8 tGATT_DISC_TYPE; /* Discover parameters of different discovery types */ -typedef struct -{ +typedef struct { tBT_UUID service; UINT16 s_handle; UINT16 e_handle; -}tGATT_DISC_PARAM; +} tGATT_DISC_PARAM; /* GATT read type enumeration */ -enum -{ +enum { GATT_READ_BY_TYPE = 1, GATT_READ_BY_HANDLE, GATT_READ_MULTIPLE, @@ -423,8 +409,7 @@ typedef UINT8 tGATT_READ_TYPE; /* Read By Type Request (GATT_READ_BY_TYPE) Data */ -typedef struct -{ +typedef struct { tGATT_AUTH_REQ auth_req; UINT16 s_handle; UINT16 e_handle; @@ -434,23 +419,20 @@ typedef struct /* GATT_READ_MULTIPLE request data */ #define GATT_MAX_READ_MULTI_HANDLES 10 /* Max attributes to read in one request */ -typedef struct -{ +typedef struct { tGATT_AUTH_REQ auth_req; UINT16 num_handles; /* number of handles to read */ UINT16 handles[GATT_MAX_READ_MULTI_HANDLES]; /* handles list to be read */ } tGATT_READ_MULTI; /* Read By Handle Request (GATT_READ_BY_HANDLE) data */ -typedef struct -{ +typedef struct { tGATT_AUTH_REQ auth_req; UINT16 handle; } tGATT_READ_BY_HANDLE; /* READ_BT_HANDLE_Request data */ -typedef struct -{ +typedef struct { tGATT_AUTH_REQ auth_req; UINT16 handle; UINT16 offset; @@ -458,8 +440,7 @@ typedef struct /* Read Request Data */ -typedef union -{ +typedef union { tGATT_READ_BY_TYPE service; tGATT_READ_BY_TYPE char_type; /* characterisitc type */ tGATT_READ_MULTI read_multiple; @@ -468,8 +449,7 @@ typedef union } tGATT_READ_PARAM; /* GATT write type enumeration */ -enum -{ +enum { GATT_WRITE_NO_RSP = 1, GATT_WRITE , GATT_WRITE_PREPARE @@ -478,8 +458,7 @@ typedef UINT8 tGATT_WRITE_TYPE; /* Client Operation Complete Callback Data */ -typedef union -{ +typedef union { tGATT_VALUE att_value; UINT16 mtu; UINT16 handle; @@ -499,8 +478,7 @@ typedef UINT8 tGATTC_OPTYPE; /* characteristic declaration */ -typedef struct -{ +typedef struct { tGATT_CHAR_PROP char_prop; /* characterisitc properties */ UINT16 val_handle; /* characteristic value attribute handle */ tBT_UUID char_uuid; /* characteristic UUID type */ @@ -508,8 +486,7 @@ typedef struct /* primary service group data */ -typedef struct -{ +typedef struct { UINT16 e_handle; /* ending handle of the group */ tBT_UUID service_type; /* group type */ } tGATT_GROUP_VALUE; @@ -517,15 +494,13 @@ typedef struct /* included service attribute value */ -typedef struct -{ +typedef struct { tBT_UUID service_type; /* included service UUID */ UINT16 s_handle; /* starting handle */ UINT16 e_handle; /* ending handle */ } tGATT_INCL_SRVC; -typedef union -{ +typedef union { tGATT_INCL_SRVC incl_service; /* include service value */ tGATT_GROUP_VALUE group_value; /* Service UUID type. This field is used with GATT_DISC_SRVC_ALL @@ -541,8 +516,7 @@ typedef union /* discover result record */ -typedef struct -{ +typedef struct { tBT_UUID type; UINT16 handle; tGATT_DISC_VALUE value; @@ -557,22 +531,22 @@ typedef struct #define GATT_INVALID_ACL_HANDLE 0xFFFF /* discover result callback function */ typedef void (tGATT_DISC_RES_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, - tGATT_DISC_RES *p_data); + tGATT_DISC_RES *p_data); /* discover complete callback function */ typedef void (tGATT_DISC_CMPL_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status); /* Define a callback function for when read/write/disc/config operation is completed. */ typedef void (tGATT_CMPL_CBACK) (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, - tGATT_CL_COMPLETE *p_data); + tGATT_CL_COMPLETE *p_data); /* Define a callback function when an initialized connection is established. */ typedef void (tGATT_CONN_CBACK) (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, - tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport); + tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport); /* attribute request callback for ATT server */ typedef void (tGATT_REQ_CBACK )(UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type, - tGATTS_DATA *p_data); + tGATTS_DATA *p_data); /* channel congestion/uncongestion callback */ typedef void (tGATT_CONGESTION_CBACK )(UINT16 conn_id, BOOLEAN congested); @@ -585,8 +559,7 @@ typedef void (tGATT_ENC_CMPL_CB)(tGATT_IF gatt_if, BD_ADDR bda); ** GATT. This structure includes callback functions. All functions ** MUST be provided. */ -typedef struct -{ +typedef struct { tGATT_CONN_CBACK *p_conn_cb; tGATT_CMPL_CBACK *p_cmpl_cb; tGATT_DISC_RES_CB *p_disc_res_cb; @@ -600,8 +573,7 @@ typedef struct */ -typedef struct -{ +typedef struct { tBT_UUID app_uuid128; tBT_UUID svc_uuid; UINT16 svc_inst; @@ -619,29 +591,25 @@ typedef struct #define GATTS_SRV_CHG_CMD_READ_CLENT 5 typedef UINT8 tGATTS_SRV_CHG_CMD; -typedef struct -{ +typedef struct { BD_ADDR bda; BOOLEAN srv_changed; } tGATTS_SRV_CHG; -typedef union -{ +typedef union { tGATTS_SRV_CHG srv_chg; UINT8 client_read_index; /* only used for sequential reading client srv chg info */ } tGATTS_SRV_CHG_REQ; -typedef union -{ +typedef union { tGATTS_SRV_CHG srv_chg; UINT8 num_clients; } tGATTS_SRV_CHG_RSP; -typedef struct -{ +typedef struct { tGATTS_HNDL_RANGE *p_new_srv_start; } tGATTS_PENDING_NEW_SRV_START; @@ -649,10 +617,9 @@ typedef struct */ typedef void (tGATTS_NV_SAVE_CBACK)(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range); typedef BOOLEAN (tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, - tGATTS_SRV_CHG_RSP *p_rsp); + tGATTS_SRV_CHG_RSP *p_rsp); -typedef struct -{ +typedef struct { tGATTS_NV_SAVE_CBACK *p_nv_save_callback; tGATTS_NV_SRV_CHG_CBACK *p_srv_chg_callback; } tGATT_APPL_INFO; @@ -774,7 +741,7 @@ extern UINT16 GATTS_AddIncludeService (UINT16 service_handle, ** *******************************************************************************/ extern UINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *char_uuid, - tGATT_PERM perm,tGATT_CHAR_PROP property); + tGATT_PERM perm, tGATT_CHAR_PROP property); /******************************************************************************* ** @@ -796,7 +763,7 @@ extern UINT16 GATTS_AddCharacteristic (UINT16 service_handle, tBT_UUID *char_uui ** *******************************************************************************/ extern UINT16 GATTS_AddCharDescriptor (UINT16 service_handle, tGATT_PERM perm, - tBT_UUID * p_descr_uuid); + tBT_UUID *p_descr_uuid); /******************************************************************************* ** @@ -860,8 +827,8 @@ extern void GATTS_StopService (UINT16 service_handle); ** *******************************************************************************/ extern tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, - UINT16 attr_handle, - UINT16 val_len, UINT8 *p_val); + UINT16 attr_handle, + UINT16 val_len, UINT8 *p_val); /******************************************************************************* ** @@ -878,7 +845,7 @@ extern tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id, ** *******************************************************************************/ extern tGATT_STATUS GATTS_HandleValueNotification (UINT16 conn_id, UINT16 attr_handle, - UINT16 val_len, UINT8 *p_val); + UINT16 val_len, UINT8 *p_val); /******************************************************************************* @@ -1149,7 +1116,7 @@ extern BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, ** *******************************************************************************/ extern BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, - UINT16 *p_conn_id, tBT_TRANSPORT transport); + UINT16 *p_conn_id, tBT_TRANSPORT transport); /******************************************************************************* @@ -1179,8 +1146,8 @@ extern BOOLEAN GATT_Listen (tGATT_IF gatt_if, BOOLEAN start, BD_ADDR_PTR bd_addr ** *******************************************************************************/ extern void GATT_ConfigServiceChangeCCC (BD_ADDR remote_bda, BOOLEAN enable, - tBT_TRANSPORT transport); - + tBT_TRANSPORT transport); + #ifdef __cplusplus } diff --git a/components/bt/bluedroid/stack/include/gattdefs.h b/components/bt/bluedroid/stack/include/gattdefs.h old mode 100755 new mode 100644 index 3edfa8b98..9380e2e9c --- a/components/bt/bluedroid/stack/include/gattdefs.h +++ b/components/bt/bluedroid/stack/include/gattdefs.h @@ -34,7 +34,7 @@ #define GATT_UUID_INCLUDE_SERVICE 0x2802 #define GATT_UUID_CHAR_DECLARE 0x2803 /* Characteristic Declaration*/ -#define GATT_UUID_CHAR_EXT_PROP 0x2900 /* Characteristic Extended Properties */ +#define GATT_UUID_CHAR_EXT_PROP 0x2900 /* Characteristic Extended Properties */ #define GATT_UUID_CHAR_DESCRIPTION 0x2901 /* Characteristic User Description*/ #define GATT_UUID_CHAR_CLIENT_CONFIG 0x2902 /* Client Characteristic Configuration */ #define GATT_UUID_CHAR_SRVR_CONFIG 0x2903 /* Server Characteristic Configuration */ diff --git a/components/bt/bluedroid/stack/include/hcidefs.h b/components/bt/bluedroid/stack/include/hcidefs.h old mode 100755 new mode 100644 index ff9f35cf2..faf04fd9f --- a/components/bt/bluedroid/stack/include/hcidefs.h +++ b/components/bt/bluedroid/stack/include/hcidefs.h @@ -332,7 +332,7 @@ #define HCI_BLE_LTK_REQ_REPLY (0x001A | HCI_GRP_BLE_CMDS) #define HCI_BLE_LTK_REQ_NEG_REPLY (0x001B | HCI_GRP_BLE_CMDS) #define HCI_BLE_READ_SUPPORTED_STATES (0x001C | HCI_GRP_BLE_CMDS) - /*0x001D, 0x001E and 0x001F are reserved*/ +/*0x001D, 0x001E and 0x001F are reserved*/ #define HCI_BLE_RECEIVER_TEST (0x001D | HCI_GRP_BLE_CMDS) #define HCI_BLE_TRANSMITTER_TEST (0x001E | HCI_GRP_BLE_CMDS) /* BLE TEST COMMANDS */ @@ -1333,8 +1333,7 @@ /* Define the extended flow specification fields used by AMP */ -typedef struct -{ +typedef struct { UINT8 id; UINT8 stype; UINT16 max_sdu_size; diff --git a/components/bt/bluedroid/stack/include/hcimsgs.h b/components/bt/bluedroid/stack/include/hcimsgs.h old mode 100755 new mode 100644 index dc440a20c..d360a9a12 --- a/components/bt/bluedroid/stack/include/hcimsgs.h +++ b/components/bt/bluedroid/stack/include/hcimsgs.h @@ -29,7 +29,7 @@ void bte_main_lpm_allow_bt_device_sleep(void); /* Message by message.... */ BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, - UINT8 response_cnt); + UINT8 response_cnt); #define HCIC_PARAM_SIZE_INQUIRY 5 @@ -37,17 +37,17 @@ BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, #define HCIC_INQ_INQ_LAP_OFF 0 #define HCIC_INQ_DUR_OFF 3 #define HCIC_INQ_RSP_CNT_OFF 4 - /* Inquiry */ +/* Inquiry */ - /* Inquiry Cancel */ +/* Inquiry Cancel */ BOOLEAN btsnd_hcic_inq_cancel(void); #define HCIC_PARAM_SIZE_INQ_CANCEL 0 - /* Periodic Inquiry Mode */ +/* Periodic Inquiry Mode */ BOOLEAN btsnd_hcic_per_inq_mode(UINT16 max_period, UINT16 min_period, - const LAP inq_lap, UINT8 duration, - UINT8 response_cnt); + const LAP inq_lap, UINT8 duration, + UINT8 response_cnt); #define HCIC_PARAM_SIZE_PER_INQ_MODE 9 @@ -56,18 +56,18 @@ BOOLEAN btsnd_hcic_per_inq_mode(UINT16 max_period, UINT16 min_period, #define HCI_PER_INQ_INQ_LAP_OFF 4 #define HCI_PER_INQ_DURATION_OFF 7 #define HCI_PER_INQ_RSP_CNT_OFF 8 - /* Periodic Inquiry Mode */ +/* Periodic Inquiry Mode */ - /* Exit Periodic Inquiry Mode */ +/* Exit Periodic Inquiry Mode */ BOOLEAN btsnd_hcic_exit_per_inq(void); #define HCIC_PARAM_SIZE_EXIT_PER_INQ 0 - /* Create Connection */ +/* Create Connection */ BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types, - UINT8 page_scan_rep_mode, - UINT8 page_scan_mode, - UINT16 clock_offset, - UINT8 allow_switch); + UINT8 page_scan_rep_mode, + UINT8 page_scan_mode, + UINT16 clock_offset, + UINT8 allow_switch); #define HCIC_PARAM_SIZE_CREATE_CONN 13 @@ -77,19 +77,19 @@ BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types, #define HCIC_CR_CONN_PAGE_SCAN_MODE_OFF 9 #define HCIC_CR_CONN_CLK_OFF_OFF 10 #define HCIC_CR_CONN_ALLOW_SWITCH_OFF 12 - /* Create Connection */ +/* Create Connection */ - /* Disconnect */ +/* Disconnect */ BOOLEAN btsnd_hcic_disconnect(UINT16 handle, UINT8 reason); #define HCIC_PARAM_SIZE_DISCONNECT 3 #define HCI_DISC_HANDLE_OFF 0 #define HCI_DISC_REASON_OFF 2 - /* Disconnect */ +/* Disconnect */ #if BTM_SCO_INCLUDED == TRUE - /* Add SCO Connection */ +/* Add SCO Connection */ BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types); #endif /* BTM_SCO_INCLUDED */ @@ -97,80 +97,80 @@ BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types); #define HCI_ADD_SCO_HANDLE_OFF 0 #define HCI_ADD_SCO_PACKET_TYPES_OFF 2 - /* Add SCO Connection */ +/* Add SCO Connection */ - /* Create Connection Cancel */ +/* Create Connection Cancel */ BOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest); #define HCIC_PARAM_SIZE_CREATE_CONN_CANCEL 6 #define HCIC_CR_CONN_CANCEL_BD_ADDR_OFF 0 - /* Create Connection Cancel */ +/* Create Connection Cancel */ - /* Accept Connection Request */ +/* Accept Connection Request */ BOOLEAN btsnd_hcic_accept_conn (BD_ADDR bd_addr, UINT8 role); #define HCIC_PARAM_SIZE_ACCEPT_CONN 7 #define HCI_ACC_CONN_BD_ADDR_OFF 0 #define HCI_ACC_CONN_ROLE_OFF 6 - /* Accept Connection Request */ +/* Accept Connection Request */ - /* Reject Connection Request */ +/* Reject Connection Request */ BOOLEAN btsnd_hcic_reject_conn (BD_ADDR bd_addr, UINT8 reason); #define HCIC_PARAM_SIZE_REJECT_CONN 7 #define HCI_REJ_CONN_BD_ADDR_OFF 0 #define HCI_REJ_CONN_REASON_OFF 6 - /* Reject Connection Request */ +/* Reject Connection Request */ - /* Link Key Request Reply */ +/* Link Key Request Reply */ BOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, - LINK_KEY link_key); + LINK_KEY link_key); #define HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY 22 #define HCI_LINK_KEY_REPLY_BD_ADDR_OFF 0 #define HCI_LINK_KEY_REPLY_LINK_KEY_OFF 6 - /* Link Key Request Reply */ +/* Link Key Request Reply */ - /* Link Key Request Neg Reply */ +/* Link Key Request Neg Reply */ BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr); #define HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY 6 #define HCI_LINK_KEY_NEG_REP_BD_ADR_OFF 0 - /* Link Key Request Neg Reply */ +/* Link Key Request Neg Reply */ - /* PIN Code Request Reply */ +/* PIN Code Request Reply */ BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, - UINT8 pin_code_len, - PIN_CODE pin_code); + UINT8 pin_code_len, + PIN_CODE pin_code); #define HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY 23 #define HCI_PIN_CODE_REPLY_BD_ADDR_OFF 0 #define HCI_PIN_CODE_REPLY_PIN_LEN_OFF 6 #define HCI_PIN_CODE_REPLY_PIN_CODE_OFF 7 - /* PIN Code Request Reply */ +/* PIN Code Request Reply */ - /* Link Key Request Neg Reply */ +/* Link Key Request Neg Reply */ BOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr); #define HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY 6 #define HCI_PIN_CODE_NEG_REP_BD_ADR_OFF 0 - /* Link Key Request Neg Reply */ +/* Link Key Request Neg Reply */ - /* Change Connection Type */ +/* Change Connection Type */ BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types); #define HCIC_PARAM_SIZE_CHANGE_CONN_TYPE 4 #define HCI_CHNG_PKT_TYPE_HANDLE_OFF 0 #define HCI_CHNG_PKT_TYPE_PKT_TYPE_OFF 2 - /* Change Connection Type */ +/* Change Connection Type */ #define HCIC_PARAM_SIZE_CMD_HANDLE 2 @@ -178,20 +178,20 @@ BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types); BOOLEAN btsnd_hcic_auth_request (UINT16 handle); /* Authentication Request */ - /* Set Connection Encryption */ +/* Set Connection Encryption */ BOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable); #define HCIC_PARAM_SIZE_SET_CONN_ENCRYPT 3 #define HCI_SET_ENCRYPT_HANDLE_OFF 0 #define HCI_SET_ENCRYPT_ENABLE_OFF 2 - /* Set Connection Encryption */ +/* Set Connection Encryption */ - /* Remote Name Request */ +/* Remote Name Request */ BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, - UINT8 page_scan_rep_mode, - UINT8 page_scan_mode, - UINT16 clock_offset); + UINT8 page_scan_rep_mode, + UINT8 page_scan_mode, + UINT16 clock_offset); #define HCIC_PARAM_SIZE_RMT_NAME_REQ 10 @@ -199,26 +199,26 @@ BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, #define HCI_RMT_NAME_REP_MODE_OFF 6 #define HCI_RMT_NAME_PAGE_SCAN_MODE_OFF 7 #define HCI_RMT_NAME_CLK_OFF_OFF 8 - /* Remote Name Request */ +/* Remote Name Request */ - /* Remote Name Request Cancel */ +/* Remote Name Request Cancel */ BOOLEAN btsnd_hcic_rmt_name_req_cancel(BD_ADDR bd_addr); #define HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL 6 #define HCI_RMT_NAME_CANCEL_BD_ADDR_OFF 0 - /* Remote Name Request Cancel */ +/* Remote Name Request Cancel */ BOOLEAN btsnd_hcic_rmt_features_req(UINT16 handle); /* Remote Features Request */ - /* Remote Extended Features */ +/* Remote Extended Features */ BOOLEAN btsnd_hcic_rmt_ext_features(UINT16 handle, UINT8 page_num); #define HCIC_PARAM_SIZE_RMT_EXT_FEATURES 3 #define HCI_RMT_EXT_FEATURES_HANDLE_OFF 0 #define HCI_RMT_EXT_FEATURES_PAGE_NUM_OFF 2 - /* Remote Extended Features */ +/* Remote Extended Features */ BOOLEAN btsnd_hcic_rmt_ver_req(UINT16 handle); /* Remote Version Info Request */ @@ -226,10 +226,10 @@ BOOLEAN btsnd_hcic_read_rmt_clk_offset(UINT16 handle); /* Remote Clock Offset BOOLEAN btsnd_hcic_read_lmp_handle(UINT16 handle); /* Remote LMP Handle */ BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, - UINT32 tx_bw, UINT32 rx_bw, - UINT16 max_latency, UINT16 voice, - UINT8 retrans_effort, - UINT16 packet_types); + UINT32 tx_bw, UINT32 rx_bw, + UINT16 max_latency, UINT16 voice, + UINT8 retrans_effort, + UINT16 packet_types); #define HCIC_PARAM_SIZE_SETUP_ESCO 17 #define HCI_SETUP_ESCO_HANDLE_OFF 0 @@ -242,11 +242,11 @@ BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, BOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, - UINT32 tx_bw, UINT32 rx_bw, - UINT16 max_latency, - UINT16 content_fmt, - UINT8 retrans_effort, - UINT16 packet_types); + UINT32 tx_bw, UINT32 rx_bw, + UINT16 max_latency, + UINT16 content_fmt, + UINT8 retrans_effort, + UINT16 packet_types); #define HCIC_PARAM_SIZE_ACCEPT_ESCO 21 #define HCI_ACCEPT_ESCO_BDADDR_OFF 0 @@ -266,21 +266,21 @@ BOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason); /* Hold Mode */ BOOLEAN btsnd_hcic_hold_mode(UINT16 handle, UINT16 max_hold_period, - UINT16 min_hold_period); + UINT16 min_hold_period); #define HCIC_PARAM_SIZE_HOLD_MODE 6 #define HCI_HOLD_MODE_HANDLE_OFF 0 #define HCI_HOLD_MODE_MAX_PER_OFF 2 #define HCI_HOLD_MODE_MIN_PER_OFF 4 - /* Hold Mode */ +/* Hold Mode */ - /* Sniff Mode */ +/* Sniff Mode */ BOOLEAN btsnd_hcic_sniff_mode(UINT16 handle, - UINT16 max_sniff_period, - UINT16 min_sniff_period, - UINT16 sniff_attempt, - UINT16 sniff_timeout); + UINT16 max_sniff_period, + UINT16 min_sniff_period, + UINT16 sniff_attempt, + UINT16 sniff_timeout); #define HCIC_PARAM_SIZE_SNIFF_MODE 10 @@ -290,29 +290,29 @@ BOOLEAN btsnd_hcic_sniff_mode(UINT16 handle, #define HCI_SNIFF_MODE_MIN_PER_OFF 4 #define HCI_SNIFF_MODE_ATTEMPT_OFF 6 #define HCI_SNIFF_MODE_TIMEOUT_OFF 8 - /* Sniff Mode */ +/* Sniff Mode */ BOOLEAN btsnd_hcic_exit_sniff_mode(UINT16 handle); /* Exit Sniff Mode */ - /* Park Mode */ +/* Park Mode */ BOOLEAN btsnd_hcic_park_mode (UINT16 handle, - UINT16 beacon_max_interval, - UINT16 beacon_min_interval); + UINT16 beacon_max_interval, + UINT16 beacon_min_interval); #define HCIC_PARAM_SIZE_PARK_MODE 6 #define HCI_PARK_MODE_HANDLE_OFF 0 #define HCI_PARK_MODE_MAX_PER_OFF 2 #define HCI_PARK_MODE_MIN_PER_OFF 4 - /* Park Mode */ +/* Park Mode */ BOOLEAN btsnd_hcic_exit_park_mode(UINT16 handle); /* Exit Park Mode */ - /* QoS Setup */ +/* QoS Setup */ BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, - UINT8 service_type, - UINT32 token_rate, UINT32 peak, - UINT32 latency, UINT32 delay_var); + UINT8 service_type, + UINT32 token_rate, UINT32 peak, + UINT32 latency, UINT32 delay_var); #define HCIC_PARAM_SIZE_QOS_SETUP 20 @@ -323,42 +323,42 @@ BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, #define HCI_QOS_PEAK_BANDWIDTH_OFF 8 #define HCI_QOS_LATENCY_OFF 12 #define HCI_QOS_DELAY_VAR_OFF 16 - /* QoS Setup */ +/* QoS Setup */ - /* Switch Role Request */ +/* Switch Role Request */ BOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role); #define HCIC_PARAM_SIZE_SWITCH_ROLE 7 #define HCI_SWITCH_BD_ADDR_OFF 0 #define HCI_SWITCH_ROLE_OFF 6 - /* Switch Role Request */ +/* Switch Role Request */ - /* Write Policy Settings */ +/* Write Policy Settings */ BOOLEAN btsnd_hcic_write_policy_set(UINT16 handle, UINT16 settings); #define HCIC_PARAM_SIZE_WRITE_POLICY_SET 4 #define HCI_WRITE_POLICY_HANDLE_OFF 0 #define HCI_WRITE_POLICY_SETTINGS_OFF 2 - /* Write Policy Settings */ +/* Write Policy Settings */ - /* Write Default Policy Settings */ +/* Write Default Policy Settings */ BOOLEAN btsnd_hcic_write_def_policy_set(UINT16 settings); #define HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET 2 #define HCI_WRITE_DEF_POLICY_SETTINGS_OFF 0 - /* Write Default Policy Settings */ +/* Write Default Policy Settings */ /****************************************** ** Lisbon Features *******************************************/ #if BTM_SSR_INCLUDED == TRUE - /* Sniff Subrating */ +/* Sniff Subrating */ BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat, - UINT16 min_remote_lat, - UINT16 min_local_lat); + UINT16 min_remote_lat, + UINT16 min_local_lat); #define HCIC_PARAM_SIZE_SNIFF_SUB_RATE 8 @@ -366,7 +366,7 @@ BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat, #define HCI_SNIFF_SUB_RATE_MAX_LAT_OFF 2 #define HCI_SNIFF_SUB_RATE_MIN_REM_LAT_OFF 4 #define HCI_SNIFF_SUB_RATE_MIN_LOC_LAT_OFF 6 - /* Sniff Subrating */ +/* Sniff Subrating */ #else /* BTM_SSR_INCLUDED == FALSE */ @@ -374,16 +374,16 @@ BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat, #endif /* BTM_SSR_INCLUDED */ - /* Extended Inquiry Response */ +/* Extended Inquiry Response */ void btsnd_hcic_write_ext_inquiry_response(void *buffer, UINT8 fec_req); #define HCIC_PARAM_SIZE_EXT_INQ_RESP 241 #define HCIC_EXT_INQ_RESP_FEC_OFF 0 #define HCIC_EXT_INQ_RESP_RESPONSE 1 - /* IO Capabilities Response */ +/* IO Capabilities Response */ BOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability, - UINT8 oob_present, UINT8 auth_req); + UINT8 oob_present, UINT8 auth_req); #define HCIC_PARAM_SIZE_IO_CAP_RESP 9 @@ -392,7 +392,7 @@ BOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability, #define HCI_IO_CAP_OOB_DATA_OFF 7 #define HCI_IO_CAP_AUTH_REQ_OFF 8 - /* IO Capabilities Req Neg Reply */ +/* IO Capabilities Req Neg Reply */ BOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code); #define HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY 7 @@ -400,7 +400,7 @@ BOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code); #define HCI_IO_CAP_NR_BD_ADDR_OFF 0 #define HCI_IO_CAP_NR_ERR_CODE 6 - /* Read Local OOB Data */ +/* Read Local OOB Data */ BOOLEAN btsnd_hcic_read_local_oob_data (void); #define HCIC_PARAM_SIZE_R_LOCAL_OOB 0 @@ -427,9 +427,9 @@ BOOLEAN btsnd_hcic_user_passkey_neg_reply (BD_ADDR bd_addr); #define HCI_USER_PASSKEY_NEG_BD_ADDR_OFF 0 - /* Remote OOB Data Request Reply */ +/* Remote OOB Data Request Reply */ BOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, - UINT8 *p_r); + UINT8 *p_r); #define HCIC_PARAM_SIZE_REM_OOB_REPLY 38 @@ -437,19 +437,19 @@ BOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, #define HCI_REM_OOB_DATA_C_OFF 6 #define HCI_REM_OOB_DATA_R_OFF 22 - /* Remote OOB Data Request Negative Reply */ +/* Remote OOB Data Request Negative Reply */ BOOLEAN btsnd_hcic_rem_oob_neg_reply (BD_ADDR bd_addr); #define HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY 6 #define HCI_REM_OOB_DATA_NEG_BD_ADDR_OFF 0 - /* Read Tx Power Level */ +/* Read Tx Power Level */ BOOLEAN btsnd_hcic_read_inq_tx_power (void); #define HCIC_PARAM_SIZE_R_TX_POWER 0 - /* Read Default Erroneous Data Reporting */ +/* Read Default Erroneous Data Reporting */ BOOLEAN btsnd_hcic_read_default_erroneous_data_rpt (void); #define HCIC_PARAM_SIZE_R_ERR_DATA_RPT 0 @@ -470,37 +470,37 @@ BOOLEAN btsnd_hcic_send_keypress_notif (BD_ADDR bd_addr, UINT8 notif); /**** end of Simple Pairing Commands ****/ - /* Store Current Settings */ +/* Store Current Settings */ #define MAX_FILT_COND (sizeof (BD_ADDR) + 1) BOOLEAN btsnd_hcic_set_event_filter(UINT8 filt_type, - UINT8 filt_cond_type, - UINT8 *filt_cond, - UINT8 filt_cond_len); + UINT8 filt_cond_type, + UINT8 *filt_cond, + UINT8 filt_cond_len); #define HCIC_PARAM_SIZE_SET_EVT_FILTER 9 #define HCI_FILT_COND_FILT_TYPE_OFF 0 #define HCI_FILT_COND_COND_TYPE_OFF 1 #define HCI_FILT_COND_FILT_OFF 2 - /* Set Event Filter */ +/* Set Event Filter */ - /* Delete Stored Key */ +/* Delete Stored Key */ BOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag); #define HCIC_PARAM_SIZE_DELETE_STORED_KEY 7 #define HCI_DELETE_KEY_BD_ADDR_OFF 0 #define HCI_DELETE_KEY_ALL_FLAG_OFF 6 - /* Delete Stored Key */ +/* Delete Stored Key */ - /* Change Local Name */ +/* Change Local Name */ BOOLEAN btsnd_hcic_change_name(BD_NAME name); #define HCIC_PARAM_SIZE_CHANGE_NAME BD_NAME_LEN #define HCI_CHANGE_NAME_NAME_OFF 0 - /* Change Local Name */ +/* Change Local Name */ #define HCIC_PARAM_SIZE_READ_CMD 0 @@ -525,22 +525,22 @@ BOOLEAN btsnd_hcic_read_name (void); /* Read Local N BOOLEAN btsnd_hcic_write_page_tout(UINT16 timeout); /* Write Page Timout */ BOOLEAN btsnd_hcic_write_scan_enable(UINT8 flag); /* Write Scan Enable */ BOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, - UINT16 window); /* Write Page Scan Activity */ + UINT16 window); /* Write Page Scan Activity */ #define HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG 4 #define HCI_SCAN_CFG_INTERVAL_OFF 0 #define HCI_SCAN_CFG_WINDOW_OFF 2 - /* Write Page Scan Activity */ +/* Write Page Scan Activity */ - /* Write Inquiry Scan Activity */ +/* Write Inquiry Scan Activity */ BOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window); #define HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG 4 #define HCI_SCAN_CFG_INTERVAL_OFF 0 #define HCI_SCAN_CFG_WINDOW_OFF 2 - /* Write Inquiry Scan Activity */ +/* Write Inquiry Scan Activity */ BOOLEAN btsnd_hcic_write_auth_enable(UINT8 flag); /* Write Authentication Enable */ BOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev); /* Write Class of Device */ @@ -553,7 +553,7 @@ BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags); /* Write Voice #define HCI_HOST_FLOW_CTRL_BOTH_ON 3 BOOLEAN btsnd_hcic_write_auto_flush_tout(UINT16 handle, - UINT16 timeout); /* Write Retransmit Timout */ + UINT16 timeout); /* Write Retransmit Timout */ #define HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT 4 @@ -572,8 +572,8 @@ BOOLEAN btsnd_hcic_read_tx_power(UINT16 handle, UINT8 type); /* Read Tx Powe #define HCI_READ_MAXIMUM 0x01 BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, - UINT16 *handle, - UINT16 *num_pkts); /* Set Host Buffer Size */ + UINT16 *handle, + UINT16 *num_pkts); /* Set Host Buffer Size */ #define HCIC_PARAM_SIZE_NUM_PKTS_DONE_SIZE sizeof(btmsg_hcic_num_pkts_done_t) @@ -583,23 +583,23 @@ BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, #define HCI_PKTS_DONE_HANDLE_OFF 1 #define HCI_PKTS_DONE_NUM_PKTS_OFF 3 - /* Write Link Supervision Timeout */ +/* Write Link Supervision Timeout */ BOOLEAN btsnd_hcic_write_link_super_tout(UINT8 local_controller_id, UINT16 handle, UINT16 timeout); #define HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT 4 #define HCI_LINK_SUPER_TOUT_HANDLE_OFF 0 #define HCI_LINK_SUPER_TOUT_TOUT_OFF 2 - /* Write Link Supervision Timeout */ +/* Write Link Supervision Timeout */ BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, - LAP * const iac_lap); /* Write Current IAC LAP */ + LAP *const iac_lap); /* Write Current IAC LAP */ #define MAX_IAC_LAPS 0x40 #define HCI_WRITE_IAC_LAP_NUM_OFF 0 #define HCI_WRITE_IAC_LAP_LAP_OFF 1 - /* Write Current IAC LAP */ +/* Write Current IAC LAP */ BOOLEAN btsnd_hcic_get_link_quality (UINT16 handle); /* Get Link Quality */ BOOLEAN btsnd_hcic_read_rssi (UINT16 handle); /* Read RSSI */ @@ -631,8 +631,8 @@ BOOLEAN btsnd_hcic_write_inquiry_mode(UINT8 type); /* Write Inquiry #define HCID_GET_SCO_LEN(p) (*((UINT8 *)((p) + 1) + p->offset + 2)) void btsnd_hcic_vendor_spec_cmd (void *buffer, UINT16 opcode, - UINT8 len, UINT8 *p_data, - void *p_cmd_cplt_cback); + UINT8 len, UINT8 *p_data, + void *p_cmd_cplt_cback); #if (BLE_INCLUDED == TRUE) /******************************************************************************** @@ -694,9 +694,9 @@ BOOLEAN btsnd_hcic_ble_set_local_used_feat (UINT8 feat_set[8]); BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_addr); BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max, - UINT8 adv_type, UINT8 addr_type_own, - UINT8 addr_type_dir, BD_ADDR direct_bda, - UINT8 channel_map, UINT8 adv_filter_policy); + UINT8 adv_type, UINT8 addr_type_own, + UINT8 addr_type_dir, BD_ADDR direct_bda, + UINT8 channel_map, UINT8 adv_filter_policy); BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void); @@ -707,15 +707,15 @@ BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp); BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable); BOOLEAN btsnd_hcic_ble_set_scan_params (UINT8 scan_type, - UINT16 scan_int, UINT16 scan_win, - UINT8 addr_type, UINT8 scan_filter_policy); + UINT16 scan_int, UINT16 scan_win, + UINT8 addr_type, UINT8 scan_filter_policy); BOOLEAN btsnd_hcic_ble_set_scan_enable (UINT8 scan_enable, UINT8 duplicate); BOOLEAN btsnd_hcic_ble_create_ll_conn (UINT16 scan_int, UINT16 scan_win, - UINT8 init_filter_policy, UINT8 addr_type_peer, BD_ADDR bda_peer, UINT8 addr_type_own, - UINT16 conn_int_min, UINT16 conn_int_max, UINT16 conn_latency, UINT16 conn_timeout, - UINT16 min_ce_len, UINT16 max_ce_len); + UINT8 init_filter_policy, UINT8 addr_type_peer, BD_ADDR bda_peer, UINT8 addr_type_own, + UINT16 conn_int_min, UINT16 conn_int_max, UINT16 conn_latency, UINT16 conn_timeout, + UINT16 min_ce_len, UINT16 max_ce_len); BOOLEAN btsnd_hcic_ble_create_conn_cancel (void); @@ -728,7 +728,7 @@ BOOLEAN btsnd_hcic_ble_add_white_list (UINT8 addr_type, BD_ADDR bda); BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda); BOOLEAN btsnd_hcic_ble_upd_ll_conn_params (UINT16 handle, UINT16 conn_int_min, UINT16 conn_int_max, - UINT16 conn_latency, UINT16 conn_timeout, UINT16 min_len, UINT16 max_len); + UINT16 conn_latency, UINT16 conn_timeout, UINT16 min_len, UINT16 max_len); BOOLEAN btsnd_hcic_ble_set_host_chnl_class (UINT8 chnl_map[HCIC_BLE_CHNL_MAP_SIZE]); @@ -736,13 +736,13 @@ BOOLEAN btsnd_hcic_ble_read_chnl_map (UINT16 handle); BOOLEAN btsnd_hcic_ble_read_remote_feat ( UINT16 handle); -BOOLEAN btsnd_hcic_ble_encrypt (UINT8* key, UINT8 key_len, UINT8* plain_text, UINT8 pt_len, void *p_cmd_cplt_cback); +BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len, UINT8 *plain_text, UINT8 pt_len, void *p_cmd_cplt_cback); BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback); BOOLEAN btsnd_hcic_ble_start_enc ( UINT16 handle, - UINT8 rand[HCIC_BLE_RAND_DI_SIZE], - UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE]); + UINT8 rand[HCIC_BLE_RAND_DI_SIZE], + UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE]); BOOLEAN btsnd_hcic_ble_ltk_req_reply (UINT16 handle, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE]); @@ -757,16 +757,16 @@ BOOLEAN btsnd_hcic_ble_read_host_supported (void); BOOLEAN btsnd_hcic_ble_receiver_test(UINT8 rx_freq); BOOLEAN btsnd_hcic_ble_transmitter_test(UINT8 tx_freq, UINT8 test_data_len, - UINT8 payload); + UINT8 payload); BOOLEAN btsnd_hcic_ble_test_end(void); #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) #define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY 14 BOOLEAN btsnd_hcic_ble_rc_param_req_reply(UINT16 handle, - UINT16 conn_int_min, UINT16 conn_int_max, - UINT16 conn_latency, UINT16 conn_timeout, - UINT16 min_ce_len, UINT16 max_ce_len); + UINT16 conn_int_min, UINT16 conn_int_max, + UINT16 conn_latency, UINT16 conn_timeout, + UINT16 min_ce_len, UINT16 max_ce_len); #define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY 3 BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason); @@ -774,23 +774,23 @@ BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason); #endif /* BLE_LLT_INCLUDED */ BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, - UINT16 tx_time); + UINT16 tx_time); BOOLEAN btsnd_hcic_ble_add_device_resolving_list (UINT8 addr_type_peer, - BD_ADDR bda_peer, - UINT8 irk_peer[HCIC_BLE_IRK_SIZE], - UINT8 irk_local[HCIC_BLE_IRK_SIZE]); + BD_ADDR bda_peer, + UINT8 irk_peer[HCIC_BLE_IRK_SIZE], + UINT8 irk_local[HCIC_BLE_IRK_SIZE]); BOOLEAN btsnd_hcic_ble_rm_device_resolving_list (UINT8 addr_type_peer, - BD_ADDR bda_peer); + BD_ADDR bda_peer); BOOLEAN btsnd_hcic_ble_clear_resolving_list (void); BOOLEAN btsnd_hcic_ble_read_resolvable_addr_peer (UINT8 addr_type_peer, - BD_ADDR bda_peer); + BD_ADDR bda_peer); BOOLEAN btsnd_hcic_ble_read_resolvable_addr_local (UINT8 addr_type_peer, - BD_ADDR bda_peer); + BD_ADDR bda_peer); BOOLEAN btsnd_hcic_ble_set_addr_resolution_enable (UINT8 addr_resolution_enable); @@ -801,7 +801,7 @@ BOOLEAN btsnd_hcic_ble_set_rand_priv_addr_timeout (UINT16 rpa_timout); BOOLEAN btsnd_hcic_read_authenticated_payload_tout(UINT16 handle); BOOLEAN btsnd_hcic_write_authenticated_payload_tout(UINT16 handle, - UINT16 timeout); + UINT16 timeout); #define HCIC_PARAM_SIZE_WRITE_AUTHENT_PAYLOAD_TOUT 4 diff --git a/components/bt/bluedroid/profiles/std/include/hiddefs.h b/components/bt/bluedroid/stack/include/hiddefs.h old mode 100755 new mode 100644 similarity index 88% rename from components/bt/bluedroid/profiles/std/include/hiddefs.h rename to components/bt/bluedroid/stack/include/hiddefs.h index bf5d0212e..c8c3d3cbb --- a/components/bt/bluedroid/profiles/std/include/hiddefs.h +++ b/components/bt/bluedroid/stack/include/hiddefs.h @@ -29,29 +29,28 @@ /* ** tHID_STATUS: HID result codes, returned by HID and device and host functions. */ -enum -{ - HID_SUCCESS, - HID_ERR_NOT_REGISTERED, - HID_ERR_ALREADY_REGISTERED, - HID_ERR_NO_RESOURCES, - HID_ERR_NO_CONNECTION, - HID_ERR_INVALID_PARAM, - HID_ERR_UNSUPPORTED, - HID_ERR_UNKNOWN_COMMAND, - HID_ERR_CONGESTED, - HID_ERR_CONN_IN_PROCESS, - HID_ERR_ALREADY_CONN, - HID_ERR_DISCONNECTING, - HID_ERR_SET_CONNABLE_FAIL, - /* Device specific error codes */ - HID_ERR_HOST_UNKNOWN, - HID_ERR_L2CAP_FAILED, - HID_ERR_AUTH_FAILED, - HID_ERR_SDP_BUSY, - HID_ERR_GATT, +enum { + HID_SUCCESS, + HID_ERR_NOT_REGISTERED, + HID_ERR_ALREADY_REGISTERED, + HID_ERR_NO_RESOURCES, + HID_ERR_NO_CONNECTION, + HID_ERR_INVALID_PARAM, + HID_ERR_UNSUPPORTED, + HID_ERR_UNKNOWN_COMMAND, + HID_ERR_CONGESTED, + HID_ERR_CONN_IN_PROCESS, + HID_ERR_ALREADY_CONN, + HID_ERR_DISCONNECTING, + HID_ERR_SET_CONNABLE_FAIL, + /* Device specific error codes */ + HID_ERR_HOST_UNKNOWN, + HID_ERR_L2CAP_FAILED, + HID_ERR_AUTH_FAILED, + HID_ERR_SDP_BUSY, + HID_ERR_GATT, - HID_ERR_INVALID = 0xFF + HID_ERR_INVALID = 0xFF }; typedef UINT8 tHID_STATUS; @@ -129,16 +128,14 @@ typedef UINT8 tHID_STATUS; #define HID_SDP_DESCRIPTOR_REPORT (0x22) #define HID_SDP_DESCRIPTOR_PHYSICAL (0x23) -typedef struct desc_info -{ +typedef struct desc_info { UINT16 dl_len; UINT8 *dsc_list; } tHID_DEV_DSCP_INFO; #define HID_SSR_PARAM_INVALID 0xffff -typedef struct sdp_info -{ +typedef struct sdp_info { char svc_name[HID_MAX_SVC_NAME_LEN]; /*Service Name */ char svc_descr[HID_MAX_SVC_DESCR_LEN]; /*Service Description*/ char prov_name[HID_MAX_PROV_NAME_LEN]; /*Provider Name.*/ diff --git a/components/bt/bluedroid/profiles/std/include/hidh_api.h b/components/bt/bluedroid/stack/include/hidh_api.h old mode 100755 new mode 100644 similarity index 97% rename from components/bt/bluedroid/profiles/std/include/hidh_api.h rename to components/bt/bluedroid/stack/include/hidh_api.h index 00b8fde6f..499e64625 --- a/components/bt/bluedroid/profiles/std/include/hidh_api.h +++ b/components/bt/bluedroid/stack/include/hidh_api.h @@ -26,7 +26,7 @@ *****************************************************************************/ enum { - HID_SDP_NO_SERV_UUID = (SDP_ILLEGAL_PARAMETER+1), + HID_SDP_NO_SERV_UUID = (SDP_ILLEGAL_PARAMETER + 1), HID_SDP_MANDATORY_MISSING }; @@ -64,8 +64,7 @@ HID_HDEV_EVT_HANDSHAKE Device sent SET_REPORT Data=Result-code pdata=N HID_HDEV_EVT_VC_UNPLUG Device sent Virtual Unplug Data=NA. pdata=NA. */ -enum -{ +enum { HID_HDEV_EVT_OPEN, HID_HDEV_EVT_CLOSE, HID_HDEV_EVT_RETRYING, @@ -101,9 +100,9 @@ extern "C" ** *******************************************************************************/ extern tHID_STATUS HID_HostGetSDPRecord (BD_ADDR addr, - tSDP_DISCOVERY_DB *p_db, - UINT32 db_len, - tHID_HOST_SDP_CALLBACK *sdp_cback ); + tSDP_DISCOVERY_DB *p_db, + UINT32 db_len, + tHID_HOST_SDP_CALLBACK *sdp_cback ); /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/include/l2c_api.h b/components/bt/bluedroid/stack/include/l2c_api.h old mode 100755 new mode 100644 index 837dbc852..d79c17a1b --- a/components/bt/bluedroid/stack/include/l2c_api.h +++ b/components/bt/bluedroid/stack/include/l2c_api.h @@ -89,18 +89,18 @@ typedef UINT8 tL2CAP_CHNL_DATA_RATE; /* length of the HCI header block */ /* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) */ -#define L2CAP_MULTI_AV_HCI_HDR_LEN 8 +#define L2CAP_MULTI_AV_HCI_HDR_LEN 8 /* length of padding for 4 bytes align */ #define L2CAP_MULTI_AV_PADDING_LEN 2 /* length of the HCI header block with padding for FCR */ /* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) + padding(2) */ -#define L2CAP_MULTI_AV_HCI_HDR_LEN_WITH_PADDING 10 +#define L2CAP_MULTI_AV_HCI_HDR_LEN_WITH_PADDING 10 /* length of the L2CAP header block */ /* HCI header(4) + L2CAP header(4) + padding(4) or control word(2) + FCS(2) */ -#define L2CAP_MULTI_AV_L2C_HDR_LEN 12 +#define L2CAP_MULTI_AV_L2C_HDR_LEN 12 /* definition used for L2CA_SetDesireRole */ #define L2CAP_ROLE_SLAVE HCI_ROLE_SLAVE @@ -129,8 +129,7 @@ typedef UINT8 tL2CAP_CHNL_DATA_RATE; ** Type Definitions *****************************************************************************/ -typedef struct -{ +typedef struct { #define L2CAP_FCR_BASIC_MODE 0x00 #define L2CAP_FCR_ERTM_MODE 0x03 #define L2CAP_FCR_STREAM_MODE 0x04 @@ -148,8 +147,7 @@ typedef struct ** parameters are optional, for each parameter there is a boolean to ** use to signify its presence or absence. */ -typedef struct -{ +typedef struct { UINT16 result; /* Only used in confirm messages */ BOOLEAN mtu_present; UINT16 mtu; @@ -287,8 +285,7 @@ typedef void (tL2CA_TX_COMPLETE_CB) (UINT16, UINT16); ** MUST be provided, with the exception of the "connect pending" ** callback and "congestion status" callback. */ -typedef struct -{ +typedef struct { tL2CA_CONNECT_IND_CB *pL2CA_ConnectInd_Cb; tL2CA_CONNECT_CFM_CB *pL2CA_ConnectCfm_Cb; tL2CA_CONNECT_PND_CB *pL2CA_ConnectPnd_Cb; @@ -306,8 +303,7 @@ typedef struct /* Define the structure that applications use to create or accept ** connections with enhanced retransmission mode. */ -typedef struct -{ +typedef struct { UINT8 preferred_mode; UINT8 allowed_modes; UINT8 user_rx_pool_id; @@ -401,7 +397,7 @@ extern UINT16 L2CA_ConnectReq (UINT16 psm, BD_ADDR p_bd_addr); ** *******************************************************************************/ extern BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, - UINT16 result, UINT16 status); + UINT16 result, UINT16 status); /******************************************************************************* ** @@ -417,7 +413,7 @@ extern BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, ** *******************************************************************************/ extern UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr, - tL2CAP_ERTM_INFO *p_ertm_info); + tL2CAP_ERTM_INFO *p_ertm_info); // This function sets the callback routines for the L2CAP connection referred to by // |local_cid|. The callback routines can only be modified for outgoing connections @@ -439,8 +435,8 @@ bool L2CA_SetConnectionCallbacks(uint16_t local_cid, const tL2CAP_APPL_INFO *cal ** *******************************************************************************/ extern BOOLEAN L2CA_ErtmConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, - UINT16 result, UINT16 status, - tL2CAP_ERTM_INFO *p_ertm_info); + UINT16 result, UINT16 status, + tL2CAP_ERTM_INFO *p_ertm_info); /******************************************************************************* ** @@ -546,7 +542,7 @@ bool L2CA_GetIdentifiers(uint16_t lcid, uint16_t *rcid, uint16_t *handle); ** *******************************************************************************/ extern BOOLEAN L2CA_SetIdleTimeout (UINT16 cid, UINT16 timeout, - BOOLEAN is_global); + BOOLEAN is_global); /******************************************************************************* ** @@ -568,7 +564,7 @@ extern BOOLEAN L2CA_SetIdleTimeout (UINT16 cid, UINT16 timeout, ** ACL link. *******************************************************************************/ extern BOOLEAN L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, UINT16 timeout, - tBT_TRANSPORT transport); + tBT_TRANSPORT transport); /******************************************************************************* ** @@ -664,7 +660,7 @@ extern BOOLEAN L2CA_FlowControl (UINT16 cid, BOOLEAN data_enabled); ** *******************************************************************************/ extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, UINT8 sup_type, - UINT8 back_track); + UINT8 back_track); /******************************************************************************* ** @@ -830,8 +826,7 @@ typedef void (tL2CA_UCD_CONGESTION_STATUS_CB) (BD_ADDR, BOOLEAN); /* UCD registration info (the callback addresses and PSM) */ -typedef struct -{ +typedef struct { tL2CA_UCD_DISCOVER_CB *pL2CA_UCD_Discover_Cb; tL2CA_UCD_DATA_CB *pL2CA_UCD_Data_Cb; tL2CA_UCD_CONGESTION_STATUS_CB *pL2CA_UCD_Congestion_Status_Cb; @@ -957,8 +952,7 @@ typedef void (tL2CA_FIXED_CONGESTION_STATUS_CB) (BD_ADDR, BOOLEAN); /* Fixed channel registration info (the callback addresses and channel config) */ -typedef struct -{ +typedef struct { tL2CA_FIXED_CHNL_CB *pL2CA_FixedConn_Cb; tL2CA_FIXED_DATA_CB *pL2CA_FixedData_Cb; tL2CA_FIXED_CONGESTION_STATUS_CB *pL2CA_FixedCong_Cb; @@ -1093,7 +1087,7 @@ extern BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda); ** *******************************************************************************/ extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int, - UINT16 max_int, UINT16 latency, UINT16 timeout); + UINT16 max_int, UINT16 latency, UINT16 timeout); /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/include/l2cap_client.h b/components/bt/bluedroid/stack/include/l2cap_client.h old mode 100755 new mode 100644 index c7da78247..168c8db55 --- a/components/bt/bluedroid/stack/include/l2cap_client.h +++ b/components/bt/bluedroid/stack/include/l2cap_client.h @@ -27,10 +27,10 @@ typedef struct buffer_t buffer_t; typedef struct l2cap_client_t l2cap_client_t; typedef struct { - void (*connected)(l2cap_client_t *client, void *context); - void (*disconnected)(l2cap_client_t *client, void *context); - void (*read_ready)(l2cap_client_t *client, buffer_t *packet, void *context); - void (*write_ready)(l2cap_client_t *client, void *context); + void (*connected)(l2cap_client_t *client, void *context); + void (*disconnected)(l2cap_client_t *client, void *context); + void (*read_ready)(l2cap_client_t *client, buffer_t *packet, void *context); + void (*write_ready)(l2cap_client_t *client, void *context); } l2cap_client_callbacks_t; // Returns a new buffer with enough space for |size| bytes of L2CAP payload. diff --git a/components/bt/bluedroid/stack/include/l2cdefs.h b/components/bt/bluedroid/stack/include/l2cdefs.h old mode 100755 new mode 100644 index b4b6f5138..e31ee24b1 --- a/components/bt/bluedroid/stack/include/l2cdefs.h +++ b/components/bt/bluedroid/stack/include/l2cdefs.h @@ -269,7 +269,7 @@ #define L2CAP_SDU_LEN_OFFSET 2 /* SDU length offset is 2 bytes */ #define L2CAP_EXT_CONTROL_OVERHEAD 4 /* Extended Control Field */ #define L2CAP_MAX_HEADER_FCS (L2CAP_PKT_OVERHEAD + L2CAP_EXT_CONTROL_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN) - /* length(2), channel(2), control(4), SDU length(2) FCS(2) */ +/* length(2), channel(2), control(4), SDU length(2) FCS(2) */ /* To optimize this, it must be a multiplum of the L2CAP PDU length AND match the 3DH5 air * including the l2cap headers in each packet - to match the latter - the -5 is added */ diff --git a/components/bt/bluedroid/stack/include/port_api.h b/components/bt/bluedroid/stack/include/port_api.h old mode 100755 new mode 100644 index f24887b57..d5420f56b --- a/components/bt/bluedroid/stack/include/port_api.h +++ b/components/bt/bluedroid/stack/include/port_api.h @@ -34,8 +34,7 @@ ** Define port settings structure send from the application in the ** set settings request, or to the application in the set settings indication. */ -typedef struct -{ +typedef struct { #define PORT_BAUD_RATE_2400 0x00 #define PORT_BAUD_RATE_4800 0x01 @@ -101,7 +100,7 @@ typedef int (tPORT_DATA_CALLBACK) (UINT16 port_handle, void *p_data, UINT16 len #define DATA_CO_CALLBACK_TYPE_INCOMING 1 #define DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE 2 #define DATA_CO_CALLBACK_TYPE_OUTGOING 3 -typedef int (tPORT_DATA_CO_CALLBACK) (UINT16 port_handle, UINT8* p_buf, UINT16 len, int type); +typedef int (tPORT_DATA_CO_CALLBACK) (UINT16 port_handle, UINT8 *p_buf, UINT16 len, int type); typedef void (tPORT_CALLBACK) (UINT32 code, UINT16 port_handle); @@ -126,7 +125,7 @@ typedef void (tPORT_CALLBACK) (UINT32 code, UINT16 port_handle); #define PORT_EV_CONNECTED 0x00000200 /* RFCOMM connection established */ #define PORT_EV_CONNECT_ERR 0x00008000 /* Was not able to establish connection */ - /* or disconnected */ +/* or disconnected */ #define PORT_EV_FC 0x00010000 /* data flow enabled flag changed by remote */ #define PORT_EV_FCS 0x00020000 /* data flow enable status true = enabled */ @@ -217,9 +216,9 @@ extern "C" ** *******************************************************************************/ extern int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn, - BOOLEAN is_server, UINT16 mtu, - BD_ADDR bd_addr, UINT16 *p_handle, - tPORT_CALLBACK *p_mgmt_cb); + BOOLEAN is_server, UINT16 mtu, + BD_ADDR bd_addr, UINT16 *p_handle, + tPORT_CALLBACK *p_mgmt_cb); /******************************************************************************* @@ -463,8 +462,7 @@ extern int PORT_GetModemStatus (UINT16 handle, UINT8 *p_control_signal); #define PORT_ERR_RXOVER 0x08 /* Input queue overflow occured */ #define PORT_ERR_TXFULL 0x10 /* Output queue overflow occured */ -typedef struct -{ +typedef struct { #define PORT_FLAG_CTS_HOLD 0x01 /* Tx is waiting for CTS signal */ #define PORT_FLAG_DSR_HOLD 0x02 /* Tx is waiting for DSR signal */ #define PORT_FLAG_RLSD_HOLD 0x04 /* Tx is waiting for RLSD signal */ @@ -600,7 +598,7 @@ extern int PORT_WriteData (UINT16 handle, char *p_data, UINT16 max_len, ** Parameters: handle - Handle returned in the RFCOMM_CreateConnection ** *******************************************************************************/ -extern int PORT_WriteDataCO (UINT16 handle, int* p_len); +extern int PORT_WriteDataCO (UINT16 handle, int *p_len); /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/include/profiles_api.h b/components/bt/bluedroid/stack/include/profiles_api.h old mode 100755 new mode 100644 index eee0dd834..23306ff5a --- a/components/bt/bluedroid/stack/include/profiles_api.h +++ b/components/bt/bluedroid/stack/include/profiles_api.h @@ -61,8 +61,7 @@ ** This following definitions are used to indicate the security ** requirements for a service. */ -typedef struct -{ +typedef struct { UINT8 level; UINT8 mask; } tBT_SECURITY; diff --git a/components/bt/bluedroid/profiles/std/include/rfcdefs.h b/components/bt/bluedroid/stack/include/rfcdefs.h similarity index 100% rename from components/bt/bluedroid/profiles/std/include/rfcdefs.h rename to components/bt/bluedroid/stack/include/rfcdefs.h diff --git a/components/bt/bluedroid/stack/include/sdp_api.h b/components/bt/bluedroid/stack/include/sdp_api.h old mode 100755 new mode 100644 index ff44bf5f6..c35c12439 --- a/components/bt/bluedroid/stack/include/sdp_api.h +++ b/components/bt/bluedroid/stack/include/sdp_api.h @@ -70,22 +70,19 @@ /* Define a callback function for when discovery is complete. */ typedef void (tSDP_DISC_CMPL_CB) (UINT16 result); -typedef void (tSDP_DISC_CMPL_CB2) (UINT16 result, void* user_data); +typedef void (tSDP_DISC_CMPL_CB2) (UINT16 result, void *user_data); -typedef struct -{ +typedef struct { BD_ADDR peer_addr; UINT16 peer_mtu; } tSDP_DR_OPEN; -typedef struct -{ +typedef struct { UINT8 *p_data; UINT16 data_len; } tSDP_DR_DATA; -typedef union -{ +typedef union { tSDP_DR_OPEN open; tSDP_DR_DATA data; } tSDP_DATA; @@ -94,10 +91,8 @@ typedef union typedef void (tSDP_DISC_RES_CB) (UINT16 event, tSDP_DATA *p_data); /* Define a structure to hold the discovered service information. */ -typedef struct -{ - union - { +typedef struct { + union { UINT8 u8; /* 8-bit integer */ UINT16 u16; /* 16-bit integer */ UINT32 u32; /* 32-bit integer */ @@ -107,24 +102,21 @@ typedef struct } tSDP_DISC_ATVAL; -typedef struct t_sdp_disc_attr -{ +typedef struct t_sdp_disc_attr { struct t_sdp_disc_attr *p_next_attr; /* Addr of next linked attr */ UINT16 attr_id; /* Attribute ID */ UINT16 attr_len_type; /* Length and type fields */ tSDP_DISC_ATVAL attr_value; /* Variable length entry data */ } tSDP_DISC_ATTR; -typedef struct t_sdp_disc_rec -{ +typedef struct t_sdp_disc_rec { tSDP_DISC_ATTR *p_first_attr; /* First attribute of record */ struct t_sdp_disc_rec *p_next_rec; /* Addr of next linked record */ UINT32 time_read; /* The time the record was read */ BD_ADDR remote_bd_addr; /* Remote BD address */ } tSDP_DISC_REC; -typedef struct -{ +typedef struct { UINT32 mem_size; /* Memory size of the DB */ UINT32 mem_free; /* Memory still available */ tSDP_DISC_REC *p_first_rec; /* Addr of first record in DB */ @@ -138,18 +130,16 @@ typedef struct UINT32 raw_size; /* size of raw_data */ UINT32 raw_used; /* length of raw_data used */ #endif -}tSDP_DISCOVERY_DB; +} tSDP_DISCOVERY_DB; /* This structure is used to add protocol lists and find protocol elements */ -typedef struct -{ +typedef struct { UINT16 protocol_uuid; UINT16 num_params; UINT16 params[SDP_MAX_PROTOCOL_PARAMS]; } tSDP_PROTOCOL_ELEM; -typedef struct -{ +typedef struct { UINT16 num_elems; tSDP_PROTOCOL_ELEM list_elem[SDP_MAX_LIST_ELEMS]; } tSDP_PROTO_LIST_ELEM; @@ -157,8 +147,7 @@ typedef struct /* Device Identification (DI) data structure */ /* Used to set the DI record */ -typedef struct t_sdp_di_record -{ +typedef struct t_sdp_di_record { UINT16 vendor; UINT16 vendor_id_source; UINT16 product; @@ -167,14 +156,13 @@ typedef struct t_sdp_di_record char client_executable_url[SDP_MAX_ATTR_LEN]; /* optional */ char service_description[SDP_MAX_ATTR_LEN]; /* optional */ char documentation_url[SDP_MAX_ATTR_LEN]; /* optional */ -}tSDP_DI_RECORD; +} tSDP_DI_RECORD; /* Used to get the DI record */ -typedef struct t_sdp_di_get_record -{ +typedef struct t_sdp_di_get_record { UINT16 spec_id; tSDP_DI_RECORD rec; -}tSDP_DI_GET_RECORD; +} tSDP_DI_GET_RECORD; /***************************************************************************** @@ -223,8 +211,8 @@ extern BOOLEAN SDP_CancelServiceSearch (tSDP_DISCOVERY_DB *p_db); ** *******************************************************************************/ extern BOOLEAN SDP_ServiceSearchRequest (UINT8 *p_bd_addr, - tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_CMPL_CB *p_cb); + tSDP_DISCOVERY_DB *p_db, + tSDP_DISC_CMPL_CB *p_cb); /******************************************************************************* @@ -241,8 +229,8 @@ extern BOOLEAN SDP_ServiceSearchRequest (UINT8 *p_bd_addr, ** *******************************************************************************/ extern BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, - tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_CMPL_CB *p_cb); + tSDP_DISCOVERY_DB *p_db, + tSDP_DISC_CMPL_CB *p_cb); /******************************************************************************* ** @@ -259,8 +247,8 @@ extern BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, ** *******************************************************************************/ extern BOOLEAN SDP_ServiceSearchAttributeRequest2 (UINT8 *p_bd_addr, - tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_CMPL_CB2 *p_cb, void * user_data); + tSDP_DISCOVERY_DB *p_db, + tSDP_DISC_CMPL_CB2 *p_cb, void *user_data); /* API of utilities to find data in the local discovery database */ @@ -277,8 +265,8 @@ extern BOOLEAN SDP_ServiceSearchAttributeRequest2 (UINT8 *p_bd_addr, ** *******************************************************************************/ extern tSDP_DISC_REC *SDP_FindAttributeInDb (tSDP_DISCOVERY_DB *p_db, - UINT16 attr_id, - tSDP_DISC_REC *p_start_rec); + UINT16 attr_id, + tSDP_DISC_REC *p_start_rec); /******************************************************************************* @@ -292,7 +280,7 @@ extern tSDP_DISC_REC *SDP_FindAttributeInDb (tSDP_DISCOVERY_DB *p_db, ** *******************************************************************************/ extern tSDP_DISC_ATTR *SDP_FindAttributeInRec (tSDP_DISC_REC *p_rec, - UINT16 attr_id); + UINT16 attr_id); /******************************************************************************* @@ -308,8 +296,8 @@ extern tSDP_DISC_ATTR *SDP_FindAttributeInRec (tSDP_DISC_REC *p_rec, ** *******************************************************************************/ extern tSDP_DISC_REC *SDP_FindServiceInDb (tSDP_DISCOVERY_DB *p_db, - UINT16 service_uuid, - tSDP_DISC_REC *p_start_rec); + UINT16 service_uuid, + tSDP_DISC_REC *p_start_rec); /******************************************************************************* @@ -329,8 +317,8 @@ extern tSDP_DISC_REC *SDP_FindServiceInDb (tSDP_DISCOVERY_DB *p_db, ** *******************************************************************************/ extern tSDP_DISC_REC *SDP_FindServiceUUIDInDb (tSDP_DISCOVERY_DB *p_db, - tBT_UUID *p_uuid, - tSDP_DISC_REC *p_start_rec); + tBT_UUID *p_uuid, + tSDP_DISC_REC *p_start_rec); /******************************************************************************* ** @@ -345,7 +333,7 @@ extern tSDP_DISC_REC *SDP_FindServiceUUIDInDb (tSDP_DISCOVERY_DB *p_db, ** Returns TRUE if found, otherwise FALSE. ** *******************************************************************************/ -extern BOOLEAN SDP_FindServiceUUIDInRec_128bit(tSDP_DISC_REC *p_rec, tBT_UUID * p_uuid); +extern BOOLEAN SDP_FindServiceUUIDInRec_128bit(tSDP_DISC_REC *p_rec, tBT_UUID *p_uuid); /******************************************************************************* ** @@ -360,7 +348,7 @@ extern BOOLEAN SDP_FindServiceUUIDInRec_128bit(tSDP_DISC_REC *p_rec, tBT_UUID * ** *******************************************************************************/ extern tSDP_DISC_REC *SDP_FindServiceInDb_128bit(tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_REC *p_start_rec); + tSDP_DISC_REC *p_start_rec); /******************************************************************************* ** @@ -374,8 +362,8 @@ extern tSDP_DISC_REC *SDP_FindServiceInDb_128bit(tSDP_DISCOVERY_DB *p_db, ** *******************************************************************************/ extern BOOLEAN SDP_FindProtocolListElemInRec (tSDP_DISC_REC *p_rec, - UINT16 layer_uuid, - tSDP_PROTOCOL_ELEM *p_elem); + UINT16 layer_uuid, + tSDP_PROTOCOL_ELEM *p_elem); /******************************************************************************* @@ -390,8 +378,8 @@ extern BOOLEAN SDP_FindProtocolListElemInRec (tSDP_DISC_REC *p_rec, ** *******************************************************************************/ extern BOOLEAN SDP_FindAddProtoListsElemInRec (tSDP_DISC_REC *p_rec, - UINT16 layer_uuid, - tSDP_PROTOCOL_ELEM *p_elem); + UINT16 layer_uuid, + tSDP_PROTOCOL_ELEM *p_elem); /******************************************************************************* @@ -409,8 +397,8 @@ extern BOOLEAN SDP_FindAddProtoListsElemInRec (tSDP_DISC_REC *p_rec, ** *******************************************************************************/ extern BOOLEAN SDP_FindProfileVersionInRec (tSDP_DISC_REC *p_rec, - UINT16 profile_uuid, - UINT16 *p_version); + UINT16 profile_uuid, + UINT16 *p_version); /* API into SDP for local service database updates */ @@ -544,7 +532,7 @@ extern BOOLEAN SDP_AddProtocolList (UINT32 handle, UINT16 num_elem, ** *******************************************************************************/ extern BOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem, - tSDP_PROTO_LIST_ELEM *p_proto_list); + tSDP_PROTO_LIST_ELEM *p_proto_list); /******************************************************************************* @@ -560,8 +548,8 @@ extern BOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem, ** *******************************************************************************/ extern BOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, - UINT16 profile_uuid, - UINT16 version); + UINT16 profile_uuid, + UINT16 version); /******************************************************************************* @@ -577,8 +565,8 @@ extern BOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, ** *******************************************************************************/ extern BOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, - UINT16 lang, UINT16 char_enc, - UINT16 base_id); + UINT16 lang, UINT16 char_enc, + UINT16 base_id); /******************************************************************************* @@ -594,8 +582,8 @@ extern BOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, ** *******************************************************************************/ extern BOOLEAN SDP_AddServiceClassIdList (UINT32 handle, - UINT16 num_services, - UINT16 *p_service_uuids); + UINT16 num_services, + UINT16 *p_service_uuids); /******************************************************************************* diff --git a/components/bt/bluedroid/stack/include/smp_api.h b/components/bt/bluedroid/stack/include/smp_api.h old mode 100755 new mode 100644 index 62ef1db24..cb043fdfa --- a/components/bt/bluedroid/stack/include/smp_api.h +++ b/components/bt/bluedroid/stack/include/smp_api.h @@ -60,9 +60,9 @@ #define SMP_COMPLT_EVT 7 /* SMP complete event */ #define SMP_PEER_KEYPR_NOT_EVT 8 /* Peer keypress notification received event */ #define SMP_SC_OOB_REQ_EVT 9 /* SC OOB request event (both local and peer OOB data */ - /* can be expected in response) */ +/* can be expected in response) */ #define SMP_SC_LOC_OOB_DATA_UP_EVT 10 /* SC OOB local data set is created */ - /* (as result of SMP_CrLocScOobData(...)) */ +/* (as result of SMP_CrLocScOobData(...)) */ #define SMP_BR_KEYS_REQ_EVT 12 /* SMP over BR keys request event */ typedef UINT8 tSMP_EVT; @@ -117,12 +117,11 @@ typedef UINT8 tSMP_STATUS; typedef UINT8 tSMP_IO_CAP; #ifndef SMP_DEFAULT_IO_CAPS - #define SMP_DEFAULT_IO_CAPS SMP_IO_CAP_KBDISP +#define SMP_DEFAULT_IO_CAPS SMP_IO_CAP_KBDISP #endif /* OOB data present or not */ -enum -{ +enum { SMP_OOB_NONE, SMP_OOB_PRESENT, SMP_OOB_UNKNOWN @@ -130,8 +129,7 @@ enum typedef UINT8 tSMP_OOB_FLAG; /* type of OOB data required from application */ -enum -{ +enum { SMP_OOB_INVALID_TYPE, SMP_OOB_PEER, SMP_OOB_LOCAL, @@ -175,7 +173,7 @@ typedef UINT8 tSMP_OOB_DATA_TYPE; /* Secure Connections, MITM, Bonding */ #define SMP_AUTH_SC_MITM_GB (SMP_SC_SUPPORT_BIT | SMP_AUTH_YN_BIT | SMP_AUTH_GEN_BOND) - /* All AuthReq RFU bits are set to 1 - NOTE: reserved bit in Bonding_Flags is not set */ +/* All AuthReq RFU bits are set to 1 - NOTE: reserved bit in Bonding_Flags is not set */ #define SMP_AUTH_ALL_RFU_SET 0xF8 typedef UINT8 tSMP_AUTH_REQ; @@ -212,8 +210,7 @@ typedef UINT8 tSMP_KEYS; typedef UINT8 tSMP_SC_KEY_TYPE; /* data type for BTM_SP_IO_REQ_EVT */ -typedef struct -{ +typedef struct { tSMP_IO_CAP io_cap; /* local IO capabilities */ tSMP_OOB_FLAG oob_data; /* OOB data present (locally) for the peer device */ tSMP_AUTH_REQ auth_req; /* Authentication required (for local device) */ @@ -222,64 +219,57 @@ typedef struct tSMP_KEYS resp_keys; /* responder keys */ } tSMP_IO_REQ; -typedef struct -{ +typedef struct { tSMP_STATUS reason; tSMP_SEC_LEVEL sec_level; BOOLEAN is_pair_cancel; BOOLEAN smp_over_br; } tSMP_CMPL; -typedef struct -{ +typedef struct { BT_OCTET32 x; BT_OCTET32 y; } tSMP_PUBLIC_KEY; /* the data associated with the info sent to the peer via OOB interface */ -typedef struct -{ +typedef struct { BOOLEAN present; BT_OCTET16 randomizer; BT_OCTET16 commitment; tBLE_BD_ADDR addr_sent_to; BT_OCTET32 private_key_used; /* is used to calculate: */ - /* publ_key_used = P-256(private_key_used, curve_p256.G) - send it to the */ - /* other side */ - /* dhkey = P-256(private_key_used, publ key rcvd from the other side) */ + /* publ_key_used = P-256(private_key_used, curve_p256.G) - send it to the */ + /* other side */ + /* dhkey = P-256(private_key_used, publ key rcvd from the other side) */ tSMP_PUBLIC_KEY publ_key_used; /* P-256(private_key_used, curve_p256.G) */ } tSMP_LOC_OOB_DATA; /* the data associated with the info received from the peer via OOB interface */ -typedef struct -{ +typedef struct { BOOLEAN present; BT_OCTET16 randomizer; BT_OCTET16 commitment; tBLE_BD_ADDR addr_rcvd_from; } tSMP_PEER_OOB_DATA; -typedef struct -{ +typedef struct { tSMP_LOC_OOB_DATA loc_oob_data; tSMP_PEER_OOB_DATA peer_oob_data; } tSMP_SC_OOB_DATA; -typedef union -{ +typedef union { UINT32 passkey; tSMP_IO_REQ io_req; /* IO request */ tSMP_CMPL cmplt; tSMP_OOB_DATA_TYPE req_oob_type; tSMP_LOC_OOB_DATA loc_oob_data; -}tSMP_EVT_DATA; +} tSMP_EVT_DATA; /* AES Encryption output */ -typedef struct -{ +typedef struct { UINT8 status; UINT8 param_len; UINT16 opcode; @@ -486,7 +476,7 @@ extern void SMP_KeypressNotification (BD_ADDR bd_addr, UINT8 value); ** Returns Boolean - TRUE: creation of local SC OOB data set started. *******************************************************************************/ extern BOOLEAN SMP_CreateLocalSecureConnectionsOobData ( - tBLE_BD_ADDR *addr_to_send_to); + tBLE_BD_ADDR *addr_to_send_to); #ifdef __cplusplus } diff --git a/components/bt/bluedroid/stack/l2cap/include/l2c_int.h b/components/bt/bluedroid/stack/l2cap/include/l2c_int.h old mode 100755 new mode 100644 index cbaca8251..56fdd0c94 --- a/components/bt/bluedroid/stack/l2cap/include/l2c_int.h +++ b/components/bt/bluedroid/stack/l2cap/include/l2c_int.h @@ -66,8 +66,7 @@ ** the states may seem a bit strange, but they are taken from ** the Bluetooth specification. */ -typedef enum -{ +typedef enum { CST_CLOSED, /* Channel is in clodes state */ CST_ORIG_W4_SEC_COMP, /* Originator waits security clearence */ CST_TERM_W4_SEC_COMP, /* Acceptor waits security clearence */ @@ -81,8 +80,7 @@ typedef enum /* Define the possible L2CAP link states */ -typedef enum -{ +typedef enum { LST_DISCONNECTED, LST_CONNECT_HOLDING, LST_CONNECTING_WAIT_SWITCH, @@ -157,8 +155,7 @@ typedef enum typedef uint8_t tL2C_BLE_FIXED_CHNLS_MASK; -typedef struct -{ +typedef struct { UINT8 next_tx_seq; /* Next sequence number to be Tx'ed */ UINT8 last_rx_ack; /* Last sequence number ack'ed by the peer */ UINT8 next_seq_expected; /* Next peer sequence number expected */ @@ -193,7 +190,7 @@ typedef struct UINT32 s_frames_rcvd[4]; /* S-frames rcvd (RR, REJ, RNR, SREJ) */ UINT32 xmit_window_closed; /* # of times the xmit window was closed */ UINT32 controller_idle; /* # of times less than 2 packets in controller */ - /* when the xmit window was closed */ + /* when the xmit window was closed */ UINT32 pkts_retransmitted; /* # of packets that were retransmitted */ UINT32 retrans_touts; /* # of retransmission timouts */ UINT32 xmit_ack_touts; /* # of xmit ack timouts */ @@ -224,19 +221,17 @@ typedef struct #define L2C_UCD_STATE_W4_RECEPTION 0x02 #define L2C_UCD_STATE_W4_MTU 0x04 -typedef struct -{ +typedef struct { UINT8 state; tL2CAP_UCD_CB_INFO cb_info; } tL2C_UCD_REG; #endif -typedef struct -{ +typedef struct { BOOLEAN in_use; UINT16 psm; UINT16 real_psm; /* This may be a dummy RCB for an o/b connection but */ - /* this is the real PSM that we need to connect to */ + /* this is the real PSM that we need to connect to */ #if (L2CAP_UCD_INCLUDED == TRUE) tL2C_UCD_REG ucd; #endif @@ -250,8 +245,7 @@ typedef struct ** Each CCB has unique local and remote CIDs. All channel control blocks on ** the same physical link and are chained together. */ -typedef struct t_l2c_ccb -{ +typedef struct t_l2c_ccb { BOOLEAN in_use; /* TRUE when in use, FALSE when not */ tL2C_CHNL_STATE chnl_state; /* Channel state */ @@ -319,8 +313,7 @@ typedef struct t_l2c_ccb /*********************************************************************** ** Define a queue of linked CCBs. */ -typedef struct -{ +typedef struct { tL2C_CCB *p_first_ccb; /* The first channel in this queue */ tL2C_CCB *p_last_ccb; /* The last channel in this queue */ } tL2C_CCB_Q; @@ -337,8 +330,7 @@ typedef struct /* can be sent to headset even if higher priority channel (for example, AV media channel) */ /* is congested. */ -typedef struct -{ +typedef struct { tL2C_CCB *p_serve_ccb; /* current serving ccb within priority group */ tL2C_CCB *p_first_ccb; /* first ccb of priority group */ UINT8 num_ccb; /* number of channels in priority group */ @@ -350,8 +342,7 @@ typedef struct /* Define a link control block. There is one link control block between ** this device and any other device (i.e. BD ADDR). */ -typedef struct t_l2c_linkcb -{ +typedef struct t_l2c_linkcb { BOOLEAN in_use; /* TRUE when in use, FALSE when not */ tL2C_LINK_STATE link_state; @@ -377,7 +368,7 @@ typedef struct t_l2c_linkcb UINT16 sent_not_acked; /* Num packets sent but not acked */ BOOLEAN partial_segment_being_sent; /* Set TRUE when a partial segment */ - /* is being sent. */ + /* is being sent. */ BOOLEAN w4_info_rsp; /* TRUE when info request is active */ UINT8 info_rx_bits; /* set 1 if received info type */ UINT32 peer_ext_fea; /* Peer's extended features mask */ @@ -429,8 +420,7 @@ typedef struct t_l2c_linkcb /* Define the L2CAP control structure */ -typedef struct -{ +typedef struct { UINT8 l2cap_trace_level; UINT16 controller_xmit_window; /* Total ACL window for all links */ @@ -460,7 +450,7 @@ typedef struct #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) UINT16 non_flushable_pbf; /* L2CAP_PKT_START_NON_FLUSHABLE if controller supports */ - /* Otherwise, L2CAP_PKT_START */ + /* Otherwise, L2CAP_PKT_START */ BOOLEAN is_flush_active; /* TRUE if an HCI_Enhanced_Flush has been sent */ #endif @@ -499,8 +489,7 @@ typedef struct ** This structure is used to pass between functions, and not all the ** fields will always be filled in. */ -typedef struct -{ +typedef struct { BD_ADDR bd_addr; /* Remote BD address */ UINT8 status; /* Connection status */ UINT16 psm; /* PSM of the connection */ @@ -577,7 +566,7 @@ extern void l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask); extern BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb); extern void l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason, - UINT8 rem_id,UINT16 p1, UINT16 p2); + UINT8 rem_id, UINT16 p1, UINT16 p2); extern void l2cu_send_peer_connect_req (tL2C_CCB *p_ccb); extern void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status); extern void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg); @@ -743,14 +732,14 @@ extern void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status); #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) extern void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max, - UINT16 latency, UINT16 timeout); + UINT16 latency, UINT16 timeout); #endif extern void l2cble_update_data_length(tL2C_LCB *p_lcb); extern void l2cble_set_fixed_channel_tx_data_length(BD_ADDR remote_bda, UINT16 fix_cid, - UINT16 tx_mtu); + UINT16 tx_mtu); extern void l2cble_process_data_length_change_event(UINT16 handle, UINT16 tx_data_len, - UINT16 rx_data_len); + UINT16 rx_data_len); #endif extern void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb); diff --git a/components/bt/bluedroid/stack/l2cap/l2c_api.c b/components/bt/bluedroid/stack/l2cap/l2c_api.c old mode 100755 new mode 100644 index 7f698d6dd..6aef4afc0 --- a/components/bt/bluedroid/stack/l2cap/l2c_api.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_api.c @@ -64,39 +64,34 @@ UINT16 L2CA_Register (UINT16 psm, tL2CAP_APPL_INFO *p_cb_info) ** or only a server. */ if ((!p_cb_info->pL2CA_ConfigCfm_Cb) - || (!p_cb_info->pL2CA_ConfigInd_Cb) - || (!p_cb_info->pL2CA_DataInd_Cb) - || (!p_cb_info->pL2CA_DisconnectInd_Cb)) - { + || (!p_cb_info->pL2CA_ConfigInd_Cb) + || (!p_cb_info->pL2CA_DataInd_Cb) + || (!p_cb_info->pL2CA_DisconnectInd_Cb)) { L2CAP_TRACE_ERROR ("L2CAP - no cb registering PSM: 0x%04x", psm); return (0); } /* Verify PSM is valid */ - if (L2C_INVALID_PSM(psm)) - { + if (L2C_INVALID_PSM(psm)) { L2CAP_TRACE_ERROR ("L2CAP - invalid PSM value, PSM: 0x%04x", psm); return (0); } /* Check if this is a registration for an outgoing-only connection to */ /* a dynamic PSM. If so, allocate a "virtual" PSM for the app to use. */ - if ( (psm >= 0x1001) && (p_cb_info->pL2CA_ConnectInd_Cb == NULL) ) - { - for (vpsm = 0x1002; vpsm < 0x8000; vpsm += 2) - { - if ((p_rcb = l2cu_find_rcb_by_psm (vpsm)) == NULL) + if ( (psm >= 0x1001) && (p_cb_info->pL2CA_ConnectInd_Cb == NULL) ) { + for (vpsm = 0x1002; vpsm < 0x8000; vpsm += 2) { + if ((p_rcb = l2cu_find_rcb_by_psm (vpsm)) == NULL) { break; + } } //L2CAP_TRACE_API ("L2CA_Register - Real PSM: 0x%04x Virtual PSM: 0x%04x", psm, vpsm); } /* If registration block already there, just overwrite it */ - if ((p_rcb = l2cu_find_rcb_by_psm (vpsm)) == NULL) - { - if ((p_rcb = l2cu_allocate_rcb (vpsm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (vpsm)) == NULL) { + if ((p_rcb = l2cu_allocate_rcb (vpsm)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no RCB available, PSM: 0x%04x vPSM: 0x%04x", psm, vpsm); return (0); } @@ -128,30 +123,28 @@ void L2CA_Deregister (UINT16 psm) int ii; - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) != NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) != NULL) { p_lcb = &l2cb.lcb_pool[0]; - for (ii = 0; ii < MAX_L2CAP_LINKS; ii++, p_lcb++) - { - if (p_lcb->in_use) - { + for (ii = 0; ii < MAX_L2CAP_LINKS; ii++, p_lcb++) { + if (p_lcb->in_use) { if (((p_ccb = p_lcb->ccb_queue.p_first_ccb) == NULL) - || (p_lcb->link_state == LST_DISCONNECTING)) + || (p_lcb->link_state == LST_DISCONNECTING)) { continue; + } if ((p_ccb->in_use) && - ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) || - (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP))) + ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) || + (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP))) { continue; + } - if (p_ccb->p_rcb == p_rcb) + if (p_ccb->p_rcb == p_rcb) { l2c_csm_execute (p_ccb, L2CEVT_L2CA_DISCONNECT_REQ, NULL); + } } } l2cu_release_rcb (p_rcb); - } - else - { + } else { L2CAP_TRACE_WARNING ("L2CAP - PSM: 0x%04x not found for deregistration", psm); } } @@ -171,30 +164,28 @@ UINT16 L2CA_AllocatePSM(void) BOOLEAN done = FALSE; UINT16 psm = l2cb.dyn_psm; - while (!done) - { + while (!done) { psm += 2; - if (psm > 0xfeff) - { + if (psm > 0xfeff) { psm = 0x1001; - } - else if (psm & 0x0100) - { + } else if (psm & 0x0100) { /* the upper byte must be even */ psm += 0x0100; } /* if psm is in range of reserved BRCM Aware features */ - if ((BRCM_RESERVED_PSM_START <= psm)&&(psm <= BRCM_RESERVED_PSM_END)) + if ((BRCM_RESERVED_PSM_START <= psm) && (psm <= BRCM_RESERVED_PSM_END)) { continue; + } /* make sure the newlly allocated psm is not used right now */ - if ((l2cu_find_rcb_by_psm (psm)) == NULL) + if ((l2cu_find_rcb_by_psm (psm)) == NULL) { done = TRUE; + } } l2cb.dyn_psm = psm; - return(psm); + return (psm); } /******************************************************************************* @@ -238,41 +229,36 @@ UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr, tL2CAP_ERTM_INFO *p_e //counter_add("l2cap.conn.req", 1); L2CAP_TRACE_API ("L2CA_ErtmConnectReq() PSM: 0x%04x BDA: %08x%04x p_ertm_info: 0x%08x allowed:0x%x preferred:%d", psm, - (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3], - (p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info, - (p_ertm_info) ? p_ertm_info->allowed_modes : 0, - (p_ertm_info) ? p_ertm_info->preferred_mode : 0); + (p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + p_bd_addr[3], + (p_bd_addr[4] << 8) + p_bd_addr[5], p_ertm_info, + (p_ertm_info) ? p_ertm_info->allowed_modes : 0, + (p_ertm_info) ? p_ertm_info->preferred_mode : 0); /* Fail if we have not established communications with the controller */ - if (!BTM_IsDeviceUp()) - { + if (!BTM_IsDeviceUp()) { L2CAP_TRACE_WARNING ("L2CAP connect req - BTU not ready"); return (0); } /* Fail if the PSM is not registered */ - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm); return (0); } /* First, see if we already have a link to the remote */ /* assume all ERTM l2cap connection is going over BR/EDR for now */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { /* No link. Get an LCB and start link establishment */ if ( ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) - /* currently use BR/EDR for ERTM mode l2cap connection */ - || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) ) - { + /* currently use BR/EDR for ERTM mode l2cap connection */ + || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) ) { L2CAP_TRACE_WARNING ("L2CAP - conn not started for PSM: 0x%04x p_lcb: 0x%08x", psm, p_lcb); return (0); } } /* Allocate a channel control block */ - if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) - { + if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm); return (0); } @@ -280,30 +266,32 @@ UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr, tL2CAP_ERTM_INFO *p_e /* Save registration info */ p_ccb->p_rcb = p_rcb; - if (p_ertm_info) - { + if (p_ertm_info) { p_ccb->ertm_info = *p_ertm_info; /* Replace default indicators with the actual default pool */ - if (p_ccb->ertm_info.fcr_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.fcr_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.fcr_rx_pool_id = L2CAP_FCR_RX_POOL_ID; + } - if (p_ccb->ertm_info.fcr_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.fcr_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.fcr_tx_pool_id = L2CAP_FCR_TX_POOL_ID; + } - if (p_ccb->ertm_info.user_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.user_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID; + } - if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID; + } p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) - - (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN); + (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN); } /* If link is up, start the L2CAP connection */ - if (p_lcb->link_state == LST_CONNECTED) - { + if (p_lcb->link_state == LST_CONNECTED) { l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONNECT_REQ, NULL); } @@ -313,8 +301,7 @@ UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr, tL2CAP_ERTM_INFO *p_e * ccb will be automatically retried after link disconnect * arrives */ - else if (p_lcb->link_state == LST_DISCONNECTING) - { + else if (p_lcb->link_state == LST_DISCONNECTING) { L2CAP_TRACE_DEBUG ("L2CAP API - link disconnecting: RETRY LATER"); /* Save ccb so it can be started after disconnect is finished */ @@ -327,43 +314,44 @@ UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr, tL2CAP_ERTM_INFO *p_e return (p_ccb->local_cid); } -bool L2CA_SetConnectionCallbacks(uint16_t local_cid, const tL2CAP_APPL_INFO *callbacks) { - assert(callbacks != NULL); - assert(callbacks->pL2CA_ConnectInd_Cb == NULL); - assert(callbacks->pL2CA_ConnectCfm_Cb != NULL); - assert(callbacks->pL2CA_ConfigInd_Cb != NULL); - assert(callbacks->pL2CA_ConfigCfm_Cb != NULL); - assert(callbacks->pL2CA_DisconnectInd_Cb != NULL); - assert(callbacks->pL2CA_DisconnectCfm_Cb != NULL); - assert(callbacks->pL2CA_CongestionStatus_Cb != NULL); - assert(callbacks->pL2CA_DataInd_Cb != NULL); - assert(callbacks->pL2CA_TxComplete_Cb != NULL); +bool L2CA_SetConnectionCallbacks(uint16_t local_cid, const tL2CAP_APPL_INFO *callbacks) +{ + assert(callbacks != NULL); + assert(callbacks->pL2CA_ConnectInd_Cb == NULL); + assert(callbacks->pL2CA_ConnectCfm_Cb != NULL); + assert(callbacks->pL2CA_ConfigInd_Cb != NULL); + assert(callbacks->pL2CA_ConfigCfm_Cb != NULL); + assert(callbacks->pL2CA_DisconnectInd_Cb != NULL); + assert(callbacks->pL2CA_DisconnectCfm_Cb != NULL); + assert(callbacks->pL2CA_CongestionStatus_Cb != NULL); + assert(callbacks->pL2CA_DataInd_Cb != NULL); + assert(callbacks->pL2CA_TxComplete_Cb != NULL); - tL2C_CCB *channel_control_block = l2cu_find_ccb_by_cid(NULL, local_cid); - if (!channel_control_block) { - LOG_ERROR("%s no channel control block found for L2CAP LCID=0x%04x.", __func__, local_cid); - return false; - } - - // We're making a connection-specific registration control block so we check if - // we already have a private one allocated to us on the heap. If not, we make a - // new allocation, mark it as heap-allocated, and inherit the fields from the old - // control block. - tL2C_RCB *registration_control_block = channel_control_block->p_rcb; - if (!channel_control_block->should_free_rcb) { - registration_control_block = (tL2C_RCB *)osi_calloc(sizeof(tL2C_RCB)); - if (!registration_control_block) { - LOG_ERROR("%s unable to allocate registration control block.", __func__); - return false; + tL2C_CCB *channel_control_block = l2cu_find_ccb_by_cid(NULL, local_cid); + if (!channel_control_block) { + LOG_ERROR("%s no channel control block found for L2CAP LCID=0x%04x.", __func__, local_cid); + return false; } - *registration_control_block = *channel_control_block->p_rcb; - channel_control_block->p_rcb = registration_control_block; - channel_control_block->should_free_rcb = true; - } + // We're making a connection-specific registration control block so we check if + // we already have a private one allocated to us on the heap. If not, we make a + // new allocation, mark it as heap-allocated, and inherit the fields from the old + // control block. + tL2C_RCB *registration_control_block = channel_control_block->p_rcb; + if (!channel_control_block->should_free_rcb) { + registration_control_block = (tL2C_RCB *)osi_calloc(sizeof(tL2C_RCB)); + if (!registration_control_block) { + LOG_ERROR("%s unable to allocate registration control block.", __func__); + return false; + } - registration_control_block->api = *callbacks; - return true; + *registration_control_block = *channel_control_block->p_rcb; + channel_control_block->p_rcb = registration_control_block; + channel_control_block->should_free_rcb = true; + } + + registration_control_block->api = *callbacks; + return true; } /******************************************************************************* @@ -378,7 +366,7 @@ bool L2CA_SetConnectionCallbacks(uint16_t local_cid, const tL2CAP_APPL_INFO *cal ** *******************************************************************************/ BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, - UINT16 result, UINT16 status) + UINT16 result, UINT16 status) { return L2CA_ErtmConnectRsp (p_bd_addr, id, lcid, result, status, NULL); } @@ -403,67 +391,65 @@ BOOLEAN L2CA_ErtmConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, UINT16 re //counter_add("l2cap.conn.rsp", 1); L2CAP_TRACE_API ("L2CA_ErtmConnectRsp() CID: 0x%04x Result: %d Status: %d BDA: %08x%04x p_ertm_info:0x%08x", - lcid, result, status, - (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3], - (p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info); + lcid, result, status, + (p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + p_bd_addr[3], + (p_bd_addr[4] << 8) + p_bd_addr[5], p_ertm_info); /* First, find the link control block */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { /* No link. Get an LCB and start link establishment */ L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_rsp"); return (FALSE); } /* Now, find the channel control block */ - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_rsp"); return (FALSE); } /* The IDs must match */ - if (p_ccb->remote_id != id) - { + if (p_ccb->remote_id != id) { L2CAP_TRACE_WARNING ("L2CAP - bad id in L2CA_conn_rsp. Exp: %d Got: %d", p_ccb->remote_id, id); return (FALSE); } - if (p_ertm_info) - { + if (p_ertm_info) { p_ccb->ertm_info = *p_ertm_info; /* Replace default indicators with the actual default pool */ - if (p_ccb->ertm_info.fcr_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.fcr_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.fcr_rx_pool_id = L2CAP_FCR_RX_POOL_ID; + } - if (p_ccb->ertm_info.fcr_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.fcr_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.fcr_tx_pool_id = L2CAP_FCR_TX_POOL_ID; + } - if (p_ccb->ertm_info.user_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.user_rx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID; + } - if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) + if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID) { p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID; + } p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) - (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN); } - if (result == L2CAP_CONN_OK) - { + if (result == L2CAP_CONN_OK) { l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONNECT_RSP, NULL); - } - else - { + } else { tL2C_CONN_INFO conn_info; conn_info.l2cap_result = result; conn_info.l2cap_status = status; - if (result == L2CAP_CONN_PENDING) + if (result == L2CAP_CONN_PENDING) { l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONNECT_RSP, &conn_info); - else + } else { l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONNECT_RSP_NEG, &conn_info); + } } return (TRUE); @@ -487,28 +473,26 @@ BOOLEAN L2CA_ConfigReq (UINT16 cid, tL2CAP_CFG_INFO *p_cfg) //counter_add("l2cap.cfg.req", 1); L2CAP_TRACE_API ("L2CA_ConfigReq() CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d (%d)", - cid, p_cfg->fcr_present, p_cfg->fcr.mode, p_cfg->mtu_present, p_cfg->mtu); + cid, p_cfg->fcr_present, p_cfg->fcr.mode, p_cfg->mtu_present, p_cfg->mtu); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid); return (FALSE); } /* We need to have at least one mode type common with the peer */ - if (!l2c_fcr_adj_our_req_options(p_ccb, p_cfg)) + if (!l2c_fcr_adj_our_req_options(p_ccb, p_cfg)) { return (FALSE); + } /* Don't adjust FCR options if not used */ - if ((!p_cfg->fcr_present)||(p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE)) - { + if ((!p_cfg->fcr_present) || (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE)) { /* FCR and FCS options are not used in basic mode */ p_cfg->fcs_present = FALSE; p_cfg->ext_flow_spec_present = FALSE; - if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) - { + if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) { L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu); p_cfg->mtu = L2CAP_MTU_SIZE; } @@ -539,28 +523,29 @@ BOOLEAN L2CA_ConfigRsp (UINT16 cid, tL2CAP_CFG_INFO *p_cfg) //counter_add("l2cap.cfg.rsp", 1); L2CAP_TRACE_API ("L2CA_ConfigRsp() CID: 0x%04x Result: %d MTU present:%d Flush TO:%d FCR:%d FCS:%d", - cid, p_cfg->result, p_cfg->mtu_present, p_cfg->flush_to_present, p_cfg->fcr_present, p_cfg->fcs_present); + cid, p_cfg->result, p_cfg->mtu_present, p_cfg->flush_to_present, p_cfg->fcr_present, p_cfg->fcs_present); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid); return (FALSE); } - if ( (p_cfg->result == L2CAP_CFG_OK) || (p_cfg->result == L2CAP_CFG_PENDING) ) + if ( (p_cfg->result == L2CAP_CFG_OK) || (p_cfg->result == L2CAP_CFG_PENDING) ) { l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONFIG_RSP, p_cfg); - else - { + } else { p_cfg->fcr_present = FALSE; /* FCR options already negotiated before this point */ /* Clear out any cached options that are being returned as an error (excluding FCR) */ - if (p_cfg->mtu_present) + if (p_cfg->mtu_present) { p_ccb->peer_cfg.mtu_present = FALSE; - if (p_cfg->flush_to_present) + } + if (p_cfg->flush_to_present) { p_ccb->peer_cfg.flush_to_present = FALSE; - if (p_cfg->qos_present) + } + if (p_cfg->qos_present) { p_ccb->peer_cfg.qos_present = FALSE; + } l2c_csm_execute (p_ccb, L2CEVT_L2CA_CONFIG_RSP_NEG, p_cfg); } @@ -586,8 +571,7 @@ BOOLEAN L2CA_DisconnectReq (UINT16 cid) L2CAP_TRACE_API ("L2CA_DisconnectReq() CID: 0x%04x", cid); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid); return (FALSE); } @@ -615,8 +599,7 @@ BOOLEAN L2CA_DisconnectRsp (UINT16 cid) L2CAP_TRACE_API ("L2CA_DisconnectRsp() CID: 0x%04x", cid); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid); return (FALSE); } @@ -640,23 +623,21 @@ BOOLEAN L2CA_Ping (BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB *p_callback) tL2C_LCB *p_lcb; L2CAP_TRACE_API ("L2CA_Ping() BDA: %02x-%02x-%02x-%02x-%02x-%02x", - p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], p_bd_addr[4], p_bd_addr[5]); + p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], p_bd_addr[4], p_bd_addr[5]); /* Fail if we have not established communications with the controller */ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (FALSE); + } /* First, see if we already have a link to the remote */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { /* No link. Get an LCB and start link establishment */ - if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_ping"); return (FALSE); } - if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) - { + if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) { return (FALSE); } @@ -666,15 +647,13 @@ BOOLEAN L2CA_Ping (BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB *p_callback) } /* We only allow 1 ping outstanding at a time */ - if (p_lcb->p_echo_rsp_cb != NULL) - { + if (p_lcb->p_echo_rsp_cb != NULL) { L2CAP_TRACE_WARNING ("L2CAP - rejected second L2CA_ping"); return (FALSE); } /* Have a link control block. If link is disconnecting, tell user to retry later */ - if (p_lcb->link_state == LST_DISCONNECTING) - { + if (p_lcb->link_state == LST_DISCONNECTING) { L2CAP_TRACE_WARNING ("L2CAP - L2CA_ping rejected - link disconnecting"); return (FALSE); } @@ -682,8 +661,7 @@ BOOLEAN L2CA_Ping (BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB *p_callback) /* Save address of callback */ p_lcb->p_echo_rsp_cb = p_callback; - if (p_lcb->link_state == LST_CONNECTED) - { + if (p_lcb->link_state == LST_CONNECTED) { l2cu_adj_id(p_lcb, L2CAP_ADJ_BRCM_ID); /* Make sure not using Broadcom ID */ l2cu_send_peer_echo_req (p_lcb, NULL, 0); btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_ECHO_RSP_TOUT); @@ -708,29 +686,27 @@ BOOLEAN L2CA_Echo (BD_ADDR p_bd_addr, BT_HDR *p_data, tL2CA_ECHO_DATA_CB *p_cal UINT8 *pp; L2CAP_TRACE_API ("L2CA_Echo() BDA: %08X%04X", - ((p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + (p_bd_addr[3])), - ((p_bd_addr[4] << 8) + (p_bd_addr[5]))); + ((p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + (p_bd_addr[3])), + ((p_bd_addr[4] << 8) + (p_bd_addr[5]))); /* Fail if we have not established communications with the controller */ - if (!BTM_IsDeviceUp()) + if (!BTM_IsDeviceUp()) { return (FALSE); + } - if ((memcmp(BT_BD_ANY, p_bd_addr, BD_ADDR_LEN) == 0) && (p_data == NULL)) - { + if ((memcmp(BT_BD_ANY, p_bd_addr, BD_ADDR_LEN) == 0) && (p_data == NULL)) { /* Only register callback without sending message. */ l2cb.p_echo_data_cb = p_callback; return TRUE; } /* We assume the upper layer will call this function only when the link is established. */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link not established"); return FALSE; } - if (p_lcb->link_state != LST_CONNECTED) - { + if (p_lcb->link_state != LST_CONNECTED) { L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link is not connected"); return FALSE; } @@ -747,17 +723,21 @@ BOOLEAN L2CA_Echo (BD_ADDR p_bd_addr, BT_HDR *p_data, tL2CA_ECHO_DATA_CB *p_cal } -bool L2CA_GetIdentifiers(uint16_t lcid, uint16_t *rcid, uint16_t *handle) { - tL2C_CCB *control_block = l2cu_find_ccb_by_cid(NULL, lcid); - if (!control_block) - return false; +bool L2CA_GetIdentifiers(uint16_t lcid, uint16_t *rcid, uint16_t *handle) +{ + tL2C_CCB *control_block = l2cu_find_ccb_by_cid(NULL, lcid); + if (!control_block) { + return false; + } - if (rcid) - *rcid = control_block->remote_cid; - if (handle) - *handle = control_block->p_lcb->handle; + if (rcid) { + *rcid = control_block->remote_cid; + } + if (handle) { + *handle = control_block->p_lcb->handle; + } - return true; + return true; } /******************************************************************************* @@ -784,25 +764,22 @@ BOOLEAN L2CA_SetIdleTimeout (UINT16 cid, UINT16 timeout, BOOLEAN is_global) tL2C_CCB *p_ccb; tL2C_LCB *p_lcb; - if (is_global) - { + if (is_global) { l2cb.idle_timeout = timeout; - } - else - { + } else { /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", cid); return (FALSE); } p_lcb = p_ccb->p_lcb; - if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) + if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { p_lcb->idle_timeout = timeout; - else + } else { return (FALSE); + } } return (TRUE); @@ -831,32 +808,28 @@ BOOLEAN L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, UINT16 timeout, tBT_TRANSPO { tL2C_LCB *p_lcb; - if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN)) - { + if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN)) { p_lcb = l2cu_find_lcb_by_bd_addr( bd_addr, transport); - if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) - { + if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { p_lcb->idle_timeout = timeout; - if (!p_lcb->ccb_queue.p_first_ccb) + if (!p_lcb->ccb_queue.p_first_ccb) { l2cu_no_dynamic_ccbs (p_lcb); - } - else + } + } else { return FALSE; - } - else - { + } + } else { int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { p_lcb->idle_timeout = timeout; - if (!p_lcb->ccb_queue.p_first_ccb) + if (!p_lcb->ccb_queue.p_first_ccb) { l2cu_no_dynamic_ccbs (p_lcb); + } } } } @@ -876,8 +849,9 @@ BOOLEAN L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, UINT16 timeout, tBT_TRANSPO *******************************************************************************/ UINT8 L2CA_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { l2cb.l2cap_trace_level = new_level; + } return (l2cb.l2cap_trace_level); } @@ -902,23 +876,21 @@ UINT8 L2CA_SetTraceLevel (UINT8 new_level) UINT8 L2CA_SetDesireRole (UINT8 new_role) { L2CAP_TRACE_API ("L2CA_SetDesireRole() new:x%x, disallow_switch:%d", - new_role, l2cb.disallow_switch); + new_role, l2cb.disallow_switch); - if (L2CAP_ROLE_CHECK_SWITCH != (L2CAP_ROLE_CHECK_SWITCH & new_role)) - { + if (L2CAP_ROLE_CHECK_SWITCH != (L2CAP_ROLE_CHECK_SWITCH & new_role)) { /* do not process the allow_switch when both bits are set */ - if (new_role & L2CAP_ROLE_ALLOW_SWITCH) - { + if (new_role & L2CAP_ROLE_ALLOW_SWITCH) { l2cb.disallow_switch = FALSE; } - if (new_role & L2CAP_ROLE_DISALLOW_SWITCH) - { + if (new_role & L2CAP_ROLE_DISALLOW_SWITCH) { l2cb.disallow_switch = TRUE; } } - if (new_role == HCI_ROLE_MASTER || new_role == HCI_ROLE_SLAVE) + if (new_role == HCI_ROLE_MASTER || new_role == HCI_ROLE_SLAVE) { l2cb.desire_role = new_role; + } return (l2cb.desire_role); } @@ -941,21 +913,18 @@ UINT16 L2CA_LocalLoopbackReq (UINT16 psm, UINT16 handle, BD_ADDR p_bd_addr) L2CAP_TRACE_API ("L2CA_LocalLoopbackReq() PSM: %d Handle: 0x%04x", psm, handle); /* Fail if we have not established communications with the controller */ - if (!BTM_IsDeviceUp()) - { + if (!BTM_IsDeviceUp()) { L2CAP_TRACE_WARNING ("L2CAP loop req - BTU not ready"); return (0); } /* Fail if the PSM is not registered */ - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm); return (0); } - if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_req"); return (0); } @@ -964,8 +933,7 @@ UINT16 L2CA_LocalLoopbackReq (UINT16 psm, UINT16 handle, BD_ADDR p_bd_addr) p_lcb->handle = handle; /* Allocate a channel control block */ - if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) - { + if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req"); return (0); } @@ -994,8 +962,8 @@ UINT16 L2CA_LocalLoopbackReq (UINT16 psm, UINT16 handle, BD_ADDR p_bd_addr) BOOLEAN L2CA_SetAclPriority (BD_ADDR bd_addr, UINT8 priority) { L2CAP_TRACE_API ("L2CA_SetAclPriority() bdaddr: %02x%02x%02x%02x%04x, priority:%d", - bd_addr[0], bd_addr[1], bd_addr[2], - bd_addr[3], (bd_addr[4] << 8) + bd_addr[5], priority); + bd_addr[0], bd_addr[1], bd_addr[2], + bd_addr[3], (bd_addr[4] << 8) + bd_addr[5], priority); return (l2cu_set_acl_priority(bd_addr, priority, FALSE)); } @@ -1019,27 +987,24 @@ BOOLEAN L2CA_FlowControl (UINT16 cid, BOOLEAN data_enabled) L2CAP_TRACE_API ("L2CA_FlowControl(%d) CID: 0x%04x", on_off, cid); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x data_enabled: %d", cid, data_enabled); return (FALSE); } - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) - { + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) { L2CAP_TRACE_EVENT ("L2CA_FlowControl() invalid mode:%d", p_ccb->peer_cfg.fcr.mode); return (FALSE); } - if (p_ccb->fcrb.local_busy != on_off) - { + if (p_ccb->fcrb.local_busy != on_off) { p_ccb->fcrb.local_busy = on_off; - if ( (p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack) ) - { - if (on_off) + if ( (p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack) ) { + if (on_off) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, L2CAP_FCR_P_BIT); + } } } @@ -1062,14 +1027,14 @@ BOOLEAN L2CA_SendTestSFrame (UINT16 cid, UINT8 sup_type, UINT8 back_track) L2CAP_TRACE_API ("L2CA_SendTestSFrame() CID: 0x%04x Type: 0x%02x back_track: %u", cid, sup_type, back_track); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid); return (FALSE); } - if ( (p_ccb->chnl_state != CST_OPEN) || (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) ) + if ( (p_ccb->chnl_state != CST_OPEN) || (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) ) { return (FALSE); + } p_ccb->fcrb.next_seq_expected -= back_track; @@ -1095,8 +1060,7 @@ BOOLEAN L2CA_SetTxPriority (UINT16 cid, tL2CAP_CHNL_PRIORITY priority) L2CAP_TRACE_API ("L2CA_SetTxPriority() CID: 0x%04x, priority:%d", cid, priority); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid); return (FALSE); } @@ -1123,8 +1087,7 @@ BOOLEAN L2CA_SetChnlDataRate (UINT16 cid, tL2CAP_CHNL_DATA_RATE tx, tL2CAP_CHNL_ L2CAP_TRACE_API ("L2CA_SetChnlDataRate() CID: 0x%04x, tx:%d, rx:%d", cid, tx, rx); /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", cid); return (FALSE); } @@ -1135,7 +1098,7 @@ BOOLEAN L2CA_SetChnlDataRate (UINT16 cid, tL2CAP_CHNL_DATA_RATE tx, tL2CAP_CHNL_ /* Adjust channel buffer allocation */ l2c_link_adjust_chnl_allocation (); - return(TRUE); + return (TRUE); } /******************************************************************************* @@ -1166,84 +1129,68 @@ BOOLEAN L2CA_SetFlushTimeout (BD_ADDR bd_addr, UINT16 flush_tout) UINT32 temp; /* no automatic flush (infinite timeout) */ - if (flush_tout == 0x0000) - { + if (flush_tout == 0x0000) { hci_flush_to = flush_tout; flush_tout = L2CAP_NO_AUTOMATIC_FLUSH; } /* no retransmission */ - else if (flush_tout == L2CAP_NO_RETRANSMISSION) - { + else if (flush_tout == L2CAP_NO_RETRANSMISSION) { /* not mandatory range for controller */ /* Packet is flushed before getting any ACK/NACK */ /* To do this, flush timeout should be 1 baseband slot */ hci_flush_to = flush_tout; } /* no automatic flush (infinite timeout) */ - else if (flush_tout == L2CAP_NO_AUTOMATIC_FLUSH) - { + else if (flush_tout == L2CAP_NO_AUTOMATIC_FLUSH) { hci_flush_to = 0x0000; - } - else - { + } else { /* convert L2CAP flush_to to 0.625 ms units, with round */ temp = (((UINT32)flush_tout * 8) + 3) / 5; /* if L2CAP flush_to within range of HCI, set HCI flush timeout */ - if (temp > HCI_MAX_AUTO_FLUSH_TOUT) - { + if (temp > HCI_MAX_AUTO_FLUSH_TOUT) { L2CAP_TRACE_WARNING("WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", flush_tout); return FALSE; - } - else - { + } else { hci_flush_to = (UINT16)temp; } } - if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN)) - { + if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN)) { p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR); - if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) - { - if (p_lcb->link_flush_tout != flush_tout) - { + if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { + if (p_lcb->link_flush_tout != flush_tout) { p_lcb->link_flush_tout = flush_tout; L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]", - flush_tout, bd_addr[3], bd_addr[4], bd_addr[5]); + flush_tout, bd_addr[3], bd_addr[4], bd_addr[5]); - if (!btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to)) + if (!btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to)) { return (FALSE); + } } - } - else - { + } else { L2CAP_TRACE_WARNING ("WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]", - bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[3], bd_addr[4], bd_addr[5]); return (FALSE); } - } - else - { + } else { int xx; p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) - { - if (p_lcb->link_flush_tout != flush_tout) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { + if (p_lcb->link_flush_tout != flush_tout) { p_lcb->link_flush_tout = flush_tout; L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]", - flush_tout, p_lcb->remote_bd_addr[3], - p_lcb->remote_bd_addr[4], p_lcb->remote_bd_addr[5]); + flush_tout, p_lcb->remote_bd_addr[3], + p_lcb->remote_bd_addr[4], p_lcb->remote_bd_addr[5]); - if (!btsnd_hcic_write_auto_flush_tout(p_lcb->handle, hci_flush_to)) + if (!btsnd_hcic_write_auto_flush_tout(p_lcb->handle, hci_flush_to)) { return (FALSE); + } } } } @@ -1269,17 +1216,16 @@ BOOLEAN L2CA_GetPeerFeatures (BD_ADDR bd_addr, UINT32 *p_ext_feat, UINT8 *p_chnl tL2C_LCB *p_lcb; /* We must already have a link to the remote */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_WARNING ("L2CA_GetPeerFeatures() No BDA: %08x%04x", - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5]); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5]); return (FALSE); } L2CAP_TRACE_API ("L2CA_GetPeerFeatures() BDA: %08x%04x ExtFea: 0x%08x Chnl_Mask[0]: 0x%02x", - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], p_lcb->peer_ext_fea, p_lcb->peer_chnl_mask[0]); + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], p_lcb->peer_ext_fea, p_lcb->peer_chnl_mask[0]); *p_ext_feat = p_lcb->peer_ext_fea; @@ -1306,8 +1252,7 @@ BOOLEAN L2CA_GetBDAddrbyHandle (UINT16 handle, BD_ADDR bd_addr) BOOLEAN found_dev = FALSE; p_lcb = l2cu_find_lcb_by_handle (handle); - if (p_lcb) - { + if (p_lcb) { found_dev = TRUE; memcpy (bd_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN); } @@ -1330,8 +1275,7 @@ UINT8 L2CA_GetChnlFcrMode (UINT16 lcid) { tL2C_CCB *p_ccb = l2cu_find_ccb_by_cid (NULL, lcid); - if (p_ccb) - { + if (p_ccb) { L2CAP_TRACE_API ("L2CA_GetChnlFcrMode() returns mode %d", p_ccb->peer_cfg.fcr.mode); return (p_ccb->peer_cfg.fcr.mode); } @@ -1355,8 +1299,7 @@ UINT8 L2CA_GetChnlFcrMode (UINT16 lcid) *******************************************************************************/ BOOLEAN L2CA_RegisterFixedChannel (UINT16 fixed_cid, tL2CAP_FIXED_CHNL_REG *p_freg) { - if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) ) - { + if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) ) { L2CAP_TRACE_ERROR ("L2CA_RegisterFixedChannel() Invalid CID: 0x%04x", fixed_cid); return (FALSE); @@ -1384,64 +1327,59 @@ BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; L2CAP_TRACE_API ("%s() CID: 0x%04x BDA: %08x%04x", __func__, fixed_cid, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); // Check CID is valid and registered if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) - || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) - { + || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) { L2CAP_TRACE_ERROR ("%s() Invalid CID: 0x%04x", __func__, fixed_cid); return (FALSE); } // Fail if BT is not yet up - if (!BTM_IsDeviceUp()) - { + if (!BTM_IsDeviceUp()) { L2CAP_TRACE_WARNING ("%s(0x%04x) - BTU not ready", __func__, fixed_cid); return (FALSE); } #if BLE_INCLUDED == TRUE - if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) + if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) { transport = BT_TRANSPORT_LE; + } #endif tL2C_BLE_FIXED_CHNLS_MASK peer_channel_mask; // If we already have a link to the remote, check if it supports that CID - if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) != NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) != NULL) { // Fixed channels are mandatory on LE transports so ignore the received // channel mask and use the locally cached LE channel mask. #if BLE_INCLUDED == TRUE - if (transport == BT_TRANSPORT_LE) + if (transport == BT_TRANSPORT_LE) { peer_channel_mask = l2cb.l2c_ble_fixed_chnls_mask; - else + } else #endif peer_channel_mask = p_lcb->peer_chnl_mask[0]; // Check for supported channel - if (!(peer_channel_mask & (1 << fixed_cid))) - { + if (!(peer_channel_mask & (1 << fixed_cid))) { L2CAP_TRACE_EVENT ("%s() CID:0x%04x BDA: %08x%04x not supported", __func__, - fixed_cid,(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + fixed_cid, (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); return FALSE; } // Get a CCB and link the lcb to it if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, - &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { L2CAP_TRACE_WARNING ("%s(0x%04x) - LCB but no CCB", __func__, fixed_cid); return FALSE; } // racing with disconnecting, queue the connection request - if (p_lcb->link_state == LST_DISCONNECTING) - { - L2CAP_TRACE_DEBUG ("$s() - link disconnecting: RETRY LATER", __func__); + if (p_lcb->link_state == LST_DISCONNECTING) { + L2CAP_TRACE_DEBUG ("%s() - link disconnecting: RETRY LATER", __func__); /* Save ccb so it can be started after disconnect is finished */ p_lcb->p_pending_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]; return TRUE; @@ -1449,7 +1387,7 @@ BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) #if BLE_INCLUDED == TRUE (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb) - (fixed_cid,p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport); + (fixed_cid, p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport); #else (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb) (fixed_cid, p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR); @@ -1458,24 +1396,21 @@ BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) } // No link. Get an LCB and start link establishment - if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, transport)) == NULL) - { + if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, transport)) == NULL) { L2CAP_TRACE_WARNING ("%s(0x%04x) - no LCB", __func__, fixed_cid); return FALSE; } // Get a CCB and link the lcb to it if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, - &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { p_lcb->disc_reason = L2CAP_CONN_NO_RESOURCES; L2CAP_TRACE_WARNING ("%s(0x%04x) - no CCB", __func__, fixed_cid); l2cu_release_lcb (p_lcb); return FALSE; } - if (!l2cu_create_conn(p_lcb, transport)) - { + if (!l2cu_create_conn(p_lcb, transport)) { L2CAP_TRACE_WARNING ("%s() - create_conn failed", __func__); l2cu_release_lcb (p_lcb); return FALSE; @@ -1503,25 +1438,24 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; L2CAP_TRACE_API ("L2CA_SendFixedChnlData() CID: 0x%04x BDA: %08x%04x", fixed_cid, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); #if BLE_INCLUDED == TRUE - if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) + if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) { transport = BT_TRANSPORT_LE; + } #endif // Check CID is valid and registered if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) - || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) - { + || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) { L2CAP_TRACE_ERROR ("L2CA_SendFixedChnlData() Invalid CID: 0x%04x", fixed_cid); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); } // Fail if BT is not yet up - if (!BTM_IsDeviceUp()) - { + if (!BTM_IsDeviceUp()) { L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", fixed_cid); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -1529,9 +1463,8 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) // We need to have a link up if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) == NULL || - /* if link is disconnecting, also report data sending failure */ - p_lcb->link_state == LST_DISCONNECTING) - { + /* if link is disconnecting, also report data sending failure */ + p_lcb->link_state == LST_DISCONNECTING) { L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -1541,14 +1474,13 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) // Select peer channels mask to use depending on transport #if BLE_INCLUDED == TRUE - if (transport == BT_TRANSPORT_LE) + if (transport == BT_TRANSPORT_LE) { peer_channel_mask = l2cb.l2c_ble_fixed_chnls_mask; - else + } else #endif peer_channel_mask = p_lcb->peer_chnl_mask[0]; - if ((peer_channel_mask & (1 << fixed_cid)) == 0) - { + if ((peer_channel_mask & (1 << fixed_cid)) == 0) { L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", fixed_cid); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -1557,10 +1489,8 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) p_buf->event = 0; p_buf->layer_specific = L2CAP_FLUSHABLE_CH_BASED; - if (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) - { - if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + if (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) { + if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", fixed_cid); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -1568,12 +1498,11 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) } // If already congested, do not accept any more packets - if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) - { + if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) { L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested \ xmit_hold_q.count: %u buff_quota: %u", fixed_cid, - GKI_queue_length(&p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->xmit_hold_q), - p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->buff_quota); + GKI_queue_length(&p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->xmit_hold_q), + p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->buff_quota); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); } @@ -1583,13 +1512,13 @@ UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf) l2c_link_check_send_pkts (p_lcb, NULL, NULL); // If there is no dynamic CCB on the link, restart the idle timer each time something is sent - if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && !p_lcb->ccb_queue.p_first_ccb) - { + if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && !p_lcb->ccb_queue.p_first_ccb) { l2cu_no_dynamic_ccbs (p_lcb); } - if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) + if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) { return (L2CAP_DW_CONGESTED); + } return (L2CAP_DW_SUCCESS); } @@ -1615,29 +1544,28 @@ BOOLEAN L2CA_RemoveFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) /* Check CID is valid and registered */ if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) - || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) - { + || (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) ) { L2CAP_TRACE_ERROR ("L2CA_RemoveFixedChnl() Invalid CID: 0x%04x", fixed_cid); return (FALSE); } #if BLE_INCLUDED == TRUE - if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) + if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) { transport = BT_TRANSPORT_LE; + } #endif /* Is a fixed channel connected to the remote BDA ?*/ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport); - if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) ) - { + if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) ) { L2CAP_TRACE_WARNING ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); return (FALSE); } L2CAP_TRACE_API ("L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); /* Release the CCB, starting an inactivity timeout on the LCB if no other CCBs exist */ p_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]; @@ -1652,8 +1580,9 @@ BOOLEAN L2CA_RemoveFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) // discovery. // Some devices do not do auto advertising when link is dropped, thus fail the second // connection and service discovery. - if ((fixed_cid == L2CAP_ATT_CID ) && !p_lcb->ccb_queue.p_first_ccb) + if ((fixed_cid == L2CAP_ATT_CID ) && !p_lcb->ccb_queue.p_first_ccb) { p_lcb->idle_timeout = 0; + } #endif l2cu_release_ccb (p_ccb); @@ -1684,23 +1613,22 @@ BOOLEAN L2CA_SetFixedChannelTout (BD_ADDR rem_bda, UINT16 fixed_cid, UINT16 idle tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; #if BLE_INCLUDED == TRUE - if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) + if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) { transport = BT_TRANSPORT_LE; + } #endif /* Is a fixed channel connected to the remote BDA ?*/ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport); - if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) ) - { + if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) ) { L2CAP_TRACE_WARNING ("L2CA_SetFixedChannelTout() CID: 0x%04x BDA: %08x%04x not connected", fixed_cid, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); return (FALSE); } p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->fixed_chnl_idle_tout = idle_tout; - if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && !p_lcb->ccb_queue.p_first_ccb) - { + if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && !p_lcb->ccb_queue.p_first_ccb) { /* If there are no dynamic CCBs, (re)start the idle timer in case we changed it */ l2cu_no_dynamic_ccbs (p_lcb); } @@ -1733,32 +1661,35 @@ BOOLEAN L2CA_GetCurrentConfig (UINT16 lcid, p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); - if (p_ccb) - { + if (p_ccb) { *pp_our_cfg = &(p_ccb->our_cfg); /* convert valid config items into bitmap */ *p_our_cfg_bits = 0; - if (p_ccb->our_cfg.mtu_present) + if (p_ccb->our_cfg.mtu_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_MTU; - if (p_ccb->our_cfg.qos_present) + } + if (p_ccb->our_cfg.qos_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_QOS; - if (p_ccb->our_cfg.flush_to_present) + } + if (p_ccb->our_cfg.flush_to_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO; - if (p_ccb->our_cfg.fcr_present) + } + if (p_ccb->our_cfg.fcr_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FCR; - if (p_ccb->our_cfg.fcs_present) + } + if (p_ccb->our_cfg.fcs_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FCS; - if (p_ccb->our_cfg.ext_flow_spec_present) + } + if (p_ccb->our_cfg.ext_flow_spec_present) { *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_EXT_FLOW_SPEC; + } *pp_peer_cfg = &(p_ccb->peer_cfg); *p_peer_cfg_bits = p_ccb->peer_cfg_bits; return TRUE; - } - else - { + } else { L2CAP_TRACE_ERROR ("No CCB for CID:0x%04x", lcid); return FALSE; } @@ -1784,8 +1715,9 @@ BOOLEAN L2CA_RegForNoCPEvt(tL2CA_NOCP_CB *p_cb, BD_ADDR p_bda) p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR); /* If no link for this handle, nothing to do. */ - if (!p_lcb) + if (!p_lcb) { return FALSE; + } p_lcb->p_nocp_cb = p_cb; @@ -1826,8 +1758,7 @@ BOOLEAN L2CA_SetChnlFlushability (UINT16 cid, BOOLEAN is_flushable) tL2C_CCB *p_ccb; /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", cid); return (FALSE); } @@ -1859,7 +1790,7 @@ BOOLEAN L2CA_SetChnlFlushability (UINT16 cid, BOOLEAN is_flushable) UINT8 L2CA_DataWriteEx (UINT16 cid, BT_HDR *p_data, UINT16 flags) { L2CAP_TRACE_API ("L2CA_DataWriteEx() CID: 0x%04x Len: %d Flags:0x%04X", - cid, p_data->len, flags); + cid, p_data->len, flags); return l2c_data_write (cid, p_data, flags); } @@ -1887,34 +1818,26 @@ UINT16 L2CA_FlushChannel (UINT16 lcid, UINT16 num_to_flush) p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); - if ( !p_ccb || ((p_lcb = p_ccb->p_lcb) == NULL) ) - { + if ( !p_ccb || ((p_lcb = p_ccb->p_lcb) == NULL) ) { L2CAP_TRACE_WARNING ("L2CA_FlushChannel() abnormally returning 0 CID: 0x%04x", lcid); return (0); } - if (num_to_flush != L2CAP_FLUSH_CHANS_GET) - { + if (num_to_flush != L2CAP_FLUSH_CHANS_GET) { L2CAP_TRACE_API ("L2CA_FlushChannel (FLUSH) CID: 0x%04x NumToFlush: %d QC: %u pFirst: 0x%08x", - lcid, num_to_flush, GKI_queue_length(&p_ccb->xmit_hold_q), GKI_getfirst(&p_ccb->xmit_hold_q)); - } - else - { + lcid, num_to_flush, GKI_queue_length(&p_ccb->xmit_hold_q), GKI_getfirst(&p_ccb->xmit_hold_q)); + } else { L2CAP_TRACE_API ("L2CA_FlushChannel (QUERY) CID: 0x%04x", lcid); } /* Cannot flush eRTM buffers once they have a sequence number */ - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) - { + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) { #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE - if (num_to_flush != L2CAP_FLUSH_CHANS_GET) - { + if (num_to_flush != L2CAP_FLUSH_CHANS_GET) { /* If the controller supports enhanced flush, flush the data queued at the controller */ if ( (HCI_NON_FLUSHABLE_PB_SUPPORTED(BTM_ReadLocalFeatures ())) - && (BTM_GetNumScoLinks() == 0) ) - { - if ( l2cb.is_flush_active == FALSE ) - { + && (BTM_GetNumScoLinks() == 0) ) { + if ( l2cb.is_flush_active == FALSE ) { l2cb.is_flush_active = TRUE; /* The only packet type defined - 0 - Automatically-Flushable Only */ @@ -1927,41 +1850,43 @@ UINT16 L2CA_FlushChannel (UINT16 lcid, UINT16 num_to_flush) // Iterate though list and flush the amount requested from // the transmit data queue that satisfy the layer and event conditions. for (const list_node_t *node = list_begin(p_lcb->link_xmit_data_q); - (num_to_flush > 0) && node != list_end(p_lcb->link_xmit_data_q);) { - BT_HDR *p_buf = (BT_HDR *)list_node(node); - node = list_next(node); - if ((p_buf->layer_specific == 0) && (p_buf->event == lcid)) { - num_to_flush--; - num_flushed1++; + (num_to_flush > 0) && node != list_end(p_lcb->link_xmit_data_q);) { + BT_HDR *p_buf = (BT_HDR *)list_node(node); + node = list_next(node); + if ((p_buf->layer_specific == 0) && (p_buf->event == lcid)) { + num_to_flush--; + num_flushed1++; - list_remove(p_lcb->link_xmit_data_q, p_buf); - GKI_freebuf(p_buf); - } + list_remove(p_lcb->link_xmit_data_q, p_buf); + GKI_freebuf(p_buf); + } } } /* If needed, flush buffers in the CCB xmit hold queue */ - while ( (num_to_flush != 0) && (!GKI_queue_is_empty(&p_ccb->xmit_hold_q))) - { + while ( (num_to_flush != 0) && (!GKI_queue_is_empty(&p_ccb->xmit_hold_q))) { BT_HDR *p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q); - if (p_buf) + if (p_buf) { GKI_freebuf (p_buf); + } num_to_flush--; num_flushed2++; } /* If app needs to track all packets, call him */ - if ( (p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_TxComplete_Cb) && (num_flushed2) ) + if ( (p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_TxComplete_Cb) && (num_flushed2) ) { (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, num_flushed2); + } /* Now count how many are left */ for (const list_node_t *node = list_begin(p_lcb->link_xmit_data_q); - node != list_end(p_lcb->link_xmit_data_q); - node = list_next(node)) { + node != list_end(p_lcb->link_xmit_data_q); + node = list_next(node)) { - BT_HDR *p_buf = (BT_HDR *)list_node(node); - if (p_buf->event == lcid) - num_left++; + BT_HDR *p_buf = (BT_HDR *)list_node(node); + if (p_buf->event == lcid) { + num_left++; + } } /* Add in the number in the CCB xmit queue */ diff --git a/components/bt/bluedroid/stack/l2cap/l2c_ble.c b/components/bt/bluedroid/stack/l2cap/l2c_ble.c old mode 100755 new mode 100644 index d3d34ac47..3888feb47 --- a/components/bt/bluedroid/stack/l2cap/l2c_ble.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_ble.c @@ -51,39 +51,35 @@ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda) tL2C_LCB *p_lcb; /* There can be only one BLE connection request outstanding at a time */ - if (btm_ble_get_conn_st() == BLE_CONN_IDLE) - { + if (btm_ble_get_conn_st() == BLE_CONN_IDLE) { L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - no connection pending"); - return(FALSE); + return (FALSE); } - if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN)) - { + if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN)) { L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x", - (l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3], - (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5], - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); + (l2cb.ble_connecting_bda[0] << 24) + (l2cb.ble_connecting_bda[1] << 16) + (l2cb.ble_connecting_bda[2] << 8) + l2cb.ble_connecting_bda[3], + (l2cb.ble_connecting_bda[4] << 8) + l2cb.ble_connecting_bda[5], + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], (rem_bda[4] << 8) + rem_bda[5]); - return(FALSE); + return (FALSE); } - if (btsnd_hcic_ble_create_conn_cancel()) - { + if (btsnd_hcic_ble_create_conn_cancel()) { p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE); /* Do not remove lcb if an LE link is already up as a peripheral */ if (p_lcb != NULL && - !(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(rem_bda))) - { + !(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(rem_bda))) { p_lcb->disc_reason = L2CAP_CONN_CANCEL; l2cu_release_lcb (p_lcb); } /* update state to be cancel, wait for connection cancel complete */ btm_ble_set_conn_st (BLE_CONN_CANCEL); - return(TRUE); + return (TRUE); + } else { + return (FALSE); } - else - return(FALSE); } /******************************************************************************* @@ -98,7 +94,7 @@ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda) ** *******************************************************************************/ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int, - UINT16 latency, UINT16 timeout) + UINT16 latency, UINT16 timeout) { tL2C_LCB *p_lcb; tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE); @@ -107,20 +103,18 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); /* If we don't have one, create one and accept the connection. */ - if (!p_lcb || !p_acl_cb) - { + if (!p_lcb || !p_acl_cb) { L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x", - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); - return(FALSE); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); + return (FALSE); } - if (p_lcb->transport != BT_TRANSPORT_LE) - { + if (p_lcb->transport != BT_TRANSPORT_LE) { L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE", - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); - return(FALSE); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); + return (FALSE); } p_lcb->min_interval = min_int; @@ -131,7 +125,7 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in l2cble_start_conn_update(p_lcb); - return(TRUE); + return (TRUE); } @@ -153,30 +147,29 @@ BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable) /* See if we have a link control block for the remote device */ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); - if (!p_lcb) - { + if (!p_lcb) { L2CAP_TRACE_WARNING ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x", - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); return (FALSE); } - L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask); + L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x", __FUNCTION__, + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5], enable, p_lcb->conn_update_mask); - if (p_lcb->transport != BT_TRANSPORT_LE) - { + if (p_lcb->transport != BT_TRANSPORT_LE) { L2CAP_TRACE_WARNING ("%s - BD_ADDR %08x%04x not LE (link role %d)", __FUNCTION__, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5], p_lcb->link_role); return (FALSE); } - if (enable) + if (enable) { p_lcb->conn_update_mask &= ~L2C_BLE_CONN_UPDATE_DISABLE; - else + } else { p_lcb->conn_update_mask |= L2C_BLE_CONN_UPDATE_DISABLE; + } l2cble_start_conn_update(p_lcb); @@ -199,8 +192,9 @@ UINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr) tL2C_LCB *p_lcb; - if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL) + if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL) { role = p_lcb->link_role; + } return role; } @@ -218,10 +212,11 @@ UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport) tL2C_LCB *p_lcb; UINT16 reason = 0; - if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL) + if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL) { reason = p_lcb->disc_reason; + } - L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ",reason); + L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ", reason); return reason; } @@ -240,8 +235,7 @@ void l2cble_notify_le_connection (BD_ADDR bda) tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); tACL_CONN *p_acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE) ; - if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED) - { + if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED) { /* update link status */ btm_establish_continue(p_acl); /* update l2cap link status and send callback */ @@ -268,7 +262,7 @@ void l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda); L2CAP_TRACE_DEBUG ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d", - handle, type, conn_interval, conn_latency, conn_timeout); + handle, type, conn_interval, conn_latency, conn_timeout); l2cb.is_ble_connecting = FALSE; @@ -276,27 +270,20 @@ void l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); /* If we don't have one, create one. this is auto connection complete. */ - if (!p_lcb) - { + if (!p_lcb) { p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); - if (!p_lcb) - { + if (!p_lcb) { btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); L2CAP_TRACE_ERROR ("l2cble_scanner_conn_comp - failed to allocate LCB"); return; - } - else - { - if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + } else { + if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); return ; } } - } - else if (p_lcb->link_state != LST_CONNECTING) - { + } else if (p_lcb->link_state != LST_CONNECTING) { L2CAP_TRACE_ERROR ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state); return; } @@ -317,21 +304,20 @@ void l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, /* If there are any preferred connection parameters, set them now */ if ( (p_dev_rec->conn_params.min_conn_int >= BTM_BLE_CONN_INT_MIN ) && - (p_dev_rec->conn_params.min_conn_int <= BTM_BLE_CONN_INT_MAX ) && - (p_dev_rec->conn_params.max_conn_int >= BTM_BLE_CONN_INT_MIN ) && - (p_dev_rec->conn_params.max_conn_int <= BTM_BLE_CONN_INT_MAX ) && - (p_dev_rec->conn_params.slave_latency <= BTM_BLE_CONN_LATENCY_MAX ) && - (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) && - (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) && - ((conn_interval < p_dev_rec->conn_params.min_conn_int && - p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) || - (conn_interval > p_dev_rec->conn_params.max_conn_int) || - (conn_latency > p_dev_rec->conn_params.slave_latency) || - (conn_timeout > p_dev_rec->conn_params.supervision_tout))) - { + (p_dev_rec->conn_params.min_conn_int <= BTM_BLE_CONN_INT_MAX ) && + (p_dev_rec->conn_params.max_conn_int >= BTM_BLE_CONN_INT_MIN ) && + (p_dev_rec->conn_params.max_conn_int <= BTM_BLE_CONN_INT_MAX ) && + (p_dev_rec->conn_params.slave_latency <= BTM_BLE_CONN_LATENCY_MAX ) && + (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) && + (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) && + ((conn_interval < p_dev_rec->conn_params.min_conn_int && + p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) || + (conn_interval > p_dev_rec->conn_params.max_conn_int) || + (conn_latency > p_dev_rec->conn_params.slave_latency) || + (conn_timeout > p_dev_rec->conn_params.supervision_tout))) { L2CAP_TRACE_ERROR ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d", - handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int, - p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout); + handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int, + p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout); p_lcb->min_interval = p_dev_rec->conn_params.min_conn_int; p_lcb->max_interval = p_dev_rec->conn_params.max_conn_int; @@ -384,19 +370,14 @@ void l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE typ p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); /* If we don't have one, create one and accept the connection. */ - if (!p_lcb) - { + if (!p_lcb) { p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); - if (!p_lcb) - { + if (!p_lcb) { btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); L2CAP_TRACE_ERROR ("l2cble_advertiser_conn_comp - failed to allocate LCB"); return; - } - else - { - if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + } else { + if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); return ; @@ -428,15 +409,13 @@ void l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE typ p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT; - if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(controller_get_interface()->get_features_ble()->as_array)) - { + if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(controller_get_interface()->get_features_ble()->as_array)) { p_lcb->link_state = LST_CONNECTED; l2cu_process_fixed_chnl_resp (p_lcb); } /* when adv and initiating are both active, cancel the direct connection */ - if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0) - { + if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0) { L2CA_CancelBleConnectReq(bda); } } @@ -456,12 +435,9 @@ void l2cble_conn_comp(UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE typ { btm_ble_update_link_topology_mask(role, TRUE); - if (role == HCI_ROLE_MASTER) - { + if (role == HCI_ROLE_MASTER) { l2cble_scanner_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); - } - else - { + } else { l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); } } @@ -483,17 +459,17 @@ static void l2cble_start_conn_update (tL2C_LCB *p_lcb) tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr); tACL_CONN *p_acl_cb = btm_bda_to_acl(p_lcb->remote_bd_addr, BT_TRANSPORT_LE); - if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) return; + if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) { + return; + } - if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) - { + if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) { /* application requests to disable parameters update. If parameters are already updated, lets set them up to what has been requested during connection establishement */ if (p_lcb->conn_update_mask & L2C_BLE_NOT_DEFAULT_PARAM && - /* current connection interval is greater than default min */ - p_lcb->min_interval > BTM_BLE_CONN_INT_MIN) - { + /* current connection interval is greater than default min */ + p_lcb->min_interval > BTM_BLE_CONN_INT_MIN) { /* use 7.5 ms as fast connection parameter, 0 slave latency */ min_conn_int = max_conn_int = BTM_BLE_CONN_INT_MIN; slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; @@ -502,42 +478,33 @@ static void l2cble_start_conn_update (tL2C_LCB *p_lcb) /* if both side 4.1, or we are master device, send HCI command */ if (p_lcb->link_role == HCI_ROLE_MASTER #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) - || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && - HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) + || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && + HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) #endif - ) - { + ) { btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, min_conn_int, max_conn_int, slave_latency, supervision_tout, 0, 0); p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; - } - else - { + } else { l2cu_send_peer_ble_par_req (p_lcb, min_conn_int, max_conn_int, slave_latency, supervision_tout); } p_lcb->conn_update_mask &= ~L2C_BLE_NOT_DEFAULT_PARAM; p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; - } - } - else - { + } + } else { /* application allows to do update, if we were delaying one do it now */ - if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM) - { - /* if both side 4.1, or we are master device, send HCI command */ + if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM) { + /* if both side 4.1, or we are master device, send HCI command */ if (p_lcb->link_role == HCI_ROLE_MASTER #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) - || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && - HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) + || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && + HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) #endif - ) - { + ) { btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval, - p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0); + p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0); p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; - } - else - { + } else { l2cu_send_peer_ble_par_req (p_lcb, p_lcb->min_interval, p_lcb->max_interval, p_lcb->latency, p_lcb->timeout); } @@ -565,16 +532,14 @@ void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status) /* See if we have a link control block for the remote device */ p_lcb = l2cu_find_lcb_by_handle(handle); - if (!p_lcb) - { + if (!p_lcb) { L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Invalid handle: %d", handle); return; } p_lcb->conn_update_mask &= ~L2C_BLE_UPDATE_PENDING; - if (status != HCI_SUCCESS) - { + if (status != HCI_SUCCESS) { L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Error status: %d", status); } @@ -606,70 +571,65 @@ void l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) STREAM_TO_UINT16 (cmd_len, p); /* Check command length does not exceed packet length */ - if ((p + cmd_len) > p_pkt_end) - { + if ((p + cmd_len) > p_pkt_end) { L2CAP_TRACE_WARNING ("L2CAP - LE - format error, pkt_len: %d cmd_len: %d code: %d", pkt_len, cmd_len, cmd_code); return; } - switch (cmd_code) - { - case L2CAP_CMD_REJECT: - case L2CAP_CMD_ECHO_RSP: - case L2CAP_CMD_INFO_RSP: - p += 2; - break; - case L2CAP_CMD_ECHO_REQ: - case L2CAP_CMD_INFO_REQ: - l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); - break; + switch (cmd_code) { + case L2CAP_CMD_REJECT: + case L2CAP_CMD_ECHO_RSP: + case L2CAP_CMD_INFO_RSP: + p += 2; + break; + case L2CAP_CMD_ECHO_REQ: + case L2CAP_CMD_INFO_REQ: + l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); + break; - case L2CAP_CMD_BLE_UPDATE_REQ: - STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */ - STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */ - STREAM_TO_UINT16 (latency, p); /* 0x0000 - 0x03E8 */ - STREAM_TO_UINT16 (timeout, p); /* 0x000A - 0x0C80 */ - /* If we are a master, the slave wants to update the parameters */ - if (p_lcb->link_role == HCI_ROLE_MASTER) - { - if (min_interval < BTM_BLE_CONN_INT_MIN_LIMIT) - min_interval = BTM_BLE_CONN_INT_MIN_LIMIT; + case L2CAP_CMD_BLE_UPDATE_REQ: + STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */ + STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */ + STREAM_TO_UINT16 (latency, p); /* 0x0000 - 0x03E8 */ + STREAM_TO_UINT16 (timeout, p); /* 0x000A - 0x0C80 */ + /* If we are a master, the slave wants to update the parameters */ + if (p_lcb->link_role == HCI_ROLE_MASTER) { + if (min_interval < BTM_BLE_CONN_INT_MIN_LIMIT) { + min_interval = BTM_BLE_CONN_INT_MIN_LIMIT; + } - if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX || + if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX || max_interval < BTM_BLE_CONN_INT_MIN || max_interval > BTM_BLE_CONN_INT_MAX || latency > BTM_BLE_CONN_LATENCY_MAX || /*(timeout >= max_interval && latency > (timeout * 10/(max_interval * 1.25) - 1)) ||*/ timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX || - max_interval < min_interval) - { - l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); - } - else - { + max_interval < min_interval) { + l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); + } else { - l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id); + l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id); - p_lcb->min_interval = min_interval; - p_lcb->max_interval = max_interval; - p_lcb->latency = latency; - p_lcb->timeout = timeout; - p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; + p_lcb->min_interval = min_interval; + p_lcb->max_interval = max_interval; + p_lcb->latency = latency; + p_lcb->timeout = timeout; + p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; - l2cble_start_conn_update(p_lcb); - } + l2cble_start_conn_update(p_lcb); } - else - l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); - break; - - case L2CAP_CMD_BLE_UPDATE_RSP: - p += 2; - break; - - default: - L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code); + } else { l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); - return; + } + break; + + case L2CAP_CMD_BLE_UPDATE_RSP: + p += 2; + break; + + default: + L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code); + l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); + return; } } @@ -693,10 +653,9 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb) UINT8 own_addr_type = BLE_ADDR_PUBLIC; /* There can be only one BLE connection request outstanding at a time */ - if (p_dev_rec == NULL) - { + if (p_dev_rec == NULL) { L2CAP_TRACE_WARNING ("unknown device, can not initate connection"); - return(FALSE); + return (FALSE); } scan_int = (p_cb->scan_int == BTM_BLE_SCAN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int; @@ -707,20 +666,19 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb) #if ( (defined BLE_PRIVACY_SPT) && (BLE_PRIVACY_SPT == TRUE)) own_addr_type = btm_cb.ble_ctr_cb.privacy_mode ? BLE_ADDR_RANDOM : BLE_ADDR_PUBLIC; - if (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) - { - if (btm_cb.ble_ctr_cb.privacy_mode >= BTM_PRIVACY_1_2) + if (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) { + if (btm_cb.ble_ctr_cb.privacy_mode >= BTM_PRIVACY_1_2) { own_addr_type |= BLE_ADDR_TYPE_ID_BIT; + } btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); btm_random_pseudo_to_identity_addr(peer_addr, &peer_addr_type); - } - else + } else { btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, TRUE); + } #endif - if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) - { + if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) { l2cu_release_lcb (p_lcb); L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation"); return FALSE; @@ -732,23 +690,20 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb) peer_addr_type, /* UINT8 addr_type_peer */ peer_addr, /* BD_ADDR bda_peer */ own_addr_type, /* UINT8 addr_type_own */ - (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? - p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF), /* UINT16 conn_int_min */ - (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? - p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF), /* UINT16 conn_int_max */ - (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ? - p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency */ - (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ? - p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */ + (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? + p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF), /* UINT16 conn_int_min */ + (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? + p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF), /* UINT16 conn_int_max */ + (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ? + p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency */ + (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ? + p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */ 0, /* UINT16 min_len */ - 0)) /* UINT16 max_len */ - { + 0)) { /* UINT16 max_len */ l2cu_release_lcb (p_lcb); L2CAP_TRACE_ERROR("initate direct connection fail, no resources"); return (FALSE); - } - else - { + } else { p_lcb->link_state = LST_CONNECTING; l2cb.is_ble_connecting = TRUE; memcpy (l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN); @@ -774,18 +729,16 @@ BOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb) BOOLEAN rt = FALSE; /* There can be only one BLE connection request outstanding at a time */ - if (conn_st == BLE_CONN_IDLE) - { + if (conn_st == BLE_CONN_IDLE) { rt = l2cble_init_direct_conn(p_lcb); - } - else - { + } else { L2CAP_TRACE_WARNING ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st); btm_ble_enqueue_direct_conn_req(p_lcb); - if (conn_st == BLE_BG_CONN) + if (conn_st == BLE_BG_CONN) { btm_ble_suspend_bg_conn(); + } rt = TRUE; } @@ -805,8 +758,7 @@ BOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb) *******************************************************************************/ void l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs) { - if (num_lm_ble_bufs == 0) - { + if (num_lm_ble_bufs == 0) { num_lm_ble_bufs = L2C_DEF_NUM_BLE_BUF_SHARED; l2cb.num_lm_acl_bufs -= L2C_DEF_NUM_BLE_BUF_SHARED; } @@ -840,29 +792,28 @@ void l2c_ble_link_adjust_allocation (void) UINT16 high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A; /* If no links active, reset buffer quotas and controller buffers */ - if (l2cb.num_ble_links_active == 0) - { + if (l2cb.num_ble_links_active == 0) { l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs; l2cb.ble_round_robin_quota = l2cb.ble_round_robin_unacked = 0; return; } /* First, count the links */ - for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) - { - if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) - { - if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) + for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) { + if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) { + if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) { num_hipri_links++; - else + } else { num_lowpri_links++; + } } } /* now adjust high priority link quota */ low_quota = num_lowpri_links ? 1 : 0; - while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) + while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) { high_pri_link_quota--; + } /* Work out the xmit quota and buffer quota high and low priorities */ @@ -872,68 +823,61 @@ void l2c_ble_link_adjust_allocation (void) /* Work out and save the HCI xmit quota for each low priority link */ /* If each low priority link cannot have at least one buffer */ - if (num_lowpri_links > low_quota) - { + if (num_lowpri_links > low_quota) { l2cb.ble_round_robin_quota = low_quota; qq = qq_remainder = 0; } /* If each low priority link can have at least one buffer */ - else if (num_lowpri_links > 0) - { + else if (num_lowpri_links > 0) { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = low_quota / num_lowpri_links; qq_remainder = low_quota % num_lowpri_links; } /* If no low priority link */ - else - { + else { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = qq_remainder = 0; } L2CAP_TRACE_EVENT ("l2c_ble_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u", - num_hipri_links, num_lowpri_links, low_quota, - l2cb.ble_round_robin_quota, qq); + num_hipri_links, num_lowpri_links, low_quota, + l2cb.ble_round_robin_quota, qq); /* Now, assign the quotas to each link */ - for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) - { - if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) - { - if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) - { + for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) { + if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) { + if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) { p_lcb->link_xmit_quota = high_pri_link_quota; - } - else - { + } else { /* Safety check in case we switched to round-robin with something outstanding */ /* if sent_not_acked is added into round_robin_unacked then don't add it again */ /* l2cap keeps updating sent_not_acked for exiting from round robin */ - if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 )) + if (( p_lcb->link_xmit_quota > 0 ) && ( qq == 0 )) { l2cb.ble_round_robin_unacked += p_lcb->sent_not_acked; + } p_lcb->link_xmit_quota = qq; - if (qq_remainder > 0) - { + if (qq_remainder > 0) { p_lcb->link_xmit_quota++; qq_remainder--; } } L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d", - yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); + yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); L2CAP_TRACE_EVENT(" SentNotAcked: %d RRUnacked: %d", - p_lcb->sent_not_acked, l2cb.round_robin_unacked); + p_lcb->sent_not_acked, l2cb.round_robin_unacked); /* There is a special case where we have readjusted the link quotas and */ /* this link may have sent anything but some other link sent packets so */ /* so we may need a timer to kick off this link's transmissions. */ if ( (p_lcb->link_state == LST_CONNECTED) - && (!list_is_empty(p_lcb->link_xmit_data_q)) - && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) + && (!list_is_empty(p_lcb->link_xmit_data_q)) + && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT); + } } } } @@ -949,32 +893,26 @@ void l2c_ble_link_adjust_allocation (void) ** *******************************************************************************/ void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max, - UINT16 latency, UINT16 timeout) + UINT16 latency, UINT16 timeout) { tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle (handle); - if (p_lcb != NULL) - { + if (p_lcb != NULL) { p_lcb->min_interval = int_min; p_lcb->max_interval = int_max; p_lcb->latency = latency; p_lcb->timeout = timeout; /* if update is enabled, always accept connection parameter update */ - if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0) - { + if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0) { btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0); - } - else - { + } else { L2CAP_TRACE_EVENT ("L2CAP - LE - update currently disabled"); p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; - btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL); + btsnd_hcic_ble_rc_param_req_neg_reply (handle, HCI_ERR_UNACCEPT_CONN_INTERVAL); } - } - else - { + } else { L2CAP_TRACE_WARNING("No link to update connection parameter") } } @@ -997,25 +935,27 @@ void l2cble_update_data_length(tL2C_LCB *p_lcb) L2CAP_TRACE_DEBUG("%s", __FUNCTION__); /* See if we have a link control block for the connection */ - if (p_lcb == NULL) + if (p_lcb == NULL) { return; + } - for (i = 0; i < L2CAP_NUM_FIXED_CHNLS; i++) - { - if (i + L2CAP_FIRST_FIXED_CHNL != L2CAP_BLE_SIGNALLING_CID) - { + for (i = 0; i < L2CAP_NUM_FIXED_CHNLS; i++) { + if (i + L2CAP_FIRST_FIXED_CHNL != L2CAP_BLE_SIGNALLING_CID) { if ((p_lcb->p_fixed_ccbs[i] != NULL) && - (tx_mtu < (p_lcb->p_fixed_ccbs[i]->tx_data_len + L2CAP_PKT_OVERHEAD))) + (tx_mtu < (p_lcb->p_fixed_ccbs[i]->tx_data_len + L2CAP_PKT_OVERHEAD))) { tx_mtu = p_lcb->p_fixed_ccbs[i]->tx_data_len + L2CAP_PKT_OVERHEAD; + } } } - if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) + if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) { tx_mtu = BTM_BLE_DATA_SIZE_MAX; + } /* update TX data length if changed */ - if (p_lcb->tx_data_len != tx_mtu) + if (p_lcb->tx_data_len != tx_mtu) { BTM_SetBleDataLength(p_lcb->remote_bd_addr, tx_mtu); + } } @@ -1033,11 +973,13 @@ void l2cble_process_data_length_change_event(UINT16 handle, UINT16 tx_data_len, tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle); L2CAP_TRACE_DEBUG("%s TX data len = %d", __FUNCTION__, tx_data_len); - if (p_lcb == NULL) + if (p_lcb == NULL) { return; + } - if (tx_data_len > 0) + if (tx_data_len > 0) { p_lcb->tx_data_len = tx_data_len; + } /* ignore rx_data len for now */ } @@ -1058,20 +1000,20 @@ void l2cble_set_fixed_channel_tx_data_length(BD_ADDR remote_bda, UINT16 fix_cid, L2CAP_TRACE_DEBUG("%s TX MTU = %d", __FUNCTION__, tx_mtu); - if (!controller_get_interface()->supports_ble_packet_extension()) - { + if (!controller_get_interface()->supports_ble_packet_extension()) { L2CAP_TRACE_WARNING("%s, request not supported", __FUNCTION__); return; } /* See if we have a link control block for the connection */ - if (p_lcb == NULL) + if (p_lcb == NULL) { return; + } - if (p_lcb->p_fixed_ccbs[cid] != NULL) - { - if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) + if (p_lcb->p_fixed_ccbs[cid] != NULL) { + if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) { tx_mtu = BTM_BLE_DATA_SIZE_MAX; + } p_lcb->p_fixed_ccbs[cid]->tx_data_len = tx_mtu; } diff --git a/components/bt/bluedroid/stack/l2cap/l2c_csm.c b/components/bt/bluedroid/stack/l2cap/l2c_csm.c old mode 100755 new mode 100644 index 7a77f36f1..13d9beed5 --- a/components/bt/bluedroid/stack/l2cap/l2c_csm.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_csm.c @@ -64,8 +64,7 @@ static char *l2c_csm_get_event_name (UINT16 event); *******************************************************************************/ void l2c_csm_execute (tL2C_CCB *p_ccb, UINT16 event, void *p_data) { - switch (p_ccb->chnl_state) - { + switch (p_ccb->chnl_state) { case CST_CLOSED: l2c_csm_closed (p_ccb, event, p_data); break; @@ -103,7 +102,7 @@ void l2c_csm_execute (tL2C_CCB *p_ccb, UINT16 event, void *p_data) break; default: - L2CAP_TRACE_DEBUG("Unhandled event! event = %d",event); + L2CAP_TRACE_DEBUG("Unhandled event! event = %d", event); break; } } @@ -126,8 +125,7 @@ static void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data) tL2CA_DISCONNECT_IND_CB *disconnect_ind; tL2CA_CONNECT_CFM_CB *connect_cfm; - if (p_ccb->p_rcb == NULL) - { + if (p_ccb->p_rcb == NULL) { #if (BT_TRACE_VERBOSE == TRUE) L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x st: CLOSED evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event)); #else @@ -137,11 +135,9 @@ static void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data) } #if (L2CAP_UCD_INCLUDED == TRUE) - if ( local_cid == L2CAP_CONNECTIONLESS_CID ) - { + if ( local_cid == L2CAP_CONNECTIONLESS_CID ) { /* check if this event can be processed by UCD */ - if ( l2c_ucd_process_event (p_ccb, event, p_data) ) - { + if ( l2c_ucd_process_event (p_ccb, event, p_data) ) { /* The event is processed by UCD state machine */ return; } @@ -157,8 +153,7 @@ static void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data) L2CAP_TRACE_EVENT ("L2CAP - st: CLOSED evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -174,8 +169,7 @@ static void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_LP_CONNECT_CFM_NEG: /* Link failed */ /* Disconnect unless ACL collision and upper layer wants to handle it */ if (p_ci->status != HCI_ERR_CONNECTION_EXISTS - || !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr)) - { + || !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr)) { L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x Status: %d", p_ccb->local_cid, p_ci->status); l2cu_release_ccb (p_ccb); (*connect_cfm)(local_cid, p_ci->status); @@ -184,42 +178,39 @@ static void l2c_csm_closed (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_L2CA_CONNECT_REQ: /* API connect request */ /* Cancel sniff mode if needed */ - { - tBTM_PM_PWR_MD settings; + { + tBTM_PM_PWR_MD settings; // btla-specific ++ - memset((void*)&settings, 0, sizeof(settings)); + memset((void *)&settings, 0, sizeof(settings)); // btla-specific -- - settings.mode = BTM_PM_MD_ACTIVE; -/* COVERITY -Event uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details] -Event uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details] -Event uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode" -// FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment. -// coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored -*/ - BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); - } + settings.mode = BTM_PM_MD_ACTIVE; + /* COVERITY + Event uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details] + Event uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details] + Event uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode" + // FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment. + // coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored + */ + BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); + } /* If sec access does not result in started SEC_COM or COMP_NEG are already processed */ - if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm, - p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED) - p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP; - break; + if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm, + p_ccb->p_lcb->handle, TRUE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED) { + p_ccb->chnl_state = CST_ORIG_W4_SEC_COMP; + } + break; case L2CEVT_SEC_COMP: p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP; /* Wait for the info resp in this state before sending connect req (if needed) */ - if (!p_ccb->p_lcb->w4_info_rsp) - { + if (!p_ccb->p_lcb->w4_info_rsp) { /* Need to have at least one compatible channel to continue */ - if (!l2c_fcr_chk_chan_modes(p_ccb)) - { + if (!l2c_fcr_chk_chan_modes(p_ccb)) { l2cu_release_ccb (p_ccb); (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_NO_LINK); - } - else - { + } else { l2cu_send_peer_connect_req (p_ccb); btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT); } @@ -240,23 +231,22 @@ Event uninit_use_in_call: Using uninitialized value "settings.min" in call to fu { tBTM_PM_PWR_MD settings; // btla-specific ++ - memset((void*)&settings, 0, sizeof(settings)); + memset((void *)&settings, 0, sizeof(settings)); // btla-specific -- settings.mode = BTM_PM_MD_ACTIVE; -/* COVERITY -Event uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details] -Event uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details] -Event uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode" -// FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment. -// coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored -*/ + /* COVERITY + Event uninit_use_in_call: Using uninitialized value "settings" (field "settings".timeout uninitialized) in call to function "BTM_SetPowerMode" [details] + Event uninit_use_in_call: Using uninitialized value "settings.max" in call to function "BTM_SetPowerMode" [details] + Event uninit_use_in_call: Using uninitialized value "settings.min" in call to function "BTM_SetPowerMode" + // FALSE-POSITIVE error from Coverity test-tool. Please do NOT remove following comment. + // coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode the other data members of tBTM_PM_PWR_MD are ignored + */ BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); } p_ccb->chnl_state = CST_TERM_W4_SEC_COMP; if (btm_sec_l2cap_access_req (p_ccb->p_lcb->remote_bd_addr, p_ccb->p_rcb->psm, - p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED) - { + p_ccb->p_lcb->handle, FALSE, &l2c_link_sec_comp, p_ccb) == BTM_CMD_STARTED) { /* started the security process, tell the peer to set a longer timer */ l2cu_send_peer_connect_rsp(p_ccb, L2CAP_CONN_PENDING, 0); } @@ -303,19 +293,16 @@ static void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat #endif #if (L2CAP_UCD_INCLUDED == TRUE) - if ( local_cid == L2CAP_CONNECTIONLESS_CID ) - { + if ( local_cid == L2CAP_CONNECTIONLESS_CID ) { /* check if this event can be processed by UCD */ - if ( l2c_ucd_process_event (p_ccb, event, p_data) ) - { + if ( l2c_ucd_process_event (p_ccb, event, p_data) ) { /* The event is processed by UCD state machine */ return; } } #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -331,16 +318,12 @@ static void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat case L2CEVT_SEC_COMP: /* Security completed success */ /* Wait for the info resp in this state before sending connect req (if needed) */ p_ccb->chnl_state = CST_W4_L2CAP_CONNECT_RSP; - if (!p_ccb->p_lcb->w4_info_rsp) - { + if (!p_ccb->p_lcb->w4_info_rsp) { /* Need to have at least one compatible channel to continue */ - if (!l2c_fcr_chk_chan_modes(p_ccb)) - { + if (!l2c_fcr_chk_chan_modes(p_ccb)) { l2cu_release_ccb (p_ccb); (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK); - } - else - { + } else { btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT); l2cu_send_peer_connect_req (p_ccb); /* Start Connection */ } @@ -352,8 +335,7 @@ static void l2c_csm_orig_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat /* If last channel immediately disconnect the ACL for better security. Also prevents a race condition between BTM and L2CAP */ - if ( (p_ccb == p_ccb->p_lcb->ccb_queue.p_first_ccb) && (p_ccb == p_ccb->p_lcb->ccb_queue.p_last_ccb) ) - { + if ( (p_ccb == p_ccb->p_lcb->ccb_queue.p_first_ccb) && (p_ccb == p_ccb->p_lcb->ccb_queue.p_last_ccb) ) { p_ccb->p_lcb->idle_timeout = 0; } @@ -395,19 +377,16 @@ static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat #endif #if (L2CAP_UCD_INCLUDED == TRUE) - if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) - { + if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) { /* check if this event can be processed by UCD */ - if ( l2c_ucd_process_event (p_ccb, event, p_data) ) - { + if ( l2c_ucd_process_event (p_ccb, event, p_data) ) { /* The event is processed by UCD state machine */ return; } } #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ /* Tell security manager to abort */ btm_sec_abort_access_req (p_ccb->p_lcb->remote_bd_addr); @@ -419,17 +398,14 @@ static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat p_ccb->chnl_state = CST_W4_L2CA_CONNECT_RSP; /* Wait for the info resp in next state before sending connect ind (if needed) */ - if (!p_ccb->p_lcb->w4_info_rsp) - { + if (!p_ccb->p_lcb->w4_info_rsp) { /* Don't need to get info from peer or already retrieved so continue */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT); L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid); (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, p_ccb->local_cid, - p_ccb->p_rcb->psm, p_ccb->remote_id); - } - else - { + p_ccb->p_rcb->psm, p_ccb->remote_id); + } else { /* ** L2CAP Connect Response will be sent out by 3 sec timer expiration ** because Bluesoleil doesn't respond to L2CAP Information Request. @@ -445,13 +421,10 @@ static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat break; case L2CEVT_SEC_COMP_NEG: - if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK) - { + if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK) { /* start a timer - encryption change not received before L2CAP connect req */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_DELAY_CHECK_SM4); - } - else - { + } else { l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_SECURITY_BLOCK, 0); l2cu_release_ccb (p_ccb); } @@ -477,8 +450,7 @@ static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_dat case L2CEVT_TIMEOUT: /* SM4 related. */ - if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE)) - { + if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE)) { L2CAP_TRACE_API ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle); btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 1); } @@ -515,16 +487,14 @@ static void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ /* Send disc indication unless peer to peer race condition AND normal disconnect */ /* *((UINT8 *)p_data) != HCI_ERR_PEER_USER happens when peer device try to disconnect for normal reason */ p_ccb->chnl_state = CST_CLOSED; - if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER)) - { + if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER)) { L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", - p_ccb->local_cid); + p_ccb->local_cid); l2cu_release_ccb (p_ccb); (*disconnect_ind)(local_cid, FALSE); } @@ -543,8 +513,7 @@ static void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p case L2CEVT_L2CAP_CONNECT_RSP_PND: /* Got peer connect pending */ p_ccb->remote_cid = p_ci->remote_cid; btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT); - if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb) - { + if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb) { L2CAP_TRACE_API ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid); (*p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)(p_ccb->local_cid); } @@ -564,14 +533,13 @@ static void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p case L2CEVT_L2CA_DISCONNECT_REQ: /* Upper wants to disconnect */ /* If we know peer CID from connect pending, we can send disconnect */ - if (p_ccb->remote_cid != 0) - { + if (p_ccb->remote_cid != 0) { l2cu_send_peer_disc_req (p_ccb); p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP; btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT); - } - else + } else { l2cu_release_ccb (p_ccb); + } break; case L2CEVT_L2CA_DATA_WRITE: /* Upper layer data to send */ @@ -581,13 +549,10 @@ static void l2c_csm_w4_l2cap_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p case L2CEVT_L2CAP_INFO_RSP: /* Need to have at least one compatible channel to continue */ - if (!l2c_fcr_chk_chan_modes(p_ccb)) - { + if (!l2c_fcr_chk_chan_modes(p_ccb)) { l2cu_release_ccb (p_ccb); (*connect_cfm)(local_cid, L2CAP_CONN_NO_LINK); - } - else - { + } else { /* We have feature info, so now send peer connect request */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT); l2cu_send_peer_connect_req (p_ccb); /* Start Connection */ @@ -619,8 +584,7 @@ static void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_ L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -631,14 +595,11 @@ static void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_ p_ci = (tL2C_CONN_INFO *)p_data; /* Result should be OK or PENDING */ - if ((!p_ci) || (p_ci->l2cap_result == L2CAP_CONN_OK)) - { + if ((!p_ci) || (p_ci->l2cap_result == L2CAP_CONN_OK)) { l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_OK, 0); p_ccb->chnl_state = CST_CONFIG; btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT); - } - else - { + } else { /* If pending, stay in same state and start extended timer */ l2cu_send_peer_connect_rsp (p_ccb, p_ci->l2cap_result, p_ci->l2cap_status); btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT); @@ -675,9 +636,9 @@ static void l2c_csm_w4_l2ca_connect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *p_ L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid); (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, - p_ccb->local_cid, - p_ccb->p_rcb->psm, - p_ccb->remote_id); + p_ccb->local_cid, + p_ccb->p_rcb->psm, + p_ccb->remote_id); break; } } @@ -706,8 +667,7 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) L2CAP_TRACE_EVENT ("L2CAP - st: CONFIG evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -716,42 +676,34 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_L2CAP_CONFIG_REQ: /* Peer config request */ - if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK) - { + if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK) { L2CAP_TRACE_EVENT ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d", - p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT)); + p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT)); (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg); - } - else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT) - { + } else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT) { /* Disconnect if channels are incompatible */ L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations disconnect"); l2cu_disconnect_chnl (p_ccb); - } - else /* Return error to peer so he can renegotiate if possible */ - { + } else { /* Return error to peer so he can renegotiate if possible */ L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations trying reconfig"); l2cu_send_peer_config_rsp (p_ccb, p_cfg); } break; case L2CEVT_L2CAP_CONFIG_RSP: /* Peer config response */ - l2cu_process_peer_cfg_rsp (p_ccb, p_cfg); + l2cu_process_peer_cfg_rsp (p_ccb, p_cfg); - if (p_cfg->result != L2CAP_CFG_PENDING) - { - /* TBD: When config options grow beyong minimum MTU (48 bytes) - * logic needs to be added to handle responses with - * continuation bit set in flags field. - * 1. Send additional config request out until C-bit is cleared in response - */ - p_ccb->config_done |= OB_CFG_DONE; + if (p_cfg->result != L2CAP_CFG_PENDING) { + /* TBD: When config options grow beyong minimum MTU (48 bytes) + * logic needs to be added to handle responses with + * continuation bit set in flags field. + * 1. Send additional config request out until C-bit is cleared in response + */ + p_ccb->config_done |= OB_CFG_DONE; - if (p_ccb->config_done & IB_CFG_DONE) - { + if (p_ccb->config_done & IB_CFG_DONE) { /* Verify two sides are in compatible modes before continuing */ - if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode) - { + if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode) { l2cu_send_peer_disc_req (p_ccb); L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -765,16 +717,16 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) btu_stop_timer (&p_ccb->timer_entry); /* If using eRTM and waiting for an ACK, restart the ACK timer */ - if (p_ccb->fcrb.wait_ack) + if (p_ccb->fcrb.wait_ack) { l2c_fcr_start_timer(p_ccb); + } /* ** check p_ccb->our_cfg.fcr.mon_tout and p_ccb->our_cfg.fcr.rtrans_tout ** we may set them to zero when sending config request during renegotiation */ if ((p_ccb->our_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - &&((p_ccb->our_cfg.fcr.mon_tout == 0)||(p_ccb->our_cfg.fcr.rtrans_tout))) - { + && ((p_ccb->our_cfg.fcr.mon_tout == 0) || (p_ccb->our_cfg.fcr.rtrans_tout))) { l2c_fcr_adj_monitor_retran_timeout (p_ccb); } @@ -782,8 +734,7 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count(); #endif /* See if we can forward anything on the hold queue */ - if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - { + if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL); } } @@ -795,11 +746,10 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_L2CAP_CONFIG_RSP_NEG: /* Peer config error rsp */ /* Disable the Timer */ - btu_stop_timer (&p_ccb->timer_entry); + btu_stop_timer (&p_ccb->timer_entry); /* If failure was channel mode try to renegotiate */ - if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE) - { + if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE) { L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result); (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg); } @@ -822,8 +772,7 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) l2cu_process_our_cfg_rsp (p_ccb, p_cfg); /* Not finished if continuation flag is set */ - if ( (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT) || (p_cfg->result == L2CAP_CFG_PENDING) ) - { + if ( (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT) || (p_cfg->result == L2CAP_CFG_PENDING) ) { /* Send intermediate response; remain in cfg state */ l2cu_send_peer_config_rsp (p_ccb, p_cfg); break; @@ -836,11 +785,9 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) p_ccb->config_done |= IB_CFG_DONE; - if (p_ccb->config_done & OB_CFG_DONE) - { + if (p_ccb->config_done & OB_CFG_DONE) { /* Verify two sides are in compatible modes before continuing */ - if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode) - { + if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode) { l2cu_send_peer_disc_req (p_ccb); L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -857,16 +804,16 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) l2cu_send_peer_config_rsp (p_ccb, p_cfg); /* If using eRTM and waiting for an ACK, restart the ACK timer */ - if (p_ccb->fcrb.wait_ack) + if (p_ccb->fcrb.wait_ack) { l2c_fcr_start_timer(p_ccb); + } #if (L2CAP_ERTM_STATS == TRUE) p_ccb->fcrb.connect_tick_count = GKI_get_os_tick_count(); #endif /* See if we can forward anything on the hold queue */ - if ( (p_ccb->chnl_state == CST_OPEN) && (!GKI_queue_is_empty(&p_ccb->xmit_hold_q))) - { + if ( (p_ccb->chnl_state == CST_OPEN) && (!GKI_queue_is_empty(&p_ccb->xmit_hold_q))) { l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL); } break; @@ -886,16 +833,15 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) L2CAP_TRACE_API ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid); #if (L2CAP_NUM_FIXED_CHNLS > 0) if (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL && - p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL) - { - if (p_ccb->local_cid < L2CAP_BASE_APPL_CID) - { + p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL) { + if (p_ccb->local_cid < L2CAP_BASE_APPL_CID) { if (l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb) (*l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb) - (p_ccb->local_cid, p_ccb->p_lcb->remote_bd_addr,(BT_HDR *)p_data); - else + (p_ccb->local_cid, p_ccb->p_lcb->remote_bd_addr, (BT_HDR *)p_data); + else { GKI_freebuf (p_data); - break; + } + break; } } #endif @@ -903,16 +849,17 @@ static void l2c_csm_config (tL2C_CCB *p_ccb, UINT16 event, void *p_data) break; case L2CEVT_L2CA_DATA_WRITE: /* Upper layer data to send */ - if (p_ccb->config_done & OB_CFG_DONE) + if (p_ccb->config_done & OB_CFG_DONE) { l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data); - else + } else { GKI_freebuf (p_data); + } break; case L2CEVT_TIMEOUT: l2cu_send_peer_disc_req (p_ccb); L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", - p_ccb->local_cid); + p_ccb->local_cid); l2cu_release_ccb (p_ccb); (*disconnect_ind)(local_cid, FALSE); break; @@ -940,37 +887,36 @@ static void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data) #if (BT_TRACE_VERBOSE == TRUE) L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x st: OPEN evt: %s", - p_ccb->local_cid, l2c_csm_get_event_name (event)); + p_ccb->local_cid, l2c_csm_get_event_name (event)); #else L2CAP_TRACE_EVENT ("L2CAP - st: OPEN evt: %d", event); #endif #if (L2CAP_UCD_INCLUDED == TRUE) - if ( local_cid == L2CAP_CONNECTIONLESS_CID ) - { + if ( local_cid == L2CAP_CONNECTIONLESS_CID ) { /* check if this event can be processed by UCD */ - if ( l2c_ucd_process_event (p_ccb, event, p_data) ) - { + if ( l2c_ucd_process_event (p_ccb, event, p_data) ) { /* The event is processed by UCD state machine */ return; } } #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", - p_ccb->local_cid); + p_ccb->local_cid); l2cu_release_ccb (p_ccb); - if (p_ccb->p_rcb) + if (p_ccb->p_rcb) { (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(local_cid, FALSE); + } break; case L2CEVT_LP_QOS_VIOLATION_IND: /* QOS violation */ /* Tell upper layer. If service guaranteed, then clear the channel */ - if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb) + if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb) { (*p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb)(p_ccb->p_lcb->remote_bd_addr); + } break; case L2CEVT_L2CAP_CONFIG_REQ: /* Peer config request */ @@ -983,21 +929,17 @@ static void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data) btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT); - if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK) - { + if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK) { (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg); } /* Error in config parameters: reset state and config flag */ - else if (cfg_result == L2CAP_PEER_CFG_UNACCEPTABLE) - { + else if (cfg_result == L2CAP_PEER_CFG_UNACCEPTABLE) { btu_stop_timer(&p_ccb->timer_entry); p_ccb->chnl_state = tempstate; p_ccb->config_done = tempcfgdone; l2cu_send_peer_config_rsp (p_ccb, p_cfg); - } - else /* L2CAP_PEER_CFG_DISCONNECT */ - { + } else { /* L2CAP_PEER_CFG_DISCONNECT */ /* Disconnect if channels are incompatible * Note this should not occur if reconfigure * since this should have never passed original config. @@ -1009,38 +951,39 @@ static void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_L2CAP_DISCONNECT_REQ: /* Peer disconnected request */ // btla-specific ++ /* Make sure we are not in sniff mode */ - { - tBTM_PM_PWR_MD settings; - memset((void*)&settings, 0, sizeof(settings)); - settings.mode = BTM_PM_MD_ACTIVE; - BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); - } + { + tBTM_PM_PWR_MD settings; + memset((void *)&settings, 0, sizeof(settings)); + settings.mode = BTM_PM_MD_ACTIVE; + BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); + } // btla-specific -- - p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP; - btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT); - L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid); - (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE); - break; + p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP; + btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT); + L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x Conf Needed", p_ccb->local_cid); + (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE); + break; case L2CEVT_L2CAP_DATA: /* Peer data packet rcvd */ - if((p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_DataInd_Cb)) + if ((p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_DataInd_Cb)) { (*p_ccb->p_rcb->api.pL2CA_DataInd_Cb)(p_ccb->local_cid, (BT_HDR *)p_data); + } break; case L2CEVT_L2CA_DISCONNECT_REQ: /* Upper wants to disconnect */ /* Make sure we are not in sniff mode */ - { - tBTM_PM_PWR_MD settings; - memset((void*)&settings, 0, sizeof(settings)); - settings.mode = BTM_PM_MD_ACTIVE; - BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); - } + { + tBTM_PM_PWR_MD settings; + memset((void *)&settings, 0, sizeof(settings)); + settings.mode = BTM_PM_MD_ACTIVE; + BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings); + } - l2cu_send_peer_disc_req (p_ccb); - p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP; - btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT); - break; + l2cu_send_peer_disc_req (p_ccb); + p_ccb->chnl_state = CST_W4_L2CAP_DISCONNECT_RSP; + btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT); + break; case L2CEVT_L2CA_DATA_WRITE: /* Upper layer data to send */ l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_data); @@ -1057,8 +1000,9 @@ static void l2c_csm_open (tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_TIMEOUT: /* Process the monitor/retransmission time-outs in flow control/retrans mode */ - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { l2c_fcr_proc_tout (p_ccb); + } break; case L2CEVT_ACK_TIMEOUT: @@ -1089,12 +1033,10 @@ static void l2c_csm_w4_l2cap_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_L2CAP_DISCONNECT_RSP: /* Peer disconnect response */ l2cu_release_ccb (p_ccb); - if (disconnect_cfm) - { + if (disconnect_cfm) { L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid); (*disconnect_cfm)(local_cid, L2CAP_DISC_OK); } @@ -1103,18 +1045,16 @@ static void l2c_csm_w4_l2cap_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void case L2CEVT_L2CAP_DISCONNECT_REQ: /* Peer disconnect request */ l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid); l2cu_release_ccb (p_ccb); - if (disconnect_cfm) - { + if (disconnect_cfm) { L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid); (*disconnect_cfm)(local_cid, L2CAP_DISC_OK); } - break; + break; case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ case L2CEVT_TIMEOUT: /* Timeout */ l2cu_release_ccb (p_ccb); - if (disconnect_cfm) - { + if (disconnect_cfm) { L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid); (*disconnect_cfm)(local_cid, L2CAP_DISC_TIMEOUT); } @@ -1149,8 +1089,7 @@ static void l2c_csm_w4_l2ca_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event); #endif - switch (event) - { + switch (event) { case L2CEVT_LP_DISCONNECT_IND: /* Link was disconnected */ L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x No Conf Needed", p_ccb->local_cid); l2cu_release_ccb (p_ccb); @@ -1192,8 +1131,7 @@ static void l2c_csm_w4_l2ca_disconnect_rsp (tL2C_CCB *p_ccb, UINT16 event, void *******************************************************************************/ static char *l2c_csm_get_event_name (UINT16 event) { - switch (event) - { + switch (event) { case L2CEVT_LP_CONNECT_CFM: /* Lower layer connect confirm */ return ("LOWER_LAYER_CONNECT_CFM"); case L2CEVT_LP_CONNECT_CFM_NEG: /* Lower layer connect confirm (failed) */ @@ -1285,12 +1223,9 @@ void l2c_enqueue_peer_data (tL2C_CCB *p_ccb, BT_HDR *p_buf) { UINT8 *p; - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { p_buf->event = 0; - } - else - { + } else { /* Save the channel ID for faster counting */ p_buf->event = p_ccb->local_cid; @@ -1313,16 +1248,16 @@ void l2c_enqueue_peer_data (tL2C_CCB *p_ccb, BT_HDR *p_buf) #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) /* if new packet is higher priority than serving ccb and it is not overrun */ if (( p_ccb->p_lcb->rr_pri > p_ccb->ccb_priority ) - &&( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota > 0)) - { + && ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota > 0)) { /* send out higher priority packet */ p_ccb->p_lcb->rr_pri = p_ccb->ccb_priority; } #endif /* if we are doing a round robin scheduling, set the flag */ - if (p_ccb->p_lcb->link_xmit_quota == 0) + if (p_ccb->p_lcb->link_xmit_quota == 0) { l2cb.check_round_robin = TRUE; + } } diff --git a/components/bt/bluedroid/stack/l2cap/l2c_fcr.c b/components/bt/bluedroid/stack/l2cap/l2c_fcr.c old mode 100755 new mode 100644 index 5e5f0f45d..4ce718f3b --- a/components/bt/bluedroid/stack/l2cap/l2c_fcr.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_fcr.c @@ -112,12 +112,11 @@ static unsigned short l2c_fcr_updcrc(unsigned short icrc, unsigned char *icp, in register unsigned char *cp = icp; register int cnt = icnt; - while (cnt--) - { + while (cnt--) { crc = ((crc >> 8) & 0xff) ^ crctab[(crc & 0xff) ^ *cp++]; } - return(crc); + return (crc); } @@ -171,18 +170,16 @@ void l2c_fcr_start_timer (tL2C_CCB *p_ccb) UINT32 tout; /* The timers which are in milliseconds */ - if (p_ccb->fcrb.wait_ack) - { + if (p_ccb->fcrb.wait_ack) { tout = (UINT32)p_ccb->our_cfg.fcr.mon_tout; - } - else - { + } else { tout = (UINT32)p_ccb->our_cfg.fcr.rtrans_tout; } /* Only start a timer that was not started */ - if (p_ccb->fcrb.mon_retrans_timer.in_use == 0) - btu_start_quick_timer (&p_ccb->fcrb.mon_retrans_timer, BTU_TTYPE_L2CAP_CHNL, tout*QUICK_TIMER_TICKS_PER_SEC/1000); + if (p_ccb->fcrb.mon_retrans_timer.in_use == 0) { + btu_start_quick_timer (&p_ccb->fcrb.mon_retrans_timer, BTU_TTYPE_L2CAP_CHNL, tout * QUICK_TIMER_TICKS_PER_SEC / 1000); + } } /******************************************************************************* @@ -197,8 +194,7 @@ void l2c_fcr_start_timer (tL2C_CCB *p_ccb) void l2c_fcr_stop_timer (tL2C_CCB *p_ccb) { assert(p_ccb != NULL); - if (p_ccb->fcrb.mon_retrans_timer.in_use) - { + if (p_ccb->fcrb.mon_retrans_timer.in_use) { btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer); } } @@ -219,51 +215,53 @@ void l2c_fcr_cleanup (tL2C_CCB *p_ccb) l2c_fcr_stop_timer (p_ccb); - if (p_fcrb->p_rx_sdu) + if (p_fcrb->p_rx_sdu) { GKI_freebuf (p_fcrb->p_rx_sdu); + } - while (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) + while (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) { GKI_freebuf (GKI_dequeue (&p_fcrb->waiting_for_ack_q)); + } - while (!GKI_queue_is_empty(&p_fcrb->srej_rcv_hold_q)) + while (!GKI_queue_is_empty(&p_fcrb->srej_rcv_hold_q)) { GKI_freebuf (GKI_dequeue (&p_fcrb->srej_rcv_hold_q)); + } - while (!GKI_queue_is_empty(&p_fcrb->retrans_q)) + while (!GKI_queue_is_empty(&p_fcrb->retrans_q)) { GKI_freebuf (GKI_dequeue (&p_fcrb->retrans_q)); + } btu_stop_quick_timer (&p_fcrb->ack_timer); btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer); #if (L2CAP_ERTM_STATS == TRUE) - if ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID) && (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) ) - { + if ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID) && (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) ) { UINT32 dur = GKI_get_os_tick_count() - p_ccb->fcrb.connect_tick_count; char *p_str = (char *)GKI_getbuf(120); UINT16 i; UINT32 throughput_avg, ack_delay_avg, ack_q_count_avg; BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "--- L2CAP ERTM Stats for CID: 0x%04x Duration: %08ums", p_ccb->local_cid, dur); + "--- L2CAP ERTM Stats for CID: 0x%04x Duration: %08ums", p_ccb->local_cid, dur); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "Retransmissions:%08u Times Flow Controlled:%08u Retrans Touts:%08u Ack Touts:%08u", - p_ccb->fcrb.pkts_retransmitted, p_ccb->fcrb.xmit_window_closed, p_ccb->fcrb.retrans_touts, p_ccb->fcrb.xmit_ack_touts); + "Retransmissions:%08u Times Flow Controlled:%08u Retrans Touts:%08u Ack Touts:%08u", + p_ccb->fcrb.pkts_retransmitted, p_ccb->fcrb.xmit_window_closed, p_ccb->fcrb.retrans_touts, p_ccb->fcrb.xmit_ack_touts); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "Times there is less than 2 packets in controller when flow controlled:%08u", p_ccb->fcrb.controller_idle); + "Times there is less than 2 packets in controller when flow controlled:%08u", p_ccb->fcrb.controller_idle); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "max_held_acks:%08u, in_cfg.fcr.tx_win_sz:%08u", p_ccb->fcrb.max_held_acks, p_ccb->peer_cfg.fcr.tx_win_sz ); - if (p_str) - { + "max_held_acks:%08u, in_cfg.fcr.tx_win_sz:%08u", p_ccb->fcrb.max_held_acks, p_ccb->peer_cfg.fcr.tx_win_sz ); + if (p_str) { sprintf(p_str, "Sent Pkts:%08u Bytes:%10u(%06u/sec) RR:%08u REJ:%08u RNR:%08u SREJ:%08u", - p_ccb->fcrb.ertm_pkt_counts[0], p_ccb->fcrb.ertm_byte_counts[0], - (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[0] * 100) / (dur / 10) : 0), - p_ccb->fcrb.s_frames_sent[0], p_ccb->fcrb.s_frames_sent[1], p_ccb->fcrb.s_frames_sent[2], p_ccb->fcrb.s_frames_sent[3]); + p_ccb->fcrb.ertm_pkt_counts[0], p_ccb->fcrb.ertm_byte_counts[0], + (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[0] * 100) / (dur / 10) : 0), + p_ccb->fcrb.s_frames_sent[0], p_ccb->fcrb.s_frames_sent[1], p_ccb->fcrb.s_frames_sent[2], p_ccb->fcrb.s_frames_sent[3]); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str); sprintf(p_str, "Rcvd Pkts:%08u Bytes:%10u(%06u/sec) RR:%08u REJ:%08u RNR:%08u SREJ:%08u", - p_ccb->fcrb.ertm_pkt_counts[1], p_ccb->fcrb.ertm_byte_counts[1], - (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[1] * 100) / (dur / 10) : 0), - p_ccb->fcrb.s_frames_rcvd[0], p_ccb->fcrb.s_frames_rcvd[1], p_ccb->fcrb.s_frames_rcvd[2], p_ccb->fcrb.s_frames_rcvd[3]); + p_ccb->fcrb.ertm_pkt_counts[1], p_ccb->fcrb.ertm_byte_counts[1], + (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[1] * 100) / (dur / 10) : 0), + p_ccb->fcrb.s_frames_rcvd[0], p_ccb->fcrb.s_frames_rcvd[1], p_ccb->fcrb.s_frames_rcvd[2], p_ccb->fcrb.s_frames_rcvd[3]); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str); @@ -271,12 +269,10 @@ void l2c_fcr_cleanup (tL2C_CCB *p_ccb) ack_delay_avg = 0; ack_q_count_avg = 0; - for (i = 0; i < L2CAP_ERTM_STATS_NUM_AVG; i++ ) - { - if (i == p_ccb->fcrb.ack_delay_avg_index ) - { + for (i = 0; i < L2CAP_ERTM_STATS_NUM_AVG; i++ ) { + if (i == p_ccb->fcrb.ack_delay_avg_index ) { BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "[%02u] collecting data ...", i ); + "[%02u] collecting data ...", i ); continue; } @@ -297,14 +293,14 @@ void l2c_fcr_cleanup (tL2C_CCB *p_ccb) ack_q_count_avg /= (L2CAP_ERTM_STATS_NUM_AVG - 1); BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "throughput_avg: %8u (kbytes/sec), ack_delay_avg: %8u ms, ack_q_count_avg: %8u", - throughput_avg, ack_delay_avg, ack_q_count_avg ); + "throughput_avg: %8u (kbytes/sec), ack_delay_avg: %8u ms, ack_q_count_avg: %8u", + throughput_avg, ack_delay_avg, ack_q_count_avg ); GKI_freebuf(p_str); } BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, - "---"); + "---"); } #endif @@ -327,23 +323,20 @@ BT_HDR *l2c_fcr_clone_buf (BT_HDR *p_buf, UINT16 new_offset, UINT16 no_of_bytes, BT_HDR *p_buf2; /* If using the common pool, should be at least 10% free. */ - if ( (pool == HCI_ACL_POOL_ID) && (GKI_poolutilization (pool) > 90) ) - { + if ( (pool == HCI_ACL_POOL_ID) && (GKI_poolutilization (pool) > 90) ) { L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer on HCI_ACL_POOL_ID Utilization: %u", GKI_poolutilization(pool)); return (NULL); } - if ((p_buf2 = (BT_HDR *)GKI_getpoolbuf(pool)) != NULL) - { + if ((p_buf2 = (BT_HDR *)GKI_getpoolbuf(pool)) != NULL) { UINT16 pool_buf_size = GKI_get_pool_bufsize (pool); /* Make sure buffer fits into buffer pool */ - if ((no_of_bytes + sizeof(BT_HDR) + new_offset) > pool_buf_size) - { + if ((no_of_bytes + sizeof(BT_HDR) + new_offset) > pool_buf_size) { L2CAP_TRACE_ERROR("##### l2c_fcr_clone_buf (NumBytes %d) -> Exceeds poolsize %d [bytes %d + BT_HDR %d + offset %d]", - (no_of_bytes + sizeof(BT_HDR) + new_offset), - pool_buf_size, no_of_bytes, sizeof(BT_HDR), - new_offset); + (no_of_bytes + sizeof(BT_HDR) + new_offset), + pool_buf_size, no_of_bytes, sizeof(BT_HDR), + new_offset); GKI_freebuf(p_buf2); return (NULL); @@ -355,9 +348,7 @@ BT_HDR *l2c_fcr_clone_buf (BT_HDR *p_buf, UINT16 new_offset, UINT16 no_of_bytes, memcpy (((UINT8 *)(p_buf2 + 1)) + p_buf2->offset, ((UINT8 *)(p_buf + 1)) + p_buf->offset, no_of_bytes); - } - else - { + } else { L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer, Pool: %u Count: %u", pool, GKI_poolfreecount(pool)); } @@ -376,19 +367,17 @@ BT_HDR *l2c_fcr_clone_buf (BT_HDR *p_buf, UINT16 new_offset, UINT16 no_of_bytes, BOOLEAN l2c_fcr_is_flow_controlled (tL2C_CCB *p_ccb) { assert(p_ccb != NULL); - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - { + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { /* Check if remote side flowed us off or the transmit window is full */ if ( (p_ccb->fcrb.remote_busy == TRUE) - || (GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q) >= p_ccb->peer_cfg.fcr.tx_win_sz) ) - { + || (GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q) >= p_ccb->peer_cfg.fcr.tx_win_sz) ) { #if (L2CAP_ERTM_STATS == TRUE) - if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - { + if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { p_ccb->fcrb.xmit_window_closed++; - if ((p_ccb->p_lcb->sent_not_acked < 2)&&(l2cb.controller_xmit_window > 0)) + if ((p_ccb->p_lcb->sent_not_acked < 2) && (l2cb.controller_xmit_window > 0)) { p_ccb->fcrb.controller_idle++; + } } #endif return (TRUE); @@ -420,17 +409,14 @@ static void prepare_I_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, BOOLEAN is_retransm p_fcrb->send_f_rsp = FALSE; - if (is_retransmission) - { + if (is_retransmission) { /* Get the old control word and clear out the old req_seq and F bits */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; STREAM_TO_UINT16 (ctrl_word, p); ctrl_word &= ~(L2CAP_FCR_REQ_SEQ_BITS + L2CAP_FCR_F_BIT); - } - else - { + } else { ctrl_word = p_buf->layer_specific & L2CAP_FCR_SEG_BITS; /* SAR bits */ ctrl_word |= (p_fcrb->next_tx_seq << L2CAP_FCR_TX_SEQ_BITS_SHIFT); /* Tx Seq */ @@ -438,36 +424,36 @@ static void prepare_I_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, BOOLEAN is_retransm } /* Set the F-bit and reqseq only if using re-transmission mode */ - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - { - if (set_f_bit) + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { + if (set_f_bit) { ctrl_word |= L2CAP_FCR_F_BIT; + } ctrl_word |= (p_fcrb->next_seq_expected) << L2CAP_FCR_REQ_SEQ_BITS_SHIFT; p_fcrb->last_ack_sent = p_ccb->fcrb.next_seq_expected; - if (p_ccb->fcrb.ack_timer.in_use) + if (p_ccb->fcrb.ack_timer.in_use) { btu_stop_quick_timer (&p_ccb->fcrb.ack_timer); + } } /* Set the control word */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; UINT16_TO_STREAM (p, ctrl_word); /* Compute the FCS and add to the end of the buffer if not bypassed */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) - { + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { /* length field in l2cap header has to include FCS length */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset; + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset; UINT16_TO_STREAM (p, p_buf->len + L2CAP_FCS_LEN - L2CAP_PKT_OVERHEAD); /* Calculate the FCS */ fcs = l2c_fcr_tx_get_fcs(p_buf); /* Point to the end of the buffer and put the FCS there */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset + p_buf->len; + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset + p_buf->len; UINT16_TO_STREAM (p, fcs); @@ -475,29 +461,27 @@ static void prepare_I_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, BOOLEAN is_retransm } #if BT_TRACE_VERBOSE == TRUE - if (is_retransmission) - { + if (is_retransmission) { L2CAP_TRACE_EVENT ("L2CAP eRTM ReTx I-frame CID: 0x%04x Len: %u SAR: %s TxSeq: %u ReqSeq: %u F: %u", - p_ccb->local_cid, p_buf->len, - SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], - (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); - } - else - { + p_ccb->local_cid, p_buf->len, + SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], + (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + } else { L2CAP_TRACE_EVENT ("L2CAP eRTM Tx I-frame CID: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u", - p_ccb->local_cid, p_buf->len, - SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], - (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, p_buf->len, + SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], + (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); } #endif /* Start the retransmission timer if not already running */ - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { l2c_fcr_start_timer (p_ccb); + } } /******************************************************************************* @@ -517,15 +501,15 @@ void l2c_fcr_send_S_frame (tL2C_CCB *p_ccb, UINT16 function_code, UINT16 pf_bit) UINT16 ctrl_word; UINT16 fcs; - if ((!p_ccb->in_use) || (p_ccb->chnl_state != CST_OPEN)) + if ((!p_ccb->in_use) || (p_ccb->chnl_state != CST_OPEN)) { return; + } #if (L2CAP_ERTM_STATS == TRUE) - p_ccb->fcrb.s_frames_sent[function_code]++; + p_ccb->fcrb.s_frames_sent[function_code]++; #endif - if (pf_bit == L2CAP_FCR_P_BIT) - { + if (pf_bit == L2CAP_FCR_P_BIT) { p_ccb->fcrb.wait_ack = TRUE; l2c_fcr_stop_timer (p_ccb); /* Restart the monitor timer */ @@ -537,8 +521,7 @@ void l2c_fcr_send_S_frame (tL2C_CCB *p_ccb, UINT16 function_code, UINT16 pf_bit) ctrl_word |= (p_ccb->fcrb.next_seq_expected << L2CAP_FCR_REQ_SEQ_BITS_SHIFT); ctrl_word |= pf_bit; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID)) != NULL) { p_buf->offset = HCI_DATA_PREAMBLE_SIZE; p_buf->len = L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD; @@ -551,15 +534,12 @@ void l2c_fcr_send_S_frame (tL2C_CCB *p_ccb, UINT16 function_code, UINT16 pf_bit) UINT16_TO_STREAM (p, ctrl_word); /* Compute the FCS and add to the end of the buffer if not bypassed */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) - { + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { fcs = l2c_fcr_tx_get_fcs (p_buf); UINT16_TO_STREAM (p, fcs); p_buf->len += L2CAP_FCS_LEN; - } - else /* rewrite the length without FCS length */ - { + } else { /* rewrite the length without FCS length */ p -= 6; UINT16_TO_STREAM (p, L2CAP_FCR_OVERHEAD); } @@ -570,24 +550,21 @@ void l2c_fcr_send_S_frame (tL2C_CCB *p_ccb, UINT16 function_code, UINT16 pf_bit) #if BT_TRACE_VERBOSE == TRUE if ((((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 1) - || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3)) - { + || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3)) { L2CAP_TRACE_WARNING ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u", - p_ccb->local_cid, ctrl_word, - SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, ctrl_word, + SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); L2CAP_TRACE_WARNING (" Buf Len: %u", p_buf->len); - } - else - { + } else { L2CAP_TRACE_EVENT ("L2CAP eRTM Tx S-frame CID: 0x%04x ctrlword: 0x%04x Type: %s ReqSeq: %u P: %u F: %u", - p_ccb->local_cid, ctrl_word, - SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, ctrl_word, + SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); L2CAP_TRACE_EVENT (" Buf Len: %u", p_buf->len); } #endif /* BT_TRACE_VERBOSE */ @@ -596,13 +573,12 @@ void l2c_fcr_send_S_frame (tL2C_CCB *p_ccb, UINT16 function_code, UINT16 pf_bit) p_ccb->fcrb.last_ack_sent = p_ccb->fcrb.next_seq_expected; - if (p_ccb->fcrb.ack_timer.in_use) + if (p_ccb->fcrb.ack_timer.in_use) { btu_stop_quick_timer (&p_ccb->fcrb.ack_timer); - } - else - { + } + } else { L2CAP_TRACE_ERROR ("l2c_fcr_send_S_frame(No Resources) cid 0x%04x, Type: 0x%4x", - p_ccb->local_cid, function_code); + p_ccb->local_cid, function_code); } } @@ -630,74 +606,64 @@ void l2c_fcr_proc_pdu (tL2C_CCB *p_ccb, BT_HDR *p_buf) min_pdu_len = (p_ccb->bypass_fcs == L2CAP_BYPASS_FCS) ? (UINT16)L2CAP_FCR_OVERHEAD : (UINT16)(L2CAP_FCS_LEN + L2CAP_FCR_OVERHEAD); - if (p_buf->len < min_pdu_len) - { + if (p_buf->len < min_pdu_len) { L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x Len too short: %u", p_ccb->local_cid, p_buf->len); GKI_freebuf (p_buf); return; } - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_STREAM_MODE) - { + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_STREAM_MODE) { process_stream_frame (p_ccb, p_buf); return; } #if BT_TRACE_VERBOSE == TRUE /* Get the control word */ - p = ((UINT8 *)(p_buf+1)) + p_buf->offset; + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset; STREAM_TO_UINT16 (ctrl_word, p); - if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) - { + if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) { if ((((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 1) - || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3)) - { + || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3)) { /* REJ or SREJ */ L2CAP_TRACE_WARNING ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u", - p_ccb->local_cid, p_buf->len, - SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); - } - else - { + p_ccb->local_cid, p_buf->len, + SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + } else { L2CAP_TRACE_EVENT ("L2CAP eRTM Rx S-frame: cid: 0x%04x Len: %u Type: %s ReqSeq: %u P: %u F: %u", - p_ccb->local_cid, p_buf->len, - SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, p_buf->len, + SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT], + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); } - } - else - { + } else { L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u", - p_ccb->local_cid, p_buf->len, - SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], - (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, p_buf->len, + SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], + (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); } L2CAP_TRACE_EVENT (" eRTM Rx Nxt_tx_seq %u, Lst_rx_ack %u, Nxt_seq_exp %u, Lst_ack_snt %u, wt_q.cnt %u, tries %u", - p_ccb->fcrb.next_tx_seq, p_ccb->fcrb.last_rx_ack, p_ccb->fcrb.next_seq_expected, - p_ccb->fcrb.last_ack_sent, GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q), p_ccb->fcrb.num_tries); + p_ccb->fcrb.next_tx_seq, p_ccb->fcrb.last_rx_ack, p_ccb->fcrb.next_seq_expected, + p_ccb->fcrb.last_ack_sent, GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q), p_ccb->fcrb.num_tries); #endif /* BT_TRACE_VERBOSE */ /* Verify FCS if using */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) - { - p = ((UINT8 *)(p_buf+1)) + p_buf->offset + p_buf->len - L2CAP_FCS_LEN; + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset + p_buf->len - L2CAP_FCS_LEN; /* Extract and drop the FCS from the packet */ STREAM_TO_UINT16 (fcs, p); p_buf->len -= L2CAP_FCS_LEN; - if (l2c_fcr_rx_get_fcs(p_buf) != fcs) - { + if (l2c_fcr_rx_get_fcs(p_buf) != fcs) { L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid); GKI_freebuf(p_buf); return; @@ -705,7 +671,7 @@ void l2c_fcr_proc_pdu (tL2C_CCB *p_ccb, BT_HDR *p_buf) } /* Get the control word */ - p = ((UINT8 *)(p_buf+1)) + p_buf->offset; + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset; STREAM_TO_UINT16 (ctrl_word, p); @@ -713,19 +679,17 @@ void l2c_fcr_proc_pdu (tL2C_CCB *p_ccb, BT_HDR *p_buf) p_buf->offset += L2CAP_FCR_OVERHEAD; /* If we had a poll bit outstanding, check if we got a final response */ - if (p_ccb->fcrb.wait_ack) - { + if (p_ccb->fcrb.wait_ack) { /* If final bit not set, ignore the frame unless it is a polled S-frame */ - if ( !(ctrl_word & L2CAP_FCR_F_BIT) ) - { - if ( (ctrl_word & L2CAP_FCR_P_BIT) && (ctrl_word & L2CAP_FCR_S_FRAME_BIT) ) - { - if (p_ccb->fcrb.srej_sent) + if ( !(ctrl_word & L2CAP_FCR_F_BIT) ) { + if ( (ctrl_word & L2CAP_FCR_P_BIT) && (ctrl_word & L2CAP_FCR_S_FRAME_BIT) ) { + if (p_ccb->fcrb.srej_sent) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_SREJ, L2CAP_FCR_F_BIT); - else if (p_ccb->fcrb.local_busy) + } else if (p_ccb->fcrb.local_busy) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, L2CAP_FCR_F_BIT); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, L2CAP_FCR_F_BIT); + } /* Got a poll while in wait_ack state, so re-start our timer with 1-second */ /* This is a small optimization... the monitor timer is 12 secs, but we saw */ @@ -740,66 +704,63 @@ void l2c_fcr_proc_pdu (tL2C_CCB *p_ccb, BT_HDR *p_buf) p_ccb->fcrb.wait_ack = FALSE; /* P and F are mutually exclusive */ - if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) + if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) { ctrl_word &= ~L2CAP_FCR_P_BIT; + } - if (GKI_queue_is_empty(&p_ccb->fcrb.waiting_for_ack_q)) + if (GKI_queue_is_empty(&p_ccb->fcrb.waiting_for_ack_q)) { p_ccb->fcrb.num_tries = 0; + } l2c_fcr_stop_timer (p_ccb); - } - else - { + } else { /* Otherwise, ensure the final bit is ignored */ ctrl_word &= ~L2CAP_FCR_F_BIT; } /* Process receive sequence number */ - if (!process_reqseq (p_ccb, ctrl_word)) - { + if (!process_reqseq (p_ccb, ctrl_word)) { GKI_freebuf (p_buf); return; } - /* Process based on whether it is an S-frame or an I-frame */ - if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) + /* Process based on whether it is an S-frame or an I-frame */ + if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) { process_s_frame (p_ccb, p_buf, ctrl_word); - else + } else { process_i_frame (p_ccb, p_buf, ctrl_word, FALSE); + } /* Return if the channel got disconnected by a bad packet or max retransmissions */ - if ( (!p_ccb->in_use) || (p_ccb->chnl_state != CST_OPEN) ) + if ( (!p_ccb->in_use) || (p_ccb->chnl_state != CST_OPEN) ) { return; + } /* If we have some buffers held while doing SREJ, and SREJ has cleared, process them now */ - if ( (!p_ccb->fcrb.local_busy) && (!p_ccb->fcrb.srej_sent) && (!GKI_queue_is_empty(&p_ccb->fcrb.srej_rcv_hold_q))) - { + if ( (!p_ccb->fcrb.local_busy) && (!p_ccb->fcrb.srej_sent) && (!GKI_queue_is_empty(&p_ccb->fcrb.srej_rcv_hold_q))) { BUFFER_Q temp_q = p_ccb->fcrb.srej_rcv_hold_q; GKI_init_q (&p_ccb->fcrb.srej_rcv_hold_q); - while ((p_buf = (BT_HDR *)GKI_dequeue (&temp_q)) != NULL) - { - if (p_ccb->in_use && (p_ccb->chnl_state == CST_OPEN)) - { + while ((p_buf = (BT_HDR *)GKI_dequeue (&temp_q)) != NULL) { + if (p_ccb->in_use && (p_ccb->chnl_state == CST_OPEN)) { /* Get the control word */ - p = ((UINT8 *)(p_buf+1)) + p_buf->offset - L2CAP_FCR_OVERHEAD; + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset - L2CAP_FCR_OVERHEAD; STREAM_TO_UINT16 (ctrl_word, p); L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() CID: 0x%04x Process Buffer from SREJ_Hold_Q TxSeq: %u Expected_Seq: %u", - p_ccb->local_cid, (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, - p_ccb->fcrb.next_seq_expected); + p_ccb->local_cid, (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, + p_ccb->fcrb.next_seq_expected); /* Process the SREJ held I-frame, but do not send an RR for each individual frame */ process_i_frame (p_ccb, p_buf, ctrl_word, TRUE); - } - else + } else { GKI_freebuf (p_buf); + } /* If more frames were lost during SREJ, send a REJ */ - if (p_ccb->fcrb.rej_after_srej) - { + if (p_ccb->fcrb.rej_after_srej) { p_ccb->fcrb.rej_after_srej = FALSE; p_ccb->fcrb.rej_sent = TRUE; @@ -809,21 +770,19 @@ void l2c_fcr_proc_pdu (tL2C_CCB *p_ccb, BT_HDR *p_buf) /* Now, if needed, send one RR for the whole held queue */ if ( (!p_ccb->fcrb.local_busy) && (!p_ccb->fcrb.rej_sent) && (!p_ccb->fcrb.srej_sent) - && (p_ccb->fcrb.next_seq_expected != p_ccb->fcrb.last_ack_sent) ) + && (p_ccb->fcrb.next_seq_expected != p_ccb->fcrb.last_ack_sent) ) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, 0); - else - { + } else { L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() not sending RR CID: 0x%04x local_busy:%d rej_sent:%d srej_sent:%d Expected_Seq:%u Last_Ack:%u", - p_ccb->local_cid, p_ccb->fcrb.local_busy, p_ccb->fcrb.rej_sent, p_ccb->fcrb.srej_sent, p_ccb->fcrb.next_seq_expected, - p_ccb->fcrb.last_ack_sent); + p_ccb->local_cid, p_ccb->fcrb.local_busy, p_ccb->fcrb.rej_sent, p_ccb->fcrb.srej_sent, p_ccb->fcrb.next_seq_expected, + p_ccb->fcrb.last_ack_sent); } } /* If a window has opened, check if we can send any more packets */ if ( (!GKI_queue_is_empty(&p_ccb->fcrb.retrans_q) || !GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - && (p_ccb->fcrb.wait_ack == FALSE) - && (l2c_fcr_is_flow_controlled (p_ccb) == FALSE) ) - { + && (p_ccb->fcrb.wait_ack == FALSE) + && (l2c_fcr_is_flow_controlled (p_ccb) == FALSE) ) { l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL); } } @@ -841,25 +800,22 @@ void l2c_fcr_proc_tout (tL2C_CCB *p_ccb) { assert(p_ccb != NULL); L2CAP_TRACE_DEBUG ("l2c_fcr_proc_tout: CID: 0x%04x num_tries: %u (max: %u) wait_ack: %u ack_q_count: %u", - p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit, - p_ccb->fcrb.wait_ack, GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)); + p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit, + p_ccb->fcrb.wait_ack, GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)); #if (L2CAP_ERTM_STATS == TRUE) p_ccb->fcrb.retrans_touts++; #endif - if ( (p_ccb->peer_cfg.fcr.max_transmit != 0) && (++p_ccb->fcrb.num_tries > p_ccb->peer_cfg.fcr.max_transmit) ) - { + if ( (p_ccb->peer_cfg.fcr.max_transmit != 0) && (++p_ccb->fcrb.num_tries > p_ccb->peer_cfg.fcr.max_transmit) ) { l2cu_disconnect_chnl (p_ccb); - } - else - { - if (!p_ccb->fcrb.srej_sent && !p_ccb->fcrb.rej_sent) - { - if (p_ccb->fcrb.local_busy) + } else { + if (!p_ccb->fcrb.srej_sent && !p_ccb->fcrb.rej_sent) { + if (p_ccb->fcrb.local_busy) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, L2CAP_FCR_P_BIT); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, L2CAP_FCR_P_BIT); + } } } } @@ -878,18 +834,18 @@ void l2c_fcr_proc_ack_tout (tL2C_CCB *p_ccb) { assert(p_ccb != NULL); L2CAP_TRACE_DEBUG ("l2c_fcr_proc_ack_tout: CID: 0x%04x State: %u Wack:%u Rq:%d Acked:%d", p_ccb->local_cid, - p_ccb->chnl_state, p_ccb->fcrb.wait_ack, p_ccb->fcrb.next_seq_expected, p_ccb->fcrb.last_ack_sent); + p_ccb->chnl_state, p_ccb->fcrb.wait_ack, p_ccb->fcrb.next_seq_expected, p_ccb->fcrb.last_ack_sent); if ( (p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack) - && (p_ccb->fcrb.last_ack_sent != p_ccb->fcrb.next_seq_expected) ) - { + && (p_ccb->fcrb.last_ack_sent != p_ccb->fcrb.next_seq_expected) ) { #if (L2CAP_ERTM_STATS == TRUE) p_ccb->fcrb.xmit_ack_touts++; #endif - if (p_ccb->fcrb.local_busy) + if (p_ccb->fcrb.local_busy) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, 0); + } } } @@ -913,12 +869,12 @@ static BOOLEAN process_reqseq (tL2C_CCB *p_ccb, UINT16 ctrl_word) /* Receive sequence number does not ack anything for SREJ with P-bit set to zero */ if ( (ctrl_word & L2CAP_FCR_S_FRAME_BIT) - && ((ctrl_word & L2CAP_FCR_SUP_BITS) == (L2CAP_FCR_SUP_SREJ << L2CAP_FCR_SUP_SHIFT)) - && ((ctrl_word & L2CAP_FCR_P_BIT) == 0) ) - { + && ((ctrl_word & L2CAP_FCR_SUP_BITS) == (L2CAP_FCR_SUP_SREJ << L2CAP_FCR_SUP_SHIFT)) + && ((ctrl_word & L2CAP_FCR_P_BIT) == 0) ) { /* If anything still waiting for ack, restart the timer if it was stopped */ - if (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) + if (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) { l2c_fcr_start_timer (p_ccb); + } return (TRUE); } @@ -929,11 +885,10 @@ static BOOLEAN process_reqseq (tL2C_CCB *p_ccb, UINT16 ctrl_word) num_bufs_acked = (req_seq - p_fcrb->last_rx_ack) & L2CAP_FCR_SEQ_MODULO; /* Verify the request sequence is in range before proceeding */ - if (num_bufs_acked > GKI_queue_length(&p_fcrb->waiting_for_ack_q)) - { + if (num_bufs_acked > GKI_queue_length(&p_fcrb->waiting_for_ack_q)) { /* The channel is closed if ReqSeq is not in range */ L2CAP_TRACE_WARNING ("L2CAP eRTM Frame BAD Req_Seq - ctrl_word: 0x%04x req_seq 0x%02x last_rx_ack: 0x%02x QCount: %u", - ctrl_word, req_seq, p_fcrb->last_rx_ack, GKI_queue_length(&p_fcrb->waiting_for_ack_q)); + ctrl_word, req_seq, p_fcrb->last_rx_ack, GKI_queue_length(&p_fcrb->waiting_for_ack_q)); l2cu_disconnect_chnl (p_ccb); return (FALSE); @@ -942,8 +897,7 @@ static BOOLEAN process_reqseq (tL2C_CCB *p_ccb, UINT16 ctrl_word) p_fcrb->last_rx_ack = req_seq; /* Now we can release all acknowledged frames, and restart the retransmission timer if needed */ - if (num_bufs_acked != 0) - { + if (num_bufs_acked != 0) { p_fcrb->num_tries = 0; full_sdus_xmitted = 0; @@ -951,34 +905,36 @@ static BOOLEAN process_reqseq (tL2C_CCB *p_ccb, UINT16 ctrl_word) l2c_fcr_collect_ack_delay (p_ccb, num_bufs_acked); #endif - for (xx = 0; xx < num_bufs_acked; xx++) - { + for (xx = 0; xx < num_bufs_acked; xx++) { ls = ((BT_HDR *)(GKI_getfirst(&p_fcrb->waiting_for_ack_q)))->layer_specific & L2CAP_FCR_SAR_BITS; - if ( (ls == L2CAP_FCR_UNSEG_SDU) || (ls == L2CAP_FCR_END_SDU) ) + if ( (ls == L2CAP_FCR_UNSEG_SDU) || (ls == L2CAP_FCR_END_SDU) ) { full_sdus_xmitted++; + } GKI_freebuf (GKI_dequeue (&p_fcrb->waiting_for_ack_q)); } /* If we are still in a wait_ack state, do not mess with the timer */ - if (!p_ccb->fcrb.wait_ack) + if (!p_ccb->fcrb.wait_ack) { l2c_fcr_stop_timer (p_ccb); + } /* Check if we need to call the "packet_sent" callback */ - if ( (p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_TxComplete_Cb) && (full_sdus_xmitted) ) - { + if ( (p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_TxComplete_Cb) && (full_sdus_xmitted) ) { /* Special case for eRTM, if all packets sent, send 0xFFFF */ - if (GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q) && (GKI_queue_is_empty(&p_ccb->xmit_hold_q))) + if (GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q) && (GKI_queue_is_empty(&p_ccb->xmit_hold_q))) { full_sdus_xmitted = 0xFFFF; + } (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, full_sdus_xmitted); } } /* If anything still waiting for ack, restart the timer if it was stopped */ - if (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) + if (!GKI_queue_is_empty(&p_fcrb->waiting_for_ack_q)) { l2c_fcr_start_timer (p_ccb); + } return (TRUE); } @@ -1003,8 +959,7 @@ static void process_s_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word) BOOLEAN remote_was_busy; BOOLEAN all_ok = TRUE; - if (p_buf->len != 0) - { + if (p_buf->len != 0) { L2CAP_TRACE_WARNING ("Incorrect S-frame Length (%d)", p_buf->len); } @@ -1014,20 +969,19 @@ static void process_s_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word) p_ccb->fcrb.s_frames_rcvd[s_frame_type]++; #endif - if (ctrl_word & L2CAP_FCR_P_BIT) - { + if (ctrl_word & L2CAP_FCR_P_BIT) { p_fcrb->rej_sent = FALSE; /* After checkpoint, we can send anoher REJ */ p_fcrb->send_f_rsp = TRUE; /* Set a flag in case an I-frame is pending */ } - switch (s_frame_type) - { + switch (s_frame_type) { case L2CAP_FCR_SUP_RR: remote_was_busy = p_fcrb->remote_busy; p_fcrb->remote_busy = FALSE; - if ( (ctrl_word & L2CAP_FCR_F_BIT) || (remote_was_busy) ) + if ( (ctrl_word & L2CAP_FCR_F_BIT) || (remote_was_busy) ) { all_ok = retransmit_i_frames (p_ccb, L2C_FCR_RETX_ALL_PKTS); + } break; case L2CAP_FCR_SUP_REJ: @@ -1046,23 +1000,20 @@ static void process_s_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word) break; } - if (all_ok) - { + if (all_ok) { /* If polled, we need to respond with F-bit. Note, we may have sent a I-frame with the F-bit */ - if (p_fcrb->send_f_rsp) - { - if (p_fcrb->srej_sent) + if (p_fcrb->send_f_rsp) { + if (p_fcrb->srej_sent) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_SREJ, L2CAP_FCR_F_BIT); - else if (p_fcrb->local_busy) + } else if (p_fcrb->local_busy) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, L2CAP_FCR_F_BIT); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, L2CAP_FCR_F_BIT); + } p_fcrb->send_f_rsp = FALSE; } - } - else - { + } else { L2CAP_TRACE_DEBUG ("process_s_frame hit_max_retries"); } @@ -1088,10 +1039,8 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B UINT8 tx_seq, num_lost, num_to_ack, next_srej; /* If we were doing checkpoint recovery, first retransmit all unacked I-frames */ - if (ctrl_word & L2CAP_FCR_F_BIT) - { - if (!retransmit_i_frames (p_ccb, L2C_FCR_RETX_ALL_PKTS)) - { + if (ctrl_word & L2CAP_FCR_F_BIT) { + if (!retransmit_i_frames (p_ccb, L2C_FCR_RETX_ALL_PKTS)) { GKI_freebuf(p_buf); return; } @@ -1106,8 +1055,7 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B tx_seq = (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT; /* If we have flow controlled the peer, ignore any bad I-frames from him */ - if ( (tx_seq != p_fcrb->next_seq_expected) && (p_fcrb->local_busy) ) - { + if ( (tx_seq != p_fcrb->next_seq_expected) && (p_fcrb->local_busy) ) { L2CAP_TRACE_WARNING ("Dropping bad I-Frame since we flowed off, tx_seq:%u", tx_seq); l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0); GKI_freebuf(p_buf); @@ -1116,42 +1064,34 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B /* If there are no free buffers in the user Rx queue, drop the */ /* received buffer now before we update any sequence numbers */ - if (GKI_poolfreecount (p_ccb->ertm_info.user_rx_pool_id) == 0) - { + if (GKI_poolfreecount (p_ccb->ertm_info.user_rx_pool_id) == 0) { L2CAP_TRACE_WARNING ("L2CAP CID: 0x%04x Dropping I-Frame seq: %u User RX Pool: %u (Size: %u) has no free buffers!!", - p_ccb->local_cid, tx_seq, p_ccb->ertm_info.user_rx_pool_id, - GKI_poolcount (p_ccb->ertm_info.user_rx_pool_id)); + p_ccb->local_cid, tx_seq, p_ccb->ertm_info.user_rx_pool_id, + GKI_poolcount (p_ccb->ertm_info.user_rx_pool_id)); GKI_freebuf(p_buf); return; } /* Check if tx-sequence is the expected one */ - if (tx_seq != p_fcrb->next_seq_expected) - { + if (tx_seq != p_fcrb->next_seq_expected) { num_lost = (tx_seq - p_fcrb->next_seq_expected) & L2CAP_FCR_SEQ_MODULO; /* Is the frame a duplicate ? If so, just drop it */ - if (num_lost >= p_ccb->our_cfg.fcr.tx_win_sz) - { + if (num_lost >= p_ccb->our_cfg.fcr.tx_win_sz) { /* Duplicate - simply drop it */ L2CAP_TRACE_WARNING ("process_i_frame() Dropping Duplicate Frame tx_seq:%u ExpectedTxSeq %u", tx_seq, p_fcrb->next_seq_expected); GKI_freebuf(p_buf); - } - else - { + } else { L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej: %u", p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent, p_fcrb->srej_sent); - if (p_fcrb->srej_sent) - { + if (p_fcrb->srej_sent) { /* If SREJ sent, save the frame for later processing as long as it is in sequence */ next_srej = (((BT_HDR *)GKI_getlast(&p_fcrb->srej_rcv_hold_q))->layer_specific + 1) & L2CAP_FCR_SEQ_MODULO; - if ( (tx_seq == next_srej) && (GKI_queue_length(&p_fcrb->srej_rcv_hold_q) < p_ccb->our_cfg.fcr.tx_win_sz) ) - { + if ( (tx_seq == next_srej) && (GKI_queue_length(&p_fcrb->srej_rcv_hold_q) < p_ccb->our_cfg.fcr.tx_win_sz) ) { /* If user gave us a pool for held rx buffers, use that */ - if (p_ccb->ertm_info.fcr_rx_pool_id != HCI_ACL_POOL_ID) - { + if (p_ccb->ertm_info.fcr_rx_pool_id != HCI_ACL_POOL_ID) { BT_HDR *p_buf2; /* Adjust offset and len so that control word is copied */ @@ -1160,8 +1100,7 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B p_buf2 = l2c_fcr_clone_buf (p_buf, p_buf->offset, p_buf->len, p_ccb->ertm_info.fcr_rx_pool_id); - if (p_buf2) - { + if (p_buf2) { GKI_freebuf (p_buf); p_buf = p_buf2; } @@ -1169,46 +1108,36 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B p_buf->len -= L2CAP_FCR_OVERHEAD; } L2CAP_TRACE_DEBUG ("process_i_frame() Lost: %u tx_seq:%u ExpTxSeq %u Rej: %u SRej1", - num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent); + num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent); p_buf->layer_specific = tx_seq; GKI_enqueue (&p_fcrb->srej_rcv_hold_q, p_buf); - } - else - { + } else { L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x frame dropped in Srej Sent next_srej:%u hold_q.count:%u win_sz:%u", p_ccb->local_cid, next_srej, GKI_queue_length(&p_fcrb->srej_rcv_hold_q), p_ccb->our_cfg.fcr.tx_win_sz); p_fcrb->rej_after_srej = TRUE; GKI_freebuf (p_buf); } - } - else if (p_fcrb->rej_sent) - { + } else if (p_fcrb->rej_sent) { L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x Lost: %u tx_seq:%u ExpTxSeq %u Rej: 1 SRej: %u", p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->srej_sent); /* If REJ sent, just drop the frame */ GKI_freebuf (p_buf); - } - else - { + } else { L2CAP_TRACE_DEBUG ("process_i_frame() CID: 0x%04x tx_seq:%u ExpTxSeq %u Rej: %u", - p_ccb->local_cid, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent); + p_ccb->local_cid, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent); /* If only one lost, we will send SREJ, otherwise we will send REJ */ - if (num_lost > 1) - { + if (num_lost > 1) { GKI_freebuf (p_buf); p_fcrb->rej_sent = TRUE; l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_REJ, 0); - } - else - { - if (!GKI_queue_is_empty(&p_fcrb->srej_rcv_hold_q)) - { + } else { + if (!GKI_queue_is_empty(&p_fcrb->srej_rcv_hold_q)) { L2CAP_TRACE_ERROR ("process_i_frame() CID: 0x%04x sending SREJ tx_seq:%d hold_q.count:%u", - p_ccb->local_cid, tx_seq, GKI_queue_length(&p_fcrb->srej_rcv_hold_q)); + p_ccb->local_cid, tx_seq, GKI_queue_length(&p_fcrb->srej_rcv_hold_q)); } p_buf->layer_specific = tx_seq; GKI_enqueue (&p_fcrb->srej_rcv_hold_q, p_buf); @@ -1229,8 +1158,7 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B p_fcrb->next_seq_expected = (tx_seq + 1) & L2CAP_FCR_SEQ_MODULO; /* If any SAR problem in eRTM mode, spec says disconnect. */ - if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word)) - { + if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word)) { L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x reassembly failed", p_ccb->local_cid); l2cu_disconnect_chnl (p_ccb); return; @@ -1239,29 +1167,26 @@ static void process_i_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_word, B /* RR optimization - if peer can still send us more, then start an ACK timer */ num_to_ack = (p_fcrb->next_seq_expected - p_fcrb->last_ack_sent) & L2CAP_FCR_SEQ_MODULO; - if ( (num_to_ack < p_ccb->fcrb.max_held_acks) && (!p_fcrb->local_busy) ) + if ( (num_to_ack < p_ccb->fcrb.max_held_acks) && (!p_fcrb->local_busy) ) { delay_ack = TRUE; + } /* We should neve never ack frame if we are not in OPEN state */ - if ((num_to_ack != 0) && p_ccb->in_use && (p_ccb->chnl_state == CST_OPEN)) - { + if ((num_to_ack != 0) && p_ccb->in_use && (p_ccb->chnl_state == CST_OPEN)) { /* If no frames are awaiting transmission or are held, send an RR or RNR S-frame for ack */ - if (delay_ack) - { + if (delay_ack) { /* If it is the first I frame we did not ack, start ack timer */ - if (!p_ccb->fcrb.ack_timer.in_use) - { + if (!p_ccb->fcrb.ack_timer.in_use) { btu_start_quick_timer (&p_ccb->fcrb.ack_timer, BTU_TTYPE_L2CAP_FCR_ACK, - (L2CAP_FCR_ACK_TOUT*QUICK_TIMER_TICKS_PER_SEC)/1000); + (L2CAP_FCR_ACK_TOUT * QUICK_TIMER_TICKS_PER_SEC) / 1000); } - } - else if ( ((GKI_queue_is_empty(&p_ccb->xmit_hold_q)) || (l2c_fcr_is_flow_controlled (p_ccb))) - && (GKI_queue_is_empty(&p_ccb->fcrb.srej_rcv_hold_q))) - { - if (p_fcrb->local_busy) + } else if ( ((GKI_queue_is_empty(&p_ccb->xmit_hold_q)) || (l2c_fcr_is_flow_controlled (p_ccb))) + && (GKI_queue_is_empty(&p_ccb->fcrb.srej_rcv_hold_q))) { + if (p_fcrb->local_busy) { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0); - else + } else { l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, 0); + } } } } @@ -1287,16 +1212,14 @@ static void process_stream_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf) UINT8 tx_seq; /* Verify FCS if using */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) - { - p = ((UINT8 *)(p_buf+1)) + p_buf->offset + p_buf->len - L2CAP_FCS_LEN; + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset + p_buf->len - L2CAP_FCS_LEN; /* Extract and drop the FCS from the packet */ STREAM_TO_UINT16 (fcs, p); p_buf->len -= L2CAP_FCS_LEN; - if (l2c_fcr_rx_get_fcs(p_buf) != fcs) - { + if (l2c_fcr_rx_get_fcs(p_buf) != fcs) { L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD FCS", p_ccb->local_cid); GKI_freebuf(p_buf); return; @@ -1304,7 +1227,7 @@ static void process_stream_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf) } /* Get the control word */ - p = ((UINT8 *)(p_buf+1)) + p_buf->offset; + p = ((UINT8 *)(p_buf + 1)) + p_buf->offset; STREAM_TO_UINT16 (ctrl_word, p); @@ -1312,8 +1235,7 @@ static void process_stream_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf) p_buf->offset += L2CAP_FCR_OVERHEAD; /* Make sure it is an I-frame */ - if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) - { + if (ctrl_word & L2CAP_FCR_S_FRAME_BIT) { L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x BAD S-frame in streaming mode ctrl_word: 0x%04x", p_ccb->local_cid, ctrl_word); GKI_freebuf (p_buf); return; @@ -1321,25 +1243,23 @@ static void process_stream_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf) #if BT_TRACE_VERBOSE == TRUE L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x Len: %u SAR: %-12s TxSeq: %u ReqSeq: %u F: %u", - p_ccb->local_cid, p_buf->len, - SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], - (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, - (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); + p_ccb->local_cid, p_buf->len, + SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT], + (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT, + (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT); #endif /* Extract the sequence number */ tx_seq = (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT; /* Check if tx-sequence is the expected one */ - if (tx_seq != p_ccb->fcrb.next_seq_expected) - { + if (tx_seq != p_ccb->fcrb.next_seq_expected) { L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x Lost frames Exp: %u Got: %u p_rx_sdu: 0x%08x", - p_ccb->local_cid, p_ccb->fcrb.next_seq_expected, tx_seq, p_ccb->fcrb.p_rx_sdu); + p_ccb->local_cid, p_ccb->fcrb.next_seq_expected, tx_seq, p_ccb->fcrb.p_rx_sdu); /* Lost one or more packets, so flush the SAR queue */ - if (p_ccb->fcrb.p_rx_sdu != NULL) - { + if (p_ccb->fcrb.p_rx_sdu != NULL) { GKI_freebuf (p_ccb->fcrb.p_rx_sdu); p_ccb->fcrb.p_rx_sdu = NULL; } @@ -1347,11 +1267,9 @@ static void process_stream_frame (tL2C_CCB *p_ccb, BT_HDR *p_buf) p_ccb->fcrb.next_seq_expected = (tx_seq + 1) & L2CAP_FCR_SEQ_MODULO; - if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word)) - { + if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word)) { /* Some sort of SAR error, so flush the SAR queue */ - if (p_ccb->fcrb.p_rx_sdu != NULL) - { + if (p_ccb->fcrb.p_rx_sdu != NULL) { GKI_freebuf (p_ccb->fcrb.p_rx_sdu); p_ccb->fcrb.p_rx_sdu = NULL; } @@ -1379,76 +1297,57 @@ static BOOLEAN do_sar_reassembly (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_wo UINT8 *p; /* Check if the SAR state is correct */ - if ((sar_type == L2CAP_FCR_UNSEG_SDU) || (sar_type == L2CAP_FCR_START_SDU)) - { - if (p_fcrb->p_rx_sdu != NULL) - { + if ((sar_type == L2CAP_FCR_UNSEG_SDU) || (sar_type == L2CAP_FCR_START_SDU)) { + if (p_fcrb->p_rx_sdu != NULL) { L2CAP_TRACE_WARNING ("SAR - got unexpected unsegmented or start SDU Expected len: %u Got so far: %u", - p_fcrb->rx_sdu_len, p_fcrb->p_rx_sdu->len); + p_fcrb->rx_sdu_len, p_fcrb->p_rx_sdu->len); packet_ok = FALSE; } /* Check the length of the packet */ - if ( (sar_type == L2CAP_FCR_START_SDU) && (p_buf->len < L2CAP_SDU_LEN_OVERHEAD) ) - { + if ( (sar_type == L2CAP_FCR_START_SDU) && (p_buf->len < L2CAP_SDU_LEN_OVERHEAD) ) { L2CAP_TRACE_WARNING ("SAR start packet too short: %u", p_buf->len); packet_ok = FALSE; } - } - else - { - if (p_fcrb->p_rx_sdu == NULL) - { + } else { + if (p_fcrb->p_rx_sdu == NULL) { L2CAP_TRACE_WARNING ("SAR - got unexpected cont or end SDU"); packet_ok = FALSE; } } - if ( (packet_ok) && (sar_type != L2CAP_FCR_UNSEG_SDU) ) - { + if ( (packet_ok) && (sar_type != L2CAP_FCR_UNSEG_SDU) ) { p = ((UINT8 *)(p_buf + 1)) + p_buf->offset; /* For start SDU packet, extract the SDU length */ - if (sar_type == L2CAP_FCR_START_SDU) - { + if (sar_type == L2CAP_FCR_START_SDU) { /* Get the SDU length */ STREAM_TO_UINT16 (p_fcrb->rx_sdu_len, p); p_buf->offset += 2; p_buf->len -= 2; - if (p_fcrb->rx_sdu_len > p_ccb->max_rx_mtu) - { + if (p_fcrb->rx_sdu_len > p_ccb->max_rx_mtu) { L2CAP_TRACE_WARNING ("SAR - SDU len: %u larger than MTU: %u", p_fcrb->rx_sdu_len, p_fcrb->rx_sdu_len); packet_ok = FALSE; - } - else if ((p_fcrb->p_rx_sdu = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_rx_pool_id)) == NULL) - { + } else if ((p_fcrb->p_rx_sdu = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_rx_pool_id)) == NULL) { L2CAP_TRACE_ERROR ("SAR - no buffer for SDU start user_rx_pool_id:%d", p_ccb->ertm_info.user_rx_pool_id); packet_ok = FALSE; - } - else - { + } else { p_fcrb->p_rx_sdu->offset = 4; /* this is the minimal offset required by OBX to process incoming packets */ p_fcrb->p_rx_sdu->len = 0; } } - if (packet_ok) - { - if ((p_fcrb->p_rx_sdu->len + p_buf->len) > p_fcrb->rx_sdu_len) - { + if (packet_ok) { + if ((p_fcrb->p_rx_sdu->len + p_buf->len) > p_fcrb->rx_sdu_len) { L2CAP_TRACE_ERROR ("SAR - SDU len exceeded Type: %u Lengths: %u %u %u", - sar_type, p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len); + sar_type, p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len); packet_ok = FALSE; - } - else if ( (sar_type == L2CAP_FCR_END_SDU) && ((p_fcrb->p_rx_sdu->len + p_buf->len) != p_fcrb->rx_sdu_len) ) - { + } else if ( (sar_type == L2CAP_FCR_END_SDU) && ((p_fcrb->p_rx_sdu->len + p_buf->len) != p_fcrb->rx_sdu_len) ) { L2CAP_TRACE_WARNING ("SAR - SDU end rcvd but SDU incomplete: %u %u %u", - p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len); + p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len); packet_ok = FALSE; - } - else - { + } else { memcpy (((UINT8 *) (p_fcrb->p_rx_sdu + 1)) + p_fcrb->p_rx_sdu->offset + p_fcrb->p_rx_sdu->len, p, p_buf->len); p_fcrb->p_rx_sdu->len += p_buf->len; @@ -1456,8 +1355,7 @@ static BOOLEAN do_sar_reassembly (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_wo GKI_freebuf (p_buf); p_buf = NULL; - if (sar_type == L2CAP_FCR_END_SDU) - { + if (sar_type == L2CAP_FCR_END_SDU) { p_buf = p_fcrb->p_rx_sdu; p_fcrb->p_rx_sdu = NULL; } @@ -1465,21 +1363,16 @@ static BOOLEAN do_sar_reassembly (tL2C_CCB *p_ccb, BT_HDR *p_buf, UINT16 ctrl_wo } } - if (packet_ok == FALSE) - { + if (packet_ok == FALSE) { GKI_freebuf (p_buf); - } - else if (p_buf != NULL) - { + } else if (p_buf != NULL) { #if (L2CAP_NUM_FIXED_CHNLS > 0) if (p_ccb->local_cid < L2CAP_BASE_APPL_CID && - (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL && p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)) - { + (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL && p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)) { if (l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb) (*l2cb.fixed_reg[p_ccb->local_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb) - (p_ccb->local_cid, p_ccb->p_lcb->remote_bd_addr, p_buf); - } - else + (p_ccb->local_cid, p_ccb->p_lcb->remote_bd_addr, p_buf); + } else #endif l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DATA, p_buf); } @@ -1507,26 +1400,23 @@ static BOOLEAN retransmit_i_frames (tL2C_CCB *p_ccb, UINT8 tx_seq) UINT16 ctrl_word; if ( (GKI_getfirst(&p_ccb->fcrb.waiting_for_ack_q)) - && (p_ccb->peer_cfg.fcr.max_transmit != 0) - && (p_ccb->fcrb.num_tries >= p_ccb->peer_cfg.fcr.max_transmit) ) - { + && (p_ccb->peer_cfg.fcr.max_transmit != 0) + && (p_ccb->fcrb.num_tries >= p_ccb->peer_cfg.fcr.max_transmit) ) { L2CAP_TRACE_EVENT ("Max Tries Exceeded: (last_acq: %d CID: 0x%04x num_tries: %u (max: %u) ack_q_count: %u", - p_ccb->fcrb.last_rx_ack, p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit, - GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)); + p_ccb->fcrb.last_rx_ack, p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit, + GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)); l2cu_disconnect_chnl (p_ccb); return (FALSE); } /* tx_seq indicates whether to retransmit a specific sequence or all (if == L2C_FCR_RETX_ALL_PKTS) */ - if (tx_seq != L2C_FCR_RETX_ALL_PKTS) - { + if (tx_seq != L2C_FCR_RETX_ALL_PKTS) { /* If sending only one, the sequence number tells us which one. Look for it. */ - for (p_buf = (BT_HDR *)GKI_getfirst(&p_ccb->fcrb.waiting_for_ack_q); p_buf; p_buf = (BT_HDR *)GKI_getnext (p_buf)) - { + for (p_buf = (BT_HDR *)GKI_getfirst(&p_ccb->fcrb.waiting_for_ack_q); p_buf; p_buf = (BT_HDR *)GKI_getnext (p_buf)) { /* Get the old control word */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset + L2CAP_PKT_OVERHEAD; STREAM_TO_UINT16 (ctrl_word, p); @@ -1534,60 +1424,57 @@ static BOOLEAN retransmit_i_frames (tL2C_CCB *p_ccb, UINT8 tx_seq) L2CAP_TRACE_DEBUG ("retransmit_i_frames() cur seq: %u looking for: %u", buf_seq, tx_seq); - if (tx_seq == buf_seq) + if (tx_seq == buf_seq) { break; + } } - if (!p_buf) - { + if (!p_buf) { L2CAP_TRACE_ERROR ("retransmit_i_frames() UNKNOWN seq: %u q_count: %u", tx_seq, GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)); return (TRUE); } - } - else - { + } else { // Iterate though list and flush the amount requested from // the transmit data queue that satisfy the layer and event conditions. for (const list_node_t *node = list_begin(p_ccb->p_lcb->link_xmit_data_q); - node != list_end(p_ccb->p_lcb->link_xmit_data_q);) { - BT_HDR *p_buf = (BT_HDR *)list_node(node); - node = list_next(node); + node != list_end(p_ccb->p_lcb->link_xmit_data_q);) { + BT_HDR *p_buf = (BT_HDR *)list_node(node); + node = list_next(node); /* Do not flush other CIDs or partial segments */ - if ((p_buf->layer_specific == 0) && (p_buf->event == p_ccb->local_cid)) { - list_remove(p_ccb->p_lcb->link_xmit_data_q, p_buf); - GKI_freebuf(p_buf); - } + if ((p_buf->layer_specific == 0) && (p_buf->event == p_ccb->local_cid)) { + list_remove(p_ccb->p_lcb->link_xmit_data_q, p_buf); + GKI_freebuf(p_buf); + } } /* Also flush our retransmission queue */ - while (!GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) + while (!GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) { GKI_freebuf (GKI_dequeue (&p_ccb->fcrb.retrans_q)); + } p_buf = (BT_HDR *)GKI_getfirst(&p_ccb->fcrb.waiting_for_ack_q); } - while (p_buf != NULL) - { + while (p_buf != NULL) { p_buf2 = l2c_fcr_clone_buf (p_buf, p_buf->offset, p_buf->len, p_ccb->ertm_info.fcr_tx_pool_id); - if (p_buf2) - { + if (p_buf2) { p_buf2->layer_specific = p_buf->layer_specific; GKI_enqueue (&p_ccb->fcrb.retrans_q, p_buf2); } - if ( (tx_seq != L2C_FCR_RETX_ALL_PKTS) || (p_buf2 == NULL) ) + if ( (tx_seq != L2C_FCR_RETX_ALL_PKTS) || (p_buf2 == NULL) ) { break; - else + } else { p_buf = (BT_HDR *)GKI_getnext (p_buf); + } } l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL); - if (GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)) - { + if (GKI_queue_length(&p_ccb->fcrb.waiting_for_ack_q)) { p_ccb->fcrb.num_tries++; l2c_fcr_start_timer (p_ccb); } @@ -1619,8 +1506,7 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length /* If there is anything in the retransmit queue, that goes first */ - if (GKI_getfirst(&p_ccb->fcrb.retrans_q)) - { + if (GKI_getfirst(&p_ccb->fcrb.retrans_q)) { p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->fcrb.retrans_q); /* Update Rx Seq and FCS if we acked some packets while this one was queued */ @@ -1639,31 +1525,27 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length /* For BD/EDR controller, max_packet_length is set to 0 */ /* For AMP controller, max_packet_length is set by available blocks */ if ( (max_packet_length > L2CAP_MAX_HEADER_FCS) - && (max_pdu + L2CAP_MAX_HEADER_FCS > max_packet_length) ) - { + && (max_pdu + L2CAP_MAX_HEADER_FCS > max_packet_length) ) { max_pdu = max_packet_length - L2CAP_MAX_HEADER_FCS; } p_buf = (BT_HDR *)GKI_getfirst(&p_ccb->xmit_hold_q); /* If there is more data than the MPS, it requires segmentation */ - if (p_buf->len > max_pdu) - { + if (p_buf->len > max_pdu) { /* We are using the "event" field to tell is if we already started segmentation */ - if (p_buf->event == 0) - { + if (p_buf->event == 0) { first_seg = TRUE; sdu_len = p_buf->len; - } - else + } else { mid_seg = TRUE; + } /* Get a new buffer and copy the data that can be sent in a PDU */ p_xmit = l2c_fcr_clone_buf (p_buf, L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET, max_pdu, p_ccb->ertm_info.fcr_tx_pool_id); - if (p_xmit != NULL) - { + if (p_xmit != NULL) { p_buf->event = p_ccb->local_cid; p_xmit->event = p_ccb->local_cid; @@ -1672,19 +1554,16 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length /* copy PBF setting */ p_xmit->layer_specific = p_buf->layer_specific; - } - else /* Should never happen if the application has configured buffers correctly */ - { + } else { /* Should never happen if the application has configured buffers correctly */ L2CAP_TRACE_ERROR ("L2CAP - cannot get buffer, for segmentation, pool: %u", p_ccb->ertm_info.fcr_tx_pool_id); return (NULL); } - } - else /* Use the original buffer if no segmentation, or the last segment */ - { + } else { /* Use the original buffer if no segmentation, or the last segment */ p_xmit = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q); - if (p_xmit->event != 0) + if (p_xmit->event != 0) { last_seg = TRUE; + } p_xmit->event = p_ccb->local_cid; } @@ -1693,8 +1572,7 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length p_xmit->offset -= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD); p_xmit->len += L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD; - if (first_seg) - { + if (first_seg) { p_xmit->offset -= L2CAP_SDU_LEN_OVERHEAD; p_xmit->len += L2CAP_SDU_LEN_OVERHEAD; } @@ -1709,8 +1587,7 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length UINT16_TO_STREAM (p, p_ccb->remote_cid); - if (first_seg) - { + if (first_seg) { /* Skip control word and add SDU length */ p += 2; UINT16_TO_STREAM (p, sdu_len); @@ -1720,43 +1597,41 @@ BT_HDR *l2c_fcr_get_next_xmit_sdu_seg (tL2C_CCB *p_ccb, UINT16 max_packet_length p_xmit->layer_specific |= L2CAP_FCR_START_SDU; first_seg = FALSE; - } - else if (mid_seg) + } else if (mid_seg) { p_xmit->layer_specific |= L2CAP_FCR_CONT_SDU; - else if (last_seg) + } else if (last_seg) { p_xmit->layer_specific |= L2CAP_FCR_END_SDU; - else + } else { p_xmit->layer_specific |= L2CAP_FCR_UNSEG_SDU; + } prepare_I_frame (p_ccb, p_xmit, FALSE); - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - { + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) { BT_HDR *p_wack = l2c_fcr_clone_buf (p_xmit, HCI_DATA_PREAMBLE_SIZE, p_xmit->len, p_ccb->ertm_info.fcr_tx_pool_id); - if (!p_wack) - { + if (!p_wack) { L2CAP_TRACE_ERROR ("L2CAP - no buffer for xmit cloning, CID: 0x%04x Pool: %u Count: %u", - p_ccb->local_cid, p_ccb->ertm_info.fcr_tx_pool_id, GKI_poolfreecount(p_ccb->ertm_info.fcr_tx_pool_id)); + p_ccb->local_cid, p_ccb->ertm_info.fcr_tx_pool_id, GKI_poolfreecount(p_ccb->ertm_info.fcr_tx_pool_id)); /* We will not save the FCS in case we reconfigure and change options */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { p_xmit->len -= L2CAP_FCS_LEN; + } /* Pretend we sent it and it got lost */ GKI_enqueue (&p_ccb->fcrb.waiting_for_ack_q, p_xmit); return (NULL); - } - else - { + } else { #if (L2CAP_ERTM_STATS == TRUE) /* set timestamp at the end of tx I-frame to get acking delay */ - p = ((UINT8 *) (p_wack+1)) + p_wack->offset + p_wack->len; + p = ((UINT8 *) (p_wack + 1)) + p_wack->offset + p_wack->len; UINT32_TO_STREAM (p, GKI_get_os_tick_count()); #endif /* We will not save the FCS in case we reconfigure and change options */ - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { p_wack->len -= L2CAP_FCS_LEN; + } p_wack->layer_specific = p_xmit->layer_specific; GKI_enqueue (&p_ccb->fcrb.waiting_for_ack_q, p_wack); @@ -1798,15 +1673,16 @@ UINT8 l2c_fcr_chk_chan_modes (tL2C_CCB *p_ccb) assert(p_ccb != NULL); /* Remove nonbasic options that the peer does not support */ - if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_ENH_RETRANS)) + if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_ENH_RETRANS)) { p_ccb->ertm_info.allowed_modes &= ~L2CAP_FCR_CHAN_OPT_ERTM; + } - if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_STREAM_MODE)) + if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_STREAM_MODE)) { p_ccb->ertm_info.allowed_modes &= ~L2CAP_FCR_CHAN_OPT_STREAM; + } /* At least one type needs to be set (Basic, ERTM, STM) to continue */ - if (!p_ccb->ertm_info.allowed_modes) - { + if (!p_ccb->ertm_info.allowed_modes) { L2CAP_TRACE_WARNING ("L2CAP - Peer does not support our desired channel types"); } @@ -1830,20 +1706,17 @@ BOOLEAN l2c_fcr_adj_our_req_options (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) tL2CAP_FCR_OPTS *p_fcr = &p_cfg->fcr; - if (p_fcr->mode != p_ccb->ertm_info.preferred_mode) - { + if (p_fcr->mode != p_ccb->ertm_info.preferred_mode) { L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options - preferred_mode (%d), does not match mode (%d)", - p_ccb->ertm_info.preferred_mode, p_fcr->mode); + p_ccb->ertm_info.preferred_mode, p_fcr->mode); /* The preferred mode is passed in through tL2CAP_ERTM_INFO, so override this one */ p_fcr->mode = p_ccb->ertm_info.preferred_mode; } /* If upper layer did not request eRTM mode, BASIC must be used */ - if (p_ccb->ertm_info.allowed_modes == L2CAP_FCR_CHAN_OPT_BASIC) - { - if (p_cfg->fcr_present && p_fcr->mode != L2CAP_FCR_BASIC_MODE) - { + if (p_ccb->ertm_info.allowed_modes == L2CAP_FCR_CHAN_OPT_BASIC) { + if (p_cfg->fcr_present && p_fcr->mode != L2CAP_FCR_BASIC_MODE) { L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options (mode %d): ERROR: No FCR options set using BASIC mode", p_fcr->mode); } p_fcr->mode = L2CAP_FCR_BASIC_MODE; @@ -1852,19 +1725,16 @@ BOOLEAN l2c_fcr_adj_our_req_options (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) /* Process the FCR options if initial channel bring-up (not a reconfig request) ** Determine initial channel mode to try based on our options and remote's features */ - if (p_cfg->fcr_present && !(p_ccb->config_done & RECONFIG_FLAG)) - { + if (p_cfg->fcr_present && !(p_ccb->config_done & RECONFIG_FLAG)) { /* We need to have at least one mode type common with the peer */ - if (!l2c_fcr_chk_chan_modes(p_ccb)) - { + if (!l2c_fcr_chk_chan_modes(p_ccb)) { /* Two channels have incompatible supported types */ l2cu_disconnect_chnl (p_ccb); return (FALSE); } /* Basic is the only common channel mode between the two devices */ - else if (p_ccb->ertm_info.allowed_modes == L2CAP_FCR_CHAN_OPT_BASIC) - { + else if (p_ccb->ertm_info.allowed_modes == L2CAP_FCR_CHAN_OPT_BASIC) { /* We only want to try Basic, so bypass sending the FCR options entirely */ p_cfg->fcr_present = FALSE; p_cfg->fcs_present = FALSE; /* Illegal to use FCS option in basic mode */ @@ -1874,58 +1744,48 @@ BOOLEAN l2c_fcr_adj_our_req_options (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) /* We have at least one non-basic mode available * Override mode from available mode options based on preference, if needed */ - else - { + else { /* If peer does not support STREAMING, try ERTM */ - if (p_fcr->mode == L2CAP_FCR_STREAM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_STREAM)) - { + if (p_fcr->mode == L2CAP_FCR_STREAM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_STREAM)) { L2CAP_TRACE_DEBUG ("L2C CFG: mode is STREAM, but peer does not support; Try ERTM"); p_fcr->mode = L2CAP_FCR_ERTM_MODE; } /* If peer does not support ERTM, try BASIC (will support this if made it here in the code) */ - if (p_fcr->mode == L2CAP_FCR_ERTM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM)) - { + if (p_fcr->mode == L2CAP_FCR_ERTM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM)) { L2CAP_TRACE_DEBUG ("L2C CFG: mode is ERTM, but peer does not support; Try BASIC"); p_fcr->mode = L2CAP_FCR_BASIC_MODE; } } - if (p_fcr->mode != L2CAP_FCR_BASIC_MODE) - { + if (p_fcr->mode != L2CAP_FCR_BASIC_MODE) { /* MTU must be smaller than buffer size */ - if ( (p_cfg->mtu_present) && (p_cfg->mtu > p_ccb->max_rx_mtu) ) - { + if ( (p_cfg->mtu_present) && (p_cfg->mtu > p_ccb->max_rx_mtu) ) { L2CAP_TRACE_WARNING ("L2CAP - MTU: %u larger than buf size: %u", p_cfg->mtu, p_ccb->max_rx_mtu); return (FALSE); } /* application want to use the default MPS */ - if (p_fcr->mps == L2CAP_DEFAULT_ERM_MPS) - { + if (p_fcr->mps == L2CAP_DEFAULT_ERM_MPS) { p_fcr->mps = L2CAP_MPS_OVER_BR_EDR; } /* MPS must be less than MTU */ - else if (p_fcr->mps > p_ccb->max_rx_mtu) - { + else if (p_fcr->mps > p_ccb->max_rx_mtu) { L2CAP_TRACE_WARNING ("L2CAP - MPS %u invalid MTU: %u", p_fcr->mps, p_ccb->max_rx_mtu); return (FALSE); } /* We always initially read into the HCI buffer pool, so make sure it fits */ - if (p_fcr->mps > (L2CAP_MTU_SIZE - L2CAP_MAX_HEADER_FCS)) + if (p_fcr->mps > (L2CAP_MTU_SIZE - L2CAP_MAX_HEADER_FCS)) { p_fcr->mps = L2CAP_MTU_SIZE - L2CAP_MAX_HEADER_FCS; - } - else - { + } + } else { p_cfg->fcs_present = FALSE; /* Illegal to use FCS option in basic mode */ p_cfg->ext_flow_spec_present = FALSE; /* Illegal to use extended flow spec in basic mode */ } p_ccb->our_cfg.fcr = *p_fcr; - } - else /* Not sure how to send a reconfiguration(??) should fcr be included? */ - { + } else { /* Not sure how to send a reconfiguration(??) should fcr be included? */ p_ccb->our_cfg.fcr_present = FALSE; } @@ -1947,27 +1807,23 @@ void l2c_fcr_adj_monitor_retran_timeout (tL2C_CCB *p_ccb) assert(p_ccb != NULL); /* adjust our monitor/retran timeout */ - if (p_ccb->out_cfg_fcr_present) - { + if (p_ccb->out_cfg_fcr_present) { /* ** if we requestd ERTM or accepted ERTM ** We may accept ERTM even if we didn't request ERTM, in case of requesting STREAM */ if ((p_ccb->our_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) - ||(p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)) - { + || (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE)) { /* upper layer setting is ignored */ p_ccb->our_cfg.fcr.mon_tout = L2CAP_MIN_MONITOR_TOUT; p_ccb->our_cfg.fcr.rtrans_tout = L2CAP_MIN_RETRANS_TOUT; - } - else - { + } else { p_ccb->our_cfg.fcr.mon_tout = 0; p_ccb->our_cfg.fcr.rtrans_tout = 0; } L2CAP_TRACE_DEBUG ("l2c_fcr_adj_monitor_retran_timeout: mon_tout:%d, rtrans_tout:%d", - p_ccb->our_cfg.fcr.mon_tout, p_ccb->our_cfg.fcr.rtrans_tout); + p_ccb->our_cfg.fcr.mon_tout, p_ccb->our_cfg.fcr.rtrans_tout); } } /******************************************************************************* @@ -1991,14 +1847,12 @@ void l2c_fcr_adj_our_rsp_options (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) p_cfg->fcr_present = p_ccb->out_cfg_fcr_present; - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { // btla-specific ++ /* Temporary - until a better algorithm is implemented */ /* If peer's tx_wnd_sz requires too many buffers for us to support, then adjust it. For now, respond with our own tx_wnd_sz. */ /* Note: peer is not guaranteed to obey our adjustment */ - if (p_ccb->peer_cfg.fcr.tx_win_sz > p_ccb->our_cfg.fcr.tx_win_sz) - { + if (p_ccb->peer_cfg.fcr.tx_win_sz > p_ccb->our_cfg.fcr.tx_win_sz) { L2CAP_TRACE_DEBUG ("%s: adjusting requested tx_win_sz from %i to %i", __FUNCTION__, p_ccb->peer_cfg.fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz); p_ccb->peer_cfg.fcr.tx_win_sz = p_ccb->our_cfg.fcr.tx_win_sz; } @@ -2034,19 +1888,17 @@ BOOLEAN l2c_fcr_renegotiate_chan(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) BOOLEAN can_renegotiate; /* Skip if this is a reconfiguration from OPEN STATE or if FCR is not returned */ - if (!p_cfg->fcr_present || (p_ccb->config_done & RECONFIG_FLAG)) + if (!p_cfg->fcr_present || (p_ccb->config_done & RECONFIG_FLAG)) { return (FALSE); + } /* Only retry if there are more channel options to try */ - if (p_cfg->result == L2CAP_CFG_UNACCEPTABLE_PARAMS) - { + if (p_cfg->result == L2CAP_CFG_UNACCEPTABLE_PARAMS) { peer_mode = (p_cfg->fcr_present) ? p_cfg->fcr.mode : L2CAP_FCR_BASIC_MODE; - if (p_ccb->our_cfg.fcr.mode != peer_mode) - { + if (p_ccb->our_cfg.fcr.mode != peer_mode) { - if ((--p_ccb->fcr_cfg_tries) == 0) - { + if ((--p_ccb->fcr_cfg_tries) == 0) { p_cfg->result = L2CAP_CFG_FAILED_NO_REASON; L2CAP_TRACE_WARNING ("l2c_fcr_renegotiate_chan (Max retries exceeded)"); } @@ -2054,48 +1906,40 @@ BOOLEAN l2c_fcr_renegotiate_chan(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) can_renegotiate = FALSE; /* Try another supported mode if available based on our last attempted channel */ - switch (p_ccb->our_cfg.fcr.mode) - { - /* Our Streaming mode request was unnacceptable; try ERTM or Basic */ + switch (p_ccb->our_cfg.fcr.mode) { + /* Our Streaming mode request was unnacceptable; try ERTM or Basic */ case L2CAP_FCR_STREAM_MODE: /* Peer wants ERTM and we support it */ - if ( (peer_mode == L2CAP_FCR_ERTM_MODE) && (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) ) - { + if ( (peer_mode == L2CAP_FCR_ERTM_MODE) && (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) ) { L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying ERTM)"); p_ccb->our_cfg.fcr.mode = L2CAP_FCR_ERTM_MODE; can_renegotiate = TRUE; - } - else /* Falls through */ + } else /* Falls through */ - case L2CAP_FCR_ERTM_MODE: - { - /* We can try basic for any other peer mode if we support it */ - if (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC) - { - L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying Basic)"); - can_renegotiate = TRUE; - p_ccb->our_cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; - } + case L2CAP_FCR_ERTM_MODE: { + /* We can try basic for any other peer mode if we support it */ + if (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC) { + L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying Basic)"); + can_renegotiate = TRUE; + p_ccb->our_cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; } - break; + } + break; default: /* All other scenarios cannot be renegotiated */ break; } - if (can_renegotiate) - { + if (can_renegotiate) { p_ccb->our_cfg.fcr_present = TRUE; - if (p_ccb->our_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) - { + if (p_ccb->our_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) { p_ccb->our_cfg.fcs_present = FALSE; p_ccb->our_cfg.ext_flow_spec_present = FALSE; /* Basic Mode uses ACL Data Pool, make sure the MTU fits */ - if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) - { + if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) { L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu); p_cfg->mtu = L2CAP_MTU_SIZE; } @@ -2110,10 +1954,9 @@ BOOLEAN l2c_fcr_renegotiate_chan(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) } /* Disconnect if the channels do not match */ - if (p_ccb->our_cfg.fcr.mode != peer_mode) - { + if (p_ccb->our_cfg.fcr.mode != peer_mode) { L2CAP_TRACE_WARNING ("L2C CFG: Channels incompatible (local %d, peer %d)", - p_ccb->our_cfg.fcr.mode, peer_mode); + p_ccb->our_cfg.fcr.mode, peer_mode); l2cu_disconnect_chnl (p_ccb); } @@ -2143,28 +1986,26 @@ UINT8 l2c_fcr_process_peer_cfg_req(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) p_ccb->p_lcb->w4_info_rsp = FALSE; /* Handles T61x SonyEricsson Bug in Info Request */ L2CAP_TRACE_EVENT ("l2c_fcr_process_peer_cfg_req() CFG fcr_present:%d fcr.mode:%d CCB FCR mode:%d preferred: %u allowed:%u", - p_cfg->fcr_present, p_cfg->fcr.mode, p_ccb->our_cfg.fcr.mode, p_ccb->ertm_info.preferred_mode, - p_ccb->ertm_info.allowed_modes); + p_cfg->fcr_present, p_cfg->fcr.mode, p_ccb->our_cfg.fcr.mode, p_ccb->ertm_info.preferred_mode, + p_ccb->ertm_info.allowed_modes); /* If Peer wants basic, we are done (accept it or disconnect) */ - if (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE) - { + if (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE) { /* If we do not allow basic, disconnect */ - if ( !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC) ) + if ( !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC) ) { fcr_ok = L2CAP_PEER_CFG_DISCONNECT; + } } /* Need to negotiate if our modes are not the same */ - else if (p_cfg->fcr.mode != p_ccb->ertm_info.preferred_mode) - { + else if (p_cfg->fcr.mode != p_ccb->ertm_info.preferred_mode) { /* If peer wants a mode that we don't support then retry our mode (ex. rtx/flc), OR ** If we want ERTM and they wanted streaming retry our mode. ** Note: If we have already determined they support our mode previously ** from their EXF mask. */ if ( (((1 << p_cfg->fcr.mode) & L2CAP_FCR_CHAN_OPT_ALL_MASK) == 0) - || (p_ccb->ertm_info.preferred_mode == L2CAP_FCR_ERTM_MODE) ) - { + || (p_ccb->ertm_info.preferred_mode == L2CAP_FCR_ERTM_MODE) ) { p_cfg->fcr.mode = p_ccb->our_cfg.fcr.mode; p_cfg->fcr.tx_win_sz = p_ccb->our_cfg.fcr.tx_win_sz; p_cfg->fcr.max_transmit = p_ccb->our_cfg.fcr.max_transmit; @@ -2172,8 +2013,7 @@ UINT8 l2c_fcr_process_peer_cfg_req(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) } /* If we wanted basic, then try to renegotiate it */ - else if (p_ccb->ertm_info.preferred_mode == L2CAP_FCR_BASIC_MODE) - { + else if (p_ccb->ertm_info.preferred_mode == L2CAP_FCR_BASIC_MODE) { p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE; p_cfg->fcr.max_transmit = p_cfg->fcr.tx_win_sz = 0; p_cfg->fcr.rtrans_tout = p_cfg->fcr.mon_tout = p_cfg->fcr.mps = 0; @@ -2184,51 +2024,45 @@ UINT8 l2c_fcr_process_peer_cfg_req(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) /* Only other valid case is if they want ERTM and we wanted STM which should be accepted if we support it; otherwise the channel should be disconnected */ else if ( (p_cfg->fcr.mode != L2CAP_FCR_ERTM_MODE) - || !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) ) - { + || !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) ) { fcr_ok = L2CAP_PEER_CFG_DISCONNECT; } } /* Configuration for FCR channels so make any adjustments and fwd to upper layer */ - if (fcr_ok == L2CAP_PEER_CFG_OK) - { + if (fcr_ok == L2CAP_PEER_CFG_OK) { /* by default don't need to send params in the response */ p_ccb->out_cfg_fcr_present = FALSE; /* Make any needed adjustments for the response to the peer */ - if (p_cfg->fcr_present && p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE) - { + if (p_cfg->fcr_present && p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE) { /* Peer desires to bypass FCS check, and streaming or ERTM mode */ - if (p_cfg->fcs_present) - { + if (p_cfg->fcs_present) { p_ccb->peer_cfg.fcs = p_cfg->fcs; p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FCS; - if( p_cfg->fcs == L2CAP_CFG_FCS_BYPASS) + if ( p_cfg->fcs == L2CAP_CFG_FCS_BYPASS) { p_ccb->bypass_fcs |= L2CAP_CFG_FCS_PEER; + } } max_retrans_size = GKI_get_pool_bufsize (p_ccb->ertm_info.fcr_tx_pool_id) - sizeof(BT_HDR) - - L2CAP_MIN_OFFSET - L2CAP_SDU_LEN_OFFSET - L2CAP_FCS_LEN; + - L2CAP_MIN_OFFSET - L2CAP_SDU_LEN_OFFSET - L2CAP_FCS_LEN; /* Ensure the MPS is not bigger than the MTU */ - if ( (p_cfg->fcr.mps == 0) || (p_cfg->fcr.mps > p_ccb->peer_cfg.mtu) ) - { + if ( (p_cfg->fcr.mps == 0) || (p_cfg->fcr.mps > p_ccb->peer_cfg.mtu) ) { p_cfg->fcr.mps = p_ccb->peer_cfg.mtu; p_ccb->out_cfg_fcr_present = TRUE; } /* Ensure the MPS is not bigger than our retransmission buffer */ - if (p_cfg->fcr.mps > max_retrans_size) - { + if (p_cfg->fcr.mps > max_retrans_size) { L2CAP_TRACE_DEBUG("CFG: Overriding MPS to %d (orig %d)", max_retrans_size, p_cfg->fcr.mps); p_cfg->fcr.mps = max_retrans_size; p_ccb->out_cfg_fcr_present = TRUE; } - if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE || p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE) - { + if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE || p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE) { /* Always respond with FCR ERTM parameters */ p_ccb->out_cfg_fcr_present = TRUE; } @@ -2237,16 +2071,16 @@ UINT8 l2c_fcr_process_peer_cfg_req(tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) /* Everything ok, so save the peer's adjusted fcr options */ p_ccb->peer_cfg.fcr = p_cfg->fcr; - if (p_cfg->fcr_present) + if (p_cfg->fcr_present) { p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FCR; - } - else if (fcr_ok == L2CAP_PEER_CFG_UNACCEPTABLE) - { + } + } else if (fcr_ok == L2CAP_PEER_CFG_UNACCEPTABLE) { /* Allow peer only one retry for mode */ - if (p_ccb->peer_cfg_already_rejected) + if (p_ccb->peer_cfg_already_rejected) { fcr_ok = L2CAP_PEER_CFG_DISCONNECT; - else + } else { p_ccb->peer_cfg_already_rejected = TRUE; + } } return (fcr_ok); @@ -2279,25 +2113,24 @@ static void l2c_fcr_collect_ack_delay (tL2C_CCB *p_ccb, UINT8 num_bufs_acked) /* update sum, max and min of waiting for ack queue size */ p_ccb->fcrb.ack_q_count_avg[index] += p_ccb->fcrb.waiting_for_ack_q.count; - if ( p_ccb->fcrb.waiting_for_ack_q.count > p_ccb->fcrb.ack_q_count_max[index] ) + if ( p_ccb->fcrb.waiting_for_ack_q.count > p_ccb->fcrb.ack_q_count_max[index] ) { p_ccb->fcrb.ack_q_count_max[index] = p_ccb->fcrb.waiting_for_ack_q.count; + } - if ( p_ccb->fcrb.waiting_for_ack_q.count < p_ccb->fcrb.ack_q_count_min[index] ) + if ( p_ccb->fcrb.waiting_for_ack_q.count < p_ccb->fcrb.ack_q_count_min[index] ) { p_ccb->fcrb.ack_q_count_min[index] = p_ccb->fcrb.waiting_for_ack_q.count; + } /* update sum, max and min of round trip delay of acking */ p_buf = (BT_HDR *)(p_ccb->fcrb.waiting_for_ack_q.p_first); - for (xx = 0; (xx < num_bufs_acked)&&(p_buf); xx++) - { + for (xx = 0; (xx < num_bufs_acked) && (p_buf); xx++) { /* adding up length of acked I-frames to get throughput */ p_ccb->fcrb.throughput[index] += p_buf->len - 8; - if ( xx == num_bufs_acked - 1 ) - { + if ( xx == num_bufs_acked - 1 ) { /* get timestamp from tx I-frame that receiver is acking */ - p = ((UINT8 *) (p_buf+1)) + p_buf->offset + p_buf->len; - if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) - { + p = ((UINT8 *) (p_buf + 1)) + p_buf->offset + p_buf->len; + if (p_ccb->bypass_fcs != L2CAP_BYPASS_FCS) { p += L2CAP_FCS_LEN; } @@ -2305,10 +2138,12 @@ static void l2c_fcr_collect_ack_delay (tL2C_CCB *p_ccb, UINT8 num_bufs_acked) delay = GKI_get_os_tick_count() - timestamp; p_ccb->fcrb.ack_delay_avg[index] += delay; - if ( delay > p_ccb->fcrb.ack_delay_max[index] ) + if ( delay > p_ccb->fcrb.ack_delay_max[index] ) { p_ccb->fcrb.ack_delay_max[index] = delay; - if ( delay < p_ccb->fcrb.ack_delay_min[index] ) + } + if ( delay < p_ccb->fcrb.ack_delay_min[index] ) { p_ccb->fcrb.ack_delay_min[index] = delay; + } } p_buf = GKI_getnext(p_buf); @@ -2317,8 +2152,7 @@ static void l2c_fcr_collect_ack_delay (tL2C_CCB *p_ccb, UINT8 num_bufs_acked) p_ccb->fcrb.ack_delay_avg_count++; /* calculate average and initialize next avg, min and max */ - if (p_ccb->fcrb.ack_delay_avg_count > L2CAP_ERTM_STATS_AVG_NUM_SAMPLES) - { + if (p_ccb->fcrb.ack_delay_avg_count > L2CAP_ERTM_STATS_AVG_NUM_SAMPLES) { p_ccb->fcrb.ack_delay_avg_count = 0; p_ccb->fcrb.ack_q_count_avg[index] /= L2CAP_ERTM_STATS_AVG_NUM_SAMPLES; @@ -2326,8 +2160,9 @@ static void l2c_fcr_collect_ack_delay (tL2C_CCB *p_ccb, UINT8 num_bufs_acked) /* calculate throughput */ timestamp = GKI_get_os_tick_count(); - if (timestamp - p_ccb->fcrb.throughput_start > 0 ) + if (timestamp - p_ccb->fcrb.throughput_start > 0 ) { p_ccb->fcrb.throughput[index] /= (timestamp - p_ccb->fcrb.throughput_start); + } p_ccb->fcrb.throughput_start = timestamp; diff --git a/components/bt/bluedroid/stack/l2cap/l2c_link.c b/components/bt/bluedroid/stack/l2cap/l2c_link.c old mode 100755 new mode 100644 index 9cf80c3ea..e97b13ec8 --- a/components/bt/bluedroid/stack/l2cap/l2c_link.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_link.c @@ -64,11 +64,9 @@ BOOLEAN l2c_link_hci_conn_req (BD_ADDR bd_addr) p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR); /* If we don't have one, create one and accept the connection. */ - if (!p_lcb) - { + if (!p_lcb) { p_lcb = l2cu_allocate_lcb (bd_addr, FALSE, BT_TRANSPORT_BR_EDR); - if (!p_lcb) - { + if (!p_lcb) { btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_RESOURCES); L2CAP_TRACE_ERROR ("L2CAP failed to allocate LCB"); return FALSE; @@ -77,25 +75,24 @@ BOOLEAN l2c_link_hci_conn_req (BD_ADDR bd_addr) no_links = TRUE; /* If we already have connection, accept as a master */ - for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++) - { - if (p_lcb_cur == p_lcb) + for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++) { + if (p_lcb_cur == p_lcb) { continue; + } - if (p_lcb_cur->in_use) - { + if (p_lcb_cur->in_use) { no_links = FALSE; p_lcb->link_role = HCI_ROLE_MASTER; break; } } - if (no_links) - { - if (!btm_dev_support_switch (bd_addr)) + if (no_links) { + if (!btm_dev_support_switch (bd_addr)) { p_lcb->link_role = HCI_ROLE_SLAVE; - else + } else { p_lcb->link_role = l2cu_get_conn_role(p_lcb); + } } //counter_add("l2cap.conn.accept", 1); @@ -111,31 +108,27 @@ BOOLEAN l2c_link_hci_conn_req (BD_ADDR bd_addr) } /* We already had a link control block to the guy. Check what state it is in */ - if ((p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_CONNECT_HOLDING)) - { + if ((p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_CONNECT_HOLDING)) { /* Connection collision. Accept the connection anyways. */ - if (!btm_dev_support_switch (bd_addr)) + if (!btm_dev_support_switch (bd_addr)) { p_lcb->link_role = HCI_ROLE_SLAVE; - else + } else { p_lcb->link_role = l2cu_get_conn_role(p_lcb); + } //counter_add("l2cap.conn.accept", 1); btsnd_hcic_accept_conn (bd_addr, p_lcb->link_role); p_lcb->link_state = LST_CONNECTING; return (TRUE); - } - else if (p_lcb->link_state == LST_DISCONNECTING) - { + } else if (p_lcb->link_state == LST_DISCONNECTING) { /* In disconnecting state, reject the connection. */ //counter_add("l2cap.conn.reject.disconn", 1); btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_DEVICE); - } - else - { + } else { L2CAP_TRACE_ERROR("L2CAP got conn_req while connected (state:%d). Reject it\n", - p_lcb->link_state); + p_lcb->link_state); /* Reject the connection with ACL Connection Already exist reason */ //counter_add("l2cap.conn.reject.exists", 1); btsnd_hcic_reject_conn (bd_addr, HCI_ERR_CONNECTION_EXISTS); @@ -170,18 +163,17 @@ BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda) p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr, BT_TRANSPORT_BR_EDR); /* If we don't have one, this is an error */ - if (!p_lcb) - { + if (!p_lcb) { L2CAP_TRACE_WARNING ("L2CAP got conn_comp for unknown BD_ADDR\n"); return (FALSE); } - if (p_lcb->link_state != LST_CONNECTING) - { + if (p_lcb->link_state != LST_CONNECTING) { L2CAP_TRACE_ERROR ("L2CAP got conn_comp in bad state: %d status: 0x%d\n", p_lcb->link_state, status); - if (status != HCI_SUCCESS) + if (status != HCI_SUCCESS) { l2c_link_hci_disc_comp (p_lcb->handle, status); + } return (FALSE); } @@ -189,8 +181,7 @@ BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda) /* Save the handle */ p_lcb->handle = handle; - if (ci.status == HCI_SUCCESS) - { + if (ci.status == HCI_SUCCESS) { /* Connected OK. Change state to connected */ p_lcb->link_state = LST_CONNECTED; //counter_add("l2cap.conn.ok", 1); @@ -203,16 +194,17 @@ BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda) btm_acl_created (ci.bd_addr, p_dev_info->dev_class, p_dev_info->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_BR_EDR); - else + else { btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, BT_TRANSPORT_BR_EDR); + } BTM_SetLinkSuperTout (ci.bd_addr, btm_cb.btm_def_link_super_tout); /* If dedicated bonding do not process any further */ - if (p_lcb->is_bonding) - { - if (l2cu_start_post_bond_timer(handle)) + if (p_lcb->is_bonding) { + if (l2cu_start_post_bond_timer(handle)) { return (TRUE); + } } /* Update the timeouts in the hold queue */ @@ -221,37 +213,29 @@ BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda) btu_stop_timer (&p_lcb->timer_entry); /* For all channels, send the event through their FSMs */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { l2c_csm_execute (p_ccb, L2CEVT_LP_CONNECT_CFM, &ci); } - if (p_lcb->p_echo_rsp_cb) - { + if (p_lcb->p_echo_rsp_cb) { l2cu_send_peer_echo_req (p_lcb, NULL, 0); btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_ECHO_RSP_TOUT); - } - else if (!p_lcb->ccb_queue.p_first_ccb) - { + } else if (!p_lcb->ccb_queue.p_first_ccb) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_STARTUP_TOUT); } } /* Max number of acl connections. */ /* If there's an lcb disconnecting set this one to holding */ - else if ((ci.status == HCI_ERR_MAX_NUM_OF_CONNECTIONS) && l2cu_lcb_disconnecting()) - { + else if ((ci.status == HCI_ERR_MAX_NUM_OF_CONNECTIONS) && l2cu_lcb_disconnecting()) { p_lcb->link_state = LST_CONNECT_HOLDING; p_lcb->handle = HCI_INVALID_HANDLE; - } - else - { + } else { /* Just in case app decides to try again in the callback context */ p_lcb->link_state = LST_DISCONNECTING; /* Connection failed. For all channels, send the event through */ /* their FSMs. The CCBs should remove themselves from the LCB */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) { tL2C_CCB *pn = p_ccb->p_next_ccb; l2c_csm_execute (p_ccb, L2CEVT_LP_CONNECT_CFM_NEG, &ci); @@ -261,17 +245,13 @@ BOOLEAN l2c_link_hci_conn_comp (UINT8 status, UINT16 handle, BD_ADDR p_bda) p_lcb->disc_reason = status; /* Release the LCB */ - if (p_lcb->ccb_queue.p_first_ccb == NULL) + if (p_lcb->ccb_queue.p_first_ccb == NULL) { l2cu_release_lcb (p_lcb); - else /* there are any CCBs remaining */ - { - if (ci.status == HCI_ERR_CONNECTION_EXISTS) - { + } else { /* there are any CCBs remaining */ + if (ci.status == HCI_ERR_CONNECTION_EXISTS) { /* we are in collision situation, wait for connecttion request from controller */ p_lcb->link_state = LST_CONNECTING; - } - else - { + } else { l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR); } } @@ -302,8 +282,9 @@ void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data L2CAP_TRACE_DEBUG ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data); - if (status == BTM_SUCCESS_NO_SECURITY) + if (status == BTM_SUCCESS_NO_SECURITY) { status = BTM_SUCCESS; + } /* Save the parameters */ ci.status = status; @@ -312,21 +293,17 @@ void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR); /* If we don't have one, this is an error */ - if (!p_lcb) - { + if (!p_lcb) { L2CAP_TRACE_WARNING ("L2CAP got sec_comp for unknown BD_ADDR\n"); return; } /* Match p_ccb with p_ref_data returned by sec manager */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) { p_next_ccb = p_ccb->p_next_ccb; - if (p_ccb == p_ref_data) - { - switch(status) - { + if (p_ccb == p_ref_data) { + switch (status) { case BTM_SUCCESS: L2CAP_TRACE_DEBUG ("ccb timer ticks: %u", p_ccb->timer_entry.ticks); event = L2CEVT_SEC_COMP; @@ -369,16 +346,14 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) p_lcb = l2cu_find_lcb_by_handle (handle); /* If we don't have one, maybe an SCO link. Send to MM */ - if (!p_lcb) - { + if (!p_lcb) { status = FALSE; - } - else - { + } else { /* There can be a case when we rejected PIN code authentication */ /* otherwise save a new reason */ - if (btm_cb.acl_disc_reason != HCI_ERR_HOST_REJECT_SECURITY) + if (btm_cb.acl_disc_reason != HCI_ERR_HOST_REJECT_SECURITY) { btm_cb.acl_disc_reason = reason; + } p_lcb->disc_reason = btm_cb.acl_disc_reason; @@ -387,13 +362,13 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) #if (BLE_INCLUDED == TRUE) /* Check for BLE and handle that differently */ - if (p_lcb->transport == BT_TRANSPORT_LE) + if (p_lcb->transport == BT_TRANSPORT_LE) { btm_ble_update_link_topology_mask(p_lcb->link_role, FALSE); + } #endif /* Link is disconnected. For all channels, send the event through */ /* their FSMs. The CCBs should remove themselves from the LCB */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) { tL2C_CCB *pn = p_ccb->p_next_ccb; /* Keep connect pending control block (if exists) @@ -402,8 +377,7 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) * ccb will be automatically retried after link disconnect * arrives */ - if (p_ccb != p_lcb->p_pending_ccb) - { + if (p_ccb != p_lcb->p_pending_ccb) { l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, &reason); } p_ccb = pn; @@ -421,64 +395,59 @@ BOOLEAN l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason) race condition where layer above issued connect request on link that was disconnecting */ - if (p_lcb->ccb_queue.p_first_ccb != NULL || p_lcb->p_pending_ccb) - { + if (p_lcb->ccb_queue.p_first_ccb != NULL || p_lcb->p_pending_ccb) { L2CAP_TRACE_DEBUG("l2c_link_hci_disc_comp: Restarting pending ACL request"); transport = p_lcb->transport; #if BLE_INCLUDED == TRUE /* for LE link, always drop and re-open to ensure to get LE remote feature */ - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.is_ble_connecting = FALSE; btm_acl_removed (p_lcb->remote_bd_addr, p_lcb->transport); /* Release any held buffers */ BT_HDR *p_buf; - while (!list_is_empty(p_lcb->link_xmit_data_q)) - { + while (!list_is_empty(p_lcb->link_xmit_data_q)) { p_buf = list_front(p_lcb->link_xmit_data_q); list_remove(p_lcb->link_xmit_data_q, p_buf); GKI_freebuf(p_buf); } - } - else + } else #endif - { - #if (L2CAP_NUM_FIXED_CHNLS > 0) - /* If we are going to re-use the LCB without dropping it, release all fixed channels - here */ - int xx; - for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - { - if (p_lcb->p_fixed_ccbs[xx] && p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb) - { + { +#if (L2CAP_NUM_FIXED_CHNLS > 0) + /* If we are going to re-use the LCB without dropping it, release all fixed channels + here */ + int xx; + for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) { + if (p_lcb->p_fixed_ccbs[xx] && p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb) { #if BLE_INCLUDED == TRUE - (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, - p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); + (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, + p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); #else - (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, - p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR); + (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, + p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR); #endif - l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]); + l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]); - p_lcb->p_fixed_ccbs[xx] = NULL; - } - } + p_lcb->p_fixed_ccbs[xx] = NULL; + } + } #endif - } - if (l2cu_create_conn(p_lcb, transport)) - lcb_is_free = FALSE; /* still using this lcb */ + } + if (l2cu_create_conn(p_lcb, transport)) { + lcb_is_free = FALSE; /* still using this lcb */ + } } p_lcb->p_pending_ccb = NULL; /* Release the LCB */ - if (lcb_is_free) + if (lcb_is_free) { l2cu_release_lcb (p_lcb); + } } /* Now that we have a free acl connection, see if any lcbs are pending */ - if (lcb_is_free && ((p_lcb = l2cu_find_lcb_by_state(LST_CONNECT_HOLDING)) != NULL)) - { + if (lcb_is_free && ((p_lcb = l2cu_find_lcb_by_state(LST_CONNECT_HOLDING)) != NULL)) { /* we found one-- create a connection */ l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR); } @@ -506,14 +475,15 @@ BOOLEAN l2c_link_hci_qos_violation (UINT16 handle) p_lcb = l2cu_find_lcb_by_handle (handle); /* If we don't have one, maybe an SCO link. */ - if (!p_lcb) + if (!p_lcb) { return (FALSE); + } /* For all channels, tell the upper layer about it */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { - if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb) + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { + if (p_ccb->p_rcb->api.pL2CA_QoSViolationInd_Cb) { l2c_csm_execute (p_ccb, L2CEVT_LP_QOS_VIOLATION_IND, NULL); + } } return (TRUE); @@ -536,21 +506,19 @@ void l2c_link_timeout (tL2C_LCB *p_lcb) UINT16 timeout; tBTM_STATUS rc; - L2CAP_TRACE_EVENT ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d", - p_lcb->link_state, p_lcb->ccb_queue.p_first_ccb, p_lcb->is_bonding); + L2CAP_TRACE_EVENT ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d", + p_lcb->link_state, p_lcb->ccb_queue.p_first_ccb, p_lcb->is_bonding); /* If link was connecting or disconnecting, clear all channels and drop the LCB */ if ((p_lcb->link_state == LST_CONNECTING_WAIT_SWITCH) || - (p_lcb->link_state == LST_CONNECTING) || - (p_lcb->link_state == LST_CONNECT_HOLDING) || - (p_lcb->link_state == LST_DISCONNECTING)) - { + (p_lcb->link_state == LST_CONNECTING) || + (p_lcb->link_state == LST_CONNECT_HOLDING) || + (p_lcb->link_state == LST_DISCONNECTING)) { p_lcb->p_pending_ccb = NULL; /* For all channels, send a disconnect indication event through */ /* their FSMs. The CCBs should remove themselves from the LCB */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) { tL2C_CCB *pn = p_ccb->p_next_ccb; l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, NULL); @@ -559,8 +527,7 @@ void l2c_link_timeout (tL2C_LCB *p_lcb) } #if (BLE_INCLUDED == TRUE) if (p_lcb->link_state == LST_CONNECTING && - l2cb.is_ble_connecting == TRUE) - { + l2cb.is_ble_connecting == TRUE) { L2CA_CancelBleConnectReq(l2cb.ble_connecting_bda); } #endif @@ -569,11 +536,9 @@ void l2c_link_timeout (tL2C_LCB *p_lcb) } /* If link is connected, check for inactivity timeout */ - if (p_lcb->link_state == LST_CONNECTED) - { + if (p_lcb->link_state == LST_CONNECTED) { /* Check for ping outstanding */ - if (p_lcb->p_echo_rsp_cb) - { + if (p_lcb->p_echo_rsp_cb) { tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb; /* Zero out the callback in case app immediately calls us again */ @@ -581,12 +546,11 @@ void l2c_link_timeout (tL2C_LCB *p_lcb) (*p_cb) (L2CAP_PING_RESULT_NO_RESP); - L2CAP_TRACE_WARNING ("L2CAP - ping timeout"); + L2CAP_TRACE_WARNING ("L2CAP - ping timeout"); /* For all channels, send a disconnect indication event through */ /* their FSMs. The CCBs should remove themselves from the LCB */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; ) { tL2C_CCB *pn = p_ccb->p_next_ccb; l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, NULL); @@ -596,52 +560,37 @@ void l2c_link_timeout (tL2C_LCB *p_lcb) } /* If no channels in use, drop the link. */ - if (!p_lcb->ccb_queue.p_first_ccb) - { + if (!p_lcb->ccb_queue.p_first_ccb) { rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER); - if (rc == BTM_CMD_STORED) - { + if (rc == BTM_CMD_STORED) { /* Security Manager will take care of disconnecting, state will be updated at that time */ timeout = 0xFFFF; - } - else if (rc == BTM_CMD_STARTED) - { + } else if (rc == BTM_CMD_STARTED) { p_lcb->link_state = LST_DISCONNECTING; timeout = L2CAP_LINK_DISCONNECT_TOUT; - } - else if (rc == BTM_SUCCESS) - { + } else if (rc == BTM_SUCCESS) { l2cu_process_fixed_disc_cback(p_lcb); /* BTM SEC will make sure that link is release (probably after pairing is done) */ p_lcb->link_state = LST_DISCONNECTING; timeout = 0xFFFF; - } - else if (rc == BTM_BUSY) - { + } else if (rc == BTM_BUSY) { /* BTM is still executing security process. Let lcb stay as connected */ timeout = 0xFFFF; - } - else if ((p_lcb->is_bonding) - && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER))) - { + } else if ((p_lcb->is_bonding) + && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER))) { l2cu_process_fixed_disc_cback(p_lcb); p_lcb->link_state = LST_DISCONNECTING; timeout = L2CAP_LINK_DISCONNECT_TOUT; - } - else - { + } else { /* probably no buffer to send disconnect */ timeout = BT_1SEC_TIMEOUT; } - if (timeout != 0xFFFF) - { + if (timeout != 0xFFFF) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout); } - } - else - { + } else { /* Check in case we were flow controlled */ l2c_link_check_send_pkts (p_lcb, NULL, NULL); } @@ -663,13 +612,10 @@ void l2c_info_timeout (tL2C_LCB *p_lcb) tL2C_CONN_INFO ci; /* If we timed out waiting for info response, just continue using basic if allowed */ - if (p_lcb->w4_info_rsp) - { + if (p_lcb->w4_info_rsp) { /* If waiting for security complete, restart the info response timer */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { - if ( (p_ccb->chnl_state == CST_ORIG_W4_SEC_COMP) || (p_ccb->chnl_state == CST_TERM_W4_SEC_COMP) ) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { + if ( (p_ccb->chnl_state == CST_ORIG_W4_SEC_COMP) || (p_ccb->chnl_state == CST_TERM_W4_SEC_COMP) ) { btu_start_timer (&p_lcb->info_timer_entry, BTU_TTYPE_L2CAP_INFO, L2CAP_WAIT_INFO_RSP_TOUT); return; } @@ -679,16 +625,13 @@ void l2c_info_timeout (tL2C_LCB *p_lcb) /* If link is in process of being brought up */ if ((p_lcb->link_state != LST_DISCONNECTED) && - (p_lcb->link_state != LST_DISCONNECTING)) - { + (p_lcb->link_state != LST_DISCONNECTING)) { /* Notify active channels that peer info is finished */ - if (p_lcb->ccb_queue.p_first_ccb) - { + if (p_lcb->ccb_queue.p_first_ccb) { ci.status = HCI_SUCCESS; memcpy (ci.bd_addr, p_lcb->remote_bd_addr, sizeof(BD_ADDR)); - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_INFO_RSP, &ci); } } @@ -722,29 +665,28 @@ void l2c_link_adjust_allocation (void) UINT16 high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A; /* If no links active, reset buffer quotas and controller buffers */ - if (l2cb.num_links_active == 0) - { + if (l2cb.num_links_active == 0) { l2cb.controller_xmit_window = l2cb.num_lm_acl_bufs; l2cb.round_robin_quota = l2cb.round_robin_unacked = 0; return; } /* First, count the links */ - for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) - { - if (p_lcb->in_use) - { - if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) + for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) { + if (p_lcb->in_use) { + if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) { num_hipri_links++; - else + } else { num_lowpri_links++; + } } } /* now adjust high priority link quota */ low_quota = num_lowpri_links ? 1 : 0; - while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) + while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) { high_pri_link_quota--; + } /* Work out the xmit quota and buffer quota high and low priorities */ hi_quota = num_hipri_links * high_pri_link_quota; @@ -753,69 +695,62 @@ void l2c_link_adjust_allocation (void) /* Work out and save the HCI xmit quota for each low priority link */ /* If each low priority link cannot have at least one buffer */ - if (num_lowpri_links > low_quota) - { + if (num_lowpri_links > low_quota) { l2cb.round_robin_quota = low_quota; qq = qq_remainder = 1; } /* If each low priority link can have at least one buffer */ - else if (num_lowpri_links > 0) - { + else if (num_lowpri_links > 0) { l2cb.round_robin_quota = 0; l2cb.round_robin_unacked = 0; qq = low_quota / num_lowpri_links; qq_remainder = low_quota % num_lowpri_links; } /* If no low priority link */ - else - { + else { l2cb.round_robin_quota = 0; l2cb.round_robin_unacked = 0; qq = qq_remainder = 1; } L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u\n", - num_hipri_links, num_lowpri_links, low_quota, - l2cb.round_robin_quota, qq); + num_hipri_links, num_lowpri_links, low_quota, + l2cb.round_robin_quota, qq); /* Now, assign the quotas to each link */ - for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) - { - if (p_lcb->in_use) - { - if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) - { + for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) { + if (p_lcb->in_use) { + if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) { p_lcb->link_xmit_quota = high_pri_link_quota; - } - else - { + } else { /* Safety check in case we switched to round-robin with something outstanding */ /* if sent_not_acked is added into round_robin_unacked then don't add it again */ /* l2cap keeps updating sent_not_acked for exiting from round robin */ - if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 )) + if (( p_lcb->link_xmit_quota > 0 ) && ( qq == 0 )) { l2cb.round_robin_unacked += p_lcb->sent_not_acked; + } p_lcb->link_xmit_quota = qq; - if (qq_remainder > 0) - { + if (qq_remainder > 0) { p_lcb->link_xmit_quota++; qq_remainder--; } } L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d\n", - yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); + yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); L2CAP_TRACE_EVENT (" SentNotAcked: %d RRUnacked: %d\n", - p_lcb->sent_not_acked, l2cb.round_robin_unacked); + p_lcb->sent_not_acked, l2cb.round_robin_unacked); /* There is a special case where we have readjusted the link quotas and */ /* this link may have sent anything but some other link sent packets so */ /* so we may need a timer to kick off this link's transmissions. */ if ( (p_lcb->link_state == LST_CONNECTED) - && (!list_is_empty(p_lcb->link_xmit_data_q)) - && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) + && (!list_is_empty(p_lcb->link_xmit_data_q)) + && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT); + } } } @@ -847,41 +782,35 @@ void l2c_link_adjust_chnl_allocation (void) L2CAP_TRACE_DEBUG ("l2c_link_adjust_chnl_allocation"); /* initialize variables */ - for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ ) - { + for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ ) { weighted_chnls[xx] = 0; reserved_buff[xx] = 0; } /* add up all of tx and rx data rate requirement */ /* channel required higher data rate will get more buffer quota */ - for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++) - { + for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++) { p_ccb = l2cb.ccb_pool + xx; - if (!p_ccb->in_use) + if (!p_ccb->in_use) { continue; + } - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] += p_ccb->tx_data_rate; weighted_chnls[p_ccb->ertm_info.user_rx_pool_id] += p_ccb->rx_data_rate; - if (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) - { + if (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) { /* reserve buffers only for wait_for_ack_q to maximize throughput */ /* retrans_q will work based on buffer status */ reserved_buff[HCI_ACL_POOL_ID] += p_ccb->peer_cfg.fcr.tx_win_sz; } - if (p_ccb->ertm_info.fcr_rx_pool_id == HCI_ACL_POOL_ID) - { + if (p_ccb->ertm_info.fcr_rx_pool_id == HCI_ACL_POOL_ID) { /* reserve buffers for srej_rcv_hold_q */ reserved_buff[HCI_ACL_POOL_ID] += p_ccb->peer_cfg.fcr.tx_win_sz; } - } - else - { + } else { /* low data rate is 1, medium is 2, high is 3 and no traffic is 0 */ weighted_chnls[HCI_ACL_POOL_ID] += p_ccb->tx_data_rate + p_ccb->rx_data_rate; } @@ -889,47 +818,43 @@ void l2c_link_adjust_chnl_allocation (void) /* get unit quota per pool */ - for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ ) - { - if ( weighted_chnls[xx] > 0 ) - { - if (GKI_poolcount(xx) > reserved_buff[xx]) - quota_per_weighted_chnls[xx] = ((GKI_poolcount(xx) - reserved_buff[xx])/weighted_chnls[xx]) + 1; - else + for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ ) { + if ( weighted_chnls[xx] > 0 ) { + if (GKI_poolcount(xx) > reserved_buff[xx]) { + quota_per_weighted_chnls[xx] = ((GKI_poolcount(xx) - reserved_buff[xx]) / weighted_chnls[xx]) + 1; + } else { quota_per_weighted_chnls[xx] = 1; + } L2CAP_TRACE_DEBUG ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d", - xx, GKI_poolcount(xx), reserved_buff[xx], weighted_chnls[xx], quota_per_weighted_chnls[xx] ); - } - else + xx, GKI_poolcount(xx), reserved_buff[xx], weighted_chnls[xx], quota_per_weighted_chnls[xx] ); + } else { quota_per_weighted_chnls[xx] = 0; + } } /* assign buffer quota to each channel based on its data rate requirement */ - for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++) - { + for (xx = 0; xx < MAX_L2CAP_CHANNELS; xx++) { p_ccb = l2cb.ccb_pool + xx; - if (!p_ccb->in_use) + if (!p_ccb->in_use) { continue; + } - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { p_ccb->buff_quota = quota_per_weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] * p_ccb->tx_data_rate; L2CAP_TRACE_EVENT ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u", - p_ccb->local_cid, p_ccb->peer_cfg.fcr.mode, p_ccb->ertm_info.user_tx_pool_id, - p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota); + p_ccb->local_cid, p_ccb->peer_cfg.fcr.mode, p_ccb->ertm_info.user_tx_pool_id, + p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota); - } - else - { + } else { p_ccb->buff_quota = quota_per_weighted_chnls[HCI_ACL_POOL_ID] * p_ccb->tx_data_rate; L2CAP_TRACE_EVENT ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u", - p_ccb->local_cid, - p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota); + p_ccb->local_cid, + p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota); } /* quota may be change so check congestion */ @@ -992,25 +917,22 @@ void l2c_link_role_changed (BD_ADDR bd_addr, UINT8 new_role, UINT8 hci_status) int xx; /* Make sure not called from HCI Command Status (bd_addr and new_role are invalid) */ - if (bd_addr) - { + if (bd_addr) { /* If here came form hci role change event */ p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR); - if (p_lcb) - { + if (p_lcb) { p_lcb->link_role = new_role; /* Reset high priority link if needed */ - if (hci_status == HCI_SUCCESS) + if (hci_status == HCI_SUCCESS) { l2cu_set_acl_priority(bd_addr, p_lcb->acl_priority, TRUE); + } } } /* Check if any LCB was waiting for switch to be completed */ - for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTING_WAIT_SWITCH)) - { + for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTING_WAIT_SWITCH)) { l2cu_create_conn_after_switch (p_lcb); } } @@ -1033,8 +955,7 @@ void l2c_pin_code_request (BD_ADDR bd_addr) { tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR); - if ( (p_lcb) && (!p_lcb->ccb_queue.p_first_ccb) ) - { + if ( (p_lcb) && (!p_lcb->ccb_queue.p_first_ccb) ) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_CONNECT_TOUT_EXT); } } @@ -1059,28 +980,22 @@ BOOLEAN l2c_link_check_power_mode (tL2C_LCB *p_lcb) /* * We only switch park to active only if we have unsent packets */ - if (list_is_empty(p_lcb->link_xmit_data_q)) - { - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { - if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - { + if (list_is_empty(p_lcb->link_xmit_data_q)) { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { + if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { need_to_active = TRUE; break; } } - } - else + } else { need_to_active = TRUE; + } /* if we have packets to send */ - if ( need_to_active ) - { + if ( need_to_active ) { /* check power mode */ - if (BTM_ReadPowerMode(p_lcb->remote_bd_addr, &mode) == BTM_SUCCESS) - { - if ( mode == BTM_PM_STS_PENDING ) - { + if (BTM_ReadPowerMode(p_lcb->remote_bd_addr, &mode) == BTM_SUCCESS) { + if ( mode == BTM_PM_STS_PENDING ) { L2CAP_TRACE_DEBUG ("LCB(0x%x) is in PM pending state\n", p_lcb->handle); return TRUE; @@ -1108,25 +1023,22 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf) BOOLEAN single_write = FALSE; /* Save the channel ID for faster counting */ - if (p_buf) - { - if (p_ccb != NULL) - { + if (p_buf) { + if (p_ccb != NULL) { p_buf->event = p_ccb->local_cid; single_write = TRUE; - } - else + } else { p_buf->event = 0; + } p_buf->layer_specific = 0; list_append(p_lcb->link_xmit_data_q, p_buf); - if (p_lcb->link_xmit_quota == 0) - { + if (p_lcb->link_xmit_quota == 0) { #if BLE_INCLUDED == TRUE - if (p_lcb->transport == BT_TRANSPORT_LE) + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.ble_check_round_robin = TRUE; - else + } else #endif l2cb.check_round_robin = TRUE; } @@ -1135,133 +1047,137 @@ void l2c_link_check_send_pkts (tL2C_LCB *p_lcb, tL2C_CCB *p_ccb, BT_HDR *p_buf) /* If this is called from uncongested callback context break recursive calling. ** This LCB will be served when receiving number of completed packet event. */ - if (l2cb.is_cong_cback_context) + if (l2cb.is_cong_cback_context) { return; + } /* If we are in a scenario where there are not enough buffers for each link to ** have at least 1, then do a round-robin for all the LCBs */ - if ( (p_lcb == NULL) || (p_lcb->link_xmit_quota == 0) ) - { - if (p_lcb == NULL) + if ( (p_lcb == NULL) || (p_lcb->link_xmit_quota == 0) ) { + if (p_lcb == NULL) { p_lcb = l2cb.lcb_pool; - else if (!single_write) + } else if (!single_write) { p_lcb++; + } /* Loop through, starting at the next */ - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { /* If controller window is full, nothing to do */ if (((l2cb.controller_xmit_window == 0 || - (l2cb.round_robin_unacked >= l2cb.round_robin_quota)) + (l2cb.round_robin_unacked >= l2cb.round_robin_quota)) #if (BLE_INCLUDED == TRUE) - && (p_lcb->transport == BT_TRANSPORT_BR_EDR) + && (p_lcb->transport == BT_TRANSPORT_BR_EDR) ) - || (p_lcb->transport == BT_TRANSPORT_LE && - (l2cb.ble_round_robin_unacked >= l2cb.ble_round_robin_quota || - l2cb.controller_le_xmit_window == 0 ))) + || (p_lcb->transport == BT_TRANSPORT_LE && + (l2cb.ble_round_robin_unacked >= l2cb.ble_round_robin_quota || + l2cb.controller_le_xmit_window == 0 ))) #else )) #endif - break; + break; /* Check for wraparound */ - if (p_lcb == &l2cb.lcb_pool[MAX_L2CAP_LINKS]) + if (p_lcb == &l2cb.lcb_pool[MAX_L2CAP_LINKS]) { p_lcb = &l2cb.lcb_pool[0]; + } if ( (!p_lcb->in_use) - || (p_lcb->partial_segment_being_sent) - || (p_lcb->link_state != LST_CONNECTED) - || (p_lcb->link_xmit_quota != 0) - || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) ) + || (p_lcb->partial_segment_being_sent) + || (p_lcb->link_state != LST_CONNECTED) + || (p_lcb->link_xmit_quota != 0) + || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) ) { continue; + } /* See if we can send anything from the Link Queue */ if (!list_is_empty(p_lcb->link_xmit_data_q)) { p_buf = (BT_HDR *)list_front(p_lcb->link_xmit_data_q); list_remove(p_lcb->link_xmit_data_q, p_buf); l2c_link_send_to_lower (p_lcb, p_buf); - } - else if (single_write) - { + } else if (single_write) { /* If only doing one write, break out */ break; } /* If nothing on the link queue, check the channel queue */ - else if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) != NULL) - { + else if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) != NULL) { l2c_link_send_to_lower (p_lcb, p_buf); } } /* If we finished without using up our quota, no need for a safety check */ if ( (l2cb.controller_xmit_window > 0) - && (l2cb.round_robin_unacked < l2cb.round_robin_quota) + && (l2cb.round_robin_unacked < l2cb.round_robin_quota) #if (BLE_INCLUDED == TRUE) - && (p_lcb->transport == BT_TRANSPORT_BR_EDR) + && (p_lcb->transport == BT_TRANSPORT_BR_EDR) #endif - ) + ) { l2cb.check_round_robin = FALSE; + } #if (BLE_INCLUDED == TRUE) if ( (l2cb.controller_le_xmit_window > 0) - && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota) - && (p_lcb->transport == BT_TRANSPORT_LE)) + && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota) + && (p_lcb->transport == BT_TRANSPORT_LE)) { l2cb.ble_check_round_robin = FALSE; + } #endif - } - else /* if this is not round-robin service */ - { + } else { /* if this is not round-robin service */ /* If a partial segment is being sent, can't send anything else */ if ( (p_lcb->partial_segment_being_sent) - || (p_lcb->link_state != LST_CONNECTED) - || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) ) + || (p_lcb->link_state != LST_CONNECTED) + || (L2C_LINK_CHECK_POWER_MODE (p_lcb)) ) { return; + } /* See if we can send anything from the link queue */ #if (BLE_INCLUDED == TRUE) while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) || (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE))) - && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) + && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) #else while ( (l2cb.controller_xmit_window != 0) - && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) + && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) #endif { - if (list_is_empty(p_lcb->link_xmit_data_q)) + if (list_is_empty(p_lcb->link_xmit_data_q)) { break; + } p_buf = (BT_HDR *)list_front(p_lcb->link_xmit_data_q); list_remove(p_lcb->link_xmit_data_q, p_buf); - if (!l2c_link_send_to_lower (p_lcb, p_buf)) + if (!l2c_link_send_to_lower (p_lcb, p_buf)) { break; + } } - if (!single_write) - { + if (!single_write) { /* See if we can send anything for any channel */ #if (BLE_INCLUDED == TRUE) while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) || - (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE))) + (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE))) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) #else while ((l2cb.controller_xmit_window != 0) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota)) #endif { - if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) == NULL) + if ((p_buf = l2cu_get_next_buffer_to_send (p_lcb)) == NULL) { break; + } - if (!l2c_link_send_to_lower (p_lcb, p_buf)) + if (!l2c_link_send_to_lower (p_lcb, p_buf)) { break; + } } } /* There is a special case where we have readjusted the link quotas and */ /* this link may have sent anything but some other link sent packets so */ /* so we may need a timer to kick off this link's transmissions. */ - if ( (!list_is_empty(p_lcb->link_xmit_data_q)) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) + if ( (!list_is_empty(p_lcb->link_xmit_data_q)) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT); + } } } @@ -1283,19 +1199,17 @@ static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf) if ((p_buf->len <= controller->get_acl_packet_size_classic() #if (BLE_INCLUDED == TRUE) - && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) || - ((p_lcb->transport == BT_TRANSPORT_LE) && (p_buf->len <= controller->get_acl_packet_size_ble())) + && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) || + ((p_lcb->transport == BT_TRANSPORT_LE) && (p_buf->len <= controller->get_acl_packet_size_ble())) #else ) #endif - ) - { - if (p_lcb->link_xmit_quota == 0) - { + ) { + if (p_lcb->link_xmit_quota == 0) { #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.ble_round_robin_unacked++; - else + } else #endif l2cb.round_robin_unacked++; } @@ -1303,28 +1217,22 @@ static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf) p_buf->layer_specific = 0; #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.controller_le_xmit_window--; - bte_main_hci_send(p_buf, (UINT16)(BT_EVT_TO_LM_HCI_ACL|LOCAL_BLE_CONTROLLER_ID)); - } - else + bte_main_hci_send(p_buf, (UINT16)(BT_EVT_TO_LM_HCI_ACL | LOCAL_BLE_CONTROLLER_ID)); + } else #endif { l2cb.controller_xmit_window--; bte_main_hci_send(p_buf, BT_EVT_TO_LM_HCI_ACL); } - } - else - { + } else { #if BLE_INCLUDED == TRUE - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { acl_data_size = controller->get_acl_data_size_ble(); xmit_window = l2cb.controller_le_xmit_window; - } - else + } else #endif { acl_data_size = controller->get_acl_data_size_classic(); @@ -1334,22 +1242,17 @@ static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf) /* If doing round-robin, then only 1 segment each time */ - if (p_lcb->link_xmit_quota == 0) - { + if (p_lcb->link_xmit_quota == 0) { num_segs = 1; p_lcb->partial_segment_being_sent = TRUE; - } - else - { + } else { /* Multi-segment packet. Make sure it can fit */ - if (num_segs > xmit_window) - { + if (num_segs > xmit_window) { num_segs = xmit_window; p_lcb->partial_segment_being_sent = TRUE; } - if (num_segs > (p_lcb->link_xmit_quota - p_lcb->sent_not_acked)) - { + if (num_segs > (p_lcb->link_xmit_quota - p_lcb->sent_not_acked)) { num_segs = (p_lcb->link_xmit_quota - p_lcb->sent_not_acked); p_lcb->partial_segment_being_sent = TRUE; } @@ -1357,28 +1260,26 @@ static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf) p_buf->layer_specific = num_segs; #if BLE_INCLUDED == TRUE - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.controller_le_xmit_window -= num_segs; - if (p_lcb->link_xmit_quota == 0) + if (p_lcb->link_xmit_quota == 0) { l2cb.ble_round_robin_unacked += num_segs; - } - else + } + } else #endif { l2cb.controller_xmit_window -= num_segs; - if (p_lcb->link_xmit_quota == 0) + if (p_lcb->link_xmit_quota == 0) { l2cb.round_robin_unacked += num_segs; + } } p_lcb->sent_not_acked += num_segs; #if BLE_INCLUDED == TRUE - if (p_lcb->transport == BT_TRANSPORT_LE) - { - bte_main_hci_send(p_buf, (UINT16)(BT_EVT_TO_LM_HCI_ACL|LOCAL_BLE_CONTROLLER_ID)); - } - else + if (p_lcb->transport == BT_TRANSPORT_LE) { + bte_main_hci_send(p_buf, (UINT16)(BT_EVT_TO_LM_HCI_ACL | LOCAL_BLE_CONTROLLER_ID)); + } else #endif { bte_main_hci_send(p_buf, BT_EVT_TO_LM_HCI_ACL); @@ -1387,22 +1288,20 @@ static BOOLEAN l2c_link_send_to_lower (tL2C_LCB *p_lcb, BT_HDR *p_buf) #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE) #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d", - l2cb.controller_le_xmit_window, - p_lcb->handle, - p_lcb->link_xmit_quota, p_lcb->sent_not_acked, - l2cb.ble_round_robin_quota, l2cb.ble_round_robin_unacked); - } - else + l2cb.controller_le_xmit_window, + p_lcb->handle, + p_lcb->link_xmit_quota, p_lcb->sent_not_acked, + l2cb.ble_round_robin_quota, l2cb.ble_round_robin_unacked); + } else #endif { L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d", - l2cb.controller_xmit_window, - p_lcb->handle, - p_lcb->link_xmit_quota, p_lcb->sent_not_acked, - l2cb.round_robin_quota, l2cb.round_robin_unacked); + l2cb.controller_xmit_window, + p_lcb->handle, + p_lcb->link_xmit_quota, p_lcb->sent_not_acked, + l2cb.round_robin_quota, l2cb.round_robin_unacked); } #endif @@ -1429,8 +1328,7 @@ void l2c_link_process_num_completed_pkts (UINT8 *p) STREAM_TO_UINT8 (num_handles, p); - for (xx = 0; xx < num_handles; xx++) - { + for (xx = 0; xx < num_handles; xx++) { STREAM_TO_UINT16 (handle, p); STREAM_TO_UINT16 (num_sent, p); @@ -1438,106 +1336,97 @@ void l2c_link_process_num_completed_pkts (UINT8 *p) /* Callback for number of completed packet event */ /* Originally designed for [3DSG] */ - if((p_lcb != NULL) && (p_lcb->p_nocp_cb)) - { + if ((p_lcb != NULL) && (p_lcb->p_nocp_cb)) { L2CAP_TRACE_DEBUG ("L2CAP - calling NoCP callback"); (*p_lcb->p_nocp_cb)(p_lcb->remote_bd_addr); } - if (p_lcb) - { + if (p_lcb) { #if (BLE_INCLUDED == TRUE) - if (p_lcb && (p_lcb->transport == BT_TRANSPORT_LE)) - l2cb.controller_le_xmit_window += num_sent; - else + if (p_lcb && (p_lcb->transport == BT_TRANSPORT_LE)) { + l2cb.controller_le_xmit_window += num_sent; + } else #endif { /* Maintain the total window to the controller */ l2cb.controller_xmit_window += num_sent; } /* If doing round-robin, adjust communal counts */ - if (p_lcb->link_xmit_quota == 0) - { + if (p_lcb->link_xmit_quota == 0) { #if BLE_INCLUDED == TRUE - if (p_lcb->transport == BT_TRANSPORT_LE) - { - /* Don't go negative */ - if (l2cb.ble_round_robin_unacked > num_sent) + if (p_lcb->transport == BT_TRANSPORT_LE) { + /* Don't go negative */ + if (l2cb.ble_round_robin_unacked > num_sent) { l2cb.ble_round_robin_unacked -= num_sent; - else + } else { l2cb.ble_round_robin_unacked = 0; - } - else + } + } else #endif { /* Don't go negative */ - if (l2cb.round_robin_unacked > num_sent) + if (l2cb.round_robin_unacked > num_sent) { l2cb.round_robin_unacked -= num_sent; - else + } else { l2cb.round_robin_unacked = 0; + } } } /* Don't go negative */ - if (p_lcb->sent_not_acked > num_sent) + if (p_lcb->sent_not_acked > num_sent) { p_lcb->sent_not_acked -= num_sent; - else + } else { p_lcb->sent_not_acked = 0; + } l2c_link_check_send_pkts (p_lcb, NULL, NULL); /* If we were doing round-robin for low priority links, check 'em */ if ( (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) - && (l2cb.check_round_robin) - && (l2cb.round_robin_unacked < l2cb.round_robin_quota) ) - { - l2c_link_check_send_pkts (NULL, NULL, NULL); + && (l2cb.check_round_robin) + && (l2cb.round_robin_unacked < l2cb.round_robin_quota) ) { + l2c_link_check_send_pkts (NULL, NULL, NULL); } #if BLE_INCLUDED == TRUE if ((p_lcb->transport == BT_TRANSPORT_LE) - && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) - && ((l2cb.ble_check_round_robin) - && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota))) - { - l2c_link_check_send_pkts (NULL, NULL, NULL); + && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) + && ((l2cb.ble_check_round_robin) + && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota))) { + l2c_link_check_send_pkts (NULL, NULL, NULL); } #endif } #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE) - if (p_lcb) - { + if (p_lcb) { #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d\n", - l2cb.controller_le_xmit_window, - p_lcb->handle, p_lcb->sent_not_acked, - l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked); - } - else + l2cb.controller_le_xmit_window, + p_lcb->handle, p_lcb->sent_not_acked, + l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked); + } else #endif { L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d\n", - l2cb.controller_xmit_window, - p_lcb->handle, p_lcb->sent_not_acked, - l2cb.check_round_robin, l2cb.round_robin_unacked); + l2cb.controller_xmit_window, + p_lcb->handle, p_lcb->sent_not_acked, + l2cb.check_round_robin, l2cb.round_robin_unacked); } - } - else - { + } else { #if (BLE_INCLUDED == TRUE) L2CAP_TRACE_DEBUG ("TotalWin=%d LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d\n", - l2cb.controller_xmit_window, - l2cb.controller_le_xmit_window, - handle, - l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked); + l2cb.controller_xmit_window, + l2cb.controller_le_xmit_window, + handle, + l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked); #else L2CAP_TRACE_DEBUG ("TotalWin=%d Handle=0x%x RRCheck=%d RRUnack=%d\n", - l2cb.controller_xmit_window, - handle, - l2cb.check_round_robin, l2cb.round_robin_unacked); + l2cb.controller_xmit_window, + handle, + l2cb.check_round_robin, l2cb.round_robin_unacked); #endif } #endif @@ -1570,15 +1459,13 @@ void l2c_link_segments_xmitted (BT_HDR *p_msg) handle = HCID_GET_HANDLE (handle); /* Find the LCB based on the handle */ - if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - rcvd segment complete, unknown handle: %d\n", handle); GKI_freebuf (p_msg); return; } - if (p_lcb->link_state == LST_CONNECTED) - { + if (p_lcb->link_state == LST_CONNECTED) { /* Enqueue the buffer to the head of the transmit queue, and see */ /* if we can transmit anything more. */ list_prepend(p_lcb->link_xmit_data_q, p_msg); @@ -1586,7 +1473,7 @@ void l2c_link_segments_xmitted (BT_HDR *p_msg) p_lcb->partial_segment_being_sent = FALSE; l2c_link_check_send_pkts (p_lcb, NULL, NULL); - } - else + } else { GKI_freebuf (p_msg); + } } diff --git a/components/bt/bluedroid/stack/l2cap/l2c_main.c b/components/bt/bluedroid/stack/l2cap/l2c_main.c old mode 100755 new mode 100644 index d88723660..814bc9f85 --- a/components/bt/bluedroid/stack/l2cap/l2c_main.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_main.c @@ -64,8 +64,7 @@ void l2c_bcst_msg( BT_HDR *p_buf, UINT16 psm ) UINT8 *p; /* Ensure we have enough space in the buffer for the L2CAP and HCI headers */ - if (p_buf->offset < L2CAP_BCST_MIN_OFFSET) - { + if (p_buf->offset < L2CAP_BCST_MIN_OFFSET) { L2CAP_TRACE_ERROR ("L2CAP - cannot send buffer, offset: %d", p_buf->offset); GKI_freebuf (p_buf); return; @@ -83,12 +82,9 @@ void l2c_bcst_msg( BT_HDR *p_buf, UINT16 psm ) uint16_t acl_data_size = controller_get_interface()->get_acl_data_size_classic(); /* The HCI transport will segment the buffers. */ - if (p_buf->len > acl_data_size) - { + if (p_buf->len > acl_data_size) { UINT16_TO_STREAM (p, acl_data_size); - } - else - { + } else { UINT16_TO_STREAM (p, p_buf->len); } @@ -99,8 +95,7 @@ void l2c_bcst_msg( BT_HDR *p_buf, UINT16 psm ) p_buf->len += HCI_DATA_PREAMBLE_SIZE; - if (p_buf->len <= controller_get_interface()->get_acl_packet_size_classic()) - { + if (p_buf->len <= controller_get_interface()->get_acl_packet_size_classic()) { //counter_add("l2cap.ch2.tx.bytes", p_buf->len); //counter_add("l2cap.ch2.tx.pkts", 1); @@ -135,11 +130,9 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) /* Since the HCI Transport is putting segmented packets back together, we */ /* should never get a valid packet with the type set to "continuation" */ - if (pkt_type != L2CAP_PKT_CONTINUE) - { + if (pkt_type != L2CAP_PKT_CONTINUE) { /* Find the LCB based on the handle */ - if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL) { UINT8 cmd_code; /* There is a slight possibility (specifically with USB) that we get an */ @@ -153,26 +146,25 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) if ((p_msg->layer_specific == 0) && (rcv_cid == L2CAP_SIGNALLING_CID) && (cmd_code == L2CAP_CMD_INFO_REQ || cmd_code == L2CAP_CMD_CONN_REQ)) { L2CAP_TRACE_WARNING ("L2CAP - holding ACL for unknown handle:%d ls:%d" - " cid:%d opcode:%d cur count:%d", handle, p_msg->layer_specific, - rcv_cid, cmd_code, list_length(l2cb.rcv_pending_q)); + " cid:%d opcode:%d cur count:%d", handle, p_msg->layer_specific, + rcv_cid, cmd_code, list_length(l2cb.rcv_pending_q)); p_msg->layer_specific = 2; list_append(l2cb.rcv_pending_q, p_msg); - if (list_length(l2cb.rcv_pending_q) == 1) + if (list_length(l2cb.rcv_pending_q) == 1) { btu_start_timer (&l2cb.rcv_hold_tle, BTU_TTYPE_L2CAP_HOLD, BT_1SEC_TIMEOUT); + } return; } else { L2CAP_TRACE_ERROR ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d" - " opcode:%d cur count:%d", handle, p_msg->layer_specific, rcv_cid, - cmd_code, list_length(l2cb.rcv_pending_q)); + " opcode:%d cur count:%d", handle, p_msg->layer_specific, rcv_cid, + cmd_code, list_length(l2cb.rcv_pending_q)); } GKI_freebuf (p_msg); return; } - } - else - { + } else { L2CAP_TRACE_WARNING ("L2CAP - expected pkt start or complete, got: %d", pkt_type); GKI_freebuf (p_msg); return; @@ -187,54 +179,47 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) STREAM_TO_UINT16 (rcv_cid, p); #if BLE_INCLUDED == TRUE - /* for BLE channel, always notify connection when ACL data received on the link */ - if (p_lcb && p_lcb->transport == BT_TRANSPORT_LE && p_lcb->link_state != LST_DISCONNECTING) - /* only process fixed channel data as channel open indication when link is not in disconnecting mode */ - l2cble_notify_le_connection(p_lcb->remote_bd_addr); -#endif - L2CAP_TRACE_DEBUG ("L2CAP - rcv_cid CID: 0x%04x\n", rcv_cid); - /* Find the CCB for this CID */ - if (rcv_cid >= L2CAP_BASE_APPL_CID) + /* for BLE channel, always notify connection when ACL data received on the link */ + if (p_lcb && p_lcb->transport == BT_TRANSPORT_LE && p_lcb->link_state != LST_DISCONNECTING) + /* only process fixed channel data as channel open indication when link is not in disconnecting mode */ { - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, rcv_cid)) == NULL) - { + l2cble_notify_le_connection(p_lcb->remote_bd_addr); + } +#endif + L2CAP_TRACE_DEBUG ("L2CAP - rcv_cid CID: 0x%04x\n", rcv_cid); + /* Find the CCB for this CID */ + if (rcv_cid >= L2CAP_BASE_APPL_CID) { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, rcv_cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - unknown CID: 0x%04x", rcv_cid); GKI_freebuf (p_msg); return; } } - if (hci_len >= L2CAP_PKT_OVERHEAD) /* Must receive at least the L2CAP length and CID.*/ - { + if (hci_len >= L2CAP_PKT_OVERHEAD) { /* Must receive at least the L2CAP length and CID.*/ p_msg->len = hci_len - L2CAP_PKT_OVERHEAD; p_msg->offset += L2CAP_PKT_OVERHEAD; - } - else - { + } else { L2CAP_TRACE_WARNING ("L2CAP - got incorrect hci header" ); GKI_freebuf (p_msg); return; } - if (l2cap_len != p_msg->len) - { + if (l2cap_len != p_msg->len) { L2CAP_TRACE_WARNING ("L2CAP - bad length in pkt. Exp: %d Act: %d", - l2cap_len, p_msg->len); + l2cap_len, p_msg->len); GKI_freebuf (p_msg); return; } /* Send the data through the channel state machine */ - if (rcv_cid == L2CAP_SIGNALLING_CID) - { + if (rcv_cid == L2CAP_SIGNALLING_CID) { //counter_add("l2cap.sig.rx.bytes", l2cap_len); //counter_add("l2cap.sig.rx.pkts", 1); process_l2cap_cmd (p_lcb, p, l2cap_len); GKI_freebuf (p_msg); - } - else if (rcv_cid == L2CAP_CONNECTIONLESS_CID) - { + } else if (rcv_cid == L2CAP_CONNECTIONLESS_CID) { //counter_add("l2cap.ch2.rx.bytes", l2cap_len); //counter_add("l2cap.ch2.rx.pkts", 1); /* process_connectionless_data (p_lcb); */ @@ -243,17 +228,14 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) #if (L2CAP_UCD_INCLUDED == TRUE) /* if it is not broadcast, check UCD registration */ - if ( l2c_ucd_check_rx_pkts( p_lcb, p_msg ) ) - { + if ( l2c_ucd_check_rx_pkts( p_lcb, p_msg ) ) { /* nothing to do */ - } - else + } else #endif GKI_freebuf (p_msg); } #if (BLE_INCLUDED == TRUE) - else if (rcv_cid == L2CAP_BLE_SIGNALLING_CID) - { + else if (rcv_cid == L2CAP_BLE_SIGNALLING_CID) { //counter_add("l2cap.ble.rx.bytes", l2cap_len); //counter_add("l2cap.ble.rx.pkts", 1); l2cble_process_sig_cmd (p_lcb, p, l2cap_len); @@ -262,47 +244,43 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) #endif #if (L2CAP_NUM_FIXED_CHNLS > 0) else if ((rcv_cid >= L2CAP_FIRST_FIXED_CHNL) && (rcv_cid <= L2CAP_LAST_FIXED_CHNL) && - (l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb != NULL) ) - { + (l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb != NULL) ) { //counter_add("l2cap.fix.rx.bytes", l2cap_len); //counter_add("l2cap.fix.rx.pkts", 1); /* If no CCB for this channel, allocate one */ if (p_lcb && - /* only process fixed channel data when link is open or wait for data indication */ - (p_lcb->link_state != LST_DISCONNECTING) && - l2cu_initialize_fixed_ccb (p_lcb, rcv_cid, &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) - { + /* only process fixed channel data when link is open or wait for data indication */ + (p_lcb->link_state != LST_DISCONNECTING) && + l2cu_initialize_fixed_ccb (p_lcb, rcv_cid, &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts)) { p_ccb = p_lcb->p_fixed_ccbs[rcv_cid - L2CAP_FIRST_FIXED_CHNL]; - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { l2c_fcr_proc_pdu (p_ccb, p_msg); - else + } else (*l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb) - (rcv_cid, p_lcb->remote_bd_addr, p_msg); - } - else + (rcv_cid, p_lcb->remote_bd_addr, p_msg); + } else { GKI_freebuf (p_msg); + } } #endif - else - { + else { //counter_add("l2cap.dyn.rx.bytes", l2cap_len); //counter_add("l2cap.dyn.rx.pkts", 1); - if (p_ccb == NULL) + if (p_ccb == NULL) { GKI_freebuf (p_msg); - else - { + } else { /* Basic mode packets go straight to the state machine */ - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DATA, p_msg); - else - { + } else { /* eRTM or streaming mode, so we need to validate states first */ - if ((p_ccb->chnl_state == CST_OPEN) || (p_ccb->chnl_state == CST_CONFIG)) + if ((p_ccb->chnl_state == CST_OPEN) || (p_ccb->chnl_state == CST_CONFIG)) { l2c_fcr_proc_pdu (p_ccb, p_msg); - else + } else { GKI_freebuf (p_msg); + } } } } @@ -334,13 +312,13 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) /* if l2cap command received in CID 1 on top of an LE link, ignore this command */ - if (p_lcb->transport == BT_TRANSPORT_LE) + if (p_lcb->transport == BT_TRANSPORT_LE) { return; + } #endif /* Reject the packet if it exceeds the default Signalling Channel MTU */ - if (pkt_len > L2CAP_DEFAULT_MTU) - { + if (pkt_len > L2CAP_DEFAULT_MTU) { /* Core Spec requires a single response to the first command found in a multi-command ** L2cap packet. If only responses in the packet, then it will be ignored. ** Here we simply mark the bad packet and decide which cmd ID to reject later @@ -355,50 +333,46 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) memset (&cfg_info, 0, sizeof(cfg_info)); /* An L2CAP packet may contain multiple commands */ - while (TRUE) - { + while (TRUE) { /* Smallest command is 4 bytes */ - if ((p = p_next_cmd) > (p_pkt_end - 4)) + if ((p = p_next_cmd) > (p_pkt_end - 4)) { break; + } STREAM_TO_UINT8 (cmd_code, p); STREAM_TO_UINT8 (id, p); STREAM_TO_UINT16 (cmd_len, p); /* Check command length does not exceed packet length */ - if ((p_next_cmd = p + cmd_len) > p_pkt_end) - { + if ((p_next_cmd = p + cmd_len) > p_pkt_end) { L2CAP_TRACE_WARNING ("Command len bad pkt_len: %d cmd_len: %d code: %d", - pkt_len, cmd_len, cmd_code); + pkt_len, cmd_len, cmd_code); break; } L2CAP_TRACE_DEBUG ("cmd_code: %d, id:%d, cmd_len:%d", cmd_code, id, cmd_len); /* Bad L2CAP packet length, look or cmd to reject */ - if (pkt_size_rej) - { + if (pkt_size_rej) { /* If command found rejected it and we're done, otherwise keep looking */ - if (l2c_is_cmd_rejected(cmd_code, id, p_lcb)) + if (l2c_is_cmd_rejected(cmd_code, id, p_lcb)) { return; - else - continue; /* Look for next cmd/response in current packet */ + } else { + continue; /* Look for next cmd/response in current packet */ + } } - switch (cmd_code) - { + switch (cmd_code) { case L2CAP_CMD_REJECT: STREAM_TO_UINT16 (rej_reason, p); - if (rej_reason == L2CAP_CMD_REJ_MTU_EXCEEDED) - { + if (rej_reason == L2CAP_CMD_REJ_MTU_EXCEEDED) { STREAM_TO_UINT16 (rej_mtu, p); /* What to do with the MTU reject ? We have negotiated an MTU. For now */ /* we will ignore it and let a higher protocol timeout take care of it */ L2CAP_TRACE_WARNING ("L2CAP - MTU rej Handle: %d MTU: %d", p_lcb->handle, rej_mtu); } - if (rej_reason == L2CAP_CMD_REJ_INVALID_CID) - { + if (rej_reason == L2CAP_CMD_REJ_INVALID_CID) { STREAM_TO_UINT16 (rcid, p); STREAM_TO_UINT16 (lcid, p); @@ -406,16 +380,14 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) /* Remote CID invalid. Treat as a disconnect */ if (((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) - && (p_ccb->remote_cid == rcid)) - { + && (p_ccb->remote_cid == rcid)) { /* Fake link disconnect - no reply is generated */ l2c_csm_execute (p_ccb, L2CEVT_LP_DISCONNECT_IND, NULL); } } /* SonyEricsson Info request Bug workaround (Continue connection) */ - else if (rej_reason == L2CAP_CMD_REJ_NOT_UNDERSTOOD && p_lcb->w4_info_rsp) - { + else if (rej_reason == L2CAP_CMD_REJ_NOT_UNDERSTOOD && p_lcb->w4_info_rsp) { btu_stop_timer (&p_lcb->info_timer_entry); p_lcb->w4_info_rsp = FALSE; @@ -423,8 +395,7 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) memcpy (ci.bd_addr, p_lcb->remote_bd_addr, sizeof(BD_ADDR)); /* For all channels, send the event through their FSMs */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_INFO_RSP, &ci); } } @@ -433,23 +404,18 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) case L2CAP_CMD_CONN_REQ: STREAM_TO_UINT16 (con_info.psm, p); STREAM_TO_UINT16 (rcid, p); - if ((p_rcb = l2cu_find_rcb_by_psm (con_info.psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (con_info.psm)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for unknown PSM: %d", con_info.psm); l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM); break; - } - else - { - if (!p_rcb->api.pL2CA_ConnectInd_Cb) - { + } else { + if (!p_rcb->api.pL2CA_ConnectInd_Cb) { L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm); l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM); break; } } - if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) - { + if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) { L2CAP_TRACE_ERROR ("L2CAP - unable to allocate CCB"); l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_RESOURCES); break; @@ -467,25 +433,24 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) STREAM_TO_UINT16 (con_info.l2cap_result, p); STREAM_TO_UINT16 (con_info.l2cap_status, p); - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for conn rsp, LCID: %d RCID: %d", - lcid, con_info.remote_cid); + lcid, con_info.remote_cid); break; } - if (p_ccb->local_id != id) - { + if (p_ccb->local_id != id) { L2CAP_TRACE_WARNING ("L2CAP - con rsp - bad ID. Exp: %d Got: %d", - p_ccb->local_id, id); + p_ccb->local_id, id); break; } - if (con_info.l2cap_result == L2CAP_CONN_OK) + if (con_info.l2cap_result == L2CAP_CONN_OK) { l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP, &con_info); - else if (con_info.l2cap_result == L2CAP_CONN_PENDING) + } else if (con_info.l2cap_result == L2CAP_CONN_PENDING) { l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP_PND, &con_info); - else + } else { l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP_NEG, &con_info); + } break; @@ -500,15 +465,13 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) p_cfg_start = p; cfg_info.flush_to_present = cfg_info.mtu_present = cfg_info.qos_present = - cfg_info.fcr_present = cfg_info.fcs_present = FALSE; + cfg_info.fcr_present = cfg_info.fcs_present = FALSE; - while (p < p_cfg_end) - { + while (p < p_cfg_end) { STREAM_TO_UINT8 (cfg_code, p); STREAM_TO_UINT8 (cfg_len, p); - switch (cfg_code & 0x7F) - { + switch (cfg_code & 0x7F) { case L2CAP_CFG_TYPE_MTU: cfg_info.mtu_present = TRUE; STREAM_TO_UINT16 (cfg_info.mtu, p); @@ -557,18 +520,15 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) default: /* sanity check option length */ - if ((cfg_len + L2CAP_CFG_OPTION_OVERHEAD) <= cmd_len) - { + if ((cfg_len + L2CAP_CFG_OPTION_OVERHEAD) <= cmd_len) { p += cfg_len; - if ((cfg_code & 0x80) == 0) - { + if ((cfg_code & 0x80) == 0) { cfg_rej_len += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; cfg_rej = TRUE; } } /* bad length; force loop exit */ - else - { + else { p = p_cfg_end; cfg_rej = TRUE; } @@ -576,20 +536,14 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) } } - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) { p_ccb->remote_id = id; - if (cfg_rej) - { + if (cfg_rej) { l2cu_send_peer_config_rej (p_ccb, p_cfg_start, (UINT16) (cmd_len - L2CAP_CONFIG_REQ_LEN), cfg_rej_len); - } - else - { + } else { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_CONFIG_REQ, &cfg_info); } - } - else - { + } else { /* updated spec says send command reject on invalid cid */ l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_INVALID_CID, id, 0, 0); } @@ -602,15 +556,13 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) STREAM_TO_UINT16 (cfg_info.result, p); cfg_info.flush_to_present = cfg_info.mtu_present = cfg_info.qos_present = - cfg_info.fcr_present = cfg_info.fcs_present = FALSE; + cfg_info.fcr_present = cfg_info.fcs_present = FALSE; - while (p < p_cfg_end) - { + while (p < p_cfg_end) { STREAM_TO_UINT8 (cfg_code, p); STREAM_TO_UINT8 (cfg_len, p); - switch (cfg_code & 0x7F) - { + switch (cfg_code & 0x7F) { case L2CAP_CFG_TYPE_MTU: cfg_info.mtu_present = TRUE; STREAM_TO_UINT16 (cfg_info.mtu, p); @@ -659,21 +611,18 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) } } - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) - { - if (p_ccb->local_id != id) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) { + if (p_ccb->local_id != id) { L2CAP_TRACE_WARNING ("L2CAP - cfg rsp - bad ID. Exp: %d Got: %d", - p_ccb->local_id, id); + p_ccb->local_id, id); break; } - if ( (cfg_info.result == L2CAP_CFG_OK) || (cfg_info.result == L2CAP_CFG_PENDING) ) + if ( (cfg_info.result == L2CAP_CFG_OK) || (cfg_info.result == L2CAP_CFG_PENDING) ) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_CONFIG_RSP, &cfg_info); - else + } else { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_CONFIG_RSP_NEG, &cfg_info); - } - else - { + } + } else { L2CAP_TRACE_WARNING ("L2CAP - rcvd cfg rsp for unknown CID: 0x%04x", lcid); } break; @@ -683,16 +632,14 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) STREAM_TO_UINT16 (lcid, p); STREAM_TO_UINT16 (rcid, p); - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) - { - if (p_ccb->remote_cid == rcid) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) { + if (p_ccb->remote_cid == rcid) { p_ccb->remote_id = id; l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DISCONNECT_REQ, &con_info); } - } - else + } else { l2cu_send_peer_disc_rsp (p_lcb, id, lcid, rcid); + } break; @@ -700,10 +647,8 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) STREAM_TO_UINT16 (rcid, p); STREAM_TO_UINT16 (lcid, p); - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) - { - if ((p_ccb->remote_cid == rcid) && (p_ccb->local_id == id)) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) { + if ((p_ccb->remote_cid == rcid) && (p_ccb->local_id == id)) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DISCONNECT_RSP, &con_info); } } @@ -714,8 +659,7 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) break; case L2CAP_CMD_ECHO_RSP: - if (p_lcb->p_echo_rsp_cb) - { + if (p_lcb->p_echo_rsp_cb) { tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb; /* Zero out the callback in case app immediately calls us again */ @@ -732,8 +676,7 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) case L2CAP_CMD_INFO_RSP: /* Stop the link connect timer if sent before L2CAP connection is up */ - if (p_lcb->w4_info_rsp) - { + if (p_lcb->w4_info_rsp) { btu_stop_timer (&p_lcb->info_timer_entry); p_lcb->w4_info_rsp = FALSE; } @@ -744,18 +687,14 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) p_lcb->info_rx_bits |= (1 << info_type); if ( (info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE) - && (result == L2CAP_INFO_RESP_RESULT_SUCCESS) ) - { + && (result == L2CAP_INFO_RESP_RESULT_SUCCESS) ) { STREAM_TO_UINT32( p_lcb->peer_ext_fea, p ); #if (L2CAP_NUM_FIXED_CHNLS > 0) - if (p_lcb->peer_ext_fea & L2CAP_EXTFEA_FIXED_CHNLS) - { + if (p_lcb->peer_ext_fea & L2CAP_EXTFEA_FIXED_CHNLS) { l2cu_send_peer_info_req (p_lcb, L2CAP_FIXED_CHANNELS_INFO_TYPE); break; - } - else - { + } else { l2cu_process_fixed_chnl_resp (p_lcb); } #endif @@ -763,10 +702,8 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) #if (L2CAP_NUM_FIXED_CHNLS > 0) - if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) - { - if (result == L2CAP_INFO_RESP_RESULT_SUCCESS) - { + if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) { + if (result == L2CAP_INFO_RESP_RESULT_SUCCESS) { memcpy (p_lcb->peer_chnl_mask, p, L2CAP_FIXED_CHNL_ARRAY_SIZE); } @@ -774,10 +711,8 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) } #endif #if (L2CAP_UCD_INCLUDED == TRUE) - else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) - { - if (result == L2CAP_INFO_RESP_RESULT_SUCCESS) - { + else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) { + if (result == L2CAP_INFO_RESP_RESULT_SUCCESS) { STREAM_TO_UINT16 (p_lcb->ucd_mtu, p); } } @@ -785,8 +720,7 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) ci.status = HCI_SUCCESS; memcpy (ci.bd_addr, p_lcb->remote_bd_addr, sizeof(BD_ADDR)); - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { l2c_csm_execute (p_ccb, L2CEVT_L2CAP_INFO_RSP, &ci); } break; @@ -810,9 +744,11 @@ static void process_l2cap_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) ** Returns void ** *******************************************************************************/ -void l2c_process_held_packets(BOOLEAN timed_out) { - if (list_is_empty(l2cb.rcv_pending_q)) +void l2c_process_held_packets(BOOLEAN timed_out) +{ + if (list_is_empty(l2cb.rcv_pending_q)) { return; + } if (!timed_out) { btu_stop_timer(&l2cb.rcv_hold_tle); @@ -822,7 +758,7 @@ void l2c_process_held_packets(BOOLEAN timed_out) { } for (const list_node_t *node = list_begin(l2cb.rcv_pending_q); - node != list_end(l2cb.rcv_pending_q);) { + node != list_end(l2cb.rcv_pending_q);) { BT_HDR *p_buf = list_node(node); node = list_next(node); if (!timed_out || (!p_buf->layer_specific) || (--p_buf->layer_specific == 0)) { @@ -833,8 +769,9 @@ void l2c_process_held_packets(BOOLEAN timed_out) { } /* If anyone still in the queue, restart the timeout */ - if (!list_is_empty(l2cb.rcv_pending_q)) + if (!list_is_empty(l2cb.rcv_pending_q)) { btu_start_timer (&l2cb.rcv_hold_tle, BTU_TTYPE_L2CAP_HOLD, BT_1SEC_TIMEOUT); + } } @@ -857,8 +794,7 @@ void l2c_init (void) l2cb.dyn_psm = 0xFFF; /* Put all the channel control blocks on the free queue */ - for (xx = 0; xx < MAX_L2CAP_CHANNELS - 1; xx++) - { + for (xx = 0; xx < MAX_L2CAP_CHANNELS - 1; xx++) { l2cb.ccb_pool[xx].p_next_ccb = &l2cb.ccb_pool[xx + 1]; } @@ -887,7 +823,7 @@ void l2c_init (void) #endif #if L2CAP_CONFORMANCE_TESTING == TRUE - /* Conformance testing needs a dynamic response */ + /* Conformance testing needs a dynamic response */ l2cb.test_info_resp = L2CAP_EXTFEA_SUPPORTED_MASK; #endif @@ -898,15 +834,17 @@ void l2c_init (void) #if BLE_INCLUDED == TRUE l2cb.l2c_ble_fixed_chnls_mask = - L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT; + L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT; #endif l2cb.rcv_pending_q = list_new(NULL); - if (l2cb.rcv_pending_q == NULL) + if (l2cb.rcv_pending_q == NULL) { LOG_ERROR("%s unable to allocate memory for link layer control block", __func__); + } } -void l2c_free(void) { +void l2c_free(void) +{ list_free(l2cb.rcv_pending_q); } @@ -922,8 +860,7 @@ void l2c_free(void) { void l2c_process_timeout (TIMER_LIST_ENT *p_tle) { /* What type of timeout ? */ - switch (p_tle->event) - { + switch (p_tle->event) { case BTU_TTYPE_L2CAP_LINK: l2c_link_timeout ((tL2C_LCB *)p_tle->param); break; @@ -963,8 +900,7 @@ UINT8 l2c_data_write (UINT16 cid, BT_HDR *p_data, UINT16 flags) tL2C_CCB *p_ccb; /* Find the channel control block. We don't know the link it is on. */ - if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_DataWrite, CID: %d", cid); GKI_freebuf (p_data); return (L2CAP_DW_FAILED); @@ -972,8 +908,7 @@ UINT8 l2c_data_write (UINT16 cid, BT_HDR *p_data, UINT16 flags) #ifndef TESTER /* Tester may send any amount of data. otherwise sending message bigger than mtu size of peer is a violation of protocol */ - if (p_data->len > p_ccb->peer_cfg.mtu) - { + if (p_data->len > p_ccb->peer_cfg.mtu) { L2CAP_TRACE_WARNING ("L2CAP - CID: 0x%04x cannot send message bigger than peer's mtu size", cid); GKI_freebuf (p_data); return (L2CAP_DW_FAILED); @@ -984,10 +919,9 @@ UINT8 l2c_data_write (UINT16 cid, BT_HDR *p_data, UINT16 flags) p_data->layer_specific = flags; /* If already congested, do not accept any more packets */ - if (p_ccb->cong_sent) - { + if (p_ccb->cong_sent) { L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested xmit_hold_q.count: %u buff_quota: %u", - p_ccb->local_cid, GKI_queue_length(&p_ccb->xmit_hold_q), p_ccb->buff_quota); + p_ccb->local_cid, GKI_queue_length(&p_ccb->xmit_hold_q), p_ccb->buff_quota); GKI_freebuf (p_data); return (L2CAP_DW_FAILED); @@ -998,8 +932,9 @@ UINT8 l2c_data_write (UINT16 cid, BT_HDR *p_data, UINT16 flags) l2c_csm_execute (p_ccb, L2CEVT_L2CA_DATA_WRITE, p_data); - if (p_ccb->cong_sent) + if (p_ccb->cong_sent) { return (L2CAP_DW_CONGESTED); + } return (L2CAP_DW_SUCCESS); } diff --git a/components/bt/bluedroid/stack/l2cap/l2c_ucd.c b/components/bt/bluedroid/stack/l2cap/l2c_ucd.c old mode 100755 new mode 100644 index 8118a708c..9340ed24f --- a/components/bt/bluedroid/stack/l2cap/l2c_ucd.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_ucd.c @@ -55,22 +55,18 @@ static void l2c_ucd_discover_cback (BD_ADDR rem_bda, UINT8 info_type, UINT32 dat L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_discover_cback"); - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { - if (p_rcb->in_use) - { + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { + if (p_rcb->in_use) { /* if this application is waiting UCD reception info */ if (( info_type == L2CAP_UCD_INFO_TYPE_RECEPTION ) - && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION )) - { + && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION )) { p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (rem_bda, info_type, data); p_rcb->ucd.state &= ~(L2C_UCD_STATE_W4_RECEPTION); } /* if this application is waiting UCD MTU info */ if (( info_type == L2CAP_UCD_INFO_TYPE_MTU ) - && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU )) - { + && ( p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU )) { p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (rem_bda, info_type, data); p_rcb->ucd.state &= ~(L2C_UCD_STATE_W4_MTU); } @@ -101,13 +97,10 @@ static void l2c_ucd_data_ind_cback (BD_ADDR rem_bda, BT_HDR *p_buf) p_buf->offset += L2CAP_UCD_OVERHEAD; p_buf->len -= L2CAP_UCD_OVERHEAD; - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) { L2CAP_TRACE_ERROR ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm); GKI_freebuf (p_buf); - } - else - { + } else { p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb(rem_bda, p_buf); } } @@ -128,17 +121,14 @@ static void l2c_ucd_congestion_status_cback (BD_ADDR rem_bda, BOOLEAN is_congest L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_congestion_status_cback"); - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { if (( p_rcb->in_use ) - &&( p_rcb->ucd.state != L2C_UCD_STATE_UNUSED )) - { - if ( p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) - { + && ( p_rcb->ucd.state != L2C_UCD_STATE_UNUSED )) { + if ( p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) { L2CAP_TRACE_DEBUG ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,", - is_congested, p_rcb->psm, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + is_congested, p_rcb->psm, + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ( rem_bda, is_congested ); } @@ -206,14 +196,12 @@ BOOLEAN L2CA_UcdRegister ( UINT16 psm, tL2CAP_UCD_CB_INFO *p_cb_info ) L2CAP_TRACE_API ("L2CA_UcdRegister() PSM: 0x%04x", psm); if ((!p_cb_info->pL2CA_UCD_Discover_Cb) - || (!p_cb_info->pL2CA_UCD_Data_Cb)) - { + || (!p_cb_info->pL2CA_UCD_Data_Cb)) { L2CAP_TRACE_ERROR ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm); return (FALSE); } - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) { L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm); return (FALSE); } @@ -222,15 +210,11 @@ BOOLEAN L2CA_UcdRegister ( UINT16 psm, tL2CAP_UCD_CB_INFO *p_cb_info ) p_rcb->ucd.cb_info = *p_cb_info; /* check if master rcb is created for UCD */ - if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL) - { - if ((p_rcb = l2cu_allocate_rcb (L2C_UCD_RCB_ID)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL) { + if ((p_rcb = l2cu_allocate_rcb (L2C_UCD_RCB_ID)) == NULL) { L2CAP_TRACE_ERROR ("L2CAP - no RCB available for L2CA_UcdRegister"); return (FALSE); - } - else - { + } else { /* these callback functions will forward data to each UCD application */ p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb = l2c_ucd_discover_cback; p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb = l2c_ucd_data_ind_cback; @@ -270,8 +254,7 @@ BOOLEAN L2CA_UcdDeregister ( UINT16 psm ) L2CAP_TRACE_API ("L2CA_UcdDeregister() PSM: 0x%04x", psm); - if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) { L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm); return (FALSE); } @@ -281,25 +264,22 @@ BOOLEAN L2CA_UcdDeregister ( UINT16 psm ) /* check this was the last UCD registration */ p_rcb = &l2cb.rcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { - if ((p_rcb->in_use) && (p_rcb->ucd.state != L2C_UCD_STATE_UNUSED)) + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { + if ((p_rcb->in_use) && (p_rcb->ucd.state != L2C_UCD_STATE_UNUSED)) { return (TRUE); + } } /* delete master rcb for UCD */ - if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL) { l2cu_release_rcb (p_rcb); } /* delete CCB for UCD */ p_ccb = l2cb.ccb_pool; - for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ ) - { + for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ ) { if (( p_ccb->in_use ) - &&( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )) - { + && ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )) { l2cu_release_ccb (p_ccb); } p_ccb++; @@ -330,13 +310,12 @@ BOOLEAN L2CA_UcdDiscover ( UINT16 psm, BD_ADDR rem_bda, UINT8 info_type ) tL2C_RCB *p_rcb; L2CAP_TRACE_API ("L2CA_UcdDiscover() PSM: 0x%04x BDA: %08x%04x, InfoType=0x%02x", psm, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5], info_type); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5], info_type); /* Fail if the PSM is not registered */ if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED )) - { + || ( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED )) { L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm); return (FALSE); } @@ -344,27 +323,25 @@ BOOLEAN L2CA_UcdDiscover ( UINT16 psm, BD_ADDR rem_bda, UINT8 info_type ) /* First, see if we already have a link to the remote */ /* then find the channel control block for UCD. */ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) - { - if ( l2c_ucd_connect (rem_bda) == FALSE ) - { + || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) { + if ( l2c_ucd_connect (rem_bda) == FALSE ) { return (FALSE); } } /* set waiting flags in rcb */ - if ( info_type & L2CAP_UCD_INFO_TYPE_RECEPTION ) + if ( info_type & L2CAP_UCD_INFO_TYPE_RECEPTION ) { p_rcb->ucd.state |= L2C_UCD_STATE_W4_RECEPTION; + } - if ( info_type & L2CAP_UCD_INFO_TYPE_MTU ) + if ( info_type & L2CAP_UCD_INFO_TYPE_MTU ) { p_rcb->ucd.state |= L2C_UCD_STATE_W4_MTU; + } /* if link is already established */ - if ((p_lcb)&&(p_lcb->link_state == LST_CONNECTED)) - { - if (!p_ccb) - { + if ((p_lcb) && (p_lcb->link_state == LST_CONNECTED)) { + if (!p_ccb) { p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID); } l2c_ucd_check_pending_info_req(p_ccb); @@ -397,13 +374,12 @@ UINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 fla UINT8 *p; L2CAP_TRACE_API ("L2CA_UcdDataWrite() PSM: 0x%04x BDA: %08x%04x", psm, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); /* Fail if the PSM is not registered */ if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL) - ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED )) - { + || ( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED )) { L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -412,18 +388,15 @@ UINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 fla /* First, see if we already have a link to the remote */ /* then find the channel control block for UCD */ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) - { - if ( l2c_ucd_connect (rem_bda) == FALSE ) - { + || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) { + if ( l2c_ucd_connect (rem_bda) == FALSE ) { GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); } /* If we still don't have lcb and ccb after connect attempt, then can't proceed */ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) - { + || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) { GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); } @@ -437,20 +410,18 @@ UINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 fla UINT16_TO_STREAM (p, psm); /* UCD MTU check */ - if ((p_lcb->ucd_mtu) && (p_buf->len > p_lcb->ucd_mtu)) - { + if ((p_lcb->ucd_mtu) && (p_buf->len > p_lcb->ucd_mtu)) { L2CAP_TRACE_WARNING ("L2CAP - Handle: 0x%04x UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); } /* If already congested, do not accept any more packets */ - if (p_ccb->cong_sent) - { + if (p_ccb->cong_sent) { L2CAP_TRACE_ERROR ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u buff_quota: %u", - p_lcb->handle, - (p_ccb->xmit_hold_q.count + p_lcb->ucd_out_sec_pending_q.count), - p_ccb->buff_quota); + p_lcb->handle, + (p_ccb->xmit_hold_q.count + p_lcb->ucd_out_sec_pending_q.count), + p_ccb->buff_quota); GKI_freebuf (p_buf); return (L2CAP_DW_FAILED); @@ -461,10 +432,11 @@ UINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 fla l2c_csm_execute (p_ccb, L2CEVT_L2CA_DATA_WRITE, p_buf); - if (p_ccb->cong_sent) + if (p_ccb->cong_sent) { return (L2CAP_DW_CONGESTED); - else + } else { return (L2CAP_DW_SUCCESS); + } } /******************************************************************************* @@ -485,19 +457,16 @@ BOOLEAN L2CA_UcdSetIdleTimeout ( BD_ADDR rem_bda, UINT16 timeout ) tL2C_CCB *p_ccb; L2CAP_TRACE_API ("L2CA_UcdSetIdleTimeout() Timeout: 0x%04x BDA: %08x%04x", timeout, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); /* First, see if we already have a link to the remote */ /* then find the channel control block. */ if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) - { + || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)) { L2CAP_TRACE_WARNING ("L2CAP - no UCD channel"); return (FALSE); - } - else - { + } else { p_ccb->fixed_chnl_idle_tout = timeout; return (TRUE); } @@ -518,18 +487,16 @@ BOOLEAN L2CA_UCDSetTxPriority ( BD_ADDR rem_bda, tL2CAP_CHNL_PRIORITY priority ) tL2C_CCB *p_ccb; L2CAP_TRACE_API ("L2CA_UCDSetTxPriority() priority: 0x%02x BDA: %08x%04x", priority, - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); - if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_UCDSetTxPriority"); return (FALSE); } /* Find the channel control block */ - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_UCDSetTxPriority"); return (FALSE); } @@ -558,47 +525,37 @@ static BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda ) tL2C_RCB *p_rcb; L2CAP_TRACE_DEBUG ("l2c_ucd_connect() BDA: %08x%04x", - (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], - (rem_bda[4]<<8)+rem_bda[5]); + (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], + (rem_bda[4] << 8) + rem_bda[5]); /* Fail if we have not established communications with the controller */ - if (!BTM_IsDeviceUp()) - { + if (!BTM_IsDeviceUp()) { L2CAP_TRACE_WARNING ("l2c_ucd_connect - BTU not ready"); return (FALSE); } /* First, see if we already have a link to the remote */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL) { /* No link. Get an LCB and start link establishment */ if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, BT_TRANSPORT_BR_EDR)) == NULL) - || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) ) - { + || (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) ) { L2CAP_TRACE_WARNING ("L2CAP - conn not started l2c_ucd_connect"); return (FALSE); } - } - else if ( p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) ) - { - if (!(p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION)) - { + } else if ( p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) ) { + if (!(p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION)) { L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_connect"); return (FALSE); } } /* Find the channel control block. */ - if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL) - { + if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL) { /* Allocate a channel control block */ - if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) - { + if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for l2c_ucd_connect"); return (FALSE); - } - else - { + } else { /* Set CID for the connection */ p_ccb->local_cid = L2CAP_CONNECTIONLESS_CID; p_ccb->remote_cid = L2CAP_CONNECTIONLESS_CID; @@ -609,8 +566,7 @@ static BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda ) /* Set the default channel priority value to use */ l2cu_change_pri_ccb (p_ccb, L2CAP_UCD_CH_PRIORITY); - if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL) - { + if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no UCD registered, l2c_ucd_connect"); return (FALSE); } @@ -618,8 +574,7 @@ static BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda ) p_ccb->p_rcb = p_rcb; /* There is no configuration, so if the link is up, the channel is up */ - if (p_lcb->link_state == LST_CONNECTED) - { + if (p_lcb->link_state == LST_CONNECTED) { p_ccb->chnl_state = CST_OPEN; } } @@ -640,11 +595,13 @@ static BOOLEAN l2c_ucd_connect ( BD_ADDR rem_bda ) void l2c_ucd_delete_sec_pending_q(tL2C_LCB *p_lcb) { /* clean up any security pending UCD */ - while (p_lcb->ucd_out_sec_pending_q.p_first) + while (p_lcb->ucd_out_sec_pending_q.p_first) { GKI_freebuf (GKI_dequeue (&p_lcb->ucd_out_sec_pending_q)); + } - while (p_lcb->ucd_in_sec_pending_q.p_first) + while (p_lcb->ucd_in_sec_pending_q.p_first) { GKI_freebuf (GKI_dequeue (&p_lcb->ucd_in_sec_pending_q)); + } } /******************************************************************************* @@ -662,24 +619,18 @@ BOOLEAN l2c_ucd_check_pending_info_req(tL2C_CCB *p_ccb) UINT16 xx; BOOLEAN pending = FALSE; - if (p_ccb == NULL) - { + if (p_ccb == NULL) { L2CAP_TRACE_ERROR ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req"); return (FALSE); } - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { - if (p_rcb->in_use) - { + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { + if (p_rcb->in_use) { /* if application is waiting UCD reception info */ - if (p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION) - { + if (p_rcb->ucd.state & L2C_UCD_STATE_W4_RECEPTION) { /* if this information is available */ - if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) ) - { - if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION)) - { + if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_EXTENDED_FEATURES_INFO_TYPE) ) { + if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION)) { L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req"); l2c_ucd_delete_sec_pending_q(p_ccb->p_lcb); @@ -687,34 +638,26 @@ BOOLEAN l2c_ucd_check_pending_info_req(tL2C_CCB *p_ccb) } p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (p_ccb->p_lcb->remote_bd_addr, - L2CAP_UCD_INFO_TYPE_RECEPTION, - p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION); - } - else - { + L2CAP_UCD_INFO_TYPE_RECEPTION, + p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION); + } else { pending = TRUE; - if (p_ccb->p_lcb->w4_info_rsp == FALSE) - { + if (p_ccb->p_lcb->w4_info_rsp == FALSE) { l2cu_send_peer_info_req (p_ccb->p_lcb, L2CAP_EXTENDED_FEATURES_INFO_TYPE); } } } /* if application is waiting for UCD MTU */ - if (p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU) - { + if (p_rcb->ucd.state & L2C_UCD_STATE_W4_MTU) { /* if this information is available */ - if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_CONNLESS_MTU_INFO_TYPE)) - { + if ( p_ccb->p_lcb->info_rx_bits & (1 << L2CAP_CONNLESS_MTU_INFO_TYPE)) { p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Discover_Cb (p_ccb->p_lcb->remote_bd_addr, - L2CAP_UCD_INFO_TYPE_MTU, - p_ccb->p_lcb->ucd_mtu); - } - else - { + L2CAP_UCD_INFO_TYPE_MTU, + p_ccb->p_lcb->ucd_mtu); + } else { pending = TRUE; - if (p_ccb->p_lcb->w4_info_rsp == FALSE) - { + if (p_ccb->p_lcb->w4_info_rsp == FALSE) { l2cu_send_peer_info_req (p_ccb->p_lcb, L2CAP_CONNLESS_MTU_INFO_TYPE); } } @@ -755,9 +698,8 @@ BOOLEAN l2c_ucd_check_pending_out_sec_q(tL2C_CCB *p_ccb) UINT16 psm; BT_HDR *p_buf; - if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) - { - p_buf = (BT_HDR*)(p_ccb->p_lcb->ucd_out_sec_pending_q.p_first); + if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) { + p_buf = (BT_HDR *)(p_ccb->p_lcb->ucd_out_sec_pending_q.p_first); p = (UINT8 *)(p_buf + 1) + p_buf->offset; STREAM_TO_UINT16(psm, p) @@ -784,9 +726,8 @@ void l2c_ucd_send_pending_out_sec_q(tL2C_CCB *p_ccb) { BT_HDR *p_buf; - if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) - { - p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q); + if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) { + p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q); l2c_enqueue_peer_data (p_ccb, (BT_HDR *)p_buf); l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, NULL); @@ -807,12 +748,11 @@ void l2c_ucd_discard_pending_out_sec_q(tL2C_CCB *p_ccb) { BT_HDR *p_buf; - p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q); + p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->p_lcb->ucd_out_sec_pending_q); /* we may need to report to application */ - if (p_buf) - { + if (p_buf) { GKI_freebuf (p_buf); } } @@ -832,9 +772,8 @@ BOOLEAN l2c_ucd_check_pending_in_sec_q(tL2C_CCB *p_ccb) UINT16 psm; BT_HDR *p_buf; - if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) - { - p_buf = (BT_HDR*)(p_ccb->p_lcb->ucd_in_sec_pending_q.p_first); + if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) { + p_buf = (BT_HDR *)(p_ccb->p_lcb->ucd_in_sec_pending_q.p_first); p = (UINT8 *)(p_buf + 1) + p_buf->offset; STREAM_TO_UINT16(psm, p) @@ -861,9 +800,8 @@ void l2c_ucd_send_pending_in_sec_q(tL2C_CCB *p_ccb) { BT_HDR *p_buf; - if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) - { - p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q); + if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) { + p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q); p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Data_Cb(p_ccb->p_lcb->remote_bd_addr, (BT_HDR *)p_buf); } @@ -883,10 +821,9 @@ void l2c_ucd_discard_pending_in_sec_q(tL2C_CCB *p_ccb) { BT_HDR *p_buf; - p_buf = (BT_HDR*)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q); + p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->p_lcb->ucd_in_sec_pending_q); - if (p_buf) - { + if (p_buf) { GKI_freebuf (p_buf); } } @@ -907,19 +844,14 @@ BOOLEAN l2c_ucd_check_rx_pkts(tL2C_LCB *p_lcb, BT_HDR *p_msg) tL2C_RCB *p_rcb; if (((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) != NULL) - ||((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL)) - { - if (p_ccb == NULL) - { + || ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) != NULL)) { + if (p_ccb == NULL) { /* Allocate a channel control block */ - if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) - { + if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no CCB for UCD reception"); GKI_freebuf (p_msg); return TRUE; - } - else - { + } else { /* Set CID for the connection */ p_ccb->local_cid = L2CAP_CONNECTIONLESS_CID; p_ccb->remote_cid = L2CAP_CONNECTIONLESS_CID; @@ -938,9 +870,9 @@ BOOLEAN l2c_ucd_check_rx_pkts(tL2C_LCB *p_lcb, BT_HDR *p_msg) } l2c_csm_execute(p_ccb, L2CEVT_L2CAP_DATA, p_msg); return TRUE; - } - else + } else { return FALSE; + } } /******************************************************************************* @@ -959,18 +891,14 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) /* if the event is not processed by this function, this variable will be set to FALSE */ BOOLEAN done = TRUE; - switch (p_ccb->chnl_state) - { + switch (p_ccb->chnl_state) { case CST_CLOSED: - switch (event) - { + switch (event) { case L2CEVT_LP_CONNECT_CFM: /* Link came up */ /* check if waiting for UCD info */ - if (!l2c_ucd_check_pending_info_req (p_ccb)) - { + if (!l2c_ucd_check_pending_info_req (p_ccb)) { /* check if any outgoing UCD packet is waiting security check */ - if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) - { + if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) { p_ccb->chnl_state = CST_OPEN; } } @@ -986,11 +914,9 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_L2CAP_INFO_RSP: /* check if waiting for UCD info */ - if (!l2c_ucd_check_pending_info_req (p_ccb)) - { + if (!l2c_ucd_check_pending_info_req (p_ccb)) { /* check if any outgoing UCD packet is waiting security check */ - if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) - { + if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) { p_ccb->chnl_state = CST_OPEN; } } @@ -1003,12 +929,10 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) break; case CST_ORIG_W4_SEC_COMP: - switch (event) - { + switch (event) { case L2CEVT_SEC_RE_SEND_CMD: /* BTM has enough info to proceed */ /* check if any outgoing UCD packet is waiting security check */ - if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) - { + if (!l2c_ucd_check_pending_out_sec_q(p_ccb)) { p_ccb->chnl_state = CST_OPEN; } break; @@ -1017,14 +941,11 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) p_ccb->chnl_state = CST_OPEN; l2c_ucd_send_pending_out_sec_q(p_ccb); - if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) - { + if ( p_ccb->p_lcb->ucd_out_sec_pending_q.count ) { /* start a timer to send next UCD packet in OPEN state */ /* it will prevent stack overflow */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 0); - } - else - { + } else { /* start a timer for idle timeout of UCD */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout); } @@ -1059,28 +980,23 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) case CST_TERM_W4_SEC_COMP: - switch (event) - { + switch (event) { case L2CEVT_SEC_COMP: p_ccb->chnl_state = CST_OPEN; l2c_ucd_send_pending_in_sec_q (p_ccb); - if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) - { + if ( p_ccb->p_lcb->ucd_in_sec_pending_q.count ) { /* start a timer to check next UCD packet in OPEN state */ /* it will prevent stack overflow */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 0); - } - else - { + } else { /* start a timer for idle timeout of UCD */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, p_ccb->fixed_chnl_idle_tout); } break; case L2CEVT_SEC_COMP_NEG: - if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK) - { + if (((tL2C_CONN_INFO *)p_data)->status == BTM_DELAY_CHECK) { done = FALSE; break; } @@ -1101,8 +1017,7 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_SEC_RE_SEND_CMD: /* BTM has enough info to proceed */ /* check if any incoming UCD packet is waiting security check */ - if (!l2c_ucd_check_pending_in_sec_q(p_ccb)) - { + if (!l2c_ucd_check_pending_in_sec_q(p_ccb)) { p_ccb->chnl_state = CST_OPEN; } break; @@ -1119,8 +1034,7 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) break; case CST_OPEN: - switch (event) - { + switch (event) { case L2CEVT_L2CAP_DATA: /* Peer data packet rcvd */ /* stop idle timer of UCD */ btu_stop_timer (&p_ccb->timer_entry); @@ -1143,8 +1057,7 @@ BOOLEAN l2c_ucd_process_event(tL2C_CCB *p_ccb, UINT16 event, void *p_data) case L2CEVT_TIMEOUT: /* check if any UCD packet is waiting security check */ if ((!l2c_ucd_check_pending_in_sec_q(p_ccb)) - &&(!l2c_ucd_check_pending_out_sec_q(p_ccb))) - { + && (!l2c_ucd_check_pending_out_sec_q(p_ccb))) { l2cu_release_ccb (p_ccb); } break; diff --git a/components/bt/bluedroid/stack/l2cap/l2c_utils.c b/components/bt/bluedroid/stack/l2cap/l2c_utils.c old mode 100755 new mode 100644 index f8d91759c..7c5bd8d20 --- a/components/bt/bluedroid/stack/l2cap/l2c_utils.c +++ b/components/bt/bluedroid/stack/l2cap/l2c_utils.c @@ -53,10 +53,8 @@ tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPOR int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if (!p_lcb->in_use) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if (!p_lcb->in_use) { memset (p_lcb, 0, sizeof (tL2C_LCB)); memcpy (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN); @@ -74,12 +72,10 @@ tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPOR p_lcb->transport = transport; p_lcb->tx_data_len = controller_get_interface()->get_ble_default_data_packet_length(); - if (transport == BT_TRANSPORT_LE) - { + if (transport == BT_TRANSPORT_LE) { l2cb.num_ble_links_active++; l2c_ble_link_adjust_allocation(); - } - else + } else #endif { l2cb.num_links_active++; @@ -108,8 +104,7 @@ void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding) { tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR); - if (p_lcb) - { + if (p_lcb) { p_lcb->is_bonding = is_bonding; } } @@ -136,37 +131,31 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) btu_stop_timer (&p_lcb->info_timer_entry); /* Release any unfinished L2CAP packet on this link */ - if (p_lcb->p_hcit_rcv_acl) - { + if (p_lcb->p_hcit_rcv_acl) { GKI_freebuf(p_lcb->p_hcit_rcv_acl); p_lcb->p_hcit_rcv_acl = NULL; } #if BTM_SCO_INCLUDED == TRUE #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_BR_EDR) + if (p_lcb->transport == BT_TRANSPORT_BR_EDR) #endif /* Release all SCO links */ btm_remove_sco_links(p_lcb->remote_bd_addr); #endif - if (p_lcb->sent_not_acked > 0) - { + if (p_lcb->sent_not_acked > 0) { #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { l2cb.controller_le_xmit_window += p_lcb->sent_not_acked; - if (l2cb.controller_le_xmit_window > l2cb.num_lm_ble_bufs) - { + if (l2cb.controller_le_xmit_window > l2cb.num_lm_ble_bufs) { l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs; } - } - else + } else #endif { l2cb.controller_xmit_window += p_lcb->sent_not_acked; - if (l2cb.controller_xmit_window > l2cb.num_lm_acl_bufs) - { + if (l2cb.controller_xmit_window > l2cb.num_lm_acl_bufs) { l2cb.controller_xmit_window = l2cb.num_lm_acl_bufs; } } @@ -174,8 +163,9 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) #if (BLE_INCLUDED == TRUE) // Reset BLE connecting flag only if the address matches - if (!memcmp(l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN)) + if (!memcmp(l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN)) { l2cb.is_ble_connecting = FALSE; + } #endif #if (L2CAP_NUM_FIXED_CHNLS > 0) @@ -183,8 +173,7 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) #endif /* Ensure no CCBs left on this LCB */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb) { l2cu_release_ccb (p_ccb); } @@ -197,8 +186,7 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) #endif /* Release any held buffers */ - if (p_lcb->link_xmit_data_q) - { + if (p_lcb->link_xmit_data_q) { while (!list_is_empty(p_lcb->link_xmit_data_q)) { BT_HDR *p_buf = list_front(p_lcb->link_xmit_data_q); list_remove(p_lcb->link_xmit_data_q, p_buf); @@ -215,25 +203,24 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) #if BLE_INCLUDED == TRUE /* Re-adjust flow control windows make sure it does not go negative */ - if (p_lcb->transport == BT_TRANSPORT_LE) - { - if (l2cb.num_ble_links_active >= 1) + if (p_lcb->transport == BT_TRANSPORT_LE) { + if (l2cb.num_ble_links_active >= 1) { l2cb.num_ble_links_active--; + } l2c_ble_link_adjust_allocation(); - } - else + } else #endif { - if (l2cb.num_links_active >= 1) + if (l2cb.num_links_active >= 1) { l2cb.num_links_active--; + } l2c_link_adjust_allocation(); } /* Check for ping outstanding */ - if (p_lcb->p_echo_rsp_cb) - { + if (p_lcb->p_echo_rsp_cb) { tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb; /* Zero out the callback in case app immediately calls us again */ @@ -259,14 +246,12 @@ tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport) int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { if ((p_lcb->in_use) && #if BLE_INCLUDED == TRUE - p_lcb->transport == transport && + p_lcb->transport == transport && #endif - (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN))) - { + (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN))) { return (p_lcb); } } @@ -306,8 +291,7 @@ UINT8 l2cu_get_conn_role (tL2C_LCB *p_this_lcb) *******************************************************************************/ BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb) { - switch(cmd_code) - { + switch (cmd_code) { case L2CAP_CMD_CONN_REQ: case L2CAP_CMD_CONFIG_REQ: case L2CAP_CMD_DISC_REQ: @@ -339,8 +323,7 @@ BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id) BT_HDR *p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID); UINT8 *p; - if (!p_buf) - { + if (!p_buf) { return (NULL); } @@ -350,11 +333,9 @@ BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id) /* Put in HCI header - handle + pkt boundary */ #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT))); - } - else + } else #endif { #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) @@ -368,14 +349,12 @@ BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id) UINT16_TO_STREAM (p, len + L2CAP_CMD_OVERHEAD); #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { //counter_add("l2cap.ble.tx.bytes", p_buf->len); //counter_add("l2cap.ble.tx.pkts", 1); UINT16_TO_STREAM (p, L2CAP_BLE_SIGNALLING_CID); - } - else + } else #endif { //counter_add("l2cap.sig.tx.bytes", p_buf->len); @@ -403,8 +382,7 @@ BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id) *******************************************************************************/ void l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask) { - if ((adj_mask & L2CAP_ADJ_ZERO_ID) && !p_lcb->id) - { + if ((adj_mask & L2CAP_ADJ_ZERO_ID) && !p_lcb->id) { p_lcb->id++; } } @@ -427,29 +405,31 @@ void l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id, UINT8 *p; /* Put in L2CAP packet header */ - if (reason == L2CAP_CMD_REJ_MTU_EXCEEDED) + if (reason == L2CAP_CMD_REJ_MTU_EXCEEDED) { param_len = 2; - else if (reason == L2CAP_CMD_REJ_INVALID_CID) + } else if (reason == L2CAP_CMD_REJ_INVALID_CID) { param_len = 4; - else + } else { param_len = 0; + } - if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL ) - { + if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL ) { L2CAP_TRACE_WARNING ("L2CAP - no buffer cmd_rej"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, reason); - if (param_len >= 2) + if (param_len >= 2) { UINT16_TO_STREAM (p, p1); + } - if (param_len >= 4) + if (param_len >= 4) { UINT16_TO_STREAM (p, p2); + } l2c_link_check_send_pkts (p_lcb, NULL, p_buf); } @@ -477,13 +457,12 @@ void l2cu_send_peer_connect_req (tL2C_CCB *p_ccb) p_ccb->local_id = p_ccb->p_lcb->id; if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ, - p_ccb->local_id)) == NULL) - { + p_ccb->local_id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req"); return; } - p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + + p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, p_ccb->p_rcb->real_psm); @@ -508,22 +487,21 @@ void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status) BT_HDR *p_buf; UINT8 *p; - if (result == L2CAP_CONN_PENDING) - { + if (result == L2CAP_CONN_PENDING) { /* if we already sent pending response */ - if (p_ccb->flags & CCB_FLAG_SENT_PENDING) + if (p_ccb->flags & CCB_FLAG_SENT_PENDING) { return; - else + } else { p_ccb->flags |= CCB_FLAG_SENT_PENDING; + } } - if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_rsp"); return; } - p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + + p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, p_ccb->local_cid); @@ -551,13 +529,12 @@ void l2cu_reject_connection (tL2C_LCB *p_lcb, UINT16 remote_cid, UINT8 rem_id, U BT_HDR *p_buf; UINT8 *p; - if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL ) - { + if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL ) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req"); return; } - p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, 0); /* Local CID of 0 */ UINT16_TO_STREAM (p, remote_cid); @@ -580,7 +557,7 @@ void l2cu_reject_connection (tL2C_LCB *p_lcb, UINT16 remote_cid, UINT8 rem_id, U void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) { BT_HDR *p_buf; - UINT16 cfg_len=0; + UINT16 cfg_len = 0; UINT8 *p; /* Create an identifier for this packet */ @@ -589,47 +566,49 @@ void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) p_ccb->local_id = p_ccb->p_lcb->id; - if (p_cfg->mtu_present) + if (p_cfg->mtu_present) { cfg_len += L2CAP_CFG_MTU_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->flush_to_present) + } + if (p_cfg->flush_to_present) { cfg_len += L2CAP_CFG_FLUSH_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->qos_present) + } + if (p_cfg->qos_present) { cfg_len += L2CAP_CFG_QOS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->fcr_present) + } + if (p_cfg->fcr_present) { cfg_len += L2CAP_CFG_FCR_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->fcs_present) + } + if (p_cfg->fcs_present) { cfg_len += L2CAP_CFG_FCS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->ext_flow_spec_present) + } + if (p_cfg->ext_flow_spec_present) { cfg_len += L2CAP_CFG_EXT_FLOW_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; + } if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len), - L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL ) - { + L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL ) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, p_ccb->remote_cid); UINT16_TO_STREAM (p, p_cfg->flags); /* Flags (continuation) */ /* Now, put the options */ - if (p_cfg->mtu_present) - { + if (p_cfg->mtu_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_MTU); UINT8_TO_STREAM (p, L2CAP_CFG_MTU_OPTION_LEN); UINT16_TO_STREAM (p, p_cfg->mtu); } - if (p_cfg->flush_to_present) - { + if (p_cfg->flush_to_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_FLUSH_TOUT); UINT8_TO_STREAM (p, L2CAP_CFG_FLUSH_OPTION_LEN); UINT16_TO_STREAM (p, p_cfg->flush_to); } - if (p_cfg->qos_present) - { + if (p_cfg->qos_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_QOS); UINT8_TO_STREAM (p, L2CAP_CFG_QOS_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->qos.qos_flags); @@ -640,8 +619,7 @@ void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT32_TO_STREAM (p, p_cfg->qos.latency); UINT32_TO_STREAM (p, p_cfg->qos.delay_variation); } - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_FCR); UINT8_TO_STREAM (p, L2CAP_CFG_FCR_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->fcr.mode); @@ -652,15 +630,13 @@ void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT16_TO_STREAM (p, p_cfg->fcr.mps); } - if (p_cfg->fcs_present) - { + if (p_cfg->fcs_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_FCS); UINT8_TO_STREAM (p, L2CAP_CFG_FCS_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->fcs); } - if (p_cfg->ext_flow_spec_present) - { + if (p_cfg->ext_flow_spec_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_EXT_FLOW); UINT8_TO_STREAM (p, L2CAP_CFG_EXT_FLOW_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->ext_flow_spec.id); @@ -691,45 +667,46 @@ void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT8 *p; /* Create an identifier for this packet */ - if (p_cfg->mtu_present) + if (p_cfg->mtu_present) { cfg_len += L2CAP_CFG_MTU_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->flush_to_present) + } + if (p_cfg->flush_to_present) { cfg_len += L2CAP_CFG_FLUSH_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->qos_present) + } + if (p_cfg->qos_present) { cfg_len += L2CAP_CFG_QOS_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->fcr_present) + } + if (p_cfg->fcr_present) { cfg_len += L2CAP_CFG_FCR_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; - if (p_cfg->ext_flow_spec_present) + } + if (p_cfg->ext_flow_spec_present) { cfg_len += L2CAP_CFG_EXT_FLOW_OPTION_LEN + L2CAP_CFG_OPTION_OVERHEAD; + } if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len), - L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL ) - { + L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL ) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req"); return; } - p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, p_ccb->remote_cid); UINT16_TO_STREAM (p, p_cfg->flags); /* Flags (continuation) Must match request */ UINT16_TO_STREAM (p, p_cfg->result); /* Now, put the options */ - if (p_cfg->mtu_present) - { + if (p_cfg->mtu_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_MTU); UINT8_TO_STREAM (p, L2CAP_CFG_MTU_OPTION_LEN); UINT16_TO_STREAM (p, p_cfg->mtu); } - if (p_cfg->flush_to_present) - { + if (p_cfg->flush_to_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_FLUSH_TOUT); UINT8_TO_STREAM (p, L2CAP_CFG_FLUSH_OPTION_LEN); UINT16_TO_STREAM (p, p_cfg->flush_to); } - if (p_cfg->qos_present) - { + if (p_cfg->qos_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_QOS); UINT8_TO_STREAM (p, L2CAP_CFG_QOS_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->qos.qos_flags); @@ -740,8 +717,7 @@ void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT32_TO_STREAM (p, p_cfg->qos.latency); UINT32_TO_STREAM (p, p_cfg->qos.delay_variation); } - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_FCR); UINT8_TO_STREAM (p, L2CAP_CFG_FCR_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->fcr.mode); @@ -752,8 +728,7 @@ void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT16_TO_STREAM (p, p_cfg->fcr.mps); } - if (p_cfg->ext_flow_spec_present) - { + if (p_cfg->ext_flow_spec_present) { UINT8_TO_STREAM (p, L2CAP_CFG_TYPE_EXT_FLOW); UINT8_TO_STREAM (p, L2CAP_CFG_EXT_FLOW_OPTION_LEN); UINT8_TO_STREAM (p, p_cfg->ext_flow_spec.id); @@ -789,16 +764,14 @@ void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, len = BT_HDR_SIZE + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD + L2CAP_CONFIG_RSP_LEN; len1 = 0xFFFF - len; - if (rej_len > len1) - { + if (rej_len > len1) { L2CAP_TRACE_ERROR ("L2CAP - cfg_rej pkt size exceeds buffer design max limit."); return; } p_buf = (BT_HDR *)GKI_getbuf (len + rej_len); - if (!p_buf) - { + if (!p_buf) { L2CAP_TRACE_ERROR ("L2CAP - no buffer for cfg_rej"); return; } @@ -808,11 +781,9 @@ void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, /* Put in HCI header - handle + pkt boundary */ #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) - if (HCI_NON_FLUSHABLE_PB_SUPPORTED(BTM_ReadLocalFeatures ())) - { + if (HCI_NON_FLUSHABLE_PB_SUPPORTED(BTM_ReadLocalFeatures ())) { UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT))); - } - else + } else #endif { UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT))); @@ -840,48 +811,40 @@ void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, /* Now, put the rejected options */ p_data_end = p_data + data_len; - while (p_data < p_data_end) - { + while (p_data < p_data_end) { cfg_code = *p_data; cfg_len = *(p_data + 1); - switch (cfg_code & 0x7F) - { - /* skip known options */ - case L2CAP_CFG_TYPE_MTU: - case L2CAP_CFG_TYPE_FLUSH_TOUT: - case L2CAP_CFG_TYPE_QOS: - p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; - break; + switch (cfg_code & 0x7F) { + /* skip known options */ + case L2CAP_CFG_TYPE_MTU: + case L2CAP_CFG_TYPE_FLUSH_TOUT: + case L2CAP_CFG_TYPE_QOS: + p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; + break; - /* unknown options; copy into rsp if not hints */ - default: - /* sanity check option length */ - if ((cfg_len + L2CAP_CFG_OPTION_OVERHEAD) <= data_len) - { - if ((cfg_code & 0x80) == 0) - { - if (buf_space >= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD)) - { - memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD); - p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; - buf_space -= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD); - } - else - { - L2CAP_TRACE_WARNING("L2CAP - cfg_rej exceeds allocated buffer"); - p_data = p_data_end; /* force loop exit */ - break; - } + /* unknown options; copy into rsp if not hints */ + default: + /* sanity check option length */ + if ((cfg_len + L2CAP_CFG_OPTION_OVERHEAD) <= data_len) { + if ((cfg_code & 0x80) == 0) { + if (buf_space >= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD)) { + memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD); + p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; + buf_space -= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD); + } else { + L2CAP_TRACE_WARNING("L2CAP - cfg_rej exceeds allocated buffer"); + p_data = p_data_end; /* force loop exit */ + break; } - p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; } - /* bad length; force loop exit */ - else - { - p_data = p_data_end; - } - break; + p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD; + } + /* bad length; force loop exit */ + else { + p_data = p_data_end; + } + break; } } @@ -891,7 +854,7 @@ void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, p_buf->len = len + 4; L2CAP_TRACE_DEBUG ("L2CAP - cfg_rej pkt hci_len=%d, l2cap_len=%d", - len, (L2CAP_CMD_OVERHEAD+L2CAP_CONFIG_RSP_LEN+rej_len)); + len, (L2CAP_CMD_OVERHEAD + L2CAP_CONFIG_RSP_LEN + rej_len)); l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf); } @@ -917,8 +880,7 @@ void l2cu_send_peer_disc_req (tL2C_CCB *p_ccb) p_ccb->local_id = p_ccb->p_lcb->id; - if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_req"); return; } @@ -931,10 +893,8 @@ void l2cu_send_peer_disc_req (tL2C_CCB *p_ccb) /* Move all queued data packets to the LCB. In FCR mode, assume the higher layer checks that all buffers are sent before disconnecting. */ - if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) - { - while (GKI_getfirst(&p_ccb->xmit_hold_q)) - { + if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) { + while (GKI_getfirst(&p_ccb->xmit_hold_q)) { p_buf2 = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q); l2cu_set_acl_hci_header (p_buf2, p_ccb); l2c_link_check_send_pkts (p_ccb->p_lcb, p_ccb, p_buf2); @@ -965,8 +925,7 @@ void l2cu_send_peer_disc_rsp (tL2C_LCB *p_lcb, UINT8 remote_id, UINT16 local_cid BT_HDR *p_buf; UINT8 *p; - if ((p_buf=l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_rsp"); return; } @@ -999,16 +958,14 @@ void l2cu_send_peer_echo_req (tL2C_LCB *p_lcb, UINT8 *p_data, UINT16 data_len) p_lcb->id++; l2cu_adj_id(p_lcb, L2CAP_ADJ_ZERO_ID); /* check for wrap to '0' */ - if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_req"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; - if (data_len) - { + if (data_len) { ARRAY_TO_STREAM (p, p_data, data_len); } @@ -1032,17 +989,15 @@ void l2cu_send_peer_echo_rsp (tL2C_LCB *p_lcb, UINT8 id, UINT8 *p_data, UINT16 d UINT8 *p; UINT16 maxlen; /* Filter out duplicate IDs or if available buffers are low (intruder checking) */ - if (!id || id == p_lcb->cur_echo_id) - { + if (!id || id == p_lcb->cur_echo_id) { /* Dump this request since it is illegal */ L2CAP_TRACE_WARNING ("L2CAP ignoring duplicate echo request (%d)", id); return; - } - else + } else { p_lcb->cur_echo_id = id; - /* Don't respond if we more than 10% of our buffers are used */ - if (GKI_poolutilization (L2CAP_CMD_POOL_ID) > 10) - { + } + /* Don't respond if we more than 10% of our buffers are used */ + if (GKI_poolutilization (L2CAP_CMD_POOL_ID) > 10) { L2CAP_TRACE_WARNING ("L2CAP gki pool used up to more than 10%%, ignore echo response"); return; } @@ -1051,24 +1006,23 @@ void l2cu_send_peer_echo_rsp (tL2C_LCB *p_lcb, UINT8 id, UINT8 *p_data, UINT16 d uint16_t acl_packet_size = controller_get_interface()->get_acl_packet_size_classic(); /* Don't return data if it does not fit in ACL and L2CAP MTU */ maxlen = (GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID) > acl_packet_size) ? - acl_data_size : (UINT16)GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID); + acl_data_size : (UINT16)GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID); maxlen -= (UINT16)(BT_HDR_SIZE + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + - L2CAP_CMD_OVERHEAD + L2CAP_ECHO_RSP_LEN); + L2CAP_CMD_OVERHEAD + L2CAP_ECHO_RSP_LEN); - if (data_len > maxlen) + if (data_len > maxlen) { data_len = 0; + } - if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL) - { + if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_rsp"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; - if (data_len) - { + if (data_len) { ARRAY_TO_STREAM (p, p_data, data_len); } @@ -1093,15 +1047,14 @@ void l2cu_send_peer_info_req (tL2C_LCB *p_lcb, UINT16 info_type) p_lcb->id++; l2cu_adj_id(p_lcb, L2CAP_ADJ_ID); - if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_req"); return; } L2CAP_TRACE_EVENT ("l2cu_send_peer_info_req: type 0x%04x", info_type); - p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE + + p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, info_type); @@ -1131,97 +1084,86 @@ void l2cu_send_peer_info_rsp (tL2C_LCB *p_lcb, UINT8 remote_id, UINT16 info_type #if (L2CAP_CONFORMANCE_TESTING == TRUE) if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE) - && (l2cb.test_info_resp & (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE | - L2CAP_EXTFEA_NO_CRC | L2CAP_EXTFEA_EXT_FLOW_SPEC | - L2CAP_EXTFEA_FIXED_CHNLS | L2CAP_EXTFEA_EXT_WINDOW | - L2CAP_EXTFEA_UCD_RECEPTION )) ) + && (l2cb.test_info_resp & (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE | + L2CAP_EXTFEA_NO_CRC | L2CAP_EXTFEA_EXT_FLOW_SPEC | + L2CAP_EXTFEA_FIXED_CHNLS | L2CAP_EXTFEA_EXT_WINDOW | + L2CAP_EXTFEA_UCD_RECEPTION )) ) #else if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE) - && (L2CAP_EXTFEA_SUPPORTED_MASK & (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE | - L2CAP_EXTFEA_NO_CRC |L2CAP_EXTFEA_FIXED_CHNLS | - L2CAP_EXTFEA_UCD_RECEPTION )) ) + && (L2CAP_EXTFEA_SUPPORTED_MASK & (L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE | + L2CAP_EXTFEA_NO_CRC | L2CAP_EXTFEA_FIXED_CHNLS | + L2CAP_EXTFEA_UCD_RECEPTION )) ) #endif { len += L2CAP_EXTENDED_FEATURES_ARRAY_SIZE; - } - else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) - { + } else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) { len += L2CAP_FIXED_CHNL_ARRAY_SIZE; - } - else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) - { + } else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) { len += L2CAP_CONNLESS_MTU_INFO_SIZE; } - if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL) - { + if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_rsp"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, info_type); #if (L2CAP_CONFORMANCE_TESTING == TRUE) if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE) - && (l2cb.test_info_resp & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE - | L2CAP_EXTFEA_UCD_RECEPTION )) ) + && (l2cb.test_info_resp & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE + | L2CAP_EXTFEA_UCD_RECEPTION )) ) #else if ((info_type == L2CAP_EXTENDED_FEATURES_INFO_TYPE) - && (L2CAP_EXTFEA_SUPPORTED_MASK & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE - | L2CAP_EXTFEA_UCD_RECEPTION )) ) + && (L2CAP_EXTFEA_SUPPORTED_MASK & ( L2CAP_EXTFEA_ENH_RETRANS | L2CAP_EXTFEA_STREAM_MODE + | L2CAP_EXTFEA_UCD_RECEPTION )) ) #endif { UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS); #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_lcb->transport == BT_TRANSPORT_LE) { /* optional data are not added for now */ UINT32_TO_STREAM (p, L2CAP_BLE_EXTFEA_MASK); - } - else + } else #endif { #if L2CAP_CONFORMANCE_TESTING == TRUE - UINT32_TO_STREAM (p, l2cb.test_info_resp); + UINT32_TO_STREAM (p, l2cb.test_info_resp); #else #if (L2CAP_NUM_FIXED_CHNLS > 0) - UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK | L2CAP_EXTFEA_FIXED_CHNLS); + UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK | L2CAP_EXTFEA_FIXED_CHNLS); #else - UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK); + UINT32_TO_STREAM (p, L2CAP_EXTFEA_SUPPORTED_MASK); #endif #endif } - } - else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) - { + } else if (info_type == L2CAP_FIXED_CHANNELS_INFO_TYPE) { UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS); memset (p, 0, L2CAP_FIXED_CHNL_ARRAY_SIZE); p[0] = L2CAP_FIXED_CHNL_SIG_BIT; - if ( L2CAP_EXTFEA_SUPPORTED_MASK & L2CAP_EXTFEA_UCD_RECEPTION ) - p[0] |= L2CAP_FIXED_CHNL_CNCTLESS_BIT; + if ( L2CAP_EXTFEA_SUPPORTED_MASK & L2CAP_EXTFEA_UCD_RECEPTION ) { + p[0] |= L2CAP_FIXED_CHNL_CNCTLESS_BIT; + } #if (L2CAP_NUM_FIXED_CHNLS > 0) { int xx; for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) - p[(xx + L2CAP_FIRST_FIXED_CHNL) / 8] |= 1 << ((xx + L2CAP_FIRST_FIXED_CHNL) % 8); + if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) { + p[(xx + L2CAP_FIRST_FIXED_CHNL) / 8] |= 1 << ((xx + L2CAP_FIRST_FIXED_CHNL) % 8); + } } #endif - } - else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) - { + } else if (info_type == L2CAP_CONNLESS_MTU_INFO_TYPE) { UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS); UINT16_TO_STREAM (p, L2CAP_UCD_MTU); - } - else - { + } else { UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_NOT_SUPPORTED); /* 'not supported' */ } @@ -1245,39 +1187,35 @@ void l2cu_enqueue_ccb (tL2C_CCB *p_ccb) /* Find out which queue the channel is on */ - if (p_ccb->p_lcb != NULL) + if (p_ccb->p_lcb != NULL) { p_q = &p_ccb->p_lcb->ccb_queue; + } - if ( (!p_ccb->in_use) || (p_q == NULL) ) - { + if ( (!p_ccb->in_use) || (p_q == NULL) ) { L2CAP_TRACE_ERROR ("l2cu_enqueue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x", - p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb); + p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb); return; } L2CAP_TRACE_DEBUG ("l2cu_enqueue_ccb CID: 0x%04x priority: %d", - p_ccb->local_cid, p_ccb->ccb_priority); + p_ccb->local_cid, p_ccb->ccb_priority); /* If the queue is empty, we go at the front */ - if (!p_q->p_first_ccb) - { + if (!p_q->p_first_ccb) { p_q->p_first_ccb = p_q->p_last_ccb = p_ccb; p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL; - } - else - { + } else { p_ccb1 = p_q->p_first_ccb; - while (p_ccb1 != NULL) - { + while (p_ccb1 != NULL) { /* Insert new ccb at the end of the same priority. Lower number, higher priority */ - if (p_ccb->ccb_priority < p_ccb1->ccb_priority) - { + if (p_ccb->ccb_priority < p_ccb1->ccb_priority) { /* Are we at the head of the queue ? */ - if (p_ccb1 == p_q->p_first_ccb) + if (p_ccb1 == p_q->p_first_ccb) { p_q->p_first_ccb = p_ccb; - else + } else { p_ccb1->p_prev_ccb->p_next_ccb = p_ccb; + } p_ccb->p_next_ccb = p_ccb1; p_ccb->p_prev_ccb = p_ccb1->p_prev_ccb; @@ -1289,8 +1227,7 @@ void l2cu_enqueue_ccb (tL2C_CCB *p_ccb) } /* If we are lower then anyone in the list, we go at the end */ - if (!p_ccb1) - { + if (!p_ccb1) { /* add new ccb at the end of the list */ p_q->p_last_ccb->p_next_ccb = p_ccb; @@ -1302,16 +1239,14 @@ void l2cu_enqueue_ccb (tL2C_CCB *p_ccb) #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) /* Adding CCB into round robin service table of its LCB */ - if (p_ccb->p_lcb != NULL) - { + if (p_ccb->p_lcb != NULL) { /* if this is the first channel in this priority group */ - if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 ) - { - /* Set the first channel to this CCB */ + if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 ) { + /* Set the first channel to this CCB */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb; - /* Set the next serving channel in this group to this CCB */ + /* Set the next serving channel in this group to this CCB */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb; - /* Initialize quota of this priority group based on its priority */ + /* Initialize quota of this priority group based on its priority */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority); } /* increase number of channels in this group */ @@ -1338,39 +1273,33 @@ void l2cu_dequeue_ccb (tL2C_CCB *p_ccb) /* Find out which queue the channel is on */ - if (p_ccb->p_lcb != NULL) + if (p_ccb->p_lcb != NULL) { p_q = &p_ccb->p_lcb->ccb_queue; + } - if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) ) - { + if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) ) { L2CAP_TRACE_ERROR ("l2cu_dequeue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x p_q: 0x%08x p_q->p_first_ccb: 0x%08x", - p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0); + p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0); return; } #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) /* Removing CCB from round robin service table of its LCB */ - if (p_ccb->p_lcb != NULL) - { + if (p_ccb->p_lcb != NULL) { /* decrease number of channels in this priority group */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb--; /* if it was the last channel in the priority group */ - if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 ) - { + if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 ) { p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL; p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL; - } - else - { + } else { /* if it is the first channel of this group */ - if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb ) - { + if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb ) { p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb->p_next_ccb; } /* if it is the next serving channel of this group */ - if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb ) - { + if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb ) { /* simply, start serving from the first channel */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb; @@ -1379,24 +1308,20 @@ void l2cu_dequeue_ccb (tL2C_CCB *p_ccb) } #endif - if (p_ccb == p_q->p_first_ccb) - { + if (p_ccb == p_q->p_first_ccb) { /* We are removing the first in a queue */ p_q->p_first_ccb = p_ccb->p_next_ccb; - if (p_q->p_first_ccb) + if (p_q->p_first_ccb) { p_q->p_first_ccb->p_prev_ccb = NULL; - else + } else { p_q->p_last_ccb = NULL; - } - else if (p_ccb == p_q->p_last_ccb) - { + } + } else if (p_ccb == p_q->p_last_ccb) { /* We are removing the last in a queue */ p_q->p_last_ccb = p_ccb->p_prev_ccb; p_q->p_last_ccb->p_next_ccb = NULL; - } - else - { + } else { /* In the middle of a chain. */ p_ccb->p_prev_ccb->p_next_ccb = p_ccb->p_next_ccb; p_ccb->p_next_ccb->p_prev_ccb = p_ccb->p_prev_ccb; @@ -1416,11 +1341,9 @@ void l2cu_dequeue_ccb (tL2C_CCB *p_ccb) *******************************************************************************/ void l2cu_change_pri_ccb (tL2C_CCB *p_ccb, tL2CAP_CHNL_PRIORITY priority) { - if (p_ccb->ccb_priority != priority) - { + if (p_ccb->ccb_priority != priority) { /* If CCB is not the only guy on the queue */ - if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) ) - { + if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) ) { L2CAP_TRACE_DEBUG ("Update CCB list in logical link"); /* Remove CCB from queue and re-queue it at new priority */ @@ -1430,9 +1353,8 @@ void l2cu_change_pri_ccb (tL2C_CCB *p_ccb, tL2CAP_CHNL_PRIORITY priority) l2cu_enqueue_ccb (p_ccb); } #if (L2CAP_ROUND_ROBIN_CHANNEL_SERVICE == TRUE) - else - { - /* If CCB is the only guy on the queue, no need to re-enqueue */ + else { + /* If CCB is the only guy on the queue, no need to re-enqueue */ /* update only round robin service data */ p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 0; p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL; @@ -1467,39 +1389,34 @@ tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid) L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x", cid); - if (!l2cb.p_free_ccb_first) + if (!l2cb.p_free_ccb_first) { return (NULL); + } /* If a CID was passed in, use that, else take the first free one */ - if (cid == 0) - { + if (cid == 0) { p_ccb = l2cb.p_free_ccb_first; l2cb.p_free_ccb_first = p_ccb->p_next_ccb; - } - else - { + } else { p_prev = NULL; p_ccb = &l2cb.ccb_pool[cid - L2CAP_BASE_APPL_CID]; - if (p_ccb == l2cb.p_free_ccb_first) + if (p_ccb == l2cb.p_free_ccb_first) { l2cb.p_free_ccb_first = p_ccb->p_next_ccb; - else - { - for (p_prev = l2cb.p_free_ccb_first; p_prev != NULL; p_prev = p_prev->p_next_ccb) - { - if (p_prev->p_next_ccb == p_ccb) - { + } else { + for (p_prev = l2cb.p_free_ccb_first; p_prev != NULL; p_prev = p_prev->p_next_ccb) { + if (p_prev->p_next_ccb == p_ccb) { p_prev->p_next_ccb = p_ccb->p_next_ccb; - if (p_ccb == l2cb.p_free_ccb_last) + if (p_ccb == l2cb.p_free_ccb_last) { l2cb.p_free_ccb_last = p_prev; + } break; } } - if (p_prev == NULL) - { + if (p_prev == NULL) { L2CAP_TRACE_ERROR ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid); return NULL; } @@ -1520,8 +1437,9 @@ tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid) /* Set priority then insert ccb into LCB queue (if we have an LCB) */ p_ccb->ccb_priority = L2CAP_CHNL_PRIORITY_LOW; - if (p_lcb) + if (p_lcb) { l2cu_enqueue_ccb (p_ccb); + } /* clear what peer wants to configure */ p_ccb->peer_cfg_bits = 0; @@ -1547,17 +1465,19 @@ tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid) p_ccb->fcrb.ack_timer.param = (TIMER_PARAM_TYPE)p_ccb; /* if timer is running, remove it from timer list */ - if (p_ccb->fcrb.ack_timer.in_use) + if (p_ccb->fcrb.ack_timer.in_use) { btu_stop_quick_timer (&p_ccb->fcrb.ack_timer); + } p_ccb->fcrb.mon_retrans_timer.param = (TIMER_PARAM_TYPE)p_ccb; // btla-specific ++ - /* CSP408639 Fix: When L2CAP send amp move channel request or receive - * L2CEVT_AMP_MOVE_REQ do following sequence. Send channel move - * request -> Stop retrans/monitor timer -> Change channel state to CST_AMP_MOVING. */ - if (p_ccb->fcrb.mon_retrans_timer.in_use) - btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer); + /* CSP408639 Fix: When L2CAP send amp move channel request or receive + * L2CEVT_AMP_MOVE_REQ do following sequence. Send channel move + * request -> Stop retrans/monitor timer -> Change channel state to CST_AMP_MOVING. */ + if (p_ccb->fcrb.mon_retrans_timer.in_use) { + btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer); + } // btla-specific -- l2c_fcr_stop_timer (p_ccb); @@ -1577,10 +1497,9 @@ tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid) p_ccb->buff_quota = 2; /* This gets set after config */ /* If CCB was reserved Config_Done can already have some value */ - if (cid == 0) + if (cid == 0) { p_ccb->config_done = 0; - else - { + } else { L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done); } @@ -1619,35 +1538,33 @@ BOOLEAN l2cu_start_post_bond_timer (UINT16 handle) UINT16 timeout; tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle); - if (!p_lcb) + if (!p_lcb) { return (TRUE); + } p_lcb->is_bonding = FALSE; /* Only start timer if no control blocks allocated */ - if (p_lcb->ccb_queue.p_first_ccb != NULL) + if (p_lcb->ccb_queue.p_first_ccb != NULL) { return (FALSE); + } /* If no channels on the connection, start idle timeout */ - if ( (p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_DISCONNECTING) ) - { - if (p_lcb->idle_timeout == 0) - { - if (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) - { + if ( (p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_CONNECTING) || (p_lcb->link_state == LST_DISCONNECTING) ) { + if (p_lcb->idle_timeout == 0) { + if (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) { p_lcb->link_state = LST_DISCONNECTING; timeout = L2CAP_LINK_DISCONNECT_TOUT; - } - else + } else { timeout = BT_1SEC_TIMEOUT; - } - else - { + } + } else { timeout = L2CAP_BONDING_TIMEOUT; } - if (timeout != 0xFFFF) + if (timeout != 0xFFFF) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout); + } return (TRUE); } @@ -1674,16 +1591,15 @@ void l2cu_release_ccb (tL2C_CCB *p_ccb) L2CAP_TRACE_DEBUG ("l2cu_release_ccb: cid 0x%04x in_use: %u", p_ccb->local_cid, p_ccb->in_use); /* If already released, could be race condition */ - if (!p_ccb->in_use) + if (!p_ccb->in_use) { return; + } - if (p_rcb && (p_rcb->psm != p_rcb->real_psm)) - { + if (p_rcb && (p_rcb->psm != p_rcb->real_psm)) { btm_sec_clr_service_by_psm(p_rcb->psm); } - if (p_ccb->should_free_rcb) - { + if (p_ccb->should_free_rcb) { osi_free(p_rcb); p_ccb->p_rcb = NULL; p_ccb->should_free_rcb = false; @@ -1694,20 +1610,20 @@ void l2cu_release_ccb (tL2C_CCB *p_ccb) /* Stop the timer */ btu_stop_timer (&p_ccb->timer_entry); - while (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) + while (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { GKI_freebuf (GKI_dequeue (&p_ccb->xmit_hold_q)); + } l2c_fcr_cleanup (p_ccb); /* Channel may not be assigned to any LCB if it was just pre-reserved */ if ( (p_lcb) && - ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID) + ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID) #if (L2CAP_UCD_INCLUDED == TRUE) - ||(p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID) + || (p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID) #endif - ) - ) - { + ) + ) { l2cu_dequeue_ccb (p_ccb); /* Delink the CCB from the LCB */ @@ -1715,15 +1631,12 @@ void l2cu_release_ccb (tL2C_CCB *p_ccb) } /* Put the CCB back on the free pool */ - if (!l2cb.p_free_ccb_first) - { + if (!l2cb.p_free_ccb_first) { l2cb.p_free_ccb_first = p_ccb; l2cb.p_free_ccb_last = p_ccb; p_ccb->p_next_ccb = NULL; p_ccb->p_prev_ccb = NULL; - } - else - { + } else { p_ccb->p_next_ccb = NULL; p_ccb->p_prev_ccb = l2cb.p_free_ccb_last; l2cb.p_free_ccb_last->p_next_ccb = p_ccb; @@ -1734,14 +1647,10 @@ void l2cu_release_ccb (tL2C_CCB *p_ccb) p_ccb->in_use = FALSE; /* If no channels on the connection, start idle timeout */ - if ((p_lcb) && p_lcb->in_use && (p_lcb->link_state == LST_CONNECTED)) - { - if (!p_lcb->ccb_queue.p_first_ccb) - { + if ((p_lcb) && p_lcb->in_use && (p_lcb->link_state == LST_CONNECTED)) { + if (!p_lcb->ccb_queue.p_first_ccb) { l2cu_no_dynamic_ccbs (p_lcb); - } - else - { + } else { /* Link is still active, adjust channel quotas. */ l2c_link_adjust_chnl_allocation (); } @@ -1763,15 +1672,13 @@ tL2C_CCB *l2cu_find_ccb_by_remote_cid (tL2C_LCB *p_lcb, UINT16 remote_cid) tL2C_CCB *p_ccb; /* If LCB is NULL, look through all active links */ - if (!p_lcb) - { + if (!p_lcb) { return NULL; - } - else - { + } else { for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - if ((p_ccb->in_use) && (p_ccb->remote_cid == remote_cid)) + if ((p_ccb->in_use) && (p_ccb->remote_cid == remote_cid)) { return (p_ccb); + } } /* If here, no match found */ @@ -1793,10 +1700,8 @@ tL2C_RCB *l2cu_allocate_rcb (UINT16 psm) tL2C_RCB *p_rcb = &l2cb.rcb_pool[0]; UINT16 xx; - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { - if (!p_rcb->in_use) - { + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { + if (!p_rcb->in_use) { p_rcb->in_use = TRUE; p_rcb->psm = psm; #if (L2CAP_UCD_INCLUDED == TRUE) @@ -1839,8 +1744,7 @@ void l2cu_disconnect_chnl (tL2C_CCB *p_ccb) { UINT16 local_cid = p_ccb->local_cid; - if (local_cid >= L2CAP_BASE_APPL_CID) - { + if (local_cid >= L2CAP_BASE_APPL_CID) { tL2CA_DISCONNECT_IND_CB *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb; L2CAP_TRACE_WARNING ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid); @@ -1850,9 +1754,7 @@ void l2cu_disconnect_chnl (tL2C_CCB *p_ccb) l2cu_release_ccb (p_ccb); (*p_disc_cb)(local_cid, FALSE); - } - else - { + } else { /* failure on the AMP channel, probably need to disconnect ACL */ L2CAP_TRACE_ERROR ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid); } @@ -1874,10 +1776,10 @@ tL2C_RCB *l2cu_find_rcb_by_psm (UINT16 psm) tL2C_RCB *p_rcb = &l2cb.rcb_pool[0]; UINT16 xx; - for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) - { - if ((p_rcb->in_use) && (p_rcb->psm == psm)) + for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++) { + if ((p_rcb->in_use) && (p_rcb->psm == psm)) { return (p_rcb); + } } /* If here, no match found */ @@ -1913,86 +1815,72 @@ UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT8 fcr_status; /* Ignore FCR parameters for basic mode */ - if (!p_cfg->fcr_present) + if (!p_cfg->fcr_present) { p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE; + } /* Save the MTU that our peer can receive */ - if (p_cfg->mtu_present) - { + if (p_cfg->mtu_present) { /* Make sure MTU is at least the minimum */ - if (p_cfg->mtu >= L2CAP_MIN_MTU) - { + if (p_cfg->mtu >= L2CAP_MIN_MTU) { /* In basic mode, limit the MTU to our buffer size */ - if ( (p_cfg->fcr_present == FALSE) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) + if ( (p_cfg->fcr_present == FALSE) && (p_cfg->mtu > L2CAP_MTU_SIZE) ) { p_cfg->mtu = L2CAP_MTU_SIZE; + } /* Save the accepted value in case of renegotiation */ p_ccb->peer_cfg.mtu = p_cfg->mtu; p_ccb->peer_cfg.mtu_present = TRUE; p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_MTU; - } - else /* Illegal MTU value */ - { + } else { /* Illegal MTU value */ p_cfg->mtu = L2CAP_MIN_MTU; mtu_ok = FALSE; } } /* Reload mtu from a previously accepted config request */ - else if (p_ccb->peer_cfg.mtu_present) - { + else if (p_ccb->peer_cfg.mtu_present) { p_cfg->mtu_present = TRUE; p_cfg->mtu = p_ccb->peer_cfg.mtu; } /* Verify that the flush timeout is a valid value (0 is illegal) */ - if (p_cfg->flush_to_present) - { - if (!p_cfg->flush_to) - { + if (p_cfg->flush_to_present) { + if (!p_cfg->flush_to) { p_cfg->flush_to = 0xFFFF; /* Infinite retransmissions (spec default) */ flush_to_ok = FALSE; - } - else /* Save the accepted value in case of renegotiation */ - { + } else { /* Save the accepted value in case of renegotiation */ p_ccb->peer_cfg.flush_to_present = TRUE; p_ccb->peer_cfg.flush_to = p_cfg->flush_to; p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO; } } /* Reload flush_to from a previously accepted config request */ - else if (p_ccb->peer_cfg.flush_to_present) - { + else if (p_ccb->peer_cfg.flush_to_present) { p_cfg->flush_to_present = TRUE; p_cfg->flush_to = p_ccb->peer_cfg.flush_to; } /* Save the QOS settings the the peer is using */ - if (p_cfg->qos_present) - { + if (p_cfg->qos_present) { /* Make sure service type is not a reserved value; otherwise let upper layer decide if acceptable */ - if (p_cfg->qos.service_type <= GUARANTEED) - { + if (p_cfg->qos.service_type <= GUARANTEED) { p_ccb->peer_cfg.qos = p_cfg->qos; p_ccb->peer_cfg.qos_present = TRUE; p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_QOS; - } - else /* Illegal service type value */ - { + } else { /* Illegal service type value */ p_cfg->qos.service_type = BEST_EFFORT; qos_type_ok = FALSE; } } /* Reload QOS from a previously accepted config request */ - else if (p_ccb->peer_cfg.qos_present) - { + else if (p_ccb->peer_cfg.qos_present) { p_cfg->qos_present = TRUE; p_cfg->qos = p_ccb->peer_cfg.qos; } - if ((fcr_status = l2c_fcr_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_DISCONNECT) - { + if ((fcr_status = l2c_fcr_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_DISCONNECT) { /* Notify caller to disconnect the channel (incompatible modes) */ p_cfg->result = L2CAP_CFG_FAILED_NO_REASON; p_cfg->mtu_present = p_cfg->qos_present = p_cfg->flush_to_present = 0; @@ -2003,23 +1891,24 @@ UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) fcr_ok = (fcr_status == L2CAP_PEER_CFG_OK); /* Return any unacceptable parameters */ - if (mtu_ok && flush_to_ok && qos_type_ok && fcr_ok) - { + if (mtu_ok && flush_to_ok && qos_type_ok && fcr_ok) { l2cu_adjust_out_mps (p_ccb); return (L2CAP_PEER_CFG_OK); - } - else - { + } else { p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS; - if (mtu_ok) + if (mtu_ok) { p_cfg->mtu_present = FALSE; - if (flush_to_ok) + } + if (flush_to_ok) { p_cfg->flush_to_present = FALSE; - if (qos_type_ok) + } + if (qos_type_ok) { p_cfg->qos_present = FALSE; - if (fcr_ok) + } + if (fcr_ok) { p_cfg->fcr_present = FALSE; + } return (L2CAP_PEER_CFG_UNACCEPTABLE); } @@ -2040,26 +1929,26 @@ UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) void l2cu_process_peer_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) { /* If we wanted QoS and the peer sends us a positive response with QoS, use his values */ - if ( (p_cfg->qos_present) && (p_ccb->our_cfg.qos_present) ) + if ( (p_cfg->qos_present) && (p_ccb->our_cfg.qos_present) ) { p_ccb->our_cfg.qos = p_cfg->qos; + } - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { /* Save the retransmission and monitor timeout values */ - if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE) - { + if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE) { p_ccb->peer_cfg.fcr.rtrans_tout = p_cfg->fcr.rtrans_tout; p_ccb->peer_cfg.fcr.mon_tout = p_cfg->fcr.mon_tout; } /* Calculate the max number of packets for which we can delay sending an ack */ - if (p_cfg->fcr.tx_win_sz < p_ccb->our_cfg.fcr.tx_win_sz) + if (p_cfg->fcr.tx_win_sz < p_ccb->our_cfg.fcr.tx_win_sz) { p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3; - else + } else { p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3; + } L2CAP_TRACE_DEBUG ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d", - p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks); + p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks); } } @@ -2080,43 +1969,39 @@ void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) UINT16 hci_flush_to; /* Save the QOS settings we are using for transmit */ - if (p_cfg->qos_present) - { + if (p_cfg->qos_present) { p_ccb->our_cfg.qos_present = TRUE; p_ccb->our_cfg.qos = p_cfg->qos; } - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { /* Override FCR options if attempting streaming or basic */ - if (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE) + if (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE) { memset(&p_cfg->fcr, 0, sizeof(tL2CAP_FCR_OPTS)); - else - { + } else { /* On BR/EDR, timer values are zero in config request */ /* On class 2 AMP, timer value in config request shall be non-0 processing time */ /* timer value in config response shall be greater than received processing time */ p_cfg->fcr.mon_tout = p_cfg->fcr.rtrans_tout = 0; - if (p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE) + if (p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE) { p_cfg->fcr.max_transmit = p_cfg->fcr.tx_win_sz = 0; + } } /* Set the threshold to send acks (may be updated in the cfg response) */ p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3; /* Include FCS option only if peer can handle it */ - if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC) - { + if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC) { /* FCS check can be bypassed if peer also desires to bypass */ - if (p_cfg->fcs_present && p_cfg->fcs == L2CAP_CFG_FCS_BYPASS) + if (p_cfg->fcs_present && p_cfg->fcs == L2CAP_CFG_FCS_BYPASS) { p_ccb->bypass_fcs |= L2CAP_CFG_FCS_OUR; - } - else + } + } else { p_cfg->fcs_present = FALSE; - } - else - { + } + } else { p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE; } @@ -2125,27 +2010,21 @@ void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) /* Check the flush timeout. If it is lower than the current one used */ /* then we need to adjust the flush timeout sent to the controller */ - if (p_cfg->flush_to_present) - { - if ((p_cfg->flush_to == 0)||(p_cfg->flush_to == L2CAP_NO_AUTOMATIC_FLUSH)) - { + if (p_cfg->flush_to_present) { + if ((p_cfg->flush_to == 0) || (p_cfg->flush_to == L2CAP_NO_AUTOMATIC_FLUSH)) { /* don't send invalid flush timeout */ /* SPEC: The sender of the Request shall specify its flush timeout value */ /* if it differs from the default value of 0xFFFF */ p_cfg->flush_to_present = FALSE; - } - else - { + } else { p_ccb->our_cfg.flush_to = p_cfg->flush_to; p_lcb = p_ccb->p_lcb; - if (p_cfg->flush_to < p_lcb->link_flush_tout) - { + if (p_cfg->flush_to < p_lcb->link_flush_tout) { p_lcb->link_flush_tout = p_cfg->flush_to; /* If the timeout is within range of HCI, set the flush timeout */ - if (p_cfg->flush_to <= ((HCI_MAX_AUTO_FLUSH_TOUT * 5) / 8)) - { + if (p_cfg->flush_to <= ((HCI_MAX_AUTO_FLUSH_TOUT * 5) / 8)) { /* Convert flush timeout to 0.625 ms units, with round */ hci_flush_to = ((p_cfg->flush_to * 8) + 3) / 5; btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to); @@ -2170,10 +2049,11 @@ void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) void l2cu_process_our_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg) { /* If peer wants QoS, we are allowed to change the values in a positive response */ - if ( (p_cfg->qos_present) && (p_ccb->peer_cfg.qos_present) ) + if ( (p_cfg->qos_present) && (p_ccb->peer_cfg.qos_present) ) { p_ccb->peer_cfg.qos = p_cfg->qos; - else + } else { p_cfg->qos_present = FALSE; + } l2c_fcr_adj_our_rsp_options (p_ccb, p_cfg); } @@ -2194,11 +2074,9 @@ void l2cu_device_reset (void) int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->handle != HCI_INVALID_HANDLE)) - { - l2c_link_hci_disc_comp (p_lcb->handle, (UINT8) -1); + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->handle != HCI_INVALID_HANDLE)) { + l2c_link_hci_disc_comp (p_lcb->handle, (UINT8) - 1); } } #if (BLE_INCLUDED == TRUE) @@ -2230,10 +2108,10 @@ BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport) BTM_ReadDevInfo(p_lcb->remote_bd_addr, &dev_type, &addr_type); - if (transport == BT_TRANSPORT_LE) - { - if (!controller_get_interface()->supports_ble()) + if (transport == BT_TRANSPORT_LE) { + if (!controller_get_interface()->supports_ble()) { return FALSE; + } p_lcb->ble_addr_type = addr_type; p_lcb->transport = BT_TRANSPORT_LE; @@ -2244,13 +2122,12 @@ BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport) /* If there is a connection where we perform as a slave, try to switch roles for this connection */ - for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++) - { - if (p_lcb_cur == p_lcb) + for (xx = 0, p_lcb_cur = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb_cur++) { + if (p_lcb_cur == p_lcb) { continue; + } - if ((p_lcb_cur->in_use) && (p_lcb_cur->link_role == HCI_ROLE_SLAVE)) - { + if ((p_lcb_cur->in_use) && (p_lcb_cur->link_role == HCI_ROLE_SLAVE)) { #if BTM_SCO_INCLUDED == TRUE /* The LMP_switch_req shall be sent only if the ACL logical transport @@ -2261,21 +2138,20 @@ BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport) is_sco_active = btm_is_sco_active_by_bdaddr(p_lcb_cur->remote_bd_addr); L2CAP_TRACE_API ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \ - (is_sco_active == TRUE) ? "TRUE":"FALSE"); + (is_sco_active == TRUE) ? "TRUE" : "FALSE"); - if (is_sco_active == TRUE) - continue; /* No Master Slave switch not allowed when SCO Active */ + if (is_sco_active == TRUE) { + continue; /* No Master Slave switch not allowed when SCO Active */ + } #endif /*4_1_TODO check if btm_cb.devcb.local_features to be used instead */ - if (HCI_SWITCH_SUPPORTED(BTM_ReadLocalFeatures())) - { + if (HCI_SWITCH_SUPPORTED(BTM_ReadLocalFeatures())) { /* mark this lcb waiting for switch to be completed and start switch on the other one */ p_lcb->link_state = LST_CONNECTING_WAIT_SWITCH; p_lcb->link_role = HCI_ROLE_MASTER; - if (BTM_SwitchRole (p_lcb_cur->remote_bd_addr, HCI_ROLE_MASTER, NULL) == BTM_CMD_STARTED) - { + if (BTM_SwitchRole (p_lcb_cur->remote_bd_addr, HCI_ROLE_MASTER, NULL) == BTM_CMD_STARTED) { btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_ROLE_SWITCH_TOUT); return (TRUE); } @@ -2303,10 +2179,8 @@ UINT8 l2cu_get_num_hi_priority (void) int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)) { no_hi++; } } @@ -2340,27 +2214,25 @@ BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb) p_features = BTM_ReadLocalFeatures(); L2CAP_TRACE_DEBUG ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d", - l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding); + l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding); /* FW team says that we can participant in 4 piconets * typically 3 piconet + 1 for scanning. * We can enhance the code to count the number of piconets later. */ - if ( ((!l2cb.disallow_switch && (num_acl < 3)) || (p_lcb->is_bonding && (no_hi_prio_chs==0))) - && HCI_SWITCH_SUPPORTED(p_features)) + if ( ((!l2cb.disallow_switch && (num_acl < 3)) || (p_lcb->is_bonding && (no_hi_prio_chs == 0))) + && HCI_SWITCH_SUPPORTED(p_features)) { allow_switch = HCI_CR_CONN_ALLOW_SWITCH; - else + } else { allow_switch = HCI_CR_CONN_NOT_ALLOW_SWITCH; + } p_lcb->link_state = LST_CONNECTING; /* Check with the BT manager if details about remote device are known */ - if ((p_inq_info = BTM_InqDbRead(p_lcb->remote_bd_addr)) != NULL) - { + if ((p_inq_info = BTM_InqDbRead(p_lcb->remote_bd_addr)) != NULL) { page_scan_rep_mode = p_inq_info->results.page_scan_rep_mode; page_scan_mode = p_inq_info->results.page_scan_mode; clock_offset = (UINT16)(p_inq_info->results.clock_offset); - } - else - { + } else { /* No info known. Use default settings */ page_scan_rep_mode = HCI_PAGE_SCAN_REP_MODE_R1; page_scan_mode = HCI_MANDATARY_PAGE_SCAN_MODE; @@ -2370,8 +2242,8 @@ BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb) if (!btsnd_hcic_create_conn (p_lcb->remote_bd_addr, ( HCI_PKT_TYPES_MASK_DM1 | HCI_PKT_TYPES_MASK_DH1 - | HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3 - | HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5 ), + | HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3 + | HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5 ), page_scan_rep_mode, page_scan_mode, clock_offset, @@ -2407,10 +2279,8 @@ tL2C_LCB *l2cu_find_lcb_by_state (tL2C_LINK_STATE state) UINT16 i; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->link_state == state)) - { + for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->link_state == state)) { return (p_lcb); } } @@ -2441,25 +2311,20 @@ BOOLEAN l2cu_lcb_disconnecting (void) p_lcb = &l2cb.lcb_pool[0]; - for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++) - { - if (p_lcb->in_use) - { + for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++) { + if (p_lcb->in_use) { /* no ccbs on lcb, or lcb is in disconnecting state */ - if ((!p_lcb->ccb_queue.p_first_ccb) || (p_lcb->link_state == LST_DISCONNECTING)) - { + if ((!p_lcb->ccb_queue.p_first_ccb) || (p_lcb->link_state == LST_DISCONNECTING)) { status = TRUE; break; } /* only one ccb left on lcb */ - else if (p_lcb->ccb_queue.p_first_ccb == p_lcb->ccb_queue.p_last_ccb) - { + else if (p_lcb->ccb_queue.p_first_ccb == p_lcb->ccb_queue.p_last_ccb) { p_ccb = p_lcb->ccb_queue.p_first_ccb; if ((p_ccb->in_use) && - ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) || - (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP))) - { + ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) || + (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP))) { status = TRUE; break; } @@ -2492,19 +2357,16 @@ BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_af //APPL_TRACE_EVENT("SET ACL PRIORITY %d", priority); /* Find the link control block for the acl channel */ - if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) - { + if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL) { L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_SetAclPriority"); return (FALSE); } - if (BTM_IS_BRCM_CONTROLLER()) - { + if (BTM_IS_BRCM_CONTROLLER()) { /* Called from above L2CAP through API; send VSC if changed */ if ((!reset_after_rs && (priority != p_lcb->acl_priority)) || - /* Called because of a master/slave role switch; if high resend VSC */ - ( reset_after_rs && p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)) - { + /* Called because of a master/slave role switch; if high resend VSC */ + ( reset_after_rs && p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)) { pp = command; vs_param = (priority == L2CAP_PRIORITY_HIGH) ? HCI_BRCM_ACL_PRIORITY_HIGH : HCI_BRCM_ACL_PRIORITY_LOW; @@ -2515,14 +2377,13 @@ BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_af BTM_VendorSpecificCommand (HCI_BRCM_SET_ACL_PRIORITY, HCI_BRCM_ACL_PRIORITY_PARAM_SIZE, command, NULL); /* Adjust lmp buffer allocation for this channel if priority changed */ - if (p_lcb->acl_priority != priority) - { + if (p_lcb->acl_priority != priority) { p_lcb->acl_priority = priority; l2c_link_adjust_allocation(); } } } - return(TRUE); + return (TRUE); } #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) @@ -2537,10 +2398,11 @@ BOOLEAN l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_af *******************************************************************************/ void l2cu_set_non_flushable_pbf (BOOLEAN is_supported) { - if (is_supported) + if (is_supported) { l2cb.non_flushable_pbf = (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT); - else + } else { l2cb.non_flushable_pbf = (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT); + } } #endif @@ -2564,35 +2426,25 @@ void l2cu_resubmit_pending_sec_req (BD_ADDR p_bda) L2CAP_TRACE_DEBUG ("l2cu_resubmit_pending_sec_req p_bda: 0x%08x", p_bda); /* If we are called with a BDA, only resubmit for that BDA */ - if (p_bda) - { + if (p_bda) { p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR); /* If we don't have one, this is an error */ - if (p_lcb) - { + if (p_lcb) { /* For all channels, send the event through their FSMs */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) { p_next_ccb = p_ccb->p_next_ccb; l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL); } - } - else - { + } else { L2CAP_TRACE_WARNING ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR"); } - } - else - { + } else { /* No BDA pasesed in, so check all links */ - for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if (p_lcb->in_use) - { + for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if (p_lcb->in_use) { /* For all channels, send the event through their FSMs */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) - { + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb) { p_next_ccb = p_ccb->p_next_ccb; l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL); } @@ -2634,14 +2486,11 @@ void l2cu_adjust_out_mps (tL2C_CCB *p_ccb) /* on the tx side MTU is selected based on packet size of the controller */ packet_size = btm_get_max_packet_size (p_ccb->p_lcb->remote_bd_addr); - if (packet_size <= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN)) - { + if (packet_size <= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN)) { /* something is very wrong */ L2CAP_TRACE_ERROR ("l2cu_adjust_out_mps bad packet size: %u will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps); p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps; - } - else - { + } else { packet_size -= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN); /* We try to negotiate MTU that each packet can be split into whole @@ -2652,13 +2501,14 @@ void l2cu_adjust_out_mps (tL2C_CCB *p_ccb) For EDR 2.0 packet size is 1027. So we better send RFCOMM packet as 1 3DH5 packet 1 * 1027 = 1027. Minus 4 bytes L2CAP header 1023. */ - if (p_ccb->peer_cfg.fcr.mps >= packet_size) + if (p_ccb->peer_cfg.fcr.mps >= packet_size) { p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps / packet_size * packet_size; - else + } else { p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps; + } L2CAP_TRACE_DEBUG ("l2cu_adjust_out_mps use %d Based on peer_cfg.fcr.mps: %u packet_size: %u", - p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size); + p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size); } } @@ -2678,11 +2528,13 @@ BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR tL2C_CCB *p_ccb; /* If we already have a CCB, then simply return */ - if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] != NULL) + if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] != NULL) { return (TRUE); + } - if ((p_ccb = l2cu_allocate_ccb (NULL, 0)) == NULL) + if ((p_ccb = l2cu_allocate_ccb (NULL, 0)) == NULL) { return (FALSE); + } btu_stop_timer(&p_lcb->timer_entry); @@ -2697,8 +2549,7 @@ BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb; - if (p_fcr) - { + if (p_fcr) { /* Set the FCR parameters. For now, we will use default pools */ p_ccb->our_cfg.fcr = p_ccb->peer_cfg.fcr = *p_fcr; @@ -2715,8 +2566,9 @@ BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR p_ccb->p_lcb = p_lcb; /* There is no configuration, so if the link is up, the channel is up */ - if (p_lcb->link_state == LST_CONNECTED) + if (p_lcb->link_state == LST_CONNECTED) { p_ccb->chnl_state = CST_OPEN; + } /* Set the default idle timeout value to use */ p_ccb->fixed_chnl_idle_tout = l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].default_idle_tout; @@ -2743,56 +2595,46 @@ void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb) #if (L2CAP_NUM_FIXED_CHNLS > 0) int xx; - for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - { - if ( (p_lcb->p_fixed_ccbs[xx] != NULL) && (p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout > timeout) ) + for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) { + if ( (p_lcb->p_fixed_ccbs[xx] != NULL) && (p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout > timeout) ) { timeout = p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout; + } } #endif /* If the link is pairing, do not mess with the timeouts */ - if (p_lcb->is_bonding) + if (p_lcb->is_bonding) { return; + } - if (timeout == 0) - { + if (timeout == 0) { L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link"); rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER); - if (rc == BTM_CMD_STARTED) - { + if (rc == BTM_CMD_STARTED) { l2cu_process_fixed_disc_cback(p_lcb); p_lcb->link_state = LST_DISCONNECTING; timeout = L2CAP_LINK_DISCONNECT_TOUT; - } - else if (rc == BTM_SUCCESS) - { + } else if (rc == BTM_SUCCESS) { l2cu_process_fixed_disc_cback(p_lcb); /* BTM SEC will make sure that link is release (probably after pairing is done) */ p_lcb->link_state = LST_DISCONNECTING; timeout = 0xFFFF; - } - else if ( (p_lcb->is_bonding) - && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) ) - { + } else if ( (p_lcb->is_bonding) + && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) ) { l2cu_process_fixed_disc_cback(p_lcb); p_lcb->link_state = LST_DISCONNECTING; timeout = L2CAP_LINK_DISCONNECT_TOUT; - } - else - { + } else { /* probably no buffer to send disconnect */ timeout = BT_1SEC_TIMEOUT; } } - if (timeout != 0xFFFF) - { + if (timeout != 0xFFFF) { L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout); btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout); - } - else - { + } else { btu_stop_timer(&p_lcb->timer_entry); } } @@ -2810,34 +2652,32 @@ void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb) void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb) { #if (BLE_INCLUDED == TRUE) - if (p_lcb->transport == BT_TRANSPORT_BR_EDR) - { - /* ignore all not assigned BR/EDR channels */ - p_lcb->peer_chnl_mask[0] &= (L2CAP_FIXED_CHNL_SIG_BIT| \ - L2CAP_FIXED_CHNL_CNCTLESS_BIT| \ - L2CAP_FIXED_CHNL_SMP_BR_BIT); - } - else - p_lcb->peer_chnl_mask[0] = l2cb.l2c_ble_fixed_chnls_mask; + if (p_lcb->transport == BT_TRANSPORT_BR_EDR) { + /* ignore all not assigned BR/EDR channels */ + p_lcb->peer_chnl_mask[0] &= (L2CAP_FIXED_CHNL_SIG_BIT | \ + L2CAP_FIXED_CHNL_CNCTLESS_BIT | \ + L2CAP_FIXED_CHNL_SMP_BR_BIT); + } else { + p_lcb->peer_chnl_mask[0] = l2cb.l2c_ble_fixed_chnls_mask; + } #endif /* Tell all registered fixed channels about the connection */ - for (int xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - { + for (int xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) { #if BLE_INCLUDED == TRUE /* skip sending LE fix channel callbacks on BR/EDR links */ if (p_lcb->transport == BT_TRANSPORT_BR_EDR && - xx + L2CAP_FIRST_FIXED_CHNL >= L2CAP_ATT_CID && - xx + L2CAP_FIRST_FIXED_CHNL <= L2CAP_SMP_CID) + xx + L2CAP_FIRST_FIXED_CHNL >= L2CAP_ATT_CID && + xx + L2CAP_FIRST_FIXED_CHNL <= L2CAP_SMP_CID) { continue; + } #endif - if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) - { + if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) { if (p_lcb->peer_chnl_mask[(xx + L2CAP_FIRST_FIXED_CHNL) / 8] - & (1 << ((xx + L2CAP_FIRST_FIXED_CHNL) % 8))) - { - if (p_lcb->p_fixed_ccbs[xx]) + & (1 << ((xx + L2CAP_FIRST_FIXED_CHNL) % 8))) { + if (p_lcb->p_fixed_ccbs[xx]) { p_lcb->p_fixed_ccbs[xx]->chnl_state = CST_OPEN; + } #if BLE_INCLUDED == TRUE (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport); @@ -2845,9 +2685,7 @@ void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb) (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR); #endif - } - else - { + } else { #if BLE_INCLUDED == TRUE (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); @@ -2856,8 +2694,7 @@ void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb) p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR); #endif - if (p_lcb->p_fixed_ccbs[xx]) - { + if (p_lcb->p_fixed_ccbs[xx]) { l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]); p_lcb->p_fixed_ccbs[xx] = NULL; } @@ -2886,30 +2723,27 @@ void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb) UINT8 peer_channel_mask = p_lcb->peer_chnl_mask[0]; // For LE, reset the stored peer channel mask - if (p_lcb->transport == BT_TRANSPORT_LE) + if (p_lcb->transport == BT_TRANSPORT_LE) { p_lcb->peer_chnl_mask[0] = 0; + } - for (int xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - { - if (p_lcb->p_fixed_ccbs[xx]) - { - if (p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb) - { + for (int xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) { + if (p_lcb->p_fixed_ccbs[xx]) { + if (p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb) { tL2C_CCB *p_l2c_chnl_ctrl_block; p_l2c_chnl_ctrl_block = p_lcb->p_fixed_ccbs[xx]; p_lcb->p_fixed_ccbs[xx] = NULL; l2cu_release_ccb(p_l2c_chnl_ctrl_block); #if BLE_INCLUDED == TRUE - (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, - p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); + (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, + p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); #else - (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, - p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR); + (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, + p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR); #endif - } - } - else if ( (peer_channel_mask & (1 << (xx + L2CAP_FIRST_FIXED_CHNL))) - && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) ) + } + } else if ( (peer_channel_mask & (1 << (xx + L2CAP_FIRST_FIXED_CHNL))) + && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) ) #if BLE_INCLUDED == TRUE (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(xx + L2CAP_FIRST_FIXED_CHNL, p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport); @@ -2933,7 +2767,7 @@ void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb) ** *******************************************************************************/ void l2cu_send_peer_ble_par_req (tL2C_LCB *p_lcb, UINT16 min_int, UINT16 max_int, - UINT16 latency, UINT16 timeout) + UINT16 latency, UINT16 timeout) { BT_HDR *p_buf; UINT8 *p; @@ -2943,14 +2777,13 @@ void l2cu_send_peer_ble_par_req (tL2C_LCB *p_lcb, UINT16 min_int, UINT16 max_int l2cu_adj_id (p_lcb, L2CAP_ADJ_ID); if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_REQ_LEN, - L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL ) - { + L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL ) { L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_req - no buffer"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, min_int); UINT16_TO_STREAM (p, max_int); @@ -2976,14 +2809,13 @@ void l2cu_send_peer_ble_par_rsp (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id) UINT8 *p; if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_RSP_LEN, - L2CAP_CMD_BLE_UPDATE_RSP, rem_id)) == NULL ) - { + L2CAP_CMD_BLE_UPDATE_RSP, rem_id)) == NULL ) { L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_rsp - no buffer"); return; } p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET + HCI_DATA_PREAMBLE_SIZE + - L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD; UINT16_TO_STREAM (p, reason); @@ -3012,10 +2844,8 @@ tL2C_LCB *l2cu_find_lcb_by_handle (UINT16 handle) int xx; tL2C_LCB *p_lcb = &l2cb.lcb_pool[0]; - for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) - { - if ((p_lcb->in_use) && (p_lcb->handle == handle)) - { + for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { + if ((p_lcb->in_use) && (p_lcb->handle == handle)) { return (p_lcb); } } @@ -3042,43 +2872,41 @@ tL2C_CCB *l2cu_find_ccb_by_cid (tL2C_LCB *p_lcb, UINT16 local_cid) UINT8 xx; #endif - if (local_cid >= L2CAP_BASE_APPL_CID) - { + if (local_cid >= L2CAP_BASE_APPL_CID) { /* find the associated CCB by "index" */ local_cid -= L2CAP_BASE_APPL_CID; - if (local_cid >= MAX_L2CAP_CHANNELS) + if (local_cid >= MAX_L2CAP_CHANNELS) { return NULL; + } p_ccb = l2cb.ccb_pool + local_cid; /* make sure the CCB is in use */ - if (!p_ccb->in_use) - { + if (!p_ccb->in_use) { p_ccb = NULL; } /* make sure it's for the same LCB */ - else if (p_lcb && p_lcb != p_ccb->p_lcb) - { + else if (p_lcb && p_lcb != p_ccb->p_lcb) { p_ccb = NULL; } } #if (L2CAP_UCD_INCLUDED == TRUE) - else - { + else { /* searching fixed channel */ p_ccb = l2cb.ccb_pool; - for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ ) - { + for ( xx = 0; xx < MAX_L2CAP_CHANNELS; xx++ ) { if ((p_ccb->local_cid == local_cid) - &&(p_ccb->in_use) - &&(p_lcb == p_ccb->p_lcb)) + && (p_ccb->in_use) + && (p_lcb == p_ccb->p_lcb)) { break; - else + } else { p_ccb++; + } } - if ( xx >= MAX_L2CAP_CHANNELS ) + if ( xx >= MAX_L2CAP_CHANNELS ) { return NULL; + } } #endif @@ -3105,64 +2933,60 @@ static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb) int i, j; /* scan all of priority until finding a channel to serve */ - for ( i = 0; (i < L2CAP_NUM_CHNL_PRIORITY)&&(!p_serve_ccb); i++ ) - { + for ( i = 0; (i < L2CAP_NUM_CHNL_PRIORITY) && (!p_serve_ccb); i++ ) { /* scan all channel within serving priority group until finding a channel to serve */ - for ( j = 0; (j < p_lcb->rr_serv[p_lcb->rr_pri].num_ccb)&&(!p_serve_ccb); j++) - { + for ( j = 0; (j < p_lcb->rr_serv[p_lcb->rr_pri].num_ccb) && (!p_serve_ccb); j++) { /* scaning from next serving channel */ p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb; - if (!p_ccb) - { + if (!p_ccb) { L2CAP_TRACE_ERROR("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri); return NULL; } L2CAP_TRACE_DEBUG("RR scan pri=%d, lcid=0x%04x, q_cout=%d", - p_ccb->ccb_priority, p_ccb->local_cid, GKI_queue_length(&p_ccb->xmit_hold_q)); + p_ccb->ccb_priority, p_ccb->local_cid, GKI_queue_length(&p_ccb->xmit_hold_q)); /* store the next serving channel */ /* this channel is the last channel of its priority group */ if (( p_ccb->p_next_ccb == NULL ) - ||( p_ccb->p_next_ccb->ccb_priority != p_ccb->ccb_priority )) - { + || ( p_ccb->p_next_ccb->ccb_priority != p_ccb->ccb_priority )) { /* next serving channel is set to the first channel in the group */ p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_first_ccb; - } - else - { + } else { /* next serving channel is set to the next channel in the group */ p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_ccb->p_next_ccb; } - if (p_ccb->chnl_state != CST_OPEN) + if (p_ccb->chnl_state != CST_OPEN) { continue; + } /* eL2CAP option in use */ - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { - if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { + if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) { continue; + } - if ( GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) - { - if ( GKI_queue_is_empty(&p_ccb->xmit_hold_q)) + if ( GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) { + if ( GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { continue; + } /* If using the common pool, should be at least 10% free. */ - if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) + if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) { continue; + } /* If in eRTM mode, check for window closure */ - if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) + if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) { continue; + } } - } - else - { - if (GKI_queue_is_empty(&p_ccb->xmit_hold_q)) + } else { + if (GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { continue; + } } /* found a channel to serve */ @@ -3172,8 +2996,7 @@ static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb) } /* if there is no more quota of the priority group or no channel to have data to send */ - if ((p_lcb->rr_serv[p_lcb->rr_pri].quota == 0)||(!p_serve_ccb)) - { + if ((p_lcb->rr_serv[p_lcb->rr_pri].quota == 0) || (!p_serve_ccb)) { /* serve next priority group */ p_lcb->rr_pri = (p_lcb->rr_pri + 1) % L2CAP_NUM_CHNL_PRIORITY; /* initialize its quota */ @@ -3181,12 +3004,11 @@ static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb) } } - if (p_serve_ccb) - { + if (p_serve_ccb) { L2CAP_TRACE_DEBUG("RR service pri=%d, quota=%d, lcid=0x%04x", - p_serve_ccb->ccb_priority, - p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota, - p_serve_ccb->local_cid ); + p_serve_ccb->ccb_priority, + p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota, + p_serve_ccb->local_cid ); } return p_serve_ccb; @@ -3210,27 +3032,32 @@ static tL2C_CCB *l2cu_get_next_channel(tL2C_LCB *p_lcb) /* Get the first CCB with data to send. */ - for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) - { - if (p_ccb->chnl_state != CST_OPEN) + for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) { + if (p_ccb->chnl_state != CST_OPEN) { continue; + } - if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) + if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) { continue; + } - if (p_ccb->fcrb.retrans_q.count != 0) + if (p_ccb->fcrb.retrans_q.count != 0) { return p_ccb; + } - if (p_ccb->xmit_hold_q.count == 0) + if (p_ccb->xmit_hold_q.count == 0) { continue; + } /* If using the common pool, should be at least 10% free. */ - if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) + if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) { continue; + } /* If in eRTM mode, check for window closure */ - if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) + if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) { continue; + } /* If here, we found someone */ return p_ccb; @@ -3259,52 +3086,50 @@ BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb) #if (L2CAP_NUM_FIXED_CHNLS > 0) int xx; - for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) - { - if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL) + for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++) { + if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL) { continue; + } /* eL2CAP option in use */ - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { - if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { + if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy) { continue; - - /* No more checks needed if sending from the reatransmit queue */ - if (GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) - { - if (GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - continue; - - /* If using the common pool, should be at least 10% free. */ - if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) - continue; - - /* If in eRTM mode, check for window closure */ - if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) - continue; } - if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL) - { + /* No more checks needed if sending from the reatransmit queue */ + if (GKI_queue_is_empty(&p_ccb->fcrb.retrans_q)) { + if (GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { + continue; + } + + /* If using the common pool, should be at least 10% free. */ + if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) ) { + continue; + } + + /* If in eRTM mode, check for window closure */ + if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) ) { + continue; + } + } + + if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL) { l2cu_check_channel_congestion (p_ccb); l2cu_set_acl_hci_header (p_buf, p_ccb); return (p_buf); } - } - else - { - if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) - { + } else { + if (!GKI_queue_is_empty(&p_ccb->xmit_hold_q)) { p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q); - if(NULL == p_buf) - { + if (NULL == p_buf) { L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send: No data to be sent"); return (NULL); } /* send tx complete */ - if (l2cb.fixed_reg[xx].pL2CA_FixedTxComplete_Cb) + if (l2cb.fixed_reg[xx].pL2CA_FixedTxComplete_Cb) { (*l2cb.fixed_reg[xx].pL2CA_FixedTxComplete_Cb)(p_ccb->local_cid, 1); + } l2cu_check_channel_congestion (p_ccb); l2cu_set_acl_hci_header (p_buf, p_ccb); @@ -3322,26 +3147,25 @@ BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb) #endif /* Return if no buffer */ - if (p_ccb == NULL) + if (p_ccb == NULL) { return (NULL); - - if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { - if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) == NULL) - return (NULL); } - else - { + + if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { + if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) == NULL) { + return (NULL); + } + } else { p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q); - if(NULL == p_buf) - { + if (NULL == p_buf) { L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send() #2: No data to be sent"); return (NULL); } } - if ( p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_TxComplete_Cb && (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) ) + if ( p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_TxComplete_Cb && (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) ) { (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, 1); + } l2cu_check_channel_congestion (p_ccb); @@ -3368,18 +3192,14 @@ void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb) p = (UINT8 *)(p_buf + 1) + p_buf->offset - HCI_DATA_PREAMBLE_SIZE; #if (BLE_INCLUDED == TRUE) - if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE) - { + if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE) { UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)); uint16_t acl_data_size = controller_get_interface()->get_acl_data_size_ble(); /* The HCI transport will segment the buffers. */ - if (p_buf->len > acl_data_size) - { + if (p_buf->len > acl_data_size) { UINT16_TO_STREAM (p, acl_data_size); - } - else - { + } else { UINT16_TO_STREAM (p, p_buf->len); } } /* (BLE_INCLUDED == TRUE) */ @@ -3388,12 +3208,9 @@ void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb) { #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable)) - || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) ) - { + || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) ) { UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)); - } - else - { + } else { UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf); } #else @@ -3402,12 +3219,9 @@ void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb) uint16_t acl_data_size = controller_get_interface()->get_acl_data_size_classic(); /* The HCI transport will segment the buffers. */ - if (p_buf->len > acl_data_size) - { + if (p_buf->len > acl_data_size) { UINT16_TO_STREAM (p, acl_data_size); - } - else - { + } else { UINT16_TO_STREAM (p, p_buf->len); } } @@ -3429,26 +3243,21 @@ void l2cu_check_channel_congestion (tL2C_CCB *p_ccb) UINT16 q_count = GKI_queue_length(&p_ccb->xmit_hold_q); #if (L2CAP_UCD_INCLUDED == TRUE) - if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) - { + if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) { q_count += p_ccb->p_lcb->ucd_out_sec_pending_q.count; } #endif /* If the CCB queue limit is subject to a quota, check for congestion */ /* if this channel has outgoing traffic */ - if (p_ccb->buff_quota != 0) - { + if (p_ccb->buff_quota != 0) { /* If this channel was congested */ - if ( p_ccb->cong_sent ) - { + if ( p_ccb->cong_sent ) { /* If the channel is not congested now, tell the app */ - if (q_count <= (p_ccb->buff_quota / 2)) - { + if (q_count <= (p_ccb->buff_quota / 2)) { p_ccb->cong_sent = FALSE; - if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb) - { + if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb) { L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x xmit_hold_q.count: %u buff_quota: %u", - p_ccb->local_cid, q_count, p_ccb->buff_quota); + p_ccb->local_cid, q_count, p_ccb->buff_quota); /* Prevent recursive calling */ l2cb.is_cong_cback_context = TRUE; @@ -3456,69 +3265,57 @@ void l2cu_check_channel_congestion (tL2C_CCB *p_ccb) l2cb.is_cong_cback_context = FALSE; } #if (L2CAP_UCD_INCLUDED == TRUE) - else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) - { - if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) - { + else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) { + if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) { L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u", - p_ccb->p_lcb->ucd_out_sec_pending_q.count, - p_ccb->xmit_hold_q.count, p_ccb->buff_quota); + p_ccb->p_lcb->ucd_out_sec_pending_q.count, + p_ccb->xmit_hold_q.count, p_ccb->buff_quota); p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE ); } } #endif #if (L2CAP_NUM_FIXED_CHNLS > 0) - else - { + else { UINT8 xx; - for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++) - { - if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb) - { - if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL) + for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++) { + if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb) { + if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL) { (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, FALSE); + } break; } } } #endif } - } - else - { + } else { /* If this channel was not congested but it is congested now, tell the app */ - if (q_count > p_ccb->buff_quota) - { + if (q_count > p_ccb->buff_quota) { p_ccb->cong_sent = TRUE; - if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb) - { + if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb) { L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u", - p_ccb->local_cid, q_count, p_ccb->buff_quota); + p_ccb->local_cid, q_count, p_ccb->buff_quota); (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE); } #if (L2CAP_UCD_INCLUDED == TRUE) - else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) - { - if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) - { + else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID ) { + if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb ) { L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u", - p_ccb->p_lcb->ucd_out_sec_pending_q.count, - p_ccb->xmit_hold_q.count, p_ccb->buff_quota); + p_ccb->p_lcb->ucd_out_sec_pending_q.count, + p_ccb->xmit_hold_q.count, p_ccb->buff_quota); p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE ); } } #endif #if (L2CAP_NUM_FIXED_CHNLS > 0) - else - { + else { UINT8 xx; - for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++) - { - if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb) - { - if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL) + for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++) { + if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb) { + if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL) { (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, TRUE); + } break; } } diff --git a/components/bt/bluedroid/stack/l2cap/l2cap_client.c b/components/bt/bluedroid/stack/l2cap/l2cap_client.c old mode 100755 new mode 100644 index 086500276..64a729d19 --- a/components/bt/bluedroid/stack/l2cap/l2cap_client.c +++ b/components/bt/bluedroid/stack/l2cap/l2cap_client.c @@ -29,15 +29,15 @@ #include "l2c_api.h" struct l2cap_client_t { - l2cap_client_callbacks_t callbacks; - void *context; + l2cap_client_callbacks_t callbacks; + void *context; - uint16_t local_channel_id; - uint16_t remote_mtu; - bool configured_self; - bool configured_peer; - bool is_congested; - list_t *outbound_fragments; + uint16_t local_channel_id; + uint16_t remote_mtu; + bool configured_self; + bool configured_peer; + bool is_congested; + list_t *outbound_fragments; }; static void connect_completed_cb(uint16_t local_channel_id, uint16_t error_code); @@ -58,377 +58,406 @@ static const uint16_t L2CAP_MTU_DEFAULT = 672; static const uint16_t L2CAP_MTU_MINIMUM = 48; static const tL2CAP_APPL_INFO l2cap_callbacks = { - .pL2CA_ConnectCfm_Cb = connect_completed_cb, - .pL2CA_ConfigInd_Cb = config_request_cb, - .pL2CA_ConfigCfm_Cb = config_completed_cb, - .pL2CA_DisconnectInd_Cb = disconnect_request_cb, - .pL2CA_DisconnectCfm_Cb = disconnect_completed_cb, - .pL2CA_CongestionStatus_Cb = congestion_cb, - .pL2CA_DataInd_Cb = read_ready_cb, - .pL2CA_TxComplete_Cb = write_completed_cb, + .pL2CA_ConnectCfm_Cb = connect_completed_cb, + .pL2CA_ConfigInd_Cb = config_request_cb, + .pL2CA_ConfigCfm_Cb = config_completed_cb, + .pL2CA_DisconnectInd_Cb = disconnect_request_cb, + .pL2CA_DisconnectCfm_Cb = disconnect_completed_cb, + .pL2CA_CongestionStatus_Cb = congestion_cb, + .pL2CA_DataInd_Cb = read_ready_cb, + .pL2CA_TxComplete_Cb = write_completed_cb, }; static list_t *l2cap_clients; // A list of l2cap_client_t. Container does not own objects. -buffer_t *l2cap_buffer_new(size_t size) { - buffer_t *buf = buffer_new(size + L2CAP_MIN_OFFSET); - buffer_t *slice = NULL; - if (buf) - slice = buffer_new_slice(buf, size); - buffer_free(buf); - return slice; +buffer_t *l2cap_buffer_new(size_t size) +{ + buffer_t *buf = buffer_new(size + L2CAP_MIN_OFFSET); + buffer_t *slice = NULL; + if (buf) { + slice = buffer_new_slice(buf, size); + } + buffer_free(buf); + return slice; } -l2cap_client_t *l2cap_client_new(const l2cap_client_callbacks_t *callbacks, void *context) { - assert(callbacks != NULL); - assert(callbacks->connected != NULL); - assert(callbacks->disconnected != NULL); - assert(callbacks->read_ready != NULL); - assert(callbacks->write_ready != NULL); +l2cap_client_t *l2cap_client_new(const l2cap_client_callbacks_t *callbacks, void *context) +{ + assert(callbacks != NULL); + assert(callbacks->connected != NULL); + assert(callbacks->disconnected != NULL); + assert(callbacks->read_ready != NULL); + assert(callbacks->write_ready != NULL); - if (!l2cap_clients) { - l2cap_clients = list_new(NULL); if (!l2cap_clients) { - LOG_ERROR("%s unable to allocate space for L2CAP client list.", __func__); - return NULL; + l2cap_clients = list_new(NULL); + if (!l2cap_clients) { + LOG_ERROR("%s unable to allocate space for L2CAP client list.", __func__); + return NULL; + } } - } - l2cap_client_t *ret = (l2cap_client_t *)osi_calloc(sizeof(l2cap_client_t)); - if (!ret) { - LOG_ERROR("%s unable to allocate L2CAP client.", __func__); - goto error; - } + l2cap_client_t *ret = (l2cap_client_t *)osi_calloc(sizeof(l2cap_client_t)); + if (!ret) { + LOG_ERROR("%s unable to allocate L2CAP client.", __func__); + goto error; + } - ret->callbacks = *callbacks; - ret->context = context; + ret->callbacks = *callbacks; + ret->context = context; - ret->remote_mtu = L2CAP_MTU_DEFAULT; - ret->outbound_fragments = list_new(NULL); - if (!ret) { - LOG_ERROR("%s unable to allocate outbound L2CAP fragment list.", __func__); - goto error; - } + ret->remote_mtu = L2CAP_MTU_DEFAULT; + ret->outbound_fragments = list_new(NULL); + if (!ret) { + LOG_ERROR("%s unable to allocate outbound L2CAP fragment list.", __func__); + goto error; + } - list_append(l2cap_clients, ret); + list_append(l2cap_clients, ret); - return ret; + return ret; error:; - osi_free(ret); - return NULL; + osi_free(ret); + return NULL; } -void l2cap_client_free(l2cap_client_t *client) { - if (!client) - return; - - list_remove(l2cap_clients, client); - l2cap_client_disconnect(client); - list_free(client->outbound_fragments); - osi_free(client); -} - -bool l2cap_client_connect(l2cap_client_t *client, const bt_bdaddr_t *remote_bdaddr, uint16_t psm) { - assert(client != NULL); - assert(remote_bdaddr != NULL); - assert(psm != 0); - assert(!bdaddr_is_empty(remote_bdaddr)); - assert(client->local_channel_id == 0); - assert(!client->configured_self); - assert(!client->configured_peer); - assert(!L2C_INVALID_PSM(psm)); - - client->local_channel_id = L2CA_ConnectReq(psm, (uint8_t *)remote_bdaddr); - if (!client->local_channel_id) { - LOG_ERROR("%s unable to create L2CAP connection.", __func__); - return false; - } - - L2CA_SetConnectionCallbacks(client->local_channel_id, &l2cap_callbacks); - return true; -} - -void l2cap_client_disconnect(l2cap_client_t *client) { - assert(client != NULL); - - if (client->local_channel_id && !L2CA_DisconnectReq(client->local_channel_id)) - LOG_ERROR("%s unable to send disconnect message for LCID 0x%04x.", __func__, client->local_channel_id); - - client->local_channel_id = 0; - client->remote_mtu = L2CAP_MTU_DEFAULT; - client->configured_self = false; - client->configured_peer = false; - client->is_congested = false; - - for (const list_node_t *node = list_begin(client->outbound_fragments); node != list_end(client->outbound_fragments); node = list_next(node)) - GKI_freebuf(list_node(node)); - - list_clear(client->outbound_fragments); -} - -bool l2cap_client_is_connected(const l2cap_client_t *client) { - assert(client != NULL); - - return client->local_channel_id != 0 && client->configured_self && client->configured_peer; -} - -bool l2cap_client_write(l2cap_client_t *client, buffer_t *packet) { - assert(client != NULL); - assert(packet != NULL); - assert(l2cap_client_is_connected(client)); - - if (client->is_congested) - return false; - - fragment_packet(client, packet); - dispatch_fragments(client); - return true; -} - -static void connect_completed_cb(uint16_t local_channel_id, uint16_t error_code) { - assert(local_channel_id != 0); - - l2cap_client_t *client = find(local_channel_id); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client for LCID 0x%04x.", __func__, local_channel_id); - return; - } - - if (error_code != L2CAP_CONN_OK) { - LOG_ERROR("%s error connecting L2CAP channel: %d.", __func__, error_code); - client->callbacks.disconnected(client, client->context); - return; - } - - // Use default L2CAP parameters. - tL2CAP_CFG_INFO desired_parameters = { 0 }; - if (!L2CA_ConfigReq(local_channel_id, &desired_parameters)) { - LOG_ERROR("%s error sending L2CAP config parameters.", __func__); - client->callbacks.disconnected(client, client->context); - } -} - -static void config_request_cb(uint16_t local_channel_id, tL2CAP_CFG_INFO *requested_parameters) { - tL2CAP_CFG_INFO response = { 0 }; - l2cap_client_t *client = find(local_channel_id); - - if (!client) { - LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.", __func__, local_channel_id); - return; - } - - response.result = L2CAP_CFG_OK; - - if (requested_parameters->mtu_present) { - // Make sure the peer chose an MTU at least as large as the minimum L2CAP MTU defined - // by the Bluetooth Core spec. - if (requested_parameters->mtu < L2CAP_MTU_MINIMUM) { - response.mtu = L2CAP_MTU_MINIMUM; - response.mtu_present = true; - response.result = L2CAP_CFG_UNACCEPTABLE_PARAMS; - } else { - client->remote_mtu = requested_parameters->mtu; +void l2cap_client_free(l2cap_client_t *client) +{ + if (!client) { + return; } - } - if (requested_parameters->fcr_present) { - if (requested_parameters->fcr.mode != L2CAP_FCR_BASIC_MODE) { - response.fcr_present = true; - response.fcr = requested_parameters->fcr; - response.fcr.mode = L2CAP_FCR_BASIC_MODE; - response.result = L2CAP_CFG_UNACCEPTABLE_PARAMS; - } - } - - if (!L2CA_ConfigRsp(local_channel_id, &response)) { - LOG_ERROR("%s unable to send config response for LCID 0x%04x.", __func__, local_channel_id); + list_remove(l2cap_clients, client); l2cap_client_disconnect(client); - return; - } - - // If we've configured both endpoints, let the listener know we've connected. - client->configured_peer = true; - if (l2cap_client_is_connected(client)) - client->callbacks.connected(client, client->context); + list_free(client->outbound_fragments); + osi_free(client); } -static void config_completed_cb(uint16_t local_channel_id, tL2CAP_CFG_INFO *negotiated_parameters) { - l2cap_client_t *client = find(local_channel_id); +bool l2cap_client_connect(l2cap_client_t *client, const bt_bdaddr_t *remote_bdaddr, uint16_t psm) +{ + assert(client != NULL); + assert(remote_bdaddr != NULL); + assert(psm != 0); + assert(!bdaddr_is_empty(remote_bdaddr)); + assert(client->local_channel_id == 0); + assert(!client->configured_self); + assert(!client->configured_peer); + assert(!L2C_INVALID_PSM(psm)); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.", __func__, local_channel_id); - return; - } + client->local_channel_id = L2CA_ConnectReq(psm, (uint8_t *)remote_bdaddr); + if (!client->local_channel_id) { + LOG_ERROR("%s unable to create L2CAP connection.", __func__); + return false; + } - switch (negotiated_parameters->result) { + L2CA_SetConnectionCallbacks(client->local_channel_id, &l2cap_callbacks); + return true; +} + +void l2cap_client_disconnect(l2cap_client_t *client) +{ + assert(client != NULL); + + if (client->local_channel_id && !L2CA_DisconnectReq(client->local_channel_id)) { + LOG_ERROR("%s unable to send disconnect message for LCID 0x%04x.", __func__, client->local_channel_id); + } + + client->local_channel_id = 0; + client->remote_mtu = L2CAP_MTU_DEFAULT; + client->configured_self = false; + client->configured_peer = false; + client->is_congested = false; + + for (const list_node_t *node = list_begin(client->outbound_fragments); node != list_end(client->outbound_fragments); node = list_next(node)) { + GKI_freebuf(list_node(node)); + } + + list_clear(client->outbound_fragments); +} + +bool l2cap_client_is_connected(const l2cap_client_t *client) +{ + assert(client != NULL); + + return client->local_channel_id != 0 && client->configured_self && client->configured_peer; +} + +bool l2cap_client_write(l2cap_client_t *client, buffer_t *packet) +{ + assert(client != NULL); + assert(packet != NULL); + assert(l2cap_client_is_connected(client)); + + if (client->is_congested) { + return false; + } + + fragment_packet(client, packet); + dispatch_fragments(client); + return true; +} + +static void connect_completed_cb(uint16_t local_channel_id, uint16_t error_code) +{ + assert(local_channel_id != 0); + + l2cap_client_t *client = find(local_channel_id); + if (!client) { + LOG_ERROR("%s unable to find L2CAP client for LCID 0x%04x.", __func__, local_channel_id); + return; + } + + if (error_code != L2CAP_CONN_OK) { + LOG_ERROR("%s error connecting L2CAP channel: %d.", __func__, error_code); + client->callbacks.disconnected(client, client->context); + return; + } + + // Use default L2CAP parameters. + tL2CAP_CFG_INFO desired_parameters = { 0 }; + if (!L2CA_ConfigReq(local_channel_id, &desired_parameters)) { + LOG_ERROR("%s error sending L2CAP config parameters.", __func__); + client->callbacks.disconnected(client, client->context); + } +} + +static void config_request_cb(uint16_t local_channel_id, tL2CAP_CFG_INFO *requested_parameters) +{ + tL2CAP_CFG_INFO response = { 0 }; + l2cap_client_t *client = find(local_channel_id); + + if (!client) { + LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.", __func__, local_channel_id); + return; + } + + response.result = L2CAP_CFG_OK; + + if (requested_parameters->mtu_present) { + // Make sure the peer chose an MTU at least as large as the minimum L2CAP MTU defined + // by the Bluetooth Core spec. + if (requested_parameters->mtu < L2CAP_MTU_MINIMUM) { + response.mtu = L2CAP_MTU_MINIMUM; + response.mtu_present = true; + response.result = L2CAP_CFG_UNACCEPTABLE_PARAMS; + } else { + client->remote_mtu = requested_parameters->mtu; + } + } + + if (requested_parameters->fcr_present) { + if (requested_parameters->fcr.mode != L2CAP_FCR_BASIC_MODE) { + response.fcr_present = true; + response.fcr = requested_parameters->fcr; + response.fcr.mode = L2CAP_FCR_BASIC_MODE; + response.result = L2CAP_CFG_UNACCEPTABLE_PARAMS; + } + } + + if (!L2CA_ConfigRsp(local_channel_id, &response)) { + LOG_ERROR("%s unable to send config response for LCID 0x%04x.", __func__, local_channel_id); + l2cap_client_disconnect(client); + return; + } + + // If we've configured both endpoints, let the listener know we've connected. + client->configured_peer = true; + if (l2cap_client_is_connected(client)) { + client->callbacks.connected(client, client->context); + } +} + +static void config_completed_cb(uint16_t local_channel_id, tL2CAP_CFG_INFO *negotiated_parameters) +{ + l2cap_client_t *client = find(local_channel_id); + + if (!client) { + LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.", __func__, local_channel_id); + return; + } + + switch (negotiated_parameters->result) { // We'll get another configuration response later. case L2CAP_CFG_PENDING: - break; + break; case L2CAP_CFG_UNACCEPTABLE_PARAMS: - // TODO: see if we can renegotiate parameters instead of dropping the connection. - LOG_WARN("%s dropping L2CAP connection due to unacceptable config parameters.\n", __func__); - l2cap_client_disconnect(client); - break; + // TODO: see if we can renegotiate parameters instead of dropping the connection. + LOG_WARN("%s dropping L2CAP connection due to unacceptable config parameters.\n", __func__); + l2cap_client_disconnect(client); + break; case L2CAP_CFG_OK: - // If we've configured both endpoints, let the listener know we've connected. - client->configured_self = true; - if (l2cap_client_is_connected(client)) - client->callbacks.connected(client, client->context); - break; + // If we've configured both endpoints, let the listener know we've connected. + client->configured_self = true; + if (l2cap_client_is_connected(client)) { + client->callbacks.connected(client, client->context); + } + break; // Failure, no further parameter negotiation possible. default: - LOG_WARN("%s L2CAP parameter negotiation failed with error code %d.\n", __func__, negotiated_parameters->result); - l2cap_client_disconnect(client); - break; - } -} - -static void disconnect_request_cb(uint16_t local_channel_id, bool ack_required) { - l2cap_client_t *client = find(local_channel_id); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client with LCID 0x%04x.\n", __func__, local_channel_id); - return; - } - - if (ack_required) - L2CA_DisconnectRsp(local_channel_id); - - // We already sent a disconnect response so this LCID is now invalid. - client->local_channel_id = 0; - l2cap_client_disconnect(client); - - client->callbacks.disconnected(client, client->context); -} - -static void disconnect_completed_cb(uint16_t local_channel_id, UNUSED_ATTR uint16_t error_code) { - assert(local_channel_id != 0); - - l2cap_client_t *client = find(local_channel_id); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client with LCID 0x%04x.\n", __func__, local_channel_id); - return; - } - - client->local_channel_id = 0; - l2cap_client_disconnect(client); - - client->callbacks.disconnected(client, client->context); -} - -static void congestion_cb(uint16_t local_channel_id, bool is_congested) { - assert(local_channel_id != 0); - - l2cap_client_t *client = find(local_channel_id); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.\n", __func__, local_channel_id); - return; - } - - client->is_congested = is_congested; - - if (!is_congested) { - // If we just decongested, dispatch whatever we have left over in our queue. - // Once that's done, if we're still decongested, notify the listener so it - // can start writing again. - dispatch_fragments(client); - if (!client->is_congested) - client->callbacks.write_ready(client, client->context); - } -} - -static void read_ready_cb(uint16_t local_channel_id, BT_HDR *packet) { - assert(local_channel_id != 0); - - l2cap_client_t *client = find(local_channel_id); - if (!client) { - LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.\n", __func__, local_channel_id); - return; - } - - // TODO(sharvil): eliminate copy from BT_HDR. - buffer_t *buffer = buffer_new(packet->len); - memcpy(buffer_ptr(buffer), packet->data + packet->offset, packet->len); - GKI_freebuf(packet); - - client->callbacks.read_ready(client, buffer, client->context); - buffer_free(buffer); -} - -static void write_completed_cb(UNUSED_ATTR uint16_t local_channel_id, UNUSED_ATTR uint16_t packets_completed) { - // Do nothing. We update congestion state based on the congestion callback - // and we've already removed items from outbound_fragments list so we don't - // really care how many packets were successfully dispatched. -} - -static void fragment_packet(l2cap_client_t *client, buffer_t *packet) { - assert(client != NULL); - assert(packet != NULL); - - // TODO(sharvil): eliminate copy into BT_HDR. - BT_HDR *bt_packet = GKI_getbuf(buffer_length(packet) + L2CAP_MIN_OFFSET); - bt_packet->offset = L2CAP_MIN_OFFSET; - bt_packet->len = buffer_length(packet); - memcpy(bt_packet->data + bt_packet->offset, buffer_ptr(packet), buffer_length(packet)); - - for (;;) { - if (bt_packet->len <= client->remote_mtu) { - if (bt_packet->len > 0) - list_append(client->outbound_fragments, bt_packet); - else - GKI_freebuf(bt_packet); - break; - } - - BT_HDR *fragment = GKI_getbuf(client->remote_mtu + L2CAP_MIN_OFFSET); - fragment->offset = L2CAP_MIN_OFFSET; - fragment->len = client->remote_mtu; - memcpy(fragment->data + fragment->offset, bt_packet->data + bt_packet->offset, client->remote_mtu); - - list_append(client->outbound_fragments, fragment); - - bt_packet->offset += client->remote_mtu; - bt_packet->len -= client->remote_mtu; - } -} - -static void dispatch_fragments(l2cap_client_t *client) { - assert(client != NULL); - assert(!client->is_congested); - - while (!list_is_empty(client->outbound_fragments)) { - BT_HDR *packet = (BT_HDR *)list_front(client->outbound_fragments); - list_remove(client->outbound_fragments, packet); - - switch (L2CA_DataWrite(client->local_channel_id, packet)) { - case L2CAP_DW_CONGESTED: - client->is_congested = true; - return; - - case L2CAP_DW_FAILED: - LOG_ERROR("%s error writing data to L2CAP connection LCID 0x%04x; disconnecting.", __func__, client->local_channel_id); + LOG_WARN("%s L2CAP parameter negotiation failed with error code %d.\n", __func__, negotiated_parameters->result); l2cap_client_disconnect(client); - return; - - case L2CAP_DW_SUCCESS: break; } - } } -static l2cap_client_t *find(uint16_t local_channel_id) { - assert(local_channel_id != 0); +static void disconnect_request_cb(uint16_t local_channel_id, bool ack_required) +{ + l2cap_client_t *client = find(local_channel_id); + if (!client) { + LOG_ERROR("%s unable to find L2CAP client with LCID 0x%04x.\n", __func__, local_channel_id); + return; + } - for (const list_node_t *node = list_begin(l2cap_clients); node != list_end(l2cap_clients); node = list_next(node)) { - l2cap_client_t *client = (l2cap_client_t *)list_node(node); - if (client->local_channel_id == local_channel_id) - return client; - } + if (ack_required) { + L2CA_DisconnectRsp(local_channel_id); + } - return NULL; + // We already sent a disconnect response so this LCID is now invalid. + client->local_channel_id = 0; + l2cap_client_disconnect(client); + + client->callbacks.disconnected(client, client->context); +} + +static void disconnect_completed_cb(uint16_t local_channel_id, UNUSED_ATTR uint16_t error_code) +{ + assert(local_channel_id != 0); + + l2cap_client_t *client = find(local_channel_id); + if (!client) { + LOG_ERROR("%s unable to find L2CAP client with LCID 0x%04x.\n", __func__, local_channel_id); + return; + } + + client->local_channel_id = 0; + l2cap_client_disconnect(client); + + client->callbacks.disconnected(client, client->context); +} + +static void congestion_cb(uint16_t local_channel_id, bool is_congested) +{ + assert(local_channel_id != 0); + + l2cap_client_t *client = find(local_channel_id); + if (!client) { + LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.\n", __func__, local_channel_id); + return; + } + + client->is_congested = is_congested; + + if (!is_congested) { + // If we just decongested, dispatch whatever we have left over in our queue. + // Once that's done, if we're still decongested, notify the listener so it + // can start writing again. + dispatch_fragments(client); + if (!client->is_congested) { + client->callbacks.write_ready(client, client->context); + } + } +} + +static void read_ready_cb(uint16_t local_channel_id, BT_HDR *packet) +{ + assert(local_channel_id != 0); + + l2cap_client_t *client = find(local_channel_id); + if (!client) { + LOG_ERROR("%s unable to find L2CAP client matching LCID 0x%04x.\n", __func__, local_channel_id); + return; + } + + // TODO(sharvil): eliminate copy from BT_HDR. + buffer_t *buffer = buffer_new(packet->len); + memcpy(buffer_ptr(buffer), packet->data + packet->offset, packet->len); + GKI_freebuf(packet); + + client->callbacks.read_ready(client, buffer, client->context); + buffer_free(buffer); +} + +static void write_completed_cb(UNUSED_ATTR uint16_t local_channel_id, UNUSED_ATTR uint16_t packets_completed) +{ + // Do nothing. We update congestion state based on the congestion callback + // and we've already removed items from outbound_fragments list so we don't + // really care how many packets were successfully dispatched. +} + +static void fragment_packet(l2cap_client_t *client, buffer_t *packet) +{ + assert(client != NULL); + assert(packet != NULL); + + // TODO(sharvil): eliminate copy into BT_HDR. + BT_HDR *bt_packet = GKI_getbuf(buffer_length(packet) + L2CAP_MIN_OFFSET); + bt_packet->offset = L2CAP_MIN_OFFSET; + bt_packet->len = buffer_length(packet); + memcpy(bt_packet->data + bt_packet->offset, buffer_ptr(packet), buffer_length(packet)); + + for (;;) { + if (bt_packet->len <= client->remote_mtu) { + if (bt_packet->len > 0) { + list_append(client->outbound_fragments, bt_packet); + } else { + GKI_freebuf(bt_packet); + } + break; + } + + BT_HDR *fragment = GKI_getbuf(client->remote_mtu + L2CAP_MIN_OFFSET); + fragment->offset = L2CAP_MIN_OFFSET; + fragment->len = client->remote_mtu; + memcpy(fragment->data + fragment->offset, bt_packet->data + bt_packet->offset, client->remote_mtu); + + list_append(client->outbound_fragments, fragment); + + bt_packet->offset += client->remote_mtu; + bt_packet->len -= client->remote_mtu; + } +} + +static void dispatch_fragments(l2cap_client_t *client) +{ + assert(client != NULL); + assert(!client->is_congested); + + while (!list_is_empty(client->outbound_fragments)) { + BT_HDR *packet = (BT_HDR *)list_front(client->outbound_fragments); + list_remove(client->outbound_fragments, packet); + + switch (L2CA_DataWrite(client->local_channel_id, packet)) { + case L2CAP_DW_CONGESTED: + client->is_congested = true; + return; + + case L2CAP_DW_FAILED: + LOG_ERROR("%s error writing data to L2CAP connection LCID 0x%04x; disconnecting.", __func__, client->local_channel_id); + l2cap_client_disconnect(client); + return; + + case L2CAP_DW_SUCCESS: + break; + } + } +} + +static l2cap_client_t *find(uint16_t local_channel_id) +{ + assert(local_channel_id != 0); + + for (const list_node_t *node = list_begin(l2cap_clients); node != list_end(l2cap_clients); node = list_next(node)) { + l2cap_client_t *client = (l2cap_client_t *)list_node(node); + if (client->local_channel_id == local_channel_id) { + return client; + } + } + + return NULL; } #endif /*L2CAP_CLIENT_INCLUDED*/ diff --git a/components/bt/bluedroid/profiles/std/rfcomm/include/port_int.h b/components/bt/bluedroid/stack/rfcomm/include/port_int.h old mode 100755 new mode 100644 similarity index 96% rename from components/bt/bluedroid/profiles/std/rfcomm/include/port_int.h rename to components/bt/bluedroid/stack/rfcomm/include/port_int.h index 2313ace2a..fb72d5038 --- a/components/bt/bluedroid/profiles/std/rfcomm/include/port_int.h +++ b/components/bt/bluedroid/stack/rfcomm/include/port_int.h @@ -51,8 +51,7 @@ /* ** Define Port Data Transfere control block */ -typedef struct -{ +typedef struct { BUFFER_Q queue; /* Queue of buffers waiting to be sent */ BOOLEAN peer_fc; /* TRUE if flow control is set based on peer's request */ BOOLEAN user_fc; /* TRUE if flow control is set based on user's request */ @@ -63,8 +62,7 @@ typedef struct /* ** Port control structure used to pass modem info */ -typedef struct -{ +typedef struct { #define MODEM_SIGNAL_DTRDSR 0x01 #define MODEM_SIGNAL_RTSCTS 0x02 #define MODEM_SIGNAL_RI 0x04 @@ -88,12 +86,11 @@ typedef struct /* ** RFCOMM multiplexer Control Block */ -typedef struct -{ +typedef struct { TIMER_LIST_ENT tle; /* Timer list entry */ BUFFER_Q cmd_q; /* Queue for command messages on this mux */ UINT8 port_inx[RFCOMM_MAX_DLCI + 1]; /* Array for quick access to */ - /* tPORT based on dlci */ + /* tPORT based on dlci */ BD_ADDR bd_addr; /* BD ADDR of the peer if initiator */ UINT16 lcid; /* Local cid used for this channel */ UINT16 peer_l2cap_mtu; /* Max frame that can be sent to peer L2CAP */ @@ -114,8 +111,7 @@ typedef struct /* ** RFCOMM Port Connection Control Block */ -struct t_rfc_port -{ +struct t_rfc_port { #define RFC_PORT_STATE_IDLE 0 #define RFC_PORT_STATE_WAIT_START 1 #define RFC_PORT_STATE_OPENING 2 @@ -142,8 +138,7 @@ typedef struct t_rfc_port tRFC_PORT; /* ** Define control block containing information about PORT connection */ -struct t_port_info -{ +struct t_port_info { UINT8 inx; /* Index of this control block in the port_info array */ BOOLEAN in_use; /* True when structure is allocated */ @@ -197,12 +192,12 @@ struct t_port_info tPORT_DATA_CO_CALLBACK *p_data_co_callback; /* Callback function with callouts and flowctrl */ UINT16 credit_tx; /* Flow control credits for tx path */ UINT16 credit_rx; /* Flow control credits for rx path, this is */ - /* number of buffers peer is allowed to sent */ + /* number of buffers peer is allowed to sent */ UINT16 credit_rx_max; /* Max number of credits we will allow this guy to sent */ UINT16 credit_rx_low; /* Number of credits when we send credit update */ UINT16 rx_buf_critical; /* port receive queue critical watermark level */ BOOLEAN keep_port_handle; /* TRUE if port is not deallocated when closing */ - /* it is set to TRUE for server when allocating port */ + /* it is set to TRUE for server when allocating port */ UINT16 keep_mtu; /* Max MTU that port can receive by server */ }; typedef struct t_port_info tPORT; @@ -210,8 +205,7 @@ typedef struct t_port_info tPORT; /* Define the PORT/RFCOMM control structure */ -typedef struct -{ +typedef struct { tPORT port[MAX_RFC_PORTS]; /* Port info pool */ tRFC_MCB rfc_mcb[MAX_BD_CONNECTIONS]; /* RFCOMM bd_connections pool */ } tPORT_CB; diff --git a/components/bt/bluedroid/profiles/std/rfcomm/include/rfc_int.h b/components/bt/bluedroid/stack/rfcomm/include/rfc_int.h old mode 100755 new mode 100644 similarity index 98% rename from components/bt/bluedroid/profiles/std/rfcomm/include/rfc_int.h rename to components/bt/bluedroid/stack/rfcomm/include/rfc_int.h index 719a99df8..9194583e5 --- a/components/bt/bluedroid/profiles/std/rfcomm/include/rfc_int.h +++ b/components/bt/bluedroid/stack/rfcomm/include/rfc_int.h @@ -75,8 +75,7 @@ extern void RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status /* ** Define logical struct used for sending and decoding MX frames */ -typedef struct -{ +typedef struct { UINT8 dlci; UINT8 type; UINT8 cr; @@ -84,10 +83,8 @@ typedef struct UINT8 pf; UINT8 credit; - union - { - struct - { + union { + struct { UINT8 dlci; UINT8 frame_type; UINT8 conv_layer; @@ -97,26 +94,22 @@ typedef struct UINT8 n2; UINT8 k; } pn; - struct - { + struct { UINT8 *p_data; UINT16 data_len; } test; - struct - { + struct { UINT8 dlci; UINT8 signals; UINT8 break_present; UINT8 break_duration; } msc; - struct - { + struct { UINT8 ea; UINT8 cr; UINT8 type; } nsc; - struct - { + struct { UINT8 dlci; UINT8 is_request; UINT8 baud_rate; @@ -129,8 +122,7 @@ typedef struct UINT8 xoff_char; UINT16 param_mask; } rpn; - struct - { + struct { UINT8 dlci; UINT8 line_status; } rls; @@ -215,8 +207,7 @@ typedef struct /* Define RFComm control block */ -typedef struct -{ +typedef struct { MX_FRAME rx_frame; tL2CAP_APPL_INFO reg_info; /* L2CAP Registration info */ tRFC_MCB *p_rfc_lcid_mcb[MAX_L2CAP_CHANNELS]; /* MCB based on the L2CAP's lcid */ @@ -226,8 +217,7 @@ typedef struct } tRFCOMM_CB; /* Main Control Block for the RFCOMM Layer (PORT and RFC) */ -typedef struct -{ +typedef struct { tRFCOMM_CB rfc; tPORT_CB port; UINT8 trace_level; @@ -315,7 +305,7 @@ tRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid); extern void rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid); extern void rfc_check_mcb_active (tRFC_MCB *p_mcb); extern void rfc_port_closed (tPORT *p_port); -extern void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport,void *p_ref_data, UINT8 res); +extern void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res); extern void rfc_inc_credit (tPORT *p_port, UINT8 credit); extern void rfc_dec_credit (tPORT *p_port); extern void rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf); diff --git a/components/bt/bluedroid/profiles/std/rfcomm/port_api.c b/components/bt/bluedroid/stack/rfcomm/port_api.c old mode 100755 new mode 100644 similarity index 85% rename from components/bt/bluedroid/profiles/std/rfcomm/port_api.c rename to components/bt/bluedroid/stack/rfcomm/port_api.c index 94e49bcb7..753fc3425 --- a/components/bt/bluedroid/profiles/std/rfcomm/port_api.c +++ b/components/bt/bluedroid/stack/rfcomm/port_api.c @@ -39,33 +39,33 @@ /* Mapping from PORT_* result codes to human readable strings. */ static const char *result_code_strings[] = { - "Success", - "Unknown error", - "Already opened", - "Command pending", - "App not registered", - "No memory", - "No resources", - "Bad BD address", - "Unspecified error", - "Bad handle", - "Not opened", - "Line error", - "Start failed", - "Parameter negotiation failed", - "Port negotiation failed", - "Sec failed", - "Peer connection failed", - "Peer failed", - "Peer timeout", - "Closed", - "TX full", - "Local closed", - "Local timeout", - "TX queue disabled", - "Page timeout", - "Invalid SCN", - "Unknown result code" + "Success", + "Unknown error", + "Already opened", + "Command pending", + "App not registered", + "No memory", + "No resources", + "Bad BD address", + "Unspecified error", + "Bad handle", + "Not opened", + "Line error", + "Start failed", + "Parameter negotiation failed", + "Port negotiation failed", + "Sec failed", + "Peer connection failed", + "Peer failed", + "Peer timeout", + "Closed", + "TX full", + "Local closed", + "Local timeout", + "TX queue disabled", + "Page timeout", + "Invalid SCN", + "Unknown result code" }; /******************************************************************************* @@ -110,12 +110,11 @@ int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn, BOOLEAN is_server, UINT16 rfcomm_mtu; RFCOMM_TRACE_API ("RFCOMM_CreateConnection() BDA: %02x-%02x-%02x-%02x-%02x-%02x", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); *p_handle = 0; - if (( scn == 0 )||(scn >= PORT_MAX_RFC_PORTS )) - { + if (( scn == 0 ) || (scn >= PORT_MAX_RFC_PORTS )) { /* Server Channel Number(SCN) should be in range 1...30 */ RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - invalid SCN"); return (PORT_INVALID_SCN); @@ -123,38 +122,35 @@ int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn, BOOLEAN is_server, /* For client that originate connection on the existing none initiator */ /* multiplexer channel DLCI should be odd */ - if (p_mcb && !p_mcb->is_initiator && !is_server) + if (p_mcb && !p_mcb->is_initiator && !is_server) { dlci = (scn << 1) + 1; - else + } else { dlci = (scn << 1); + } RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p", - scn, dlci, is_server, mtu, p_mcb); + scn, dlci, is_server, mtu, p_mcb); /* For the server side always allocate a new port. On the client side */ /* do not allow the same (dlci, bd_addr) to be opened twice by application */ - if (!is_server && ((p_port = port_find_port (dlci, bd_addr)) != NULL)) - { + if (!is_server && ((p_port = port_find_port (dlci, bd_addr)) != NULL)) { /* if existing port is also a client port */ - if (p_port->is_server == FALSE) - { + if (p_port->is_server == FALSE) { RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, MCB state:%d", - p_port->state, p_port->rfc.state, p_port->rfc.p_mcb ? p_port->rfc.p_mcb->state : 0); + p_port->state, p_port->rfc.state, p_port->rfc.p_mcb ? p_port->rfc.p_mcb->state : 0); return (PORT_ALREADY_OPENED); } } - if ((p_port = port_allocate_port (dlci, bd_addr)) == NULL) - { + if ((p_port = port_allocate_port (dlci, bd_addr)) == NULL) { RFCOMM_TRACE_WARNING ("RFCOMM_CreateConnection - no resources"); return (PORT_NO_RESOURCES); } - RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p", - scn, dlci, is_server, mtu, p_mcb, p_port); + RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p", + scn, dlci, is_server, mtu, p_mcb, p_port); p_port->default_signal_state = (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON); - switch (uuid) - { + switch (uuid) { case UUID_PROTOCOL_OBEX: p_port->default_signal_state = PORT_OBEX_DEFAULT_SIGNAL_STATE; break; @@ -188,14 +184,14 @@ int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn, BOOLEAN is_server, rfcomm_mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD; - if (mtu) + if (mtu) { p_port->mtu = (mtu < rfcomm_mtu) ? mtu : rfcomm_mtu; - else + } else { p_port->mtu = rfcomm_mtu; + } /* server doesn't need to release port when closing */ - if( is_server ) - { + if ( is_server ) { p_port->keep_port_handle = TRUE; /* keep mtu that user asked, p_port->mtu could be updated during param negotiation */ @@ -207,12 +203,12 @@ int RFCOMM_CreateConnection (UINT16 uuid, UINT8 scn, BOOLEAN is_server, p_port->p_mgmt_callback = p_mgmt_cb; - for (i = 0; i < BD_ADDR_LEN; i++) + for (i = 0; i < BD_ADDR_LEN; i++) { p_port->bd_addr[i] = bd_addr[i]; + } /* If this is not initiator of the connection need to just wait */ - if (p_port->is_server) - { + if (p_port->is_server) { return (PORT_SUCCESS); } @@ -237,15 +233,13 @@ int RFCOMM_RemoveConnection (UINT16 handle) RFCOMM_TRACE_API ("RFCOMM_RemoveConnection() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { RFCOMM_TRACE_ERROR ("RFCOMM_RemoveConnection() BAD handle:%d", handle); return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { RFCOMM_TRACE_EVENT ("RFCOMM_RemoveConnection() Not opened:%d", handle); return (PORT_SUCCESS); } @@ -273,8 +267,7 @@ int RFCOMM_RemoveServer (UINT16 handle) RFCOMM_TRACE_API ("RFCOMM_RemoveServer() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { RFCOMM_TRACE_ERROR ("RFCOMM_RemoveServer() BAD handle:%d", handle); return (PORT_BAD_HANDLE); } @@ -283,8 +276,7 @@ int RFCOMM_RemoveServer (UINT16 handle) /* Do not report any events to the client any more. */ p_port->p_mgmt_callback = NULL; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { RFCOMM_TRACE_EVENT ("RFCOMM_RemoveServer() Not opened:%d", handle); return (PORT_SUCCESS); } @@ -318,15 +310,13 @@ int PORT_SetEventCallback (UINT16 port_handle, tPORT_CALLBACK *p_port_cb) tPORT *p_port; /* Check if handle is valid to avoid crashing */ - if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) - { + if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[port_handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -351,8 +341,7 @@ int PORT_ClearKeepHandleFlag (UINT16 port_handle) tPORT *p_port; /* Check if handle is valid to avoid crashing */ - if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) - { + if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } @@ -381,15 +370,13 @@ int PORT_SetDataCallback (UINT16 port_handle, tPORT_DATA_CALLBACK *p_port_cb) RFCOMM_TRACE_API ("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle, p_port_cb); /* Check if handle is valid to avoid crashing */ - if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) - { + if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[port_handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -417,15 +404,13 @@ int PORT_SetDataCOCallback (UINT16 port_handle, tPORT_DATA_CO_CALLBACK *p_port_c RFCOMM_TRACE_API ("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle, p_port_cb); /* Check if handle is valid to avoid crashing */ - if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) - { + if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[port_handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -453,15 +438,13 @@ int PORT_SetEventMask (UINT16 port_handle, UINT32 mask) RFCOMM_TRACE_API ("PORT_SetEventMask() handle:%d mask:0x%x", port_handle, mask); /* Check if handle is valid to avoid crashing */ - if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) - { + if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[port_handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -490,28 +473,26 @@ int PORT_CheckConnection (UINT16 handle, BD_ADDR bd_addr, UINT16 *p_lcid) RFCOMM_TRACE_API ("PORT_CheckConnection() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } if (!p_port->rfc.p_mcb - || !p_port->rfc.p_mcb->peer_ready - || (p_port->rfc.state != RFC_STATE_OPENED)) - { + || !p_port->rfc.p_mcb->peer_ready + || (p_port->rfc.state != RFC_STATE_OPENED)) { return (PORT_LINE_ERR); } memcpy (bd_addr, p_port->rfc.p_mcb->bd_addr, BD_ADDR_LEN); - if (p_lcid) + if (p_lcid) { *p_lcid = p_port->rfc.p_mcb->lcid; + } return (PORT_SUCCESS); } @@ -535,33 +516,27 @@ BOOLEAN PORT_IsOpening (BD_ADDR bd_addr) BOOLEAN found_port; /* Check for any rfc_mcb which is in the middle of opening. */ - for (xx = 0; xx < MAX_BD_CONNECTIONS; xx++) - { + for (xx = 0; xx < MAX_BD_CONNECTIONS; xx++) { if ((rfc_cb.port.rfc_mcb[xx].state > RFC_MX_STATE_IDLE) && - (rfc_cb.port.rfc_mcb[xx].state < RFC_MX_STATE_CONNECTED)) - { + (rfc_cb.port.rfc_mcb[xx].state < RFC_MX_STATE_CONNECTED)) { memcpy (bd_addr, rfc_cb.port.rfc_mcb[xx].bd_addr, BD_ADDR_LEN); return TRUE; } - if (rfc_cb.port.rfc_mcb[xx].state == RFC_MX_STATE_CONNECTED) - { + if (rfc_cb.port.rfc_mcb[xx].state == RFC_MX_STATE_CONNECTED) { found_port = FALSE; p_mcb = &rfc_cb.port.rfc_mcb[xx]; p_port = &rfc_cb.port.port[0]; - for (yy = 0; yy < MAX_RFC_PORTS; yy++, p_port++) - { - if (p_port->rfc.p_mcb == p_mcb) - { + for (yy = 0; yy < MAX_RFC_PORTS; yy++, p_port++) { + if (p_port->rfc.p_mcb == p_mcb) { found_port = TRUE; break; } } if ((!found_port) || - (found_port && (p_port->rfc.state < RFC_STATE_OPENED))) - { + (found_port && (p_port->rfc.state < RFC_STATE_OPENED))) { /* Port is not established yet. */ memcpy (bd_addr, rfc_cb.port.rfc_mcb[xx].bd_addr, BD_ADDR_LEN); return TRUE; @@ -593,32 +568,28 @@ int PORT_SetState (UINT16 handle, tPORT_STATE *p_settings) RFCOMM_TRACE_API ("PORT_SetState() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { return (PORT_LINE_ERR); } RFCOMM_TRACE_API ("PORT_SetState() handle:%d FC_TYPE:0x%x", handle, - p_settings->fc_type); + p_settings->fc_type); baud_rate = p_port->user_port_pars.baud_rate; p_port->user_port_pars = *p_settings; /* for now we've been asked to pass only baud rate */ - if (baud_rate != p_settings->baud_rate) - { + if (baud_rate != p_settings->baud_rate) { port_start_par_neg (p_port); } return (PORT_SUCCESS); @@ -641,27 +612,24 @@ int PORT_GetRxQueueCnt (UINT16 handle, UINT16 *p_rx_queue_count) RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { return (PORT_LINE_ERR); } *p_rx_queue_count = p_port->rx.queue_size; RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d", - *p_rx_queue_count, p_port->rx.queue_size); + *p_rx_queue_count, p_port->rx.queue_size); return (PORT_SUCCESS); } @@ -685,20 +653,17 @@ int PORT_GetState (UINT16 handle, tPORT_STATE *p_settings) RFCOMM_TRACE_API ("PORT_GetState() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { return (PORT_LINE_ERR); } @@ -726,23 +691,20 @@ int PORT_Control (UINT16 handle, UINT8 signal) RFCOMM_TRACE_API ("PORT_Control() handle:%d signal:0x%x", handle, signal); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } old_modem_signal = p_port->local_ctrl.modem_signal; p_port->local_ctrl.break_signal = 0; - switch (signal) - { + switch (signal) { case PORT_SET_CTSRTS: p_port->local_ctrl.modem_signal |= PORT_CTSRTS_ON; break; @@ -776,18 +738,19 @@ int PORT_Control (UINT16 handle, UINT8 signal) break; } - if (signal == PORT_BREAK) + if (signal == PORT_BREAK) { p_port->local_ctrl.break_signal = PORT_BREAK_DURATION; - else if (p_port->local_ctrl.modem_signal == old_modem_signal) + } else if (p_port->local_ctrl.modem_signal == old_modem_signal) { return (PORT_SUCCESS); + } port_start_control (p_port); RFCOMM_TRACE_EVENT ("PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d", - ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0), - ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0), - ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0), - ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0)); + ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0), + ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0), + ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0), + ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0)); return (PORT_SUCCESS); } @@ -814,57 +777,48 @@ int PORT_FlowControl (UINT16 handle, BOOLEAN enable) RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (!p_port->rfc.p_mcb) - { + if (!p_port->rfc.p_mcb) { return (PORT_NOT_OPENED); } p_port->rx.user_fc = !enable; - if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - { - if (!p_port->rx.user_fc) - { + if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) { + if (!p_port->rx.user_fc) { port_flow_control_peer(p_port, TRUE, 0); } - } - else - { + } else { old_fc = p_port->local_ctrl.fc; /* FC is set if user is set or peer is set */ p_port->local_ctrl.fc = (p_port->rx.user_fc | p_port->rx.peer_fc); - if (p_port->local_ctrl.fc != old_fc) + if (p_port->local_ctrl.fc != old_fc) { port_start_control (p_port); + } } /* Need to take care of the case when we could not deliver events */ /* to the application because we were flow controlled */ - if (enable && (p_port->rx.queue_size != 0)) - { + if (enable && (p_port->rx.queue_size != 0)) { events = PORT_EV_RXCHAR; - if (p_port->rx_flag_ev_pending) - { + if (p_port->rx_flag_ev_pending) { p_port->rx_flag_ev_pending = FALSE; events |= PORT_EV_RXFLAG; } events &= p_port->ev_mask; - if (p_port->p_callback && events) - { + if (p_port->p_callback && events) { p_port->p_callback (events, p_port->inx); } } @@ -893,57 +847,48 @@ int PORT_FlowControl_MaxCredit (UINT16 handle, BOOLEAN enable) RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (!p_port->rfc.p_mcb) - { + if (!p_port->rfc.p_mcb) { return (PORT_NOT_OPENED); } p_port->rx.user_fc = !enable; - if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - { - if (!p_port->rx.user_fc) - { + if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) { + if (!p_port->rx.user_fc) { port_flow_control_peer(p_port, TRUE, p_port->credit_rx); } - } - else - { + } else { old_fc = p_port->local_ctrl.fc; /* FC is set if user is set or peer is set */ p_port->local_ctrl.fc = (p_port->rx.user_fc | p_port->rx.peer_fc); - if (p_port->local_ctrl.fc != old_fc) + if (p_port->local_ctrl.fc != old_fc) { port_start_control (p_port); + } } /* Need to take care of the case when we could not deliver events */ /* to the application because we were flow controlled */ - if (enable && (p_port->rx.queue_size != 0)) - { + if (enable && (p_port->rx.queue_size != 0)) { events = PORT_EV_RXCHAR; - if (p_port->rx_flag_ev_pending) - { + if (p_port->rx_flag_ev_pending) { p_port->rx_flag_ev_pending = FALSE; events |= PORT_EV_RXFLAG; } events &= p_port->ev_mask; - if (p_port->p_callback && events) - { + if (p_port->p_callback && events) { p_port->p_callback (events, p_port->inx); } } @@ -968,15 +913,13 @@ int PORT_GetModemStatus (UINT16 handle, UINT8 *p_signal) { tPORT *p_port; - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -1010,15 +953,13 @@ int PORT_ClearError (UINT16 handle, UINT16 *p_errors, tPORT_STATUS *p_status) RFCOMM_TRACE_API ("PORT_ClearError() handle:%d", handle); - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -1049,20 +990,17 @@ int PORT_SendError (UINT16 handle, UINT8 errors) RFCOMM_TRACE_API ("PORT_SendError() handle:%d errors:0x%x", handle, errors); - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (!p_port->rfc.p_mcb) - { + if (!p_port->rfc.p_mcb) { return (PORT_NOT_OPENED); } @@ -1088,15 +1026,13 @@ int PORT_GetQueueStatus (UINT16 handle, tPORT_STATUS *p_status) /* RFCOMM_TRACE_API ("PORT_GetQueueStatus() handle:%d", handle); */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } @@ -1107,14 +1043,17 @@ int PORT_GetQueueStatus (UINT16 handle, tPORT_STATUS *p_status) p_status->flags = 0; - if (!(p_port->peer_ctrl.modem_signal & PORT_CTSRTS_ON)) + if (!(p_port->peer_ctrl.modem_signal & PORT_CTSRTS_ON)) { p_status->flags |= PORT_FLAG_CTS_HOLD; + } - if (!(p_port->peer_ctrl.modem_signal & PORT_DTRDSR_ON)) + if (!(p_port->peer_ctrl.modem_signal & PORT_DTRDSR_ON)) { p_status->flags |= PORT_FLAG_DSR_HOLD; + } - if (!(p_port->peer_ctrl.modem_signal & PORT_DCD_ON)) + if (!(p_port->peer_ctrl.modem_signal & PORT_DCD_ON)) { p_status->flags |= PORT_FLAG_RLSD_HOLD; + } return (PORT_SUCCESS); } @@ -1141,42 +1080,41 @@ int PORT_Purge (UINT16 handle, UINT8 purge_flags) RFCOMM_TRACE_API ("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (purge_flags & PORT_PURGE_RXCLEAR) - { + if (purge_flags & PORT_PURGE_RXCLEAR) { PORT_SCHEDULE_LOCK; /* to prevent missing credit */ count = GKI_queue_length(&p_port->rx.queue); - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL) + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL) { GKI_freebuf (p_buf); + } p_port->rx.queue_size = 0; PORT_SCHEDULE_UNLOCK; /* If we flowed controlled peer based on rx_queue size enable data again */ - if (count) + if (count) { port_flow_control_peer (p_port, TRUE, count); + } } - if (purge_flags & PORT_PURGE_TXCLEAR) - { + if (purge_flags & PORT_PURGE_TXCLEAR) { PORT_SCHEDULE_LOCK; /* to prevent tx.queue_size from being negative */ - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) { GKI_freebuf (p_buf); + } p_port->tx.queue_size = 0; @@ -1188,8 +1126,9 @@ int PORT_Purge (UINT16 handle, UINT8 purge_flags) events &= p_port->ev_mask; - if ((p_port->p_callback != NULL) && events) + if ((p_port->p_callback != NULL) && events) { (p_port->p_callback)(events, p_port->inx); + } } return (PORT_SUCCESS); @@ -1221,33 +1160,29 @@ int PORT_ReadData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) *p_len = 0; /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { return (PORT_LINE_ERR); } p_buf = (BT_HDR *)GKI_getfirst (&p_port->rx.queue); - if (!p_buf) + if (!p_buf) { return (PORT_SUCCESS); + } count = 0; - while (max_len && p_buf) - { - if (p_buf->len > max_len) - { + while (max_len && p_buf) { + if (p_buf->len > max_len) { memcpy (p_data, (UINT8 *)(p_buf + 1) + p_buf->offset, max_len); p_buf->offset += max_len; p_buf->len -= max_len; @@ -1261,9 +1196,7 @@ int PORT_ReadData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) PORT_SCHEDULE_UNLOCK; break; - } - else - { + } else { memcpy (p_data, (UINT8 *)(p_buf + 1) + p_buf->offset, p_buf->len); *p_len += p_buf->len; @@ -1273,8 +1206,7 @@ int PORT_ReadData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) p_port->rx.queue_size -= p_buf->len; - if (max_len) - { + if (max_len) { p_data += p_buf->len; p_buf = (BT_HDR *)GKI_getnext (p_buf); } @@ -1287,12 +1219,9 @@ int PORT_ReadData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) } } - if (*p_len == 1) - { + if (*p_len == 1) { RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d %x", p_port->rx.queue_size, *p_len, (p_data[0])); - } - else - { + } else { RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d", p_port->rx.queue_size, *p_len); } @@ -1323,27 +1252,23 @@ int PORT_Read (UINT16 handle, BT_HDR **pp_buf) RFCOMM_TRACE_API ("PORT_Read() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { return (PORT_LINE_ERR); } PORT_SCHEDULE_LOCK; p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue); - if (p_buf) - { + if (p_buf) { p_port->rx.queue_size -= p_buf->len; PORT_SCHEDULE_UNLOCK; @@ -1351,9 +1276,7 @@ int PORT_Read (UINT16 handle, BT_HDR **pp_buf) /* If rfcomm suspended traffic from the peer based on the rx_queue_size */ /* check if it can be resumed now */ port_flow_control_peer (p_port, TRUE, 1); - } - else - { + } else { PORT_SCHEDULE_UNLOCK; } @@ -1376,8 +1299,7 @@ int PORT_Read (UINT16 handle, BT_HDR **pp_buf) static int port_write (tPORT *p_port, BT_HDR *p_buf) { /* We should not allow to write data in to server port when connection is not opened */ - if (p_port->is_server && (p_port->rfc.state != RFC_STATE_OPENED)) - { + if (p_port->is_server && (p_port->rfc.state != RFC_STATE_OPENED)) { GKI_freebuf (p_buf); return (PORT_CLOSED); } @@ -1386,39 +1308,36 @@ static int port_write (tPORT *p_port, BT_HDR *p_buf) /* Peer is not ready or Port is not yet opened or initial port control */ /* command has not been sent */ if (p_port->tx.peer_fc - || !p_port->rfc.p_mcb - || !p_port->rfc.p_mcb->peer_ready - || (p_port->rfc.state != RFC_STATE_OPENED) - || ((p_port->port_ctrl & (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED)) != - (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED))) - { + || !p_port->rfc.p_mcb + || !p_port->rfc.p_mcb->peer_ready + || (p_port->rfc.state != RFC_STATE_OPENED) + || ((p_port->port_ctrl & (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED)) != + (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED))) { if ((p_port->tx.queue_size > PORT_TX_CRITICAL_WM) - || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_CRITICAL_WM)) - { + || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_CRITICAL_WM)) { RFCOMM_TRACE_WARNING ("PORT_Write: Queue size: %d", - p_port->tx.queue_size); + p_port->tx.queue_size); GKI_freebuf (p_buf); - if ((p_port->p_callback != NULL) && (p_port->ev_mask & PORT_EV_ERR)) - p_port->p_callback (PORT_EV_ERR, p_port->inx); + if ((p_port->p_callback != NULL) && (p_port->ev_mask & PORT_EV_ERR)) { + p_port->p_callback (PORT_EV_ERR, p_port->inx); + } return (PORT_TX_FULL); } RFCOMM_TRACE_EVENT ("PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d ctrl_state %x", - p_port->tx.peer_fc, - (p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready), - p_port->rfc.state, - p_port->port_ctrl); + p_port->tx.peer_fc, + (p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready), + p_port->rfc.state, + p_port->port_ctrl); GKI_enqueue (&p_port->tx.queue, p_buf); p_port->tx.queue_size += p_buf->len; return (PORT_CMD_PENDING); - } - else - { + } else { RFCOMM_TRACE_EVENT ("PORT_Write : Data is being sent"); RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf); @@ -1446,24 +1365,21 @@ int PORT_Write (UINT16 handle, BT_HDR *p_buf) RFCOMM_TRACE_API ("PORT_Write() handle:%d", handle); /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { GKI_freebuf (p_buf); return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { GKI_freebuf (p_buf); return (PORT_NOT_OPENED); } - if (p_port->line_status) - { + if (p_port->line_status) { RFCOMM_TRACE_WARNING ("PORT_Write: Data dropped line_status:0x%x", - p_port->line_status); + p_port->line_status); GKI_freebuf (p_buf); return (PORT_LINE_ERR); } @@ -1471,8 +1387,7 @@ int PORT_Write (UINT16 handle, BT_HDR *p_buf) rc = port_write (p_port, p_buf); event |= port_flow_control_user (p_port); - switch (rc) - { + switch (rc) { case PORT_TX_FULL: event |= PORT_EV_ERR; break; @@ -1485,8 +1400,9 @@ int PORT_Write (UINT16 handle, BT_HDR *p_buf) event &= p_port->ev_mask; /* Send event to the application */ - if (p_port->p_callback && event) + if (p_port->p_callback && event) { (p_port->p_callback)(event, p_port->inx); + } return (PORT_SUCCESS); } @@ -1502,7 +1418,7 @@ int PORT_Write (UINT16 handle, BT_HDR *p_buf) ** p_len - Byte count returned ** *******************************************************************************/ -int PORT_WriteDataCO (UINT16 handle, int* p_len) +int PORT_WriteDataCO (UINT16 handle, int *p_len) { tPORT *p_port; @@ -1515,48 +1431,44 @@ int PORT_WriteDataCO (UINT16 handle, int* p_len) *p_len = 0; /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { RFCOMM_TRACE_WARNING ("PORT_WriteDataByFd() no port state:%d", p_port->state); return (PORT_NOT_OPENED); } - if (!p_port->peer_mtu) - { + if (!p_port->peer_mtu) { RFCOMM_TRACE_ERROR ("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu); return (PORT_UNKNOWN_ERROR); } int available = 0; //if(ioctl(fd, FIONREAD, &available) < 0) - if(p_port->p_data_co_callback(handle, (UINT8*)&available, sizeof(available), - DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE) == FALSE) - { + if (p_port->p_data_co_callback(handle, (UINT8 *)&available, sizeof(available), + DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE) == FALSE) { RFCOMM_TRACE_ERROR("p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, available:%d", available); return (PORT_UNKNOWN_ERROR); } - if(available == 0) + if (available == 0) { return PORT_SUCCESS; + } /* Length for each buffer is the smaller of GKI buffer, peer MTU, or max_len */ length = RFCOMM_DATA_POOL_BUF_SIZE - - (UINT16)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD); + (UINT16)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD); /* If there are buffers scheduled for transmission check if requested */ /* data fits into the end of the queue */ PORT_SCHEDULE_LOCK; if (((p_buf = (BT_HDR *)GKI_getlast(&p_port->tx.queue)) != NULL) - && (((int)p_buf->len + available) <= (int)p_port->peer_mtu) - && (((int)p_buf->len + available) <= (int)length)) - { + && (((int)p_buf->len + available) <= (int)p_port->peer_mtu) + && (((int)p_buf->len + available) <= (int)length)) { //if(recv(fd, (UINT8 *)(p_buf + 1) + p_buf->offset + p_buf->len, available, 0) != available) - if(p_port->p_data_co_callback(handle, (UINT8 *)(p_buf + 1) + p_buf->offset + p_buf->len, - available, DATA_CO_CALLBACK_TYPE_OUTGOING) == FALSE) + if (p_port->p_data_co_callback(handle, (UINT8 *)(p_buf + 1) + p_buf->offset + p_buf->len, + available, DATA_CO_CALLBACK_TYPE_OUTGOING) == FALSE) { RFCOMM_TRACE_ERROR("p_data_co_callback DATA_CO_CALLBACK_TYPE_OUTGOING failed, available:%d", available); @@ -1580,39 +1492,39 @@ int PORT_WriteDataCO (UINT16 handle, int* p_len) //max_read = available < max_read ? available : max_read; - while (available) - { + while (available) { /* if we're over buffer high water mark, we're done */ if ((p_port->tx.queue_size > PORT_TX_HIGH_WM) - || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM)) - { + || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM)) { port_flow_control_user(p_port); event |= PORT_EV_FC; RFCOMM_TRACE_EVENT ("tx queue is full,tx.queue_size:%d,tx.queue.count:%d,available:%d", - p_port->tx.queue_size, GKI_queue_length(&p_port->tx.queue), available); + p_port->tx.queue_size, GKI_queue_length(&p_port->tx.queue), available); break; - } + } /* continue with rfcomm data write */ p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_DATA_POOL_ID); - if (!p_buf) + if (!p_buf) { break; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET; p_buf->layer_specific = handle; - if (p_port->peer_mtu < length) + if (p_port->peer_mtu < length) { length = p_port->peer_mtu; - if (available < (int)length) + } + if (available < (int)length) { length = (UINT16)available; + } p_buf->len = length; p_buf->event = BT_EVT_TO_BTU_SP_DATA; //memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, length); //if(recv(fd, (UINT8 *)(p_buf + 1) + p_buf->offset, (int)length, 0) != (int)length) - if(p_port->p_data_co_callback(handle, (UINT8 *)(p_buf + 1) + p_buf->offset, length, - DATA_CO_CALLBACK_TYPE_OUTGOING) == FALSE) - { + if (p_port->p_data_co_callback(handle, (UINT8 *)(p_buf + 1) + p_buf->offset, length, + DATA_CO_CALLBACK_TYPE_OUTGOING) == FALSE) { RFCOMM_TRACE_ERROR("p_data_co_callback DATA_CO_CALLBACK_TYPE_OUTGOING failed, length:%d", length); return (PORT_UNKNOWN_ERROR); } @@ -1625,24 +1537,28 @@ int PORT_WriteDataCO (UINT16 handle, int* p_len) /* If queue went below the threashold need to send flow control */ event |= port_flow_control_user (p_port); - if (rc == PORT_SUCCESS) + if (rc == PORT_SUCCESS) { event |= PORT_EV_TXCHAR; + } - if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) + if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) { break; + } *p_len += length; available -= (int)length; } - if (!available && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED)) + if (!available && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED)) { event |= PORT_EV_TXEMPTY; + } /* Mask out all events that are not of interest to user */ event &= p_port->ev_mask; /* Send event to the application */ - if (p_port->p_callback && event) + if (p_port->p_callback && event) { (p_port->p_callback)(event, p_port->inx); + } return (PORT_SUCCESS); } @@ -1675,36 +1591,32 @@ int PORT_WriteData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) *p_len = 0; /* Check if handle is valid to avoid crashing */ - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { RFCOMM_TRACE_WARNING ("PORT_WriteData() no port state:%d", p_port->state); return (PORT_NOT_OPENED); } - if (!max_len || !p_port->peer_mtu) - { + if (!max_len || !p_port->peer_mtu) { RFCOMM_TRACE_ERROR ("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu); return (PORT_UNKNOWN_ERROR); } /* Length for each buffer is the smaller of GKI buffer, peer MTU, or max_len */ length = RFCOMM_DATA_POOL_BUF_SIZE - - (UINT16)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD); + (UINT16)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD); /* If there are buffers scheduled for transmission check if requested */ /* data fits into the end of the queue */ PORT_SCHEDULE_LOCK; if (((p_buf = (BT_HDR *)GKI_getlast(&p_port->tx.queue)) != NULL) - && ((p_buf->len + max_len) <= p_port->peer_mtu) - && ((p_buf->len + max_len) <= length)) - { + && ((p_buf->len + max_len) <= p_port->peer_mtu) + && ((p_buf->len + max_len) <= length)) { memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset + p_buf->len, p_data, max_len); p_port->tx.queue_size += max_len; @@ -1718,25 +1630,28 @@ int PORT_WriteData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) PORT_SCHEDULE_UNLOCK; - while (max_len) - { + while (max_len) { /* if we're over buffer high water mark, we're done */ if ((p_port->tx.queue_size > PORT_TX_HIGH_WM) - || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM)) + || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM)) { break; + } /* continue with rfcomm data write */ p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_DATA_POOL_ID); - if (!p_buf) + if (!p_buf) { break; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET; p_buf->layer_specific = handle; - if (p_port->peer_mtu < length) + if (p_port->peer_mtu < length) { length = p_port->peer_mtu; - if (max_len < length) + } + if (max_len < length) { length = max_len; + } p_buf->len = length; p_buf->event = BT_EVT_TO_BTU_SP_DATA; @@ -1749,26 +1664,30 @@ int PORT_WriteData (UINT16 handle, char *p_data, UINT16 max_len, UINT16 *p_len) /* If queue went below the threashold need to send flow control */ event |= port_flow_control_user (p_port); - if (rc == PORT_SUCCESS) + if (rc == PORT_SUCCESS) { event |= PORT_EV_TXCHAR; + } - if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) + if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) { break; + } *p_len += length; max_len -= length; p_data += length; } - if (!max_len && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED)) + if (!max_len && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED)) { event |= PORT_EV_TXEMPTY; + } /* Mask out all events that are not of interest to user */ event &= p_port->ev_mask; /* Send event to the application */ - if (p_port->p_callback && event) + if (p_port->p_callback && event) { (p_port->p_callback)(event, p_port->inx); + } return (PORT_SUCCESS); } @@ -1792,24 +1711,20 @@ int PORT_Test (UINT16 handle, UINT8 *p_data, UINT16 len) RFCOMM_TRACE_API ("PORT_Test() len:%d", len); - if ((handle == 0) || (handle > MAX_RFC_PORTS)) - { + if ((handle == 0) || (handle > MAX_RFC_PORTS)) { return (PORT_BAD_HANDLE); } p_port = &rfc_cb.port.port[handle - 1]; - if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) - { + if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) { return (PORT_NOT_OPENED); } - if (len > ((p_port->mtu == 0) ? RFCOMM_DEFAULT_MTU : p_port->mtu)) - { + if (len > ((p_port->mtu == 0) ? RFCOMM_DEFAULT_MTU : p_port->mtu)) { return (PORT_UNKNOWN_ERROR); } - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) != NULL) { p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2; p_buf->len = len; @@ -1818,9 +1733,7 @@ int PORT_Test (UINT16 handle, UINT8 *p_data, UINT16 len) rfc_send_test (p_port->rfc.p_mcb, TRUE, p_buf); return (PORT_SUCCESS); - } - else - { + } else { return (PORT_NO_MEM); } } @@ -1859,8 +1772,9 @@ void RFCOMM_Init (void) *******************************************************************************/ UINT8 PORT_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { rfc_cb.trace_level = new_level; + } return (rfc_cb.trace_level); } @@ -1875,10 +1789,11 @@ UINT8 PORT_SetTraceLevel (UINT8 new_level) ** Returns a pointer to the human-readable string for the given result. ** *******************************************************************************/ -const char *PORT_GetResultString (const uint8_t result_code) { - if (result_code > PORT_ERR_MAX) { - return result_code_strings[PORT_ERR_MAX]; - } +const char *PORT_GetResultString (const uint8_t result_code) +{ + if (result_code > PORT_ERR_MAX) { + return result_code_strings[PORT_ERR_MAX]; + } - return result_code_strings[result_code]; + return result_code_strings[result_code]; } diff --git a/components/bt/bluedroid/profiles/std/rfcomm/port_rfc.c b/components/bt/bluedroid/stack/rfcomm/port_rfc.c old mode 100755 new mode 100644 similarity index 86% rename from components/bt/bluedroid/profiles/std/rfcomm/port_rfc.c rename to components/bt/bluedroid/stack/rfcomm/port_rfc.c index 7ef8b461c..009cc6363 --- a/components/bt/bluedroid/profiles/std/rfcomm/port_rfc.c +++ b/components/bt/bluedroid/stack/rfcomm/port_rfc.c @@ -59,8 +59,7 @@ int port_open_continue (tPORT *p_port) RFCOMM_TRACE_EVENT ("port_open_continue, p_port:%p", p_port); /* Check if multiplexer channel has already been established */ - if ((p_mcb = rfc_alloc_multiplexer_channel (p_port->bd_addr, TRUE)) == NULL) - { + if ((p_mcb = rfc_alloc_multiplexer_channel (p_port->bd_addr, TRUE)) == NULL) { RFCOMM_TRACE_WARNING ("port_open_continue no mx channel"); port_release_port (p_port); return (PORT_NO_RESOURCES); @@ -73,20 +72,15 @@ int port_open_continue (tPORT *p_port) /* Connection is up and we know local and remote features, select MTU */ port_select_mtu (p_port); - if (p_mcb->state == RFC_MX_STATE_CONNECTED) - { + if (p_mcb->state == RFC_MX_STATE_CONNECTED) { RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu); - } - else if ((p_mcb->state == RFC_MX_STATE_IDLE) - ||(p_mcb->state == RFC_MX_STATE_DISC_WAIT_UA)) - { + } else if ((p_mcb->state == RFC_MX_STATE_IDLE) + || (p_mcb->state == RFC_MX_STATE_DISC_WAIT_UA)) { /* In RFC_MX_STATE_IDLE state, MX state machine will create connection */ /* In RFC_MX_STATE_DISC_WAIT_UA state, MX state machine will recreate connection */ /* after disconnecting is completed */ RFCOMM_StartReq (p_mcb); - } - else - { + } else { /* MX state machine ignores RFC_MX_EVENT_START_REQ in these states */ /* When it enters RFC_MX_STATE_CONNECTED, it will check any openning ports */ RFCOMM_TRACE_DEBUG ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state); @@ -109,8 +103,9 @@ void port_start_control (tPORT *p_port) { tRFC_MCB *p_mcb = p_port->rfc.p_mcb; - if (p_mcb == NULL) + if (p_mcb == NULL) { return; + } RFCOMM_ControlReq (p_mcb, p_port->dlci, &p_port->local_ctrl); } @@ -130,8 +125,9 @@ void port_start_par_neg (tPORT *p_port) { tRFC_MCB *p_mcb = p_port->rfc.p_mcb; - if (p_mcb == NULL) + if (p_mcb == NULL) { return; + } RFCOMM_PortNegReq (p_mcb, p_port->dlci, &p_port->user_port_pars); } @@ -161,27 +157,28 @@ void port_start_close (tPORT *p_port) events |= port_get_signal_changes (p_port, old_signals, p_port->peer_ctrl.modem_signal); - if(p_port->ev_mask & PORT_EV_CONNECT_ERR) + if (p_port->ev_mask & PORT_EV_CONNECT_ERR) { events |= PORT_EV_CONNECT_ERR; + } - if(p_port->ev_mask & PORT_EV_ERR) + if (p_port->ev_mask & PORT_EV_ERR) { events |= PORT_EV_ERR; + } - if ((p_port->p_callback != NULL) && events) + if ((p_port->p_callback != NULL) && events) { p_port->p_callback (events, p_port->inx); + } /* Check if RFCOMM side has been closed while the message was queued */ - if ((p_mcb == NULL) || (p_port->rfc.state == RFC_STATE_CLOSED)) - { + if ((p_mcb == NULL) || (p_port->rfc.state == RFC_STATE_CLOSED)) { /* Call management callback function before calling port_release_port() to clear tPort */ - if (p_port->p_mgmt_callback) + if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback (PORT_CLOSED, p_port->inx); + } port_release_port (p_port); - } - else - { + } else { RFCOMM_DlcReleaseReq (p_mcb, p_port->dlci); } } @@ -206,34 +203,34 @@ void PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result) RFCOMM_TRACE_EVENT ("PORT_StartCnf result:%d", result); p_port = &rfc_cb.port.port[0]; - for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) - { - if (p_port->rfc.p_mcb == p_mcb) - { + for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { + if (p_port->rfc.p_mcb == p_mcb) { no_ports_up = FALSE; - if (result == RFCOMM_SUCCESS) + if (result == RFCOMM_SUCCESS) { RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu); - else - { + } else { RFCOMM_TRACE_WARNING ("PORT_StartCnf failed result:%d", result); /* Warning: result is also set to 4 when l2cap connection fails due to l2cap connect cnf (no_resources) */ - if( result == HCI_ERR_PAGE_TIMEOUT ) + if ( result == HCI_ERR_PAGE_TIMEOUT ) { p_port->error = PORT_PAGE_TIMEOUT; - else + } else { p_port->error = PORT_START_FAILED; + } rfc_release_multiplexer_channel (p_mcb); p_port->rfc.p_mcb = NULL; /* Send event to the application */ - if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECT_ERR)) + if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECT_ERR)) { (p_port->p_callback)(PORT_EV_CONNECT_ERR, p_port->inx); + } - if (p_port->p_mgmt_callback) + if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback (PORT_START_FAILED, p_port->inx); + } port_release_port (p_port); } @@ -242,8 +239,7 @@ void PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result) /* There can be a situation when after starting connection, user closes the */ /* port, we can catch it here to close multiplexor channel */ - if (no_ports_up) - { + if (no_ports_up) { rfc_check_mcb_active (p_mcb); } } @@ -267,11 +263,9 @@ void PORT_StartInd (tRFC_MCB *p_mcb) RFCOMM_TRACE_EVENT ("PORT_StartInd"); p_port = &rfc_cb.port.port[0]; - for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) - { + for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { if ((p_port->rfc.p_mcb == NULL) - || (p_port->rfc.p_mcb == p_mcb)) - { + || (p_port->rfc.p_mcb == p_mcb)) { RFCOMM_TRACE_DEBUG("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb); RFCOMM_StartRsp (p_mcb, RFCOMM_SUCCESS); return; @@ -299,12 +293,10 @@ void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) RFCOMM_TRACE_EVENT ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu); - if (!p_port) - { + if (!p_port) { /* This can be a first request for this port */ p_port = port_find_dlci_port (dlci); - if (!p_port) - { + if (!p_port) { /* If the port cannot be opened, send a DM. Per Errata 1205 */ rfc_send_dm(p_mcb, dlci, FALSE); /* check if this is the last port open, some headsets have @@ -329,14 +321,10 @@ void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) /* mux has not been set yet, set it now. If either we or peer wants TS 07.10, */ /* use that. Otherwise both must want credit based, so use that. If flow is */ /* already defined for this mux, we respond with that value. */ - if (p_mcb->flow == PORT_FC_UNDEFINED) - { - if ((PORT_FC_DEFAULT == PORT_FC_TS710) || (cl == RFCOMM_PN_CONV_LAYER_TYPE_1)) - { + if (p_mcb->flow == PORT_FC_UNDEFINED) { + if ((PORT_FC_DEFAULT == PORT_FC_TS710) || (cl == RFCOMM_PN_CONV_LAYER_TYPE_1)) { p_mcb->flow = PORT_FC_TS710; - } - else - { + } else { p_mcb->flow = PORT_FC_CREDIT; } } @@ -346,13 +334,10 @@ void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) /* if (and only if) the PN request was 15." This could happen if a PN is sent */ /* after the DLCI is already established-- the PN in that case must have cl = 0. */ /* See RFCOMM spec 5.5.3 */ - if (cl == RFCOMM_PN_CONV_LAYER_TYPE_1) - { + if (cl == RFCOMM_PN_CONV_LAYER_TYPE_1) { our_cl = RFCOMM_PN_CONV_LAYER_TYPE_1; our_k = 0; - } - else if (p_mcb->flow == PORT_FC_CREDIT) - { + } else if (p_mcb->flow == PORT_FC_CREDIT) { /* get credits */ port_get_credits (p_port, k); @@ -360,9 +345,7 @@ void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) our_cl = RFCOMM_PN_CONV_LAYER_CBFC_R; our_k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max : RFCOMM_K_MAX; p_port->credit_rx = our_k; - } - else - { + } else { /* must not be using credit based flow control; use TS 7.10 */ our_cl = RFCOMM_PN_CONV_LAYER_TYPE_1; our_k = 0; @@ -388,28 +371,25 @@ void PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) RFCOMM_TRACE_EVENT ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k); - if (!p_port) + if (!p_port) { return; + } /* Flow control mechanism not set yet. Negotiate flow control mechanism. */ - if (p_mcb->flow == PORT_FC_UNDEFINED) - { + if (p_mcb->flow == PORT_FC_UNDEFINED) { /* Our stack is configured for TS07.10 and they responded with credit-based. */ /* This is illegal-- negotiation fails. */ - if ((PORT_FC_DEFAULT == PORT_FC_TS710) && (cl == RFCOMM_PN_CONV_LAYER_CBFC_R)) - { + if ((PORT_FC_DEFAULT == PORT_FC_TS710) && (cl == RFCOMM_PN_CONV_LAYER_CBFC_R)) { rfc_send_disc (p_mcb, p_port->dlci); rfc_port_closed (p_port); return; } /* Our stack is configured for credit-based and they responded with credit-based. */ - else if (cl == RFCOMM_PN_CONV_LAYER_CBFC_R) - { + else if (cl == RFCOMM_PN_CONV_LAYER_CBFC_R) { p_mcb->flow = PORT_FC_CREDIT; } /* They responded with any other value. Treat this as negotiation to TS07.10. */ - else - { + else { p_mcb->flow = PORT_FC_TS710; } } @@ -420,13 +400,13 @@ void PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) p_port->mtu = (p_port->mtu < mtu) ? p_port->mtu : mtu; p_port->peer_mtu = p_port->mtu; - if (p_mcb->flow == PORT_FC_CREDIT) - { + if (p_mcb->flow == PORT_FC_CREDIT) { port_get_credits (p_port, k); } - if (p_port->state == PORT_STATE_OPENING) + if (p_port->state == PORT_STATE_OPENING) { RFCOMM_DlcEstablishReq (p_mcb, p_port->dlci, p_port->mtu); + } } @@ -449,15 +429,13 @@ void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port); RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x", - p_mcb->bd_addr[0], p_mcb->bd_addr[1], p_mcb->bd_addr[2], - p_mcb->bd_addr[3], p_mcb->bd_addr[4], p_mcb->bd_addr[5]); + p_mcb->bd_addr[0], p_mcb->bd_addr[1], p_mcb->bd_addr[2], + p_mcb->bd_addr[3], p_mcb->bd_addr[4], p_mcb->bd_addr[5]); - if (!p_port) - { + if (!p_port) { /* This can be a first request for this port */ p_port = port_find_dlci_port (dlci); - if (!p_port) - { + if (!p_port) { RFCOMM_DlcEstablishRsp (p_mcb, dlci, 0, RFCOMM_ERROR); return; } @@ -465,8 +443,9 @@ void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) } /* If L2CAP's mtu less then RFCOMM's take it */ - if (mtu && (mtu < p_port->peer_mtu)) + if (mtu && (mtu < p_port->peer_mtu)) { p_port->peer_mtu = mtu; + } /* If there was an inactivity timer running for MCB stop it */ rfc_timer_stop (p_mcb); @@ -475,11 +454,13 @@ void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) /* This is the server side. If application wants to know when connection */ /* is established, thats the place */ - if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) + if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) { (p_port->p_callback)(PORT_EV_CONNECTED, p_port->inx); + } - if (p_port->p_mgmt_callback) + if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback (PORT_SUCCESS, p_port->inx); + } p_port->state = PORT_STATE_OPENED; } @@ -501,37 +482,41 @@ void PORT_DlcEstablishCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 resul RFCOMM_TRACE_EVENT ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result); - if (!p_port) + if (!p_port) { return; + } - if (result != RFCOMM_SUCCESS) - { + if (result != RFCOMM_SUCCESS) { p_port->error = PORT_START_FAILED; port_rfc_closed (p_port, PORT_START_FAILED); return; } /* If L2CAP's mtu less then RFCOMM's take it */ - if (mtu && (mtu < p_port->peer_mtu)) + if (mtu && (mtu < p_port->peer_mtu)) { p_port->peer_mtu = mtu; + } /* If there was an inactivity timer running for MCB stop it */ rfc_timer_stop (p_mcb); - if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) + if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) { (p_port->p_callback)(PORT_EV_CONNECTED, p_port->inx); + } - if (p_port->p_mgmt_callback) + if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback (PORT_SUCCESS, p_port->inx); + } p_port->state = PORT_STATE_OPENED; /* RPN is required only if we want to tell DTE how the port should be opened */ if ((p_port->uuid == UUID_SERVCLASS_DIALUP_NETWORKING) - || (p_port->uuid == UUID_SERVCLASS_FAX)) + || (p_port->uuid == UUID_SERVCLASS_FAX)) { RFCOMM_PortNegReq (p_port->rfc.p_mcb, p_port->dlci, NULL); - else + } else { RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); + } } @@ -553,12 +538,10 @@ void PORT_PortNegInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, RFCOMM_TRACE_EVENT ("PORT_PortNegInd"); - if (!p_port) - { + if (!p_port) { /* This can be a first request for this port */ p_port = port_find_dlci_port (dlci); - if (!p_port) - { + if (!p_port) { RFCOMM_PortNegRsp (p_mcb, dlci, p_pars, 0); return; } @@ -586,14 +569,12 @@ void PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 r RFCOMM_TRACE_EVENT ("PORT_PortNegCnf"); - if (!p_port) - { + if (!p_port) { RFCOMM_TRACE_WARNING ("PORT_PortNegCnf no port"); return; } /* Port negotiation failed. Drop the connection */ - if (result != RFCOMM_SUCCESS) - { + if (result != RFCOMM_SUCCESS) { p_port->error = PORT_PORT_NEG_FAILED; RFCOMM_DlcReleaseReq (p_mcb, p_port->dlci); @@ -602,12 +583,9 @@ void PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 r return; } - if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) - { + if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) { RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); - } - else - { + } else { RFCOMM_TRACE_WARNING ("PORT_PortNegCnf Control Already sent"); } } @@ -629,8 +607,9 @@ void PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) RFCOMM_TRACE_EVENT ("PORT_ControlInd"); - if (!p_port) + if (!p_port) { return; + } old_signals = p_port->peer_ctrl.modem_signal; @@ -638,36 +617,35 @@ void PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) p_port->peer_ctrl = *p_pars; - if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) + if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) { RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); - else - { + } else { /* If this is the first time we received control RFCOMM is connected */ - if (!(p_port->port_ctrl & PORT_CTRL_IND_RECEIVED)) - { + if (!(p_port->port_ctrl & PORT_CTRL_IND_RECEIVED)) { event |= (PORT_EV_CONNECTED & p_port->ev_mask); } - if (p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED) - { + if (p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED) { event |= port_rfc_send_tx_data(p_port); } } p_port->port_ctrl |= (PORT_CTRL_IND_RECEIVED | PORT_CTRL_IND_RESPONDED); - if (p_pars->break_signal) + if (p_pars->break_signal) { event |= (PORT_EV_BREAK & p_port->ev_mask); + } /* execute call back function only if the application is registered for events */ - if (event && p_port->p_callback) + if (event && p_port->p_callback) { (p_port->p_callback)(event, p_port->inx); + } RFCOMM_TRACE_EVENT ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d", - ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0), - ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0), - ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0), - ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0)); + ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0), + ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0), + ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0), + ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0)); } @@ -688,25 +666,26 @@ void PORT_ControlCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) RFCOMM_TRACE_EVENT ("PORT_ControlCnf"); - if (!p_port) + if (!p_port) { return; - - if (!(p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED)) - { - p_port->port_ctrl |= PORT_CTRL_REQ_CONFIRMED; - - if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) - event = (p_port->ev_mask & PORT_EV_CONNECTED); } - if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) - { + if (!(p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED)) { + p_port->port_ctrl |= PORT_CTRL_REQ_CONFIRMED; + + if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) { + event = (p_port->ev_mask & PORT_EV_CONNECTED); + } + } + + if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) { event |= port_rfc_send_tx_data(p_port); } /* execute call back function only if the application is registered for events */ - if (event && p_port->p_callback) + if (event && p_port->p_callback) { (p_port->p_callback)(event, p_port->inx); + } } @@ -725,22 +704,27 @@ void PORT_LineStatusInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status) RFCOMM_TRACE_EVENT ("PORT_LineStatusInd"); - if (!p_port) + if (!p_port) { return; + } p_port->line_status |= line_status; - if (line_status & PORT_ERR_OVERRUN) + if (line_status & PORT_ERR_OVERRUN) { event |= PORT_EV_OVERRUN; + } - if (line_status & PORT_ERR_BREAK) + if (line_status & PORT_ERR_BREAK) { event |= PORT_EV_BREAK; + } - if (line_status & ~(PORT_ERR_OVERRUN | PORT_ERR_BREAK)) + if (line_status & ~(PORT_ERR_OVERRUN | PORT_ERR_BREAK)) { event |= PORT_EV_ERR; + } - if ((p_port->p_callback != NULL) && (p_port->ev_mask & event)) - p_port->p_callback ((p_port->ev_mask & event), p_port->inx); + if ((p_port->p_callback != NULL) && (p_port->ev_mask & event)) { + p_port->p_callback ((p_port->ev_mask & event), p_port->inx); + } } @@ -758,8 +742,9 @@ void PORT_DlcReleaseInd (tRFC_MCB *p_mcb, UINT8 dlci) RFCOMM_TRACE_EVENT ("PORT_DlcReleaseInd"); - if (!p_port) + if (!p_port) { return; + } port_rfc_closed (p_port, PORT_CLOSED); } @@ -781,10 +766,8 @@ void PORT_CloseInd (tRFC_MCB *p_mcb) RFCOMM_TRACE_EVENT ("PORT_CloseInd"); p_port = &rfc_cb.port.port[0]; - for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) - { - if (p_port->rfc.p_mcb == p_mcb) - { + for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { + if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed (p_port, PORT_PEER_CONNECTION_FAILED); } } @@ -807,10 +790,8 @@ void Port_TimeOutCloseMux (tRFC_MCB *p_mcb) RFCOMM_TRACE_EVENT ("Port_TimeOutCloseMux"); p_port = &rfc_cb.port.port[0]; - for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) - { - if (p_port->rfc.p_mcb == p_mcb) - { + for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { + if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed (p_port, PORT_PEER_TIMEOUT); } } @@ -834,27 +815,27 @@ void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) int i; RFCOMM_TRACE_EVENT("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d", - p_buf->len, p_mcb, p_port, dlci); - if (!p_port) - { + p_buf->len, p_mcb, p_port, dlci); + if (!p_port) { GKI_freebuf (p_buf); return; } /* If client registered callout callback with flow control we can just deliver receive data */ - if (p_port->p_data_co_callback) - { + if (p_port->p_data_co_callback) { /* Another packet is delivered to user. Send credits to peer if required */ - if(p_port->p_data_co_callback(p_port->inx, (UINT8*)p_buf, -1, DATA_CO_CALLBACK_TYPE_INCOMING)) + if (p_port->p_data_co_callback(p_port->inx, (UINT8 *)p_buf, -1, DATA_CO_CALLBACK_TYPE_INCOMING)) { port_flow_control_peer(p_port, TRUE, 1); - else port_flow_control_peer(p_port, FALSE, 0); + } else { + port_flow_control_peer(p_port, FALSE, 0); + } //GKI_freebuf (p_buf); return; + } else { + RFCOMM_TRACE_ERROR("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port); } - else RFCOMM_TRACE_ERROR("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port); /* If client registered callback we can just deliver receive data */ - if (p_port->p_data_callback) - { + if (p_port->p_data_callback) { /* Another packet is delivered to user. Send credits to peer if required */ port_flow_control_peer(p_port, TRUE, 1); @@ -865,8 +846,7 @@ void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) /* Check if rx queue exceeds the limit */ if ((p_port->rx.queue_size + p_buf->len > PORT_RX_CRITICAL_WM) - || (GKI_queue_length(&p_port->rx.queue) + 1 > p_port->rx_buf_critical)) - { + || (GKI_queue_length(&p_port->rx.queue) + 1 > p_port->rx_buf_critical)) { RFCOMM_TRACE_EVENT ("PORT_DataInd. Buffer over run. Dropping the buffer"); GKI_freebuf (p_buf); @@ -877,12 +857,9 @@ void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) /* If user registered to receive notification when a particular byte is */ /* received we mast check all received bytes */ if (((rx_char1 = p_port->user_port_pars.rx_char1) != 0) - && (p_port->ev_mask & PORT_EV_RXFLAG)) - { - for (i = 0, p = (UINT8 *)(p_buf + 1) + p_buf->offset; i < p_buf->len; i++) - { - if (*p++ == rx_char1) - { + && (p_port->ev_mask & PORT_EV_RXFLAG)) { + for (i = 0, p = (UINT8 *)(p_buf + 1) + p_buf->offset; i < p_buf->len; i++) { + if (*p++ == rx_char1) { events |= PORT_EV_RXFLAG; break; } @@ -900,10 +877,10 @@ void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) port_flow_control_peer(p_port, FALSE, 0); /* If user indicated flow control can not deliver any notifications to him */ - if (p_port->rx.user_fc) - { - if (events & PORT_EV_RXFLAG) + if (p_port->rx.user_fc) { + if (events & PORT_EV_RXFLAG) { p_port->rx_flag_ev_pending = TRUE; + } return; } @@ -913,8 +890,9 @@ void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) /* Mask out all events that are not of interest to user */ events &= p_port->ev_mask; - if (p_port->p_callback && events) + if (p_port->p_callback && events) { p_port->p_callback (events, p_port->inx); + } } @@ -934,28 +912,25 @@ void PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN enable_data) RFCOMM_TRACE_EVENT ("PORT_FlowInd fc:%d", enable_data); - if (dlci == 0) - { + if (dlci == 0) { p_mcb->peer_ready = enable_data; - } - else - { - if ((p_port = port_find_mcb_dlci_port (p_mcb, dlci)) == NULL) + } else { + if ((p_port = port_find_mcb_dlci_port (p_mcb, dlci)) == NULL) { return; + } p_port->tx.peer_fc = !enable_data; } - for (i = 0; i < MAX_RFC_PORTS; i++) - { + for (i = 0; i < MAX_RFC_PORTS; i++) { /* If DLCI is 0 event applies to all ports */ - if (dlci == 0) - { + if (dlci == 0) { p_port = &rfc_cb.port.port[i]; if (!p_port->in_use - || (p_port->rfc.p_mcb != p_mcb) - || (p_port->rfc.state != RFC_STATE_OPENED)) + || (p_port->rfc.p_mcb != p_mcb) + || (p_port->rfc.state != RFC_STATE_OPENED)) { continue; + } } events = 0; @@ -969,12 +944,14 @@ void PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN enable_data) events &= p_port->ev_mask; /* Send event to the application */ - if (p_port->p_callback && events) + if (p_port->p_callback && events) { (p_port->p_callback)(events, p_port->inx); + } /* If DLCI is not 0 event applies to one port only */ - if (dlci != 0) + if (dlci != 0) { break; + } } } @@ -992,16 +969,13 @@ UINT32 port_rfc_send_tx_data (tPORT *p_port) BT_HDR *p_buf; /* if there is data to be sent */ - if (p_port->tx.queue_size > 0) - { + if (p_port->tx.queue_size > 0) { /* while the rfcomm peer is not flow controlling us, and peer is ready */ - while (!p_port->tx.peer_fc && p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready) - { + while (!p_port->tx.peer_fc && p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready) { /* get data from tx queue and send it */ PORT_SCHEDULE_LOCK; - if ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) { p_port->tx.queue_size -= p_buf->len; PORT_SCHEDULE_UNLOCK; @@ -1012,15 +986,13 @@ UINT32 port_rfc_send_tx_data (tPORT *p_port) events |= PORT_EV_TXCHAR; - if (p_port->tx.queue_size == 0) - { + if (p_port->tx.queue_size == 0) { events |= PORT_EV_TXEMPTY; break; } } /* queue is empty-- all data sent */ - else - { + else { PORT_SCHEDULE_UNLOCK; events |= PORT_EV_TXEMPTY; @@ -1047,16 +1019,14 @@ void port_rfc_closed (tPORT *p_port, UINT8 res) UINT32 events = 0; tRFC_MCB *p_mcb = p_port->rfc.p_mcb; - if ((p_port->state == PORT_STATE_OPENING) && (p_port->is_server)) - { + if ((p_port->state == PORT_STATE_OPENING) && (p_port->is_server)) { /* The servr side has not been informed that connection is up, ignore */ RFCOMM_TRACE_EVENT ("port_rfc_closed in OPENING state ignored"); rfc_port_timer_stop (p_port); p_port->rfc.state = RFC_STATE_CLOSED; - if (p_mcb) - { + if (p_mcb) { p_mcb->port_inx[p_port->dlci] = 0; /* If there are no more ports opened on this MCB release it */ @@ -1072,8 +1042,7 @@ void port_rfc_closed (tPORT *p_port, UINT8 res) return; } - if ((p_port->state != PORT_STATE_CLOSING) && (p_port->state != PORT_STATE_CLOSED)) - { + if ((p_port->state != PORT_STATE_CLOSING) && (p_port->state != PORT_STATE_CLOSED)) { p_port->line_status |= LINE_STATUS_FAILED; old_signals = p_port->peer_ctrl.modem_signal; @@ -1082,16 +1051,19 @@ void port_rfc_closed (tPORT *p_port, UINT8 res) events |= port_get_signal_changes (p_port, old_signals, p_port->peer_ctrl.modem_signal); - if(p_port->ev_mask & PORT_EV_CONNECT_ERR) + if (p_port->ev_mask & PORT_EV_CONNECT_ERR) { events |= PORT_EV_CONNECT_ERR; + } } RFCOMM_TRACE_EVENT ("port_rfc_closed state:%d sending events:%x", p_port->state, events); - if ((p_port->p_callback != NULL) && events) + if ((p_port->p_callback != NULL) && events) { p_port->p_callback (events, p_port->inx); + } - if (p_port->p_mgmt_callback) + if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback (res, p_port->inx); + } p_port->rfc.state = RFC_STATE_CLOSED; @@ -1115,6 +1087,7 @@ void port_rfc_closed (tPORT *p_port, UINT8 res) void port_get_credits (tPORT *p_port, UINT8 k) { p_port->credit_tx = k; - if (p_port->credit_tx == 0) + if (p_port->credit_tx == 0) { p_port->tx.peer_fc = TRUE; + } } diff --git a/components/bt/bluedroid/profiles/std/rfcomm/port_utils.c b/components/bt/bluedroid/stack/rfcomm/port_utils.c old mode 100755 new mode 100644 similarity index 82% rename from components/bt/bluedroid/profiles/std/rfcomm/port_utils.c rename to components/bt/bluedroid/stack/rfcomm/port_utils.c index 7d29336dd..5b2e79178 --- a/components/bt/bluedroid/profiles/std/rfcomm/port_utils.c +++ b/components/bt/bluedroid/stack/rfcomm/port_utils.c @@ -33,8 +33,7 @@ #include "btm_int.h" #include "btu.h" -static const tPORT_STATE default_port_pars = -{ +static const tPORT_STATE default_port_pars = { PORT_BAUD_RATE_9600, PORT_8_BITS, PORT_ONESTOPBIT, @@ -65,14 +64,13 @@ tPORT *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr) tPORT *p_port = &rfc_cb.port.port[0]; UINT8 xx, yy; - for (xx = 0, yy = rfc_cb.rfc.last_port + 1; xx < MAX_RFC_PORTS; xx++, yy++) - { - if (yy >= MAX_RFC_PORTS) + for (xx = 0, yy = rfc_cb.rfc.last_port + 1; xx < MAX_RFC_PORTS; xx++, yy++) { + if (yy >= MAX_RFC_PORTS) { yy = 0; + } p_port = &rfc_cb.port.port[yy]; - if (!p_port->in_use) - { + if (!p_port->in_use) { memset (p_port, 0, sizeof (tPORT)); p_port->in_use = TRUE; @@ -87,7 +85,7 @@ tPORT *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr) rfc_cb.rfc.last_port = yy; RFCOMM_TRACE_DEBUG("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port); RFCOMM_TRACE_DEBUG("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); return (p_port); } } @@ -120,8 +118,8 @@ void port_set_defaults (tPORT *p_port) p_port->credit_tx = 0; p_port->credit_rx = 0; -/* p_port->credit_rx_max = PORT_CREDIT_RX_MAX; Determined later */ -/* p_port->credit_rx_low = PORT_CREDIT_RX_LOW; Determined later */ + /* p_port->credit_rx_max = PORT_CREDIT_RX_MAX; Determined later */ + /* p_port->credit_rx_low = PORT_CREDIT_RX_LOW; Determined later */ memset (&p_port->local_ctrl, 0, sizeof (p_port->local_ctrl)); memset (&p_port->peer_ctrl, 0, sizeof (p_port->peer_ctrl)); @@ -145,18 +143,14 @@ void port_select_mtu (tPORT *p_port) UINT16 packet_size; /* Will select MTU only if application did not setup something */ - if (p_port->mtu == 0) - { + if (p_port->mtu == 0) { /* find packet size which connection supports */ packet_size = btm_get_max_packet_size (p_port->bd_addr); - if (packet_size == 0) - { + if (packet_size == 0) { /* something is very wrong */ RFCOMM_TRACE_WARNING ("port_select_mtu bad packet size"); p_port->mtu = RFCOMM_DEFAULT_MTU; - } - else - { + } else { /* We try to negotiate MTU that each packet can be split into whole number of max packets. For example if link is 1.2 max packet size is 339 bytes. At first calculate how many whole packets it is. MAX L2CAP is 1691 + 4 overhead. @@ -165,33 +159,31 @@ void port_select_mtu (tPORT *p_port) For EDR 2.0 packet size is 1027. So we better send RFCOMM packet as 1 3DH5 packet 1 * 1027 = 1027. Minus 4 bytes L2CAP header 1023. Minus RFCOMM 6 bytes header overhead 1017 */ - if ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) >= packet_size) - { + if ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) >= packet_size) { p_port->mtu = ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) / packet_size * packet_size) - RFCOMM_DATA_OVERHEAD - L2CAP_PKT_OVERHEAD; RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on connection speed", p_port->mtu); - } - else - { + } else { p_port->mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD; RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu); } } - } - else - { + } else { RFCOMM_TRACE_DEBUG ("port_select_mtu application selected %d", p_port->mtu); } p_port->credit_rx_max = (PORT_RX_HIGH_WM / p_port->mtu); - if( p_port->credit_rx_max > PORT_RX_BUF_HIGH_WM ) + if ( p_port->credit_rx_max > PORT_RX_BUF_HIGH_WM ) { p_port->credit_rx_max = PORT_RX_BUF_HIGH_WM; + } p_port->credit_rx_low = (PORT_RX_LOW_WM / p_port->mtu); - if( p_port->credit_rx_low > PORT_RX_BUF_LOW_WM ) + if ( p_port->credit_rx_low > PORT_RX_BUF_LOW_WM ) { p_port->credit_rx_low = PORT_RX_BUF_LOW_WM; + } p_port->rx_buf_critical = (PORT_RX_CRITICAL_WM / p_port->mtu); - if( p_port->rx_buf_critical > PORT_RX_BUF_CRITICAL_WM ) + if ( p_port->rx_buf_critical > PORT_RX_BUF_CRITICAL_WM ) { p_port->rx_buf_critical = PORT_RX_BUF_CRITICAL_WM; + } RFCOMM_TRACE_DEBUG ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d", - p_port->credit_rx_max, p_port->credit_rx_low, p_port->rx_buf_critical); + p_port->credit_rx_max, p_port->credit_rx_low, p_port->rx_buf_critical); } @@ -213,13 +205,15 @@ void port_release_port (tPORT *p_port) PORT_SCHEDULE_LOCK; RFCOMM_TRACE_DEBUG("port_release_port, p_port:%p", p_port); - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL) + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL) { GKI_freebuf (p_buf); + } p_port->rx.queue_size = 0; - while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) + while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) { GKI_freebuf (p_buf); + } p_port->tx.queue_size = 0; @@ -227,11 +221,9 @@ void port_release_port (tPORT *p_port) p_port->state = PORT_STATE_CLOSED; - if (p_port->rfc.state == RFC_STATE_CLOSED) - { + if (p_port->rfc.state == RFC_STATE_CLOSED) { RFCOMM_TRACE_DEBUG ("rfc_port_closed DONE"); - if (p_port->rfc.p_mcb) - { + if (p_port->rfc.p_mcb) { p_port->rfc.p_mcb->port_inx[p_port->dlci] = 0; /* If there are no more ports opened on this MCB release it */ @@ -239,8 +231,7 @@ void port_release_port (tPORT *p_port) } rfc_port_timer_stop (p_port); RFCOMM_TRACE_DEBUG ("port_release_port:p_port->keep_port_handle:%d", p_port->keep_port_handle); - if( p_port->keep_port_handle ) - { + if ( p_port->keep_port_handle ) { RFCOMM_TRACE_DEBUG ("port_release_port:Initialize handle:%d", p_port->inx); /* save event mask and callback */ mask = p_port->ev_mask; @@ -256,14 +247,13 @@ void port_release_port (tPORT *p_port) p_port->state = PORT_STATE_OPENING; p_port->rfc.p_mcb = NULL; - if(p_port->is_server) + if (p_port->is_server) { p_port->dlci &= 0xfe; + } p_port->local_ctrl.modem_signal = p_port->default_signal_state; memcpy (p_port->bd_addr, BT_BD_ANY, BD_ADDR_LEN); - } - else - { + } else { RFCOMM_TRACE_DEBUG ("port_release_port:Clean-up handle:%d", p_port->inx); memset (p_port, 0, sizeof (tPORT)); } @@ -283,21 +273,19 @@ tRFC_MCB *port_find_mcb (BD_ADDR bd_addr) { int i; - for (i = 0; i < MAX_BD_CONNECTIONS; i++) - { + for (i = 0; i < MAX_BD_CONNECTIONS; i++) { if ((rfc_cb.port.rfc_mcb[i].state != RFC_MX_STATE_IDLE) - && !memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN)) - { + && !memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN)) { /* Multiplexer channel found do not change anything */ RFCOMM_TRACE_DEBUG("port_find_mcb: found bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); RFCOMM_TRACE_DEBUG("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d", - i, &rfc_cb.port.rfc_mcb[i], rfc_cb.port.rfc_mcb[i].lcid); + i, &rfc_cb.port.rfc_mcb[i], rfc_cb.port.rfc_mcb[i].lcid); return (&rfc_cb.port.rfc_mcb[i]); } } RFCOMM_TRACE_DEBUG("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); return (NULL); } @@ -318,20 +306,21 @@ tPORT *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, UINT8 dlci) { UINT8 inx; - if (!p_mcb) - return (NULL); - - if (dlci > RFCOMM_MAX_DLCI) - return (NULL); - - inx = p_mcb->port_inx[dlci]; - if (inx == 0) - { - RFCOMM_TRACE_DEBUG("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci); + if (!p_mcb) { return (NULL); } - else + + if (dlci > RFCOMM_MAX_DLCI) { + return (NULL); + } + + inx = p_mcb->port_inx[dlci]; + if (inx == 0) { + RFCOMM_TRACE_DEBUG("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci); + return (NULL); + } else { return (&rfc_cb.port.port[inx - 1]); + } } @@ -349,18 +338,13 @@ tPORT *port_find_dlci_port (UINT8 dlci) UINT16 i; tPORT *p_port; - for (i = 0; i < MAX_RFC_PORTS; i++) - { + for (i = 0; i < MAX_RFC_PORTS; i++) { p_port = &rfc_cb.port.port[i]; - if (p_port->in_use && (p_port->rfc.p_mcb == NULL)) - { - if (p_port->dlci == dlci) - { + if (p_port->in_use && (p_port->rfc.p_mcb == NULL)) { + if (p_port->dlci == dlci) { return (p_port); - } - else if ((dlci & 0x01) && (p_port->dlci == (dlci - 1))) - { + } else if ((dlci & 0x01) && (p_port->dlci == (dlci - 1))) { p_port->dlci++; return (p_port); } @@ -384,13 +368,11 @@ tPORT *port_find_port (UINT8 dlci, BD_ADDR bd_addr) UINT16 i; tPORT *p_port; - for (i = 0; i < MAX_RFC_PORTS; i++) - { + for (i = 0; i < MAX_RFC_PORTS; i++) { p_port = &rfc_cb.port.port[i]; if (p_port->in_use - && (p_port->dlci == dlci) - && !memcmp (p_port->bd_addr, bd_addr, BD_ADDR_LEN)) - { + && (p_port->dlci == dlci) + && !memcmp (p_port->bd_addr, bd_addr, BD_ADDR_LEN)) { return (p_port); } } @@ -417,20 +399,22 @@ UINT32 port_flow_control_user (tPORT *p_port) /* (FlowInd, or flow control by the peer RFCOMM (Fcon) or internally if */ /* tx_queue is full */ BOOLEAN fc = p_port->tx.peer_fc - || !p_port->rfc.p_mcb - || !p_port->rfc.p_mcb->peer_ready - || (p_port->tx.queue_size > PORT_TX_HIGH_WM) - || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM); + || !p_port->rfc.p_mcb + || !p_port->rfc.p_mcb->peer_ready + || (p_port->tx.queue_size > PORT_TX_HIGH_WM) + || (GKI_queue_length(&p_port->tx.queue) > PORT_TX_BUF_HIGH_WM); - if (p_port->tx.user_fc == fc) + if (p_port->tx.user_fc == fc) { return (0); + } p_port->tx.user_fc = fc; - if (fc) + if (fc) { event = PORT_EV_FC; - else + } else { event = PORT_EV_FC | PORT_EV_FCS; + } return (event); } @@ -450,31 +434,32 @@ UINT32 port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal) UINT8 changed_signals = (signal ^ old_signals); UINT32 events = 0; - if (changed_signals & PORT_DTRDSR_ON) - { + if (changed_signals & PORT_DTRDSR_ON) { events |= PORT_EV_DSR; - if (signal & PORT_DTRDSR_ON) + if (signal & PORT_DTRDSR_ON) { events |= PORT_EV_DSRS; + } } - if (changed_signals & PORT_CTSRTS_ON) - { + if (changed_signals & PORT_CTSRTS_ON) { events |= PORT_EV_CTS; - if (signal & PORT_CTSRTS_ON) + if (signal & PORT_CTSRTS_ON) { events |= PORT_EV_CTSS; + } } - if (changed_signals & PORT_RING_ON) + if (changed_signals & PORT_RING_ON) { events |= PORT_EV_RING; + } - if (changed_signals & PORT_DCD_ON) - { + if (changed_signals & PORT_DCD_ON) { events |= PORT_EV_RLSD; - if (signal & PORT_DCD_ON) + if (signal & PORT_DCD_ON) { events |= PORT_EV_RLSDS; + } } return (p_port->ev_mask & events); @@ -493,22 +478,18 @@ UINT32 port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal) *******************************************************************************/ void port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count) { - if (!p_port->rfc.p_mcb) + if (!p_port->rfc.p_mcb) { return; + } /* If using credit based flow control */ - if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - { + if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) { /* if want to enable flow from peer */ - if (enable) - { + if (enable) { /* update rx credits */ - if (count > p_port->credit_rx) - { + if (count > p_port->credit_rx) { p_port->credit_rx = 0; - } - else - { + } else { p_port->credit_rx -= count; } @@ -516,9 +497,8 @@ void port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count) /* did not force flow control, send a credit update */ /* There might be a special case when we just adjusted rx_max */ if ((p_port->credit_rx <= p_port->credit_rx_low) - && !p_port->rx.user_fc - && (p_port->credit_rx_max > p_port->credit_rx)) - { + && !p_port->rx.user_fc + && (p_port->credit_rx_max > p_port->credit_rx)) { rfc_send_credit(p_port->rfc.p_mcb, p_port->dlci, (UINT8) (p_port->credit_rx_max - p_port->credit_rx)); @@ -528,54 +508,46 @@ void port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count) } } /* else want to disable flow from peer */ - else - { + else { /* if client registered data callback, just do what they want */ - if (p_port->p_data_callback || p_port->p_data_co_callback) - { + if (p_port->p_data_callback || p_port->p_data_co_callback) { p_port->rx.peer_fc = TRUE; } /* if queue count reached credit rx max, set peer fc */ - else if (GKI_queue_length(&p_port->rx.queue) >= p_port->credit_rx_max) - { + else if (GKI_queue_length(&p_port->rx.queue) >= p_port->credit_rx_max) { p_port->rx.peer_fc = TRUE; } } } /* else using TS 07.10 flow control */ - else - { + else { /* if want to enable flow from peer */ - if (enable) - { + if (enable) { /* If rfcomm suspended traffic from the peer based on the rx_queue_size */ /* check if it can be resumed now */ if (p_port->rx.peer_fc - && (p_port->rx.queue_size < PORT_RX_LOW_WM) - && (GKI_queue_length(&p_port->rx.queue) < PORT_RX_BUF_LOW_WM)) - { + && (p_port->rx.queue_size < PORT_RX_LOW_WM) + && (GKI_queue_length(&p_port->rx.queue) < PORT_RX_BUF_LOW_WM)) { p_port->rx.peer_fc = FALSE; /* If user did not force flow control allow traffic now */ - if (!p_port->rx.user_fc) + if (!p_port->rx.user_fc) { RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, TRUE); + } } } /* else want to disable flow from peer */ - else - { + else { /* if client registered data callback, just do what they want */ - if (p_port->p_data_callback || p_port->p_data_co_callback) - { + if (p_port->p_data_callback || p_port->p_data_co_callback) { p_port->rx.peer_fc = TRUE; RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, FALSE); } /* Check the size of the rx queue. If it exceeds certain */ /* level and flow control has not been sent to the peer do it now */ else if ( ((p_port->rx.queue_size > PORT_RX_HIGH_WM) - || (GKI_queue_length(&p_port->rx.queue) > PORT_RX_BUF_HIGH_WM)) - && !p_port->rx.peer_fc) - { + || (GKI_queue_length(&p_port->rx.queue) > PORT_RX_BUF_HIGH_WM)) + && !p_port->rx.peer_fc) { RFCOMM_TRACE_EVENT ("PORT_DataInd Data reached HW. Sending FC set."); p_port->rx.peer_fc = TRUE; diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_l2cap_if.c b/components/bt/bluedroid/stack/rfcomm/rfc_l2cap_if.c old mode 100755 new mode 100644 similarity index 90% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_l2cap_if.c rename to components/bt/bluedroid/stack/rfcomm/rfc_l2cap_if.c index fba523a0f..b050532d0 --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_l2cap_if.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_l2cap_if.c @@ -91,11 +91,9 @@ void RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) tRFC_MCB *p_mcb = rfc_alloc_multiplexer_channel(bd_addr, FALSE); UNUSED(psm); - if ((p_mcb)&&(p_mcb->state != RFC_MX_STATE_IDLE)) - { + if ((p_mcb) && (p_mcb->state != RFC_MX_STATE_IDLE)) { /* if this is collision case */ - if ((p_mcb->is_initiator)&&(p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF)) - { + if ((p_mcb->is_initiator) && (p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF)) { p_mcb->pending_lcid = lcid; p_mcb->pending_id = id; @@ -103,26 +101,21 @@ void RFCOMM_ConnectInd (BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 id) /* if peer gives up then local device rejects incoming connection and continues as initiator */ /* if timeout, local device disconnects outgoing connection and continues as acceptor */ RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)", - p_mcb->lcid, p_mcb->pending_lcid); + p_mcb->lcid, p_mcb->pending_lcid); - rfc_timer_start(p_mcb, (UINT16)(GKI_get_os_tick_count()%10 + 2)); + rfc_timer_start(p_mcb, (UINT16)(GKI_get_os_tick_count() % 10 + 2)); return; - } - else - { + } else { /* we cannot accept connection request from peer at this state */ /* don't update lcid */ p_mcb = NULL; } - } - else - { + } else { /* store mcb even if null */ rfc_save_lcid_mcb (p_mcb, lcid); } - if (p_mcb == NULL) - { + if (p_mcb == NULL) { L2CA_ConnectRsp (bd_addr, id, lcid, L2CAP_CONN_NO_RESOURCES, 0); return; } @@ -145,17 +138,14 @@ void RFCOMM_ConnectCnf (UINT16 lcid, UINT16 result) { tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_ERROR ("RFCOMM_ConnectCnf LCID:0x%x", lcid); return; } - if (p_mcb->pending_lcid) - { + if (p_mcb->pending_lcid) { /* if peer rejects our connect request but peer's connect request is pending */ - if (result != L2CAP_CONN_OK ) - { + if (result != L2CAP_CONN_OK ) { UINT16 i; UINT8 idx; @@ -172,12 +162,10 @@ void RFCOMM_ConnectCnf (UINT16 lcid, UINT16 result) rfc_save_lcid_mcb (p_mcb, p_mcb->lcid); /* update direction bit */ - for (i = 0; i < RFCOMM_MAX_DLCI; i += 2) - { - if ((idx = p_mcb->port_inx[i]) != 0) - { + for (i = 0; i < RFCOMM_MAX_DLCI; i += 2) { + if ((idx = p_mcb->port_inx[i]) != 0) { p_mcb->port_inx[i] = 0; - p_mcb->port_inx[i+1] = idx; + p_mcb->port_inx[i + 1] = idx; rfc_cb.port.port[idx - 1].dlci += 1; RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci); } @@ -185,9 +173,7 @@ void RFCOMM_ConnectCnf (UINT16 lcid, UINT16 result) rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &(p_mcb->pending_id)); return; - } - else - { + } else { RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid); /* Peer gave up his connection request, make sure cleaning up L2CAP channel */ @@ -217,8 +203,7 @@ void RFCOMM_ConfigInd (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) { tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_ERROR ("RFCOMM_ConfigInd LCID:0x%x", lcid); return; } @@ -240,8 +225,7 @@ void RFCOMM_ConfigCnf (UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) { tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_ERROR ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid); return; } @@ -276,13 +260,11 @@ void RFCOMM_DisconnectInd (UINT16 lcid, BOOLEAN is_conf_needed) { tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); - if (is_conf_needed) - { + if (is_conf_needed) { L2CA_DisconnectRsp (lcid); } - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_WARNING ("RFCOMM_DisconnectInd LCID:0x%x", lcid); return; } @@ -308,8 +290,7 @@ void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf) UINT8 event; - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_WARNING ("RFCOMM_BufDataInd LCID:0x%x", lcid); GKI_freebuf (p_buf); return; @@ -318,17 +299,14 @@ void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf) event = rfc_parse_data (p_mcb, &rfc_cb.rfc.rx_frame, p_buf); /* If the frame did not pass validation just ignore it */ - if (event == RFC_EVENT_BAD_FRAME) - { + if (event == RFC_EVENT_BAD_FRAME) { GKI_freebuf (p_buf); return; } - if (rfc_cb.rfc.rx_frame.dlci == RFCOMM_MX_DLCI) - { + if (rfc_cb.rfc.rx_frame.dlci == RFCOMM_MX_DLCI) { /* Take special care of the Multiplexer Control Messages */ - if (event == RFC_EVENT_UIH) - { + if (event == RFC_EVENT_UIH) { rfc_process_mx_message (p_mcb, p_buf); return; } @@ -341,20 +319,18 @@ void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf) /* The frame was received on the data channel DLCI, verify that DLC exists */ if (((p_port = port_find_mcb_dlci_port (p_mcb, rfc_cb.rfc.rx_frame.dlci)) == NULL) - || (!p_port->rfc.p_mcb)) - { + || (!p_port->rfc.p_mcb)) { /* If this is a SABME on the new port, check if any appl is waiting for it */ - if (event != RFC_EVENT_SABME) - { + if (event != RFC_EVENT_SABME) { if (( p_mcb->is_initiator && !rfc_cb.rfc.rx_frame.cr) - || (!p_mcb->is_initiator && rfc_cb.rfc.rx_frame.cr)) + || (!p_mcb->is_initiator && rfc_cb.rfc.rx_frame.cr)) { rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, rfc_cb.rfc.rx_frame.pf); + } GKI_freebuf (p_buf); return; } - if ((p_port = port_find_dlci_port (rfc_cb.rfc.rx_frame.dlci)) == NULL) - { + if ((p_port = port_find_dlci_port (rfc_cb.rfc.rx_frame.dlci)) == NULL) { rfc_send_dm (p_mcb, rfc_cb.rfc.rx_frame.dlci, TRUE); GKI_freebuf (p_buf); return; @@ -363,15 +339,16 @@ void RFCOMM_BufDataInd (UINT16 lcid, BT_HDR *p_buf) p_port->rfc.p_mcb = p_mcb; } - if (event == RFC_EVENT_UIH) - { - if (p_buf->len > 0) + if (event == RFC_EVENT_UIH) { + if (p_buf->len > 0) { rfc_port_sm_execute (p_port, event, p_buf); - else + } else { GKI_freebuf (p_buf); + } - if (rfc_cb.rfc.rx_frame.credit != 0) + if (rfc_cb.rfc.rx_frame.credit != 0) { rfc_inc_credit (p_port, rfc_cb.rfc.rx_frame.credit); + } return; } @@ -391,13 +368,10 @@ void RFCOMM_CongestionStatusInd (UINT16 lcid, BOOLEAN is_congested) { tRFC_MCB *p_mcb = rfc_find_lcid_mcb (lcid); - if (!p_mcb) - { + if (!p_mcb) { RFCOMM_TRACE_ERROR ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid); return; - } - else - { + } else { RFCOMM_TRACE_EVENT ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid); } rfc_process_l2cap_congestion (p_mcb, is_congested); @@ -414,17 +388,12 @@ tRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid) { tRFC_MCB *p_mcb; - if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS) - { + if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS) { RFCOMM_TRACE_ERROR ("rfc_find_lcid_mcb LCID:0x%x", lcid); return (NULL); - } - else - { - if ((p_mcb = rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID]) != NULL) - { - if (p_mcb->lcid != lcid) - { + } else { + if ((p_mcb = rfc_cb.rfc.p_rfc_lcid_mcb[lcid - L2CAP_BASE_APPL_CID]) != NULL) { + if (p_mcb->lcid != lcid) { RFCOMM_TRACE_WARNING ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid); return (NULL); } diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_mx_fsm.c b/components/bt/bluedroid/stack/rfcomm/rfc_mx_fsm.c old mode 100755 new mode 100644 similarity index 93% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_mx_fsm.c rename to components/bt/bluedroid/stack/rfcomm/rfc_mx_fsm.c index 10d6d6a0e..70411e984 --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_mx_fsm.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_mx_fsm.c @@ -66,8 +66,7 @@ static void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg); *******************************************************************************/ void rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data) { - switch (p_mcb->state) - { + switch (p_mcb->state) { case RFC_MX_STATE_IDLE: rfc_mx_sm_state_idle (p_mcb, event, p_data); break; @@ -114,15 +113,13 @@ void rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data) void rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data) { RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_idle - evt:%d", event); - switch (event) - { + switch (event) { case RFC_MX_EVENT_START_REQ: /* Initialize L2CAP MTU */ p_mcb->peer_l2cap_mtu = L2CAP_DEFAULT_MTU - RFCOMM_MIN_OFFSET - 1; - if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0) - { + if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0) { PORT_StartCnf (p_mcb, RFCOMM_ERROR); return; } @@ -181,8 +178,7 @@ void rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data) void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data) { RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event); - switch (event) - { + switch (event) { case RFC_MX_EVENT_START_REQ: RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event); return; @@ -194,8 +190,7 @@ void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data) return; case RFC_MX_EVENT_CONN_CNF: - if (*((UINT16 *)p_data) != L2CAP_SUCCESS) - { + if (*((UINT16 *)p_data) != L2CAP_SUCCESS) { p_mcb->state = RFC_MX_STATE_IDLE; PORT_StartCnf (p_mcb, *((UINT16 *)p_data)); @@ -215,8 +210,7 @@ void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data) L2CA_DisconnectReq (p_mcb->lcid); /* we gave up outgoing connection request then try peer's request */ - if (p_mcb->pending_lcid) - { + if (p_mcb->pending_lcid) { UINT16 i; UINT8 idx; @@ -229,21 +223,17 @@ void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data) p_mcb->is_initiator = FALSE; /* update direction bit */ - for (i = 0; i < RFCOMM_MAX_DLCI; i += 2) - { - if ((idx = p_mcb->port_inx[i]) != 0) - { + for (i = 0; i < RFCOMM_MAX_DLCI; i += 2) { + if ((idx = p_mcb->port_inx[i]) != 0) { p_mcb->port_inx[i] = 0; - p_mcb->port_inx[i+1] = idx; + p_mcb->port_inx[i + 1] = idx; rfc_cb.port.port[idx - 1].dlci += 1; RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci); } } rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &(p_mcb->pending_id)); - } - else - { + } else { PORT_CloseInd (p_mcb); } return; @@ -265,8 +255,7 @@ void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data) void rfc_mx_sm_state_configure (tRFC_MCB *p_mcb, UINT16 event, void *p_data) { RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_configure - evt:%d", event); - switch (event) - { + switch (event) { case RFC_MX_EVENT_START_REQ: case RFC_MX_EVENT_CONN_CNF: @@ -312,8 +301,7 @@ void rfc_mx_sm_sabme_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data) UNUSED(p_data); RFCOMM_TRACE_EVENT ("rfc_mx_sm_sabme_wait_ua - evt:%d", event); - switch (event) - { + switch (event) { case RFC_MX_EVENT_START_REQ: case RFC_MX_EVENT_CONN_CNF: RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event); @@ -346,7 +334,7 @@ void rfc_mx_sm_sabme_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data) case RFC_EVENT_DM: rfc_timer_stop (p_mcb); - /* Case falls through */ + /* Case falls through */ case RFC_MX_EVENT_CONF_IND: /* workaround: we don't support reconfig */ case RFC_MX_EVENT_CONF_CNF: /* workaround: we don't support reconfig */ @@ -373,8 +361,7 @@ void rfc_mx_sm_sabme_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data) void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data) { RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_sabme - evt:%d", event); - switch (event) - { + switch (event) { case RFC_MX_EVENT_DISC_IND: p_mcb->state = RFC_MX_STATE_IDLE; PORT_CloseInd (p_mcb); @@ -382,8 +369,7 @@ void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data) case RFC_EVENT_SABME: /* if we gave up outgoing connection request */ - if (p_mcb->pending_lcid) - { + if (p_mcb->pending_lcid) { p_mcb->pending_lcid = 0; rfc_send_ua (p_mcb, RFCOMM_MX_DLCI); @@ -394,19 +380,16 @@ void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data) /* MX channel collision has been resolved, continue to open ports */ PORT_StartCnf (p_mcb, RFCOMM_SUCCESS); - } - else - { + } else { rfc_timer_stop (p_mcb); PORT_StartInd (p_mcb); } return; case RFC_MX_EVENT_START_RSP: - if (*((UINT16 *)p_data) != RFCOMM_SUCCESS) + if (*((UINT16 *)p_data) != RFCOMM_SUCCESS) { rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, TRUE); - else - { + } else { rfc_send_ua (p_mcb, RFCOMM_MX_DLCI); p_mcb->state = RFC_MX_STATE_CONNECTED; @@ -443,8 +426,7 @@ void rfc_mx_sm_state_connected (tRFC_MCB *p_mcb, UINT16 event, void *p_data) RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_connected - evt:%d", event); - switch (event) - { + switch (event) { case RFC_EVENT_TIMEOUT: case RFC_MX_EVENT_CLOSE_REQ: rfc_timer_start (p_mcb, RFC_DISC_TIMEOUT); @@ -461,8 +443,7 @@ void rfc_mx_sm_state_connected (tRFC_MCB *p_mcb, UINT16 event, void *p_data) /* Reply with UA. If initiator bring down L2CAP connection */ /* If server wait for some time if client decide to reinitiate channel */ rfc_send_ua (p_mcb, RFCOMM_MX_DLCI); - if (p_mcb->is_initiator) - { + if (p_mcb->is_initiator) { L2CA_DisconnectReq (p_mcb->lcid); } /* notify all ports that connection is gone */ @@ -488,18 +469,15 @@ void rfc_mx_sm_state_disc_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data) BT_HDR *p_buf; RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event); - switch (event) - { + switch (event) { case RFC_EVENT_UA: case RFC_EVENT_DM: case RFC_EVENT_TIMEOUT: L2CA_DisconnectReq (p_mcb->lcid); - if (p_mcb->restart_required) - { + if (p_mcb->restart_required) { /* Start Request was received while disconnecting. Execute it again */ - if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0) - { + if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0) { PORT_StartCnf (p_mcb, RFCOMM_ERROR); return; } @@ -507,8 +485,9 @@ void rfc_mx_sm_state_disc_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data) rfc_save_lcid_mcb (p_mcb, p_mcb->lcid); /* clean up before reuse it */ - while ((p_buf = (BT_HDR *)GKI_dequeue(&p_mcb->cmd_q)) != NULL) + while ((p_buf = (BT_HDR *)GKI_dequeue(&p_mcb->cmd_q)) != NULL) { GKI_freebuf(p_buf); + } rfc_timer_start (p_mcb, RFC_MCB_INIT_INACT_TIMER); @@ -570,14 +549,14 @@ static void rfc_mx_send_config_req (tRFC_MCB *p_mcb) cfg.mtu_present = TRUE; cfg.mtu = L2CAP_MTU_SIZE; -/* Defaults set by memset - cfg.flush_to_present = FALSE; - cfg.qos_present = FALSE; - cfg.fcr_present = FALSE; - cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; - cfg.fcs_present = FALSE; - cfg.fcs = N/A when fcs_present is FALSE; -*/ + /* Defaults set by memset + cfg.flush_to_present = FALSE; + cfg.qos_present = FALSE; + cfg.fcr_present = FALSE; + cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; + cfg.fcs_present = FALSE; + cfg.fcs = N/A when fcs_present is FALSE; + */ L2CA_ConfigReq (p_mcb->lcid, &cfg); } @@ -596,10 +575,8 @@ static void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg) { RFCOMM_TRACE_EVENT ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0); - if (p_cfg->result != L2CAP_CFG_OK) - { - if (p_mcb->is_initiator) - { + if (p_cfg->result != L2CAP_CFG_OK) { + if (p_mcb->is_initiator) { PORT_StartCnf (p_mcb, p_cfg->result); L2CA_DisconnectReq (p_mcb->lcid); } @@ -608,16 +585,12 @@ static void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg) } p_mcb->local_cfg_sent = TRUE; - if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->peer_cfg_rcvd) - { - if (p_mcb->is_initiator) - { + if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->peer_cfg_rcvd) { + if (p_mcb->is_initiator) { p_mcb->state = RFC_MX_STATE_SABME_WAIT_UA; rfc_send_sabme (p_mcb, RFCOMM_MX_DLCI); rfc_timer_start (p_mcb, RFC_T1_TIMEOUT); - } - else - { + } else { p_mcb->state = RFC_MX_STATE_WAIT_SABME; rfc_timer_start (p_mcb, RFCOMM_CONN_TIMEOUT); /* - increased from T2=20 to CONN=120 to allow the user more than 10 sec to type in the @@ -639,10 +612,11 @@ static void rfc_mx_conf_ind (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg) { /* Save peer L2CAP MTU if present */ /* RFCOMM adds 3-4 bytes in the beginning and 1 bytes FCS */ - if (p_cfg->mtu_present) + if (p_cfg->mtu_present) { p_mcb->peer_l2cap_mtu = p_cfg->mtu - RFCOMM_MIN_OFFSET - 1; - else + } else { p_mcb->peer_l2cap_mtu = L2CAP_DEFAULT_MTU - RFCOMM_MIN_OFFSET - 1; + } p_cfg->mtu_present = FALSE; p_cfg->flush_to_present = FALSE; @@ -653,16 +627,12 @@ static void rfc_mx_conf_ind (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg) L2CA_ConfigRsp (p_mcb->lcid, p_cfg); p_mcb->peer_cfg_rcvd = TRUE; - if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->local_cfg_sent) - { - if (p_mcb->is_initiator) - { + if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->local_cfg_sent) { + if (p_mcb->is_initiator) { p_mcb->state = RFC_MX_STATE_SABME_WAIT_UA; rfc_send_sabme (p_mcb, RFCOMM_MX_DLCI); rfc_timer_start (p_mcb, RFC_T1_TIMEOUT); - } - else - { + } else { p_mcb->state = RFC_MX_STATE_WAIT_SABME; rfc_timer_start (p_mcb, RFCOMM_CONN_TIMEOUT); /* - increased from T2=20 to CONN=120 to allow the user more than 10 sec to type in the diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_port_fsm.c b/components/bt/bluedroid/stack/rfcomm/rfc_port_fsm.c old mode 100755 new mode 100644 similarity index 90% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_port_fsm.c rename to components/bt/bluedroid/stack/rfcomm/rfc_port_fsm.c index 0d082aac9..da1e81e80 --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_port_fsm.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_port_fsm.c @@ -60,14 +60,12 @@ static void rfc_set_port_state(tPORT_STATE *port_pars, MX_FRAME *p_frame); *******************************************************************************/ void rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data) { - if (!p_port) - { + if (!p_port) { RFCOMM_TRACE_WARNING ("NULL port event %d", event); return; } - switch (p_port->rfc.state) - { + switch (p_port->rfc.state) { case RFC_STATE_CLOSED: rfc_port_sm_state_closed (p_port, event, p_data); break; @@ -108,8 +106,7 @@ void rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_state_closed (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_OPEN: p_port->rfc.state = RFC_STATE_ORIG_WAIT_SEC_CHECK; btm_sec_mx_access_request (p_port->rfc.p_mcb->bd_addr, BT_PSM_RFCOMM, TRUE, @@ -176,8 +173,7 @@ void rfc_port_sm_state_closed (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_sabme_wait_ua (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_OPEN: case RFC_EVENT_ESTABLISH_RSP: RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event); @@ -248,22 +244,17 @@ void rfc_port_sm_sabme_wait_ua (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_term_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_SEC_COMPLETE: - if (*((UINT8 *)p_data) != BTM_SUCCESS) - { + if (*((UINT8 *)p_data) != BTM_SUCCESS) { /* Authentication/authorization failed. If link is still */ /* up send DM and check if we need to start inactive timer */ - if (p_port->rfc.p_mcb) - { + if (p_port->rfc.p_mcb) { rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE); p_port->rfc.p_mcb->is_disc_initiator = TRUE; port_rfc_closed (p_port, PORT_SEC_FAILED); } - } - else - { + } else { PORT_DlcEstablishInd (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu); } return; @@ -300,13 +291,11 @@ void rfc_port_sm_term_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) return; case RFC_EVENT_ESTABLISH_RSP: - if (*((UINT8 *)p_data) != RFCOMM_SUCCESS) - { - if (p_port->rfc.p_mcb) + if (*((UINT8 *)p_data) != RFCOMM_SUCCESS) { + if (p_port->rfc.p_mcb) { rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE); - } - else - { + } + } else { rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci); p_port->rfc.state = RFC_STATE_OPENED; } @@ -329,11 +318,9 @@ void rfc_port_sm_term_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_orig_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_SEC_COMPLETE: - if (*((UINT8 *)p_data) != BTM_SUCCESS) - { + if (*((UINT8 *)p_data) != BTM_SUCCESS) { p_port->rfc.p_mcb->is_disc_initiator = TRUE; PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, 0, RFCOMM_SECURITY_ERR); rfc_port_closed (p_port); @@ -379,8 +366,7 @@ void rfc_port_sm_orig_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_OPEN: RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event); return; @@ -401,15 +387,12 @@ void rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data) /* There might be an initial case when we reduced rx_max and credit_rx is still */ /* bigger. Make sure that we do not send 255 */ if ((p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - && (((BT_HDR *)p_data)->len < p_port->peer_mtu) - && (!p_port->rx.user_fc) - && (p_port->credit_rx_max > p_port->credit_rx)) - { + && (((BT_HDR *)p_data)->len < p_port->peer_mtu) + && (!p_port->rx.user_fc) + && (p_port->credit_rx_max > p_port->credit_rx)) { ((BT_HDR *)p_data)->layer_specific = (UINT8) (p_port->credit_rx_max - p_port->credit_rx); p_port->credit_rx = p_port->credit_rx_max; - } - else - { + } else { ((BT_HDR *)p_data)->layer_specific = 0; } rfc_send_buf_uih (p_port->rfc.p_mcb, p_port->dlci, (BT_HDR *)p_data); @@ -431,14 +414,13 @@ void rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data) case RFC_EVENT_DISC: p_port->rfc.state = RFC_STATE_CLOSED; rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci); - if(!GKI_queue_is_empty(&p_port->rx.queue)) - { + if (!GKI_queue_is_empty(&p_port->rx.queue)) { /* give a chance to upper stack to close port properly */ RFCOMM_TRACE_DEBUG("port queue is not empty"); rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT); - } - else + } else { PORT_DlcReleaseInd (p_port->rfc.p_mcb, p_port->dlci); + } return; case RFC_EVENT_UIH: @@ -466,8 +448,7 @@ void rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data) *******************************************************************************/ void rfc_port_sm_disc_wait_ua (tPORT *p_port, UINT16 event, void *p_data) { - switch (event) - { + switch (event) { case RFC_EVENT_OPEN: case RFC_EVENT_ESTABLISH_RSP: RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event); @@ -483,9 +464,9 @@ void rfc_port_sm_disc_wait_ua (tPORT *p_port, UINT16 event, void *p_data) case RFC_EVENT_UA: p_port->rfc.p_mcb->is_disc_initiator = TRUE; - /* Case falls through */ + /* Case falls through */ - case RFC_EVENT_DM: + case RFC_EVENT_DM: rfc_port_closed (p_port); return; @@ -537,16 +518,12 @@ void rfc_process_pn (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame) tPORT *p_port; UINT8 dlci = p_frame->dlci; - if (is_command) - { + if (is_command) { /* Ignore if Multiplexer is being shut down */ - if (p_mcb->state != RFC_MX_STATE_DISC_WAIT_UA) - { + if (p_mcb->state != RFC_MX_STATE_DISC_WAIT_UA) { PORT_ParNegInd (p_mcb, dlci, p_frame->u.pn.mtu, - p_frame->u.pn.conv_layer, p_frame->u.pn.k); - } - else - { + p_frame->u.pn.conv_layer, p_frame->u.pn.k); + } else { rfc_send_dm(p_mcb, dlci, FALSE); RFCOMM_TRACE_WARNING("***** MX PN while disconnecting *****"); } @@ -555,8 +532,9 @@ void rfc_process_pn (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame) } /* If we are not awaiting response just ignore it */ p_port = port_find_mcb_dlci_port (p_mcb, dlci); - if ((p_port == NULL) || !(p_port->rfc.expected_rsp & RFC_RSP_PN)) + if ((p_port == NULL) || !(p_port->rfc.expected_rsp & RFC_RSP_PN)) { return; + } p_port->rfc.expected_rsp &= ~RFC_RSP_PN; @@ -581,11 +559,9 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, tPORT_STATE port_pars; tPORT *p_port; - if ((p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci)) == NULL) - { + if ((p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci)) == NULL) { /* This is the first command on the port */ - if (is_command) - { + if (is_command) { memset(&port_pars, 0, sizeof(tPORT_STATE)); rfc_set_port_state(&port_pars, p_frame); @@ -595,8 +571,7 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, return; } - if (is_command && is_request) - { + if (is_command && is_request) { /* This is the special situation when peer just request local pars */ port_pars = p_port->peer_port_pars; rfc_send_rpn (p_mcb, p_frame->dlci, FALSE, &p_port->peer_port_pars, 0); @@ -607,35 +582,31 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, rfc_set_port_state(&port_pars, p_frame); - if (is_command) - { + if (is_command) { PORT_PortNegInd (p_mcb, p_frame->dlci, &port_pars, p_frame->u.rpn.param_mask); return; } /* If we are not awaiting response just ignore it */ p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci); - if ((p_port == NULL) || !(p_port->rfc.expected_rsp & (RFC_RSP_RPN | RFC_RSP_RPN_REPLY))) + if ((p_port == NULL) || !(p_port->rfc.expected_rsp & (RFC_RSP_RPN | RFC_RSP_RPN_REPLY))) { return; + } /* If we sent a request for port parameters to the peer he is replying with */ /* mask 0. */ rfc_port_timer_stop (p_port); - if (p_port->rfc.expected_rsp & RFC_RSP_RPN_REPLY) - { + if (p_port->rfc.expected_rsp & RFC_RSP_RPN_REPLY) { p_port->rfc.expected_rsp &= ~RFC_RSP_RPN_REPLY; p_port->peer_port_pars = port_pars; if ((port_pars.fc_type == (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT)) - || (port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT))) - { + || (port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT))) { /* This is satisfactory port parameters. Set mask as it was Ok */ p_frame->u.rpn.param_mask = RFCOMM_RPN_PM_MASK; - } - else - { + } else { /* Current peer parameters are not good, try to fix them */ p_port->peer_port_pars.fc_type = (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT); @@ -645,16 +616,15 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; return; } - } - else + } else { p_port->rfc.expected_rsp &= ~RFC_RSP_RPN; + } /* Check if all suggested parameters were accepted */ if (((p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT)) == - (RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT)) - || ((p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT)) == - (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT))) - { + (RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT)) + || ((p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT)) == + (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT))) { PORT_PortNegCnf (p_mcb, p_port->dlci, &port_pars, RFCOMM_SUCCESS); return; } @@ -662,8 +632,7 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, /* If we were proposing RTR flow control try RTC flow control */ /* If we were proposing RTC flow control try no flow control */ /* otherwise drop the connection */ - if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT)) - { + if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT)) { /* Current peer parameters are not good, try to fix them */ p_port->peer_port_pars.fc_type = (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT); @@ -676,8 +645,7 @@ void rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command, } /* Other side does not support flow control */ - if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT)) - { + if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT)) { p_port->peer_port_pars.fc_type = RFCOMM_FC_OFF; PORT_PortNegCnf (p_mcb, p_port->dlci, &port_pars, RFCOMM_SUCCESS); } @@ -700,42 +668,46 @@ void rfc_process_msc (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame) BOOLEAN new_peer_fc = FALSE; p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci); - if (p_port == NULL) + if (p_port == NULL) { return; + } pars.modem_signal = 0; - if (modem_signals & RFCOMM_MSC_RTC) + if (modem_signals & RFCOMM_MSC_RTC) { pars.modem_signal |= MODEM_SIGNAL_DTRDSR; + } - if (modem_signals & RFCOMM_MSC_RTR) + if (modem_signals & RFCOMM_MSC_RTR) { pars.modem_signal |= MODEM_SIGNAL_RTSCTS; + } - if (modem_signals & RFCOMM_MSC_IC) + if (modem_signals & RFCOMM_MSC_IC) { pars.modem_signal |= MODEM_SIGNAL_RI; + } - if (modem_signals & RFCOMM_MSC_DV) + if (modem_signals & RFCOMM_MSC_DV) { pars.modem_signal |= MODEM_SIGNAL_DCD; + } pars.fc = ((modem_signals & RFCOMM_MSC_FC) == RFCOMM_MSC_FC); pars.break_signal = (p_frame->u.msc.break_present) ? - p_frame->u.msc.break_duration : 0; + p_frame->u.msc.break_duration : 0; pars.discard_buffers = 0; pars.break_signal_seq = RFCOMM_CTRL_BREAK_IN_SEQ; /* this is default */ /* Check if this command is passed only to indicate flow control */ - if (is_command) - { + if (is_command) { rfc_send_msc (p_mcb, p_frame->dlci, FALSE, &pars); - if (p_port->rfc.p_mcb->flow != PORT_FC_CREDIT) - { + if (p_port->rfc.p_mcb->flow != PORT_FC_CREDIT) { /* Spec 1.1 indicates that only FC bit is used for flow control */ p_port->peer_ctrl.fc = new_peer_fc = pars.fc; - if (new_peer_fc != p_port->tx.peer_fc) + if (new_peer_fc != p_port->tx.peer_fc) { PORT_FlowInd (p_mcb, p_frame->dlci, (BOOLEAN)!new_peer_fc); + } } PORT_ControlInd (p_mcb, p_frame->dlci, &pars); @@ -744,8 +716,9 @@ void rfc_process_msc (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame) } /* If we are not awaiting response just ignore it */ - if (!(p_port->rfc.expected_rsp & RFC_RSP_MSC)) + if (!(p_port->rfc.expected_rsp & RFC_RSP_MSC)) { return; + } p_port->rfc.expected_rsp &= ~RFC_RSP_MSC; @@ -767,18 +740,16 @@ void rfc_process_rls (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame) { tPORT *p_port; - if (is_command) - { + if (is_command) { PORT_LineStatusInd (p_mcb, p_frame->dlci, p_frame->u.rls.line_status); rfc_send_rls (p_mcb, p_frame->dlci, FALSE, p_frame->u.rls.line_status); - } - else - { + } else { p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci); /* If we are not awaiting response just ignore it */ - if (!p_port || !(p_port->rfc.expected_rsp & RFC_RSP_RLS)) + if (!p_port || !(p_port->rfc.expected_rsp & RFC_RSP_RLS)) { return; + } p_port->rfc.expected_rsp &= ~RFC_RSP_RLS; @@ -827,14 +798,14 @@ void rfc_process_test_rsp (tRFC_MCB *p_mcb, BT_HDR *p_buf) *******************************************************************************/ void rfc_process_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command) { - if (is_command) - { + if (is_command) { rfc_cb.rfc.peer_rx_disabled = FALSE; rfc_send_fcon (p_mcb, FALSE); - if (!p_mcb->l2cap_congested) + if (!p_mcb->l2cap_congested) { PORT_FlowInd (p_mcb, 0, TRUE); + } } } @@ -848,12 +819,12 @@ void rfc_process_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command) *******************************************************************************/ void rfc_process_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command) { - if (is_command) - { + if (is_command) { rfc_cb.rfc.peer_rx_disabled = TRUE; - if (!p_mcb->l2cap_congested) + if (!p_mcb->l2cap_congested) { PORT_FlowInd (p_mcb, 0, FALSE); + } rfc_send_fcoff (p_mcb, FALSE); } @@ -871,17 +842,16 @@ void rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested) { p_mcb->l2cap_congested = is_congested; - if (!is_congested) - { + if (!is_congested) { rfc_check_send_cmd(p_mcb, NULL); } - if (!rfc_cb.rfc.peer_rx_disabled) - { - if (!is_congested) + if (!rfc_cb.rfc.peer_rx_disabled) { + if (!is_congested) { PORT_FlowInd (p_mcb, 0, TRUE); - else + } else { PORT_FlowInd (p_mcb, 0, FALSE); + } } } @@ -895,26 +865,34 @@ void rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested) void rfc_set_port_state(tPORT_STATE *port_pars, MX_FRAME *p_frame) { - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_BIT_RATE) + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_BIT_RATE) { port_pars->baud_rate = p_frame->u.rpn.baud_rate; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_DATA_BITS) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_DATA_BITS) { port_pars->byte_size = p_frame->u.rpn.byte_size; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_STOP_BITS) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_STOP_BITS) { port_pars->stop_bits = p_frame->u.rpn.stop_bits; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY) { port_pars->parity = p_frame->u.rpn.parity; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY_TYPE) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY_TYPE) { port_pars->parity_type = p_frame->u.rpn.parity_type; + } if (p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_XONXOFF_ON_INPUT | RFCOMM_RPN_PM_XONXOFF_ON_OUTPUT | RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT | RFCOMM_RPN_PM_RTC_ON_INPUT | - RFCOMM_RPN_PM_RTC_ON_OUTPUT)) + RFCOMM_RPN_PM_RTC_ON_OUTPUT)) { port_pars->fc_type = p_frame->u.rpn.fc_type; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XON_CHAR) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XON_CHAR) { port_pars->xon_char = p_frame->u.rpn.xon_char; - if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XOFF_CHAR) + } + if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XOFF_CHAR) { port_pars->xoff_char = p_frame->u.rpn.xoff_char; + } } diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_port_if.c b/components/bt/bluedroid/stack/rfcomm/rfc_port_if.c old mode 100755 new mode 100644 similarity index 93% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_port_if.c rename to components/bt/bluedroid/stack/rfcomm/rfc_port_if.c index cdf9b12e9..845b77940 --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_port_if.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_port_if.c @@ -82,8 +82,7 @@ void RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result) void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) { UNUSED(mtu); - if (p_mcb->state != RFC_MX_STATE_CONNECTED) - { + if (p_mcb->state != RFC_MX_STATE_CONNECTED) { PORT_DlcEstablishCnf (p_mcb, dlci, 0, RFCOMM_ERROR); return; } @@ -91,7 +90,7 @@ void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } @@ -110,8 +109,7 @@ void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) void RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result) { UNUSED(mtu); - if ((p_mcb->state != RFC_MX_STATE_CONNECTED) && (result == RFCOMM_SUCCESS)) - { + if ((p_mcb->state != RFC_MX_STATE_CONNECTED) && (result == RFCOMM_SUCCESS)) { PORT_DlcReleaseInd (p_mcb, dlci); return; } @@ -119,7 +117,7 @@ void RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 res tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } rfc_port_sm_execute(p_port, RFC_EVENT_ESTABLISH_RSP, &result); @@ -146,12 +144,11 @@ void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } - if (p_mcb->state != RFC_MX_STATE_CONNECTED) - { + if (p_mcb->state != RFC_MX_STATE_CONNECTED) { p_port->error = PORT_PAR_NEG_FAILED; return; } @@ -162,14 +159,11 @@ void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) flow = (p_mcb->flow == PORT_FC_UNDEFINED) ? PORT_FC_DEFAULT : p_mcb->flow; /* Set convergence layer and number of credits (k) */ - if (flow == PORT_FC_CREDIT) - { + if (flow == PORT_FC_CREDIT) { cl = RFCOMM_PN_CONV_LAYER_CBFC_I; k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max : RFCOMM_K_MAX; p_port->credit_rx = k; - } - else - { + } else { cl = RFCOMM_PN_CONV_LAYER_TYPE_1; k = 0; } @@ -193,8 +187,9 @@ void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) *******************************************************************************/ void RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) { - if (p_mcb->state != RFC_MX_STATE_CONNECTED) + if (p_mcb->state != RFC_MX_STATE_CONNECTED) { return; + } /* Send Parameter Negotiation Response UIH frame */ rfc_send_pn (p_mcb, dlci, FALSE, mtu, cl, k); @@ -214,8 +209,7 @@ void RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 *******************************************************************************/ void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars) { - if (p_mcb->state != RFC_MX_STATE_CONNECTED) - { + if (p_mcb->state != RFC_MX_STATE_CONNECTED) { PORT_PortNegCnf (p_mcb, dlci, NULL, RFCOMM_ERROR); return; } @@ -223,15 +217,16 @@ void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } /* Send Parameter Negotiation Command UIH frame */ - if (!p_pars) + if (!p_pars) { p_port->rfc.expected_rsp |= RFC_RSP_RPN_REPLY; - else + } else { p_port->rfc.expected_rsp |= RFC_RSP_RPN; + } rfc_send_rpn (p_mcb, dlci, TRUE, p_pars, RFCOMM_RPN_PM_MASK); rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; @@ -250,10 +245,11 @@ void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars) void RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask) { - if (p_mcb->state != RFC_MX_STATE_CONNECTED) + if (p_mcb->state != RFC_MX_STATE_CONNECTED) { return; + } - rfc_send_rpn (p_mcb, dlci, FALSE, p_pars, param_mask); + rfc_send_rpn (p_mcb, dlci, FALSE, p_pars, param_mask); } @@ -270,13 +266,14 @@ void RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } if ((p_port->state != PORT_STATE_OPENED) - || (p_port->rfc.state != RFC_STATE_OPENED)) + || (p_port->rfc.state != RFC_STATE_OPENED)) { return; + } p_port->port_ctrl |= PORT_CTRL_REQ_SENT; @@ -302,13 +299,14 @@ void RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 enable) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } if ((p_port->state != PORT_STATE_OPENED) - || (p_port->rfc.state != RFC_STATE_OPENED)) + || (p_port->rfc.state != RFC_STATE_OPENED)) { return; + } p_port->local_ctrl.fc = !enable; @@ -333,13 +331,14 @@ void RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 status) tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, - dlci); + dlci); return; } if ((p_port->state != PORT_STATE_OPENED) - || (p_port->rfc.state != RFC_STATE_OPENED)) + || (p_port->rfc.state != RFC_STATE_OPENED)) { return; + } p_port->rfc.expected_rsp |= RFC_RSP_RLS; diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_ts_frames.c b/components/bt/bluedroid/stack/rfcomm/rfc_ts_frames.c old mode 100755 new mode 100644 similarity index 89% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_ts_frames.c rename to components/bt/bluedroid/stack/rfcomm/rfc_ts_frames.c index 357df4f9f..617e2f4bf --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_ts_frames.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_ts_frames.c @@ -44,8 +44,9 @@ void rfc_send_sabme (tRFC_MCB *p_mcb, UINT8 dlci) UINT8 *p_data; UINT8 cr = RFCOMM_CR(p_mcb->is_initiator, TRUE); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET; p_data = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; @@ -76,8 +77,9 @@ void rfc_send_ua (tRFC_MCB *p_mcb, UINT8 dlci) UINT8 *p_data; UINT8 cr = RFCOMM_CR(p_mcb->is_initiator, FALSE); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET; p_data = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; @@ -108,8 +110,9 @@ void rfc_send_dm (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN pf) UINT8 *p_data; UINT8 cr = RFCOMM_CR(p_mcb->is_initiator, FALSE); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET; p_data = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; @@ -140,8 +143,9 @@ void rfc_send_disc (tRFC_MCB *p_mcb, UINT8 dlci) UINT8 *p_data; UINT8 cr = RFCOMM_CR(p_mcb->is_initiator, TRUE); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET; p_data = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; @@ -173,36 +177,35 @@ void rfc_send_buf_uih (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) UINT8 credits; p_buf->offset -= RFCOMM_CTRL_FRAME_LEN; - if (p_buf->len > 127) + if (p_buf->len > 127) { p_buf->offset--; + } - if (dlci) + if (dlci) { credits = (UINT8)p_buf->layer_specific; - else + } else { credits = 0; + } - if (credits) + if (credits) { p_buf->offset--; + } p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; /* UIH frame, command, PF = 0, dlci */ *p_data++ = RFCOMM_EA | cr | (dlci << RFCOMM_SHIFT_DLCI); *p_data++ = RFCOMM_UIH | ((credits) ? RFCOMM_PF : 0); - if (p_buf->len <= 127) - { + if (p_buf->len <= 127) { *p_data++ = RFCOMM_EA | (p_buf->len << 1); p_buf->len += 3; - } - else - { + } else { *p_data++ = (p_buf->len & 0x7f) << 1; *p_data++ = p_buf->len >> RFCOMM_SHIFT_LENGTH2; p_buf->len += 4; } - if (credits) - { + if (credits) { *p_data++ = credits; p_buf->len++; } @@ -211,12 +214,9 @@ void rfc_send_buf_uih (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) *p_data = RFCOMM_UIH_FCS ((UINT8 *)(p_buf + 1) + p_buf->offset, dlci); - if (dlci == RFCOMM_MX_DLCI) - { + if (dlci == RFCOMM_MX_DLCI) { rfc_check_send_cmd(p_mcb, p_buf); - } - else - { + } else { L2CA_DataWrite (p_mcb->lcid, p_buf); } } @@ -234,8 +234,9 @@ void rfc_send_pn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT16 mtu, U BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -249,10 +250,11 @@ void rfc_send_pn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT16 mtu, U /* It appeared that we need to reply with the same priority bits as we received. ** We will use the fact that we reply in the same context so rx_frame can still be used. */ - if (is_command) + if (is_command) { *p_data++ = RFCOMM_PN_PRIORITY_0; - else + } else { *p_data++ = rfc_cb.rfc.rx_frame.u.pn.priority; + } *p_data++ = RFCOMM_T1_DSEC; *p_data++ = mtu & 0xFF; @@ -279,8 +281,9 @@ void rfc_send_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command) BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -307,8 +310,9 @@ void rfc_send_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command) BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -342,16 +346,18 @@ void rfc_send_msc (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, signals = p_pars->modem_signal; break_duration = p_pars->break_signal; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; - if (break_duration) + if (break_duration) { len = RFCOMM_MX_MSC_LEN_WITH_BREAK; - else + } else { len = RFCOMM_MX_MSC_LEN_NO_BREAK; + } *p_data++ = RFCOMM_EA | RFCOMM_I_CR(is_command) | RFCOMM_MX_MSC; *p_data++ = RFCOMM_EA | (len << 1); @@ -364,8 +370,7 @@ void rfc_send_msc (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, ((signals & MODEM_SIGNAL_RI) ? RFCOMM_MSC_IC : 0) | ((signals & MODEM_SIGNAL_DCD) ? RFCOMM_MSC_DV : 0); - if (break_duration) - { + if (break_duration) { *p_data++ = RFCOMM_EA | RFCOMM_MSC_BREAK_PRESENT_MASK | (break_duration << RFCOMM_MSC_SHIFT_BREAK); } @@ -389,8 +394,9 @@ void rfc_send_rls (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT8 status BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -420,8 +426,9 @@ void rfc_send_nsc (tRFC_MCB *p_mcb) BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -430,7 +437,7 @@ void rfc_send_nsc (tRFC_MCB *p_mcb) *p_data++ = RFCOMM_EA | (RFCOMM_MX_NSC_LEN << 1); *p_data++ = rfc_cb.rfc.rx_frame.ea | - (rfc_cb.rfc.rx_frame.cr << RFCOMM_SHIFT_CR) | + (rfc_cb.rfc.rx_frame.cr << RFCOMM_SHIFT_CR) | rfc_cb.rfc.rx_frame.type; /* Total length is sizeof NSC data + mx header 2 */ @@ -453,32 +460,30 @@ void rfc_send_rpn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, BT_HDR *p_buf; UINT8 *p_data; - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_CTRL_FRAME_LEN; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; *p_data++ = RFCOMM_EA | RFCOMM_I_CR(is_command) | RFCOMM_MX_RPN; - if (!p_pars) - { + if (!p_pars) { *p_data++ = RFCOMM_EA | (RFCOMM_MX_RPN_REQ_LEN << 1); *p_data++ = RFCOMM_EA | RFCOMM_CR_MASK | (dlci << RFCOMM_SHIFT_DLCI); p_buf->len = RFCOMM_MX_RPN_REQ_LEN + 2; - } - else - { + } else { *p_data++ = RFCOMM_EA | (RFCOMM_MX_RPN_LEN << 1); *p_data++ = RFCOMM_EA | RFCOMM_CR_MASK | (dlci << RFCOMM_SHIFT_DLCI); *p_data++ = p_pars->baud_rate; *p_data++ = (p_pars->byte_size << RFCOMM_RPN_BITS_SHIFT) - | (p_pars->stop_bits << RFCOMM_RPN_STOP_BITS_SHIFT) - | (p_pars->parity << RFCOMM_RPN_PARITY_SHIFT) - | (p_pars->parity_type << RFCOMM_RPN_PARITY_TYPE_SHIFT); + | (p_pars->stop_bits << RFCOMM_RPN_STOP_BITS_SHIFT) + | (p_pars->parity << RFCOMM_RPN_PARITY_SHIFT) + | (p_pars->parity_type << RFCOMM_RPN_PARITY_TYPE_SHIFT); *p_data++ = p_pars->fc_type; *p_data++ = p_pars->xon_char; *p_data++ = p_pars->xoff_char; @@ -507,13 +512,13 @@ void rfc_send_test (tRFC_MCB *p_mcb, BOOLEAN is_command, BT_HDR *p_buf) UINT8 *p_src, *p_dest; /* Shift buffer to give space for header */ - if (p_buf->offset < (L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2)) - { + if (p_buf->offset < (L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2)) { p_src = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len - 1; p_dest = (UINT8 *) (p_buf + 1) + L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2 + p_buf->len - 1; - for (xx = 0; xx < p_buf->len; xx++) + for (xx = 0; xx < p_buf->len; xx++) { *p_dest-- = *p_src--; + } p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2; } @@ -543,8 +548,9 @@ void rfc_send_credit(tRFC_MCB *p_mcb, UINT8 dlci, UINT8 credit) UINT8 *p_data; UINT8 cr = RFCOMM_CR(p_mcb->is_initiator, TRUE); - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_CMD_POOL_ID)) == NULL) { return; + } p_buf->offset = L2CAP_MIN_OFFSET; p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; @@ -575,15 +581,13 @@ UINT8 rfc_parse_data (tRFC_MCB *p_mcb, MX_FRAME *p_frame, BT_HDR *p_buf) UINT8 *p_start = p_data; UINT16 len; - if (p_buf->len < RFCOMM_CTRL_FRAME_LEN) - { + if (p_buf->len < RFCOMM_CTRL_FRAME_LEN) { RFCOMM_TRACE_ERROR ("Bad Length1: %d", p_buf->len); return (RFC_EVENT_BAD_FRAME); } RFCOMM_PARSE_CTRL_FIELD (ead, p_frame->cr, p_frame->dlci, p_data); - if( !ead ) - { + if ( !ead ) { RFCOMM_TRACE_ERROR ("Bad Address(EA must be 1)"); return (RFC_EVENT_BAD_FRAME); } @@ -595,17 +599,15 @@ UINT8 rfc_parse_data (tRFC_MCB *p_mcb, MX_FRAME *p_frame, BT_HDR *p_buf) /* handle credit if credit based flow control */ if ((p_mcb->flow == PORT_FC_CREDIT) && (p_frame->type == RFCOMM_UIH) && - (p_frame->dlci != RFCOMM_MX_DLCI) && (p_frame->pf == 1)) - { + (p_frame->dlci != RFCOMM_MX_DLCI) && (p_frame->pf == 1)) { p_frame->credit = *p_data++; p_buf->len--; p_buf->offset++; - } - else + } else { p_frame->credit = 0; + } - if (p_buf->len != len) - { + if (p_buf->len != len) { RFCOMM_TRACE_ERROR ("Bad Length2 %d %d", p_buf->len, len); return (RFC_EVENT_BAD_FRAME); } @@ -616,71 +618,61 @@ UINT8 rfc_parse_data (tRFC_MCB *p_mcb, MX_FRAME *p_frame, BT_HDR *p_buf) /* reply with F=1 */ /* According to TS 07.10 spec ivalid frames are discarded without */ /* notification to the sender */ - switch (p_frame->type) - { + switch (p_frame->type) { case RFCOMM_SABME: if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr) - || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci) - || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) - { + || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci) + || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) { RFCOMM_TRACE_ERROR ("Bad SABME"); return (RFC_EVENT_BAD_FRAME); - } - else + } else { return (RFC_EVENT_SABME); + } case RFCOMM_UA: if (RFCOMM_FRAME_IS_CMD(p_mcb->is_initiator, p_frame->cr) - || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci) - || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) - { + || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci) + || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) { RFCOMM_TRACE_ERROR ("Bad UA"); return (RFC_EVENT_BAD_FRAME); - } - else + } else { return (RFC_EVENT_UA); + } case RFCOMM_DM: if (RFCOMM_FRAME_IS_CMD(p_mcb->is_initiator, p_frame->cr) - || len || !RFCOMM_VALID_DLCI(p_frame->dlci) - || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) - { + || len || !RFCOMM_VALID_DLCI(p_frame->dlci) + || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) { RFCOMM_TRACE_ERROR ("Bad DM"); return (RFC_EVENT_BAD_FRAME); - } - else + } else { return (RFC_EVENT_DM); + } case RFCOMM_DISC: if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr) - || !p_frame->pf || len || !RFCOMM_VALID_DLCI(p_frame->dlci) - || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) - { + || !p_frame->pf || len || !RFCOMM_VALID_DLCI(p_frame->dlci) + || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs)) { RFCOMM_TRACE_ERROR ("Bad DISC"); return (RFC_EVENT_BAD_FRAME); - } - else + } else { return (RFC_EVENT_DISC); + } case RFCOMM_UIH: - if (!RFCOMM_VALID_DLCI(p_frame->dlci)) - { + if (!RFCOMM_VALID_DLCI(p_frame->dlci)) { RFCOMM_TRACE_ERROR ("Bad UIH - invalid DLCI"); return (RFC_EVENT_BAD_FRAME); - } - else if (!rfc_check_fcs (2, p_start, fcs)) - { + } else if (!rfc_check_fcs (2, p_start, fcs)) { RFCOMM_TRACE_ERROR ("Bad UIH - FCS"); return (RFC_EVENT_BAD_FRAME); - } - else if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr)) - { + } else if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr)) { /* we assume that this is ok to allow bad implementations to work */ RFCOMM_TRACE_ERROR ("Bad UIH - response"); return (RFC_EVENT_UIH); - } - else + } else { return (RFC_EVENT_UIH); + } } return (RFC_EVENT_BAD_FRAME); @@ -707,8 +699,7 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) p_rx_frame->cr = (*p_data & RFCOMM_CR_MASK) >> RFCOMM_SHIFT_CR; p_rx_frame->type = *p_data++ & ~(RFCOMM_CR_MASK | RFCOMM_EA_MASK); - if (!p_rx_frame->ea || !length) - { + if (!p_rx_frame->ea || !length) { RFCOMM_TRACE_ERROR ("Illegal MX Frame ea:%d len:%d", p_rx_frame->ea, length); GKI_freebuf (p_buf); return; @@ -723,24 +714,22 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) mx_len = *p_data++ >> RFCOMM_SHIFT_LENGTH1; length--; - if (!ea) - { + if (!ea) { mx_len += *p_data++ << RFCOMM_SHIFT_LENGTH2; length --; } - if (mx_len != length) - { + if (mx_len != length) { RFCOMM_TRACE_ERROR ("Bad MX frame"); GKI_freebuf (p_buf); return; } - switch (p_rx_frame->type) - { + switch (p_rx_frame->type) { case RFCOMM_MX_PN: - if (length != RFCOMM_MX_PN_LEN) + if (length != RFCOMM_MX_PN_LEN) { break; + } p_rx_frame->dlci = *p_data++ & RFCOMM_PN_DLCI_MASK; p_rx_frame->u.pn.frame_type = *p_data & RFCOMM_PN_FRAME_TYPE_MASK; @@ -753,10 +742,9 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) p_rx_frame->u.pn.k = *p_data++ & RFCOMM_PN_K_MASK; if (!p_rx_frame->dlci - || !RFCOMM_VALID_DLCI (p_rx_frame->dlci) - || (p_rx_frame->u.pn.mtu < RFCOMM_MIN_MTU) - || (p_rx_frame->u.pn.mtu > RFCOMM_MAX_MTU)) - { + || !RFCOMM_VALID_DLCI (p_rx_frame->dlci) + || (p_rx_frame->u.pn.mtu < RFCOMM_MIN_MTU) + || (p_rx_frame->u.pn.mtu > RFCOMM_MAX_MTU)) { RFCOMM_TRACE_ERROR ("Bad PN frame"); break; } @@ -767,8 +755,9 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) return; case RFCOMM_MX_TEST: - if (!length) + if (!length) { break; + } p_rx_frame->u.test.p_data = p_data; p_rx_frame->u.test.data_len = length; @@ -776,15 +765,17 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) p_buf->offset += 2; p_buf->len -= 2; - if (is_command) + if (is_command) { rfc_send_test (p_mcb, FALSE, p_buf); - else + } else { rfc_process_test_rsp (p_mcb, p_buf); + } return; case RFCOMM_MX_FCON: - if (length != RFCOMM_MX_FCON_LEN) + if (length != RFCOMM_MX_FCON_LEN) { break; + } GKI_freebuf (p_buf); @@ -792,8 +783,9 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) return; case RFCOMM_MX_FCOFF: - if (length != RFCOMM_MX_FCOFF_LEN) + if (length != RFCOMM_MX_FCOFF_LEN) { break; + } GKI_freebuf (p_buf); @@ -807,21 +799,17 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) p_rx_frame->dlci = *p_data++ >> RFCOMM_SHIFT_DLCI; if (!ea || !cr || !p_rx_frame->dlci - || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) - { + || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) { RFCOMM_TRACE_ERROR ("Bad MSC frame"); break; } p_rx_frame->u.msc.signals = *p_data++; - if (mx_len == RFCOMM_MX_MSC_LEN_WITH_BREAK) - { + if (mx_len == RFCOMM_MX_MSC_LEN_WITH_BREAK) { p_rx_frame->u.msc.break_present = *p_data & RFCOMM_MSC_BREAK_PRESENT_MASK; p_rx_frame->u.msc.break_duration = (*p_data & RFCOMM_MSC_BREAK_MASK) >> RFCOMM_MSC_SHIFT_BREAK; - } - else - { + } else { p_rx_frame->u.msc.break_present = FALSE; p_rx_frame->u.msc.break_duration = 0; } @@ -831,8 +819,9 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) return; case RFCOMM_MX_NSC: - if ((length != RFCOMM_MX_NSC_LEN) || !is_command) + if ((length != RFCOMM_MX_NSC_LEN) || !is_command) { break; + } p_rx_frame->u.nsc.ea = *p_data & RFCOMM_EA; p_rx_frame->u.nsc.cr = (*p_data & RFCOMM_CR_MASK) >> RFCOMM_SHIFT_CR; @@ -844,24 +833,23 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) return; case RFCOMM_MX_RPN: - if ((length != RFCOMM_MX_RPN_REQ_LEN) && (length != RFCOMM_MX_RPN_LEN)) + if ((length != RFCOMM_MX_RPN_REQ_LEN) && (length != RFCOMM_MX_RPN_LEN)) { break; + } ea = *p_data & RFCOMM_EA; cr = (*p_data & RFCOMM_CR_MASK) >> RFCOMM_SHIFT_CR; p_rx_frame->dlci = *p_data++ >> RFCOMM_SHIFT_DLCI; if (!ea || !cr || !p_rx_frame->dlci - || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) - { + || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) { RFCOMM_TRACE_ERROR ("Bad RPN frame"); break; } p_rx_frame->u.rpn.is_request = (length == RFCOMM_MX_RPN_REQ_LEN); - if (!p_rx_frame->u.rpn.is_request) - { + if (!p_rx_frame->u.rpn.is_request) { p_rx_frame->u.rpn.baud_rate = *p_data++; p_rx_frame->u.rpn.byte_size = (*p_data >> RFCOMM_RPN_BITS_SHIFT) & RFCOMM_RPN_BITS_MASK; p_rx_frame->u.rpn.stop_bits = (*p_data >> RFCOMM_RPN_STOP_BITS_SHIFT) & RFCOMM_RPN_STOP_BITS_MASK; @@ -879,8 +867,9 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) return; case RFCOMM_MX_RLS: - if (length != RFCOMM_MX_RLS_LEN) + if (length != RFCOMM_MX_RLS_LEN) { break; + } ea = *p_data & RFCOMM_EA; cr = (*p_data & RFCOMM_CR_MASK) >> RFCOMM_SHIFT_CR; @@ -889,8 +878,7 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) p_rx_frame->u.rls.line_status = (*p_data & ~0x01); if (!ea || !cr || !p_rx_frame->dlci - || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) - { + || !RFCOMM_VALID_DLCI (p_rx_frame->dlci)) { RFCOMM_TRACE_ERROR ("Bad RPN frame"); break; } @@ -903,7 +891,8 @@ void rfc_process_mx_message (tRFC_MCB *p_mcb, BT_HDR *p_buf) GKI_freebuf (p_buf); - if (is_command) + if (is_command) { rfc_send_nsc (p_mcb); + } } diff --git a/components/bt/bluedroid/profiles/std/rfcomm/rfc_utils.c b/components/bt/bluedroid/stack/rfcomm/rfc_utils.c old mode 100755 new mode 100644 similarity index 89% rename from components/bt/bluedroid/profiles/std/rfcomm/rfc_utils.c rename to components/bt/bluedroid/stack/rfcomm/rfc_utils.c index 4850fc9d9..42183021f --- a/components/bt/bluedroid/profiles/std/rfcomm/rfc_utils.c +++ b/components/bt/bluedroid/stack/rfcomm/rfc_utils.c @@ -44,8 +44,7 @@ ** Description Reversed CRC Table , 8-bit, poly=0x07 ** (GSM 07.10 TS 101 369 V6.3.0) *******************************************************************************/ -static const UINT8 rfc_crctable[] = -{ +static const UINT8 rfc_crctable[] = { 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B, 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67, 0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43, @@ -83,8 +82,7 @@ UINT8 rfc_calc_fcs (UINT16 len, UINT8 *p) { UINT8 fcs = 0xFF; - while (len--) - { + while (len--) { fcs = rfc_crctable[fcs ^ *p++]; } @@ -109,8 +107,7 @@ BOOLEAN rfc_check_fcs (UINT16 len, UINT8 *p, UINT8 received_fcs) { UINT8 fcs = 0xFF; - while (len--) - { + while (len--) { fcs = rfc_crctable[fcs ^ *p++]; } @@ -135,45 +132,43 @@ tRFC_MCB *rfc_alloc_multiplexer_channel (BD_ADDR bd_addr, BOOLEAN is_initiator) int i, j; tRFC_MCB *p_mcb = NULL; RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel: bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); + bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d", is_initiator); - for (i = 0; i < MAX_BD_CONNECTIONS; i++) - { + for (i = 0; i < MAX_BD_CONNECTIONS; i++) { RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel rfc_cb.port.rfc_mcb[%d].state:%d", - i, rfc_cb.port.rfc_mcb[i].state); + i, rfc_cb.port.rfc_mcb[i].state); RFCOMM_TRACE_DEBUG("(rfc_cb.port.rfc_mcb[i].bd_addr:%02x:%02x:%02x:%02x:%02x:%02x", - rfc_cb.port.rfc_mcb[i].bd_addr[0], rfc_cb.port.rfc_mcb[i].bd_addr[1], - rfc_cb.port.rfc_mcb[i].bd_addr[2], rfc_cb.port.rfc_mcb[i].bd_addr[3], - rfc_cb.port.rfc_mcb[i].bd_addr[4], rfc_cb.port.rfc_mcb[i].bd_addr[5]); + rfc_cb.port.rfc_mcb[i].bd_addr[0], rfc_cb.port.rfc_mcb[i].bd_addr[1], + rfc_cb.port.rfc_mcb[i].bd_addr[2], rfc_cb.port.rfc_mcb[i].bd_addr[3], + rfc_cb.port.rfc_mcb[i].bd_addr[4], rfc_cb.port.rfc_mcb[i].bd_addr[5]); if ((rfc_cb.port.rfc_mcb[i].state != RFC_MX_STATE_IDLE) - && (!memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN))) - { + && (!memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN))) { /* Multiplexer channel found do not change anything */ /* If there was an inactivity timer running stop it now */ - if (rfc_cb.port.rfc_mcb[i].state == RFC_MX_STATE_CONNECTED) + if (rfc_cb.port.rfc_mcb[i].state == RFC_MX_STATE_CONNECTED) { rfc_timer_stop (&rfc_cb.port.rfc_mcb[i]); + } RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, found, state:%d, p_mcb:%p", - is_initiator, rfc_cb.port.rfc_mcb[i].state, &rfc_cb.port.rfc_mcb[i]); + is_initiator, rfc_cb.port.rfc_mcb[i].state, &rfc_cb.port.rfc_mcb[i]); return (&rfc_cb.port.rfc_mcb[i]); } } /* connection with bd_addr does not exist */ - for (i = 0, j = rfc_cb.rfc.last_mux + 1; i < MAX_BD_CONNECTIONS; i++, j++) - { - if (j >= MAX_BD_CONNECTIONS) + for (i = 0, j = rfc_cb.rfc.last_mux + 1; i < MAX_BD_CONNECTIONS; i++, j++) { + if (j >= MAX_BD_CONNECTIONS) { j = 0; + } p_mcb = &rfc_cb.port.rfc_mcb[j]; - if (rfc_cb.port.rfc_mcb[j].state == RFC_MX_STATE_IDLE) - { + if (rfc_cb.port.rfc_mcb[j].state == RFC_MX_STATE_IDLE) { /* New multiplexer control block */ memset (p_mcb, 0, sizeof (tRFC_MCB)); memcpy (p_mcb->bd_addr, bd_addr, BD_ADDR_LEN); RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, create new p_mcb:%p, index:%d", - is_initiator, &rfc_cb.port.rfc_mcb[j], j); + is_initiator, &rfc_cb.port.rfc_mcb[j], j); GKI_init_q(&p_mcb->cmd_q); @@ -203,8 +198,9 @@ void rfc_release_multiplexer_channel (tRFC_MCB *p_mcb) rfc_timer_stop (p_mcb); - while ((p_buf = GKI_dequeue(&p_mcb->cmd_q)) != NULL) + while ((p_buf = GKI_dequeue(&p_mcb->cmd_q)) != NULL) { GKI_freebuf(p_buf); + } memset (p_mcb, 0, sizeof (tRFC_MCB)); p_mcb->state = RFC_MX_STATE_IDLE; @@ -293,23 +289,20 @@ void rfc_check_mcb_active (tRFC_MCB *p_mcb) { UINT16 i; - for (i = 0; i < RFCOMM_MAX_DLCI; i++) - { - if (p_mcb->port_inx[i] != 0) - { + for (i = 0; i < RFCOMM_MAX_DLCI; i++) { + if (p_mcb->port_inx[i] != 0) { p_mcb->is_disc_initiator = FALSE; return; } } /* The last port was DISCed. On the client side start disconnecting Mx */ /* On the server side start inactivity timer */ - if (p_mcb->is_disc_initiator) - { + if (p_mcb->is_disc_initiator) { p_mcb->is_disc_initiator = FALSE; rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CLOSE_REQ, NULL); - } - else + } else { rfc_timer_start (p_mcb, RFC_MCB_RELEASE_INACT_TIMER); + } } @@ -324,8 +317,7 @@ void rfc_check_mcb_active (tRFC_MCB *p_mcb) *******************************************************************************/ void rfcomm_process_timeout (TIMER_LIST_ENT *p_tle) { - switch (p_tle->event) - { + switch (p_tle->event) { case BTU_TTYPE_RFCOMM_MFC: rfc_mx_sm_execute ((tRFC_MCB *)p_tle->param, RFC_EVENT_TIMEOUT, NULL); break; @@ -358,9 +350,10 @@ void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_r /* Verify that PORT is still waiting for Security to complete */ if (!p_port->in_use - || ((p_port->rfc.state != RFC_STATE_ORIG_WAIT_SEC_CHECK) - && (p_port->rfc.state != RFC_STATE_TERM_WAIT_SEC_CHECK))) + || ((p_port->rfc.state != RFC_STATE_ORIG_WAIT_SEC_CHECK) + && (p_port->rfc.state != RFC_STATE_TERM_WAIT_SEC_CHECK))) { return; + } rfc_port_sm_execute ((tPORT *)p_ref_data, RFC_EVENT_SEC_COMPLETE, &res); } @@ -388,8 +381,7 @@ void rfc_port_closed (tPORT *p_port) p_port->rfc.state = RFC_STATE_CLOSED; /* If multiplexer channel was up mark it as down */ - if (p_mcb) - { + if (p_mcb) { p_mcb->port_inx[p_port->dlci] = 0; /* If there are no more ports opened on this MCB release it */ @@ -413,14 +405,14 @@ void rfc_port_closed (tPORT *p_port) *******************************************************************************/ void rfc_inc_credit (tPORT *p_port, UINT8 credit) { - if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - { + if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) { p_port->credit_tx += credit; RFCOMM_TRACE_EVENT ("rfc_inc_credit:%d", p_port->credit_tx); - if (p_port->tx.peer_fc == TRUE) + if (p_port->tx.peer_fc == TRUE) { PORT_FlowInd(p_port->rfc.p_mcb, p_port->dlci, TRUE); + } } } @@ -437,13 +429,14 @@ void rfc_inc_credit (tPORT *p_port, UINT8 credit) *******************************************************************************/ void rfc_dec_credit (tPORT *p_port) { - if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) - { - if (p_port->credit_tx > 0) + if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) { + if (p_port->credit_tx > 0) { p_port->credit_tx--; + } - if (p_port->credit_tx == 0) + if (p_port->credit_tx == 0) { p_port->tx.peer_fc = TRUE; + } } } @@ -463,16 +456,13 @@ void rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf) BT_HDR *p; /* if passed a buffer queue it */ - if (p_buf != NULL) - { + if (p_buf != NULL) { GKI_enqueue(&p_mcb->cmd_q, p_buf); } /* handle queue if L2CAP not congested */ - while (p_mcb->l2cap_congested == FALSE) - { - if ((p = (BT_HDR *) GKI_dequeue(&p_mcb->cmd_q)) == NULL) - { + while (p_mcb->l2cap_congested == FALSE) { + if ((p = (BT_HDR *) GKI_dequeue(&p_mcb->cmd_q)) == NULL) { break; } diff --git a/components/bt/bluedroid/stack/sdp/include/sdpint.h b/components/bt/bluedroid/stack/sdp/include/sdpint.h old mode 100755 new mode 100644 index 834266edc..9e935ea5a --- a/components/bt/bluedroid/stack/sdp/include/sdpint.h +++ b/components/bt/bluedroid/stack/sdp/include/sdpint.h @@ -90,36 +90,31 @@ // btla-specific -- /* Internal UUID sequence representation */ -typedef struct -{ +typedef struct { UINT16 len; UINT8 value[MAX_UUID_SIZE]; } tUID_ENT; -typedef struct -{ +typedef struct { UINT16 num_uids; tUID_ENT uuid_entry[MAX_UUIDS_PER_SEQ]; } tSDP_UUID_SEQ; /* Internal attribute sequence definitions */ -typedef struct -{ +typedef struct { UINT16 start; UINT16 end; } tATT_ENT; -typedef struct -{ +typedef struct { UINT16 num_attr; tATT_ENT attr_entry[MAX_ATTR_PER_SEQ]; } tSDP_ATTR_SEQ; /* Define the attribute element of the SDP database record */ -typedef struct -{ +typedef struct { UINT32 len; /* Number of bytes in the entry */ UINT8 *value_ptr; /* Points to attr_pad */ UINT16 id; @@ -127,8 +122,7 @@ typedef struct } tSDP_ATTRIBUTE; /* An SDP record consists of a handle, and 1 or more attributes */ -typedef struct -{ +typedef struct { UINT32 record_handle; UINT32 free_pad_ptr; UINT16 num_attributes; @@ -138,23 +132,20 @@ typedef struct /* Define the SDP database */ -typedef struct -{ +typedef struct { UINT32 di_primary_handle; /* Device ID Primary record or NULL if nonexistent */ UINT16 num_records; tSDP_RECORD record[SDP_MAX_RECORDS]; } tSDP_DB; -enum -{ +enum { SDP_IS_SEARCH, SDP_IS_ATTR_SEARCH, }; #if SDP_SERVER_ENABLED == TRUE /* Continuation information for the SDP server response */ -typedef struct -{ +typedef struct { UINT16 next_attr_index; /* attr index for next continuation response */ UINT16 next_attr_start_id; /* attr id to start with for the attr index in next cont. response */ tSDP_RECORD *prev_sdp_rec; /* last sdp record that was completely sent in the response */ @@ -164,8 +155,7 @@ typedef struct #endif /* SDP_SERVER_ENABLED == TRUE */ /* Define the SDP Connection Control Block */ -typedef struct -{ +typedef struct { #define SDP_STATE_IDLE 0 #define SDP_STATE_CONN_SETUP 1 #define SDP_STATE_CFG_SETUP 2 @@ -217,8 +207,7 @@ typedef struct /* The main SDP control block */ -typedef struct -{ +typedef struct { tL2CAP_CFG_INFO l2cap_my_cfg; /* My L2CAP config */ tCONN_CB ccb[SDP_MAX_CONNECTIONS]; #if SDP_SERVER_ENABLED == TRUE @@ -247,7 +236,7 @@ extern tSDP_CB *sdp_cb_ptr; /* Functions provided by sdp_main.c */ extern void sdp_init (void); -extern void sdp_disconnect (tCONN_CB*p_ccb, UINT16 reason); +extern void sdp_disconnect (tCONN_CB *p_ccb, UINT16 reason); #if (defined(SDP_DEBUG) && SDP_DEBUG == TRUE) extern UINT16 sdp_set_max_attr_list_size (UINT16 max_size); @@ -293,7 +282,7 @@ extern UINT16 sdpu_get_list_len( tSDP_UUID_SEQ *uid_seq, tSDP_ATTR_SEQ *attr extern UINT16 sdpu_get_attrib_seq_len(tSDP_RECORD *p_rec, tSDP_ATTR_SEQ *attr_seq); extern UINT16 sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE *p_attr); extern UINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UINT16 len, UINT16 *offset); -extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128); +extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128); /* Functions provided by sdp_db.c */ diff --git a/components/bt/bluedroid/stack/sdp/sdp_api.c b/components/bt/bluedroid/stack/sdp/sdp_api.c old mode 100755 new mode 100644 index 1eab7d541..241fb9598 --- a/components/bt/bluedroid/stack/sdp/sdp_api.c +++ b/components/bt/bluedroid/stack/sdp/sdp_api.c @@ -70,12 +70,11 @@ BOOLEAN SDP_InitDiscoveryDb (tSDP_DISCOVERY_DB *p_db, UINT32 len, UINT16 num_uui /* verify the parameters */ if (p_db == NULL || (sizeof (tSDP_DISCOVERY_DB) > len) || - num_attr > SDP_MAX_ATTR_FILTERS || num_uuid > SDP_MAX_UUID_FILTERS) - { + num_attr > SDP_MAX_ATTR_FILTERS || num_uuid > SDP_MAX_UUID_FILTERS) { SDP_TRACE_ERROR("SDP_InitDiscoveryDb Illegal param: p_db 0x%x, len %d, num_uuid %d, num_attr %d", - (UINT32)p_db, len, num_uuid, num_attr); + (UINT32)p_db, len, num_uuid, num_attr); - return(FALSE); + return (FALSE); } memset (p_db, 0, (size_t)len); @@ -85,20 +84,22 @@ BOOLEAN SDP_InitDiscoveryDb (tSDP_DISCOVERY_DB *p_db, UINT32 len, UINT16 num_uui p_db->p_first_rec = NULL; p_db->p_free_mem = (UINT8 *)(p_db + 1); - for (xx = 0; xx < num_uuid; xx++) + for (xx = 0; xx < num_uuid; xx++) { p_db->uuid_filters[xx] = *p_uuid_list++; + } p_db->num_uuid_filters = num_uuid; - for (xx = 0; xx < num_attr; xx++) + for (xx = 0; xx < num_attr; xx++) { p_db->attr_filters[xx] = *p_attr_list++; + } /* sort attributes */ sdpu_sort_attr_list( num_attr, p_db ); p_db->num_attr_filters = num_attr; #endif - return(TRUE); + return (TRUE); } @@ -116,13 +117,14 @@ BOOLEAN SDP_CancelServiceSearch (tSDP_DISCOVERY_DB *p_db) { #if SDP_CLIENT_ENABLED == TRUE tCONN_CB *p_ccb = sdpu_find_ccb_by_db (p_db); - if (!p_ccb) - return(FALSE); + if (!p_ccb) { + return (FALSE); + } sdp_disconnect (p_ccb, SDP_CANCEL); p_ccb->disc_state = SDP_DISC_WAIT_CANCEL; #endif - return(TRUE); + return (TRUE); } @@ -145,16 +147,17 @@ BOOLEAN SDP_ServiceSearchRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB *p_db, /* Specific BD address */ p_ccb = sdp_conn_originate (p_bd_addr); - if (!p_ccb) - return(FALSE); + if (!p_ccb) { + return (FALSE); + } p_ccb->disc_state = SDP_DISC_WAIT_CONN; p_ccb->p_db = p_db; p_ccb->p_cb = p_cb; - return(TRUE); + return (TRUE); #else - return(FALSE); + return (FALSE); #endif } @@ -174,7 +177,7 @@ BOOLEAN SDP_ServiceSearchRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB *p_db, ** *******************************************************************************/ BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_CMPL_CB *p_cb) + tSDP_DISC_CMPL_CB *p_cb) { #if SDP_CLIENT_ENABLED == TRUE tCONN_CB *p_ccb; @@ -182,8 +185,9 @@ BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB * /* Specific BD address */ p_ccb = sdp_conn_originate (p_bd_addr); - if (!p_ccb) - return(FALSE); + if (!p_ccb) { + return (FALSE); + } p_ccb->disc_state = SDP_DISC_WAIT_CONN; p_ccb->p_db = p_db; @@ -191,9 +195,9 @@ BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB * p_ccb->is_attr_search = TRUE; - return(TRUE); + return (TRUE); #else - return(FALSE); + return (FALSE); #endif } /******************************************************************************* @@ -211,7 +215,7 @@ BOOLEAN SDP_ServiceSearchAttributeRequest (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB * ** *******************************************************************************/ BOOLEAN SDP_ServiceSearchAttributeRequest2 (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB *p_db, - tSDP_DISC_CMPL_CB2 *p_cb2, void * user_data) + tSDP_DISC_CMPL_CB2 *p_cb2, void *user_data) { #if SDP_CLIENT_ENABLED == TRUE tCONN_CB *p_ccb; @@ -219,8 +223,9 @@ BOOLEAN SDP_ServiceSearchAttributeRequest2 (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB /* Specific BD address */ p_ccb = sdp_conn_originate (p_bd_addr); - if (!p_ccb) - return(FALSE); + if (!p_ccb) { + return (FALSE); + } p_ccb->disc_state = SDP_DISC_WAIT_CONN; p_ccb->p_db = p_db; @@ -229,9 +234,9 @@ BOOLEAN SDP_ServiceSearchAttributeRequest2 (UINT8 *p_bd_addr, tSDP_DISCOVERY_DB p_ccb->is_attr_search = TRUE; p_ccb->user_data = user_data; - return(TRUE); + return (TRUE); #else - return(FALSE); + return (FALSE); #endif } @@ -263,21 +268,22 @@ tSDP_DISC_REC *SDP_FindAttributeInDb (tSDP_DISCOVERY_DB *p_db, UINT16 attr_id, tSDP_DISC_ATTR *p_attr; /* Must have a valid database */ - if (p_db == NULL) - return(NULL); + if (p_db == NULL) { + return (NULL); + } - if (!p_start_rec) + if (!p_start_rec) { p_rec = p_db->p_first_rec; - else + } else { p_rec = p_start_rec->p_next_rec; + } - while (p_rec) - { + while (p_rec) { p_attr = p_rec->p_first_attr; - while (p_attr) - { - if (p_attr->attr_id == attr_id) - return(p_rec); + while (p_attr) { + if (p_attr->attr_id == attr_id) { + return (p_rec); + } p_attr = p_attr->p_next_attr; } @@ -286,7 +292,7 @@ tSDP_DISC_REC *SDP_FindAttributeInDb (tSDP_DISCOVERY_DB *p_db, UINT16 attr_id, } #endif /* If here, no matching attribute found */ - return(NULL); + return (NULL); } @@ -306,16 +312,16 @@ tSDP_DISC_ATTR *SDP_FindAttributeInRec (tSDP_DISC_REC *p_rec, UINT16 attr_id) tSDP_DISC_ATTR *p_attr; p_attr = p_rec->p_first_attr; - while (p_attr) - { - if (p_attr->attr_id == attr_id) - return(p_attr); + while (p_attr) { + if (p_attr->attr_id == attr_id) { + return (p_attr); + } p_attr = p_attr->p_next_attr; } #endif /* If here, no matching attribute found */ - return(NULL); + return (NULL); } /******************************************************************************* @@ -331,77 +337,62 @@ tSDP_DISC_ATTR *SDP_FindAttributeInRec (tSDP_DISC_REC *p_rec, UINT16 attr_id) ** Returns TRUE if found, otherwise FALSE. ** *******************************************************************************/ -BOOLEAN SDP_FindServiceUUIDInRec(tSDP_DISC_REC *p_rec, tBT_UUID * p_uuid) +BOOLEAN SDP_FindServiceUUIDInRec(tSDP_DISC_REC *p_rec, tBT_UUID *p_uuid) { #if SDP_CLIENT_ENABLED == TRUE tSDP_DISC_ATTR *p_attr, *p_sattr, *p_extra_sattr; p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - { - if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_16) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) { + if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_16) { p_uuid->len = LEN_UUID_16; p_uuid->uu.uuid16 = p_sattr->attr_value.v.u16; - } - else if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_128) - { + } else if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_128) { p_uuid->len = LEN_UUID_128; - for (uint8_t i = 0; i != LEN_UUID_128; ++i) - p_uuid->uu.uuid128[i] = p_sattr->attr_value.v.array[LEN_UUID_128-i-1]; - } - else if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_32) - { + for (uint8_t i = 0; i != LEN_UUID_128; ++i) { + p_uuid->uu.uuid128[i] = p_sattr->attr_value.v.array[LEN_UUID_128 - i - 1]; + } + } else if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == LEN_UUID_32) { p_uuid->len = LEN_UUID_32; p_uuid->uu.uuid32 = p_sattr->attr_value.v.u32; } - return(TRUE); + return (TRUE); } /* Checking for Toyota G Block Car Kit: ** This car kit puts an extra data element sequence ** where the UUID is suppose to be!!! */ - else - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) - { + else { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) { /* Look through data element sequence until no more UUIDs */ - for (p_extra_sattr = p_sattr->attr_value.v.p_sub_attr; p_extra_sattr; p_extra_sattr = p_extra_sattr->p_next_attr) - { + for (p_extra_sattr = p_sattr->attr_value.v.p_sub_attr; p_extra_sattr; p_extra_sattr = p_extra_sattr->p_next_attr) { /* Increment past this to see if the next attribut is UUID */ if ((SDP_DISC_ATTR_TYPE(p_extra_sattr->attr_len_type) == UUID_DESC_TYPE) - /* only support 16 bits UUID for now */ - && (SDP_DISC_ATTR_LEN(p_extra_sattr->attr_len_type) == 2)) - { + /* only support 16 bits UUID for now */ + && (SDP_DISC_ATTR_LEN(p_extra_sattr->attr_len_type) == 2)) { p_uuid->len = 2; p_uuid->uu.uuid16 = p_extra_sattr->attr_value.v.u16; - return(TRUE); + return (TRUE); } } } } } break; - } - else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) - { + } else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) { if ((SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE) - /* only support 16 bits UUID for now */ - && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2)) - { + /* only support 16 bits UUID for now */ + && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2)) { p_uuid->len = 2; p_uuid->uu.uuid16 = p_attr->attr_value.v.u16; - return(TRUE); + return (TRUE); } } p_attr = p_attr->p_next_attr; @@ -423,44 +414,38 @@ BOOLEAN SDP_FindServiceUUIDInRec(tSDP_DISC_REC *p_rec, tBT_UUID * p_uuid) ** Returns TRUE if found, otherwise FALSE. ** *******************************************************************************/ -BOOLEAN SDP_FindServiceUUIDInRec_128bit(tSDP_DISC_REC *p_rec, tBT_UUID * p_uuid) +BOOLEAN SDP_FindServiceUUIDInRec_128bit(tSDP_DISC_REC *p_rec, tBT_UUID *p_uuid) { #if SDP_CLIENT_ENABLED == TRUE tSDP_DISC_ATTR *p_attr, *p_sattr; p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) { /* only support 128 bits UUID for now */ - if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 16) - { + if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 16) { p_uuid->len = LEN_UUID_128; - for (uint8_t i = 0; i != LEN_UUID_128; ++i) - p_uuid->uu.uuid128[i] = p_sattr->attr_value.v.array[LEN_UUID_128-i-1]; + for (uint8_t i = 0; i != LEN_UUID_128; ++i) { + p_uuid->uu.uuid128[i] = p_sattr->attr_value.v.array[LEN_UUID_128 - i - 1]; + } } - return(TRUE); + return (TRUE); } } break; - } - else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) - { + } else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) { if ((SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE) - /* only support 128 bits UUID for now */ - && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 16)) - { + /* only support 128 bits UUID for now */ + && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 16)) { p_uuid->len = LEN_UUID_128; - for (uint8_t i = 0; i != LEN_UUID_128; ++i) - p_uuid->uu.uuid128[i] = p_attr->attr_value.v.array[LEN_UUID_128-i-1]; - return(TRUE); + for (uint8_t i = 0; i != LEN_UUID_128; ++i) { + p_uuid->uu.uuid128[i] = p_attr->attr_value.v.array[LEN_UUID_128 - i - 1]; + } + return (TRUE); } } p_attr = p_attr->p_next_attr; @@ -488,33 +473,29 @@ tSDP_DISC_REC *SDP_FindServiceInDb (tSDP_DISCOVERY_DB *p_db, UINT16 service_uuid tSDP_DISC_ATTR *p_attr, *p_sattr, *p_extra_sattr; /* Must have a valid database */ - if (p_db == NULL) - return(NULL); + if (p_db == NULL) { + return (NULL); + } - if (!p_start_rec) + if (!p_start_rec) { p_rec = p_db->p_first_rec; - else + } else { p_rec = p_start_rec->p_next_rec; + } - while (p_rec) - { + while (p_rec) { p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) ) { + && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) ) { SDP_TRACE_DEBUG("SDP_FindServiceInDb - p_sattr value = 0x%x serviceuuid = 0x%x\r\n", p_sattr->attr_value.v.u16, service_uuid); - if(service_uuid == UUID_SERVCLASS_HDP_PROFILE) - { - if( (p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SOURCE) || ( p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SINK)) - { + if (service_uuid == UUID_SERVCLASS_HDP_PROFILE) { + if ( (p_sattr->attr_value.v.u16 == UUID_SERVCLASS_HDP_SOURCE) || ( p_sattr->attr_value.v.u16 == UUID_SERVCLASS_HDP_SINK)) { SDP_TRACE_DEBUG("SDP_FindServiceInDb found HDP source or sink\n" ); return (p_rec); } @@ -523,45 +504,40 @@ tSDP_DISC_REC *SDP_FindServiceInDb (tSDP_DISCOVERY_DB *p_db, UINT16 service_uuid } if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE && (service_uuid == 0 - || (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2 - && p_sattr->attr_value.v.u16 == service_uuid))) + || (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2 + && p_sattr->attr_value.v.u16 == service_uuid))) /* for a specific uuid, or any one */ { - return(p_rec); + return (p_rec); } /* Checking for Toyota G Block Car Kit: ** This car kit puts an extra data element sequence ** where the UUID is suppose to be!!! */ - else - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) - { + else { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) { /* Look through data element sequence until no more UUIDs */ - for (p_extra_sattr = p_sattr->attr_value.v.p_sub_attr; p_extra_sattr; p_extra_sattr = p_extra_sattr->p_next_attr) - { + for (p_extra_sattr = p_sattr->attr_value.v.p_sub_attr; p_extra_sattr; p_extra_sattr = p_extra_sattr->p_next_attr) { /* Increment past this to see if the next attribut is UUID */ if ((SDP_DISC_ATTR_TYPE(p_extra_sattr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_extra_sattr->attr_len_type) == 2) - /* for a specific uuid, or any one */ - && ((p_extra_sattr->attr_value.v.u16 == service_uuid) || (service_uuid == 0))) - { - return(p_rec); + && (SDP_DISC_ATTR_LEN(p_extra_sattr->attr_len_type) == 2) + /* for a specific uuid, or any one */ + && ((p_extra_sattr->attr_value.v.u16 == service_uuid) || (service_uuid == 0))) { + return (p_rec); } } } } } break; - } - else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) - { + } else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) { if ((SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) - /* find a specific UUID or anyone */ - && ((p_attr->attr_value.v.u16 == service_uuid) || service_uuid == 0)) - return(p_rec); + && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) + /* find a specific UUID or anyone */ + && ((p_attr->attr_value.v.u16 == service_uuid) || service_uuid == 0)) { + return (p_rec); + } } p_attr = p_attr->p_next_attr; @@ -571,7 +547,7 @@ tSDP_DISC_REC *SDP_FindServiceInDb (tSDP_DISCOVERY_DB *p_db, UINT16 service_uuid } #endif /* If here, no matching UUID found */ - return(NULL); + return (NULL); } /******************************************************************************* @@ -596,37 +572,33 @@ tSDP_DISC_REC *SDP_FindServiceInDb_128bit(tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC tSDP_DISC_ATTR *p_attr, *p_sattr; /* Must have a valid database */ - if (p_db == NULL) - return(NULL); + if (p_db == NULL) { + return (NULL); + } - if (!p_start_rec) + if (!p_start_rec) { p_rec = p_db->p_first_rec; - else + } else { p_rec = p_start_rec->p_next_rec; + } - while (p_rec) - { + while (p_rec) { p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 16)) - { - return(p_rec); + && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 16)) { + return (p_rec); } } break; - } - else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) - { + } else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) { if ((SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 16)) - return(p_rec); + && (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 16)) { + return (p_rec); + } } p_attr = p_attr->p_next_attr; @@ -636,7 +608,7 @@ tSDP_DISC_REC *SDP_FindServiceInDb_128bit(tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC } #endif /* If here, no matching UUID found */ - return(NULL); + return (NULL); } @@ -662,38 +634,34 @@ tSDP_DISC_REC *SDP_FindServiceUUIDInDb (tSDP_DISCOVERY_DB *p_db, tBT_UUID *p_uui tSDP_DISC_ATTR *p_attr, *p_sattr; /* Must have a valid database */ - if (p_db == NULL) - return(NULL); + if (p_db == NULL) { + return (NULL); + } - if (!p_start_rec) + if (!p_start_rec) { p_rec = p_db->p_first_rec; - else + } else { p_rec = p_start_rec->p_next_rec; + } - while (p_rec) - { + while (p_rec) { p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { if ((p_attr->attr_id == ATTR_ID_SERVICE_CLASS_ID_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - { - if (sdpu_compare_uuid_with_attr (p_uuid, p_sattr)) - return(p_rec); + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) { + if (sdpu_compare_uuid_with_attr (p_uuid, p_sattr)) { + return (p_rec); + } } } break; - } - else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) - { - if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE ) - { - if (sdpu_compare_uuid_with_attr (p_uuid, p_attr)) - return(p_rec); + } else if (p_attr->attr_id == ATTR_ID_SERVICE_ID) { + if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UUID_DESC_TYPE ) { + if (sdpu_compare_uuid_with_attr (p_uuid, p_attr)) { + return (p_rec); + } } } @@ -704,7 +672,7 @@ tSDP_DISC_REC *SDP_FindServiceUUIDInDb (tSDP_DISCOVERY_DB *p_db, tBT_UUID *p_uui } #endif /* CLIENT_ENABLED == TRUE */ /* If here, no matching UUID found */ - return(NULL); + return (NULL); } #if SDP_CLIENT_ENABLED == TRUE @@ -724,46 +692,46 @@ static BOOLEAN sdp_fill_proto_elem( tSDP_DISC_ATTR *p_attr, UINT16 layer_uuid, tSDP_DISC_ATTR *p_sattr; /* Walk through the protocol descriptor list */ - for (p_attr = p_attr->attr_value.v.p_sub_attr; p_attr; p_attr = p_attr->p_next_attr) - { + for (p_attr = p_attr->attr_value.v.p_sub_attr; p_attr; p_attr = p_attr->p_next_attr) { /* Safety check - each entry should itself be a sequence */ - if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) - return(FALSE); + if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) { + return (FALSE); + } /* Now, see if the entry contains the layer we are interested in */ - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { /* SDP_TRACE_DEBUG ("SDP - p_sattr 0x%x, layer_uuid:0x%x, u16:0x%x####", p_sattr, layer_uuid, p_sattr->attr_value.v.u16); */ if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) - && (p_sattr->attr_value.v.u16 == layer_uuid)) - { + && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) + && (p_sattr->attr_value.v.u16 == layer_uuid)) { /* Bingo. Now fill in the passed element */ p_elem->protocol_uuid = layer_uuid; p_elem->num_params = 0; /* Store the parameters, if any */ - for (p_sattr = p_sattr->p_next_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) != UINT_DESC_TYPE) + for (p_sattr = p_sattr->p_next_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) != UINT_DESC_TYPE) { break; + } - if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) + if (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) { p_elem->params[p_elem->num_params++] = p_sattr->attr_value.v.u16; - else + } else { p_elem->params[p_elem->num_params++] = p_sattr->attr_value.v.u8; + } - if (p_elem->num_params >= SDP_MAX_PROTOCOL_PARAMS) + if (p_elem->num_params >= SDP_MAX_PROTOCOL_PARAMS) { break; + } } - return(TRUE); + return (TRUE); } } } - return(FALSE); + return (FALSE); } #endif /* CLIENT_ENABLED == TRUE */ @@ -784,19 +752,17 @@ BOOLEAN SDP_FindProtocolListElemInRec (tSDP_DISC_REC *p_rec, UINT16 layer_uuid, tSDP_DISC_ATTR *p_attr; p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { /* Find the protocol descriptor list */ if ((p_attr->attr_id == ATTR_ID_PROTOCOL_DESC_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { return sdp_fill_proto_elem(p_attr, layer_uuid, p_elem); } p_attr = p_attr->p_next_attr; } #endif /* If here, no match found */ - return(FALSE); + return (FALSE); } @@ -818,19 +784,16 @@ BOOLEAN SDP_FindAddProtoListsElemInRec (tSDP_DISC_REC *p_rec, UINT16 layer_uuid, BOOLEAN ret = FALSE; p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { /* Find the additional protocol descriptor list attribute */ if ((p_attr->attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { /* Safety check - each entry should itself be a sequence */ - if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) - { - if ( (ret = sdp_fill_proto_elem(p_sattr, layer_uuid, p_elem)) == TRUE) + if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE) { + if ( (ret = sdp_fill_proto_elem(p_sattr, layer_uuid, p_elem)) == TRUE) { break; + } } } return ret; @@ -839,7 +802,7 @@ BOOLEAN SDP_FindAddProtoListsElemInRec (tSDP_DISC_REC *p_rec, UINT16 layer_uuid, } #endif /* If here, no match found */ - return(FALSE); + return (FALSE); } @@ -863,52 +826,47 @@ BOOLEAN SDP_FindProfileVersionInRec (tSDP_DISC_REC *p_rec, UINT16 profile_uuid, tSDP_DISC_ATTR *p_attr, *p_sattr; p_attr = p_rec->p_first_attr; - while (p_attr) - { + while (p_attr) { /* Find the profile descriptor list */ if ((p_attr->attr_id == ATTR_ID_BT_PROFILE_DESC_LIST) - && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) - { + && (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == DATA_ELE_SEQ_DESC_TYPE)) { /* Walk through the protocol descriptor list */ - for (p_attr = p_attr->attr_value.v.p_sub_attr; p_attr; p_attr = p_attr->p_next_attr) - { + for (p_attr = p_attr->attr_value.v.p_sub_attr; p_attr; p_attr = p_attr->p_next_attr) { /* Safety check - each entry should itself be a sequence */ - if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) - return(FALSE); + if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) { + return (FALSE); + } /* Now, see if the entry contains the profile UUID we are interested in */ - for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) - { + for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr) { if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE) - && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) /* <- This is bytes, not size code! */ - && (p_sattr->attr_value.v.u16 == profile_uuid)) - { + && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) /* <- This is bytes, not size code! */ + && (p_sattr->attr_value.v.u16 == profile_uuid)) { /* Now fill in the major and minor numbers */ /* if the attribute matches the description for version (type UINT, size 2 bytes) */ p_sattr = p_sattr->p_next_attr; if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UINT_DESC_TYPE) && - (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2)) - { + (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2)) { /* The high order 8 bits is the major number, low order is the minor number (big endian) */ *p_version = p_sattr->attr_value.v.u16; - return(TRUE); + return (TRUE); + } else { + return (FALSE); /* The type and/or size was not valid for the profile list version */ } - else - return(FALSE); /* The type and/or size was not valid for the profile list version */ } } } - return(FALSE); + return (FALSE); } p_attr = p_attr->p_next_attr; } #endif /* CLIENT_ENABLED == TRUE */ /* If here, no match found */ - return(FALSE); + return (FALSE); } /******************************************************************************* @@ -938,8 +896,9 @@ UINT16 SDP_DiDiscover( BD_ADDR remote_device, tSDP_DISCOVERY_DB *p_db, init_uuid.uu.uuid16 = di_uuid; if ( SDP_InitDiscoveryDb(p_db, len, num_uuids, &init_uuid, 0, NULL) ) - if ( SDP_ServiceSearchRequest(remote_device, p_db, p_cb) ) + if ( SDP_ServiceSearchRequest(remote_device, p_db, p_cb) ) { result = SDP_SUCCESS; + } return result; #else @@ -962,13 +921,13 @@ UINT8 SDP_GetNumDiRecords( tSDP_DISCOVERY_DB *p_db ) UINT8 num_records = 0; tSDP_DISC_REC *p_curr_record = NULL; - do - { + do { p_curr_record = SDP_FindServiceInDb( p_db, UUID_SERVCLASS_PNP_INFORMATION, p_curr_record ); - if ( p_curr_record ) + if ( p_curr_record ) { num_records++; - }while ( p_curr_record ); + } + } while ( p_curr_record ); return num_records; #else @@ -987,19 +946,17 @@ UINT8 SDP_GetNumDiRecords( tSDP_DISCOVERY_DB *p_db ) *******************************************************************************/ static void SDP_AttrStringCopy(char *dst, tSDP_DISC_ATTR *p_attr, UINT16 dst_size) { - if ( dst == NULL ) return; - if ( p_attr ) - { + if ( dst == NULL ) { + return; + } + if ( p_attr ) { UINT16 len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); - if ( len > dst_size - 1 ) - { + if ( len > dst_size - 1 ) { len = dst_size - 1; } memcpy(dst, (char *)p_attr->attr_value.v.array, len); dst[len] = '\0'; - } - else - { + } else { dst[0] = '\0'; } } @@ -1024,22 +981,18 @@ UINT16 SDP_GetDiRecord( UINT8 get_record_index, tSDP_DI_GET_RECORD *p_device_inf tSDP_DISC_REC *p_curr_record = NULL; /* find the requested SDP record in the discovery database */ - do - { + do { p_curr_record = SDP_FindServiceInDb( p_db, UUID_SERVCLASS_PNP_INFORMATION, p_curr_record ); - if ( p_curr_record ) - { - if ( curr_record_index++ == get_record_index ) - { + if ( p_curr_record ) { + if ( curr_record_index++ == get_record_index ) { result = SDP_SUCCESS; break; } } - }while ( p_curr_record ); + } while ( p_curr_record ); - if ( result == SDP_SUCCESS ) - { + if ( result == SDP_SUCCESS ) { /* copy the information from the SDP record to the DI record */ tSDP_DISC_ATTR *p_curr_attr = NULL; @@ -1057,40 +1010,46 @@ UINT16 SDP_GetDiRecord( UINT8 get_record_index, tSDP_DI_GET_RECORD *p_device_inf SDP_AttrStringCopy( p_device_info->rec.documentation_url, p_curr_attr, SDP_MAX_ATTR_LEN ); p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_SPECIFICATION_ID ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->spec_id = p_curr_attr->attr_value.v.u16; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_VENDOR_ID ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->rec.vendor = p_curr_attr->attr_value.v.u16; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_VENDOR_ID_SOURCE ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->rec.vendor_id_source = p_curr_attr->attr_value.v.u16; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_PRODUCT_ID ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->rec.product = p_curr_attr->attr_value.v.u16; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_PRODUCT_VERSION ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->rec.version = p_curr_attr->attr_value.v.u16; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } p_curr_attr = SDP_FindAttributeInRec( p_curr_record, ATTR_ID_PRIMARY_RECORD ); - if ( p_curr_attr ) + if ( p_curr_attr ) { p_device_info->rec.primary_record = (BOOLEAN)p_curr_attr->attr_value.v.u8; - else + } else { result = SDP_ERR_ATTR_NOT_PRESENT; + } } return result; @@ -1126,129 +1085,129 @@ UINT16 SDP_SetLocalDiRecord( tSDP_DI_RECORD *p_device_info, UINT32 *p_handle ) UINT8 u8; *p_handle = 0; - if ( p_device_info == NULL ) + if ( p_device_info == NULL ) { return SDP_ILLEGAL_PARAMETER; + } /* if record is to be primary record, get handle to replace old primary */ - if ( p_device_info->primary_record == TRUE && sdp_cb.server_db.di_primary_handle ) + if ( p_device_info->primary_record == TRUE && sdp_cb.server_db.di_primary_handle ) { handle = sdp_cb.server_db.di_primary_handle; - else - { - if ( (handle = SDP_CreateRecord()) == 0 ) + } else { + if ( (handle = SDP_CreateRecord()) == 0 ) { return SDP_NO_RESOURCES; + } } *p_handle = handle; /* build the SDP entry */ /* Add the UUID to the Service Class ID List */ - if ((SDP_AddServiceClassIdList(handle, 1, &di_uuid)) == FALSE) + if ((SDP_AddServiceClassIdList(handle, 1, &di_uuid)) == FALSE) { result = SDP_DI_REG_FAILED; + } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { p_temp = temp_u16; UINT16_TO_BE_STREAM(p_temp, di_specid); if ( !(SDP_AddAttribute(handle, ATTR_ID_SPECIFICATION_ID, UINT_DESC_TYPE, sizeof(di_specid), - temp_u16)) ) + temp_u16)) ) { result = SDP_DI_REG_FAILED; - } - - /* optional - if string is null, do not add attribute */ - if ( result == SDP_SUCCESS ) - { - if ( p_device_info->client_executable_url[0] != '\0' ) - { - if ( !((strlen(p_device_info->client_executable_url)+1 <= SDP_MAX_ATTR_LEN) && - SDP_AddAttribute(handle, ATTR_ID_CLIENT_EXE_URL, URL_DESC_TYPE, - (UINT32)(strlen(p_device_info->client_executable_url)+1), - (UINT8 *)p_device_info->client_executable_url)) ) - result = SDP_DI_REG_FAILED; } } /* optional - if string is null, do not add attribute */ - if ( result == SDP_SUCCESS ) - { - if ( p_device_info->service_description[0] != '\0' ) - { - if ( !((strlen(p_device_info->service_description)+1 <= SDP_MAX_ATTR_LEN) && - SDP_AddAttribute(handle, ATTR_ID_SERVICE_DESCRIPTION, - TEXT_STR_DESC_TYPE, - (UINT32)(strlen(p_device_info->service_description)+1), - (UINT8 *)p_device_info->service_description)) ) + if ( result == SDP_SUCCESS ) { + if ( p_device_info->client_executable_url[0] != '\0' ) { + if ( !((strlen(p_device_info->client_executable_url) + 1 <= SDP_MAX_ATTR_LEN) && + SDP_AddAttribute(handle, ATTR_ID_CLIENT_EXE_URL, URL_DESC_TYPE, + (UINT32)(strlen(p_device_info->client_executable_url) + 1), + (UINT8 *)p_device_info->client_executable_url)) ) { result = SDP_DI_REG_FAILED; + } } } /* optional - if string is null, do not add attribute */ - if ( result == SDP_SUCCESS ) - { - if ( p_device_info->documentation_url[0] != '\0' ) - { - if ( !((strlen(p_device_info->documentation_url)+1 <= SDP_MAX_ATTR_LEN) && - SDP_AddAttribute(handle, ATTR_ID_DOCUMENTATION_URL, URL_DESC_TYPE, - (UINT32)(strlen(p_device_info->documentation_url)+1), - (UINT8 *)p_device_info->documentation_url)) ) + if ( result == SDP_SUCCESS ) { + if ( p_device_info->service_description[0] != '\0' ) { + if ( !((strlen(p_device_info->service_description) + 1 <= SDP_MAX_ATTR_LEN) && + SDP_AddAttribute(handle, ATTR_ID_SERVICE_DESCRIPTION, + TEXT_STR_DESC_TYPE, + (UINT32)(strlen(p_device_info->service_description) + 1), + (UINT8 *)p_device_info->service_description)) ) { result = SDP_DI_REG_FAILED; + } + } + } + + /* optional - if string is null, do not add attribute */ + if ( result == SDP_SUCCESS ) { + if ( p_device_info->documentation_url[0] != '\0' ) { + if ( !((strlen(p_device_info->documentation_url) + 1 <= SDP_MAX_ATTR_LEN) && + SDP_AddAttribute(handle, ATTR_ID_DOCUMENTATION_URL, URL_DESC_TYPE, + (UINT32)(strlen(p_device_info->documentation_url) + 1), + (UINT8 *)p_device_info->documentation_url)) ) { + result = SDP_DI_REG_FAILED; + } } } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { p_temp = temp_u16; UINT16_TO_BE_STREAM(p_temp, p_device_info->vendor); if ( !(SDP_AddAttribute(handle, ATTR_ID_VENDOR_ID, UINT_DESC_TYPE, - sizeof(p_device_info->vendor), temp_u16)) ) + sizeof(p_device_info->vendor), temp_u16)) ) { result = SDP_DI_REG_FAILED; + } } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { p_temp = temp_u16; UINT16_TO_BE_STREAM (p_temp, p_device_info->product); if ( !(SDP_AddAttribute(handle, ATTR_ID_PRODUCT_ID, - UINT_DESC_TYPE, sizeof(p_device_info->product), temp_u16)) ) + UINT_DESC_TYPE, sizeof(p_device_info->product), temp_u16)) ) { result = SDP_DI_REG_FAILED; + } } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { p_temp = temp_u16; UINT16_TO_BE_STREAM (p_temp, p_device_info->version); if ( !(SDP_AddAttribute(handle, ATTR_ID_PRODUCT_VERSION, UINT_DESC_TYPE, - sizeof(p_device_info->version), temp_u16)) ) + sizeof(p_device_info->version), temp_u16)) ) { result = SDP_DI_REG_FAILED; + } } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { u8 = (UINT8)p_device_info->primary_record; if ( !(SDP_AddAttribute(handle, ATTR_ID_PRIMARY_RECORD, - BOOLEAN_DESC_TYPE, 1, &u8)) ) + BOOLEAN_DESC_TYPE, 1, &u8)) ) { result = SDP_DI_REG_FAILED; + } } /* mandatory */ - if ( result == SDP_SUCCESS) - { + if ( result == SDP_SUCCESS) { p_temp = temp_u16; UINT16_TO_BE_STREAM(p_temp, p_device_info->vendor_id_source); if ( !(SDP_AddAttribute(handle, ATTR_ID_VENDOR_ID_SOURCE, UINT_DESC_TYPE, - sizeof(p_device_info->vendor_id_source), temp_u16)) ) + sizeof(p_device_info->vendor_id_source), temp_u16)) ) { result = SDP_DI_REG_FAILED; + } } - if ( result != SDP_SUCCESS ) + if ( result != SDP_SUCCESS ) { SDP_DeleteRecord( handle ); - else if (p_device_info->primary_record == TRUE) + } else if (p_device_info->primary_record == TRUE) { sdp_cb.server_db.di_primary_handle = handle; + } return result; #else /* SDP_SERVER_ENABLED is FALSE */ @@ -1268,8 +1227,9 @@ UINT16 SDP_SetLocalDiRecord( tSDP_DI_RECORD *p_device_info, UINT32 *p_handle ) *******************************************************************************/ UINT8 SDP_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { sdp_cb.trace_level = new_level; + } - return(sdp_cb.trace_level); + return (sdp_cb.trace_level); } diff --git a/components/bt/bluedroid/stack/sdp/sdp_db.c b/components/bt/bluedroid/stack/sdp/sdp_db.c old mode 100755 new mode 100644 index 8eb680dcd..264a0d25c --- a/components/bt/bluedroid/stack/sdp/sdp_db.c +++ b/components/bt/bluedroid/stack/sdp/sdp_db.c @@ -63,43 +63,42 @@ tSDP_RECORD *sdp_db_service_search (tSDP_RECORD *p_rec, tSDP_UUID_SEQ *p_seq) tSDP_RECORD *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records]; /* If NULL, start at the beginning, else start at the first specified record */ - if (!p_rec) + if (!p_rec) { p_rec = &sdp_cb.server_db.record[0]; - else + } else { p_rec++; + } /* Look through the records. The spec says that a match occurs if */ /* the record contains all the passed UUIDs in it. */ - for ( ; p_rec < p_end; p_rec++) - { - for (yy = 0; yy < p_seq->num_uids; yy++) - { + for ( ; p_rec < p_end; p_rec++) { + for (yy = 0; yy < p_seq->num_uids; yy++) { p_attr = &p_rec->attribute[0]; - for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) - { - if (p_attr->type == UUID_DESC_TYPE) - { + for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { + if (p_attr->type == UUID_DESC_TYPE) { if (sdpu_compare_uuid_arrays (p_attr->value_ptr, p_attr->len, &p_seq->uuid_entry[yy].value[0], - p_seq->uuid_entry[yy].len)) + p_seq->uuid_entry[yy].len)) { break; - } - else if (p_attr->type == DATA_ELE_SEQ_DESC_TYPE) - { + } + } else if (p_attr->type == DATA_ELE_SEQ_DESC_TYPE) { if (find_uuid_in_seq (p_attr->value_ptr, p_attr->len, &p_seq->uuid_entry[yy].value[0], - p_seq->uuid_entry[yy].len, 0)) + p_seq->uuid_entry[yy].len, 0)) { break; + } } } /* If any UUID was not found, on to the next record */ - if (xx == p_rec->num_attributes) + if (xx == p_rec->num_attributes) { break; + } } /* If every UUID was found in the record, return the record */ - if (yy == p_seq->num_uids) + if (yy == p_seq->num_uids) { return (p_rec); + } } /* If here, no more records found */ @@ -123,23 +122,22 @@ static BOOLEAN find_uuid_in_seq (UINT8 *p , UINT32 seq_len, UINT8 *p_uuid, UINT32 len; /* A little safety check to avoid excessive recursion */ - if (nest_level > 3) + if (nest_level > 3) { return (FALSE); + } - while (p < p_end) - { + while (p < p_end) { type = *p++; p = sdpu_get_len_from_type (p, type, &len); type = type >> 3; - if (type == UUID_DESC_TYPE) - { - if (sdpu_compare_uuid_arrays (p, len, p_uuid, uuid_len)) + if (type == UUID_DESC_TYPE) { + if (sdpu_compare_uuid_arrays (p, len, p_uuid, uuid_len)) { return (TRUE); - } - else if (type == DATA_ELE_SEQ_DESC_TYPE) - { - if (find_uuid_in_seq (p, len, p_uuid, uuid_len, nest_level + 1)) + } + } else if (type == DATA_ELE_SEQ_DESC_TYPE) { + if (find_uuid_in_seq (p, len, p_uuid, uuid_len, nest_level + 1)) { return (TRUE); + } } p = p + len; } @@ -164,10 +162,10 @@ tSDP_RECORD *sdp_db_find_record (UINT32 handle) tSDP_RECORD *p_end = &sdp_cb.server_db.record[sdp_cb.server_db.num_records]; /* Look through the records for the caller's handle */ - for (p_rec = &sdp_cb.server_db.record[0]; p_rec < p_end; p_rec++) - { - if (p_rec->record_handle == handle) + for (p_rec = &sdp_cb.server_db.record[0]; p_rec < p_end; p_rec++) { + if (p_rec->record_handle == handle) { return (p_rec); + } } /* Record with that handle not found. */ @@ -187,17 +185,17 @@ tSDP_RECORD *sdp_db_find_record (UINT32 handle) ** *******************************************************************************/ tSDP_ATTRIBUTE *sdp_db_find_attr_in_rec (tSDP_RECORD *p_rec, UINT16 start_attr, - UINT16 end_attr) + UINT16 end_attr) { tSDP_ATTRIBUTE *p_at; UINT16 xx; /* Note that the attributes in a record are assumed to be in sorted order */ for (xx = 0, p_at = &p_rec->attribute[0]; xx < p_rec->num_attributes; - xx++, p_at++) - { - if ((p_at->id >= start_attr) && (p_at->id <= end_attr)) + xx++, p_at++) { + if ((p_at->id >= start_attr) && (p_at->id <= end_attr)) { return (p_at); + } } /* No matching attribute found */ @@ -216,7 +214,7 @@ tSDP_ATTRIBUTE *sdp_db_find_attr_in_rec (tSDP_RECORD *p_rec, UINT16 start_attr, ** *******************************************************************************/ static int sdp_compose_proto_list( UINT8 *p, UINT16 num_elem, - tSDP_PROTOCOL_ELEM *p_elem_list) + tSDP_PROTOCOL_ELEM *p_elem_list) { UINT16 xx, yy, len; BOOLEAN is_rfcomm_scn; @@ -227,8 +225,7 @@ static int sdp_compose_proto_list( UINT8 *p, UINT16 num_elem, ** sequences, one for each layer. Each layer sequence consists of layer's ** UUID and optional parameters */ - for (xx = 0; xx < num_elem; xx++, p_elem_list++) - { + for (xx = 0; xx < num_elem; xx++, p_elem_list++) { len = 3 + (p_elem_list->num_params * 3); UINT8_TO_BE_STREAM (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); @@ -238,22 +235,19 @@ static int sdp_compose_proto_list( UINT8 *p, UINT16 num_elem, UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p, p_elem_list->protocol_uuid); - if (p_elem_list->protocol_uuid == UUID_PROTOCOL_RFCOMM) + if (p_elem_list->protocol_uuid == UUID_PROTOCOL_RFCOMM) { is_rfcomm_scn = TRUE; - else + } else { is_rfcomm_scn = FALSE; + } - for (yy = 0; yy < p_elem_list->num_params; yy++) - { - if (is_rfcomm_scn) - { + for (yy = 0; yy < p_elem_list->num_params; yy++) { + if (is_rfcomm_scn) { UINT8_TO_BE_STREAM (p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE); UINT8_TO_BE_STREAM (p, p_elem_list->params[yy]); *p_len -= 1; - } - else - { + } else { UINT8_TO_BE_STREAM (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p, p_elem_list->params[yy]); } @@ -284,17 +278,17 @@ UINT32 SDP_CreateRecord (void) tSDP_DB *p_db = &sdp_cb.server_db; /* First, check if there is a free record */ - if (p_db->num_records < SDP_MAX_RECORDS) - { + if (p_db->num_records < SDP_MAX_RECORDS) { memset (&p_db->record[p_db->num_records], 0, sizeof (tSDP_RECORD)); /* We will use a handle of the first unreserved handle plus last record ** number + 1 */ - if (p_db->num_records) + if (p_db->num_records) { handle = p_db->record[p_db->num_records - 1].record_handle + 1; - else + } else { handle = 0x10000; + } p_db->record[p_db->num_records].record_handle = handle; @@ -306,10 +300,11 @@ UINT32 SDP_CreateRecord (void) 4, buf); return (p_db->record[p_db->num_records - 1].record_handle); + } else { + SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d\n", SDP_MAX_RECORDS); } - else SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d\n", SDP_MAX_RECORDS); #endif - return (0); + return (0); } @@ -332,8 +327,7 @@ BOOLEAN SDP_DeleteRecord (UINT32 handle) UINT16 xx, yy, zz; tSDP_RECORD *p_rec = &sdp_cb.server_db.record[0]; - if (handle == 0 || sdp_cb.server_db.num_records == 0) - { + if (handle == 0 || sdp_cb.server_db.num_records == 0) { /* Delete all records in the database */ sdp_cb.server_db.num_records = 0; @@ -341,22 +335,18 @@ BOOLEAN SDP_DeleteRecord (UINT32 handle) sdp_cb.server_db.di_primary_handle = 0; return (TRUE); - } - else - { + } else { /* Find the record in the database */ - for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) - { - if (p_rec->record_handle == handle) - { + for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) { + if (p_rec->record_handle == handle) { /* Found it. Shift everything up one */ - for (yy = xx; yy < sdp_cb.server_db.num_records; yy++, p_rec++) - { + for (yy = xx; yy < sdp_cb.server_db.num_records; yy++, p_rec++) { *p_rec = *(p_rec + 1); /* Adjust the attribute value pointer for each attribute */ - for (zz = 0; zz < p_rec->num_attributes; zz++) + for (zz = 0; zz < p_rec->num_attributes; zz++) { p_rec->attribute[zz].value_ptr -= sizeof(tSDP_RECORD); + } } sdp_cb.server_db.num_records--; @@ -364,8 +354,7 @@ BOOLEAN SDP_DeleteRecord (UINT32 handle) SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d\n", sdp_cb.server_db.num_records); /* if we're deleting the primary DI record, clear the */ /* value in the control block */ - if( sdp_cb.server_db.di_primary_handle == handle ) - { + if ( sdp_cb.server_db.di_primary_handle == handle ) { sdp_cb.server_db.di_primary_handle = 0; } @@ -400,104 +389,90 @@ BOOLEAN SDP_AddAttribute (UINT32 handle, UINT16 attr_id, UINT8 attr_type, tSDP_RECORD *p_rec = &sdp_cb.server_db.record[0]; #if (BT_TRACE_VERBOSE == TRUE) - if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) - { + if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) { if ((attr_type == UINT_DESC_TYPE) || - (attr_type == TWO_COMP_INT_DESC_TYPE) || - (attr_type == UUID_DESC_TYPE) || - (attr_type == DATA_ELE_SEQ_DESC_TYPE) || - (attr_type == DATA_ELE_ALT_DESC_TYPE)) - { + (attr_type == TWO_COMP_INT_DESC_TYPE) || + (attr_type == UUID_DESC_TYPE) || + (attr_type == DATA_ELE_SEQ_DESC_TYPE) || + (attr_type == DATA_ELE_ALT_DESC_TYPE)) { UINT8 num_array[400]; UINT32 i; UINT32 len = (attr_len > 200) ? 200 : attr_len; - num_array[0] ='\0'; - for (i = 0; i < len; i++) - { - sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_val[i])); + num_array[0] = '\0'; + for (i = 0; i < len; i++) { + sprintf((char *)&num_array[i * 2], "%02X", (UINT8)(p_val[i])); } SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s\n", - handle,attr_id,attr_type,attr_len,p_val,num_array); - } - else if (attr_type == BOOLEAN_DESC_TYPE) - { + handle, attr_id, attr_type, attr_len, p_val, num_array); + } else if (attr_type == BOOLEAN_DESC_TYPE) { SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d\n", - handle,attr_id,attr_type,attr_len,p_val,*p_val); - } - else - { + handle, attr_id, attr_type, attr_len, p_val, *p_val); + } else { SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s\n", - handle,attr_id,attr_type,attr_len,p_val,p_val); + handle, attr_id, attr_type, attr_len, p_val, p_val); } } #endif /* Find the record in the database */ - for (zz = 0; zz < sdp_cb.server_db.num_records; zz++, p_rec++) - { - if (p_rec->record_handle == handle) - { + for (zz = 0; zz < sdp_cb.server_db.num_records; zz++, p_rec++) { + if (p_rec->record_handle == handle) { tSDP_ATTRIBUTE *p_attr = &p_rec->attribute[0]; /* Found the record. Now, see if the attribute already exists */ - for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) - { + for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { /* The attribute exists. replace it */ - if (p_attr->id == attr_id) - { + if (p_attr->id == attr_id) { SDP_DeleteAttribute (handle, attr_id); break; } - if (p_attr->id > attr_id) + if (p_attr->id > attr_id) { break; + } } - if (p_rec->num_attributes == SDP_MAX_REC_ATTR) + if (p_rec->num_attributes == SDP_MAX_REC_ATTR) { return (FALSE); + } /* If not found, see if we can allocate a new entry */ - if (xx == p_rec->num_attributes) + if (xx == p_rec->num_attributes) { p_attr = &p_rec->attribute[p_rec->num_attributes]; - else - { + } else { /* Since the attributes are kept in sorted order, insert ours here */ - for (yy = p_rec->num_attributes; yy > xx; yy--) + for (yy = p_rec->num_attributes; yy > xx; yy--) { p_rec->attribute[yy] = p_rec->attribute[yy - 1]; + } } p_attr->id = attr_id; p_attr->type = attr_type; p_attr->len = attr_len; - if (p_rec->free_pad_ptr + attr_len >= SDP_MAX_PAD_LEN) - { + if (p_rec->free_pad_ptr + attr_len >= SDP_MAX_PAD_LEN) { /* do truncate only for text string type descriptor */ - if (attr_type == TEXT_STR_DESC_TYPE) - { + if (attr_type == TEXT_STR_DESC_TYPE) { SDP_TRACE_WARNING("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)\n", - attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr ); + attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr ); attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr; p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr] = '\0'; - p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr+1] = '\0'; - } - else + p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr + 1] = '\0'; + } else { attr_len = 0; + } } - if ((attr_len > 0) && (p_val != 0)) - { + if ((attr_len > 0) && (p_val != 0)) { p_attr->len = attr_len; memcpy (&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len); p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr]; p_rec->free_pad_ptr += attr_len; - } - else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */ - p_val == 0) - { + } else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */ + p_val == 0) { SDP_TRACE_ERROR("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d \n", - attr_id, attr_len ); + attr_id, attr_len ); p_attr->id = p_attr->type = p_attr->len = 0; return (FALSE); } @@ -534,19 +509,16 @@ BOOLEAN SDP_AddSequence (UINT32 handle, UINT16 attr_id, UINT16 num_elem, UINT8 *p_head; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) { SDP_TRACE_ERROR("SDP_AddSequence cannot get a buffer!\n"); return (FALSE); } p = p_buff; /* First, build the sequence */ - for (xx = 0; xx < num_elem; xx++) - { + for (xx = 0; xx < num_elem; xx++) { p_head = p; - switch (len[xx]) - { + switch (len[xx]) { case 1: UINT8_TO_BE_STREAM (p, (type[xx] << 3) | SIZE_ONE_BYTE); break; @@ -570,23 +542,21 @@ BOOLEAN SDP_AddSequence (UINT32 handle, UINT16 attr_id, UINT16 num_elem, ARRAY_TO_BE_STREAM (p, p_val[xx], len[xx]); - if (p - p_buff > SDP_MAX_ATTR_LEN) - { + if (p - p_buff > SDP_MAX_ATTR_LEN) { /* go back to before we add this element */ p = p_head; - if(p_head == p_buff) - { + if (p_head == p_buff) { /* the first element exceed the max length */ SDP_TRACE_ERROR ("SDP_AddSequence - too long(attribute is not added)!!\n"); GKI_freebuf(p_buff); return FALSE; - } - else + } else { SDP_TRACE_ERROR ("SDP_AddSequence - too long, add %d elements of %d\n", xx, num_elem); + } break; } } - result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; #else /* SDP_SERVER_ENABLED == FALSE */ @@ -614,30 +584,27 @@ BOOLEAN SDP_AddUuidSequence (UINT32 handle, UINT16 attr_id, UINT16 num_uuids, UINT16 xx; UINT8 *p_buff; UINT8 *p; - INT32 max_len = SDP_MAX_ATTR_LEN -3; + INT32 max_len = SDP_MAX_ATTR_LEN - 3; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) { SDP_TRACE_ERROR("SDP_AddUuidSequence cannot get a buffer!\n"); return (FALSE); } p = p_buff; /* First, build the sequence */ - for (xx = 0; xx < num_uuids ; xx++, p_uuids++) - { + for (xx = 0; xx < num_uuids ; xx++, p_uuids++) { UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p, *p_uuids); - if((p - p_buff) > max_len) - { + if ((p - p_buff) > max_len) { SDP_TRACE_WARNING ("SDP_AddUuidSequence - too long, add %d uuids of %d\n", xx, num_uuids); break; } } - result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE,(UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, attr_id, DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; #else /* SDP_SERVER_ENABLED == FALSE */ @@ -665,14 +632,13 @@ BOOLEAN SDP_AddProtocolList (UINT32 handle, UINT16 num_elem, int offset; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) { SDP_TRACE_ERROR("SDP_AddProtocolList cannot get a buffer!\n"); return (FALSE); } offset = sdp_compose_proto_list(p_buff, num_elem, p_elem_list); - result = SDP_AddAttribute (handle, ATTR_ID_PROTOCOL_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) offset, p_buff); + result = SDP_AddAttribute (handle, ATTR_ID_PROTOCOL_DESC_LIST, DATA_ELE_SEQ_DESC_TYPE, (UINT32) offset, p_buff); GKI_freebuf(p_buff); return result; #else /* SDP_SERVER_ENABLED == FALSE */ @@ -704,16 +670,14 @@ BOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem, int offset; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) { SDP_TRACE_ERROR("SDP_AddAdditionProtoLists cannot get a buffer!\n"); return (FALSE); } p = p_buff; /* for each ProtocolDescriptorList */ - for (xx = 0; xx < num_elem; xx++, p_proto_list++) - { + for (xx = 0; xx < num_elem; xx++, p_proto_list++) { UINT8_TO_BE_STREAM (p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); p_len = p++; @@ -723,8 +687,8 @@ BOOLEAN SDP_AddAdditionProtoLists (UINT32 handle, UINT16 num_elem, *p_len = (UINT8)(p - p_len - 1); } - result = SDP_AddAttribute (handle, ATTR_ID_ADDITION_PROTO_DESC_LISTS,DATA_ELE_SEQ_DESC_TYPE, - (UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, ATTR_ID_ADDITION_PROTO_DESC_LISTS, DATA_ELE_SEQ_DESC_TYPE, + (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; @@ -751,14 +715,13 @@ BOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, UINT16 profile_uuid, #if SDP_SERVER_ENABLED == TRUE UINT8 *p_buff; UINT8 *p; - BOOLEAN result; + BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL) { SDP_TRACE_ERROR("SDP_AddProfileDescriptorList cannot get a buffer!\n"); return (FALSE); } - p = p_buff+2; + p = p_buff + 2; /* First, build the profile descriptor list. This consists of a data element sequence. */ /* The sequence consists of profile's UUID and version number */ @@ -770,9 +733,9 @@ BOOLEAN SDP_AddProfileDescriptorList (UINT32 handle, UINT16 profile_uuid, /* Add in type and length fields */ *p_buff = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); - *(p_buff+1) = (UINT8) (p - (p_buff+2)); + *(p_buff + 1) = (UINT8) (p - (p_buff + 2)); - result = SDP_AddAttribute (handle, ATTR_ID_BT_PROFILE_DESC_LIST,DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, ATTR_ID_BT_PROFILE_DESC_LIST, DATA_ELE_SEQ_DESC_TYPE, (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; @@ -802,8 +765,7 @@ BOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, UINT16 lang, UINT8 *p; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL) { SDP_TRACE_ERROR("SDP_AddLanguageBaseAttrIDList cannot get a buffer!\n"); return (FALSE); } @@ -820,8 +782,8 @@ BOOLEAN SDP_AddLanguageBaseAttrIDList (UINT32 handle, UINT16 lang, UINT8_TO_BE_STREAM (p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p, base_id); - result = SDP_AddAttribute (handle, ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST,DATA_ELE_SEQ_DESC_TYPE, - (UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, + (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; #else /* SDP_SERVER_ENABLED == FALSE */ @@ -851,21 +813,19 @@ BOOLEAN SDP_AddServiceClassIdList (UINT32 handle, UINT16 num_services, UINT8 *p; BOOLEAN result; - if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) - { + if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL) { SDP_TRACE_ERROR("SDP_AddServiceClassIdList cannot get a buffer!\n"); return (FALSE); } p = p_buff; - for (xx = 0; xx < num_services; xx++, p_service_uuids++) - { + for (xx = 0; xx < num_services; xx++, p_service_uuids++) { UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p, *p_service_uuids); } - result = SDP_AddAttribute (handle, ATTR_ID_SERVICE_CLASS_ID_LIST,DATA_ELE_SEQ_DESC_TYPE, - (UINT32) (p - p_buff), p_buff); + result = SDP_AddAttribute (handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE, + (UINT32) (p - p_buff), p_buff); GKI_freebuf(p_buff); return result; #else /* SDP_SERVER_ENABLED == FALSE */ @@ -893,45 +853,39 @@ BOOLEAN SDP_DeleteAttribute (UINT32 handle, UINT16 attr_id) UINT32 len; /* Number of bytes in the entry */ /* Find the record in the database */ - for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) - { - if (p_rec->record_handle == handle) - { + for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) { + if (p_rec->record_handle == handle) { tSDP_ATTRIBUTE *p_attr = &p_rec->attribute[0]; SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x\n", attr_id, handle); /* Found it. Now, find the attribute */ - for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) - { - if (p_attr->id == attr_id) - { + for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { + if (p_attr->id == attr_id) { pad_ptr = p_attr->value_ptr; len = p_attr->len; - if (len) - { - for (yy = 0; yy < p_rec->num_attributes; yy++) - { - if( p_rec->attribute[yy].value_ptr > pad_ptr ) + if (len) { + for (yy = 0; yy < p_rec->num_attributes; yy++) { + if ( p_rec->attribute[yy].value_ptr > pad_ptr ) { p_rec->attribute[yy].value_ptr -= len; + } } } /* Found it. Shift everything up one */ p_rec->num_attributes--; - for (yy = xx; yy < p_rec->num_attributes; yy++, p_attr++) - { + for (yy = xx; yy < p_rec->num_attributes; yy++, p_attr++) { *p_attr = *(p_attr + 1); } /* adjust attribute values if needed */ - if (len) - { - xx = (p_rec->free_pad_ptr - ((pad_ptr+len) - - &p_rec->attr_pad[0])); - for( yy=0; yyfree_pad_ptr - ((pad_ptr + len) - + &p_rec->attr_pad[0])); + for ( yy = 0; yy < xx; yy++, pad_ptr++) { + *pad_ptr = *(pad_ptr + len); + } p_rec->free_pad_ptr -= len; } return (TRUE); @@ -972,16 +926,15 @@ INT32 SDP_ReadRecord(UINT32 handle, UINT8 *p_data, INT32 *p_data_len) /* Find the record in the database */ p_rec = sdp_db_find_record(handle); - if(p_rec && p_data && p_data_len) - { + if (p_rec && p_data && p_data_len) { p_rsp = &p_data[3]; - while ( (p_attr = sdp_db_find_attr_in_rec (p_rec, start, end)) != NULL) - { + while ( (p_attr = sdp_db_find_attr_in_rec (p_rec, start, end)) != NULL) { /* Check if attribute fits. Assume 3-byte value type/length */ rem_len = *p_data_len - (UINT16) (p_rsp - p_data); - if (p_attr->len > (UINT32)(rem_len - 6)) + if (p_attr->len > (UINT32)(rem_len - 6)) { break; + } p_rsp = sdpu_build_attrib_entry (p_rsp, p_attr); @@ -991,15 +944,12 @@ INT32 SDP_ReadRecord(UINT32 handle, UINT8 *p_data, INT32 *p_data_len) len = (INT32) (p_rsp - p_data); /* Put in the sequence header (2 or 3 bytes) */ - if (len > 255) - { + if (len > 255) { offset = 0; p_data[0] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); p_data[1] = (UINT8) ((len - 3) >> 8); p_data[2] = (UINT8) (len - 3); - } - else - { + } else { offset = 1; p_data[1] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); diff --git a/components/bt/bluedroid/stack/sdp/sdp_discovery.c b/components/bt/bluedroid/stack/sdp/sdp_discovery.c old mode 100755 new mode 100644 index 8e17a28b1..dcbd357e4 --- a/components/bt/bluedroid/stack/sdp/sdp_discovery.c +++ b/components/bt/bluedroid/stack/sdp/sdp_discovery.c @@ -81,20 +81,14 @@ static UINT8 *sdpu_build_uuid_seq (UINT8 *p_out, UINT16 num_uuids, tSDP_UUID *p_ p_out += 1; /* Now, loop through and put in all the UUID(s) */ - for (xx = 0; xx < num_uuids; xx++, p_uuid_list++) - { - if (p_uuid_list->len == 2) - { + for (xx = 0; xx < num_uuids; xx++, p_uuid_list++) { + if (p_uuid_list->len == 2) { UINT8_TO_BE_STREAM (p_out, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid16); - } - else if (p_uuid_list->len == 4) - { + } else if (p_uuid_list->len == 4) { UINT8_TO_BE_STREAM (p_out, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES); UINT32_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid32); - } - else - { + } else { UINT8_TO_BE_STREAM (p_out, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES); ARRAY_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid128, p_uuid_list->len); } @@ -116,15 +110,14 @@ static UINT8 *sdpu_build_uuid_seq (UINT8 *p_out, UINT16 num_uuids, tSDP_UUID *p_ ** Returns void ** *******************************************************************************/ -static void sdp_snd_service_search_req(tCONN_CB *p_ccb, UINT8 cont_len, UINT8 * p_cont) +static void sdp_snd_service_search_req(tCONN_CB *p_ccb, UINT8 cont_len, UINT8 *p_cont) { UINT8 *p, *p_start, *p_param_len; BT_HDR *p_cmd; UINT16 param_len; /* Get a buffer to send the packet to L2CAP */ - if ((p_cmd = (BT_HDR *) GKI_getpoolbuf (SDP_POOL_ID)) == NULL) - { + if ((p_cmd = (BT_HDR *) GKI_getpoolbuf (SDP_POOL_ID)) == NULL) { sdp_disconnect (p_ccb, SDP_NO_RESOURCES); return; } @@ -155,8 +148,7 @@ static void sdp_snd_service_search_req(tCONN_CB *p_ccb, UINT8 cont_len, UINT8 * UINT8_TO_BE_STREAM (p, cont_len); /* if this is not the first request */ - if(cont_len && p_cont) - { + if (cont_len && p_cont) { memcpy(p, p_cont, cont_len); p += cont_len; } @@ -171,7 +163,7 @@ static void sdp_snd_service_search_req(tCONN_CB *p_ccb, UINT8 cont_len, UINT8 * p_cmd->len = (UINT16)(p - p_start); #if (SDP_DEBUG_RAW == TRUE) - SDP_TRACE_WARNING("sdp_snd_service_search_req cont_len :%d disc_state:%d\n",cont_len, p_ccb->disc_state); + SDP_TRACE_WARNING("sdp_snd_service_search_req cont_len :%d disc_state:%d\n", cont_len, p_ccb->disc_state); #endif @@ -194,14 +186,11 @@ static void sdp_snd_service_search_req(tCONN_CB *p_ccb, UINT8 cont_len, UINT8 * *******************************************************************************/ void sdp_disc_connected (tCONN_CB *p_ccb) { - if (p_ccb->is_attr_search) - { + if (p_ccb->is_attr_search) { p_ccb->disc_state = SDP_DISC_WAIT_SEARCH_ATTR; process_service_search_attr_rsp (p_ccb, NULL); - } - else - { + } else { /* First step is to get a list of the handles from the server. */ /* We are not searching for a specific attribute, so we will */ /* first search for the service, then get all attributes of it */ @@ -241,35 +230,30 @@ void sdp_disc_server_rsp (tCONN_CB *p_ccb, BT_HDR *p_msg) p_msg->len--; - switch (rsp_pdu) - { + switch (rsp_pdu) { case SDP_PDU_SERVICE_SEARCH_RSP: - if (p_ccb->disc_state == SDP_DISC_WAIT_HANDLES) - { + if (p_ccb->disc_state == SDP_DISC_WAIT_HANDLES) { process_service_search_rsp (p_ccb, p); invalid_pdu = FALSE; } break; case SDP_PDU_SERVICE_ATTR_RSP: - if (p_ccb->disc_state == SDP_DISC_WAIT_ATTR) - { + if (p_ccb->disc_state == SDP_DISC_WAIT_ATTR) { process_service_attr_rsp (p_ccb, p); invalid_pdu = FALSE; } break; case SDP_PDU_SERVICE_SEARCH_ATTR_RSP: - if (p_ccb->disc_state == SDP_DISC_WAIT_SEARCH_ATTR) - { + if (p_ccb->disc_state == SDP_DISC_WAIT_SEARCH_ATTR) { process_service_search_attr_rsp (p_ccb, p); invalid_pdu = FALSE; } break; } - if (invalid_pdu) - { + if (invalid_pdu) { SDP_TRACE_WARNING ("SDP - Unexp. PDU: %d in state: %d\n", rsp_pdu, p_ccb->disc_state); sdp_disconnect (p_ccb, SDP_GENERIC_ERROR); } @@ -298,35 +282,33 @@ static void process_service_search_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) orig = p_ccb->num_handles; p_ccb->num_handles += cur_handles; - if (p_ccb->num_handles == 0) - { + if (p_ccb->num_handles == 0) { SDP_TRACE_WARNING ("SDP - Rcvd ServiceSearchRsp, no matches\n"); sdp_disconnect (p_ccb, SDP_NO_RECS_MATCH); return; } /* Save the handles that match. We will can only process a certain number. */ - if (total > sdp_cb.max_recs_per_search) + if (total > sdp_cb.max_recs_per_search) { total = sdp_cb.max_recs_per_search; - if (p_ccb->num_handles > sdp_cb.max_recs_per_search) + } + if (p_ccb->num_handles > sdp_cb.max_recs_per_search) { p_ccb->num_handles = sdp_cb.max_recs_per_search; + } - for (xx = orig; xx < p_ccb->num_handles; xx++) + for (xx = orig; xx < p_ccb->num_handles; xx++) { BE_STREAM_TO_UINT32 (p_ccb->handles[xx], p_reply); + } BE_STREAM_TO_UINT8 (cont_len, p_reply); - if(cont_len != 0) - { - if(cont_len > SDP_MAX_CONTINUATION_LEN) - { + if (cont_len != 0) { + if (cont_len > SDP_MAX_CONTINUATION_LEN) { sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE); return; } /* stay in the same state */ sdp_snd_service_search_req(p_ccb, cont_len, p_reply); - } - else - { + } else { /* change state */ p_ccb->disc_state = SDP_DISC_WAIT_ATTR; @@ -357,31 +339,27 @@ static void sdp_copy_raw_data (tCONN_CB *p_ccb, BOOLEAN offset) UINT8 num_array[SDP_MAX_LIST_BYTE_COUNT]; UINT32 i; - for (i = 0; i < p_ccb->list_len; i++) - { - sprintf((char *)&num_array[i*2],"%02X\n",(UINT8)(p_ccb->rsp_list[i])); + for (i = 0; i < p_ccb->list_len; i++) { + sprintf((char *)&num_array[i * 2], "%02X\n", (UINT8)(p_ccb->rsp_list[i])); } - SDP_TRACE_WARNING("result :%s\n",num_array); + SDP_TRACE_WARNING("result :%s\n", num_array); #endif - if(p_ccb->p_db->raw_data) - { + if (p_ccb->p_db->raw_data) { cpy_len = p_ccb->p_db->raw_size - p_ccb->p_db->raw_used; list_len = p_ccb->list_len; p = &p_ccb->rsp_list[0]; - if(offset) - { + if (offset) { type = *p++; p = sdpu_get_len_from_type (p, type, &list_len); } - if(list_len && list_len < cpy_len ) - { + if (list_len && list_len < cpy_len ) { cpy_len = list_len; } #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("list_len :%d cpy_len:%d raw_size:%d raw_used:%d\n", - list_len, cpy_len, p_ccb->p_db->raw_size, p_ccb->p_db->raw_used); + list_len, cpy_len, p_ccb->p_db->raw_size, p_ccb->p_db->raw_used); #endif memcpy (&p_ccb->p_db->raw_data[p_ccb->p_db->raw_used], p, cpy_len); p_ccb->p_db->raw_used += cpy_len; @@ -407,14 +385,13 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("process_service_attr_rsp raw inc:%d\n", - SDP_RAW_DATA_INCLUDED); + SDP_RAW_DATA_INCLUDED); #endif /* If p_reply is NULL, we were called after the records handles were read */ - if (p_reply) - { + if (p_reply) { #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x\n", - p_reply[0], p_reply[1], p_reply[2], p_reply[3]); + p_reply[0], p_reply[1], p_reply[2], p_reply[3]); #endif /* Skip transaction ID and length */ p_reply += 4; @@ -425,21 +402,18 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) #endif /* Copy the response to the scratchpad. First, a safety check on the length */ - if ((p_ccb->list_len + list_byte_count) > SDP_MAX_LIST_BYTE_COUNT) - { + if ((p_ccb->list_len + list_byte_count) > SDP_MAX_LIST_BYTE_COUNT) { sdp_disconnect (p_ccb, SDP_INVALID_PDU_SIZE); return; } #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d\n", - p_ccb->list_len, list_byte_count); + p_ccb->list_len, list_byte_count); #endif - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR ("SDP - no gki buf to save rsp\n"); sdp_disconnect (p_ccb, SDP_NO_RESOURCES); return; @@ -454,17 +428,13 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) /* Check if we need to request a continuation */ SDP_TRACE_WARNING("*p_reply:%d(%d)\n", *p_reply, SDP_MAX_CONTINUATION_LEN); #endif - if (*p_reply) - { - if (*p_reply > SDP_MAX_CONTINUATION_LEN) - { + if (*p_reply) { + if (*p_reply > SDP_MAX_CONTINUATION_LEN) { sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE); return; } cont_request_needed = TRUE; - } - else - { + } else { #if (SDP_RAW_DATA_INCLUDED == TRUE) SDP_TRACE_WARNING("process_service_attr_rsp\n"); @@ -472,8 +442,7 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) #endif /* Save the response in the database. Stop on any error */ - if (!save_attr_seq (p_ccb, &p_ccb->rsp_list[0], &p_ccb->rsp_list[p_ccb->list_len])) - { + if (!save_attr_seq (p_ccb, &p_ccb->rsp_list[0], &p_ccb->rsp_list[p_ccb->list_len])) { sdp_disconnect (p_ccb, SDP_DB_FULL); return; } @@ -483,13 +452,11 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) } /* Now, ask for the next handle. Re-use the buffer we just got. */ - if (p_ccb->cur_handle < p_ccb->num_handles) - { + if (p_ccb->cur_handle < p_ccb->num_handles) { BT_HDR *p_msg = (BT_HDR *) GKI_getpoolbuf (SDP_POOL_ID); UINT8 *p; - if (!p_msg) - { + if (!p_msg) { sdp_disconnect (p_ccb, SDP_NO_RESOURCES); return; } @@ -512,19 +479,19 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) UINT16_TO_BE_STREAM (p, sdp_cb.max_attr_list_size); /* If no attribute filters, build a wildcard attribute sequence */ - if (p_ccb->p_db->num_attr_filters) + if (p_ccb->p_db->num_attr_filters) { p = sdpu_build_attrib_seq (p, p_ccb->p_db->attr_filters, p_ccb->p_db->num_attr_filters); - else + } else { p = sdpu_build_attrib_seq (p, NULL, 0); + } /* Was this a continuation request ? */ - if (cont_request_needed) - { + if (cont_request_needed) { memcpy (p, p_reply, *p_reply + 1); p += *p_reply + 1; - } - else + } else { UINT8_TO_BE_STREAM (p, 0); + } /* Go back and put the parameter length into the buffer */ param_len = (UINT16)(p - p_param_len - 2); @@ -538,9 +505,7 @@ static void process_service_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) /* Start inactivity timer */ btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_SDP, SDP_INACT_TIMEOUT); - } - else - { + } else { sdp_disconnect (p_ccb, SDP_SUCCESS); return; } @@ -569,11 +534,10 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) SDP_TRACE_WARNING("process_service_search_attr_rsp\n"); #endif /* If p_reply is NULL, we were called for the initial read */ - if (p_reply) - { + if (p_reply) { #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x\n", - p_reply[0], p_reply[1], p_reply[2], p_reply[3]); + p_reply[0], p_reply[1], p_reply[2], p_reply[3]); #endif /* Skip transaction ID and length */ p_reply += 4; @@ -584,21 +548,18 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) #endif /* Copy the response to the scratchpad. First, a safety check on the length */ - if ((p_ccb->list_len + lists_byte_count) > SDP_MAX_LIST_BYTE_COUNT) - { + if ((p_ccb->list_len + lists_byte_count) > SDP_MAX_LIST_BYTE_COUNT) { sdp_disconnect (p_ccb, SDP_INVALID_PDU_SIZE); return; } #if (SDP_DEBUG_RAW == TRUE) SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d\n", - p_ccb->list_len, lists_byte_count); + p_ccb->list_len, lists_byte_count); #endif - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR ("SDP - no gki buf to save rsp\n"); sdp_disconnect (p_ccb, SDP_NO_RESOURCES); return; @@ -613,10 +574,8 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) /* Check if we need to request a continuation */ SDP_TRACE_WARNING("*p_reply:%d(%d)\n", *p_reply, SDP_MAX_CONTINUATION_LEN); #endif - if (*p_reply) - { - if (*p_reply > SDP_MAX_CONTINUATION_LEN) - { + if (*p_reply) { + if (*p_reply > SDP_MAX_CONTINUATION_LEN) { sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE); return; } @@ -629,13 +588,11 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) SDP_TRACE_WARNING("cont_request_needed:%d\n", cont_request_needed); #endif /* If continuation request (or first time request) */ - if ((cont_request_needed) || (!p_reply)) - { + if ((cont_request_needed) || (!p_reply)) { BT_HDR *p_msg = (BT_HDR *) GKI_getpoolbuf (SDP_POOL_ID); UINT8 *p; - if (!p_msg) - { + if (!p_msg) { sdp_disconnect (p_ccb, SDP_NO_RESOURCES); return; } @@ -663,19 +620,19 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) UINT16_TO_BE_STREAM (p, sdp_cb.max_attr_list_size); /* If no attribute filters, build a wildcard attribute sequence */ - if (p_ccb->p_db->num_attr_filters) + if (p_ccb->p_db->num_attr_filters) { p = sdpu_build_attrib_seq (p, p_ccb->p_db->attr_filters, p_ccb->p_db->num_attr_filters); - else + } else { p = sdpu_build_attrib_seq (p, NULL, 0); + } /* No continuation for first request */ - if (p_reply) - { + if (p_reply) { memcpy (p, p_reply, *p_reply + 1); p += *p_reply + 1; - } - else + } else { UINT8_TO_BE_STREAM (p, 0); + } /* Go back and put the parameter length into the buffer */ param_len = p - p_param_len - 2; @@ -708,8 +665,7 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) /* The contents is a sequence of attribute sequences */ type = *p++; - if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE) - { + if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE) { SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp\n", type); return; } @@ -717,17 +673,14 @@ static void process_service_search_attr_rsp (tCONN_CB *p_ccb, UINT8 *p_reply) p_end = &p_ccb->rsp_list[p_ccb->list_len]; - if ((p + seq_len) != p_end) - { + if ((p + seq_len) != p_end) { sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE); return; } - while (p < p_end) - { + while (p < p_end) { p = save_attr_seq (p_ccb, p, &p_ccb->rsp_list[p_ccb->list_len]); - if (!p) - { + if (!p) { sdp_disconnect (p_ccb, SDP_DB_FULL); return; } @@ -756,36 +709,31 @@ static UINT8 *save_attr_seq (tCONN_CB *p_ccb, UINT8 *p, UINT8 *p_msg_end) type = *p++; - if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE) - { + if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE) { SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp\n", type); return (NULL); } p = sdpu_get_len_from_type (p, type, &seq_len); - if ((p + seq_len) > p_msg_end) - { + if ((p + seq_len) > p_msg_end) { SDP_TRACE_WARNING ("SDP - Bad len in attr_rsp %d\n", seq_len); return (NULL); } /* Create a record */ p_rec = add_record (p_ccb->p_db, p_ccb->device_address); - if (!p_rec) - { + if (!p_rec) { SDP_TRACE_WARNING ("SDP - DB full add_record\n"); return (NULL); } p_seq_end = p + seq_len; - while (p < p_seq_end) - { + while (p < p_seq_end) { /* First get the attribute ID */ type = *p++; p = sdpu_get_len_from_type (p, type, &attr_len); - if (((type >> 3) != UINT_DESC_TYPE) || (attr_len != 2)) - { + if (((type >> 3) != UINT_DESC_TYPE) || (attr_len != 2)) { SDP_TRACE_WARNING ("SDP - Bad type: 0x%02x or len: %d in attr_rsp\n", type, attr_len); return (NULL); } @@ -794,8 +742,7 @@ static UINT8 *save_attr_seq (tCONN_CB *p_ccb, UINT8 *p, UINT8 *p_msg_end) /* Now, add the attribute value */ p = add_attr (p, p_ccb->p_db, p_rec, attr_id, NULL, 0); - if (!p) - { + if (!p) { SDP_TRACE_WARNING ("SDP - DB full add_attr\n"); return (NULL); } @@ -819,8 +766,9 @@ tSDP_DISC_REC *add_record (tSDP_DISCOVERY_DB *p_db, BD_ADDR p_bda) tSDP_DISC_REC *p_rec; /* See if there is enough space in the database */ - if (p_db->mem_free < sizeof (tSDP_DISC_REC)) + if (p_db->mem_free < sizeof (tSDP_DISC_REC)) { return (NULL); + } p_rec = (tSDP_DISC_REC *) p_db->p_free_mem; p_db->p_free_mem += sizeof (tSDP_DISC_REC); @@ -832,14 +780,14 @@ tSDP_DISC_REC *add_record (tSDP_DISCOVERY_DB *p_db, BD_ADDR p_bda) memcpy (p_rec->remote_bd_addr, p_bda, BD_ADDR_LEN); /* Add the record to the end of chain */ - if (!p_db->p_first_rec) + if (!p_db->p_first_rec) { p_db->p_first_rec = p_rec; - else - { + } else { tSDP_DISC_REC *p_rec1 = p_db->p_first_rec; - while (p_rec1->p_next_rec) + while (p_rec1->p_next_rec) { p_rec1 = p_rec1->p_next_rec; + } p_rec1->p_next_rec = p_rec; } @@ -879,17 +827,19 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, attr_type = (type >> 3) & 0x0f; /* See if there is enough space in the database */ - if (attr_len > 4) + if (attr_len > 4) { total_len = attr_len - 4 + (UINT16)sizeof (tSDP_DISC_ATTR); - else + } else { total_len = sizeof (tSDP_DISC_ATTR); + } /* Ensure it is a multiple of 4 */ total_len = (total_len + 3) & ~3; /* See if there is enough space in the database */ - if (p_db->mem_free < total_len) + if (p_db->mem_free < total_len) { return (NULL); + } p_attr = (tSDP_DISC_ATTR *) p_db->p_free_mem; p_attr->attr_id = attr_id; @@ -897,16 +847,13 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, p_attr->p_next_attr = NULL; /* Store the attribute value */ - switch (attr_type) - { + switch (attr_type) { case UINT_DESC_TYPE: - if( (is_additional_list != 0) && (attr_len == 2) ) - { + if ( (is_additional_list != 0) && (attr_len == 2) ) { BE_STREAM_TO_UINT16 (id, p); - if(id != ATTR_ID_PROTOCOL_DESC_LIST) + if (id != ATTR_ID_PROTOCOL_DESC_LIST) { p -= 2; - else - { + } else { /* Reserve the memory for the attribute now, as we need to add sub-attributes */ p_db->p_free_mem += sizeof (tSDP_DISC_ATTR); p_db->mem_free -= sizeof (tSDP_DISC_ATTR); @@ -914,8 +861,7 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, total_len = 0; /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d(list)", nest_level); */ - if (nest_level >= MAX_NEST_LEVELS) - { + if (nest_level >= MAX_NEST_LEVELS) { SDP_TRACE_ERROR ("SDP - attr nesting too deep\n"); return (p_end); } @@ -926,11 +872,10 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, break; } } - /* Case falls through */ + /* Case falls through */ case TWO_COMP_INT_DESC_TYPE: - switch (attr_len) - { + switch (attr_len) { case 1: p_attr->attr_value.v.u8 = *p++; break; @@ -947,15 +892,13 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, break; case UUID_DESC_TYPE: - switch (attr_len) - { + switch (attr_len) { case 2: BE_STREAM_TO_UINT16 (p_attr->attr_value.v.u16, p); break; case 4: BE_STREAM_TO_UINT32 (p_attr->attr_value.v.u32, p); - if (p_attr->attr_value.v.u32 < 0x10000) - { + if (p_attr->attr_value.v.u32 < 0x10000) { attr_len = 2; p_attr->attr_len_type = (UINT16)attr_len | (attr_type << 12); p_attr->attr_value.v.u16 = (UINT16) p_attr->attr_value.v.u32; @@ -964,30 +907,24 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, break; case 16: /* See if we can compress his UUID down to 16 or 32bit UUIDs */ - if (sdpu_is_base_uuid (p)) - { - if ((p[0] == 0) && (p[1] == 0)) - { + if (sdpu_is_base_uuid (p)) { + if ((p[0] == 0) && (p[1] == 0)) { p_attr->attr_len_type = (p_attr->attr_len_type & ~SDP_DISC_ATTR_LEN_MASK) | 2; p += 2; BE_STREAM_TO_UINT16 (p_attr->attr_value.v.u16, p); p += MAX_UUID_SIZE - 4; - } - else - { + } else { p_attr->attr_len_type = (p_attr->attr_len_type & ~SDP_DISC_ATTR_LEN_MASK) | 4; BE_STREAM_TO_UINT32 (p_attr->attr_value.v.u32, p); p += MAX_UUID_SIZE - 4; } - } - else - { - /* coverity[overrun-local] */ - /* - Event overrun-local: Overrun of static array "p_attr->attr_value.v.array" of size 4 at position 15 with index variable "ijk" - False-positive: SDP uses scratch buffer to hold the attribute value. - The actual size of tSDP_DISC_ATVAL does not matter. - If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily + } else { + /* coverity[overrun-local] */ + /* + Event overrun-local: Overrun of static array "p_attr->attr_value.v.array" of size 4 at position 15 with index variable "ijk" + False-positive: SDP uses scratch buffer to hold the attribute value. + The actual size of tSDP_DISC_ATVAL does not matter. + If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily */ BE_STREAM_TO_ARRAY (p, p_attr->attr_value.v.array, (INT32)attr_len); } @@ -1007,22 +944,22 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, total_len = 0; /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d", nest_level); */ - if (nest_level >= MAX_NEST_LEVELS) - { + if (nest_level >= MAX_NEST_LEVELS) { SDP_TRACE_ERROR ("SDP - attr nesting too deep\n"); return (p_end); } - if(is_additional_list != 0 || attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS) + if (is_additional_list != 0 || attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS) { nest_level |= SDP_ADDITIONAL_LIST_MASK; + } /* SDP_TRACE_DEBUG ("SDP - attr nest level:0x%x(finish)", nest_level); */ - while (p < p_end) - { + while (p < p_end) { /* Now, add the list entry */ p = add_attr (p, p_db, p_rec, 0, p_attr, (UINT8)(nest_level + 1)); - if (!p) + if (!p) { return (NULL); + } } break; @@ -1032,8 +969,7 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, break; case BOOLEAN_DESC_TYPE: - switch (attr_len) - { + switch (attr_len) { case 1: p_attr->attr_value.v.u8 = *p++; break; @@ -1051,36 +987,31 @@ static UINT8 *add_attr (UINT8 *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec, p_db->mem_free -= total_len; /* Add the attribute to the end of the chain */ - if (!p_parent_attr) - { - if (!p_rec->p_first_attr) + if (!p_parent_attr) { + if (!p_rec->p_first_attr) { p_rec->p_first_attr = p_attr; - else - { + } else { tSDP_DISC_ATTR *p_attr1 = p_rec->p_first_attr; - while (p_attr1->p_next_attr) + while (p_attr1->p_next_attr) { p_attr1 = p_attr1->p_next_attr; + } p_attr1->p_next_attr = p_attr; } - } - else - { - if (!p_parent_attr->attr_value.v.p_sub_attr) - { + } else { + if (!p_parent_attr->attr_value.v.p_sub_attr) { p_parent_attr->attr_value.v.p_sub_attr = p_attr; /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch:0x%x(id:%d)", p_parent_attr, p_parent_attr->attr_id, p_attr, p_attr->attr_id); */ - } - else - { + } else { tSDP_DISC_ATTR *p_attr1 = p_parent_attr->attr_value.v.p_sub_attr; /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch1:0x%x(id:%d)", p_parent_attr, p_parent_attr->attr_id, p_attr1, p_attr1->attr_id); */ - while (p_attr1->p_next_attr) + while (p_attr1->p_next_attr) { p_attr1 = p_attr1->p_next_attr; + } p_attr1->p_next_attr = p_attr; /* SDP_TRACE_DEBUG ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */ diff --git a/components/bt/bluedroid/stack/sdp/sdp_main.c b/components/bt/bluedroid/stack/sdp/sdp_main.c old mode 100755 new mode 100644 index b500f106c..3511aee98 --- a/components/bt/bluedroid/stack/sdp/sdp_main.c +++ b/components/bt/bluedroid/stack/sdp/sdp_main.c @@ -95,8 +95,7 @@ void sdp_init (void) #if SDP_SERVER_ENABLED == TRUE /* Register with Security Manager for the specific security level */ if (!BTM_SetSecurityLevel (FALSE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER, - SDP_SECURITY_LEVEL, SDP_PSM, 0, 0)) - { + SDP_SECURITY_LEVEL, SDP_PSM, 0, 0)) { SDP_TRACE_ERROR ("Security Registration Server failed\n"); return; } @@ -105,8 +104,7 @@ void sdp_init (void) #if SDP_CLIENT_ENABLED == TRUE /* Register with Security Manager for the specific security level */ if (!BTM_SetSecurityLevel (TRUE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER, - SDP_SECURITY_LEVEL, SDP_PSM, 0, 0)) - { + SDP_SECURITY_LEVEL, SDP_PSM, 0, 0)) { SDP_TRACE_ERROR ("Security Registration for Client failed\n"); return; } @@ -131,8 +129,7 @@ void sdp_init (void) sdp_cb.reg_info.pL2CA_TxComplete_Cb = NULL; /* Now, register with L2CAP */ - if (!L2CA_Register (SDP_PSM, &sdp_cb.reg_info)) - { + if (!L2CA_Register (SDP_PSM, &sdp_cb.reg_info)) { SDP_TRACE_ERROR ("SDP Registration failed\n"); } } @@ -149,8 +146,9 @@ void sdp_init (void) *******************************************************************************/ UINT16 sdp_set_max_attr_list_size (UINT16 max_size) { - if (max_size > (sdp_cb.l2cap_my_cfg.mtu - 16) ) + if (max_size > (sdp_cb.l2cap_my_cfg.mtu - 16) ) { max_size = sdp_cb.l2cap_my_cfg.mtu - 16; + } sdp_cb.max_attr_list_size = max_size; @@ -176,8 +174,9 @@ static void sdp_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UIN tCONN_CB *p_ccb; /* Allocate a new CCB. Return if none available. */ - if ((p_ccb = sdpu_allocate_ccb()) == NULL) + if ((p_ccb = sdpu_allocate_ccb()) == NULL) { return; + } /* Transition to the next appropriate state, waiting for config setup. */ p_ccb->con_state = SDP_STATE_CFG_SETUP; @@ -191,16 +190,14 @@ static void sdp_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UIN { tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg; - if (cfg.fcr_present) - { + if (cfg.fcr_present) { SDP_TRACE_DEBUG("sdp_connect_ind: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u\n", - cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, - cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps); + cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, + cfg.fcr.rtrans_tout, cfg.fcr.mon_tout, cfg.fcr.mps); } if ((!L2CA_ConfigReq (l2cap_cid, &cfg)) && cfg.fcr_present - && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { + && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { /* FCR not desired; try again in basic mode */ cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; cfg.fcr_present = FALSE; @@ -233,30 +230,26 @@ static void sdp_connect_cfm (UINT16 l2cap_cid, UINT16 result) tL2CAP_CFG_INFO cfg; /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) { SDP_TRACE_WARNING ("SDP - Rcvd conn cnf for unknown CID 0x%x\n", l2cap_cid); return; } /* If the connection response contains success status, then */ /* Transition to the next state and startup the timer. */ - if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == SDP_STATE_CONN_SETUP)) - { + if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == SDP_STATE_CONN_SETUP)) { p_ccb->con_state = SDP_STATE_CFG_SETUP; cfg = sdp_cb.l2cap_my_cfg; - if (cfg.fcr_present) - { + if (cfg.fcr_present) { SDP_TRACE_DEBUG("sdp_connect_cfm: mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u\n", - cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, - cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps); + cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, + cfg.fcr.rtrans_tout, cfg.fcr.mon_tout, cfg.fcr.mps); } if ((!L2CA_ConfigReq (l2cap_cid, &cfg)) && cfg.fcr_present - && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) - { + && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { /* FCR not desired; try again in basic mode */ cfg.fcr_present = FALSE; cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; @@ -264,29 +257,28 @@ static void sdp_connect_cfm (UINT16 l2cap_cid, UINT16 result) } SDP_TRACE_EVENT ("SDP - got conn cnf, sent cfg req, CID: 0x%x\n", p_ccb->connection_id); - } - else - { + } else { SDP_TRACE_WARNING ("SDP - Rcvd conn cnf with error: 0x%x CID 0x%x\n", result, p_ccb->connection_id); /* Tell the user if he has a callback */ - if (p_ccb->p_cb || p_ccb->p_cb2) - { + if (p_ccb->p_cb || p_ccb->p_cb2) { UINT16 err = -1; if ((result == HCI_ERR_HOST_REJECT_SECURITY) - || (result == HCI_ERR_AUTH_FAILURE) - || (result == HCI_ERR_PAIRING_NOT_ALLOWED) - || (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) - || (result == HCI_ERR_KEY_MISSING)) + || (result == HCI_ERR_AUTH_FAILURE) + || (result == HCI_ERR_PAIRING_NOT_ALLOWED) + || (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) + || (result == HCI_ERR_KEY_MISSING)) { err = SDP_SECURITY_ERR; - else if (result == HCI_ERR_HOST_REJECT_DEVICE) + } else if (result == HCI_ERR_HOST_REJECT_DEVICE) { err = SDP_CONN_REJECTED; - else + } else { err = SDP_CONN_FAILED; - if(p_ccb->p_cb) + } + if (p_ccb->p_cb) { (*p_ccb->p_cb)(err); - else if(p_ccb->p_cb2) + } else if (p_ccb->p_cb2) { (*p_ccb->p_cb2)(err, p_ccb->user_data); + } } sdpu_release_ccb (p_ccb); @@ -310,24 +302,21 @@ static void sdp_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) tCONN_CB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) { SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x\n", l2cap_cid); return; } /* Remember the remote MTU size */ - if (!p_cfg->mtu_present) - { + if (!p_cfg->mtu_present) { /* use min(L2CAP_DEFAULT_MTU,SDP_MTU_SIZE) for GKI buffer size reasons */ - p_ccb->rem_mtu_size = (L2CAP_DEFAULT_MTU > SDP_MTU_SIZE)?SDP_MTU_SIZE:L2CAP_DEFAULT_MTU; - } - else - { - if (p_cfg->mtu > SDP_MTU_SIZE) + p_ccb->rem_mtu_size = (L2CAP_DEFAULT_MTU > SDP_MTU_SIZE) ? SDP_MTU_SIZE : L2CAP_DEFAULT_MTU; + } else { + if (p_cfg->mtu > SDP_MTU_SIZE) { p_ccb->rem_mtu_size = SDP_MTU_SIZE; - else + } else { p_ccb->rem_mtu_size = p_cfg->mtu; + } } /* For now, always accept configuration from the other side */ @@ -336,37 +325,32 @@ static void sdp_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) p_cfg->result = L2CAP_CFG_OK; /* Check peer config request against our rfcomm configuration */ - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { /* Reject the window size if it is bigger than we want it to be */ - if (p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE) - { + if (p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE) { if (sdp_cb.l2cap_my_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE - && p_cfg->fcr.tx_win_sz > sdp_cb.l2cap_my_cfg.fcr.tx_win_sz) - { + && p_cfg->fcr.tx_win_sz > sdp_cb.l2cap_my_cfg.fcr.tx_win_sz) { p_cfg->fcr.tx_win_sz = sdp_cb.l2cap_my_cfg.fcr.tx_win_sz; p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS; SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW\n"); } /* Reject if locally we want basic and they don't */ - if (sdp_cb.l2cap_my_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) - { + if (sdp_cb.l2cap_my_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) { /* Ask for a new setup */ p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE; p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS; SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with BASIC mode\n"); } /* Remain in configure state and give the peer our desired configuration */ - if (p_cfg->result != L2CAP_CFG_OK) - { + if (p_cfg->result != L2CAP_CFG_OK) { SDP_TRACE_WARNING ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x\n", l2cap_cid); L2CA_ConfigRsp (l2cap_cid, p_cfg); return; } - } - else /* We agree with peer's request */ + } else { /* We agree with peer's request */ p_cfg->fcr_present = FALSE; + } } L2CA_ConfigRsp (l2cap_cid, p_cfg); @@ -375,15 +359,16 @@ static void sdp_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) p_ccb->con_flags |= SDP_FLAGS_HIS_CFG_DONE; - if (p_ccb->con_flags & SDP_FLAGS_MY_CFG_DONE) - { + if (p_ccb->con_flags & SDP_FLAGS_MY_CFG_DONE) { p_ccb->con_state = SDP_STATE_CONNECTED; - if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) + if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { sdp_disc_connected (p_ccb); - else + } else /* Start inactivity timer */ + { btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_SDP, SDP_INACT_TIMEOUT); + } } } @@ -406,33 +391,29 @@ static void sdp_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) SDP_TRACE_EVENT ("SDP - Rcvd cfg cfm, CID: 0x%x Result: %d\n", l2cap_cid, p_cfg->result); /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) { SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x\n", l2cap_cid); return; } /* For now, always accept configuration from the other side */ - if (p_cfg->result == L2CAP_CFG_OK) - { + if (p_cfg->result == L2CAP_CFG_OK) { p_ccb->con_flags |= SDP_FLAGS_MY_CFG_DONE; - if (p_ccb->con_flags & SDP_FLAGS_HIS_CFG_DONE) - { + if (p_ccb->con_flags & SDP_FLAGS_HIS_CFG_DONE) { p_ccb->con_state = SDP_STATE_CONNECTED; - if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) + if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { sdp_disc_connected (p_ccb); - else + } else /* Start inactivity timer */ + { btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_SDP, SDP_INACT_TIMEOUT); + } } - } - else - { + } else { /* If peer has rejected FCR and suggested basic then try basic */ - if (p_cfg->fcr_present) - { + if (p_cfg->fcr_present) { tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg; cfg.fcr_present = FALSE; L2CA_ConfigReq (l2cap_cid, &cfg); @@ -462,24 +443,24 @@ static void sdp_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) tCONN_CB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) { SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x\n", l2cap_cid); return; } - if (ack_needed) + if (ack_needed) { L2CA_DisconnectRsp (l2cap_cid); + } SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc, CID: 0x%x\n", l2cap_cid); #if SDP_CLIENT_ENABLED == TRUE /* Tell the user if he has a callback */ if (p_ccb->p_cb) (*p_ccb->p_cb) ((UINT16) ((p_ccb->con_state == SDP_STATE_CONNECTED) ? - SDP_SUCCESS : SDP_CONN_FAILED)); + SDP_SUCCESS : SDP_CONN_FAILED)); else if (p_ccb->p_cb2) (*p_ccb->p_cb2) ((UINT16) ((p_ccb->con_state == SDP_STATE_CONNECTED) ? - SDP_SUCCESS : SDP_CONN_FAILED), p_ccb->user_data); + SDP_SUCCESS : SDP_CONN_FAILED), p_ccb->user_data); #endif sdpu_release_ccb (p_ccb); @@ -505,23 +486,18 @@ static void sdp_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) tCONN_CB *p_ccb; /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) != NULL) - { - if (p_ccb->con_state == SDP_STATE_CONNECTED) - { - if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) != NULL) { + if (p_ccb->con_state == SDP_STATE_CONNECTED) { + if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { sdp_disc_server_rsp (p_ccb, p_msg); - else + } else { sdp_server_handle_client_req (p_ccb, p_msg); - } - else - { + } + } else { SDP_TRACE_WARNING ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x\n", - p_ccb->con_state, l2cap_cid); + p_ccb->con_state, l2cap_cid); } - } - else - { + } else { SDP_TRACE_WARNING ("SDP - Rcvd L2CAP data, unknown CID: 0x%x\n", l2cap_cid); } @@ -540,14 +516,13 @@ static void sdp_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) ** Returns void ** *******************************************************************************/ -tCONN_CB* sdp_conn_originate (UINT8 *p_bd_addr) +tCONN_CB *sdp_conn_originate (UINT8 *p_bd_addr) { tCONN_CB *p_ccb; UINT16 cid; /* Allocate a new CCB. Return if none available. */ - if ((p_ccb = sdpu_allocate_ccb()) == NULL) - { + if ((p_ccb = sdpu_allocate_ccb()) == NULL) { SDP_TRACE_WARNING ("SDP - no spare CCB for orig\n"); return (NULL); } @@ -566,14 +541,11 @@ tCONN_CB* sdp_conn_originate (UINT8 *p_bd_addr) cid = L2CA_ConnectReq (SDP_PSM, p_bd_addr); /* Check if L2CAP started the connection process */ - if (cid != 0) - { + if (cid != 0) { p_ccb->connection_id = cid; return (p_ccb); - } - else - { + } else { SDP_TRACE_WARNING ("SDP - Originate failed\n"); sdpu_release_ccb (p_ccb); return (NULL); @@ -589,65 +561,66 @@ tCONN_CB* sdp_conn_originate (UINT8 *p_bd_addr) ** Returns void ** *******************************************************************************/ -void sdp_disconnect (tCONN_CB*p_ccb, UINT16 reason) +void sdp_disconnect (tCONN_CB *p_ccb, UINT16 reason) { #if (defined(SDP_BROWSE_PLUS) && SDP_BROWSE_PLUS == TRUE) /* If we are browsing for multiple UUIDs ... */ if ((p_ccb->con_state == SDP_STATE_CONNECTED) - && (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) - && ((reason == SDP_SUCCESS) || (reason == SDP_NO_RECS_MATCH))) - { + && (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) + && ((reason == SDP_SUCCESS) || (reason == SDP_NO_RECS_MATCH))) { /* If the browse found something, do no more searching */ - if ((p_ccb->cur_uuid_idx == 0) && (p_ccb->p_db->p_first_rec)) + if ((p_ccb->cur_uuid_idx == 0) && (p_ccb->p_db->p_first_rec)) { p_ccb->cur_uuid_idx = p_ccb->p_db->num_uuid_filters; + } - while (++p_ccb->cur_uuid_idx < p_ccb->p_db->num_uuid_filters) - { + while (++p_ccb->cur_uuid_idx < p_ccb->p_db->num_uuid_filters) { /* Check we have not already found the UUID (maybe through browse) */ if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len == 2) - && (SDP_FindServiceInDb (p_ccb->p_db, - p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].uu.uuid16, - NULL))) + && (SDP_FindServiceInDb (p_ccb->p_db, + p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].uu.uuid16, + NULL))) { continue; + } if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len > 2) - && (SDP_FindServiceUUIDInDb (p_ccb->p_db, - &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], NULL))) + && (SDP_FindServiceUUIDInDb (p_ccb->p_db, + &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], NULL))) { continue; + } p_ccb->cur_handle = 0; SDP_TRACE_EVENT ("SDP - looking for for more, CID: 0x%x\n", - p_ccb->connection_id); + p_ccb->connection_id); sdp_disc_connected (p_ccb); return; } } - if ((reason == SDP_NO_RECS_MATCH) && (p_ccb->p_db->p_first_rec)) + if ((reason == SDP_NO_RECS_MATCH) && (p_ccb->p_db->p_first_rec)) { reason = SDP_SUCCESS; + } #endif SDP_TRACE_EVENT ("SDP - disconnect CID: 0x%x\n", p_ccb->connection_id); /* Check if we have a connection ID */ - if (p_ccb->connection_id != 0) - { + if (p_ccb->connection_id != 0) { L2CA_DisconnectReq (p_ccb->connection_id); p_ccb->disconnect_reason = reason; } /* If at setup state, we may not get callback ind from L2CAP */ /* Call user callback immediately */ - if (p_ccb->con_state == SDP_STATE_CONN_SETUP) - { + if (p_ccb->con_state == SDP_STATE_CONN_SETUP) { /* Tell the user if he has a callback */ - if (p_ccb->p_cb) + if (p_ccb->p_cb) { (*p_ccb->p_cb) (reason); - else if (p_ccb->p_cb2) + } else if (p_ccb->p_cb2) { (*p_ccb->p_cb2) (reason, p_ccb->user_data); + } sdpu_release_ccb (p_ccb); } @@ -669,18 +642,18 @@ static void sdp_disconnect_cfm (UINT16 l2cap_cid, UINT16 result) UNUSED(result); /* Find CCB based on CID */ - if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) - { + if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL) { SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x\n", l2cap_cid); return; } SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x, rsn %d\n", l2cap_cid, p_ccb->disconnect_reason); /* Tell the user if he has a callback */ - if (p_ccb->p_cb) + if (p_ccb->p_cb) { (*p_ccb->p_cb) (p_ccb->disconnect_reason); - else if (p_ccb->p_cb2) + } else if (p_ccb->p_cb2) { (*p_ccb->p_cb2) (p_ccb->disconnect_reason, p_ccb->user_data); + } sdpu_release_ccb (p_ccb); @@ -698,18 +671,19 @@ static void sdp_disconnect_cfm (UINT16 l2cap_cid, UINT16 result) ** Returns void ** *******************************************************************************/ -void sdp_conn_timeout (tCONN_CB*p_ccb) +void sdp_conn_timeout (tCONN_CB *p_ccb) { SDP_TRACE_EVENT ("SDP - CCB timeout in state: %d CID: 0x%x\n", - p_ccb->con_state, p_ccb->connection_id); + p_ccb->con_state, p_ccb->connection_id); L2CA_DisconnectReq (p_ccb->connection_id); #if SDP_CLIENT_ENABLED == TRUE /* Tell the user if he has a callback */ - if (p_ccb->p_cb) + if (p_ccb->p_cb) { (*p_ccb->p_cb) (SDP_CONN_FAILED); - else if (p_ccb->p_cb2) + } else if (p_ccb->p_cb2) { (*p_ccb->p_cb2) (SDP_CONN_FAILED, p_ccb->user_data); + } #endif sdpu_release_ccb (p_ccb); } diff --git a/components/bt/bluedroid/stack/sdp/sdp_server.c b/components/bt/bluedroid/stack/sdp/sdp_server.c old mode 100755 new mode 100644 index 53cb52510..02a33793d --- a/components/bt/bluedroid/stack/sdp/sdp_server.c +++ b/components/bt/bluedroid/stack/sdp/sdp_server.c @@ -59,8 +59,8 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, UINT8 *p_req_end); static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, - UINT16 param_len, UINT8 *p_req, - UINT8 *p_req_end); + UINT16 param_len, UINT8 *p_req, + UINT8 *p_req_end); /********************************************************************************/ @@ -130,14 +130,12 @@ void sdp_server_handle_client_req (tCONN_CB *p_ccb, BT_HDR *p_msg) BE_STREAM_TO_UINT16 (trans_num, p_req); BE_STREAM_TO_UINT16 (param_len, p_req); - if ((p_req + param_len) != p_req_end) - { + if ((p_req + param_len) != p_req_end) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_PDU_SIZE, SDP_TEXT_BAD_HEADER); return; } - switch (pdu_id) - { + switch (pdu_id) { case SDP_PDU_SERVICE_SEARCH_REQ: process_service_search (p_ccb, trans_num, param_len, p_req, p_req_end); break; @@ -186,8 +184,7 @@ static void process_service_search (tCONN_CB *p_ccb, UINT16 trans_num, p_req = sdpu_extract_uid_seq (p_req, param_len, &uid_seq); - if ((!p_req) || (!uid_seq.num_uids)) - { + if ((!p_req) || (!uid_seq.num_uids)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_UUID_LIST); return; } @@ -195,50 +192,45 @@ static void process_service_search (tCONN_CB *p_ccb, UINT16 trans_num, /* Get the max replies we can send. Cap it at our max anyways. */ BE_STREAM_TO_UINT16 (max_replies, p_req); - if (max_replies > SDP_MAX_RECORDS) + if (max_replies > SDP_MAX_RECORDS) { max_replies = SDP_MAX_RECORDS; + } - if ((!p_req) || (p_req > p_req_end)) - { + if ((!p_req) || (p_req > p_req_end)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_MAX_RECORDS_LIST); return; } /* Get a list of handles that match the UUIDs given to us */ - for (num_rsp_handles = 0; num_rsp_handles < max_replies; ) - { + for (num_rsp_handles = 0; num_rsp_handles < max_replies; ) { p_rec = sdp_db_service_search (p_rec, &uid_seq); - if (p_rec) + if (p_rec) { rsp_handles[num_rsp_handles++] = p_rec->record_handle; - else + } else { break; + } } /* Check if this is a continuation request */ - if (*p_req) - { - if (*p_req++ != SDP_CONTINUATION_LEN || (p_req >= p_req_end)) - { + if (*p_req) { + if (*p_req++ != SDP_CONTINUATION_LEN || (p_req >= p_req_end)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_LEN); return; } BE_STREAM_TO_UINT16 (cont_offset, p_req); - if (cont_offset != p_ccb->cont_offset) - { + if (cont_offset != p_ccb->cont_offset) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_INX); return; } rem_handles = num_rsp_handles - cont_offset; /* extract the remaining handles */ - } - else - { + } else { rem_handles = num_rsp_handles; cont_offset = 0; p_ccb->cont_offset = 0; @@ -247,17 +239,15 @@ static void process_service_search (tCONN_CB *p_ccb, UINT16 trans_num, /* Calculate how many handles will fit in one PDU */ cur_handles = (UINT16)((p_ccb->rem_mtu_size - SDP_MAX_SERVICE_RSPHDR_LEN) / 4); - if (rem_handles <= cur_handles) + if (rem_handles <= cur_handles) { cur_handles = rem_handles; - else /* Continuation is set */ - { + } else { /* Continuation is set */ p_ccb->cont_offset += cur_handles; is_cont = TRUE; } /* Get a buffer to use to build the response */ - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) { SDP_TRACE_ERROR ("SDP - no buf for search rsp\n"); return; } @@ -276,19 +266,19 @@ static void process_service_search (tCONN_CB *p_ccb, UINT16 trans_num, UINT16_TO_BE_STREAM (p_rsp, num_rsp_handles); UINT16_TO_BE_STREAM (p_rsp, cur_handles); -/* SDP_TRACE_DEBUG("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d", - num_rsp_handles, cur_handles, cont_offset, - cont_offset + cur_handles-1, is_cont); */ - for (xx = cont_offset; xx < cont_offset + cur_handles; xx++) + /* SDP_TRACE_DEBUG("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d", + num_rsp_handles, cur_handles, cont_offset, + cont_offset + cur_handles-1, is_cont); */ + for (xx = cont_offset; xx < cont_offset + cur_handles; xx++) { UINT32_TO_BE_STREAM (p_rsp, rsp_handles[xx]); + } - if (is_cont) - { + if (is_cont) { UINT8_TO_BE_STREAM (p_rsp, SDP_CONTINUATION_LEN); UINT16_TO_BE_STREAM (p_rsp, p_ccb->cont_offset); - } - else + } else { UINT8_TO_BE_STREAM (p_rsp, 0); + } /* Go back and put the parameter length into the buffer */ rsp_param_len = p_rsp - p_rsp_param_len - 2; @@ -333,8 +323,7 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Extract the record handle */ BE_STREAM_TO_UINT32 (rec_handle, p_req); - if (p_req > p_req_end) - { + if (p_req > p_req_end) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_SERV_REC_HDL, SDP_TEXT_BAD_HANDLE); return; } @@ -342,13 +331,13 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Get the max list length we can send. Cap it at MTU size minus overhead */ BE_STREAM_TO_UINT16 (max_list_len, p_req); - if (max_list_len > (p_ccb->rem_mtu_size - SDP_MAX_ATTR_RSPHDR_LEN)) + if (max_list_len > (p_ccb->rem_mtu_size - SDP_MAX_ATTR_RSPHDR_LEN)) { max_list_len = p_ccb->rem_mtu_size - SDP_MAX_ATTR_RSPHDR_LEN; + } p_req = sdpu_extract_attr_seq (p_req, param_len, &attr_seq); - if ((!p_req) || (!attr_seq.num_attr) || (p_req > p_req_end)) - { + if ((!p_req) || (!attr_seq.num_attr) || (p_req > p_req_end)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_ATTR_LIST); return; } @@ -357,41 +346,36 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Find a record with the record handle */ p_rec = sdp_db_find_record (rec_handle); - if (!p_rec) - { + if (!p_rec) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_SERV_REC_HDL, SDP_TEXT_BAD_HANDLE); return; } /* Check if this is a continuation request */ - if (*p_req) - { + if (*p_req) { /* Free and reallocate buffer */ - if (p_ccb->rsp_list) + if (p_ccb->rsp_list) { GKI_freebuf(p_ccb->rsp_list); + } p_ccb->rsp_list = (UINT8 *)GKI_getbuf(max_list_len); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR("%s No scratch buf for attr rsp\n", __func__); return; } - if (*p_req++ != SDP_CONTINUATION_LEN) - { + if (*p_req++ != SDP_CONTINUATION_LEN) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_LEN); return; } BE_STREAM_TO_UINT16 (cont_offset, p_req); - if (cont_offset != p_ccb->cont_offset) - { + if (cont_offset != p_ccb->cont_offset) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_INX); return; } - if (!p_ccb->rsp_list) - { + if (!p_ccb->rsp_list) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL); return; } @@ -400,21 +384,16 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Initialise for continuation response */ p_rsp = &p_ccb->rsp_list[0]; attr_seq.attr_entry[p_ccb->cont_info.next_attr_index].start = p_ccb->cont_info.next_attr_start_id; - } - else - { + } else { /* Get a scratch buffer to store response */ - if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len)) - { + if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len)) { /* Free and reallocate if the earlier allocated buffer is small */ - if (p_ccb->rsp_list) - { + if (p_ccb->rsp_list) { GKI_freebuf (p_ccb->rsp_list); } p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp\n"); return; } @@ -430,18 +409,15 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Search for attributes that match the list given to us */ - for (xx = p_ccb->cont_info.next_attr_index; xx < attr_seq.num_attr; xx++) - { + for (xx = p_ccb->cont_info.next_attr_index; xx < attr_seq.num_attr; xx++) { p_attr = sdp_db_find_attr_in_rec (p_rec, attr_seq.attr_entry[xx].start, attr_seq.attr_entry[xx].end); - if (p_attr) - { + if (p_attr) { /* Check if attribute fits. Assume 3-byte value type/length */ rem_len = max_list_len - (INT16) (p_rsp - &p_ccb->rsp_list[0]); /* just in case */ - if (rem_len <= 0) - { + if (rem_len <= 0) { p_ccb->cont_info.next_attr_index = xx; p_ccb->cont_info.next_attr_start_id = p_attr->id; break; @@ -449,21 +425,18 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, attr_len = sdpu_get_attrib_entry_len(p_attr); /* if there is a partial attribute pending to be sent */ - if (p_ccb->cont_info.attr_offset) - { + if (p_ccb->cont_info.attr_offset) { p_rsp = sdpu_build_partial_attrib_entry (p_rsp, p_attr, rem_len, - &p_ccb->cont_info.attr_offset); + &p_ccb->cont_info.attr_offset); /* If the partial attrib could not been fully added yet */ - if (p_ccb->cont_info.attr_offset != attr_len) + if (p_ccb->cont_info.attr_offset != attr_len) { break; - else /* If the partial attrib has been added in full by now */ - p_ccb->cont_info.attr_offset = 0; /* reset attr_offset */ - } - else if (rem_len < attr_len) /* Not enough space for attr... so add partially */ - { - if (attr_len >= SDP_MAX_ATTR_LEN) - { + } else { /* If the partial attrib has been added in full by now */ + p_ccb->cont_info.attr_offset = 0; /* reset attr_offset */ + } + } else if (rem_len < attr_len) { /* Not enough space for attr... so add partially */ + if (attr_len >= SDP_MAX_ATTR_LEN) { SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d\n", max_list_len, attr_len); sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL); return; @@ -471,18 +444,17 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* add the partial attribute if possible */ p_rsp = sdpu_build_partial_attrib_entry (p_rsp, p_attr, (UINT16)rem_len, - &p_ccb->cont_info.attr_offset); + &p_ccb->cont_info.attr_offset); p_ccb->cont_info.next_attr_index = xx; p_ccb->cont_info.next_attr_start_id = p_attr->id; break; - } - else /* build the whole attribute */ + } else { /* build the whole attribute */ p_rsp = sdpu_build_attrib_entry (p_rsp, p_attr); + } /* If doing a range, stick with this one till no more attributes found */ - if (attr_seq.attr_entry[xx].start != attr_seq.attr_entry[xx].end) - { + if (attr_seq.attr_entry[xx].start != attr_seq.attr_entry[xx].end) { /* Update for next time through */ attr_seq.attr_entry[xx].start = p_attr->id + 1; @@ -492,24 +464,21 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* If all the attributes have been accomodated in p_rsp, reset next_attr_index */ - if (xx == attr_seq.num_attr) + if (xx == attr_seq.num_attr) { p_ccb->cont_info.next_attr_index = 0; + } len_to_send = (UINT16) (p_rsp - &p_ccb->rsp_list[0]); cont_offset = 0; - if (!is_cont) - { + if (!is_cont) { p_ccb->list_len = sdpu_get_attrib_seq_len(p_rec, &attr_seq_sav) + 3; /* Put in the sequence header (2 or 3 bytes) */ - if (p_ccb->list_len > 255) - { + if (p_ccb->list_len > 255) { p_ccb->rsp_list[0] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); p_ccb->rsp_list[1] = (UINT8) ((p_ccb->list_len - 3) >> 8); p_ccb->rsp_list[2] = (UINT8) (p_ccb->list_len - 3); - } - else - { + } else { cont_offset = 1; p_ccb->rsp_list[1] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); @@ -521,8 +490,7 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Get a buffer to use to build the response */ - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) { SDP_TRACE_ERROR ("SDP - no buf for search rsp\n"); return; } @@ -545,15 +513,14 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, p_ccb->cont_offset += len_to_send; /* If anything left to send, continuation needed */ - if (p_ccb->cont_offset < p_ccb->list_len) - { + if (p_ccb->cont_offset < p_ccb->list_len) { is_cont = TRUE; UINT8_TO_BE_STREAM (p_rsp, SDP_CONTINUATION_LEN); UINT16_TO_BE_STREAM (p_rsp, p_ccb->cont_offset); - } - else + } else { UINT8_TO_BE_STREAM (p_rsp, 0); + } /* Go back and put the parameter length into the buffer */ rsp_param_len = p_rsp - p_rsp_param_len - 2; @@ -581,8 +548,8 @@ static void process_service_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, ** *******************************************************************************/ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, - UINT16 param_len, UINT8 *p_req, - UINT8 *p_req_end) + UINT16 param_len, UINT8 *p_req, + UINT8 *p_req_end) { UINT16 max_list_len; INT16 rem_len; @@ -602,8 +569,7 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Extract the UUID sequence to search for */ p_req = sdpu_extract_uid_seq (p_req, param_len, &uid_seq); - if ((!p_req) || (!uid_seq.num_uids)) - { + if ((!p_req) || (!uid_seq.num_uids)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_UUID_LIST); return; } @@ -611,13 +577,13 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Get the max list length we can send. Cap it at our max list length. */ BE_STREAM_TO_UINT16 (max_list_len, p_req); - if (max_list_len > (p_ccb->rem_mtu_size - SDP_MAX_SERVATTR_RSPHDR_LEN)) + if (max_list_len > (p_ccb->rem_mtu_size - SDP_MAX_SERVATTR_RSPHDR_LEN)) { max_list_len = p_ccb->rem_mtu_size - SDP_MAX_SERVATTR_RSPHDR_LEN; + } p_req = sdpu_extract_attr_seq (p_req, param_len, &attr_seq); - if ((!p_req) || (!attr_seq.num_attr)) - { + if ((!p_req) || (!attr_seq.num_attr)) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_ATTR_LIST); return; } @@ -625,36 +591,30 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, memcpy(&attr_seq_sav, &attr_seq, sizeof(tSDP_ATTR_SEQ)) ; /* Check if this is a continuation request */ - if (*p_req) - { + if (*p_req) { /* Free and reallocate buffer */ - if (p_ccb->rsp_list) - { + if (p_ccb->rsp_list) { GKI_freebuf (p_ccb->rsp_list); } p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp\n"); return; } - if (*p_req++ != SDP_CONTINUATION_LEN) - { + if (*p_req++ != SDP_CONTINUATION_LEN) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_LEN); return; } BE_STREAM_TO_UINT16 (cont_offset, p_req); - if (cont_offset != p_ccb->cont_offset) - { + if (cont_offset != p_ccb->cont_offset) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_CONT_STATE, SDP_TEXT_BAD_CONT_INX); return; } - if (!p_ccb->rsp_list) - { + if (!p_ccb->rsp_list) { sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL); return; } @@ -663,21 +623,16 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* Initialise for continuation response */ p_rsp = &p_ccb->rsp_list[0]; attr_seq.attr_entry[p_ccb->cont_info.next_attr_index].start = p_ccb->cont_info.next_attr_start_id; - } - else - { + } else { /* Get a scratch buffer to store response */ - if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len)) - { + if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len)) { /* Free and reallocate if the earlier allocated buffer is small */ - if (p_ccb->rsp_list) - { + if (p_ccb->rsp_list) { GKI_freebuf (p_ccb->rsp_list); } p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len); - if (p_ccb->rsp_list == NULL) - { + if (p_ccb->rsp_list == NULL) { SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp\n"); return; } @@ -694,16 +649,13 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Get a list of handles that match the UUIDs given to us */ - for (p_rec = sdp_db_service_search (p_ccb->cont_info.prev_sdp_rec, &uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, &uid_seq)) - { + for (p_rec = sdp_db_service_search (p_ccb->cont_info.prev_sdp_rec, &uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, &uid_seq)) { /* Allow space for attribute sequence type and length */ p_seq_start = p_rsp; - if (p_ccb->cont_info.last_attr_seq_desc_sent == FALSE) - { + if (p_ccb->cont_info.last_attr_seq_desc_sent == FALSE) { /* See if there is enough room to include a new service in the current response */ rem_len = max_list_len - (INT16) (p_rsp - &p_ccb->rsp_list[0]); - if (rem_len < 3) - { + if (rem_len < 3) { /* Not enough room. Update continuation info for next response */ p_ccb->cont_info.next_attr_index = 0; p_ccb->cont_info.next_attr_start_id = attr_seq.attr_entry[0].start; @@ -713,18 +665,15 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Get a list of handles that match the UUIDs given to us */ - for (xx = p_ccb->cont_info.next_attr_index; xx < attr_seq.num_attr; xx++) - { + for (xx = p_ccb->cont_info.next_attr_index; xx < attr_seq.num_attr; xx++) { p_attr = sdp_db_find_attr_in_rec (p_rec, attr_seq.attr_entry[xx].start, attr_seq.attr_entry[xx].end); - if (p_attr) - { + if (p_attr) { /* Check if attribute fits. Assume 3-byte value type/length */ rem_len = max_list_len - (INT16) (p_rsp - &p_ccb->rsp_list[0]); /* just in case */ - if (rem_len <= 0) - { + if (rem_len <= 0) { p_ccb->cont_info.next_attr_index = xx; p_ccb->cont_info.next_attr_start_id = p_attr->id; maxxed_out = TRUE; @@ -733,24 +682,19 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, attr_len = sdpu_get_attrib_entry_len(p_attr); /* if there is a partial attribute pending to be sent */ - if (p_ccb->cont_info.attr_offset) - { + if (p_ccb->cont_info.attr_offset) { p_rsp = sdpu_build_partial_attrib_entry (p_rsp, p_attr, rem_len, - &p_ccb->cont_info.attr_offset); + &p_ccb->cont_info.attr_offset); /* If the partial attrib could not been fully added yet */ - if (p_ccb->cont_info.attr_offset != attr_len) - { + if (p_ccb->cont_info.attr_offset != attr_len) { maxxed_out = TRUE; break; + } else { /* If the partial attrib has been added in full by now */ + p_ccb->cont_info.attr_offset = 0; /* reset attr_offset */ } - else /* If the partial attrib has been added in full by now */ - p_ccb->cont_info.attr_offset = 0; /* reset attr_offset */ - } - else if (rem_len < attr_len) /* Not enough space for attr... so add partially */ - { - if (attr_len >= SDP_MAX_ATTR_LEN) - { + } else if (rem_len < attr_len) { /* Not enough space for attr... so add partially */ + if (attr_len >= SDP_MAX_ATTR_LEN) { SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d\n", max_list_len, attr_len); sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL); return; @@ -758,19 +702,18 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, /* add the partial attribute if possible */ p_rsp = sdpu_build_partial_attrib_entry (p_rsp, p_attr, (UINT16)rem_len, - &p_ccb->cont_info.attr_offset); + &p_ccb->cont_info.attr_offset); p_ccb->cont_info.next_attr_index = xx; p_ccb->cont_info.next_attr_start_id = p_attr->id; maxxed_out = TRUE; break; - } - else /* build the whole attribute */ + } else { /* build the whole attribute */ p_rsp = sdpu_build_attrib_entry (p_rsp, p_attr); + } /* If doing a range, stick with this one till no more attributes found */ - if (attr_seq.attr_entry[xx].start != attr_seq.attr_entry[xx].end) - { + if (attr_seq.attr_entry[xx].start != attr_seq.attr_entry[xx].end) { /* Update for next time through */ attr_seq.attr_entry[xx].start = p_attr->id + 1; @@ -780,23 +723,23 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Go back and put the type and length into the buffer */ - if (p_ccb->cont_info.last_attr_seq_desc_sent == FALSE) - { + if (p_ccb->cont_info.last_attr_seq_desc_sent == FALSE) { seq_len = sdpu_get_attrib_seq_len(p_rec, &attr_seq_sav); - if (seq_len != 0) - { + if (seq_len != 0) { UINT8_TO_BE_STREAM (p_seq_start, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); UINT16_TO_BE_STREAM (p_seq_start, seq_len); - if (maxxed_out) + if (maxxed_out) { p_ccb->cont_info.last_attr_seq_desc_sent = TRUE; - } - else + } + } else { p_rsp = p_seq_start; + } } - if (maxxed_out) + if (maxxed_out) { break; + } /* Restore the attr_seq to look for in the next sdp record */ memcpy(&attr_seq, &attr_seq_sav, sizeof(tSDP_ATTR_SEQ)) ; @@ -828,24 +771,20 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, // // TODO(sharvil): rewrite SDP server. if (is_cont && len_to_send == 0) { - sdpu_build_n_send_error(p_ccb, trans_num, SDP_INVALID_CONT_STATE, NULL); - return; + sdpu_build_n_send_error(p_ccb, trans_num, SDP_INVALID_CONT_STATE, NULL); + return; } /* If first response, insert sequence header */ - if (!is_cont) - { + if (!is_cont) { /* Get the total list length for requested uid and attribute sequence */ p_ccb->list_len = sdpu_get_list_len(&uid_seq, &attr_seq_sav) + 3; /* Put in the sequence header (2 or 3 bytes) */ - if (p_ccb->list_len > 255) - { + if (p_ccb->list_len > 255) { p_ccb->rsp_list[0] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); p_ccb->rsp_list[1] = (UINT8) ((p_ccb->list_len - 3) >> 8); p_ccb->rsp_list[2] = (UINT8) (p_ccb->list_len - 3); - } - else - { + } else { cont_offset = 1; p_ccb->rsp_list[1] = (UINT8) ((DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); @@ -857,8 +796,7 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, } /* Get a buffer to use to build the response */ - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) { SDP_TRACE_ERROR ("SDP - no buf for search rsp\n"); return; } @@ -883,15 +821,14 @@ static void process_service_search_attr_req (tCONN_CB *p_ccb, UINT16 trans_num, p_ccb->cont_offset += len_to_send; /* If anything left to send, continuation needed */ - if (p_ccb->cont_offset < p_ccb->list_len) - { + if (p_ccb->cont_offset < p_ccb->list_len) { is_cont = TRUE; UINT8_TO_BE_STREAM (p_rsp, SDP_CONTINUATION_LEN); UINT16_TO_BE_STREAM (p_rsp, p_ccb->cont_offset); - } - else + } else { UINT8_TO_BE_STREAM (p_rsp, 0); + } /* Go back and put the parameter length into the buffer */ rsp_param_len = p_rsp - p_rsp_param_len - 2; diff --git a/components/bt/bluedroid/stack/sdp/sdp_utils.c b/components/bt/bluedroid/stack/sdp/sdp_utils.c old mode 100755 new mode 100644 index 90bf58e00..38bac33f6 --- a/components/bt/bluedroid/stack/sdp/sdp_utils.c +++ b/components/bt/bluedroid/stack/sdp/sdp_utils.c @@ -43,7 +43,8 @@ static const UINT8 sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; + 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB + }; /******************************************************************************* ** @@ -61,10 +62,10 @@ tCONN_CB *sdpu_find_ccb_by_cid (UINT16 cid) tCONN_CB *p_ccb; /* Look through each connection control block */ - for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->connection_id == cid)) + for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { + if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->connection_id == cid)) { return (p_ccb); + } } /* If here, not found */ @@ -88,13 +89,12 @@ tCONN_CB *sdpu_find_ccb_by_db (tSDP_DISCOVERY_DB *p_db) UINT16 xx; tCONN_CB *p_ccb; - if (p_db) - { + if (p_db) { /* Look through each connection control block */ - for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->p_db == p_db)) + for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { + if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->p_db == p_db)) { return (p_ccb); + } } } #endif @@ -118,10 +118,8 @@ tCONN_CB *sdpu_allocate_ccb (void) tCONN_CB *p_ccb; /* Look through each connection control block for a free one */ - for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) - { - if (p_ccb->con_state == SDP_STATE_IDLE) - { + for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { + if (p_ccb->con_state == SDP_STATE_IDLE) { memset (p_ccb, 0, sizeof (tCONN_CB)); p_ccb->timer_entry.param = (UINT32) p_ccb; @@ -156,9 +154,8 @@ void sdpu_release_ccb (tCONN_CB *p_ccb) #endif /* Free the response buffer */ - if (p_ccb->rsp_list) - { - SDP_TRACE_DEBUG("releasing SDP rsp_list\n"); + if (p_ccb->rsp_list) { + SDP_TRACE_DEBUG("releasing SDP rsp_list\n"); GKI_freebuf(p_ccb->rsp_list); p_ccb->rsp_list = NULL; @@ -183,34 +180,28 @@ UINT8 *sdpu_build_attrib_seq (UINT8 *p_out, UINT16 *p_attr, UINT16 num_attrs) /* First thing is the data element header. See if the length fits 1 byte */ /* If no attributes, assume a 4-byte wildcard */ - if (!p_attr) + if (!p_attr) { xx = 5; - else + } else { xx = num_attrs * 3; + } - if (xx > 255) - { + if (xx > 255) { UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); UINT16_TO_BE_STREAM (p_out, xx); - } - else - { + } else { UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); UINT8_TO_BE_STREAM (p_out, xx); } /* If there are no attributes specified, assume caller wants wildcard */ - if (!p_attr) - { + if (!p_attr) { UINT8_TO_BE_STREAM (p_out, (UINT_DESC_TYPE << 3) | SIZE_FOUR_BYTES); UINT16_TO_BE_STREAM (p_out, 0); UINT16_TO_BE_STREAM (p_out, 0xFFFF); - } - else - { + } else { /* Loop through and put in all the attributes(s) */ - for (xx = 0; xx < num_attrs; xx++, p_attr++) - { + for (xx = 0; xx < num_attrs; xx++, p_attr++) { UINT8_TO_BE_STREAM (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); UINT16_TO_BE_STREAM (p_out, *p_attr); } @@ -239,34 +230,29 @@ UINT8 *sdpu_build_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr) /* the attribute is in the db record. * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ - switch(p_attr->type) - { + switch (p_attr->type) { case TEXT_STR_DESC_TYPE: /* 4 */ case DATA_ELE_SEQ_DESC_TYPE:/* 6 */ case DATA_ELE_ALT_DESC_TYPE:/* 7 */ case URL_DESC_TYPE: /* 8 */ #if (SDP_MAX_ATTR_LEN > 0xFFFF) - if(p_attr->len > 0xFFFF) - { + if (p_attr->len > 0xFFFF) { UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_LONG); UINT32_TO_BE_STREAM (p_out, p_attr->len); - } - else + } else #endif /* 0xFFFF - 0xFF */ #if (SDP_MAX_ATTR_LEN > 0xFF) - if(p_attr->len > 0xFF) - { - UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD); - UINT16_TO_BE_STREAM (p_out, p_attr->len); - } - else + if (p_attr->len > 0xFF) { + UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD); + UINT16_TO_BE_STREAM (p_out, p_attr->len); + } else #endif /* 0xFF and less*/ - { - UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); - UINT8_TO_BE_STREAM (p_out, p_attr->len); - } + { + UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); + UINT8_TO_BE_STREAM (p_out, p_attr->len); + } if (p_attr->value_ptr != NULL) { ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len); @@ -276,8 +262,7 @@ UINT8 *sdpu_build_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr) } /* Now, store the attribute value */ - switch (p_attr->len) - { + switch (p_attr->len) { case 1: UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_ONE_BYTE); break; @@ -324,11 +309,10 @@ void sdpu_build_n_send_error (tCONN_CB *p_ccb, UINT16 trans_num, UINT16 error_co SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error code: 0x%x CID: 0x%x\n", - error_code, p_ccb->connection_id); + error_code, p_ccb->connection_id); /* Get a buffer to use to build and send the packet to L2CAP */ - if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) - { + if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) { SDP_TRACE_ERROR ("SDP - no buf for err msg\n"); return; } @@ -345,8 +329,9 @@ void sdpu_build_n_send_error (tCONN_CB *p_ccb, UINT16 trans_num, UINT16 error_co UINT16_TO_BE_STREAM (p_rsp, error_code); /* Unplugfest example traces do not have any error text */ - if (p_error_text) + if (p_error_text) { ARRAY_TO_BE_STREAM (p_rsp, p_error_text, (int) strlen (p_error_text)); + } /* Go back and put the parameter length into the buffer */ rsp_param_len = p_rsp - p_rsp_param_len - 2; @@ -387,11 +372,11 @@ UINT8 *sdpu_extract_uid_seq (UINT8 *p, UINT16 param_len, tSDP_UUID_SEQ *p_seq) type = descr >> 3; size = descr & 7; - if (type != DATA_ELE_SEQ_DESC_TYPE) + if (type != DATA_ELE_SEQ_DESC_TYPE) { return (NULL); + } - switch (size) - { + switch (size) { case SIZE_TWO_BYTES: seq_len = 2; break; @@ -414,23 +399,23 @@ UINT8 *sdpu_extract_uid_seq (UINT8 *p, UINT16 param_len, tSDP_UUID_SEQ *p_seq) return (NULL); } - if (seq_len >= param_len) + if (seq_len >= param_len) { return (NULL); + } p_seq_end = p + seq_len; /* Loop through, extracting the UIDs */ - for ( ; p < p_seq_end ; ) - { + for ( ; p < p_seq_end ; ) { BE_STREAM_TO_UINT8 (descr, p); type = descr >> 3; size = descr & 7; - if (type != UUID_DESC_TYPE) + if (type != UUID_DESC_TYPE) { return (NULL); + } - switch (size) - { + switch (size) { case SIZE_TWO_BYTES: uuid_len = 2; break; @@ -454,22 +439,23 @@ UINT8 *sdpu_extract_uid_seq (UINT8 *p, UINT16 param_len, tSDP_UUID_SEQ *p_seq) } /* If UUID length is valid, copy it across */ - if ((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16)) - { + if ((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16)) { p_seq->uuid_entry[p_seq->num_uids].len = (UINT16) uuid_len; BE_STREAM_TO_ARRAY (p, p_seq->uuid_entry[p_seq->num_uids].value, (int)uuid_len); p_seq->num_uids++; - } - else + } else { return (NULL); + } /* We can only do so many */ - if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ) + if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ) { return (NULL); + } } - if (p != p_seq_end) + if (p != p_seq_end) { return (NULL); + } return (p); } @@ -500,11 +486,11 @@ UINT8 *sdpu_extract_attr_seq (UINT8 *p, UINT16 param_len, tSDP_ATTR_SEQ *p_seq) type = descr >> 3; size = descr & 7; - if (type != DATA_ELE_SEQ_DESC_TYPE) + if (type != DATA_ELE_SEQ_DESC_TYPE) { return (p); + } - switch (size) - { + switch (size) { case SIZE_IN_NEXT_BYTE: BE_STREAM_TO_UINT8 (list_len, p); break; @@ -521,23 +507,23 @@ UINT8 *sdpu_extract_attr_seq (UINT8 *p, UINT16 param_len, tSDP_ATTR_SEQ *p_seq) return (p); } - if (list_len > param_len) + if (list_len > param_len) { return (p); + } p_end_list = p + list_len; /* Loop through, extracting the attribute IDs */ - for ( ; p < p_end_list ; ) - { + for ( ; p < p_end_list ; ) { BE_STREAM_TO_UINT8 (descr, p); type = descr >> 3; size = descr & 7; - if (type != UINT_DESC_TYPE) + if (type != UINT_DESC_TYPE) { return (p); + } - switch (size) - { + switch (size) { case SIZE_TWO_BYTES: attr_len = 2; break; @@ -559,22 +545,20 @@ UINT8 *sdpu_extract_attr_seq (UINT8 *p, UINT16 param_len, tSDP_ATTR_SEQ *p_seq) } /* Attribute length must be 2-bytes or 4-bytes for a paired entry. */ - if (attr_len == 2) - { + if (attr_len == 2) { BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p); p_seq->attr_entry[p_seq->num_attr].end = p_seq->attr_entry[p_seq->num_attr].start; - } - else if (attr_len == 4) - { + } else if (attr_len == 4) { BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p); BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].end, p); - } - else + } else { return (NULL); + } /* We can only do so many */ - if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ) + if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ) { return (NULL); + } } return (p); @@ -596,8 +580,7 @@ UINT8 *sdpu_get_len_from_type (UINT8 *p, UINT8 type, UINT32 *p_len) UINT16 u16; UINT32 u32; - switch (type & 7) - { + switch (type & 7) { case SIZE_ONE_BYTE: *p_len = 1; break; @@ -646,8 +629,9 @@ BOOLEAN sdpu_is_base_uuid (UINT8 *p_uuid) UINT16 xx; for (xx = 4; xx < MAX_UUID_SIZE; xx++) - if (p_uuid[xx] != sdp_base_uuid[xx]) + if (p_uuid[xx] != sdp_base_uuid[xx]) { return (FALSE); + } /* If here, matched */ return (TRUE); @@ -671,65 +655,57 @@ BOOLEAN sdpu_compare_uuid_arrays (UINT8 *p_uuid1, UINT32 len1, UINT8 *p_uuid2, U UINT8 nu1[MAX_UUID_SIZE]; UINT8 nu2[MAX_UUID_SIZE]; - if( ((len1 != 2) && (len1 != 4) && (len1 != 16)) || - ((len2 != 2) && (len2 != 4) && (len2 != 16)) ) - { + if ( ((len1 != 2) && (len1 != 4) && (len1 != 16)) || + ((len2 != 2) && (len2 != 4) && (len2 != 16)) ) { SDP_TRACE_ERROR("%s: invalid length\n", __func__); return FALSE; } /* If lengths match, do a straight compare */ - if (len1 == len2) - { - if (len1 == 2) + if (len1 == len2) { + if (len1 == 2) { return ((p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1])); + } if (len1 == 4) return ( (p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1]) - && (p_uuid1[2] == p_uuid2[2]) && (p_uuid1[3] == p_uuid2[3]) ); - else + && (p_uuid1[2] == p_uuid2[2]) && (p_uuid1[3] == p_uuid2[3]) ); + else { return (memcmp (p_uuid1, p_uuid2, (size_t)len1) == 0); - } - else if (len1 > len2) - { - /* If the len1 was 4-byte, (so len2 is 2-byte), compare on the fly */ - if (len1 == 4) - { - return ( (p_uuid1[0] == 0) && (p_uuid1[1] == 0) - && (p_uuid1[2] == p_uuid2[0]) && (p_uuid1[3] == p_uuid2[1]) ); } - else - { + } else if (len1 > len2) { + /* If the len1 was 4-byte, (so len2 is 2-byte), compare on the fly */ + if (len1 == 4) { + return ( (p_uuid1[0] == 0) && (p_uuid1[1] == 0) + && (p_uuid1[2] == p_uuid2[0]) && (p_uuid1[3] == p_uuid2[1]) ); + } else { /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ memcpy (nu1, p_uuid1, MAX_UUID_SIZE); memcpy (nu2, sdp_base_uuid, MAX_UUID_SIZE); - if (len2 == 4) + if (len2 == 4) { memcpy (nu2, p_uuid2, len2); - else if (len2 == 2) + } else if (len2 == 2) { memcpy (nu2 + 2, p_uuid2, len2); + } return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0); } - } - else - { + } else { /* len2 is greater than len1 */ /* If the len2 was 4-byte, (so len1 is 2-byte), compare on the fly */ - if (len2 == 4) - { + if (len2 == 4) { return ( (p_uuid2[0] == 0) && (p_uuid2[1] == 0) - && (p_uuid2[2] == p_uuid1[0]) && (p_uuid2[3] == p_uuid1[1]) ); - } - else - { + && (p_uuid2[2] == p_uuid1[0]) && (p_uuid2[3] == p_uuid1[1]) ); + } else { /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ memcpy (nu2, p_uuid2, MAX_UUID_SIZE); memcpy (nu1, sdp_base_uuid, MAX_UUID_SIZE); - if (len1 == 4) + if (len1 == 4) { memcpy (nu1, p_uuid1, (size_t)len1); - else if (len1 == 2) + } else if (len1 == 2) { memcpy (nu1 + 2, p_uuid1, (size_t)len1); + } return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0); } @@ -752,14 +728,14 @@ BOOLEAN sdpu_compare_uuid_arrays (UINT8 *p_uuid1, UINT32 len1, UINT8 *p_uuid2, U BOOLEAN sdpu_compare_bt_uuids (tBT_UUID *p_uuid1, tBT_UUID *p_uuid2) { /* Lengths must match for BT UUIDs to match */ - if (p_uuid1->len == p_uuid2->len) - { - if (p_uuid1->len == 2) + if (p_uuid1->len == p_uuid2->len) { + if (p_uuid1->len == 2) { return (p_uuid1->uu.uuid16 == p_uuid2->uu.uuid16); - else if (p_uuid1->len == 4) + } else if (p_uuid1->len == 4) { return (p_uuid1->uu.uuid32 == p_uuid2->uu.uuid32); - else if (!memcmp (p_uuid1->uu.uuid128, p_uuid2->uu.uuid128, 16)) + } else if (!memcmp (p_uuid1->uu.uuid128, p_uuid2->uu.uuid128, 16)) { return (TRUE); + } } return (FALSE); @@ -787,13 +763,15 @@ BOOLEAN sdpu_compare_uuid_with_attr (tBT_UUID *p_btuuid, tSDP_DISC_ATTR *p_attr) UINT16 attr_len = SDP_DISC_ATTR_LEN (p_attr->attr_len_type); /* Since both UUIDs are compressed, lengths must match */ - if (p_btuuid->len != attr_len) + if (p_btuuid->len != attr_len) { return (FALSE); + } - if (p_btuuid->len == 2) + if (p_btuuid->len == 2) { return (BOOLEAN)(p_btuuid->uu.uuid16 == p_attr->attr_value.v.u16); - else if (p_btuuid->len == 4) + } else if (p_btuuid->len == 4) { return (BOOLEAN)(p_btuuid->uu.uuid32 == p_attr->attr_value.v.u32); + } /* coverity[overrun-buffer-arg] */ /* Event overrun-buffer-arg: Overrun of static array "&p_attr->attr_value.v.array" of size 4 bytes by passing it to a function which indexes it with argument "16U" at byte position 15 @@ -802,8 +780,9 @@ BOOLEAN sdpu_compare_uuid_with_attr (tBT_UUID *p_btuuid, tSDP_DISC_ATTR *p_attr) The actual size of tSDP_DISC_ATVAL does not matter. If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily */ - else if (!memcmp (p_btuuid->uu.uuid128,(void*) p_attr->attr_value.v.array, MAX_UUID_SIZE)) + else if (!memcmp (p_btuuid->uu.uuid128, (void *) p_attr->attr_value.v.array, MAX_UUID_SIZE)) { return (TRUE); + } return (FALSE); } @@ -824,29 +803,24 @@ void sdpu_sort_attr_list( UINT16 num_attr, tSDP_DISCOVERY_DB *p_db ) UINT16 x; /* Done if no attributes to sort */ - if (num_attr <= 1) - { + if (num_attr <= 1) { return; - } - else if (num_attr > SDP_MAX_ATTR_FILTERS) - { + } else if (num_attr > SDP_MAX_ATTR_FILTERS) { num_attr = SDP_MAX_ATTR_FILTERS; } num_attr--; /* for the for-loop */ - for( i = 0; i < num_attr; ) - { - if( p_db->attr_filters[i] > p_db->attr_filters[i+1] ) - { + for ( i = 0; i < num_attr; ) { + if ( p_db->attr_filters[i] > p_db->attr_filters[i + 1] ) { /* swap the attribute IDs and start from the beginning */ x = p_db->attr_filters[i]; - p_db->attr_filters[i] = p_db->attr_filters[i+1]; - p_db->attr_filters[i+1] = x; + p_db->attr_filters[i] = p_db->attr_filters[i + 1]; + p_db->attr_filters[i + 1] = x; i = 0; - } - else + } else { i++; + } } } @@ -867,16 +841,16 @@ UINT16 sdpu_get_list_len(tSDP_UUID_SEQ *uid_seq, tSDP_ATTR_SEQ *attr_seq) UINT16 len = 0; UINT16 len1; - for (p_rec = sdp_db_service_search (NULL, uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, uid_seq)) - { + for (p_rec = sdp_db_service_search (NULL, uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, uid_seq)) { len += 3; len1 = sdpu_get_attrib_seq_len(p_rec, attr_seq ); - if (len1 != 0) + if (len1 != 0) { len += len1; - else + } else { len -= 3; + } } return len; } @@ -897,35 +871,31 @@ UINT16 sdpu_get_attrib_seq_len(tSDP_RECORD *p_rec, tSDP_ATTR_SEQ *attr_seq) UINT16 len1 = 0; UINT16 xx; BOOLEAN is_range = FALSE; - UINT16 start_id=0, end_id=0; + UINT16 start_id = 0, end_id = 0; - for (xx = 0; xx < attr_seq->num_attr; xx++) - { - if (is_range == FALSE) - { + for (xx = 0; xx < attr_seq->num_attr; xx++) { + if (is_range == FALSE) { start_id = attr_seq->attr_entry[xx].start; end_id = attr_seq->attr_entry[xx].end; } p_attr = sdp_db_find_attr_in_rec (p_rec, start_id, end_id); - if (p_attr) - { + if (p_attr) { len1 += sdpu_get_attrib_entry_len (p_attr); /* If doing a range, stick with this one till no more attributes found */ - if (start_id != end_id) - { + if (start_id != end_id) { /* Update for next time through */ start_id = p_attr->id + 1; xx--; is_range = TRUE; - } - else + } else { is_range = FALSE; - } - else + } + } else { is_range = FALSE; + } } return len1; } @@ -945,38 +915,32 @@ UINT16 sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE *p_attr) /* the attribute is in the db record. * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ - switch(p_attr->type) - { + switch (p_attr->type) { case TEXT_STR_DESC_TYPE: /* 4 */ case DATA_ELE_SEQ_DESC_TYPE:/* 6 */ case DATA_ELE_ALT_DESC_TYPE:/* 7 */ case URL_DESC_TYPE: /* 8 */ #if (SDP_MAX_ATTR_LEN > 0xFFFF) - if(p_attr->len > 0xFFFF) - { + if (p_attr->len > 0xFFFF) { len += 5; - } - else + } else #endif/* 0xFFFF - 0xFF */ #if (SDP_MAX_ATTR_LEN > 0xFF) - if(p_attr->len > 0xFF) - { - len += 3; - } - else + if (p_attr->len > 0xFF) { + len += 3; + } else #endif /* 0xFF and less*/ - { - len += 2; - } + { + len += 2; + } len += p_attr->len; return len; - } + } /* Now, the attribute value */ - switch (p_attr->len) - { + switch (p_attr->len) { case 1: case 2: case 4: @@ -1017,8 +981,7 @@ UINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UI size_t len_to_copy; UINT16 attr_len; - if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL) - { + if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL) { SDP_TRACE_ERROR("sdpu_build_partial_attrib_entry cannot get a buffer!\n"); return NULL; } @@ -1027,7 +990,7 @@ UINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UI sdpu_build_attrib_entry(p_tmp_attr, p_attr); attr_len = sdpu_get_attrib_entry_len(p_attr); - len_to_copy = ((attr_len - *offset) < len) ? (attr_len - *offset): len; + len_to_copy = ((attr_len - *offset) < len) ? (attr_len - *offset) : len; memcpy(p_out, &p_attr_buff[*offset], len_to_copy); @@ -1051,12 +1014,12 @@ UINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UI ** *******************************************************************************/ -void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128) +void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128) { UINT16 uuid16_bo; memset(p_uuid128, 0, 16); memcpy(p_uuid128, sdp_base_uuid, MAX_UUID_SIZE); uuid16_bo = ntohs(uuid16); - memcpy(p_uuid128+ 2, &uuid16_bo, sizeof(uint16_t)); + memcpy(p_uuid128 + 2, &uuid16_bo, sizeof(uint16_t)); } diff --git a/components/bt/bluedroid/stack/smp/aes.c b/components/bt/bluedroid/stack/smp/aes.c old mode 100755 new mode 100644 index 38c336b7b..77811873d --- a/components/bt/bluedroid/stack/smp/aes.c +++ b/components/bt/bluedroid/stack/smp/aes.c @@ -68,7 +68,7 @@ #include "aes.h" #if defined( HAVE_UINT_32T ) - typedef UINT32 uint_32t; +typedef UINT32 uint_32t; #endif /* functions for finite field multiplication in the AES Galois field */ @@ -222,7 +222,8 @@ static const uint_8t gfmul_e[256] = mm_data(fe); /* values of all top bits within a byte */ static uint_8t hibit(const uint_8t x) -{ uint_8t r = (uint_8t)((x >> 1) | (x >> 2)); +{ + uint_8t r = (uint_8t)((x >> 1) | (x >> 2)); r |= (r >> 2); r |= (r >> 4); @@ -232,34 +233,35 @@ static uint_8t hibit(const uint_8t x) /* return the inverse of the finite field element x */ static uint_8t gf_inv(const uint_8t x) -{ uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; +{ + uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; - if(x < 2) + if (x < 2) { return x; + } - for( ; ; ) - { - if(n1) - while(n2 >= n1) /* divide polynomial p2 by p1 */ - { + for ( ; ; ) { + if (n1) + while (n2 >= n1) { /* divide polynomial p2 by p1 */ n2 /= n1; /* shift smaller polynomial left */ p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ v2 ^= (v1 * n2); /* shift accumulated value and */ n2 = hibit(p2); /* add into result */ } - else + else { return v1; + } - if(n2) /* repeat with values swapped */ - while(n1 >= n2) - { + if (n2) /* repeat with values swapped */ + while (n1 >= n2) { n1 /= n2; p1 ^= p2 * n1; v1 ^= v2 * n1; n1 = hibit(p1); } - else + else { return v2; + } } } @@ -272,7 +274,7 @@ uint_8t fwd_affine(const uint_8t x) return 0x63 ^ ((w ^ (w >> 8)) & 0xff); #else return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4) - ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4); + ^ (x >> 7) ^ (x >> 6) ^ (x >> 5) ^ (x >> 4); #endif } @@ -284,7 +286,7 @@ uint_8t inv_affine(const uint_8t x) return 0x05 ^ ((w ^ (w >> 8)) & 0xff); #else return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6) - ^ (x >> 7) ^ (x >> 5) ^ (x >> 2); + ^ (x >> 7) ^ (x >> 5) ^ (x >> 2); #endif } @@ -311,88 +313,89 @@ uint_8t inv_affine(const uint_8t x) static void copy_block( void *d, const void *s ) { #if defined( HAVE_UINT_32T ) - ((uint_32t*)d)[ 0] = ((uint_32t*)s)[ 0]; - ((uint_32t*)d)[ 1] = ((uint_32t*)s)[ 1]; - ((uint_32t*)d)[ 2] = ((uint_32t*)s)[ 2]; - ((uint_32t*)d)[ 3] = ((uint_32t*)s)[ 3]; + ((uint_32t *)d)[ 0] = ((uint_32t *)s)[ 0]; + ((uint_32t *)d)[ 1] = ((uint_32t *)s)[ 1]; + ((uint_32t *)d)[ 2] = ((uint_32t *)s)[ 2]; + ((uint_32t *)d)[ 3] = ((uint_32t *)s)[ 3]; #else - ((uint_8t*)d)[ 0] = ((uint_8t*)s)[ 0]; - ((uint_8t*)d)[ 1] = ((uint_8t*)s)[ 1]; - ((uint_8t*)d)[ 2] = ((uint_8t*)s)[ 2]; - ((uint_8t*)d)[ 3] = ((uint_8t*)s)[ 3]; - ((uint_8t*)d)[ 4] = ((uint_8t*)s)[ 4]; - ((uint_8t*)d)[ 5] = ((uint_8t*)s)[ 5]; - ((uint_8t*)d)[ 6] = ((uint_8t*)s)[ 6]; - ((uint_8t*)d)[ 7] = ((uint_8t*)s)[ 7]; - ((uint_8t*)d)[ 8] = ((uint_8t*)s)[ 8]; - ((uint_8t*)d)[ 9] = ((uint_8t*)s)[ 9]; - ((uint_8t*)d)[10] = ((uint_8t*)s)[10]; - ((uint_8t*)d)[11] = ((uint_8t*)s)[11]; - ((uint_8t*)d)[12] = ((uint_8t*)s)[12]; - ((uint_8t*)d)[13] = ((uint_8t*)s)[13]; - ((uint_8t*)d)[14] = ((uint_8t*)s)[14]; - ((uint_8t*)d)[15] = ((uint_8t*)s)[15]; + ((uint_8t *)d)[ 0] = ((uint_8t *)s)[ 0]; + ((uint_8t *)d)[ 1] = ((uint_8t *)s)[ 1]; + ((uint_8t *)d)[ 2] = ((uint_8t *)s)[ 2]; + ((uint_8t *)d)[ 3] = ((uint_8t *)s)[ 3]; + ((uint_8t *)d)[ 4] = ((uint_8t *)s)[ 4]; + ((uint_8t *)d)[ 5] = ((uint_8t *)s)[ 5]; + ((uint_8t *)d)[ 6] = ((uint_8t *)s)[ 6]; + ((uint_8t *)d)[ 7] = ((uint_8t *)s)[ 7]; + ((uint_8t *)d)[ 8] = ((uint_8t *)s)[ 8]; + ((uint_8t *)d)[ 9] = ((uint_8t *)s)[ 9]; + ((uint_8t *)d)[10] = ((uint_8t *)s)[10]; + ((uint_8t *)d)[11] = ((uint_8t *)s)[11]; + ((uint_8t *)d)[12] = ((uint_8t *)s)[12]; + ((uint_8t *)d)[13] = ((uint_8t *)s)[13]; + ((uint_8t *)d)[14] = ((uint_8t *)s)[14]; + ((uint_8t *)d)[15] = ((uint_8t *)s)[15]; #endif } -static void copy_block_nn( void * d, const void *s, uint_8t nn ) +static void copy_block_nn( void *d, const void *s, uint_8t nn ) { - while( nn-- ) - *((uint_8t*)d)++ = *((uint_8t*)s)++; + while ( nn-- ) { + *((uint_8t *)d)++ = *((uint_8t *)s)++; + } } #endif static void xor_block( void *d, const void *s ) { #if defined( HAVE_UINT_32T ) - ((uint_32t*)d)[ 0] ^= ((uint_32t*)s)[ 0]; - ((uint_32t*)d)[ 1] ^= ((uint_32t*)s)[ 1]; - ((uint_32t*)d)[ 2] ^= ((uint_32t*)s)[ 2]; - ((uint_32t*)d)[ 3] ^= ((uint_32t*)s)[ 3]; + ((uint_32t *)d)[ 0] ^= ((uint_32t *)s)[ 0]; + ((uint_32t *)d)[ 1] ^= ((uint_32t *)s)[ 1]; + ((uint_32t *)d)[ 2] ^= ((uint_32t *)s)[ 2]; + ((uint_32t *)d)[ 3] ^= ((uint_32t *)s)[ 3]; #else - ((uint_8t*)d)[ 0] ^= ((uint_8t*)s)[ 0]; - ((uint_8t*)d)[ 1] ^= ((uint_8t*)s)[ 1]; - ((uint_8t*)d)[ 2] ^= ((uint_8t*)s)[ 2]; - ((uint_8t*)d)[ 3] ^= ((uint_8t*)s)[ 3]; - ((uint_8t*)d)[ 4] ^= ((uint_8t*)s)[ 4]; - ((uint_8t*)d)[ 5] ^= ((uint_8t*)s)[ 5]; - ((uint_8t*)d)[ 6] ^= ((uint_8t*)s)[ 6]; - ((uint_8t*)d)[ 7] ^= ((uint_8t*)s)[ 7]; - ((uint_8t*)d)[ 8] ^= ((uint_8t*)s)[ 8]; - ((uint_8t*)d)[ 9] ^= ((uint_8t*)s)[ 9]; - ((uint_8t*)d)[10] ^= ((uint_8t*)s)[10]; - ((uint_8t*)d)[11] ^= ((uint_8t*)s)[11]; - ((uint_8t*)d)[12] ^= ((uint_8t*)s)[12]; - ((uint_8t*)d)[13] ^= ((uint_8t*)s)[13]; - ((uint_8t*)d)[14] ^= ((uint_8t*)s)[14]; - ((uint_8t*)d)[15] ^= ((uint_8t*)s)[15]; + ((uint_8t *)d)[ 0] ^= ((uint_8t *)s)[ 0]; + ((uint_8t *)d)[ 1] ^= ((uint_8t *)s)[ 1]; + ((uint_8t *)d)[ 2] ^= ((uint_8t *)s)[ 2]; + ((uint_8t *)d)[ 3] ^= ((uint_8t *)s)[ 3]; + ((uint_8t *)d)[ 4] ^= ((uint_8t *)s)[ 4]; + ((uint_8t *)d)[ 5] ^= ((uint_8t *)s)[ 5]; + ((uint_8t *)d)[ 6] ^= ((uint_8t *)s)[ 6]; + ((uint_8t *)d)[ 7] ^= ((uint_8t *)s)[ 7]; + ((uint_8t *)d)[ 8] ^= ((uint_8t *)s)[ 8]; + ((uint_8t *)d)[ 9] ^= ((uint_8t *)s)[ 9]; + ((uint_8t *)d)[10] ^= ((uint_8t *)s)[10]; + ((uint_8t *)d)[11] ^= ((uint_8t *)s)[11]; + ((uint_8t *)d)[12] ^= ((uint_8t *)s)[12]; + ((uint_8t *)d)[13] ^= ((uint_8t *)s)[13]; + ((uint_8t *)d)[14] ^= ((uint_8t *)s)[14]; + ((uint_8t *)d)[15] ^= ((uint_8t *)s)[15]; #endif } static void copy_and_key( void *d, const void *s, const void *k ) { #if defined( HAVE_UINT_32T ) - ((uint_32t*)d)[ 0] = ((uint_32t*)s)[ 0] ^ ((uint_32t*)k)[ 0]; - ((uint_32t*)d)[ 1] = ((uint_32t*)s)[ 1] ^ ((uint_32t*)k)[ 1]; - ((uint_32t*)d)[ 2] = ((uint_32t*)s)[ 2] ^ ((uint_32t*)k)[ 2]; - ((uint_32t*)d)[ 3] = ((uint_32t*)s)[ 3] ^ ((uint_32t*)k)[ 3]; + ((uint_32t *)d)[ 0] = ((uint_32t *)s)[ 0] ^ ((uint_32t *)k)[ 0]; + ((uint_32t *)d)[ 1] = ((uint_32t *)s)[ 1] ^ ((uint_32t *)k)[ 1]; + ((uint_32t *)d)[ 2] = ((uint_32t *)s)[ 2] ^ ((uint_32t *)k)[ 2]; + ((uint_32t *)d)[ 3] = ((uint_32t *)s)[ 3] ^ ((uint_32t *)k)[ 3]; #elif 1 - ((uint_8t*)d)[ 0] = ((uint_8t*)s)[ 0] ^ ((uint_8t*)k)[ 0]; - ((uint_8t*)d)[ 1] = ((uint_8t*)s)[ 1] ^ ((uint_8t*)k)[ 1]; - ((uint_8t*)d)[ 2] = ((uint_8t*)s)[ 2] ^ ((uint_8t*)k)[ 2]; - ((uint_8t*)d)[ 3] = ((uint_8t*)s)[ 3] ^ ((uint_8t*)k)[ 3]; - ((uint_8t*)d)[ 4] = ((uint_8t*)s)[ 4] ^ ((uint_8t*)k)[ 4]; - ((uint_8t*)d)[ 5] = ((uint_8t*)s)[ 5] ^ ((uint_8t*)k)[ 5]; - ((uint_8t*)d)[ 6] = ((uint_8t*)s)[ 6] ^ ((uint_8t*)k)[ 6]; - ((uint_8t*)d)[ 7] = ((uint_8t*)s)[ 7] ^ ((uint_8t*)k)[ 7]; - ((uint_8t*)d)[ 8] = ((uint_8t*)s)[ 8] ^ ((uint_8t*)k)[ 8]; - ((uint_8t*)d)[ 9] = ((uint_8t*)s)[ 9] ^ ((uint_8t*)k)[ 9]; - ((uint_8t*)d)[10] = ((uint_8t*)s)[10] ^ ((uint_8t*)k)[10]; - ((uint_8t*)d)[11] = ((uint_8t*)s)[11] ^ ((uint_8t*)k)[11]; - ((uint_8t*)d)[12] = ((uint_8t*)s)[12] ^ ((uint_8t*)k)[12]; - ((uint_8t*)d)[13] = ((uint_8t*)s)[13] ^ ((uint_8t*)k)[13]; - ((uint_8t*)d)[14] = ((uint_8t*)s)[14] ^ ((uint_8t*)k)[14]; - ((uint_8t*)d)[15] = ((uint_8t*)s)[15] ^ ((uint_8t*)k)[15]; + ((uint_8t *)d)[ 0] = ((uint_8t *)s)[ 0] ^ ((uint_8t *)k)[ 0]; + ((uint_8t *)d)[ 1] = ((uint_8t *)s)[ 1] ^ ((uint_8t *)k)[ 1]; + ((uint_8t *)d)[ 2] = ((uint_8t *)s)[ 2] ^ ((uint_8t *)k)[ 2]; + ((uint_8t *)d)[ 3] = ((uint_8t *)s)[ 3] ^ ((uint_8t *)k)[ 3]; + ((uint_8t *)d)[ 4] = ((uint_8t *)s)[ 4] ^ ((uint_8t *)k)[ 4]; + ((uint_8t *)d)[ 5] = ((uint_8t *)s)[ 5] ^ ((uint_8t *)k)[ 5]; + ((uint_8t *)d)[ 6] = ((uint_8t *)s)[ 6] ^ ((uint_8t *)k)[ 6]; + ((uint_8t *)d)[ 7] = ((uint_8t *)s)[ 7] ^ ((uint_8t *)k)[ 7]; + ((uint_8t *)d)[ 8] = ((uint_8t *)s)[ 8] ^ ((uint_8t *)k)[ 8]; + ((uint_8t *)d)[ 9] = ((uint_8t *)s)[ 9] ^ ((uint_8t *)k)[ 9]; + ((uint_8t *)d)[10] = ((uint_8t *)s)[10] ^ ((uint_8t *)k)[10]; + ((uint_8t *)d)[11] = ((uint_8t *)s)[11] ^ ((uint_8t *)k)[11]; + ((uint_8t *)d)[12] = ((uint_8t *)s)[12] ^ ((uint_8t *)k)[12]; + ((uint_8t *)d)[13] = ((uint_8t *)s)[13] ^ ((uint_8t *)k)[13]; + ((uint_8t *)d)[14] = ((uint_8t *)s)[14] ^ ((uint_8t *)k)[14]; + ((uint_8t *)d)[15] = ((uint_8t *)s)[15] ^ ((uint_8t *)k)[15]; #else block_copy(d, s); xor_block(d, k); @@ -405,7 +408,8 @@ static void add_round_key( uint_8t d[N_BLOCK], const uint_8t k[N_BLOCK] ) } static void shift_sub_rows( uint_8t st[N_BLOCK] ) -{ uint_8t tt; +{ + uint_8t tt; st[ 0] = s_box(st[ 0]); st[ 4] = s_box(st[ 4]); st[ 8] = s_box(st[ 8]); st[12] = s_box(st[12]); @@ -421,7 +425,8 @@ static void shift_sub_rows( uint_8t st[N_BLOCK] ) } static void inv_shift_sub_rows( uint_8t st[N_BLOCK] ) -{ uint_8t tt; +{ + uint_8t tt; st[ 0] = is_box(st[ 0]); st[ 4] = is_box(st[ 4]); st[ 8] = is_box(st[ 8]); st[12] = is_box(st[12]); @@ -437,12 +442,13 @@ static void inv_shift_sub_rows( uint_8t st[N_BLOCK] ) } #if defined( VERSION_1 ) - static void mix_sub_columns( uint_8t dt[N_BLOCK] ) - { uint_8t st[N_BLOCK]; +static void mix_sub_columns( uint_8t dt[N_BLOCK] ) +{ + uint_8t st[N_BLOCK]; block_copy(st, dt); #else - static void mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] ) - { +static void mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] ) +{ #endif dt[ 0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]); dt[ 1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]); @@ -463,15 +469,16 @@ static void inv_shift_sub_rows( uint_8t st[N_BLOCK] ) dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]); dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]); dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]); - } +} #if defined( VERSION_1 ) - static void inv_mix_sub_columns( uint_8t dt[N_BLOCK] ) - { uint_8t st[N_BLOCK]; +static void inv_mix_sub_columns( uint_8t dt[N_BLOCK] ) +{ + uint_8t st[N_BLOCK]; block_copy(st, dt); #else - static void inv_mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] ) - { +static void inv_mix_sub_columns( uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK] ) +{ #endif dt[ 0] = is_box(gfm_e(st[ 0]) ^ gfm_b(st[ 1]) ^ gfm_d(st[ 2]) ^ gfm_9(st[ 3])); dt[ 5] = is_box(gfm_9(st[ 0]) ^ gfm_e(st[ 1]) ^ gfm_b(st[ 2]) ^ gfm_d(st[ 3])); @@ -492,7 +499,7 @@ static void inv_shift_sub_rows( uint_8t st[N_BLOCK] ) dt[ 1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15])); dt[ 6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15])); dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15])); - } +} #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED ) @@ -507,8 +514,7 @@ return_type aes_set_key( const unsigned char key[], length_type keylen, aes_cont { uint_8t cc, rc, hi; - switch( keylen ) - { + switch ( keylen ) { case 16: case 128: /* length in bits (128 = 8*16) */ keylen = 16; @@ -518,34 +524,31 @@ return_type aes_set_key( const unsigned char key[], length_type keylen, aes_cont keylen = 24; break; case 32: -/* case 256: length in bits (256 = 8*32) */ + /* case 256: length in bits (256 = 8*32) */ keylen = 32; break; default: ctx->rnd = 0; - return (return_type)-1; + return (return_type) - 1; } block_copy_nn(ctx->ksch, key, keylen); hi = (keylen + 28) << 2; ctx->rnd = (hi >> 4) - 1; - for( cc = keylen, rc = 1; cc < hi; cc += 4 ) - { uint_8t tt, t0, t1, t2, t3; + for ( cc = keylen, rc = 1; cc < hi; cc += 4 ) { + uint_8t tt, t0, t1, t2, t3; t0 = ctx->ksch[cc - 4]; t1 = ctx->ksch[cc - 3]; t2 = ctx->ksch[cc - 2]; t3 = ctx->ksch[cc - 1]; - if( cc % keylen == 0 ) - { + if ( cc % keylen == 0 ) { tt = t0; t0 = s_box(t1) ^ rc; t1 = s_box(t2); t2 = s_box(t3); t3 = s_box(tt); rc = f2(rc); - } - else if( keylen > 24 && cc % keylen == 16 ) - { + } else if ( keylen > 24 && cc % keylen == 16 ) { t0 = s_box(t0); t1 = s_box(t1); t2 = s_box(t2); @@ -569,42 +572,42 @@ return_type aes_set_key( const unsigned char key[], length_type keylen, aes_cont /* @breif change the name by snake for avoid the conflict with libcrypto */ return_type bluedroid_aes_encrypt( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1] ) { - if( ctx->rnd ) - { + if ( ctx->rnd ) { uint_8t s1[N_BLOCK], r; copy_and_key( s1, in, ctx->ksch ); - for( r = 1 ; r < ctx->rnd ; ++r ) + for ( r = 1 ; r < ctx->rnd ; ++r ) #if defined( VERSION_1 ) { mix_sub_columns( s1 ); add_round_key( s1, ctx->ksch + r * N_BLOCK); } #else - { uint_8t s2[N_BLOCK]; + { + uint_8t s2[N_BLOCK]; mix_sub_columns( s2, s1 ); copy_and_key( s1, s2, ctx->ksch + r * N_BLOCK); } #endif shift_sub_rows( s1 ); copy_and_key( out, s1, ctx->ksch + r * N_BLOCK ); + } else { + return (return_type) - 1; } - else - return (return_type)-1; return 0; } /* CBC encrypt a number of blocks (input and return an IV) */ return_type aes_cbc_encrypt( const unsigned char *in, unsigned char *out, - int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] ) + int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] ) { - while(n_block--) - { + while (n_block--) { xor_block(iv, in); - if(bluedroid_aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) - return EXIT_FAILURE; + if (bluedroid_aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } memcpy(out, iv, N_BLOCK); in += N_BLOCK; out += N_BLOCK; @@ -620,42 +623,43 @@ return_type aes_cbc_encrypt( const unsigned char *in, unsigned char *out, return_type bluedroid_aes_decrypt( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], const aes_context ctx[1] ) { - if( ctx->rnd ) - { + if ( ctx->rnd ) { uint_8t s1[N_BLOCK], r; copy_and_key( s1, in, ctx->ksch + ctx->rnd * N_BLOCK ); inv_shift_sub_rows( s1 ); - for( r = ctx->rnd ; --r ; ) + for ( r = ctx->rnd ; --r ; ) #if defined( VERSION_1 ) { add_round_key( s1, ctx->ksch + r * N_BLOCK ); inv_mix_sub_columns( s1 ); } #else - { uint_8t s2[N_BLOCK]; + { + uint_8t s2[N_BLOCK]; copy_and_key( s2, s1, ctx->ksch + r * N_BLOCK ); inv_mix_sub_columns( s1, s2 ); } #endif copy_and_key( out, s1, ctx->ksch ); + } else { + return (return_type) - 1; } - else - return (return_type)-1; return 0; } /* CBC decrypt a number of blocks (input and return an IV) */ return_type aes_cbc_decrypt( const unsigned char *in, unsigned char *out, - int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] ) + int n_block, unsigned char iv[N_BLOCK], const aes_context ctx[1] ) { - while(n_block--) - { uint_8t tmp[N_BLOCK]; + while (n_block--) { + uint_8t tmp[N_BLOCK]; memcpy(tmp, in, N_BLOCK); - if(bluedroid_aes_decrypt(in, out, ctx) != EXIT_SUCCESS) - return EXIT_FAILURE; + if (bluedroid_aes_decrypt(in, out, ctx) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } xor_block(out, iv); memcpy(iv, tmp, N_BLOCK); in += N_BLOCK; @@ -671,7 +675,8 @@ return_type aes_cbc_decrypt( const unsigned char *in, unsigned char *out, /* The 'on the fly' encryption key update for for 128 bit keys */ static void update_encrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc ) -{ uint_8t cc; +{ + uint_8t cc; k[0] ^= s_box(k[13]) ^ *rc; k[1] ^= s_box(k[14]); @@ -679,8 +684,7 @@ static void update_encrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc ) k[3] ^= s_box(k[12]); *rc = f2( *rc ); - for(cc = 4; cc < 16; cc += 4 ) - { + for (cc = 4; cc < 16; cc += 4 ) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -691,14 +695,16 @@ static void update_encrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc ) /* Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], - const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] ) -{ uint_8t s1[N_BLOCK], r, rc = 1; + const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] ) +{ + uint_8t s1[N_BLOCK], r, rc = 1; - if(o_key != key) + if (o_key != key) { block_copy( o_key, key ); + } copy_and_key( s1, in, o_key ); - for( r = 1 ; r < 10 ; ++r ) + for ( r = 1 ; r < 10 ; ++r ) #if defined( VERSION_1 ) { mix_sub_columns( s1 ); @@ -706,7 +712,8 @@ void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], unsigned char o add_round_key( s1, o_key ); } #else - { uint_8t s2[N_BLOCK]; + { + uint_8t s2[N_BLOCK]; mix_sub_columns( s2, s1 ); update_encrypt_key_128( o_key, &rc ); copy_and_key( s1, s2, o_key ); @@ -725,10 +732,10 @@ void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], unsigned char o /* The 'on the fly' decryption key update for for 128 bit keys */ static void update_decrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc ) -{ uint_8t cc; +{ + uint_8t cc; - for( cc = 12; cc > 0; cc -= 4 ) - { + for ( cc = 12; cc > 0; cc -= 4 ) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -744,16 +751,17 @@ static void update_decrypt_key_128( uint_8t k[N_BLOCK], uint_8t *rc ) /* Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */ void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], - const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] ) + const unsigned char key[N_BLOCK], unsigned char o_key[N_BLOCK] ) { uint_8t s1[N_BLOCK], r, rc = 0x6c; - if(o_key != key) + if (o_key != key) { block_copy( o_key, key ); + } copy_and_key( s1, in, o_key ); inv_shift_sub_rows( s1 ); - for( r = 10 ; --r ; ) + for ( r = 10 ; --r ; ) #if defined( VERSION_1 ) { update_decrypt_key_128( o_key, &rc ); @@ -761,7 +769,8 @@ void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], unsigned char o inv_mix_sub_columns( s1 ); } #else - { uint_8t s2[N_BLOCK]; + { + uint_8t s2[N_BLOCK]; update_decrypt_key_128( o_key, &rc ); copy_and_key( s2, s1, o_key ); inv_mix_sub_columns( s1, s2 ); @@ -778,7 +787,8 @@ void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], unsigned char o /* The 'on the fly' encryption key update for for 256 bit keys */ static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) -{ uint_8t cc; +{ + uint_8t cc; k[0] ^= s_box(k[29]) ^ *rc; k[1] ^= s_box(k[30]); @@ -786,8 +796,7 @@ static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) k[3] ^= s_box(k[28]); *rc = f2( *rc ); - for(cc = 4; cc < 16; cc += 4) - { + for (cc = 4; cc < 16; cc += 4) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -799,8 +808,7 @@ static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) k[18] ^= s_box(k[14]); k[19] ^= s_box(k[15]); - for( cc = 20; cc < 32; cc += 4 ) - { + for ( cc = 20; cc < 32; cc += 4 ) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -811,35 +819,33 @@ static void update_encrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) /* Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */ void bluedroid_aes_encrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], - const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] ) + const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] ) { uint_8t s1[N_BLOCK], r, rc = 1; - if(o_key != key) - { + if (o_key != key) { block_copy( o_key, key ); block_copy( o_key + 16, key + 16 ); } copy_and_key( s1, in, o_key ); - for( r = 1 ; r < 14 ; ++r ) + for ( r = 1 ; r < 14 ; ++r ) #if defined( VERSION_1 ) { mix_sub_columns(s1); - if( r & 1 ) + if ( r & 1 ) { add_round_key( s1, o_key + 16 ); - else - { + } else { update_encrypt_key_256( o_key, &rc ); add_round_key( s1, o_key ); } } #else - { uint_8t s2[N_BLOCK]; + { + uint_8t s2[N_BLOCK]; mix_sub_columns( s2, s1 ); - if( r & 1 ) + if ( r & 1 ) { copy_and_key( s1, s2, o_key + 16 ); - else - { + } else { update_encrypt_key_256( o_key, &rc ); copy_and_key( s1, s2, o_key ); } @@ -858,10 +864,10 @@ void bluedroid_aes_encrypt_256( const unsigned char in[N_BLOCK], unsigned char o /* The 'on the fly' encryption key update for for 256 bit keys */ static void update_decrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) -{ uint_8t cc; +{ + uint_8t cc; - for(cc = 28; cc > 16; cc -= 4) - { + for (cc = 28; cc > 16; cc -= 4) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -873,8 +879,7 @@ static void update_decrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) k[18] ^= s_box(k[14]); k[19] ^= s_box(k[15]); - for(cc = 12; cc > 0; cc -= 4) - { + for (cc = 12; cc > 0; cc -= 4) { k[cc + 0] ^= k[cc - 4]; k[cc + 1] ^= k[cc - 3]; k[cc + 2] ^= k[cc - 2]; @@ -892,12 +897,11 @@ static void update_decrypt_key_256( uint_8t k[2 * N_BLOCK], uint_8t *rc ) 256 bit keying */ void bluedroid_aes_decrypt_256( const unsigned char in[N_BLOCK], unsigned char out[N_BLOCK], - const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] ) + const unsigned char key[2 * N_BLOCK], unsigned char o_key[2 * N_BLOCK] ) { uint_8t s1[N_BLOCK], r, rc = 0x80; - if(o_key != key) - { + if (o_key != key) { block_copy( o_key, key ); block_copy( o_key + 16, key + 16 ); } @@ -905,27 +909,26 @@ void bluedroid_aes_decrypt_256( const unsigned char in[N_BLOCK], unsigned char o copy_and_key( s1, in, o_key ); inv_shift_sub_rows( s1 ); - for( r = 14 ; --r ; ) + for ( r = 14 ; --r ; ) #if defined( VERSION_1 ) { - if( ( r & 1 ) ) - { + if ( ( r & 1 ) ) { update_decrypt_key_256( o_key, &rc ); add_round_key( s1, o_key + 16 ); - } - else + } else { add_round_key( s1, o_key ); + } inv_mix_sub_columns( s1 ); } #else - { uint_8t s2[N_BLOCK]; - if( ( r & 1 ) ) - { + { + uint_8t s2[N_BLOCK]; + if ( ( r & 1 ) ) { update_decrypt_key_256( o_key, &rc ); copy_and_key( s2, s1, o_key + 16 ); - } - else + } else { copy_and_key( s2, s1, o_key ); + } inv_mix_sub_columns( s1, s2 ); } #endif diff --git a/components/bt/bluedroid/stack/smp/include/aes.h b/components/bt/bluedroid/stack/smp/include/aes.h old mode 100755 new mode 100644 index add242e0a..48495bb17 --- a/components/bt/bluedroid/stack/smp/include/aes.h +++ b/components/bt/bluedroid/stack/smp/include/aes.h @@ -65,8 +65,8 @@ typedef uint_8t return_type; typedef uint_8t length_type; -typedef struct -{ uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; +typedef struct { + uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; uint_8t rnd; } aes_context; @@ -88,27 +88,27 @@ return_type aes_set_key( const unsigned char key[], #if defined( AES_ENC_PREKEYED ) return_type bluedroid_aes_encrypt( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const aes_context ctx[1] ); + unsigned char out[N_BLOCK], + const aes_context ctx[1] ); return_type aes_cbc_encrypt( const unsigned char *in, - unsigned char *out, - int n_block, - unsigned char iv[N_BLOCK], - const aes_context ctx[1] ); + unsigned char *out, + int n_block, + unsigned char iv[N_BLOCK], + const aes_context ctx[1] ); #endif #if defined( AES_DEC_PREKEYED ) return_type bluedroid_aes_decrypt( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const aes_context ctx[1] ); + unsigned char out[N_BLOCK], + const aes_context ctx[1] ); return_type aes_cbc_decrypt( const unsigned char *in, - unsigned char *out, - int n_block, - unsigned char iv[N_BLOCK], - const aes_context ctx[1] ); + unsigned char *out, + int n_block, + unsigned char iv[N_BLOCK], + const aes_context ctx[1] ); #endif /* The following calls are for 'on the fly' keying. In this case the @@ -133,30 +133,30 @@ return_type aes_cbc_decrypt( const unsigned char *in, #if defined( AES_ENC_128_OTFK ) void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const unsigned char key[N_BLOCK], - uint_8t o_key[N_BLOCK] ); + unsigned char out[N_BLOCK], + const unsigned char key[N_BLOCK], + uint_8t o_key[N_BLOCK] ); #endif #if defined( AES_DEC_128_OTFK ) void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const unsigned char key[N_BLOCK], - unsigned char o_key[N_BLOCK] ); + unsigned char out[N_BLOCK], + const unsigned char key[N_BLOCK], + unsigned char o_key[N_BLOCK] ); #endif #if defined( AES_ENC_256_OTFK ) void bluedroid_aes_encrypt_256( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const unsigned char key[2 * N_BLOCK], - unsigned char o_key[2 * N_BLOCK] ); + unsigned char out[N_BLOCK], + const unsigned char key[2 * N_BLOCK], + unsigned char o_key[2 * N_BLOCK] ); #endif #if defined( AES_DEC_256_OTFK ) void bluedroid_aes_decrypt_256( const unsigned char in[N_BLOCK], - unsigned char out[N_BLOCK], - const unsigned char key[2 * N_BLOCK], - unsigned char o_key[2 * N_BLOCK] ); + unsigned char out[N_BLOCK], + const unsigned char key[2 * N_BLOCK], + unsigned char o_key[2 * N_BLOCK] ); #endif #endif diff --git a/components/bt/bluedroid/stack/smp/include/p_256_ecc_pp.h b/components/bt/bluedroid/stack/smp/include/p_256_ecc_pp.h old mode 100755 new mode 100644 index fd3dc64fe..029a79ff1 --- a/components/bt/bluedroid/stack/smp/include/p_256_ecc_pp.h +++ b/components/bt/bluedroid/stack/smp/include/p_256_ecc_pp.h @@ -16,11 +16,11 @@ * ******************************************************************************/ - /****************************************************************************** - * - * This file contains simple pairing algorithms using Elliptic Curve Cryptography for private public key - * - ******************************************************************************/ +/****************************************************************************** + * + * This file contains simple pairing algorithms using Elliptic Curve Cryptography for private public key + * + ******************************************************************************/ #pragma once diff --git a/components/bt/bluedroid/stack/smp/include/p_256_multprecision.h b/components/bt/bluedroid/stack/smp/include/p_256_multprecision.h old mode 100755 new mode 100644 index 0d1a964c3..ac32320aa --- a/components/bt/bluedroid/stack/smp/include/p_256_multprecision.h +++ b/components/bt/bluedroid/stack/smp/include/p_256_multprecision.h @@ -16,11 +16,11 @@ * ******************************************************************************/ - /****************************************************************************** - * - * This file contains simple pairing algorithms - * - ******************************************************************************/ +/****************************************************************************** + * + * This file contains simple pairing algorithms + * + ******************************************************************************/ #pragma once #include "bt_types.h" @@ -48,13 +48,13 @@ DWORD multiprecision_add(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength); // c void multiprecision_add_mod(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength); DWORD multiprecision_sub(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength); // c=a-b void multiprecision_sub_mod(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength); -void multiprecision_rshift(DWORD * c, DWORD * a, uint32_t keyLength); // c=a>>1, return carrier -void multiprecision_lshift_mod(DWORD * c, DWORD * a, uint32_t keyLength); // c=a<>1, return carrier +void multiprecision_lshift_mod(DWORD *c, DWORD *a, uint32_t keyLength); // c=a<rand */ +/*and saved in p_cb->rand */ #define SMP_SC_PHASE1_CMPLT_EVT (SMP_SELF_DEF_EVT + 16) /* time to start SC phase2 */ #define SMP_SC_CALC_NC_EVT (SMP_SELF_DEF_EVT + 17) /* request to calculate number */ - /* for user check. Used only in the */ - /* numeric compare protocol */ +/* for user check. Used only in the */ +/* numeric compare protocol */ /* Request to display the number for user check to the user.*/ /* Used only in the numeric compare protocol */ #define SMP_SC_DSPL_NC_EVT (SMP_SELF_DEF_EVT + 18) #define SMP_SC_NC_OK_EVT (SMP_SELF_DEF_EVT + 19) /* user confirms 'OK' numeric */ - /*comparison request */ +/*comparison request */ /* both local and peer DHKey Checks are already present - it is used on slave to prevent race condition */ #define SMP_SC_2_DHCK_CHKS_PRES_EVT (SMP_SELF_DEF_EVT + 20) @@ -122,7 +122,7 @@ typedef UINT8 tSMP_ASSO_MODEL; #define SMP_KEYPRESS_NOTIFICATION_EVENT (SMP_SELF_DEF_EVT + 22) #define SMP_SC_OOB_DATA_EVT (SMP_SELF_DEF_EVT + 23) /* SC OOB data from some */ - /* repository is provided */ +/* repository is provided */ #define SMP_CR_LOC_SC_OOB_DATA_EVT (SMP_SELF_DEF_EVT + 24) #define SMP_MAX_EVT SMP_CR_LOC_SC_OOB_DATA_EVT @@ -133,8 +133,7 @@ typedef UINT8 tSMP_EVENT; #define SMP_SEC_KEY_MASK 0x00ff /* SMP pairing state */ -enum -{ +enum { SMP_STATE_IDLE, SMP_STATE_WAIT_APP_RSP, SMP_STATE_SEC_REQ_PENDING, @@ -187,8 +186,7 @@ typedef UINT8 tSMP_STATE; typedef UINT8 tSMP_BR_EVENT; /* SMP over BR/EDR pairing states */ -enum -{ +enum { SMP_BR_STATE_IDLE = SMP_STATE_IDLE, SMP_BR_STATE_WAIT_APP_RSP, SMP_BR_STATE_PAIR_REQ_RSP, @@ -198,8 +196,7 @@ enum typedef UINT8 tSMP_BR_STATE; /* random and encrption activity state */ -enum -{ +enum { SMP_GEN_COMPARE = 1, SMP_GEN_CONFIRM, @@ -217,8 +214,7 @@ enum SMP_GEN_NONCE_8_15 }; -enum -{ +enum { SMP_KEY_TYPE_TK, SMP_KEY_TYPE_CFM, SMP_KEY_TYPE_CMP, @@ -226,20 +222,18 @@ enum SMP_KEY_TYPE_STK, SMP_KEY_TYPE_LTK }; -typedef struct -{ +typedef struct { UINT8 key_type; - UINT8* p_data; -}tSMP_KEY; + UINT8 *p_data; +} tSMP_KEY; -typedef union -{ +typedef union { UINT8 *p_data; /* UINT8 type data pointer */ tSMP_KEY key; UINT16 reason; UINT32 passkey; tSMP_OOB_DATA_TYPE req_oob_type; -}tSMP_INT_DATA; +} tSMP_INT_DATA; /* internal status mask */ #define SMP_PAIR_FLAGS_WE_STARTED_DD (1) @@ -258,15 +252,13 @@ typedef union #define SMP_ENCRYT_DATA_SIZE 16 #define SMP_ECNCRPYT_STATUS HCI_SUCCESS -typedef struct -{ +typedef struct { BD_ADDR bd_addr; - BT_HDR* p_copy; + BT_HDR *p_copy; } tSMP_REQ_Q_ENTRY; /* SMP control block */ -typedef struct -{ +typedef struct { tSMP_CALLBACK *p_callback; TIMER_LIST_ENT rsp_timer_ent; UINT8 trace_level; @@ -308,7 +300,7 @@ typedef struct tSMP_AUTH_REQ peer_auth_req; tSMP_AUTH_REQ loc_auth_req; BOOLEAN secure_connections_only_mode_required;/* TRUE if locally SM is required to operate */ - /* either in Secure Connections mode or not at all */ + /* either in Secure Connections mode or not at all */ tSMP_ASSO_MODEL selected_association_model; BOOLEAN le_secure_connections_mode_is_used; BOOLEAN le_sc_kp_notif_is_used; @@ -339,7 +331,7 @@ typedef struct UINT8 rcvd_cmd_len; UINT16 total_tx_unacked; BOOLEAN wait_for_authorization_complete; -}tSMP_CB; +} tSMP_CB; /* Server Action functions are of this type */ typedef void (*tSMP_ACT)(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); @@ -374,19 +366,19 @@ extern void smp_set_passk_entry_fail(BOOLEAN enable); extern void smp_set_oob_fail(BOOLEAN enable); extern void smp_set_peer_sc_notif(BOOLEAN enable); extern void smp_aes_cmac_rfc4493_chk (UINT8 *key, UINT8 *msg, UINT8 msg_len, - UINT8 mac_len, UINT8 *mac); + UINT8 mac_len, UINT8 *mac); extern void smp_f4_calc_chk (UINT8 *U, UINT8 *V, UINT8 *X, UINT8 *Z, UINT8 *mac); extern void smp_g2_calc_chk (UINT8 *U, UINT8 *V, UINT8 *X, UINT8 *Y); extern void smp_h6_calc_chk (UINT8 *key, UINT8 *key_id, UINT8 *mac); extern void smp_f5_key_calc_chk (UINT8 *w, UINT8 *mac); extern void smp_f5_mackey_or_ltk_calc_chk(UINT8 *t, UINT8 *counter, - UINT8 *key_id, UINT8 *n1, - UINT8 *n2, UINT8 *a1, UINT8 *a2, - UINT8 *length, UINT8 *mac); + UINT8 *key_id, UINT8 *n1, + UINT8 *n2, UINT8 *a1, UINT8 *a2, + UINT8 *length, UINT8 *mac); extern void smp_f5_calc_chk (UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, - UINT8 *mac_key, UINT8 *ltk); + UINT8 *mac_key, UINT8 *ltk); extern void smp_f6_calc_chk (UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *r, - UINT8 *iocap, UINT8 *a1, UINT8 *a2, UINT8 *mac); + UINT8 *iocap, UINT8 *a1, UINT8 *a2, UINT8 *mac); /* smp_main */ extern void smp_sm_event(tSMP_CB *p_cb, tSMP_EVENT event, void *p_data); extern tSMP_STATE smp_get_state(void); @@ -478,7 +470,7 @@ extern void smp_cb_cleanup(tSMP_CB *p_cb); extern void smp_reset_control_value(tSMP_CB *p_cb); extern void smp_proc_pairing_cmpl(tSMP_CB *p_cb); extern void smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey); -extern void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data); +extern void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 *p_data); extern void smp_rsp_timeout(TIMER_LIST_ENT *p_tle); extern void smp_xor_128(BT_OCTET16 a, BT_OCTET16 b); extern BOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, @@ -520,22 +512,22 @@ extern BOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb); extern void smp_calculate_f4(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 z, UINT8 *c); extern UINT32 smp_calculate_g2(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 *y); extern BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, - UINT8 *mac_key, UINT8 *ltk); + UINT8 *mac_key, UINT8 *ltk); extern BOOLEAN smp_calculate_f5_mackey_or_long_term_key(UINT8 *t, UINT8 *counter, - UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, - UINT8 *a2, UINT8 *length, UINT8 *mac); + UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, + UINT8 *a2, UINT8 *length, UINT8 *mac); extern BOOLEAN smp_calculate_f5_key(UINT8 *w, UINT8 *t); extern BOOLEAN smp_calculate_f6(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *r, UINT8 *iocap, - UINT8 *a1, UINT8 *a2, UINT8 *f3); + UINT8 *a1, UINT8 *a2, UINT8 *f3); extern BOOLEAN smp_calculate_h6(UINT8 *w, UINT8 *keyid, UINT8 *h2); #if SMP_DEBUG == TRUE extern void smp_debug_print_nbyte_little_endian (UINT8 *p, const UINT8 *key_name, - UINT8 len); + UINT8 len); #endif /* smp_cmac.c */ extern BOOLEAN aes_cipher_msg_auth_code(BT_OCTET16 key, UINT8 *input, UINT16 length, - UINT16 tlen, UINT8 *p_signature); + UINT16 tlen, UINT8 *p_signature); extern void print128(BT_OCTET16 x, const UINT8 *key_name); #endif diff --git a/components/bt/bluedroid/stack/smp/p_256_curvepara.c b/components/bt/bluedroid/stack/smp/p_256_curvepara.c old mode 100755 new mode 100644 index 131e76935..1761d5848 --- a/components/bt/bluedroid/stack/smp/p_256_curvepara.c +++ b/components/bt/bluedroid/stack/smp/p_256_curvepara.c @@ -16,11 +16,11 @@ * ******************************************************************************/ - /****************************************************************************** - * - * This file contains simple pairing algorithms - * - ******************************************************************************/ +/****************************************************************************** + * + * This file contains simple pairing algorithms + * + ******************************************************************************/ #include #include "p_256_ecc_pp.h" @@ -29,8 +29,7 @@ void p_256_init_curve(UINT32 keyLength) { elliptic_curve_t *ec; - if(keyLength == KEY_LENGTH_DWORDS_P256) - { + if (keyLength == KEY_LENGTH_DWORDS_P256) { ec = &curve_p256; ec->p[7] = 0xFFFFFFFF; diff --git a/components/bt/bluedroid/stack/smp/p_256_ecc_pp.c b/components/bt/bluedroid/stack/smp/p_256_ecc_pp.c old mode 100755 new mode 100644 index d203adc86..991b6fd75 --- a/components/bt/bluedroid/stack/smp/p_256_ecc_pp.c +++ b/components/bt/bluedroid/stack/smp/p_256_ecc_pp.c @@ -16,11 +16,11 @@ * ******************************************************************************/ - /****************************************************************************** - * - * This file contains simple pairing algorithms using Elliptic Curve Cryptography for private public key - * - ******************************************************************************/ +/****************************************************************************** + * + * This file contains simple pairing algorithms using Elliptic Curve Cryptography for private public key + * + ******************************************************************************/ //#include //#include #include @@ -53,14 +53,13 @@ static void ECC_Double(Point *q, Point *p, uint32_t keyLength) DWORD *z1; DWORD *z3; - if (multiprecision_iszero(p->z, keyLength)) - { + if (multiprecision_iszero(p->z, keyLength)) { multiprecision_init(q->z, keyLength); return; // return infinity } - x1=p->x; y1=p->y; z1=p->z; - x3=q->x; y3=q->y; z3=q->z; + x1 = p->x; y1 = p->y; z1 = p->z; + x3 = q->x; y3 = q->y; z3 = q->z; multiprecision_mersenns_squa_mod(t1, z1, keyLength); // t1=z1^2 multiprecision_sub_mod(t2, x1, t1, keyLength); // t2=x1-t1 @@ -102,20 +101,18 @@ static void ECC_Add(Point *r, Point *p, Point *q, uint32_t keyLength) DWORD *z2; DWORD *z3; - x1=p->x; y1=p->y; z1=p->z; - x2=q->x; y2=q->y; z2=q->z; - x3=r->x; y3=r->y; z3=r->z; + x1 = p->x; y1 = p->y; z1 = p->z; + x2 = q->x; y2 = q->y; z2 = q->z; + x3 = r->x; y3 = r->y; z3 = r->z; // if Q=infinity, return p - if (multiprecision_iszero(z2, keyLength)) - { + if (multiprecision_iszero(z2, keyLength)) { p_256_copy_point(r, p); return; } // if P=infinity, return q - if (multiprecision_iszero(z1, keyLength)) - { + if (multiprecision_iszero(z1, keyLength)) { p_256_copy_point(r, q); return; } @@ -128,15 +125,11 @@ static void ECC_Add(Point *r, Point *p, Point *q, uint32_t keyLength) multiprecision_sub_mod(t1, t1, x1, keyLength); // t1=t1-x1 multiprecision_sub_mod(t2, t2, y1, keyLength); // t2=t2-y1 - if (multiprecision_iszero(t1, keyLength)) - { - if (multiprecision_iszero(t2, keyLength)) - { + if (multiprecision_iszero(t1, keyLength)) { + if (multiprecision_iszero(t2, keyLength)) { ECC_Double(r, q, keyLength) ; return; - } - else - { + } else { multiprecision_init(z3, keyLength); return; // return infinity } @@ -160,59 +153,51 @@ static void ECC_Add(Point *r, Point *p, Point *q, uint32_t keyLength) static void ECC_NAF(uint8_t *naf, uint32_t *NumNAF, DWORD *k, uint32_t keyLength) { uint32_t sign; - int i=0; + int i = 0; int j; uint32_t var; - while ((var = multiprecision_most_signbits(k, keyLength))>=1) - { - if (k[0] & 0x01) // k is odd - { + while ((var = multiprecision_most_signbits(k, keyLength)) >= 1) { + if (k[0] & 0x01) { // k is odd sign = (k[0] & 0x03); // 1 or 3 // k = k-naf[i] - if (sign == 1) + if (sign == 1) { k[0] = k[0] & 0xFFFFFFFE; - else - { + } else { k[0] = k[0] + 1; - if (k[0] == 0) //overflow - { + if (k[0] == 0) { //overflow j = 1; - do - { + do { k[j]++; - } while (k[j++]==0); //overflow + } while (k[j++] == 0); //overflow } } - } - else + } else { sign = 0; + } multiprecision_rshift(k, k, keyLength); naf[i / 4] |= (sign) << ((i % 4) * 2); i++; } - *NumNAF=i; + *NumNAF = i; } // Binary Non-Adjacent Form for point multiplication void ECC_PointMult_Bin_NAF(Point *q, Point *p, DWORD *n, uint32_t keyLength) { uint32_t sign; - UINT8 naf[256 / 4 +1]; + UINT8 naf[256 / 4 + 1]; uint32_t NumNaf; Point minus_p; Point r; DWORD *modp; - if (keyLength == KEY_LENGTH_DWORDS_P256) - { + if (keyLength == KEY_LENGTH_DWORDS_P256) { modp = curve_p256.p; - } - else - { + } else { modp = curve.p; } @@ -228,25 +213,21 @@ void ECC_PointMult_Bin_NAF(Point *q, Point *p, DWORD *n, uint32_t keyLength) multiprecision_sub(minus_p.y, modp, p->y, keyLength); multiprecision_init(minus_p.z, keyLength); - minus_p.z[0]=1; + minus_p.z[0] = 1; // NAF memset(naf, 0, sizeof(naf)); ECC_NAF(naf, &NumNaf, n, keyLength); - for (int i = NumNaf - 1; i >= 0; i--) - { + for (int i = NumNaf - 1; i >= 0; i--) { p_256_copy_point(&r, q); ECC_Double(q, &r, keyLength); sign = (naf[i / 4] >> ((i % 4) * 2)) & 0x03; - if (sign == 1) - { + if (sign == 1) { p_256_copy_point(&r, q); ECC_Add(q, &r, p, keyLength); - } - else if (sign == 3) - { + } else if (sign == 3) { p_256_copy_point(&r, q); ECC_Add(q, &r, &minus_p, keyLength); } diff --git a/components/bt/bluedroid/stack/smp/p_256_multprecision.c b/components/bt/bluedroid/stack/smp/p_256_multprecision.c old mode 100755 new mode 100644 index f93980957..2c11474d4 --- a/components/bt/bluedroid/stack/smp/p_256_multprecision.c +++ b/components/bt/bluedroid/stack/smp/p_256_multprecision.c @@ -16,11 +16,11 @@ * ******************************************************************************/ - /****************************************************************************** - * - * This file contains simple pairing algorithms - * - ******************************************************************************/ +/****************************************************************************** + * + * This file contains simple pairing algorithms + * + ******************************************************************************/ #include #include "bt_target.h" @@ -29,24 +29,27 @@ void multiprecision_init(DWORD *c, uint32_t keyLength) { - for (uint32_t i = 0; i < keyLength; i++) + for (uint32_t i = 0; i < keyLength; i++) { c[i] = 0; + } } void multiprecision_copy(DWORD *c, DWORD *a, uint32_t keyLength) { - for (uint32_t i = 0; i < keyLength; i++) + for (uint32_t i = 0; i < keyLength; i++) { c[i] = a[i]; + } } int multiprecision_compare(DWORD *a, DWORD *b, uint32_t keyLength) { - for (int i = keyLength - 1; i >= 0; i--) - { - if (a[i] > b[i]) + for (int i = keyLength - 1; i >= 0; i--) { + if (a[i] > b[i]) { return 1; - if (a[i] < b[i]) + } + if (a[i] < b[i]) { return -1; + } } return 0; } @@ -54,8 +57,9 @@ int multiprecision_compare(DWORD *a, DWORD *b, uint32_t keyLength) int multiprecision_iszero(DWORD *a, uint32_t keyLength) { for (uint32_t i = 0; i < keyLength; i++) - if (a[i]) + if (a[i]) { return 0; + } return 1; } @@ -64,8 +68,9 @@ UINT32 multiprecision_dword_bits(DWORD a) { uint32_t i; for (i = 0; i < DWORD_BITS; i++, a >>= 1) - if (a == 0) + if (a == 0) { break; + } return i; } @@ -74,8 +79,9 @@ UINT32 multiprecision_most_signdwords(DWORD *a, uint32_t keyLength) { int i; for (i = keyLength - 1; i >= 0; i--) - if (a[i]) - break; + if (a[i]) { + break; + } return (i + 1); } @@ -84,11 +90,12 @@ UINT32 multiprecision_most_signbits(DWORD *a, uint32_t keyLength) int aMostSignDWORDs; aMostSignDWORDs = multiprecision_most_signdwords(a, keyLength); - if (aMostSignDWORDs == 0) + if (aMostSignDWORDs == 0) { return 0; + } - return (((aMostSignDWORDs-1) << DWORD_BITS_SHIFT) + - multiprecision_dword_bits(a[aMostSignDWORDs-1]) ); + return (((aMostSignDWORDs - 1) << DWORD_BITS_SHIFT) + + multiprecision_dword_bits(a[aMostSignDWORDs - 1]) ); } DWORD multiprecision_add(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) @@ -96,14 +103,13 @@ DWORD multiprecision_add(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) DWORD carrier; DWORD temp; - carrier=0; - for (uint32_t i = 0; i < keyLength; i++) - { + carrier = 0; + for (uint32_t i = 0; i < keyLength; i++) { temp = a[i] + carrier; carrier = (temp < carrier); temp += b[i]; carrier |= (temp < b[i]); - c[i]=temp; + c[i] = temp; } return carrier; @@ -115,9 +121,8 @@ DWORD multiprecision_sub(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) DWORD borrow; DWORD temp; - borrow=0; - for (uint32_t i=0; i < keyLength; i++) - { + borrow = 0; + for (uint32_t i = 0; i < keyLength; i++) { temp = a[i] - borrow; borrow = (temp > a[i]); c[i] = temp - b[i]; @@ -128,35 +133,29 @@ DWORD multiprecision_sub(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) } // c = a << 1 -void multiprecision_lshift_mod(DWORD * c, DWORD * a, uint32_t keyLength) +void multiprecision_lshift_mod(DWORD *c, DWORD *a, uint32_t keyLength) { DWORD carrier; DWORD *modp; - if (keyLength == KEY_LENGTH_DWORDS_P192) - { + if (keyLength == KEY_LENGTH_DWORDS_P192) { modp = curve.p; - } - else if (keyLength == KEY_LENGTH_DWORDS_P256) - { + } else if (keyLength == KEY_LENGTH_DWORDS_P256) { modp = curve_p256.p; - } - else + } else { return; + } carrier = multiprecision_lshift(c, a, keyLength); - if (carrier) - { + if (carrier) { multiprecision_sub(c, c, modp, keyLength); - } - else if (multiprecision_compare(c, modp, keyLength)>=0) - { + } else if (multiprecision_compare(c, modp, keyLength) >= 0) { multiprecision_sub(c, c, modp, keyLength); } } // c=a>>1 -void multiprecision_rshift(DWORD * c, DWORD * a, uint32_t keyLength) +void multiprecision_rshift(DWORD *c, DWORD *a, uint32_t keyLength) { int j; DWORD b = 1; @@ -165,8 +164,7 @@ void multiprecision_rshift(DWORD * c, DWORD * a, uint32_t keyLength) DWORD carrier = 0; DWORD temp; - for (int i = keyLength-1; i >= 0; i--) - { + for (int i = keyLength - 1; i >= 0; i--) { temp = a[i]; // in case of c==a c[i] = (temp >> b) | carrier; carrier = temp << j; @@ -176,15 +174,12 @@ void multiprecision_rshift(DWORD * c, DWORD * a, uint32_t keyLength) // Curve specific optimization when p is a pseudo-Mersenns prime, p=2^(KEY_LENGTH_BITS)-omega void multiprecision_mersenns_mult_mod(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) { - DWORD cc[2*KEY_LENGTH_DWORDS_P256]; + DWORD cc[2 * KEY_LENGTH_DWORDS_P256]; multiprecision_mult(cc, a, b, keyLength); - if (keyLength == 6) - { + if (keyLength == 6) { multiprecision_fast_mod(c, cc); - } - else if (keyLength == 8) - { + } else if (keyLength == 8) { multiprecision_fast_mod_P256(c, cc); } } @@ -201,24 +196,18 @@ void multiprecision_add_mod(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) DWORD carrier; DWORD *modp; - if (keyLength == KEY_LENGTH_DWORDS_P192) - { + if (keyLength == KEY_LENGTH_DWORDS_P192) { modp = curve.p; - } - else if (keyLength == KEY_LENGTH_DWORDS_P256) - { + } else if (keyLength == KEY_LENGTH_DWORDS_P256) { modp = curve_p256.p; - } - else + } else { return; + } carrier = multiprecision_add(c, a, b, keyLength); - if (carrier) - { + if (carrier) { multiprecision_sub(c, c, modp, keyLength); - } - else if (multiprecision_compare(c, modp, keyLength) >= 0) - { + } else if (multiprecision_compare(c, modp, keyLength) >= 0) { multiprecision_sub(c, c, modp, keyLength); } } @@ -229,24 +218,22 @@ void multiprecision_sub_mod(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) DWORD borrow; DWORD *modp; - if (keyLength == KEY_LENGTH_DWORDS_P192) - { + if (keyLength == KEY_LENGTH_DWORDS_P192) { modp = curve.p; - } - else if(keyLength == KEY_LENGTH_DWORDS_P256) - { + } else if (keyLength == KEY_LENGTH_DWORDS_P256) { modp = curve_p256.p; - } - else + } else { return; + } borrow = multiprecision_sub(c, a, b, keyLength); - if(borrow) + if (borrow) { multiprecision_add(c, c, modp, keyLength); + } } // c=a<> j; @@ -276,11 +262,9 @@ void multiprecision_mult(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) multiprecision_init(c, keyLength); //assume little endian right now - for (uint32_t i = 0; i < keyLength; i++) - { + for (uint32_t i = 0; i < keyLength; i++) { U = 0; - for (uint32_t j = 0; j < keyLength; j++) - { + for (uint32_t j = 0; j < keyLength; j++) { uint64_t result; result = ((UINT64)a[i]) * ((uint64_t) b[j]); W = result >> 32; @@ -288,11 +272,11 @@ void multiprecision_mult(DWORD *c, DWORD *a, DWORD *b, uint32_t keyLength) V = V + U; U = (V < U); U += W; - V = V + c[i+j]; - U += (V < c[i+j]); - c[i+j] = V; + V = V + c[i + j]; + U += (V < c[i + j]); + c[i + j] = V; } - c[i+keyLength] = U; + c[i + keyLength] = U; } } @@ -303,7 +287,7 @@ void multiprecision_fast_mod(DWORD *c, DWORD *a) DWORD *modp = curve.p; c[0] = a[0] + a[6]; - U=c[0] < a[0]; + U = c[0] < a[0]; c[0] += a[10]; U += c[0] < a[10]; @@ -312,7 +296,7 @@ void multiprecision_fast_mod(DWORD *c, DWORD *a) c[1] += a[7]; U += c[1] < a[7]; c[1] += a[11]; - U += c[1]< a[11]; + U += c[1] < a[11]; c[2] = a[2] + U; U = c[2] < a[2]; @@ -323,7 +307,7 @@ void multiprecision_fast_mod(DWORD *c, DWORD *a) c[2] += a[10]; U += c[2] < a[10]; - c[3] = a[3]+U; + c[3] = a[3] + U; U = c[3] < a[3]; c[3] += a[7]; U += c[3] < a[7]; @@ -332,14 +316,14 @@ void multiprecision_fast_mod(DWORD *c, DWORD *a) c[3] += a[11]; U += c[3] < a[11]; - c[4] = a[4]+U; + c[4] = a[4] + U; U = c[4] < a[4]; c[4] += a[8]; U += c[4] < a[8]; c[4] += a[10]; U += c[4] < a[10]; - c[5] = a[5]+U; + c[5] = a[5] + U; U = c[5] < a[5]; c[5] += a[9]; U += c[5] < a[9]; @@ -361,12 +345,9 @@ void multiprecision_fast_mod(DWORD *c, DWORD *a) c[5] += V; V = c[5] < V; - if (V) - { + if (V) { multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P192); - } - else if(multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P192) >= 0) - { + } else if (multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P192) >= 0) { multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P192); } } @@ -442,15 +423,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UA; c[0] -= A; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[1] < UU); c[1] = a[1] - UU; - } - else - { + } else { c[1] = a[1] + U; U = (c[1] < a[1]); } @@ -462,15 +440,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UB; c[1] -= B; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[2] < UU); c[2] = a[2] - UU; - } - else - { + } else { c[2] = a[2] + U; U = (c[2] < a[2]); } @@ -482,15 +457,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UC; c[2] -= C; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[3] < UU); c[3] = a[3] - UU; - } - else - { + } else { c[3] = a[3] + U; U = (c[3] < a[3]); } @@ -510,15 +482,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UE; c[3] -= E; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[4] < UU); c[4] = a[4] - UU; - } - else - { + } else { c[4] = a[4] + U; U = (c[4] < a[4]); } @@ -536,15 +505,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UF; c[4] -= F; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[5] < UU); c[5] = a[5] - UU; - } - else - { + } else { c[5] = a[5] + U; U = (c[5] < a[5]); } @@ -560,15 +526,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UG; c[5] -= G; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[6] < UU); c[6] = a[6] - UU; - } - else - { + } else { c[6] = a[6] + U; U = (c[6] < a[6]); } @@ -586,15 +549,12 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UE; c[6] -= E; - if (U & 0x80000000) - { + if (U & 0x80000000) { DWORD UU; UU = 0 - U; U = (a[7] < UU); c[7] = a[7] - UU; - } - else - { + } else { c[7] = a[7] + U; U = (c[7] < a[7]); } @@ -611,41 +571,34 @@ void multiprecision_fast_mod_P256(DWORD *c, DWORD *a) U -= UD; c[7] -= D; - if (U & 0x80000000) - { - while (U) - { + if (U & 0x80000000) { + while (U) { multiprecision_add(c, c, modp, KEY_LENGTH_DWORDS_P256); U++; } - } - else if (U) - { - while (U) - { + } else if (U) { + while (U) { multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P256); U--; } } - if (multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P256)>=0) + if (multiprecision_compare(c, modp, KEY_LENGTH_DWORDS_P256) >= 0) { multiprecision_sub(c, c, modp, KEY_LENGTH_DWORDS_P256); + } } void multiprecision_inv_mod(DWORD *aminus, DWORD *u, uint32_t keyLength) { DWORD v[KEY_LENGTH_DWORDS_P256]; - DWORD A[KEY_LENGTH_DWORDS_P256+1]; - DWORD C[KEY_LENGTH_DWORDS_P256+1]; + DWORD A[KEY_LENGTH_DWORDS_P256 + 1]; + DWORD C[KEY_LENGTH_DWORDS_P256 + 1]; DWORD *modp; - if(keyLength == KEY_LENGTH_DWORDS_P256) - { + if (keyLength == KEY_LENGTH_DWORDS_P256) { modp = curve_p256.p; - } - else - { + } else { modp = curve.p; } @@ -654,51 +607,42 @@ void multiprecision_inv_mod(DWORD *aminus, DWORD *u, uint32_t keyLength) multiprecision_init(C, keyLength); A[0] = 1; - while (!multiprecision_iszero(u, keyLength)) - { - while (!(u[0] & 0x01)) // u is even - { + while (!multiprecision_iszero(u, keyLength)) { + while (!(u[0] & 0x01)) { // u is even multiprecision_rshift(u, u, keyLength); - if(!(A[0] & 0x01)) // A is even + if (!(A[0] & 0x01)) { // A is even multiprecision_rshift(A, A, keyLength); - else - { - A[keyLength]=multiprecision_add(A, A, modp, keyLength); // A =A+p + } else { + A[keyLength] = multiprecision_add(A, A, modp, keyLength); // A =A+p multiprecision_rshift(A, A, keyLength); - A[keyLength-1] |= (A[keyLength]<<31); + A[keyLength - 1] |= (A[keyLength] << 31); } } - while (!(v[0] & 0x01)) // v is even - { + while (!(v[0] & 0x01)) { // v is even multiprecision_rshift(v, v, keyLength); - if (!(C[0] & 0x01)) // C is even - { + if (!(C[0] & 0x01)) { // C is even multiprecision_rshift(C, C, keyLength); - } - else - { + } else { C[keyLength] = multiprecision_add(C, C, modp, keyLength); // C =C+p multiprecision_rshift(C, C, keyLength); - C[keyLength-1] |= (C[keyLength] << 31); + C[keyLength - 1] |= (C[keyLength] << 31); } } - if (multiprecision_compare(u, v, keyLength) >= 0) - { + if (multiprecision_compare(u, v, keyLength) >= 0) { multiprecision_sub(u, u, v, keyLength); multiprecision_sub_mod(A, A, C, keyLength); - } - else - { + } else { multiprecision_sub(v, v, u, keyLength); multiprecision_sub_mod(C, C, A, keyLength); } } - if (multiprecision_compare(C, modp, keyLength) >= 0) + if (multiprecision_compare(C, modp, keyLength) >= 0) { multiprecision_sub(aminus, C, modp, keyLength); - else + } else { multiprecision_copy(aminus, C, keyLength); + } } diff --git a/components/bt/bluedroid/stack/smp/smp_act.c b/components/bt/bluedroid/stack/smp/smp_act.c old mode 100755 new mode 100644 index f7b7ce24c..a3f0f9f0b --- a/components/bt/bluedroid/stack/smp/smp_act.c +++ b/components/bt/bluedroid/stack/smp/smp_act.c @@ -25,26 +25,26 @@ //#include "utils/include/bt_utils.h" #if SMP_INCLUDED == TRUE -const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = -{ +const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = { /* initiator */ - {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, /* Display Only */ + { {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, /* Display Only */ {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, /* SMP_CAP_IO = 1 */ {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, /* keyboard only */ {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY},/* No Input No Output */ - {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}}, /* keyboard display */ + {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF} + }, /* keyboard display */ /* responder */ - {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, /* Display Only */ + { {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, /* Display Only */ {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, /* SMP_CAP_IO = 1 */ {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, /* keyboard only */ {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY},/* No Input No Output */ - {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}} /* keyboard display */ + {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_KEY_NOTIF, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY} + } /* keyboard display */ /* display only */ /*SMP_CAP_IO = 1 */ /* keyboard only */ /* No InputOutput */ /* keyboard display */ }; #define SMP_KEY_DIST_TYPE_MAX 4 -const tSMP_ACT smp_distribute_act [] = -{ +const tSMP_ACT smp_distribute_act [] = { smp_generate_ltk, smp_send_id_info, smp_generate_csrk, @@ -54,8 +54,7 @@ const tSMP_ACT smp_distribute_act [] = static bool lmp_version_below(BD_ADDR bda, uint8_t version) { tACL_CONN *acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE); - if (acl == NULL || acl->lmp_version == 0) - { + if (acl == NULL || acl->lmp_version == 0) { SMP_TRACE_WARNING("%s cannot retrieve LMP version...", __func__); return false; } @@ -70,35 +69,31 @@ static bool lmp_version_below(BD_ADDR bda, uint8_t version) static void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv) { SMP_TRACE_DEBUG("%s before update role=%d recv=%d local_i_key = %02x, local_r_key = %02x\n", - __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key); + __func__, p_cb->role, recv, p_cb->local_i_key, p_cb->local_r_key); if (((p_cb->le_secure_connections_mode_is_used) || - (p_cb->smp_over_br)) && - ((key_type == SMP_SEC_KEY_TYPE_ENC) || (key_type == SMP_SEC_KEY_TYPE_LK))) - { + (p_cb->smp_over_br)) && + ((key_type == SMP_SEC_KEY_TYPE_ENC) || (key_type == SMP_SEC_KEY_TYPE_LK))) { /* in LE SC mode LTK, CSRK and BR/EDR LK are derived locally instead of ** being exchanged with the peer */ p_cb->local_i_key &= ~key_type; p_cb->local_r_key &= ~key_type; - } - else - if (p_cb->role == HCI_ROLE_SLAVE) - { - if (recv) + } else if (p_cb->role == HCI_ROLE_SLAVE) { + if (recv) { p_cb->local_i_key &= ~key_type; - else + } else { p_cb->local_r_key &= ~key_type; - } - else - { - if (recv) + } + } else { + if (recv) { p_cb->local_r_key &= ~key_type; - else + } else { p_cb->local_i_key &= ~key_type; + } } SMP_TRACE_DEBUG("updated local_i_key = %02x, local_r_key = %02x\n", p_cb->local_i_key, - p_cb->local_r_key); + p_cb->local_r_key); } /******************************************************************************* @@ -110,116 +105,108 @@ void smp_send_app_cback(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) tSMP_EVT_DATA cb_data; tSMP_STATUS callback_rc; SMP_TRACE_DEBUG("%s p_cb->cb_evt=%d\n", __func__, p_cb->cb_evt); - if (p_cb->p_callback && p_cb->cb_evt != 0) - { - switch (p_cb->cb_evt) - { - case SMP_IO_CAP_REQ_EVT: - cb_data.io_req.auth_req = p_cb->peer_auth_req; - cb_data.io_req.oob_data = SMP_OOB_NONE; - cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS; - cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; - cb_data.io_req.init_keys = p_cb->local_i_key ; - cb_data.io_req.resp_keys = p_cb->local_r_key ; - SMP_TRACE_WARNING ( "io_cap = %d",cb_data.io_req.io_cap); - break; + if (p_cb->p_callback && p_cb->cb_evt != 0) { + switch (p_cb->cb_evt) { + case SMP_IO_CAP_REQ_EVT: + cb_data.io_req.auth_req = p_cb->peer_auth_req; + cb_data.io_req.oob_data = SMP_OOB_NONE; + cb_data.io_req.io_cap = SMP_DEFAULT_IO_CAPS; + cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; + cb_data.io_req.init_keys = p_cb->local_i_key ; + cb_data.io_req.resp_keys = p_cb->local_r_key ; + SMP_TRACE_WARNING ( "io_cap = %d", cb_data.io_req.io_cap); + break; - case SMP_NC_REQ_EVT: - cb_data.passkey = p_data->passkey; - break; - case SMP_SC_OOB_REQ_EVT: - cb_data.req_oob_type = p_data->req_oob_type; - break; - case SMP_SC_LOC_OOB_DATA_UP_EVT: - cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data; - break; + case SMP_NC_REQ_EVT: + cb_data.passkey = p_data->passkey; + break; + case SMP_SC_OOB_REQ_EVT: + cb_data.req_oob_type = p_data->req_oob_type; + break; + case SMP_SC_LOC_OOB_DATA_UP_EVT: + cb_data.loc_oob_data = p_cb->sc_oob_data.loc_oob_data; + break; - case SMP_BR_KEYS_REQ_EVT: - cb_data.io_req.auth_req = 0; - cb_data.io_req.oob_data = SMP_OOB_NONE; - cb_data.io_req.io_cap = 0; - cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; - cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY; - cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY; - break; + case SMP_BR_KEYS_REQ_EVT: + cb_data.io_req.auth_req = 0; + cb_data.io_req.oob_data = SMP_OOB_NONE; + cb_data.io_req.io_cap = 0; + cb_data.io_req.max_key_size = SMP_MAX_ENC_KEY_SIZE; + cb_data.io_req.init_keys = SMP_BR_SEC_DEFAULT_KEY; + cb_data.io_req.resp_keys = SMP_BR_SEC_DEFAULT_KEY; + break; - default: - break; + default: + break; } callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data); - SMP_TRACE_DEBUG("callback_rc=%d p_cb->cb_evt=%d\n",callback_rc, p_cb->cb_evt ); + SMP_TRACE_DEBUG("callback_rc=%d p_cb->cb_evt=%d\n", callback_rc, p_cb->cb_evt ); - if (callback_rc == SMP_SUCCESS) - { - switch (p_cb->cb_evt) - { - case SMP_IO_CAP_REQ_EVT: - p_cb->loc_auth_req = cb_data.io_req.auth_req; - p_cb->local_io_capability = cb_data.io_req.io_cap; - p_cb->loc_oob_flag = cb_data.io_req.oob_data; - p_cb->loc_enc_size = cb_data.io_req.max_key_size; - p_cb->local_i_key = cb_data.io_req.init_keys; - p_cb->local_r_key = cb_data.io_req.resp_keys; + if (callback_rc == SMP_SUCCESS) { + switch (p_cb->cb_evt) { + case SMP_IO_CAP_REQ_EVT: + p_cb->loc_auth_req = cb_data.io_req.auth_req; + p_cb->local_io_capability = cb_data.io_req.io_cap; + p_cb->loc_oob_flag = cb_data.io_req.oob_data; + p_cb->loc_enc_size = cb_data.io_req.max_key_size; + p_cb->local_i_key = cb_data.io_req.init_keys; + p_cb->local_r_key = cb_data.io_req.resp_keys; - if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) - { - SMP_TRACE_WARNING ("Non bonding: No keys will be exchanged"); - p_cb->local_i_key = 0; - p_cb->local_r_key = 0; - } + if (!(p_cb->loc_auth_req & SMP_AUTH_BOND)) { + SMP_TRACE_WARNING ("Non bonding: No keys will be exchanged"); + p_cb->local_i_key = 0; + p_cb->local_r_key = 0; + } - SMP_TRACE_WARNING ( "rcvd auth_req: 0x%02x, io_cap: %d \ + SMP_TRACE_WARNING ( "rcvd auth_req: 0x%02x, io_cap: %d \ loc_oob_flag: %d loc_enc_size: %d," - "local_i_key: 0x%02x, local_r_key: 0x%02x\n", - p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag, - p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key); + "local_i_key: 0x%02x, local_r_key: 0x%02x\n", + p_cb->loc_auth_req, p_cb->local_io_capability, p_cb->loc_oob_flag, + p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key); - p_cb->secure_connections_only_mode_required = - (btm_cb.security_mode == BTM_SEC_MODE_SC) ? TRUE : FALSE; + p_cb->secure_connections_only_mode_required = + (btm_cb.security_mode == BTM_SEC_MODE_SC) ? TRUE : FALSE; - if (p_cb->secure_connections_only_mode_required) - { - p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT; - } + if (p_cb->secure_connections_only_mode_required) { + p_cb->loc_auth_req |= SMP_SC_SUPPORT_BIT; + } - if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) + if (!(p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) || lmp_version_below(p_cb->pairing_bda, HCI_PROTO_VERSION_4_2) || interop_match(INTEROP_DISABLE_LE_SECURE_CONNECTIONS, - (const bt_bdaddr_t *)&p_cb->pairing_bda)) - { - p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT; - p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; - p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; - } - - SMP_TRACE_WARNING("set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x\n", - p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key); - - smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL); - break; - - case SMP_BR_KEYS_REQ_EVT: - p_cb->loc_enc_size = cb_data.io_req.max_key_size; - p_cb->local_i_key = cb_data.io_req.init_keys; - p_cb->local_r_key = cb_data.io_req.resp_keys; - + (const bt_bdaddr_t *)&p_cb->pairing_bda)) { + p_cb->loc_auth_req &= ~SMP_KP_SUPPORT_BIT; p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; + } - SMP_TRACE_WARNING ( "for SMP over BR max_key_size: 0x%02x,\ + SMP_TRACE_WARNING("set auth_req: 0x%02x, local_i_key: 0x%02x, local_r_key: 0x%02x\n", + p_cb->loc_auth_req, p_cb->local_i_key, p_cb->local_r_key); + + smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL); + break; + + case SMP_BR_KEYS_REQ_EVT: + p_cb->loc_enc_size = cb_data.io_req.max_key_size; + p_cb->local_i_key = cb_data.io_req.init_keys; + p_cb->local_r_key = cb_data.io_req.resp_keys; + + p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; + p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; + + SMP_TRACE_WARNING ( "for SMP over BR max_key_size: 0x%02x,\ local_i_key: 0x%02x, local_r_key: 0x%02x\n", - p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key); + p_cb->loc_enc_size, p_cb->local_i_key, p_cb->local_r_key); - smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL); - break; + smp_br_state_machine_event(p_cb, SMP_BR_KEYS_RSP_EVT, NULL); + break; } } } - if (!p_cb->cb_evt && p_cb->discard_sec_req) - { + if (!p_cb->cb_evt && p_cb->discard_sec_req) { p_cb->discard_sec_req = FALSE; smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL); } @@ -238,8 +225,7 @@ void smp_send_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s status=%d failure=%d ", __func__, p_cb->status, p_cb->failure); - if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC && p_cb->status != SMP_SUCCESS) - { + if (p_cb->status <= SMP_MAX_FAIL_RSN_PER_SPEC && p_cb->status != SMP_SUCCESS) { smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb); p_cb->wait_for_authorization_complete = TRUE; } @@ -255,8 +241,9 @@ void smp_send_pair_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); /* erase all keys when master sends pairing req*/ - if (p_dev_rec) + if (p_dev_rec) { btm_sec_clear_ble_keys(p_dev_rec); + } /* do not manipulate the key, let app decide, leave out to BTM to mandate key distribution for bonding case */ smp_send_cmd(SMP_OPCODE_PAIRING_REQ, p_cb); @@ -273,12 +260,12 @@ void smp_send_pair_rsp(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) p_cb->local_i_key &= p_cb->peer_i_key; p_cb->local_r_key &= p_cb->peer_r_key; - if (smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb)) - { - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) + if (smp_send_cmd (SMP_OPCODE_PAIRING_RSP, p_cb)) { + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { smp_use_oob_private_key(p_cb, NULL); - else + } else { smp_decide_association_model(p_cb, NULL); + } } } @@ -412,8 +399,7 @@ void smp_send_csrk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE); - if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) - { + if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) { key.div = p_cb->div; key.sec_level = p_cb->sec_level; key.counter = 0; /* initialize the local counter */ @@ -453,40 +439,36 @@ void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s sec_req_act=0x%x", __func__, sec_req_act); - switch (sec_req_act) - { - case BTM_BLE_SEC_REQ_ACT_ENCRYPT: - SMP_TRACE_DEBUG("%s BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__); - smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); - break; + switch (sec_req_act) { + case BTM_BLE_SEC_REQ_ACT_ENCRYPT: + SMP_TRACE_DEBUG("%s BTM_BLE_SEC_REQ_ACT_ENCRYPT", __func__); + smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); + break; - case BTM_BLE_SEC_REQ_ACT_PAIR: - p_cb->secure_connections_only_mode_required = - (btm_cb.security_mode == BTM_SEC_MODE_SC) ? TRUE : FALSE; + case BTM_BLE_SEC_REQ_ACT_PAIR: + p_cb->secure_connections_only_mode_required = + (btm_cb.security_mode == BTM_SEC_MODE_SC) ? TRUE : FALSE; - /* respond to non SC pairing request as failure in SC only mode */ - if (p_cb->secure_connections_only_mode_required && - (auth_req & SMP_SC_SUPPORT_BIT) == 0) - { - reason = SMP_PAIR_AUTH_FAIL; - smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); - } - else - { - /* initialize local i/r key to be default keys */ - p_cb->peer_auth_req = auth_req; - p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY ; - p_cb->cb_evt = SMP_SEC_REQUEST_EVT; - } - break; + /* respond to non SC pairing request as failure in SC only mode */ + if (p_cb->secure_connections_only_mode_required && + (auth_req & SMP_SC_SUPPORT_BIT) == 0) { + reason = SMP_PAIR_AUTH_FAIL; + smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); + } else { + /* initialize local i/r key to be default keys */ + p_cb->peer_auth_req = auth_req; + p_cb->local_r_key = p_cb->local_i_key = SMP_SEC_DEFAULT_KEY ; + p_cb->cb_evt = SMP_SEC_REQUEST_EVT; + } + break; - case BTM_BLE_SEC_REQ_ACT_DISCARD: - p_cb->discard_sec_req = TRUE; - break; + case BTM_BLE_SEC_REQ_ACT_DISCARD: + p_cb->discard_sec_req = TRUE; + break; - default: - /* do nothing */ - break; + default: + /* do nothing */ + break; } } @@ -496,14 +478,11 @@ void smp_proc_sec_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - UINT8 res= *(UINT8 *)p_data; + UINT8 res = *(UINT8 *)p_data; SMP_TRACE_DEBUG("%s", __func__); - if (res != SMP_SUCCESS) - { + if (res != SMP_SUCCESS) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data); - } - else /*otherwise, start pairing */ - { + } else { /*otherwise, start pairing */ /* send IO request callback */ p_cb->cb_evt = SMP_IO_CAP_REQ_EVT; } @@ -531,8 +510,9 @@ void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); /* erase all keys if it is slave proc pairing req*/ - if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) + if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) { btm_sec_clear_ble_keys(p_dev_rec); + } p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR; @@ -543,59 +523,49 @@ void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) STREAM_TO_UINT8(p_cb->peer_i_key, p); STREAM_TO_UINT8(p_cb->peer_r_key, p); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { reason = SMP_INVALID_PARAMETERS; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p_cb->role == HCI_ROLE_SLAVE) - { - if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) - { + if (p_cb->role == HCI_ROLE_SLAVE) { + if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) { /* peer (master) started pairing sending Pairing Request */ p_cb->local_i_key = p_cb->peer_i_key; p_cb->local_r_key = p_cb->peer_r_key; p_cb->cb_evt = SMP_SEC_REQUEST_EVT; - } - else /* update local i/r key according to pairing request */ - { + } else { /* update local i/r key according to pairing request */ /* pairing started with this side (slave) sending Security Request */ p_cb->local_i_key &= p_cb->peer_i_key; p_cb->local_r_key &= p_cb->peer_r_key; p_cb->selected_association_model = smp_select_association_model(p_cb); if (p_cb->secure_connections_only_mode_required && - (!(p_cb->le_secure_connections_mode_is_used) || - (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) - { + (!(p_cb->le_secure_connections_mode_is_used) || + (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) { SMP_TRACE_ERROR("%s pairing failed - slave requires secure connection only mode", - __func__); + __func__); reason = SMP_PAIR_AUTH_FAIL; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) - { - if (smp_request_oob_data(p_cb)) return; - } - else - { + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { + if (smp_request_oob_data(p_cb)) { + return; + } + } else { smp_send_pair_rsp(p_cb, NULL); } } - } - else /* Master receives pairing response */ - { + } else { /* Master receives pairing response */ p_cb->selected_association_model = smp_select_association_model(p_cb); if (p_cb->secure_connections_only_mode_required && - (!(p_cb->le_secure_connections_mode_is_used) || - (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) - { + (!(p_cb->le_secure_connections_mode_is_used) || + (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) { SMP_TRACE_ERROR ("Master requires secure connection only mode \ but it can't be provided -> Master fails pairing"); reason = SMP_PAIR_AUTH_FAIL; @@ -603,12 +573,11 @@ void smp_proc_pair_cmd(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) return; } - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) - { - if (smp_request_oob_data(p_cb)) return; - } - else - { + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { + if (smp_request_oob_data(p_cb)) { + return; + } + } else { smp_decide_association_model(p_cb, NULL); } } @@ -625,14 +594,12 @@ void smp_proc_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p != NULL) - { + if (p != NULL) { /* save the SConfirm for comparison later */ STREAM_TO_ARRAY(p_cb->rconfirm, p, BT_OCTET16_LEN); } @@ -651,8 +618,7 @@ void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } @@ -672,8 +638,7 @@ void smp_proc_rand(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } @@ -697,8 +662,7 @@ void smp_process_pairing_public_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } @@ -721,16 +685,14 @@ void smp_process_pairing_commitment(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } p_cb->flags |= SMP_PAIR_FLAG_HAVE_PEER_COMM; - if (p != NULL) - { + if (p != NULL) { STREAM_TO_ARRAY(p_cb->remote_commitment, p, BT_OCTET16_LEN); } } @@ -746,14 +708,12 @@ void smp_process_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p != NULL) - { + if (p != NULL) { STREAM_TO_ARRAY(p_cb->remote_dhkey_check, p, BT_OCTET16_LEN); } @@ -772,18 +732,14 @@ void smp_process_keypress_notification(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); p_cb->status = *(UINT8 *)p_data; - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p != NULL) - { + if (p != NULL) { STREAM_TO_UINT8(p_cb->peer_keypress_notification, p); - } - else - { + } else { p_cb->peer_keypress_notification = BTM_SP_KEY_OUT_OF_RANGE; } p_cb->cb_evt = SMP_PEER_KEYPR_NOT_EVT; @@ -802,16 +758,16 @@ void smp_br_process_pairing_command(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s", __func__); /* rejecting BR pairing request over non-SC BR link */ - if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) - { + if (!p_dev_rec->new_encryption_key_is_p256 && p_cb->role == HCI_ROLE_SLAVE) { reason = SMP_XTRANS_DERIVE_NOT_ALLOW; smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); return; } /* erase all keys if it is slave proc pairing req*/ - if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) + if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE)) { btm_sec_clear_ble_keys(p_dev_rec); + } p_cb->flags |= SMP_PAIR_FLAG_ENC_AFTER_PAIR; @@ -822,8 +778,7 @@ void smp_br_process_pairing_command(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) STREAM_TO_UINT8(p_cb->peer_i_key, p); STREAM_TO_UINT8(p_cb->peer_r_key, p); - if (smp_command_has_invalid_parameters(p_cb)) - { + if (smp_command_has_invalid_parameters(p_cb)) { reason = SMP_INVALID_PARAMETERS; smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); return; @@ -834,16 +789,13 @@ void smp_br_process_pairing_command(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) p_cb->local_i_key = p_cb->peer_i_key; p_cb->local_r_key = p_cb->peer_r_key; - if (p_cb->role == HCI_ROLE_SLAVE) - { + if (p_cb->role == HCI_ROLE_SLAVE) { p_dev_rec->new_encryption_key_is_p256 = FALSE; /* shortcut to skip Security Grant step */ p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT; - } - else /* Master receives pairing response */ - { + } else { /* Master receives pairing response */ SMP_TRACE_DEBUG("%s master rcvs valid PAIRING RESPONSE." - " Supposed to move to key distribution phase. ", __func__); + " Supposed to move to key distribution phase. ", __func__); } /* auth_req received via BR/EDR SM channel is set to 0, @@ -858,14 +810,11 @@ void smp_br_process_pairing_command(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_br_process_security_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - UINT8 res= *(UINT8 *)p_data; + UINT8 res = *(UINT8 *)p_data; SMP_TRACE_DEBUG("%s", __func__); - if (res != SMP_SUCCESS) - { + if (res != SMP_SUCCESS) { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, p_data); - } - else /*otherwise, start pairing */ - { + } else { /*otherwise, start pairing */ /* send IO request callback */ p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT; } @@ -881,8 +830,8 @@ void smp_br_check_authorization_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 reason = SMP_SUCCESS; SMP_TRACE_DEBUG("%s rcvs i_keys=0x%x r_keys=0x%x " - "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key, - p_cb->local_r_key); + "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key, + p_cb->local_r_key); /* In LE SC mode LK field is ignored when BR/EDR transport is used */ p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; @@ -890,27 +839,24 @@ void smp_br_check_authorization_request(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer. ** Set local_r_key on master to expect only these keys. */ - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK); } SMP_TRACE_DEBUG("%s rcvs upgrades: i_keys=0x%x r_keys=0x%x " - "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key, - p_cb->local_r_key); + "(i-initiator r-responder)", __FUNCTION__, p_cb->local_i_key, + p_cb->local_r_key); if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) || (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/ - (p_cb->local_i_key || p_cb->local_r_key)) - { + (p_cb->local_i_key || p_cb->local_r_key)) { smp_br_state_machine_event(p_cb, SMP_BR_BOND_REQ_EVT, NULL); /* if no peer key is expected, start master key distribution */ - if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0) + if (p_cb->role == HCI_ROLE_MASTER && p_cb->local_r_key == 0) { smp_key_distribution_by_transport(p_cb, NULL); - } - else - { + } + } else { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); } } @@ -924,23 +870,21 @@ void smp_br_select_next_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { UINT8 reason = SMP_SUCCESS; SMP_TRACE_DEBUG("%s role=%d (0-master) r_keys=0x%x i_keys=0x%x", - __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key); + __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key); - if (p_cb->role == HCI_ROLE_SLAVE|| - (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) - { + if (p_cb->role == HCI_ROLE_SLAVE || + (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) { smp_key_pick_key(p_cb, p_data); } - if (!p_cb->local_i_key && !p_cb->local_r_key) - { + if (!p_cb->local_i_key && !p_cb->local_r_key) { /* state check to prevent re-entrance */ - if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) - { - if (p_cb->total_tx_unacked == 0) + if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) { + if (p_cb->total_tx_unacked == 0) { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); - else + } else { p_cb->wait_for_authorization_complete = TRUE; + } } } } @@ -968,7 +912,7 @@ void smp_proc_master_id(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) tBTM_LE_PENC_KEYS le_key; SMP_TRACE_DEBUG("%s\np_cb->peer_auth_req = %d,p_cb->loc_auth_req= %d\n", __func__, - p_cb->peer_auth_req,p_cb->loc_auth_req); + p_cb->peer_auth_req, p_cb->loc_auth_req); smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE); STREAM_TO_UINT16(le_key.ediv, p); @@ -1060,16 +1004,15 @@ void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 reason; SMP_TRACE_DEBUG("%s\n", __func__); - if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) - { + if (!memcmp(p_cb->rconfirm, p_data->key.p_data, BT_OCTET16_LEN)) { /* compare the max encryption key size, and save the smaller one for the link */ - if ( p_cb->peer_enc_size < p_cb->loc_enc_size) + if ( p_cb->peer_enc_size < p_cb->loc_enc_size) { p_cb->loc_enc_size = p_cb->peer_enc_size; + } - if (p_cb->role == HCI_ROLE_SLAVE) + if (p_cb->role == HCI_ROLE_SLAVE) { smp_sm_event(p_cb, SMP_RAND_EVT, NULL); - else - { + } else { /* master device always use received i/r key as keys to distribute */ p_cb->local_i_key = p_cb->peer_i_key; p_cb->local_r_key = p_cb->peer_r_key; @@ -1077,9 +1020,7 @@ void smp_proc_compare(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL); } - } - else - { + } else { reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); } @@ -1094,16 +1035,14 @@ void smp_proc_sl_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 key_type = p_data->key.key_type; SMP_TRACE_DEBUG("%s\n", __func__); - if (key_type == SMP_KEY_TYPE_TK) - { + if (key_type == SMP_KEY_TYPE_TK) { smp_generate_srand_mrand_confirm(p_cb, NULL); - } - else if (key_type == SMP_KEY_TYPE_CFM) - { + } else if (key_type == SMP_KEY_TYPE_CFM) { smp_set_state(SMP_STATE_WAIT_CONFIRM); - if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM) + if (p_cb->flags & SMP_PAIR_FLAGS_CMD_CONFIRM) { smp_sm_event(p_cb, SMP_CONFIRM_EVT, NULL); + } } } @@ -1117,13 +1056,15 @@ void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 reason = SMP_ENC_FAIL; SMP_TRACE_DEBUG("%s\n", __func__); - if (p_data != NULL) + if (p_data != NULL) { cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data); - else + } else { cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL); + } - if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) + if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); + } } /******************************************************************************* @@ -1133,8 +1074,9 @@ void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) void smp_proc_discard(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG("%s\n", __func__); - if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) + if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)) { smp_reset_control_value(p_cb); + } } /******************************************************************************* @@ -1160,20 +1102,17 @@ void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL; SMP_TRACE_DEBUG("%s rcvs enc_enable=%d i_keys=0x%x r_keys=0x%x " - "(i-initiator r-responder)\n", - __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key); - if (enc_enable == 1) - { - if (p_cb->le_secure_connections_mode_is_used) - { + "(i-initiator r-responder)\n", + __func__, enc_enable, p_cb->local_i_key, p_cb->local_r_key); + if (enc_enable == 1) { + if (p_cb->le_secure_connections_mode_is_used) { /* In LE SC mode LTK is used instead of STK and has to be always saved */ p_cb->local_i_key |= SMP_SEC_KEY_TYPE_ENC; p_cb->local_r_key |= SMP_SEC_KEY_TYPE_ENC; - /* In LE SC mode LK is derived from LTK only if both sides request it */ - if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) || - !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) - { + /* In LE SC mode LK is derived from LTK only if both sides request it */ + if (!(p_cb->local_i_key & SMP_SEC_KEY_TYPE_LK) || + !(p_cb->local_r_key & SMP_SEC_KEY_TYPE_LK)) { p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; } @@ -1181,39 +1120,33 @@ void smp_check_auth_req(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) /* In LE SC mode only IRK, IAI, CSRK are exchanged with the peer. ** Set local_r_key on master to expect only these keys. */ - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { p_cb->local_r_key &= (SMP_SEC_KEY_TYPE_ID | SMP_SEC_KEY_TYPE_CSRK); } - } - else - { + } else { /* in legacy mode derivation of BR/EDR LK is not supported */ p_cb->local_i_key &= ~SMP_SEC_KEY_TYPE_LK; p_cb->local_r_key &= ~SMP_SEC_KEY_TYPE_LK; } SMP_TRACE_DEBUG("%s rcvs upgrades: i_keys=0x%x r_keys=0x%x " - "(i-initiator r-responder)\n", - __func__, p_cb->local_i_key, p_cb->local_r_key); + "(i-initiator r-responder)\n", + __func__, p_cb->local_i_key, p_cb->local_r_key); if (/*((p_cb->peer_auth_req & SMP_AUTH_BOND) || (p_cb->loc_auth_req & SMP_AUTH_BOND)) &&*/ - (p_cb->local_i_key || p_cb->local_r_key)) - { + (p_cb->local_i_key || p_cb->local_r_key)) { smp_sm_event(p_cb, SMP_BOND_REQ_EVT, NULL); + } else { + smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); } - else - smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); - } - else if (enc_enable == 0) - { + } else if (enc_enable == 0) { /* if failed for encryption after pairing, send callback */ - if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR) + if (p_cb->flags & SMP_PAIR_FLAG_ENC_AFTER_PAIR) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); + } /* if enc failed for old security information */ /* if master device, clean up and abck to idle; slave device do nothing */ - else if (p_cb->role == HCI_ROLE_MASTER) - { + else if (p_cb->role == HCI_ROLE_MASTER) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); } } @@ -1229,12 +1162,10 @@ void smp_key_pick_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT8 i = 0; SMP_TRACE_DEBUG("%s key_to_dist=0x%x\n", __func__, key_to_dist); - while (i < SMP_KEY_DIST_TYPE_MAX) - { + while (i < SMP_KEY_DIST_TYPE_MAX) { SMP_TRACE_DEBUG("key to send = %02x, i = %d\n", key_to_dist, i); - if (key_to_dist & (1 << i)) - { + if (key_to_dist & (1 << i)) { SMP_TRACE_DEBUG("smp_distribute_act[%d]\n", i); (* smp_distribute_act[i])(p_cb, p_data); break; @@ -1250,29 +1181,26 @@ void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { UINT8 reason = SMP_SUCCESS; SMP_TRACE_DEBUG("\n%s role=%d (0-master) r_keys=0x%x i_keys=0x%x\n", - __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key); + __func__, p_cb->role, p_cb->local_r_key, p_cb->local_i_key); if (p_cb->role == HCI_ROLE_SLAVE || - (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) - { + (!p_cb->local_r_key && p_cb->role == HCI_ROLE_MASTER)) { smp_key_pick_key(p_cb, p_data); } - if (!p_cb->local_i_key && !p_cb->local_r_key) - { + if (!p_cb->local_i_key && !p_cb->local_r_key) { /* state check to prevent re-entrant */ - if (smp_get_state() == SMP_STATE_BOND_PENDING) - { - if (p_cb->derive_lk) - { + if (smp_get_state() == SMP_STATE_BOND_PENDING) { + if (p_cb->derive_lk) { smp_derive_link_key_from_long_term_key(p_cb, NULL); p_cb->derive_lk = FALSE; } - if (p_cb->total_tx_unacked == 0) + if (p_cb->total_tx_unacked == 0) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); - else + } else { p_cb->wait_for_authorization_complete = TRUE; + } } } } @@ -1292,82 +1220,79 @@ void smp_decide_association_model(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s Association Model = %d\n", __func__, p_cb->selected_association_model); - switch (p_cb->selected_association_model) - { - case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */ - if (p_cb->role == HCI_ROLE_MASTER && + switch (p_cb->selected_association_model) { + case SMP_MODEL_ENCRYPTION_ONLY: /* TK = 0, go calculate Confirm */ + if (p_cb->role == HCI_ROLE_MASTER && ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) && - ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) - { - SMP_TRACE_ERROR ("IO capability does not meet authentication requirement\n"); - failure = SMP_PAIR_AUTH_FAIL; - p = (tSMP_INT_DATA *)&failure; - int_evt = SMP_AUTH_CMPL_EVT; - } - else - { - p_cb->sec_level = SMP_SEC_UNAUTHENTICATE; - SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) \n", p_cb->sec_level ); - - key.key_type = SMP_KEY_TYPE_TK; - key.p_data = p_cb->tk; - p = (tSMP_INT_DATA *)&key; - - memset(p_cb->tk, 0, BT_OCTET16_LEN); - /* TK, ready */ - int_evt = SMP_KEY_READY_EVT; - } - break; - - case SMP_MODEL_PASSKEY: - p_cb->sec_level = SMP_SEC_AUTHENTICATED; - SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) \n", p_cb->sec_level ); - - p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; - int_evt = SMP_TK_REQ_EVT; - break; - - case SMP_MODEL_OOB: - SMP_TRACE_ERROR ("Association Model = SMP_MODEL_OOB\n"); - p_cb->sec_level = SMP_SEC_AUTHENTICATED; - SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) \n", p_cb->sec_level ); - - p_cb->cb_evt = SMP_OOB_REQ_EVT; - int_evt = SMP_TK_REQ_EVT; - break; - - case SMP_MODEL_KEY_NOTIF: - p_cb->sec_level = SMP_SEC_AUTHENTICATED; - SMP_TRACE_DEBUG("Need to generate Passkey\n"); - - /* generate passkey and notify application */ - smp_generate_passkey(p_cb, NULL); - break; - - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - case SMP_MODEL_SEC_CONN_OOB: - int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT; - break; - - case SMP_MODEL_OUT_OF_RANGE: - SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)\n"); + ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0)) { + SMP_TRACE_ERROR ("IO capability does not meet authentication requirement\n"); + failure = SMP_PAIR_AUTH_FAIL; p = (tSMP_INT_DATA *)&failure; int_evt = SMP_AUTH_CMPL_EVT; - break; + } else { + p_cb->sec_level = SMP_SEC_UNAUTHENTICATE; + SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) \n", p_cb->sec_level ); - default: - SMP_TRACE_ERROR("Association Model = %d (SOMETHING IS WRONG WITH THE CODE)\n", - p_cb->selected_association_model); - p = (tSMP_INT_DATA *)&failure; - int_evt = SMP_AUTH_CMPL_EVT; + key.key_type = SMP_KEY_TYPE_TK; + key.p_data = p_cb->tk; + p = (tSMP_INT_DATA *)&key; + + memset(p_cb->tk, 0, BT_OCTET16_LEN); + /* TK, ready */ + int_evt = SMP_KEY_READY_EVT; + } + break; + + case SMP_MODEL_PASSKEY: + p_cb->sec_level = SMP_SEC_AUTHENTICATED; + SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) \n", p_cb->sec_level ); + + p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; + int_evt = SMP_TK_REQ_EVT; + break; + + case SMP_MODEL_OOB: + SMP_TRACE_ERROR ("Association Model = SMP_MODEL_OOB\n"); + p_cb->sec_level = SMP_SEC_AUTHENTICATED; + SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) \n", p_cb->sec_level ); + + p_cb->cb_evt = SMP_OOB_REQ_EVT; + int_evt = SMP_TK_REQ_EVT; + break; + + case SMP_MODEL_KEY_NOTIF: + p_cb->sec_level = SMP_SEC_AUTHENTICATED; + SMP_TRACE_DEBUG("Need to generate Passkey\n"); + + /* generate passkey and notify application */ + smp_generate_passkey(p_cb, NULL); + break; + + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + case SMP_MODEL_SEC_CONN_OOB: + int_evt = SMP_PUBL_KEY_EXCH_REQ_EVT; + break; + + case SMP_MODEL_OUT_OF_RANGE: + SMP_TRACE_ERROR("Association Model = SMP_MODEL_OUT_OF_RANGE (failed)\n"); + p = (tSMP_INT_DATA *)&failure; + int_evt = SMP_AUTH_CMPL_EVT; + break; + + default: + SMP_TRACE_ERROR("Association Model = %d (SOMETHING IS WRONG WITH THE CODE)\n", + p_cb->selected_association_model); + p = (tSMP_INT_DATA *)&failure; + int_evt = SMP_AUTH_CMPL_EVT; } SMP_TRACE_EVENT ("sec_level=%d \n", p_cb->sec_level ); - if (int_evt) + if (int_evt) { smp_sm_event(p_cb, int_evt, p); + } } /******************************************************************************* @@ -1379,30 +1304,27 @@ void smp_process_io_response(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) uint8_t reason = SMP_PAIR_AUTH_FAIL; SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) - { + if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { /* pairing started by local (slave) Security Request */ smp_set_state(SMP_STATE_SEC_REQ_PENDING); smp_send_cmd(SMP_OPCODE_SEC_REQ, p_cb); - } - else /* plan to send pairing respond */ - { + } else { /* plan to send pairing respond */ /* pairing started by peer (master) Pairing Request */ p_cb->selected_association_model = smp_select_association_model(p_cb); if (p_cb->secure_connections_only_mode_required && - (!(p_cb->le_secure_connections_mode_is_used) || - (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) - { + (!(p_cb->le_secure_connections_mode_is_used) || + (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS))) { SMP_TRACE_ERROR ("Slave requires secure connection only mode \ but it can't be provided -> Slave fails pairing\n"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) - { - if (smp_request_oob_data(p_cb)) return; + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_OOB) { + if (smp_request_oob_data(p_cb)) { + return; + } } smp_send_pair_rsp(p_cb, NULL); } @@ -1439,8 +1361,7 @@ void smp_br_send_pair_response(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - if (p_cb->total_tx_unacked == 0) - { + if (p_cb->total_tx_unacked == 0) { /* update connection parameter to remote preferred */ L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, TRUE); /* process the pairing complete */ @@ -1467,8 +1388,7 @@ void smp_pair_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) - { + if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { SMP_TRACE_DEBUG("Pairing terminated at IDLE state.\n"); p_cb->status = SMP_FAIL; smp_proc_pairing_cmpl(p_cb); @@ -1496,14 +1416,15 @@ void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_both_have_public_keys(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - SMP_TRACE_DEBUG("%s\n",__func__); + SMP_TRACE_DEBUG("%s\n", __func__); /* invokes DHKey computation */ smp_compute_dhkey(p_cb); /* on slave side invokes sending local public key to the peer */ - if (p_cb->role == HCI_ROLE_SLAVE) + if (p_cb->role == HCI_ROLE_SLAVE) { smp_send_pair_public_key(p_cb, NULL); + } smp_sm_event(p_cb, SMP_SC_DHKEY_CMPLT_EVT, NULL); } @@ -1518,42 +1439,38 @@ void smp_start_secure_connection_phase1(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) - { + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { p_cb->sec_level = SMP_SEC_UNAUTHENTICATE; SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE)\n ", p_cb->sec_level ); - } - else - { + } else { p_cb->sec_level = SMP_SEC_AUTHENTICATED; SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED)\n ", p_cb->sec_level ); } - switch(p_cb->selected_association_model) - { - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - memset(p_cb->local_random, 0, BT_OCTET16_LEN); - smp_start_nonce_generation(p_cb); - break; - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - /* user has to provide passkey */ - p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; - smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL); - break; - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - /* passkey has to be provided to user */ - SMP_TRACE_DEBUG("Need to generate SC Passkey\n"); - smp_generate_passkey(p_cb, NULL); - break; - case SMP_MODEL_SEC_CONN_OOB: - /* use the available OOB information */ - smp_process_secure_connection_oob_data(p_cb, NULL); - break; - default: - SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", - p_cb->selected_association_model); - break; + switch (p_cb->selected_association_model) { + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + memset(p_cb->local_random, 0, BT_OCTET16_LEN); + smp_start_nonce_generation(p_cb); + break; + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + /* user has to provide passkey */ + p_cb->cb_evt = SMP_PASSKEY_REQ_EVT; + smp_sm_event(p_cb, SMP_TK_REQ_EVT, NULL); + break; + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + /* passkey has to be provided to user */ + SMP_TRACE_DEBUG("Need to generate SC Passkey\n"); + smp_generate_passkey(p_cb, NULL); + break; + case SMP_MODEL_SEC_CONN_OOB: + /* use the available OOB information */ + smp_process_secure_connection_oob_data(p_cb, NULL); + break; + default: + SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", + p_cb->selected_association_model); + break; } } @@ -1567,62 +1484,52 @@ void smp_process_local_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG("%s\n", __func__); - switch(p_cb->selected_association_model) - { - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - if (p_cb->role == HCI_ROLE_SLAVE) - { - /* slave calculates and sends local commitment */ - smp_calculate_local_commitment(p_cb); - smp_send_commitment(p_cb, NULL); - /* slave has to wait for peer nonce */ + switch (p_cb->selected_association_model) { + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + if (p_cb->role == HCI_ROLE_SLAVE) { + /* slave calculates and sends local commitment */ + smp_calculate_local_commitment(p_cb); + smp_send_commitment(p_cb, NULL); + /* slave has to wait for peer nonce */ + smp_set_state(SMP_STATE_WAIT_NONCE); + } else { /* i.e. master */ + if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) { + /* slave commitment is already received, send local nonce, wait for remote nonce*/ + SMP_TRACE_DEBUG("master in assoc mode = %d \ + already rcvd slave commitment - race condition\n", + p_cb->selected_association_model); + p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; + smp_send_rand(p_cb, NULL); smp_set_state(SMP_STATE_WAIT_NONCE); } - else /* i.e. master */ - { - if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) - { - /* slave commitment is already received, send local nonce, wait for remote nonce*/ - SMP_TRACE_DEBUG("master in assoc mode = %d \ - already rcvd slave commitment - race condition\n", - p_cb->selected_association_model); - p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; - smp_send_rand(p_cb, NULL); - smp_set_state(SMP_STATE_WAIT_NONCE); - } - } - break; - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - smp_calculate_local_commitment(p_cb); + } + break; + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + smp_calculate_local_commitment(p_cb); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { + smp_send_commitment(p_cb, NULL); + } else { /* slave */ + if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) { + /* master commitment is already received */ smp_send_commitment(p_cb, NULL); + smp_set_state(SMP_STATE_WAIT_NONCE); } - else /* slave */ - { - if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_COMM) - { - /* master commitment is already received */ - smp_send_commitment(p_cb, NULL); - smp_set_state(SMP_STATE_WAIT_NONCE); - } - } - break; - case SMP_MODEL_SEC_CONN_OOB: - if (p_cb->role == HCI_ROLE_MASTER) - { - smp_send_rand(p_cb, NULL); - } + } + break; + case SMP_MODEL_SEC_CONN_OOB: + if (p_cb->role == HCI_ROLE_MASTER) { + smp_send_rand(p_cb, NULL); + } - smp_set_state(SMP_STATE_WAIT_NONCE); - break; - default: - SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", - p_cb->selected_association_model); - break; + smp_set_state(SMP_STATE_WAIT_NONCE); + break; + default: + SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", + p_cb->selected_association_model); + break; } } @@ -1639,76 +1546,64 @@ void smp_process_peer_nonce(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s start \n", __func__); - switch(p_cb->selected_association_model) - { - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - /* in these models only master receives commitment */ - if (p_cb->role == HCI_ROLE_MASTER) - { - if (!smp_check_commitment(p_cb)) - { - reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; - smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); - break; - } - } - else - { - /* slave sends local nonce */ - smp_send_rand(p_cb, NULL); - } - - if(p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) - { - /* go directly to phase 2 */ - smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); - } - else /* numeric comparison */ - { - smp_set_state(SMP_STATE_WAIT_NONCE); - smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL); - } - break; - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - if (!smp_check_commitment(p_cb)) - { + switch (p_cb->selected_association_model) { + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + /* in these models only master receives commitment */ + if (p_cb->role == HCI_ROLE_MASTER) { + if (!smp_check_commitment(p_cb)) { reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); break; } + } else { + /* slave sends local nonce */ + smp_send_rand(p_cb, NULL); + } - if (p_cb->role == HCI_ROLE_SLAVE) - { - smp_send_rand(p_cb, NULL); - } - - if (++p_cb->round < 20) - { - smp_set_state(SMP_STATE_SEC_CONN_PHS1_START); - p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; - smp_start_nonce_generation(p_cb); - break; - } - + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_JUSTWORKS) { + /* go directly to phase 2 */ smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); + } else { /* numeric comparison */ + smp_set_state(SMP_STATE_WAIT_NONCE); + smp_sm_event(p_cb, SMP_SC_CALC_NC_EVT, NULL); + } + break; + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + if (!smp_check_commitment(p_cb)) { + reason = p_cb->failure = SMP_CONFIRM_VALUE_ERR; + smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); break; - case SMP_MODEL_SEC_CONN_OOB: - if (p_cb->role == HCI_ROLE_SLAVE) - { - smp_send_rand(p_cb, NULL); - } + } - smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); - break; - default: - SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", - p_cb->selected_association_model); + if (p_cb->role == HCI_ROLE_SLAVE) { + smp_send_rand(p_cb, NULL); + } + + if (++p_cb->round < 20) { + smp_set_state(SMP_STATE_SEC_CONN_PHS1_START); + p_cb->flags &= ~SMP_PAIR_FLAG_HAVE_PEER_COMM; + smp_start_nonce_generation(p_cb); break; + } + + smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); + break; + case SMP_MODEL_SEC_CONN_OOB: + if (p_cb->role == HCI_ROLE_SLAVE) { + smp_send_rand(p_cb, NULL); + } + + smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); + break; + default: + SMP_TRACE_ERROR ("Association Model = %d is not used in LE SC\n", + p_cb->selected_association_model); + break; } - SMP_TRACE_DEBUG("%s end\n ",__FUNCTION__); + SMP_TRACE_DEBUG("%s end\n ", __FUNCTION__); } /******************************************************************************* @@ -1722,8 +1617,7 @@ void smp_match_dhkey_checks(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG("%s\n", __func__); - if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) - { + if (memcmp(p_data->key.p_data, p_cb->remote_dhkey_check, BT_OCTET16_LEN)) { SMP_TRACE_WARNING ("dhkey chcks do no match\n"); p_cb->failure = reason; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); @@ -1733,15 +1627,13 @@ void smp_match_dhkey_checks(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_EVENT ("dhkey chcks match\n"); /* compare the max encryption key size, and save the smaller one for the link */ - if (p_cb->peer_enc_size < p_cb->loc_enc_size) + if (p_cb->peer_enc_size < p_cb->loc_enc_size) { p_cb->loc_enc_size = p_cb->peer_enc_size; - - if (p_cb->role == HCI_ROLE_SLAVE) - { - smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL); } - else - { + + if (p_cb->role == HCI_ROLE_SLAVE) { + smp_sm_event(p_cb, SMP_PAIR_DHKEY_CHCK_EVT, NULL); + } else { /* master device always use received i/r key as keys to distribute */ p_cb->local_i_key = p_cb->peer_i_key; p_cb->local_r_key = p_cb->peer_r_key; @@ -1758,7 +1650,7 @@ void smp_match_dhkey_checks(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_move_to_secure_connections_phase2(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - SMP_TRACE_DEBUG("%s\n",__func__); + SMP_TRACE_DEBUG("%s\n", __func__); smp_sm_event(p_cb, SMP_SC_PHASE1_CMPLT_EVT, NULL); } @@ -1771,10 +1663,11 @@ void smp_move_to_secure_connections_phase2(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_phase_2_dhkey_checks_are_present(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - SMP_TRACE_DEBUG("%s\n",__func__); + SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK) + if (p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_DHK_CHK) { smp_sm_event(p_cb, SMP_SC_2_DHCK_CHKS_PRES_EVT, NULL); + } } /******************************************************************************* @@ -1787,14 +1680,12 @@ void smp_phase_2_dhkey_checks_are_present(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) *******************************************************************************/ void smp_wait_for_both_public_keys(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - SMP_TRACE_DEBUG("%s\n",__func__); + SMP_TRACE_DEBUG("%s\n", __func__); if ((p_cb->flags & SMP_PAIR_FLAG_HAVE_PEER_PUBL_KEY) && - (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) - { + (p_cb->flags & SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY)) { if ((p_cb->role == HCI_ROLE_SLAVE) && - ((p_cb->req_oob_type == SMP_OOB_LOCAL) || (p_cb->req_oob_type == SMP_OOB_BOTH))) - { + ((p_cb->req_oob_type == SMP_OOB_LOCAL) || (p_cb->req_oob_type == SMP_OOB_BOTH))) { smp_set_state(SMP_STATE_PUBLIC_KEY_EXCH); } smp_sm_event(p_cb, SMP_BOTH_PUBL_KEYS_RCVD_EVT, NULL); @@ -1829,24 +1720,18 @@ void smp_process_secure_connection_oob_data(tSMP_CB *p_cb, tSMP_INT_DATA *p_data SMP_TRACE_DEBUG("%s\n", __func__); tSMP_SC_OOB_DATA *p_sc_oob_data = &p_cb->sc_oob_data; - if (p_sc_oob_data->loc_oob_data.present) - { + if (p_sc_oob_data->loc_oob_data.present) { memcpy(p_cb->local_random, p_sc_oob_data->loc_oob_data.randomizer, sizeof(p_cb->local_random)); - } - else - { + } else { SMP_TRACE_EVENT ("local OOB randomizer is absent\n"); memset(p_cb->local_random, 0, sizeof (p_cb->local_random)); } - if (!p_sc_oob_data->peer_oob_data.present) - { + if (!p_sc_oob_data->peer_oob_data.present) { SMP_TRACE_EVENT ("peer OOB data is absent\n"); memset(p_cb->peer_random, 0, sizeof (p_cb->peer_random)); - } - else - { + } else { memcpy(p_cb->peer_random, p_sc_oob_data->peer_oob_data.randomizer, sizeof(p_cb->peer_random)); memcpy(p_cb->remote_commitment, p_sc_oob_data->peer_oob_data.commitment, @@ -1854,15 +1739,13 @@ void smp_process_secure_connection_oob_data(tSMP_CB *p_cb, tSMP_INT_DATA *p_data UINT8 reason = SMP_CONFIRM_VALUE_ERR; /* check commitment */ - if (!smp_check_commitment(p_cb)) - { + if (!smp_check_commitment(p_cb)) { p_cb->failure = reason; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); return; } - if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) - { + if (p_cb->peer_oob_flag != SMP_OOB_PRESENT) { /* the peer doesn't have local randomiser */ SMP_TRACE_EVENT ("peer didn't receive local OOB data, set local randomizer to 0\n"); memset(p_cb->local_random, 0, sizeof (p_cb->local_random)); @@ -1909,23 +1792,23 @@ void smp_set_local_oob_random_commitment(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) #if SMP_DEBUG == TRUE UINT8 *p_print = NULL; SMP_TRACE_DEBUG("local SC OOB data set:\n"); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.addr_sent_to; + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.addr_sent_to; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"addr_sent_to", sizeof(tBLE_BD_ADDR)); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.private_key_used; + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.private_key_used; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"private_key_used", BT_OCTET32_LEN); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.x; + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.x; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"publ_key_used.x", BT_OCTET32_LEN); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.y; + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.publ_key_used.y; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"publ_key_used.y", BT_OCTET32_LEN); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.randomizer; + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.randomizer; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"randomizer", BT_OCTET16_LEN); - p_print = (UINT8*) &p_cb->sc_oob_data.loc_oob_data.commitment; - smp_debug_print_nbyte_little_endian (p_print,(const UINT8 *) "commitment", + p_print = (UINT8 *) &p_cb->sc_oob_data.loc_oob_data.commitment; + smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *) "commitment", BT_OCTET16_LEN); SMP_TRACE_DEBUG(""); #endif @@ -1955,12 +1838,10 @@ void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable) SMP_TRACE_DEBUG("%s encr_enable=%d\n", __func__, encr_enable); - if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0) - { + if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0) { /* encryption completed with STK, remmeber the key size now, could be overwite * when key exchange happens */ - if (p_cb->loc_enc_size != 0 && encr_enable) - { + if (p_cb->loc_enc_size != 0 && encr_enable) { /* update the link encryption key size if a SMP pairing just performed */ btm_ble_update_sec_key_size(bda, p_cb->loc_enc_size); } @@ -1984,22 +1865,19 @@ BOOLEAN smp_proc_ltk_request(BD_ADDR bda) SMP_TRACE_DEBUG("%s state = %d\n", __func__, smp_cb.state); BOOLEAN match = FALSE; - if (!memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN)) - { + if (!memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN)) { match = TRUE; } else { BD_ADDR dummy_bda = {0}; tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bda); if (p_dev_rec != NULL && - 0 == memcmp(p_dev_rec->ble.pseudo_addr, smp_cb.pairing_bda, BD_ADDR_LEN) && - 0 != memcmp(p_dev_rec->ble.pseudo_addr, dummy_bda, BD_ADDR_LEN)) - { + 0 == memcmp(p_dev_rec->ble.pseudo_addr, smp_cb.pairing_bda, BD_ADDR_LEN) && + 0 != memcmp(p_dev_rec->ble.pseudo_addr, dummy_bda, BD_ADDR_LEN)) { match = TRUE; } } - if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) - { + if (match && smp_cb.state == SMP_STATE_ENCRYPTION_PENDING) { smp_sm_event(&smp_cb, SMP_ENC_REQ_EVT, NULL); return TRUE; } @@ -2062,8 +1940,7 @@ void smp_derive_link_key_from_long_term_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; SMP_TRACE_DEBUG("%s\n", __func__); - if (!smp_calculate_link_key_from_long_term_key(p_cb)) - { + if (!smp_calculate_link_key_from_long_term_key(p_cb)) { SMP_TRACE_ERROR("%s failed\n", __FUNCTION__); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); return; @@ -2086,9 +1963,8 @@ void smp_br_process_link_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; SMP_TRACE_DEBUG("%s\n", __func__); - if (!smp_calculate_long_term_key_from_link_key(p_cb)) - { - SMP_TRACE_ERROR ("%s failed\n",__FUNCTION__); + if (!smp_calculate_long_term_key_from_link_key(p_cb)) { + SMP_TRACE_ERROR ("%s failed\n", __FUNCTION__); smp_sm_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); return; } @@ -2107,12 +1983,9 @@ void smp_br_process_link_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) void smp_key_distribution_by_transport(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->smp_over_br) - { + if (p_cb->smp_over_br) { smp_br_select_next_key(p_cb, NULL); - } - else - { + } else { smp_key_distribution(p_cb, NULL); } } @@ -2126,8 +1999,7 @@ void smp_br_pairing_complete(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->total_tx_unacked == 0) - { + if (p_cb->total_tx_unacked == 0) { /* process the pairing complete */ smp_proc_pairing_cmpl(p_cb); } diff --git a/components/bt/bluedroid/stack/smp/smp_api.c b/components/bt/bluedroid/stack/smp/smp_api.c old mode 100755 new mode 100644 index c4b1e2be8..316f2ba2d --- a/components/bt/bluedroid/stack/smp/smp_api.c +++ b/components/bt/bluedroid/stack/smp/smp_api.c @@ -27,15 +27,15 @@ #include "bt_target.h" //#include "bt_utils.h" #if SMP_INCLUDED == TRUE - #include "smp_int.h" - #include "smp_api.h" - #include "l2cdefs.h" - #include "l2c_int.h" - #include "btm_int.h" - #include "hcimsgs.h" +#include "smp_int.h" +#include "smp_api.h" +#include "l2cdefs.h" +#include "l2c_int.h" +#include "btm_int.h" +#include "hcimsgs.h" - #include "btu.h" - #include "p_256_ecc_pp.h" +#include "btu.h" +#include "p_256_ecc_pp.h" /******************************************************************************* ** @@ -85,10 +85,11 @@ void SMP_Init(void) *******************************************************************************/ extern UINT8 SMP_SetTraceLevel (UINT8 new_level) { - if (new_level != 0xFF) + if (new_level != 0xFF) { smp_cb.trace_level = new_level; + } - return(smp_cb.trace_level); + return (smp_cb.trace_level); } @@ -105,13 +106,12 @@ BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback) { SMP_TRACE_EVENT ("SMP_Register state=%d", smp_cb.state); - if (smp_cb.p_callback != NULL) - { + if (smp_cb.p_callback != NULL) { SMP_TRACE_ERROR ("SMP_Register: duplicate registration, overwrite it"); } smp_cb.p_callback = p_cback; - return(TRUE); + return (TRUE); } @@ -133,21 +133,17 @@ tSMP_STATUS SMP_Pair (BD_ADDR bd_addr) UINT8 status = SMP_PAIR_INTERNAL_ERR; SMP_TRACE_EVENT ("%s state=%d br_state=%d flag=0x%x \n", - __FUNCTION__, p_cb->state, p_cb->br_state, p_cb->flags); + __FUNCTION__, p_cb->state, p_cb->br_state, p_cb->flags); if (p_cb->state != SMP_STATE_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD || - p_cb->smp_over_br) - { + p_cb->smp_over_br) { /* pending security on going, reject this one */ return SMP_BUSY; - } - else - { + } else { p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN); - if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr)) - { + if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr)) { SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.\n", __FUNCTION__); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); return status; @@ -175,12 +171,11 @@ tSMP_STATUS SMP_BR_PairWith (BD_ADDR bd_addr) UINT8 status = SMP_PAIR_INTERNAL_ERR; SMP_TRACE_EVENT ("%s state=%d br_state=%d flag=0x%x ", - __func__, p_cb->state, p_cb->br_state, p_cb->flags); + __func__, p_cb->state, p_cb->br_state, p_cb->flags); if (p_cb->state != SMP_STATE_IDLE || - p_cb->smp_over_br || - p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) - { + p_cb->smp_over_br || + p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) { /* pending security on going, reject this one */ return SMP_BUSY; } @@ -191,9 +186,8 @@ tSMP_STATUS SMP_BR_PairWith (BD_ADDR bd_addr) memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN); - if (!L2CA_ConnectFixedChnl (L2CAP_SMP_BR_CID, bd_addr)) - { - SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.",__FUNCTION__); + if (!L2CA_ConnectFixedChnl (L2CAP_SMP_BR_CID, bd_addr)) { + SMP_TRACE_ERROR("%s: L2C connect fixed channel failed.", __FUNCTION__); smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); return status; } @@ -220,8 +214,7 @@ BOOLEAN SMP_PairCancel (BD_ADDR bd_addr) BTM_TRACE_EVENT ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags); if ( (p_cb->state != SMP_STATE_IDLE) && - (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) ) - { + (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) ) { p_cb->is_pair_cancel = TRUE; SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code); @@ -247,12 +240,10 @@ void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res) { SMP_TRACE_EVENT ("SMP_SecurityGrant "); - if (smp_cb.smp_over_br) - { + if (smp_cb.smp_over_br) { if (smp_cb.br_state != SMP_BR_STATE_WAIT_APP_RSP || - smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || - memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) - { + smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || + memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) { return; } @@ -264,9 +255,10 @@ void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res) } if (smp_cb.state != SMP_STATE_WAIT_APP_RSP || - smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || - memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) + smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || + memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) { return; + } /* clear the SMP_SEC_REQUEST_EVT event after get grant */ /* avoid generate duplicate pair request */ smp_cb.cb_evt = 0; @@ -292,40 +284,32 @@ void SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) UINT8 failure = SMP_PASSKEY_ENTRY_FAIL; SMP_TRACE_EVENT ("SMP_PasskeyReply: Key: %d Result:%d", - passkey, res); + passkey, res); /* If timeout already expired or has been canceled, ignore the reply */ - if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) - { + if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) { SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state); return; } - if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) - { + if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) { SMP_TRACE_ERROR ("SMP_PasskeyReply() - Wrong BD Addr"); return; } - if (btm_find_dev (bd_addr) == NULL) - { + if (btm_find_dev (bd_addr) == NULL) { SMP_TRACE_ERROR ("SMP_PasskeyReply() - no dev CB"); return; } - if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) - { + if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) { SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey); /* send pairing failure */ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); - } - else if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_ENT) - { + } else if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_ENT) { smp_sm_event(&smp_cb, SMP_SC_KEY_READY_EVT, &passkey); - } - else - { + } else { smp_convert_string_to_tk(p_cb->tk, passkey); } @@ -352,32 +336,26 @@ void SMP_ConfirmReply (BD_ADDR bd_addr, UINT8 res) SMP_TRACE_EVENT ("%s: Result:%d", __FUNCTION__, res); /* If timeout already expired or has been canceled, ignore the reply */ - if (p_cb->cb_evt != SMP_NC_REQ_EVT) - { - SMP_TRACE_WARNING ("%s() - Wrong State: %d", __FUNCTION__,p_cb->state); + if (p_cb->cb_evt != SMP_NC_REQ_EVT) { + SMP_TRACE_WARNING ("%s() - Wrong State: %d", __FUNCTION__, p_cb->state); return; } - if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) - { - SMP_TRACE_ERROR ("%s() - Wrong BD Addr",__FUNCTION__); + if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) { + SMP_TRACE_ERROR ("%s() - Wrong BD Addr", __FUNCTION__); return; } - if (btm_find_dev (bd_addr) == NULL) - { - SMP_TRACE_ERROR ("%s() - no dev CB",__FUNCTION__); + if (btm_find_dev (bd_addr) == NULL) { + SMP_TRACE_ERROR ("%s() - no dev CB", __FUNCTION__); return; } - if (res != SMP_SUCCESS) - { - SMP_TRACE_WARNING ("%s() - Numeric Comparison fails",__FUNCTION__); + if (res != SMP_SUCCESS) { + SMP_TRACE_WARNING ("%s() - Numeric Comparison fails", __FUNCTION__); /* send pairing failure */ smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); - } - else - { + } else { smp_sm_event(p_cb, SMP_SC_NC_OK_EVT, NULL); } } @@ -403,17 +381,16 @@ void SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data SMP_TRACE_EVENT ("%s State: %d res:%d", __FUNCTION__, smp_cb.state, res); /* If timeout already expired or has been canceled, ignore the reply */ - if (p_cb->state != SMP_STATE_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) + if (p_cb->state != SMP_STATE_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) { return; - - if (res != SMP_SUCCESS || len == 0 || !p_data) - { - smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); } - else - { - if (len > BT_OCTET16_LEN) + + if (res != SMP_SUCCESS || len == 0 || !p_data) { + smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); + } else { + if (len > BT_OCTET16_LEN) { len = BT_OCTET16_LEN; + } memcpy(p_cb->tk, p_data, len); @@ -440,44 +417,45 @@ void SMP_SecureConnectionOobDataReply(UINT8 *p_data) UINT8 failure = SMP_OOB_FAIL; tSMP_SC_OOB_DATA *p_oob = (tSMP_SC_OOB_DATA *) p_data; - if (!p_oob) - { - SMP_TRACE_ERROR("%s received no data",__FUNCTION__); + if (!p_oob) { + SMP_TRACE_ERROR("%s received no data", __FUNCTION__); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); return; } SMP_TRACE_EVENT ("%s req_oob_type: %d, loc_oob_data.present: %d, " - "peer_oob_data.present: %d", - __FUNCTION__, p_cb->req_oob_type, p_oob->loc_oob_data.present, - p_oob->peer_oob_data.present); + "peer_oob_data.present: %d", + __FUNCTION__, p_cb->req_oob_type, p_oob->loc_oob_data.present, + p_oob->peer_oob_data.present); - if (p_cb->state != SMP_STATE_WAIT_APP_RSP || p_cb->cb_evt != SMP_SC_OOB_REQ_EVT) + if (p_cb->state != SMP_STATE_WAIT_APP_RSP || p_cb->cb_evt != SMP_SC_OOB_REQ_EVT) { return; - - BOOLEAN data_missing = FALSE; - switch (p_cb->req_oob_type) - { - case SMP_OOB_PEER: - if (!p_oob->peer_oob_data.present) - data_missing = TRUE; - break; - case SMP_OOB_LOCAL: - if (!p_oob->loc_oob_data.present) - data_missing = TRUE; - break; - case SMP_OOB_BOTH: - if (!p_oob->loc_oob_data.present || !p_oob->peer_oob_data.present) - data_missing = TRUE; - break; - default: - SMP_TRACE_EVENT ("Unexpected OOB data type requested. Fail OOB"); - data_missing = TRUE; - break; } - if (data_missing) - { + BOOLEAN data_missing = FALSE; + switch (p_cb->req_oob_type) { + case SMP_OOB_PEER: + if (!p_oob->peer_oob_data.present) { + data_missing = TRUE; + } + break; + case SMP_OOB_LOCAL: + if (!p_oob->loc_oob_data.present) { + data_missing = TRUE; + } + break; + case SMP_OOB_BOTH: + if (!p_oob->loc_oob_data.present || !p_oob->peer_oob_data.present) { + data_missing = TRUE; + } + break; + default: + SMP_TRACE_EVENT ("Unexpected OOB data type requested. Fail OOB"); + data_missing = TRUE; + break; + } + + if (data_missing) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); return; } @@ -508,7 +486,7 @@ BOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, tSMP_ENC *p_out) { - BOOLEAN status=FALSE; + BOOLEAN status = FALSE; status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out); return status; } @@ -527,31 +505,27 @@ void SMP_KeypressNotification (BD_ADDR bd_addr, UINT8 value) { tSMP_CB *p_cb = &smp_cb; - SMP_TRACE_EVENT ("%s: Value: %d", __FUNCTION__,value); + SMP_TRACE_EVENT ("%s: Value: %d", __FUNCTION__, value); - if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) - { - SMP_TRACE_ERROR ("%s() - Wrong BD Addr",__FUNCTION__); + if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) { + SMP_TRACE_ERROR ("%s() - Wrong BD Addr", __FUNCTION__); return; } - if (btm_find_dev (bd_addr) == NULL) - { - SMP_TRACE_ERROR ("%s() - no dev CB",__FUNCTION__); + if (btm_find_dev (bd_addr) == NULL) { + SMP_TRACE_ERROR ("%s() - no dev CB", __FUNCTION__); return; } /* Keypress Notification is used by a device with KeyboardOnly IO capabilities */ /* during the passkey entry protocol */ - if (p_cb->local_io_capability != SMP_IO_CAP_IN) - { + if (p_cb->local_io_capability != SMP_IO_CAP_IN) { SMP_TRACE_ERROR ("%s() - wrong local IO capabilities %d", - __FUNCTION__, p_cb->local_io_capability); + __FUNCTION__, p_cb->local_io_capability); return; } - if (p_cb->selected_association_model != SMP_MODEL_SEC_CONN_PASSKEY_ENT) - { + if (p_cb->selected_association_model != SMP_MODEL_SEC_CONN_PASSKEY_ENT) { SMP_TRACE_ERROR ("%s() - wrong protocol %d", __FUNCTION__, p_cb->selected_association_model); return; @@ -576,25 +550,23 @@ BOOLEAN SMP_CreateLocalSecureConnectionsOobData (tBLE_BD_ADDR *addr_to_send_to) tSMP_CB *p_cb = &smp_cb; UINT8 *bd_addr; - if (addr_to_send_to == NULL) - { - SMP_TRACE_ERROR ("%s addr_to_send_to is not provided",__FUNCTION__); + if (addr_to_send_to == NULL) { + SMP_TRACE_ERROR ("%s addr_to_send_to is not provided", __FUNCTION__); return FALSE; } bd_addr = addr_to_send_to->bda; SMP_TRACE_EVENT ("%s addr type: %u, BDA: %08x%04x, state: %u, br_state: %u", - __FUNCTION__, addr_to_send_to->type, - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], - p_cb->state, - p_cb->br_state); + __FUNCTION__, addr_to_send_to->type, + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], + p_cb->state, + p_cb->br_state); - if ((p_cb->state != SMP_STATE_IDLE) || (p_cb->smp_over_br)) - { + if ((p_cb->state != SMP_STATE_IDLE) || (p_cb->smp_over_br)) { SMP_TRACE_WARNING ("%s creation of local OOB data set "\ - "starts only in IDLE state",__FUNCTION__); + "starts only in IDLE state", __FUNCTION__); return FALSE; } diff --git a/components/bt/bluedroid/stack/smp/smp_br_main.c b/components/bt/bluedroid/stack/smp/smp_br_main.c old mode 100755 new mode 100644 index 11039ec20..1ccbc0971 --- a/components/bt/bluedroid/stack/smp/smp_br_main.c +++ b/components/bt/bluedroid/stack/smp/smp_br_main.c @@ -23,8 +23,7 @@ #if BLE_INCLUDED == TRUE -const char *const smp_br_state_name [SMP_BR_STATE_MAX+1] = -{ +const char *const smp_br_state_name [SMP_BR_STATE_MAX + 1] = { "SMP_BR_STATE_IDLE", "SMP_BR_STATE_WAIT_APP_RSP", "SMP_BR_STATE_PAIR_REQ_RSP", @@ -32,8 +31,7 @@ const char *const smp_br_state_name [SMP_BR_STATE_MAX+1] = "SMP_BR_STATE_OUT_OF_RANGE" }; -const char *const smp_br_event_name [SMP_BR_MAX_EVT] = -{ +const char *const smp_br_event_name [SMP_BR_MAX_EVT] = { "BR_PAIRING_REQ_EVT", "BR_PAIRING_RSP_EVT", "BR_CONFIRM_EVT", @@ -71,8 +69,7 @@ const char *smp_get_br_state_name(tSMP_BR_STATE state); #define SMP_BR_SM_NUM_COLS 3 typedef const UINT8 (*tSMP_BR_SM_TBL)[SMP_BR_SM_NUM_COLS]; -enum -{ +enum { SMP_SEND_PAIR_REQ, SMP_BR_SEND_PAIR_RSP, SMP_SEND_PAIR_FAIL, @@ -93,8 +90,7 @@ enum SMP_BR_SM_NO_ACTION }; -static const tSMP_ACT smp_br_sm_action[] = -{ +static const tSMP_ACT smp_br_sm_action[] = { smp_send_pair_req, smp_br_send_pair_response, smp_send_pair_fail, @@ -114,129 +110,118 @@ static const tSMP_ACT smp_br_sm_action[] = smp_idle_terminate }; -static const UINT8 smp_br_all_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_PAIRING_FAILED */ {SMP_PROC_PAIR_FAIL, SMP_BR_PAIRING_COMPLETE, SMP_BR_STATE_IDLE}, -/* BR_AUTH_CMPL */ {SMP_SEND_PAIR_FAIL, SMP_BR_PAIRING_COMPLETE, SMP_BR_STATE_IDLE}, -/* BR_L2CAP_DISCONN */ {SMP_PAIR_TERMINATE, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_IDLE} +static const UINT8 smp_br_all_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_PAIRING_FAILED */ {SMP_PROC_PAIR_FAIL, SMP_BR_PAIRING_COMPLETE, SMP_BR_STATE_IDLE}, + /* BR_AUTH_CMPL */ {SMP_SEND_PAIR_FAIL, SMP_BR_PAIRING_COMPLETE, SMP_BR_STATE_IDLE}, + /* BR_L2CAP_DISCONN */ {SMP_PAIR_TERMINATE, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_IDLE} }; /************ SMP Master FSM State/Event Indirection Table **************/ -static const UINT8 smp_br_master_entry_map[][SMP_BR_STATE_MAX] = -{ -/* br_state name: Idle WaitApp Pair Bond - Rsp ReqRsp Pend */ -/* BR_PAIRING_REQ */ { 0, 0, 0, 0 }, -/* BR_PAIRING_RSP */ { 0, 0, 1, 0 }, -/* BR_CONFIRM */ { 0, 0, 0, 0 }, -/* BR_RAND */ { 0, 0, 0, 0 }, -/* BR_PAIRING_FAILED */ { 0, 0x81, 0x81, 0 }, -/* BR_ENCRPTION_INFO */ { 0, 0, 0, 0 }, -/* BR_MASTER_ID */ { 0, 0, 0, 0 }, -/* BR_ID_INFO */ { 0, 0, 0, 1 }, -/* BR_ID_ADDR */ { 0, 0, 0, 2 }, -/* BR_SIGN_INFO */ { 0, 0, 0, 3 }, -/* BR_SECURITY_REQ */ { 0, 0, 0, 0 }, -/* BR_PAIR_PUBLIC_KEY_EVT */ { 0, 0, 0, 0 }, -/* BR_PAIR_DHKEY_CHCK_EVT */ { 0, 0, 0, 0 }, -/* BR_PAIR_KEYPR_NOTIF_EVT */ { 0, 0, 0, 0 }, -/* BR_KEY_READY */ { 0, 0, 0, 0 }, -/* BR_ENCRYPTED */ { 0, 0, 0, 0 }, -/* BR_L2CAP_CONN */ { 1, 0, 0, 0 }, -/* BR_L2CAP_DISCONN */ { 2, 0x83, 0x83, 0x83 }, -/* BR_KEYS_RSP */ { 0, 1, 0, 0 }, -/* BR_API_SEC_GRANT */ { 0, 0, 0, 0 }, -/* BR_TK_REQ */ { 0, 0, 0, 0 }, -/* BR_AUTH_CMPL */ { 0, 0x82, 0x82, 0x82 }, -/* BR_ENC_REQ */ { 0, 0, 0, 0 }, -/* BR_BOND_REQ */ { 0, 0, 2, 0 }, -/* BR_DISCARD_SEC_REQ */ { 0, 0, 0, 0 } +static const UINT8 smp_br_master_entry_map[][SMP_BR_STATE_MAX] = { + /* br_state name: Idle WaitApp Pair Bond + Rsp ReqRsp Pend */ + /* BR_PAIRING_REQ */ { 0, 0, 0, 0 }, + /* BR_PAIRING_RSP */ { 0, 0, 1, 0 }, + /* BR_CONFIRM */ { 0, 0, 0, 0 }, + /* BR_RAND */ { 0, 0, 0, 0 }, + /* BR_PAIRING_FAILED */ { 0, 0x81, 0x81, 0 }, + /* BR_ENCRPTION_INFO */ { 0, 0, 0, 0 }, + /* BR_MASTER_ID */ { 0, 0, 0, 0 }, + /* BR_ID_INFO */ { 0, 0, 0, 1 }, + /* BR_ID_ADDR */ { 0, 0, 0, 2 }, + /* BR_SIGN_INFO */ { 0, 0, 0, 3 }, + /* BR_SECURITY_REQ */ { 0, 0, 0, 0 }, + /* BR_PAIR_PUBLIC_KEY_EVT */ { 0, 0, 0, 0 }, + /* BR_PAIR_DHKEY_CHCK_EVT */ { 0, 0, 0, 0 }, + /* BR_PAIR_KEYPR_NOTIF_EVT */ { 0, 0, 0, 0 }, + /* BR_KEY_READY */ { 0, 0, 0, 0 }, + /* BR_ENCRYPTED */ { 0, 0, 0, 0 }, + /* BR_L2CAP_CONN */ { 1, 0, 0, 0 }, + /* BR_L2CAP_DISCONN */ { 2, 0x83, 0x83, 0x83 }, + /* BR_KEYS_RSP */ { 0, 1, 0, 0 }, + /* BR_API_SEC_GRANT */ { 0, 0, 0, 0 }, + /* BR_TK_REQ */ { 0, 0, 0, 0 }, + /* BR_AUTH_CMPL */ { 0, 0x82, 0x82, 0x82 }, + /* BR_ENC_REQ */ { 0, 0, 0, 0 }, + /* BR_BOND_REQ */ { 0, 0, 2, 0 }, + /* BR_DISCARD_SEC_REQ */ { 0, 0, 0, 0 } }; -static const UINT8 smp_br_master_idle_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_L2CAP_CONN */ {SMP_SEND_APP_CBACK, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_WAIT_APP_RSP}, -/* BR_L2CAP_DISCONN */ {SMP_IDLE_TERMINATE, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_IDLE} +static const UINT8 smp_br_master_idle_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_L2CAP_CONN */ {SMP_SEND_APP_CBACK, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_WAIT_APP_RSP}, + /* BR_L2CAP_DISCONN */ {SMP_IDLE_TERMINATE, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_IDLE} }; -static const UINT8 smp_br_master_wait_appln_response_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_KEYS_RSP */{SMP_SEND_PAIR_REQ, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_PAIR_REQ_RSP} +static const UINT8 smp_br_master_wait_appln_response_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_KEYS_RSP */{SMP_SEND_PAIR_REQ, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_PAIR_REQ_RSP} }; -static const UINT8 smp_br_master_pair_request_response_table [][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_PAIRING_RSP */ {SMP_BR_PROC_PAIR_CMD, SMP_BR_CHECK_AUTH_REQ, SMP_BR_STATE_PAIR_REQ_RSP}, -/* BR_BOND_REQ */ {SMP_BR_SM_NO_ACTION, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} +static const UINT8 smp_br_master_pair_request_response_table [][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_PAIRING_RSP */ {SMP_BR_PROC_PAIR_CMD, SMP_BR_CHECK_AUTH_REQ, SMP_BR_STATE_PAIR_REQ_RSP}, + /* BR_BOND_REQ */ {SMP_BR_SM_NO_ACTION, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} }; -static const UINT8 smp_br_master_bond_pending_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_ID_INFO */{SMP_PROC_ID_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, -/* BR_ID_ADDR */{SMP_PROC_ID_ADDR, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, -/* BR_SIGN_INFO */{SMP_PROC_SRK_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} +static const UINT8 smp_br_master_bond_pending_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_ID_INFO */{SMP_PROC_ID_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, + /* BR_ID_ADDR */{SMP_PROC_ID_ADDR, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, + /* BR_SIGN_INFO */{SMP_PROC_SRK_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} }; -static const UINT8 smp_br_slave_entry_map[][SMP_BR_STATE_MAX] = -{ -/* br_state name: Idle WaitApp Pair Bond - Rsp ReqRsp Pend */ -/* BR_PAIRING_REQ */ { 1, 0, 0, 0 }, -/* BR_PAIRING_RSP */ { 0, 0, 0, 0 }, -/* BR_CONFIRM */ { 0, 0, 0, 0 }, -/* BR_RAND */ { 0, 0, 0, 0 }, -/* BR_PAIRING_FAILED */ { 0, 0x81, 0x81, 0x81 }, -/* BR_ENCRPTION_INFO */ { 0, 0, 0, 0 }, -/* BR_MASTER_ID */ { 0, 0, 0, 0 }, -/* BR_ID_INFO */ { 0, 0, 0, 1 }, -/* BR_ID_ADDR */ { 0, 0, 0, 2 }, -/* BR_SIGN_INFO */ { 0, 0, 0, 3 }, -/* BR_SECURITY_REQ */ { 0, 0, 0, 0 }, -/* BR_PAIR_PUBLIC_KEY_EVT */ { 0, 0, 0, 0 }, -/* BR_PAIR_DHKEY_CHCK_EVT */ { 0, 0, 0, 0 }, -/* BR_PAIR_KEYPR_NOTIF_EVT */ { 0, 0, 0, 0 }, -/* BR_KEY_READY */ { 0, 0, 0, 0 }, -/* BR_ENCRYPTED */ { 0, 0, 0, 0 }, -/* BR_L2CAP_CONN */ { 0, 0, 0, 0 }, -/* BR_L2CAP_DISCONN */ { 0, 0x83, 0x83, 0x83 }, -/* BR_KEYS_RSP */ { 0, 2, 0, 0 }, -/* BR_API_SEC_GRANT */ { 0, 1, 0, 0 }, -/* BR_TK_REQ */ { 0, 0, 0, 0 }, -/* BR_AUTH_CMPL */ { 0, 0x82, 0x82, 0x82 }, -/* BR_ENC_REQ */ { 0, 0, 0, 0 }, -/* BR_BOND_REQ */ { 0, 3, 0, 0 }, -/* BR_DISCARD_SEC_REQ */ { 0, 0, 0, 0 } +static const UINT8 smp_br_slave_entry_map[][SMP_BR_STATE_MAX] = { + /* br_state name: Idle WaitApp Pair Bond + Rsp ReqRsp Pend */ + /* BR_PAIRING_REQ */ { 1, 0, 0, 0 }, + /* BR_PAIRING_RSP */ { 0, 0, 0, 0 }, + /* BR_CONFIRM */ { 0, 0, 0, 0 }, + /* BR_RAND */ { 0, 0, 0, 0 }, + /* BR_PAIRING_FAILED */ { 0, 0x81, 0x81, 0x81 }, + /* BR_ENCRPTION_INFO */ { 0, 0, 0, 0 }, + /* BR_MASTER_ID */ { 0, 0, 0, 0 }, + /* BR_ID_INFO */ { 0, 0, 0, 1 }, + /* BR_ID_ADDR */ { 0, 0, 0, 2 }, + /* BR_SIGN_INFO */ { 0, 0, 0, 3 }, + /* BR_SECURITY_REQ */ { 0, 0, 0, 0 }, + /* BR_PAIR_PUBLIC_KEY_EVT */ { 0, 0, 0, 0 }, + /* BR_PAIR_DHKEY_CHCK_EVT */ { 0, 0, 0, 0 }, + /* BR_PAIR_KEYPR_NOTIF_EVT */ { 0, 0, 0, 0 }, + /* BR_KEY_READY */ { 0, 0, 0, 0 }, + /* BR_ENCRYPTED */ { 0, 0, 0, 0 }, + /* BR_L2CAP_CONN */ { 0, 0, 0, 0 }, + /* BR_L2CAP_DISCONN */ { 0, 0x83, 0x83, 0x83 }, + /* BR_KEYS_RSP */ { 0, 2, 0, 0 }, + /* BR_API_SEC_GRANT */ { 0, 1, 0, 0 }, + /* BR_TK_REQ */ { 0, 0, 0, 0 }, + /* BR_AUTH_CMPL */ { 0, 0x82, 0x82, 0x82 }, + /* BR_ENC_REQ */ { 0, 0, 0, 0 }, + /* BR_BOND_REQ */ { 0, 3, 0, 0 }, + /* BR_DISCARD_SEC_REQ */ { 0, 0, 0, 0 } }; -static const UINT8 smp_br_slave_idle_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_PAIRING_REQ */ {SMP_BR_PROC_PAIR_CMD, SMP_SEND_APP_CBACK, SMP_BR_STATE_WAIT_APP_RSP} +static const UINT8 smp_br_slave_idle_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_PAIRING_REQ */ {SMP_BR_PROC_PAIR_CMD, SMP_SEND_APP_CBACK, SMP_BR_STATE_WAIT_APP_RSP} }; -static const UINT8 smp_br_slave_wait_appln_response_table [][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_API_SEC_GRANT */ {SMP_BR_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_BR_STATE_WAIT_APP_RSP}, -/* BR_KEYS_RSP */{SMP_BR_PROC_SL_KEYS_RSP, SMP_BR_CHECK_AUTH_REQ,SMP_BR_STATE_WAIT_APP_RSP}, -/* BR_BOND_REQ */ {SMP_BR_KEY_DISTRIBUTION, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} +static const UINT8 smp_br_slave_wait_appln_response_table [][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_API_SEC_GRANT */ {SMP_BR_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_BR_STATE_WAIT_APP_RSP}, + /* BR_KEYS_RSP */{SMP_BR_PROC_SL_KEYS_RSP, SMP_BR_CHECK_AUTH_REQ, SMP_BR_STATE_WAIT_APP_RSP}, + /* BR_BOND_REQ */ {SMP_BR_KEY_DISTRIBUTION, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} }; -static const UINT8 smp_br_slave_bond_pending_table[][SMP_BR_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* BR_ID_INFO */ {SMP_PROC_ID_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, -/* BR_ID_ADDR */ {SMP_PROC_ID_ADDR, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, -/* BR_SIGN_INFO */ {SMP_PROC_SRK_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} +static const UINT8 smp_br_slave_bond_pending_table[][SMP_BR_SM_NUM_COLS] = { + /* Event Action Next State */ + /* BR_ID_INFO */ {SMP_PROC_ID_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, + /* BR_ID_ADDR */ {SMP_PROC_ID_ADDR, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING}, + /* BR_SIGN_INFO */ {SMP_PROC_SRK_INFO, SMP_BR_SM_NO_ACTION, SMP_BR_STATE_BOND_PENDING} }; -static const tSMP_BR_SM_TBL smp_br_state_table[][2] = -{ +static const tSMP_BR_SM_TBL smp_br_state_table[][2] = { /* SMP_BR_STATE_IDLE */ {smp_br_master_idle_table, smp_br_slave_idle_table}, @@ -252,8 +237,7 @@ static const tSMP_BR_SM_TBL smp_br_state_table[][2] = typedef const UINT8 (*tSMP_BR_ENTRY_TBL)[SMP_BR_STATE_MAX]; -static const tSMP_BR_ENTRY_TBL smp_br_entry_table[] = -{ +static const tSMP_BR_ENTRY_TBL smp_br_entry_table[] = { smp_br_master_entry_map, smp_br_slave_entry_map }; @@ -266,16 +250,13 @@ static const tSMP_BR_ENTRY_TBL smp_br_entry_table[] = *******************************************************************************/ void smp_set_br_state(tSMP_BR_STATE br_state) { - if (br_state < SMP_BR_STATE_MAX) - { + if (br_state < SMP_BR_STATE_MAX) { SMP_TRACE_DEBUG( "BR_State change: %s(%d) ==> %s(%d)", - smp_get_br_state_name(smp_cb.br_state), smp_cb.br_state, - smp_get_br_state_name(br_state), br_state ); + smp_get_br_state_name(smp_cb.br_state), smp_cb.br_state, + smp_get_br_state_name(br_state), br_state ); smp_cb.br_state = br_state; - } - else - { - SMP_TRACE_DEBUG("%s invalid br_state =%d", __FUNCTION__,br_state ); + } else { + SMP_TRACE_DEBUG("%s invalid br_state =%d", __FUNCTION__, br_state ); } } @@ -296,8 +277,9 @@ const char *smp_get_br_state_name(tSMP_BR_STATE br_state) { const char *p_str = smp_br_state_name[SMP_BR_STATE_MAX]; - if (br_state < SMP_BR_STATE_MAX) + if (br_state < SMP_BR_STATE_MAX) { p_str = smp_br_state_name[br_state]; + } return p_str; } @@ -305,13 +287,12 @@ const char *smp_get_br_state_name(tSMP_BR_STATE br_state) ** Function smp_get_br_event_name ** Returns The smp_br event name. *******************************************************************************/ -const char * smp_get_br_event_name(tSMP_BR_EVENT event) +const char *smp_get_br_event_name(tSMP_BR_EVENT event) { - const char * p_str = smp_br_event_name[SMP_BR_MAX_EVT - 1]; + const char *p_str = smp_br_event_name[SMP_BR_MAX_EVT - 1]; - if (event < SMP_BR_MAX_EVT) - { - p_str = smp_br_event_name[event- 1]; + if (event < SMP_BR_MAX_EVT) { + p_str = smp_br_event_name[event - 1]; } return p_str; } @@ -338,39 +319,32 @@ void smp_br_state_machine_event(tSMP_CB *p_cb, tSMP_BR_EVENT event, void *p_data tSMP_BR_ENTRY_TBL entry_table = smp_br_entry_table[p_cb->role]; SMP_TRACE_EVENT("main %s", __func__); - if (curr_state >= SMP_BR_STATE_MAX) - { + if (curr_state >= SMP_BR_STATE_MAX) { SMP_TRACE_DEBUG( "Invalid br_state: %d", curr_state) ; return; } SMP_TRACE_DEBUG( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]", - (p_cb->role == HCI_ROLE_SLAVE) ? "Slave" : "Master", - smp_get_br_state_name( p_cb->br_state), - p_cb->br_state, smp_get_br_event_name(event), event) ; + (p_cb->role == HCI_ROLE_SLAVE) ? "Slave" : "Master", + smp_get_br_state_name( p_cb->br_state), + p_cb->br_state, smp_get_br_event_name(event), event) ; /* look up the state table for the current state */ /* lookup entry / w event & curr_state */ /* If entry is ignore, return. * Otherwise, get state table (according to curr_state or all_state) */ if ((event <= SMP_BR_MAX_EVT) && ( (entry = entry_table[event - 1][curr_state]) - != SMP_BR_SM_IGNORE )) - { - if (entry & SMP_BR_ALL_TABLE_MASK) - { + != SMP_BR_SM_IGNORE )) { + if (entry & SMP_BR_ALL_TABLE_MASK) { entry &= ~SMP_BR_ALL_TABLE_MASK; state_table = smp_br_all_table; - } - else - { + } else { state_table = smp_br_state_table[curr_state][p_cb->role]; } - } - else - { + } else { SMP_TRACE_DEBUG( "Ignore event [%s (%d)] in state [%s (%d)]", - smp_get_br_event_name(event), event, - smp_get_br_state_name(curr_state), curr_state); + smp_get_br_event_name(event), event, + smp_get_br_state_name(curr_state), curr_state); return; } @@ -382,14 +356,10 @@ void smp_br_state_machine_event(tSMP_CB *p_cb, tSMP_BR_EVENT event, void *p_data * The action function may set the Param for cback. * Depending on param, call cback or free buffer. */ /* execute action functions */ - for (UINT8 i = 0; i < SMP_BR_NUM_ACTIONS; i++) - { - if ((action = state_table[entry - 1][i]) != SMP_BR_SM_NO_ACTION) - { + for (UINT8 i = 0; i < SMP_BR_NUM_ACTIONS; i++) { + if ((action = state_table[entry - 1][i]) != SMP_BR_SM_NO_ACTION) { (*smp_br_sm_action[action])(p_cb, (tSMP_INT_DATA *)p_data); - } - else - { + } else { break; } } diff --git a/components/bt/bluedroid/stack/smp/smp_cmac.c b/components/bt/bluedroid/stack/smp/smp_cmac.c old mode 100755 new mode 100644 index eb7571afd..21939435d --- a/components/bt/bluedroid/stack/smp/smp_cmac.c +++ b/components/bt/bluedroid/stack/smp/smp_cmac.c @@ -26,18 +26,17 @@ #if SMP_INCLUDED == TRUE // #include - #include +#include - #include "btm_ble_api.h" - #include "smp_int.h" - #include "hcimsgs.h" +#include "btm_ble_api.h" +#include "smp_int.h" +#include "hcimsgs.h" -typedef struct -{ +typedef struct { UINT8 *text; UINT16 len; UINT16 round; -}tCMAC_CB; +} tCMAC_CB; tCMAC_CB cmac_cb; @@ -55,11 +54,10 @@ void print128(BT_OCTET16 x, const UINT8 *key_name) SMP_TRACE_WARNING("%s(MSB ~ LSB) = ", key_name); - for (i = 0; i < 4; i ++) - { + for (i = 0; i < 4; i ++) { SMP_TRACE_WARNING("%02x %02x %02x %02x", - p[BT_OCTET16_LEN - i*4 -1], p[BT_OCTET16_LEN - i*4 -2], - p[BT_OCTET16_LEN - i*4 -3], p[BT_OCTET16_LEN - i*4 -4]); + p[BT_OCTET16_LEN - i * 4 - 1], p[BT_OCTET16_LEN - i * 4 - 2], + p[BT_OCTET16_LEN - i * 4 - 3], p[BT_OCTET16_LEN - i * 4 - 4]); } #endif } @@ -80,8 +78,9 @@ static void padding ( BT_OCTET16 dest, UINT8 length ) { UINT8 i, *p = dest; /* original last block */ - for ( i = length ; i < BT_OCTET16_LEN; i++ ) + for ( i = length ; i < BT_OCTET16_LEN; i++ ) { p[BT_OCTET16_LEN - i - 1] = ( i == length ) ? 0x80 : 0; + } } /******************************************************************************* ** @@ -97,9 +96,8 @@ static void leftshift_onebit(UINT8 *input, UINT8 *output) UINT8 i, overflow = 0 , next_overflow = 0; SMP_TRACE_EVENT ("leftshift_onebit "); /* input[0] is LSB */ - for ( i = 0; i < BT_OCTET16_LEN ; i ++ ) - { - next_overflow = (input[i] & 0x80) ? 1:0; + for ( i = 0; i < BT_OCTET16_LEN ; i ++ ) { + next_overflow = (input[i] & 0x80) ? 1 : 0; output[i] = (input[i] << 1) | overflow; overflow = next_overflow; } @@ -116,8 +114,7 @@ static void leftshift_onebit(UINT8 *input, UINT8 *output) *******************************************************************************/ static void cmac_aes_cleanup(void) { - if (cmac_cb.text != NULL) - { + if (cmac_cb.text != NULL) { GKI_freebuf(cmac_cb.text); } memset(&cmac_cb, 0, sizeof(tCMAC_CB)); @@ -141,12 +138,10 @@ static BOOLEAN cmac_aes_k_calculate(BT_OCTET16 key, UINT8 *p_signature, UINT16 t SMP_TRACE_EVENT ("cmac_aes_k_calculate "); - while (i <= cmac_cb.round) - { + while (i <= cmac_cb.round) { smp_xor_128(&cmac_cb.text[(cmac_cb.round - i)*BT_OCTET16_LEN], x); /* Mi' := Mi (+) X */ - if (!SMP_Encrypt(key, BT_OCTET16_LEN, &cmac_cb.text[(cmac_cb.round - i)*BT_OCTET16_LEN], BT_OCTET16_LEN, &output)) - { + if (!SMP_Encrypt(key, BT_OCTET16_LEN, &cmac_cb.text[(cmac_cb.round - i)*BT_OCTET16_LEN], BT_OCTET16_LEN, &output)) { err = 1; break; } @@ -155,22 +150,21 @@ static BOOLEAN cmac_aes_k_calculate(BT_OCTET16 key, UINT8 *p_signature, UINT16 t i ++; } - if (!err) - { + if (!err) { p_mac = output.param_buf + (BT_OCTET16_LEN - tlen); memcpy(p_signature, p_mac, tlen); SMP_TRACE_DEBUG("tlen = %d p_mac = %d", tlen, p_mac); SMP_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x", - *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); + *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3)); SMP_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x", - *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); + *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7)); return TRUE; - } - else + } else { return FALSE; + } } /******************************************************************************* ** @@ -193,12 +187,10 @@ static void cmac_prepare_last_block (BT_OCTET16 k1, BT_OCTET16 k2) SMP_TRACE_WARNING("flag = %d round = %d", flag, cmac_cb.round); - if ( flag ) - { /* last block is complete block */ + if ( flag ) { + /* last block is complete block */ smp_xor_128(&cmac_cb.text[0], k1); - } - else /* padding then xor with k2 */ - { + } else { /* padding then xor with k2 */ padding(&cmac_cb.text[0], (UINT8)(cmac_cb.len % 16)); smp_xor_128(&cmac_cb.text[0], k2); @@ -221,25 +213,19 @@ static void cmac_subkey_cont(tSMP_ENC *p) print128(pp, (const UINT8 *)"K1 before shift"); /* If MSB(L) = 0, then K1 = L << 1 */ - if ( (pp[BT_OCTET16_LEN - 1] & 0x80) != 0 ) - { + if ( (pp[BT_OCTET16_LEN - 1] & 0x80) != 0 ) { /* Else K1 = ( L << 1 ) (+) Rb */ leftshift_onebit(pp, k1); smp_xor_128(k1, const_Rb); - } - else - { + } else { leftshift_onebit(pp, k1); } - if ( (k1[BT_OCTET16_LEN - 1] & 0x80) != 0 ) - { + if ( (k1[BT_OCTET16_LEN - 1] & 0x80) != 0 ) { /* K2 = (K1 << 1) (+) Rb */ leftshift_onebit(k1, k2); smp_xor_128(k2, const_Rb); - } - else - { + } else { /* If MSB(K1) = 0, then K2 = K1 << 1 */ leftshift_onebit(k1, k2); } @@ -267,12 +253,11 @@ static BOOLEAN cmac_generate_subkey(BT_OCTET16 key) tSMP_ENC output; SMP_TRACE_EVENT (" cmac_generate_subkey"); - if (SMP_Encrypt(key, BT_OCTET16_LEN, z, BT_OCTET16_LEN, &output)) - { + if (SMP_Encrypt(key, BT_OCTET16_LEN, z, BT_OCTET16_LEN, &output)) { cmac_subkey_cont(&output);; - } - else + } else { ret = FALSE; + } return ret; } @@ -300,37 +285,34 @@ BOOLEAN aes_cipher_msg_auth_code(BT_OCTET16 key, UINT8 *input, UINT16 length, SMP_TRACE_EVENT ("%s", __func__); - if (n == 0) n = 1; + if (n == 0) { + n = 1; + } len = n * BT_OCTET16_LEN; SMP_TRACE_WARNING("AES128_CMAC started, allocate buffer size = %d", len); /* allocate a memory space of multiple of 16 bytes to hold text */ - if ((cmac_cb.text = (UINT8 *)GKI_getbuf(len)) != NULL) - { + if ((cmac_cb.text = (UINT8 *)GKI_getbuf(len)) != NULL) { cmac_cb.round = n; memset(cmac_cb.text, 0, len); diff = len - length; - if (input != NULL && length > 0) - { + if (input != NULL && length > 0) { memcpy(&cmac_cb.text[diff] , input, (int)length); cmac_cb.len = length; - } - else + } else { cmac_cb.len = 0; + } /* prepare calculation for subkey s and last block of data */ - if (cmac_generate_subkey(key)) - { + if (cmac_generate_subkey(key)) { /* start calculation */ ret = cmac_aes_k_calculate(key, p_signature, tlen); } /* clean up */ cmac_aes_cleanup(); - } - else - { + } else { ret = FALSE; SMP_TRACE_ERROR("No resources"); } @@ -338,7 +320,7 @@ BOOLEAN aes_cipher_msg_auth_code(BT_OCTET16 key, UINT8 *input, UINT16 length, return ret; } - #if 0 /* testing code, sample data from spec */ +#if 0 /* testing code, sample data from spec */ void test_cmac_cback(UINT8 *p_mac, UINT16 tlen) { SMP_TRACE_EVENT ("test_cmac_cback "); @@ -363,16 +345,15 @@ void test_cmac(void) 0x3c, 0x4f, 0xcf, 0x09, 0x88, 0x15, 0xf7, 0xab, 0xa6, 0xd2, 0xae, 0x28, 0x16, 0x15, 0x7e, 0x2b }; - UINT8 i =0, tmp; + UINT8 i = 0, tmp; UINT16 len; len = 64; - for (i = 0; i < len/2; i ++) - { + for (i = 0; i < len / 2; i ++) { tmp = M[i]; - M[i] = M[len -1 - i]; - M[len -1 - i] = tmp; + M[i] = M[len - 1 - i]; + M[len - 1 - i] = tmp; } @@ -383,6 +364,6 @@ void test_cmac(void) aes_cipher_msg_auth_code(key, M, len, 128, test_cmac_cback, 0); } - #endif +#endif #endif diff --git a/components/bt/bluedroid/stack/smp/smp_keys.c b/components/bt/bluedroid/stack/smp/smp_keys.c old mode 100755 new mode 100644 index 5f93950d9..c61e673ef --- a/components/bt/bluedroid/stack/smp/smp_keys.c +++ b/components/bt/bluedroid/stack/smp/smp_keys.c @@ -25,7 +25,7 @@ #if SMP_INCLUDED == TRUE #if SMP_DEBUG == TRUE - #include +#include #endif #include //#include "bt_utils.h" @@ -39,7 +39,7 @@ #include "controller.h" #ifndef SMP_MAX_ENC_REPEAT - #define SMP_MAX_ENC_REPEAT 3 +#define SMP_MAX_ENC_REPEAT 3 #endif static void smp_rand_back(tBTM_RAND_ENC *p); @@ -58,8 +58,7 @@ static void smp_process_private_key(tSMP_CB *p_cb); static void smp_finish_nonce_generation(tSMP_CB *p_cb); static void smp_process_new_nonce(tSMP_CB *p_cb); -static const tSMP_ACT smp_encrypt_action[] = -{ +static const tSMP_ACT smp_encrypt_action[] = { smp_generate_compare, /* SMP_GEN_COMPARE */ smp_generate_confirm, /* SMP_GEN_CONFIRM*/ smp_generate_stk, /* SMP_GEN_STK*/ @@ -84,13 +83,11 @@ void smp_debug_print_nbyte_little_endian(UINT8 *p, const UINT8 *key_name, UINT8 SMP_TRACE_WARNING("%s(LSB ~ MSB):\n", key_name); memset(p_buf, 0, sizeof(p_buf)); - row_count = len % col_count ? len / col_count + 1: len / col_count; + row_count = len % col_count ? len / col_count + 1 : len / col_count; ind = 0; - for (int row = 0; row < row_count; row++) - { - for (int column = 0, x = 0; (ind < len) && (column < col_count); column++, ind++) - { + for (int row = 0; row < row_count; row++) { + for (int column = 0, x = 0; (ind < len) && (column < col_count); column++, ind++) { x += sprintf((char *)&p_buf[x], "%02x ", p[ind]); } SMP_TRACE_WARNING(" [%03d]: %s", row * col_count, p_buf); @@ -105,18 +102,16 @@ void smp_debug_print_nbyte_big_endian (UINT8 *p, const UINT8 *key_name, UINT8 le SMP_TRACE_WARNING("%s(MSB ~ LSB):", key_name); memset(p_buf, 0, sizeof(p_buf)); - nrows = len % ncols ? len / ncols + 1: len / ncols; + nrows = len % ncols ? len / ncols + 1 : len / ncols; int ind = 0; int ncols = 32; /* num entries in one line */ int nrows; /* num lines */ int x; - for (int row = 0; row < nrows; row++) - { - for (int col = 0, x = 0; (ind < len) && (col < ncols); col++, ind++) - { - x += sprintf ((char *)&p_buf[len-x-1], "%02x ", p[ind]); + for (int row = 0; row < nrows; row++) { + for (int col = 0, x = 0; (ind < len) && (col < ncols); col++, ind++) { + x += sprintf ((char *)&p_buf[len - x - 1], "%02x ", p[ind]); } SMP_TRACE_WARNING("[%03d]: %s", row * ncols, p_buf); } @@ -146,20 +141,19 @@ BOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, UINT8 *p_rev_output = NULL; /* encrypted output in big endilan format */ SMP_TRACE_DEBUG ("%s\n", __func__); - if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) ) - { + if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) ) { SMP_TRACE_ERROR ("%s failed\n", __func__); return FALSE; } - if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE*4))) == NULL) - { + if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE * 4))) == NULL) { SMP_TRACE_ERROR ("%s failed unable to allocate buffer\n", __func__); return FALSE; } - if (pt_len > SMP_ENCRYT_DATA_SIZE) + if (pt_len > SMP_ENCRYT_DATA_SIZE) { pt_len = SMP_ENCRYT_DATA_SIZE; + } memset(p_start, 0, SMP_ENCRYT_DATA_SIZE * 4); p = p_start; @@ -209,8 +203,9 @@ void smp_generate_passkey(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) p_cb->rand_enc_proc_state = SMP_GEN_TK; /* generate MRand or SRand */ - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -234,8 +229,9 @@ void smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p) passkey &= ~SMP_PASSKEY_MASK; /* truncate by maximum value */ - while (passkey > BTM_MAX_PASSKEY_VAL) + while (passkey > BTM_MAX_PASSKEY_VAL) { passkey >>= 1; + } /* save the TK */ memset(p_cb->tk, 0, BT_OCTET16_LEN); @@ -244,17 +240,13 @@ void smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p) key.key_type = SMP_KEY_TYPE_TK; key.p_data = p_cb->tk; - if (p_cb->p_callback) - { + if (p_cb->p_callback) { (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda, (tSMP_EVT_DATA *)&passkey); } - if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) - { + if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) { smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &passkey); - } - else - { + } else { smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA *)&key); } } @@ -279,16 +271,13 @@ void smp_generate_stk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG ("%s\n", __func__); - if (p_cb->le_secure_connections_mode_is_used) - { + if (p_cb->le_secure_connections_mode_is_used) { SMP_TRACE_WARNING ("FOR LE SC LTK IS USED INSTEAD OF STK"); output.param_len = SMP_ENCRYT_KEY_SIZE; output.status = HCI_SUCCESS; output.opcode = HCI_BLE_ENCRYPT; memcpy(output.param_buf, p_cb->ltk, SMP_ENCRYT_DATA_SIZE); - } - else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) - { + } else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) { SMP_TRACE_ERROR("%s failed", __func__); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); return; @@ -315,8 +304,9 @@ void smp_generate_srand_mrand_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG ("%s\n", __func__); p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND; /* generate MRand or SRand */ - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -336,8 +326,9 @@ void smp_generate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG ("%s\n", __func__); p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND_CONT; /* generate 64 MSB of MRand or SRand */ - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -361,30 +352,25 @@ void smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) BOOLEAN div_status; SMP_TRACE_DEBUG ("%s\n", __FUNCTION__); - if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) - { + if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) { smp_br_process_link_key(p_cb, NULL); return; - } - else if (p_cb->le_secure_connections_mode_is_used) - { + } else if (p_cb->le_secure_connections_mode_is_used) { smp_process_secure_connection_long_term_key(); return; } div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); - if (div_status) - { + if (div_status) { smp_generate_ltk_cont(p_cb, NULL); - } - else - { + } else { SMP_TRACE_DEBUG ("Generate DIV for LTK\n"); p_cb->rand_enc_proc_state = SMP_GEN_DIV_LTK; /* generate MRand or SRand */ - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } } @@ -404,8 +390,8 @@ void smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) BT_OCTET16 er; UINT8 buffer[4]; /* for (r || DIV) r=1*/ - UINT16 r=1; - UINT8 *p=buffer; + UINT16 r = 1; + UINT8 *p = buffer; tSMP_ENC output; tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; @@ -415,20 +401,14 @@ void smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) UINT16_TO_STREAM(p, p_cb->div); UINT16_TO_STREAM(p, r); - if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) - { + if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) { SMP_TRACE_ERROR("smp_generate_csrk failed\n"); - if (p_cb->smp_over_br) - { + if (p_cb->smp_over_br) { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); - } - else - { + } else { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); } - } - else - { + } else { memcpy((void *)p_cb->csrk, output.param_buf, BT_OCTET16_LEN); smp_send_csrk_info(p_cb, NULL); } @@ -454,16 +434,14 @@ void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) SMP_TRACE_DEBUG ("smp_generate_csrk"); div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); - if (div_status) - { + if (div_status) { smp_compute_csrk(p_cb, NULL); - } - else - { + } else { SMP_TRACE_DEBUG ("Generate DIV for CSRK"); p_cb->rand_enc_proc_state = SMP_GEN_DIV_CSRK; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } } @@ -525,16 +503,14 @@ void smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1) SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm\n"); - if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) - { + if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) { SMP_TRACE_ERROR("can not generate confirm for unknown device\n"); return; } BTM_ReadConnectionAddr( p_cb->pairing_bda, p_cb->local_bda, &p_cb->addr_type); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { /* LSB : rat': initiator's(local) address type */ UINT8_TO_STREAM(p, p_cb->addr_type); /* LSB : iat': responder's address type */ @@ -543,9 +519,7 @@ void smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1) smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ); /* concatinate pres */ smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP); - } - else - { + } else { /* LSB : iat': initiator's address type */ UINT8_TO_STREAM(p, addr_type); /* LSB : rat': responder's(local) address type */ @@ -576,9 +550,8 @@ void smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2) UINT8 *p = (UINT8 *)p2; BD_ADDR remote_bda; tBLE_ADDR_TYPE addr_type = 0; - SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm\n"); - if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) - { + SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm\n"); + if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) { SMP_TRACE_ERROR("can not generate confirm p2 for unknown device\n"); return; } @@ -587,15 +560,12 @@ void smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2) memset(p, 0, sizeof(BT_OCTET16)); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { /* LSB ra */ BDADDR_TO_STREAM(p, remote_bda); /* ia */ BDADDR_TO_STREAM(p, p_cb->local_bda); - } - else - { + } else { /* LSB ra */ BDADDR_TO_STREAM(p, p_cb->local_bda); /* ia */ @@ -634,13 +604,10 @@ void smp_calculate_comfirm (tSMP_CB *p_cb, BT_OCTET16 rand, BD_ADDR bda) smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1' = r XOR p1", 16); /* calculate e(k, r XOR p1), where k = TK */ - if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)) - { + if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)) { SMP_TRACE_ERROR("smp_generate_csrk failed"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); - } - else - { + } else { smp_calculate_comfirm_cont(p_cb, &output); } } @@ -674,23 +641,19 @@ static void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p) smp_debug_print_nbyte_little_endian ((UINT8 *)p2, (const UINT8 *)"p2' = C1 xor p2", 16); /* calculate: Confirm = E(k, p1' XOR p2) */ - if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output)) - { + if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output)) { SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed\n"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); - } - else - { - SMP_TRACE_DEBUG("p_cb->rand_enc_proc_state=%d\n",p_cb->rand_enc_proc_state); - switch (p_cb->rand_enc_proc_state) - { - case SMP_GEN_CONFIRM: - smp_process_confirm(p_cb, &output); - break; + } else { + SMP_TRACE_DEBUG("p_cb->rand_enc_proc_state=%d\n", p_cb->rand_enc_proc_state); + switch (p_cb->rand_enc_proc_state) { + case SMP_GEN_CONFIRM: + smp_process_confirm(p_cb, &output); + break; - case SMP_GEN_COMPARE: - smp_process_compare(p_cb, &output); - break; + case SMP_GEN_COMPARE: + smp_process_compare(p_cb, &output); + break; } } } @@ -760,7 +723,7 @@ static void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p) key.key_type = SMP_KEY_TYPE_CFM; key.p_data = p->param_buf; - + smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); } @@ -786,7 +749,7 @@ static void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p) #endif key.key_type = SMP_KEY_TYPE_CMP; key.p_data = p->param_buf; - //smp_set_state(SMP_STATE_CONFIRM); + //smp_set_state(SMP_STATE_CONFIRM); smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); } @@ -838,13 +801,10 @@ static void smp_generate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/ if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div, - sizeof(UINT16), &output)) - { + sizeof(UINT16), &output)) { SMP_TRACE_ERROR("%s failed\n", __func__); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); - } - else - { + } else { /* mask the LTK */ smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf); memcpy((void *)p_cb->ltk, output.param_buf, BT_OCTET16_LEN); @@ -874,13 +834,10 @@ static void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p) BTM_GetDeviceDHK(dhk); if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand, - BT_OCTET8_LEN, &output)) - { + BT_OCTET8_LEN, &output)) { SMP_TRACE_ERROR("smp_generate_y failed"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); - } - else - { + } else { smp_process_ediv(p_cb, &output); } } @@ -903,8 +860,9 @@ static void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p) /* generate random vector */ SMP_TRACE_DEBUG ("smp_generate_rand_vector\n"); p_cb->rand_enc_proc_state = SMP_GEN_RAND_V; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -919,7 +877,7 @@ static void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p) static void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p) { tSMP_KEY key; - UINT8 *pp= p->param_buf; + UINT8 *pp = p->param_buf; UINT16 y; SMP_TRACE_DEBUG ("smp_process_ediv "); @@ -951,13 +909,10 @@ BOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output) SMP_TRACE_DEBUG ("%s\n", __func__); memset(p, 0, BT_OCTET16_LEN); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { memcpy(p, p_cb->rand, BT_OCTET8_LEN); memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN); - } - else - { + } else { memcpy(p, p_cb->rrand, BT_OCTET8_LEN); memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN); } @@ -965,8 +920,7 @@ BOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output) BOOLEAN encrypted; /* generate STK = Etk(rand|rrand)*/ encrypted = SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, output); - if (!encrypted) - { + if (!encrypted) { SMP_TRACE_ERROR("%s failed\n", __func__); } return encrypted; @@ -986,10 +940,11 @@ BOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output) *******************************************************************************/ void smp_create_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { - SMP_TRACE_DEBUG ("%s",__FUNCTION__); + SMP_TRACE_DEBUG ("%s", __FUNCTION__); p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_0_7; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -1011,21 +966,20 @@ void smp_create_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) void smp_use_oob_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG ("%s req_oob_type: %d, role: %d\n", - __func__, p_cb->req_oob_type, p_cb->role); + __func__, p_cb->req_oob_type, p_cb->role); - switch (p_cb->req_oob_type) - { - case SMP_OOB_BOTH: - case SMP_OOB_LOCAL: - SMP_TRACE_DEBUG("%s restore secret key\n", __func__); - memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used, BT_OCTET32_LEN); - smp_process_private_key(p_cb); - break; - default: - SMP_TRACE_DEBUG("%s create secret key anew\n", __func__); - smp_set_state(SMP_STATE_PAIR_REQ_RSP); - smp_decide_association_model(p_cb, NULL); - break; + switch (p_cb->req_oob_type) { + case SMP_OOB_BOTH: + case SMP_OOB_LOCAL: + SMP_TRACE_DEBUG("%s restore secret key\n", __func__); + memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used, BT_OCTET32_LEN); + smp_process_private_key(p_cb); + break; + default: + SMP_TRACE_DEBUG("%s create secret key anew\n", __func__); + smp_set_state(SMP_STATE_PAIR_REQ_RSP); + smp_decide_association_model(p_cb, NULL); + break; } } @@ -1043,36 +997,38 @@ void smp_continue_private_key_creation (tSMP_CB *p_cb, tBTM_RAND_ENC *p) UINT8 state = p_cb->rand_enc_proc_state & ~0x80; SMP_TRACE_DEBUG ("%s state=0x%x\n", __func__, state); - switch (state) - { - case SMP_GENERATE_PRIVATE_KEY_0_7: - memcpy((void *)p_cb->private_key, p->param_buf, p->param_len); - p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_8_15; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) - smp_rand_back(NULL); - break; + switch (state) { + case SMP_GENERATE_PRIVATE_KEY_0_7: + memcpy((void *)p_cb->private_key, p->param_buf, p->param_len); + p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_8_15; + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { + smp_rand_back(NULL); + } + break; - case SMP_GENERATE_PRIVATE_KEY_8_15: - memcpy((void *)&p_cb->private_key[8], p->param_buf, p->param_len); - p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_16_23; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) - smp_rand_back(NULL); - break; + case SMP_GENERATE_PRIVATE_KEY_8_15: + memcpy((void *)&p_cb->private_key[8], p->param_buf, p->param_len); + p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_16_23; + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { + smp_rand_back(NULL); + } + break; - case SMP_GENERATE_PRIVATE_KEY_16_23: - memcpy((void *)&p_cb->private_key[16], p->param_buf, p->param_len); - p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_24_31; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) - smp_rand_back(NULL); - break; + case SMP_GENERATE_PRIVATE_KEY_16_23: + memcpy((void *)&p_cb->private_key[16], p->param_buf, p->param_len); + p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_24_31; + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { + smp_rand_back(NULL); + } + break; - case SMP_GENERATE_PRIVATE_KEY_24_31: - memcpy((void *)&p_cb->private_key[24], p->param_buf, p->param_len); - smp_process_private_key (p_cb); - break; + case SMP_GENERATE_PRIVATE_KEY_24_31: + memcpy((void *)&p_cb->private_key[24], p->param_buf, p->param_len); + smp_process_private_key (p_cb); + break; - default: - break; + default: + break; } return; @@ -1097,7 +1053,7 @@ void smp_process_private_key(tSMP_CB *p_cb) SMP_TRACE_DEBUG ("%s", __FUNCTION__); memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN); - ECC_PointMult(&public_key, &(curve_p256.G), (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); + ECC_PointMult(&public_key, &(curve_p256.G), (DWORD *) private_key, KEY_LENGTH_DWORDS_P256); memcpy(p_cb->loc_publ_key.x, public_key.x, BT_OCTET32_LEN); memcpy(p_cb->loc_publ_key.y, public_key.y, BT_OCTET32_LEN); @@ -1134,7 +1090,7 @@ void smp_compute_dhkey (tSMP_CB *p_cb) memcpy(peer_publ_key.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN); memcpy(peer_publ_key.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN); - ECC_PointMult(&new_publ_key, &peer_publ_key, (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); + ECC_PointMult(&new_publ_key, &peer_publ_key, (DWORD *) private_key, KEY_LENGTH_DWORDS_P256); memcpy(p_cb->dhkey, new_publ_key.x, BT_OCTET32_LEN); @@ -1166,31 +1122,30 @@ void smp_calculate_local_commitment(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __FUNCTION__); - switch (p_cb->selected_association_model) - { - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - if (p_cb->role == HCI_ROLE_MASTER) - SMP_TRACE_WARNING ("local commitment calc on master is not expected \ + switch (p_cb->selected_association_model) { + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + if (p_cb->role == HCI_ROLE_MASTER) + SMP_TRACE_WARNING ("local commitment calc on master is not expected \ for Just Works/Numeric Comparison models\n"); - smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 0, - p_cb->commitment); - break; - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - random_input = smp_calculate_random_input(p_cb->local_random, p_cb->round); - smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, - random_input, p_cb->commitment); - break; - case SMP_MODEL_SEC_CONN_OOB: - SMP_TRACE_WARNING ("local commitment calc is expected for OOB model BEFORE pairing\n"); - smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->loc_publ_key.x, p_cb->local_random, 0, - p_cb->commitment); - break; - default: - SMP_TRACE_ERROR("Association Model = %d is not used in LE SC\n", - p_cb->selected_association_model); - return; + smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 0, + p_cb->commitment); + break; + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + random_input = smp_calculate_random_input(p_cb->local_random, p_cb->round); + smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, + random_input, p_cb->commitment); + break; + case SMP_MODEL_SEC_CONN_OOB: + SMP_TRACE_WARNING ("local commitment calc is expected for OOB model BEFORE pairing\n"); + smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->loc_publ_key.x, p_cb->local_random, 0, + p_cb->commitment); + break; + default: + SMP_TRACE_ERROR("Association Model = %d is not used in LE SC\n", + p_cb->selected_association_model); + return; } SMP_TRACE_EVENT ("local commitment calculation is completed"); @@ -1212,30 +1167,29 @@ void smp_calculate_peer_commitment(tSMP_CB *p_cb, BT_OCTET16 output_buf) SMP_TRACE_DEBUG ("%s", __FUNCTION__); - switch (p_cb->selected_association_model) - { - case SMP_MODEL_SEC_CONN_JUSTWORKS: - case SMP_MODEL_SEC_CONN_NUM_COMP: - if (p_cb->role == HCI_ROLE_SLAVE) - SMP_TRACE_WARNING ("peer commitment calc on slave is not expected \ + switch (p_cb->selected_association_model) { + case SMP_MODEL_SEC_CONN_JUSTWORKS: + case SMP_MODEL_SEC_CONN_NUM_COMP: + if (p_cb->role == HCI_ROLE_SLAVE) + SMP_TRACE_WARNING ("peer commitment calc on slave is not expected \ for Just Works/Numeric Comparison models\n"); - smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 0, - output_buf); - break; - case SMP_MODEL_SEC_CONN_PASSKEY_ENT: - case SMP_MODEL_SEC_CONN_PASSKEY_DISP: - ri = smp_calculate_random_input(p_cb->peer_random, p_cb->round); - smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, ri, - output_buf); - break; - case SMP_MODEL_SEC_CONN_OOB: - smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->peer_publ_key.x, p_cb->peer_random, 0, - output_buf); - break; - default: - SMP_TRACE_ERROR("Association Model = %d is not used in LE SC\n", - p_cb->selected_association_model); - return; + smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 0, + output_buf); + break; + case SMP_MODEL_SEC_CONN_PASSKEY_ENT: + case SMP_MODEL_SEC_CONN_PASSKEY_DISP: + ri = smp_calculate_random_input(p_cb->peer_random, p_cb->round); + smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, ri, + output_buf); + break; + case SMP_MODEL_SEC_CONN_OOB: + smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->peer_publ_key.x, p_cb->peer_random, 0, + output_buf); + break; + default: + SMP_TRACE_ERROR("Association Model = %d is not used in LE SC\n", + p_cb->selected_association_model); + return; } SMP_TRACE_EVENT ("peer commitment calculation is completed\n"); @@ -1322,25 +1276,21 @@ void smp_calculate_f4(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 z, UINT8 *c) ** *******************************************************************************/ void smp_calculate_numeric_comparison_display_number(tSMP_CB *p_cb, - tSMP_INT_DATA *p_data) + tSMP_INT_DATA *p_data) { SMP_TRACE_DEBUG ("%s", __func__); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { p_cb->number_to_display = smp_calculate_g2(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, p_cb->rrand); - } - else - { + } else { p_cb->number_to_display = smp_calculate_g2(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, p_cb->rand); } - if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) - { + if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) { UINT8 reason; reason = p_cb->failure = SMP_PAIR_FAIL_UNKNOWN; smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); @@ -1413,9 +1363,8 @@ UINT32 smp_calculate_g2(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 *y) smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); #endif - if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) - { - SMP_TRACE_ERROR("%s failed",__FUNCTION__); + if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) { + SMP_TRACE_ERROR("%s failed", __FUNCTION__); return (BTM_MAX_PASSKEY_VAL + 1); } @@ -1432,8 +1381,9 @@ UINT32 smp_calculate_g2(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 *y) smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32", 4); #endif - while (vres > BTM_MAX_PASSKEY_VAL) + while (vres > BTM_MAX_PASSKEY_VAL) { vres -= (BTM_MAX_PASSKEY_VAL + 1); + } #if SMP_DEBUG == TRUE p_prnt = (UINT8 *) &vres; smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32 mod 10**6", 4); @@ -1502,7 +1452,7 @@ BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, UINT8 *mac_key, UINT8 *ltk) { BT_OCTET16 t; /* AES-CMAC output in smp_calculate_f5_key(...), key in */ - /* smp_calculate_f5_mackey_or_long_term_key(...) */ + /* smp_calculate_f5_mackey_or_long_term_key(...) */ #if SMP_DEBUG == TRUE UINT8 *p_prnt = NULL; #endif @@ -1534,12 +1484,11 @@ BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, p_prnt = a1; smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A1", 7); p_prnt = a2; - smp_debug_print_nbyte_little_endian (p_prnt,(const UINT8 *) "A2", 7); + smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *) "A2", 7); #endif - if (!smp_calculate_f5_key(w, t)) - { - SMP_TRACE_ERROR("%s failed to calc T",__FUNCTION__); + if (!smp_calculate_f5_key(w, t)) { + SMP_TRACE_ERROR("%s failed to calc T", __FUNCTION__); return FALSE; } #if SMP_DEBUG == TRUE @@ -1548,8 +1497,7 @@ BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, #endif if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_mac_key, key_id, n1, n2, a1, a2, - length, mac_key)) - { + length, mac_key)) { SMP_TRACE_ERROR("%s failed to calc MacKey", __FUNCTION__); return FALSE; } @@ -1559,9 +1507,8 @@ BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, #endif if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_ltk, key_id, n1, n2, a1, a2, - length, ltk)) - { - SMP_TRACE_ERROR("%s failed to calc LTK",__FUNCTION__); + length, ltk)) { + SMP_TRACE_ERROR("%s failed to calc LTK", __FUNCTION__); return FALSE; } #if SMP_DEBUG == TRUE @@ -1605,15 +1552,15 @@ BOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, ** *******************************************************************************/ BOOLEAN smp_calculate_f5_mackey_or_long_term_key(UINT8 *t, UINT8 *counter, - UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, - UINT8 *length, UINT8 *mac) + UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, + UINT8 *length, UINT8 *mac) { UINT8 *p = NULL; UINT8 cmac[BT_OCTET16_LEN]; UINT8 key[BT_OCTET16_LEN]; UINT8 msg_len = 1 /* Counter size */ + 4 /* keyID size */ + - BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + - 7 /* A1 size*/ + 7 /* A2 size*/ + 2 /* Length size */; + BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + + 7 /* A1 size*/ + 7 /* A2 size*/ + 2 /* Length size */; UINT8 msg[1 + 4 + BT_OCTET16_LEN + BT_OCTET16_LEN + 7 + 7 + 2]; BOOLEAN ret = TRUE; #if SMP_DEBUG == TRUE @@ -1659,8 +1606,7 @@ BOOLEAN smp_calculate_f5_mackey_or_long_term_key(UINT8 *t, UINT8 *counter, smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", msg_len); #endif - if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) - { + if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) { SMP_TRACE_ERROR("%s failed", __FUNCTION__); ret = FALSE; } @@ -1733,8 +1679,7 @@ BOOLEAN smp_calculate_f5_key(UINT8 *w, UINT8 *t) BT_OCTET16 cmac; BOOLEAN ret = TRUE; - if (!aes_cipher_msg_auth_code(key, msg, BT_OCTET32_LEN, BT_OCTET16_LEN, cmac)) - { + if (!aes_cipher_msg_auth_code(key, msg, BT_OCTET32_LEN, BT_OCTET16_LEN, cmac)) { SMP_TRACE_ERROR("%s failed", __FUNCTION__); ret = FALSE; } @@ -1806,8 +1751,7 @@ void smp_calculate_peer_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) ret = smp_calculate_f6(p_cb->mac_key, p_cb->rrand, p_cb->rand, p_cb->local_random, iocap, b, a, param_buf); - if (ret) - { + if (ret) { SMP_TRACE_EVENT ("peer DHKey check calculation is completed"); #if (SMP_DEBUG == TRUE) smp_debug_print_nbyte_little_endian (param_buf, (const UINT8 *)"peer DHKey check", @@ -1816,9 +1760,7 @@ void smp_calculate_peer_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) key.key_type = SMP_KEY_TYPE_PEER_DHK_CHCK; key.p_data = param_buf; smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &key); - } - else - { + } else { SMP_TRACE_EVENT ("peer DHKey check calculation failed"); smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); } @@ -1900,8 +1842,7 @@ BOOLEAN smp_calculate_f6(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *r, UINT8 *iocap, #endif BOOLEAN ret = TRUE; - if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) - { + if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) { SMP_TRACE_ERROR("%s failed", __FUNCTION__); ret = FALSE; } @@ -1934,24 +1875,18 @@ BOOLEAN smp_calculate_link_key_from_long_term_key(tSMP_CB *p_cb) SMP_TRACE_DEBUG ("%s", __func__); - if (p_cb->id_addr_rcvd && p_cb->id_addr_type == BLE_ADDR_PUBLIC) - { + if (p_cb->id_addr_rcvd && p_cb->id_addr_type == BLE_ADDR_PUBLIC) { SMP_TRACE_DEBUG ("Use rcvd identity address as BD_ADDR of LK rcvd identity address"); memcpy(bda_for_lk, p_cb->id_addr, BD_ADDR_LEN); - } - else if ((BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda_for_lk, &conn_addr_type)) && - conn_addr_type == BLE_ADDR_PUBLIC) - { + } else if ((BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda_for_lk, &conn_addr_type)) && + conn_addr_type == BLE_ADDR_PUBLIC) { SMP_TRACE_DEBUG ("Use rcvd connection address as BD_ADDR of LK"); - } - else - { + } else { SMP_TRACE_WARNING ("Don't have peer public address to associate with LK"); return FALSE; } - if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) - { + if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) { SMP_TRACE_ERROR("%s failed to find Security Record", __func__); return FALSE; } @@ -1959,47 +1894,38 @@ BOOLEAN smp_calculate_link_key_from_long_term_key(tSMP_CB *p_cb) BT_OCTET16 intermediate_link_key; BOOLEAN ret = TRUE; - ret = smp_calculate_h6(p_cb->ltk, (UINT8 *)"1pmt" /* reversed "tmp1" */,intermediate_link_key); - if (!ret) - { + ret = smp_calculate_h6(p_cb->ltk, (UINT8 *)"1pmt" /* reversed "tmp1" */, intermediate_link_key); + if (!ret) { SMP_TRACE_ERROR("%s failed to derive intermediate_link_key", __func__); return ret; } BT_OCTET16 link_key; ret = smp_calculate_h6(intermediate_link_key, (UINT8 *) "rbel" /* reversed "lebr" */, link_key); - if (!ret) - { + if (!ret) { SMP_TRACE_ERROR("%s failed", __func__); - } - else - { + } else { UINT8 link_key_type; - if (btm_cb.security_mode == BTM_SEC_MODE_SC) - { + if (btm_cb.security_mode == BTM_SEC_MODE_SC) { /* Secure Connections Only Mode */ link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; - } - else if (controller_get_interface()->supports_secure_connections()) - { + } else if (controller_get_interface()->supports_secure_connections()) { /* both transports are SC capable */ - if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) + if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) { link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; - else + } else { link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB_P_256; - } - else if (btm_cb.security_mode == BTM_SEC_MODE_SP) - { + } + } else if (btm_cb.security_mode == BTM_SEC_MODE_SP) { /* BR/EDR transport is SSP capable */ - if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) + if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) { link_key_type = BTM_LKEY_TYPE_AUTH_COMB; - else + } else { link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; - } - else - { + } + } else { SMP_TRACE_ERROR ("%s failed to update link_key. Sec Mode = %d, sm4 = 0x%02x", - __func__, btm_cb.security_mode, p_dev_rec->sm4); + __func__, btm_cb.security_mode, p_dev_rec->sm4); return FALSE; } @@ -2036,25 +1962,22 @@ BOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb) SMP_TRACE_DEBUG ("%s", __FUNCTION__); - if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) - { - SMP_TRACE_ERROR("%s failed to find Security Record",__FUNCTION__); + if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) { + SMP_TRACE_ERROR("%s failed to find Security Record", __FUNCTION__); return FALSE; } UINT8 br_link_key_type; if ((br_link_key_type = BTM_SecGetDeviceLinkKeyType (p_cb->pairing_bda)) - == BTM_LKEY_TYPE_IGNORE) - { - SMP_TRACE_ERROR("%s failed to retrieve BR link type",__FUNCTION__); + == BTM_LKEY_TYPE_IGNORE) { + SMP_TRACE_ERROR("%s failed to retrieve BR link type", __FUNCTION__); return FALSE; } if ((br_link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256) && - (br_link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) - { + (br_link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) { SMP_TRACE_ERROR("%s LE SC LTK can't be derived from LK %d", - __FUNCTION__, br_link_key_type); + __FUNCTION__, br_link_key_type); return FALSE; } @@ -2069,9 +1992,8 @@ BOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb) ret = smp_calculate_h6(rev_link_key, (UINT8 *) "2pmt" /* reversed "tmp2" */, intermediate_long_term_key); - if (!ret) - { - SMP_TRACE_ERROR("%s failed to derive intermediate_long_term_key",__FUNCTION__); + if (!ret) { + SMP_TRACE_ERROR("%s failed to derive intermediate_long_term_key", __FUNCTION__); return ret; } @@ -2079,15 +2001,12 @@ BOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb) ret = smp_calculate_h6(intermediate_long_term_key, (UINT8 *) "elrb" /* reversed "brle" */, p_cb->ltk); - if (!ret) - { - SMP_TRACE_ERROR("%s failed",__FUNCTION__); - } - else - { + if (!ret) { + SMP_TRACE_ERROR("%s failed", __FUNCTION__); + } else { p_cb->sec_level = (br_link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) - ? SMP_SEC_AUTHENTICATED : SMP_SEC_UNAUTHENTICATE; - SMP_TRACE_EVENT ("%s is completed",__FUNCTION__); + ? SMP_SEC_AUTHENTICATED : SMP_SEC_UNAUTHENTICATE; + SMP_TRACE_EVENT ("%s is completed", __FUNCTION__); } return ret; @@ -2117,7 +2036,7 @@ BOOLEAN smp_calculate_h6(UINT8 *w, UINT8 *keyid, UINT8 *c) UINT8 *p_print = NULL; #endif - SMP_TRACE_DEBUG ("%s",__FUNCTION__); + SMP_TRACE_DEBUG ("%s", __FUNCTION__); #if SMP_DEBUG == TRUE p_print = w; smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"W", BT_OCTET16_LEN); @@ -2144,14 +2063,13 @@ BOOLEAN smp_calculate_h6(UINT8 *w, UINT8 *keyid, UINT8 *c) #if SMP_DEBUG == TRUE p_print = msg; - smp_debug_print_nbyte_little_endian (p_print,(const UINT8 *) "M", msg_len); + smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *) "M", msg_len); #endif BOOLEAN ret = TRUE; UINT8 cmac[BT_OCTET16_LEN]; - if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) - { - SMP_TRACE_ERROR("%s failed",__FUNCTION__); + if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) { + SMP_TRACE_ERROR("%s failed", __FUNCTION__); ret = FALSE; } @@ -2178,8 +2096,9 @@ void smp_start_nonce_generation(tSMP_CB *p_cb) { SMP_TRACE_DEBUG("%s", __FUNCTION__); p_cb->rand_enc_proc_state = SMP_GEN_NONCE_0_7; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -2195,8 +2114,9 @@ void smp_finish_nonce_generation(tSMP_CB *p_cb) { SMP_TRACE_DEBUG("%s", __FUNCTION__); p_cb->rand_enc_proc_state = SMP_GEN_NONCE_8_15; - if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) + if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) { smp_rand_back(NULL); + } } /******************************************************************************* @@ -2232,55 +2152,53 @@ static void smp_rand_back(tBTM_RAND_ENC *p) UINT8 state = p_cb->rand_enc_proc_state & ~0x80; SMP_TRACE_DEBUG ("%s state=0x%x", __FUNCTION__, state); - if (p && p->status == HCI_SUCCESS) - { - switch (state) - { - case SMP_GEN_SRAND_MRAND: - memcpy((void *)p_cb->rand, p->param_buf, p->param_len); - smp_generate_rand_cont(p_cb, NULL); - break; + if (p && p->status == HCI_SUCCESS) { + switch (state) { + case SMP_GEN_SRAND_MRAND: + memcpy((void *)p_cb->rand, p->param_buf, p->param_len); + smp_generate_rand_cont(p_cb, NULL); + break; - case SMP_GEN_SRAND_MRAND_CONT: - memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); - smp_generate_confirm(p_cb, NULL); - break; + case SMP_GEN_SRAND_MRAND_CONT: + memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); + smp_generate_confirm(p_cb, NULL); + break; - case SMP_GEN_DIV_LTK: - STREAM_TO_UINT16(p_cb->div, pp); - smp_generate_ltk_cont(p_cb, NULL); - break; + case SMP_GEN_DIV_LTK: + STREAM_TO_UINT16(p_cb->div, pp); + smp_generate_ltk_cont(p_cb, NULL); + break; - case SMP_GEN_DIV_CSRK: - STREAM_TO_UINT16(p_cb->div, pp); - smp_compute_csrk(p_cb, NULL); - break; + case SMP_GEN_DIV_CSRK: + STREAM_TO_UINT16(p_cb->div, pp); + smp_compute_csrk(p_cb, NULL); + break; - case SMP_GEN_TK: - smp_proc_passkey(p_cb, p); - break; + case SMP_GEN_TK: + smp_proc_passkey(p_cb, p); + break; - case SMP_GEN_RAND_V: - memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN); - smp_generate_y(p_cb, NULL); - break; + case SMP_GEN_RAND_V: + memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN); + smp_generate_y(p_cb, NULL); + break; - case SMP_GENERATE_PRIVATE_KEY_0_7: - case SMP_GENERATE_PRIVATE_KEY_8_15: - case SMP_GENERATE_PRIVATE_KEY_16_23: - case SMP_GENERATE_PRIVATE_KEY_24_31: - smp_continue_private_key_creation(p_cb, p); - break; + case SMP_GENERATE_PRIVATE_KEY_0_7: + case SMP_GENERATE_PRIVATE_KEY_8_15: + case SMP_GENERATE_PRIVATE_KEY_16_23: + case SMP_GENERATE_PRIVATE_KEY_24_31: + smp_continue_private_key_creation(p_cb, p); + break; - case SMP_GEN_NONCE_0_7: - memcpy((void *)p_cb->rand, p->param_buf, p->param_len); - smp_finish_nonce_generation(p_cb); - break; + case SMP_GEN_NONCE_0_7: + memcpy((void *)p_cb->rand, p->param_buf, p->param_len); + smp_finish_nonce_generation(p_cb); + break; - case SMP_GEN_NONCE_8_15: - memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); - smp_process_new_nonce(p_cb); - break; + case SMP_GEN_NONCE_8_15: + memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); + smp_process_new_nonce(p_cb); + break; } return; diff --git a/components/bt/bluedroid/stack/smp/smp_l2c.c b/components/bt/bluedroid/stack/smp/smp_l2c.c old mode 100755 new mode 100644 index 8988983bd..6eb5a38c5 --- a/components/bt/bluedroid/stack/smp/smp_l2c.c +++ b/components/bt/bluedroid/stack/smp/smp_l2c.c @@ -36,7 +36,7 @@ static void smp_tx_complete_callback(UINT16 cid, UINT16 num_pkt); static void smp_connect_callback(UINT16 channel, BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, - tBT_TRANSPORT transport); + tBT_TRANSPORT transport); static void smp_data_received(UINT16 channel, BD_ADDR bd_addr, BT_HDR *p_buf); static void smp_br_connect_callback(UINT16 channel, BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, @@ -95,21 +95,19 @@ static void smp_connect_callback (UINT16 channel, BD_ADDR bd_addr, BOOLEAN conne SMP_TRACE_EVENT ("SMDBG l2c %s\n", __FUNCTION__); - if (transport == BT_TRANSPORT_BR_EDR || memcmp(bd_addr, dummy_bda, BD_ADDR_LEN) == 0) + if (transport == BT_TRANSPORT_BR_EDR || memcmp(bd_addr, dummy_bda, BD_ADDR_LEN) == 0) { return; + } - if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0) - { + if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0) { SMP_TRACE_EVENT ("%s() for pairing BDA: %08x%04x Event: %s\n", - __FUNCTION__, - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], - (connected) ? "connected" : "disconnected"); + __FUNCTION__, + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], + (connected) ? "connected" : "disconnected"); - if (connected) - { - if(!p_cb->connect_initialized) - { + if (connected) { + if (!p_cb->connect_initialized) { p_cb->connect_initialized = TRUE; /* initiating connection established */ p_cb->role = L2CA_GetBleConnRole(bd_addr); @@ -120,9 +118,7 @@ static void smp_connect_callback (UINT16 channel, BD_ADDR bd_addr, BOOLEAN conne p_cb->cb_evt = SMP_IO_CAP_REQ_EVT; smp_sm_event(p_cb, SMP_L2CAP_CONN_EVT, NULL); } - } - else - { + } else { int_data.reason = reason; /* Disconnected while doing security */ smp_sm_event(p_cb, SMP_L2CAP_DISCONN_EVT, &int_data); @@ -151,23 +147,18 @@ static void smp_data_received(UINT16 channel, BD_ADDR bd_addr, BT_HDR *p_buf) STREAM_TO_UINT8(cmd, p); /* sanity check */ - if ((SMP_OPCODE_MAX < cmd) || (SMP_OPCODE_MIN > cmd)) - { + if ((SMP_OPCODE_MAX < cmd) || (SMP_OPCODE_MIN > cmd)) { SMP_TRACE_WARNING( "Ignore received command with RESERVED code 0x%02x\n", cmd); GKI_freebuf (p_buf); return; } /* reject the pairing request if there is an on-going SMP pairing */ - if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd) - { - if ((p_cb->state == SMP_STATE_IDLE) && (p_cb->br_state == SMP_BR_STATE_IDLE)) - { + if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd) { + if ((p_cb->state == SMP_STATE_IDLE) && (p_cb->br_state == SMP_BR_STATE_IDLE)) { p_cb->role = L2CA_GetBleConnRole(bd_addr); memcpy(&p_cb->pairing_bda[0], bd_addr, BD_ADDR_LEN); - } - else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) - { + } else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) { GKI_freebuf (p_buf); smp_reject_unexpected_pairing_command(bd_addr); return; @@ -175,21 +166,18 @@ static void smp_data_received(UINT16 channel, BD_ADDR bd_addr, BT_HDR *p_buf) /* else, out of state pairing request/security request received, passed into SM */ } - if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) - { + if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) { btu_stop_timer (&p_cb->rsp_timer_ent); btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD, - SMP_WAIT_FOR_RSP_TOUT); + SMP_WAIT_FOR_RSP_TOUT); - if (cmd == SMP_OPCODE_CONFIRM) - { + if (cmd == SMP_OPCODE_CONFIRM) { SMP_TRACE_DEBUG ("in %s cmd = 0x%02x, peer_auth_req = 0x%02x," - "loc_auth_req = 0x%02x\n", - __FUNCTION__, cmd, p_cb->peer_auth_req, p_cb->loc_auth_req); + "loc_auth_req = 0x%02x\n", + __FUNCTION__, cmd, p_cb->peer_auth_req, p_cb->loc_auth_req); if ((p_cb->peer_auth_req & SMP_SC_SUPPORT_BIT) && - (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT)) - { + (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT)) { cmd = SMP_OPCODE_PAIR_COMMITM; } } @@ -213,18 +201,19 @@ static void smp_tx_complete_callback (UINT16 cid, UINT16 num_pkt) { tSMP_CB *p_cb = &smp_cb; - if (p_cb->total_tx_unacked >= num_pkt) + if (p_cb->total_tx_unacked >= num_pkt) { p_cb->total_tx_unacked -= num_pkt; - else - SMP_TRACE_ERROR("Unexpected %s: num_pkt = %d", __func__,num_pkt); + } else { + SMP_TRACE_ERROR("Unexpected %s: num_pkt = %d", __func__, num_pkt); + } UINT8 reason = SMP_SUCCESS; - if (p_cb->total_tx_unacked == 0 && p_cb->wait_for_authorization_complete) - { - if (cid == L2CAP_SMP_CID) + if (p_cb->total_tx_unacked == 0 && p_cb->wait_for_authorization_complete) { + if (cid == L2CAP_SMP_CID) { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); - else + } else { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &reason); + } } } @@ -245,26 +234,24 @@ static void smp_br_connect_callback(UINT16 channel, BD_ADDR bd_addr, BOOLEAN con SMP_TRACE_EVENT ("%s", __func__); - if (transport != BT_TRANSPORT_BR_EDR) - { - SMP_TRACE_WARNING("%s is called on unexpected transport %d", - __func__, transport); + if (transport != BT_TRANSPORT_BR_EDR) { + SMP_TRACE_WARNING("%s is called on unexpected transport %d\n", + __func__, transport); return; } - if (!(memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0)) + if (!(memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0)) { return; + } - SMP_TRACE_EVENT ("%s for pairing BDA: %08x%04x Event: %s", + SMP_TRACE_EVENT ("%s for pairing BDA: %08x%04x Event: %s\n", __func__, - (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3], - (bd_addr[4]<<8)+bd_addr[5], + (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], + (bd_addr[4] << 8) + bd_addr[5], (connected) ? "connected" : "disconnected"); - if (connected) - { - if(!p_cb->connect_initialized) - { + if (connected) { + if (!p_cb->connect_initialized) { p_cb->connect_initialized = TRUE; /* initialize local i/r key to be default keys */ p_cb->local_r_key = p_cb->local_i_key = SMP_BR_SEC_DEFAULT_KEY; @@ -272,9 +259,7 @@ static void smp_br_connect_callback(UINT16 channel, BD_ADDR bd_addr, BOOLEAN con p_cb->cb_evt = SMP_BR_KEYS_REQ_EVT; smp_br_state_machine_event(p_cb, SMP_BR_L2CAP_CONN_EVT, NULL); } - } - else - { + } else { int_data.reason = reason; /* Disconnected while doing security */ smp_br_state_machine_event(p_cb, SMP_BR_L2CAP_DISCONN_EVT, &int_data); @@ -301,24 +286,19 @@ static void smp_br_data_received(UINT16 channel, BD_ADDR bd_addr, BT_HDR *p_buf) STREAM_TO_UINT8(cmd, p); /* sanity check */ - if ((SMP_OPCODE_MAX < cmd) || (SMP_OPCODE_MIN > cmd)) - { + if ((SMP_OPCODE_MAX < cmd) || (SMP_OPCODE_MIN > cmd)) { SMP_TRACE_WARNING( "Ignore received command with RESERVED code 0x%02x", cmd); GKI_freebuf(p_buf); return; } /* reject the pairing request if there is an on-going SMP pairing */ - if (SMP_OPCODE_PAIRING_REQ == cmd) - { - if ((p_cb->state == SMP_STATE_IDLE) && (p_cb->br_state == SMP_BR_STATE_IDLE)) - { + if (SMP_OPCODE_PAIRING_REQ == cmd) { + if ((p_cb->state == SMP_STATE_IDLE) && (p_cb->br_state == SMP_BR_STATE_IDLE)) { p_cb->role = HCI_ROLE_SLAVE; p_cb->smp_over_br = TRUE; memcpy(&p_cb->pairing_bda[0], bd_addr, BD_ADDR_LEN); - } - else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) - { + } else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN)) { GKI_freebuf (p_buf); smp_reject_unexpected_pairing_command(bd_addr); return; @@ -326,11 +306,10 @@ static void smp_br_data_received(UINT16 channel, BD_ADDR bd_addr, BT_HDR *p_buf) /* else, out of state pairing request received, passed into State Machine */ } - if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) - { + if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0) { btu_stop_timer (&p_cb->rsp_timer_ent); btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD, - SMP_WAIT_FOR_RSP_TOUT); + SMP_WAIT_FOR_RSP_TOUT); p_cb->rcvd_cmd_code = cmd; p_cb->rcvd_cmd_len = (UINT8) p_buf->len; diff --git a/components/bt/bluedroid/stack/smp/smp_main.c b/components/bt/bluedroid/stack/smp/smp_main.c old mode 100755 new mode 100644 index e9b377520..85b232aea --- a/components/bt/bluedroid/stack/smp/smp_main.c +++ b/components/bt/bluedroid/stack/smp/smp_main.c @@ -23,8 +23,7 @@ #include #include "smp_int.h" -const char *const smp_state_name [] = -{ +const char *const smp_state_name [] = { "SMP_STATE_IDLE", "SMP_STATE_WAIT_APP_RSP", "SMP_STATE_SEC_REQ_PENDING", @@ -45,8 +44,7 @@ const char *const smp_state_name [] = "SMP_STATE_MAX" }; -const char *const smp_event_name [] = -{ +const char *const smp_event_name [] = { "PAIRING_REQ_EVT", "PAIRING_RSP_EVT", "CONFIRM_EVT", @@ -100,8 +98,7 @@ const char *smp_get_state_name(tSMP_STATE state); typedef const UINT8(*tSMP_SM_TBL)[SMP_SM_NUM_COLS]; -enum -{ +enum { SMP_PROC_SEC_REQ, SMP_SEND_PAIR_REQ, SMP_SEND_PAIR_RSP, @@ -166,8 +163,7 @@ enum SMP_SM_NO_ACTION }; -static const tSMP_ACT smp_sm_action[] = -{ +static const tSMP_ACT smp_sm_action[] = { smp_proc_sec_req, smp_send_pair_req, smp_send_pair_rsp, @@ -232,431 +228,394 @@ static const tSMP_ACT smp_sm_action[] = }; /************ SMP Master FSM State/Event Indirection Table **************/ -static const UINT8 smp_master_entry_map[][SMP_STATE_MAX] = -{ -/* state name: Idle WaitApp SecReq Pair Wait Confirm Rand PublKey SCPhs1 Wait Wait SCPhs2 Wait DHKChk Enc Bond CrLocSc - Rsp Pend ReqRsp Cfm Exch Strt Cmtm Nonce Strt DHKChk Pend Pend OobData */ -/* PAIR_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_RSP */{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* CONFIRM */{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* RAND */{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, -/* PAIR_FAIL */{ 0, 0x81, 0, 0x81, 0x81,0x81, 0x81,0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0, 0, 0 }, -/* ENC_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, -/* MASTER_ID */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, -/* ID_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, -/* ID_ADDR */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, -/* SIGN_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 }, -/* SEC_REQ */{ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_PUBLIC_KEY */{ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_DHKEY_CHCK */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, -/* PAIR_KEYPR_NOTIF */{ 0, 8, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_COMMITM */{ 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0 }, -/* KEY_READY */{ 0, 3, 0, 3, 1, 0, 2, 0, 4, 0, 0, 0, 0, 0, 1, 6, 0 }, -/* ENC_CMPL */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, -/* L2C_CONN */{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* L2C_DISC */{ 3, 0x83, 0, 0x83, 0x83,0x83, 0x83,0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0 }, -/* IO_RSP */{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SEC_GRANT */{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* TK_REQ */{ 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* AUTH_CMPL */{ 4, 0x82, 0, 0x82, 0x82,0x82, 0x82,0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0 }, -/* ENC_REQ */{ 0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, -/* BOND_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, -/* DISCARD_SEC_REQ */{ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, -/* PUBL_KEY_EXCH_REQ */{ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* LOC_PUBL_KEY_CRTD */{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, -/* BOTH_PUBL_KEYS_RCVD */{ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_DHKEY_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* HAVE_LOC_NONCE */{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2 }, -/* SC_PHASE1_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, -/* SC_CALC_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, -/* SC_DSPL_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }, -/* SC_NC_OK */{ 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_2_DHCK_CHKS_PRES */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_KEY_READY */{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, -/* KEYPR_NOTIF */{ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_OOB_DATA */{ 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* CR_LOC_SC_OOB_DATA */{ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +static const UINT8 smp_master_entry_map[][SMP_STATE_MAX] = { + /* state name: Idle WaitApp SecReq Pair Wait Confirm Rand PublKey SCPhs1 Wait Wait SCPhs2 Wait DHKChk Enc Bond CrLocSc + Rsp Pend ReqRsp Cfm Exch Strt Cmtm Nonce Strt DHKChk Pend Pend OobData */ + /* PAIR_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_RSP */{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* CONFIRM */{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* RAND */{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, + /* PAIR_FAIL */{ 0, 0x81, 0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0, 0, 0 }, + /* ENC_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, + /* MASTER_ID */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + /* ID_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, + /* ID_ADDR */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + /* SIGN_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 }, + /* SEC_REQ */{ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_PUBLIC_KEY */{ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_DHKEY_CHCK */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, + /* PAIR_KEYPR_NOTIF */{ 0, 8, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_COMMITM */{ 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* KEY_READY */{ 0, 3, 0, 3, 1, 0, 2, 0, 4, 0, 0, 0, 0, 0, 1, 6, 0 }, + /* ENC_CMPL */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, + /* L2C_CONN */{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* L2C_DISC */{ 3, 0x83, 0, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0 }, + /* IO_RSP */{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SEC_GRANT */{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* TK_REQ */{ 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* AUTH_CMPL */{ 4, 0x82, 0, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0 }, + /* ENC_REQ */{ 0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, + /* BOND_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + /* DISCARD_SEC_REQ */{ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + /* PUBL_KEY_EXCH_REQ */{ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* LOC_PUBL_KEY_CRTD */{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + /* BOTH_PUBL_KEYS_RCVD */{ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_DHKEY_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* HAVE_LOC_NONCE */{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2 }, + /* SC_PHASE1_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + /* SC_CALC_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, + /* SC_DSPL_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }, + /* SC_NC_OK */{ 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_2_DHCK_CHKS_PRES */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_KEY_READY */{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, + /* KEYPR_NOTIF */{ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_OOB_DATA */{ 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* CR_LOC_SC_OOB_DATA */{ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; -static const UINT8 smp_all_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_FAIL */ {SMP_PROC_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE}, -/* AUTH_CMPL */ {SMP_SEND_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE}, -/* L2C_DISC */ {SMP_PAIR_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE} +static const UINT8 smp_all_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_FAIL */ {SMP_PROC_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE}, + /* AUTH_CMPL */ {SMP_SEND_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE}, + /* L2C_DISC */ {SMP_PAIR_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE} }; -static const UINT8 smp_master_idle_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* L2C_CONN */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* SEC_REQ */ {SMP_PROC_SEC_REQ, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, -/* L2C_DISC */ {SMP_IDLE_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE}, -/* AUTH_CMPL */ {SMP_PAIRING_CMPL, SMP_SM_NO_ACTION, SMP_STATE_IDLE} -/* CR_LOC_SC_OOB_DATA */ ,{SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA} +static const UINT8 smp_master_idle_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* L2C_CONN */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* SEC_REQ */ {SMP_PROC_SEC_REQ, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, + /* L2C_DISC */ {SMP_IDLE_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE}, + /* AUTH_CMPL */ {SMP_PAIRING_CMPL, SMP_SM_NO_ACTION, SMP_STATE_IDLE} + /* CR_LOC_SC_OOB_DATA */ , {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA} }; -static const UINT8 smp_master_wait_for_app_response_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* SEC_GRANT */ {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, -/* IO_RSP */ {SMP_SEND_PAIR_REQ, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP}, +static const UINT8 smp_master_wait_for_app_response_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* SEC_GRANT */ {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, + /* IO_RSP */ {SMP_SEND_PAIR_REQ, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP}, - /* TK ready */ -/* KEY_READY */ {SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM}, + /* TK ready */ + /* KEY_READY */ {SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM}, - /* start enc mode setup */ -/* ENC_REQ */ { SMP_START_ENC, SMP_FAST_CONN_PARAM, SMP_STATE_ENCRYPTION_PENDING}, -/* DISCARD_SEC_REQ */ { SMP_PROC_DISCARD, SMP_SM_NO_ACTION, SMP_STATE_IDLE} -/* user confirms NC 'OK', i.e. phase 1 is completed */ -/* SC_NC_OK */,{ SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, -/* user-provided passkey is rcvd */ -/* SC_KEY_READY */ { SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* PAIR_KEYPR_NOTIF */ { SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, -/* KEYPR_NOTIF */ { SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* SC_OOB_DATA */ { SMP_USE_OOB_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH} + /* start enc mode setup */ + /* ENC_REQ */ { SMP_START_ENC, SMP_FAST_CONN_PARAM, SMP_STATE_ENCRYPTION_PENDING}, + /* DISCARD_SEC_REQ */ { SMP_PROC_DISCARD, SMP_SM_NO_ACTION, SMP_STATE_IDLE} + /* user confirms NC 'OK', i.e. phase 1 is completed */ + /* SC_NC_OK */, { SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, + /* user-provided passkey is rcvd */ + /* SC_KEY_READY */ { SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* PAIR_KEYPR_NOTIF */ { SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, + /* KEYPR_NOTIF */ { SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* SC_OOB_DATA */ { SMP_USE_OOB_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH} }; -static const UINT8 smp_master_pair_request_response_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_RSP */ { SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, -/* TK_REQ */ { SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, +static const UINT8 smp_master_pair_request_response_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_RSP */ { SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, + /* TK_REQ */ { SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, - /* TK ready */ -/* KEY_READY */{ SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM} -/* PUBL_KEY_EXCH_REQ */,{ SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH} + /* TK ready */ + /* KEY_READY */{ SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM} + /* PUBL_KEY_EXCH_REQ */, { SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH} }; -static const UINT8 smp_master_wait_for_confirm_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* KEY_READY*/ {SMP_SEND_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}/* CONFIRM ready */ +static const UINT8 smp_master_wait_for_confirm_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* KEY_READY*/ {SMP_SEND_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}/* CONFIRM ready */ }; -static const UINT8 smp_master_confirm_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* CONFIRM */ { SMP_PROC_CONFIRM, SMP_SEND_RAND, SMP_STATE_RAND} +static const UINT8 smp_master_confirm_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* CONFIRM */ { SMP_PROC_CONFIRM, SMP_SEND_RAND, SMP_STATE_RAND} }; -static const UINT8 smp_master_rand_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* RAND */ { SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND}, -/* KEY_READY*/ { SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* Compare ready */ -/* ENC_REQ */ { SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING} +static const UINT8 smp_master_rand_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* RAND */ { SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND}, + /* KEY_READY*/ { SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* Compare ready */ + /* ENC_REQ */ { SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING} }; -static const UINT8 smp_master_public_key_exchange_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* LOC_PUBL_KEY_CRTD */{ SMP_SEND_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, -/* PAIR_PUBLIC_KEY */{ SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, -/* BOTH_PUBL_KEYS_RCVD */{ SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, +static const UINT8 smp_master_public_key_exchange_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* LOC_PUBL_KEY_CRTD */{ SMP_SEND_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, + /* PAIR_PUBLIC_KEY */{ SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, + /* BOTH_PUBL_KEYS_RCVD */{ SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, }; -static const UINT8 smp_master_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* SC_DHKEY_CMPLT */{ SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* HAVE_LOC_NONCE */{ SMP_PROCESS_LOCAL_NONCE, SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT}, -/* TK_REQ */{ SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display,*/ -/* It's time to start commitment calculation */ -/* KEY_READY */{ SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_SEC_CONN_PHS1_START}, -/* PAIR_COMMITM */{ SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, +static const UINT8 smp_master_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* SC_DHKEY_CMPLT */{ SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* HAVE_LOC_NONCE */{ SMP_PROCESS_LOCAL_NONCE, SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT}, + /* TK_REQ */{ SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display,*/ + /* It's time to start commitment calculation */ + /* KEY_READY */{ SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_SEC_CONN_PHS1_START}, + /* PAIR_COMMITM */{ SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, }; -static const UINT8 smp_master_wait_commitment_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_COMMITM */{ SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_RAND, SMP_STATE_WAIT_NONCE}, -/* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_COMMITMENT}, +static const UINT8 smp_master_wait_commitment_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_COMMITM */{ SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_RAND, SMP_STATE_WAIT_NONCE}, + /* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_COMMITMENT}, }; -static const UINT8 smp_master_wait_nonce_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* peer nonce is received */ -/* RAND */{SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START}, -/* NC model, time to calculate number for NC */ -/* SC_CALC_NC */{SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION, SMP_STATE_WAIT_NONCE}, -/* NC model, time to display calculated number for NC to the user */ -/* SC_DSPL_NC */{SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, +static const UINT8 smp_master_wait_nonce_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* peer nonce is received */ + /* RAND */{SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START}, + /* NC model, time to calculate number for NC */ + /* SC_CALC_NC */{SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION, SMP_STATE_WAIT_NONCE}, + /* NC model, time to display calculated number for NC to the user */ + /* SC_DSPL_NC */{SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, }; -static const UINT8 smp_master_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* SC_PHASE1_CMPLT */{SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_SEND_DHKEY_CHECK, SMP_STATE_WAIT_DHK_CHECK}, +static const UINT8 smp_master_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* SC_PHASE1_CMPLT */{SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_SEND_DHKEY_CHECK, SMP_STATE_WAIT_DHK_CHECK}, }; -static const UINT8 smp_master_wait_dhk_check_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_STATE_DHK_CHECK}, +static const UINT8 smp_master_wait_dhk_check_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_STATE_DHK_CHECK}, }; -static const UINT8 smp_master_dhk_check_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* locally calculated peer dhkey check is ready -> compare it withs DHKey Check actually received from peer */ -/* SC_KEY_READY */{SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, -/* locally calculated peer dhkey check is ready -> calculate STK, go to sending */ -/* HCI LE Start Encryption command */ -/* ENC_REQ */{SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, +static const UINT8 smp_master_dhk_check_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* locally calculated peer dhkey check is ready -> compare it withs DHKey Check actually received from peer */ + /* SC_KEY_READY */{SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, + /* locally calculated peer dhkey check is ready -> calculate STK, go to sending */ + /* HCI LE Start Encryption command */ + /* ENC_REQ */{SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, }; -static const UINT8 smp_master_enc_pending_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* STK ready */ -/* KEY_READY */ { SMP_START_ENC, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, -/* ENCRYPTED */ { SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, -/* BOND_REQ */ { SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} +static const UINT8 smp_master_enc_pending_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* STK ready */ + /* KEY_READY */ { SMP_START_ENC, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, + /* ENCRYPTED */ { SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, + /* BOND_REQ */ { SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} }; -static const UINT8 smp_master_bond_pending_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* ENC_INFO */ { SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* ID_INFO */ { SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* SIGN_INFO*/ { SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* MASTER_ID*/ { SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* ID_ADDR */ { SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* KEY_READY */{SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} /* LTK ready */ +static const UINT8 smp_master_bond_pending_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* ENC_INFO */ { SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* ID_INFO */ { SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* SIGN_INFO*/ { SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* MASTER_ID*/ { SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* ID_ADDR */ { SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* KEY_READY */{SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} /* LTK ready */ }; -static const UINT8 smp_master_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* LOC_PUBL_KEY_CRTD */ {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}, -/* HAVE_LOC_NONCE */ {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE} +static const UINT8 smp_master_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* LOC_PUBL_KEY_CRTD */ {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}, + /* HAVE_LOC_NONCE */ {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE} }; /************ SMP Slave FSM State/Event Indirection Table **************/ -static const UINT8 smp_slave_entry_map[][SMP_STATE_MAX] = -{ -/* state name: Idle WaitApp SecReq Pair Wait Confirm Rand PublKey SCPhs1 Wait Wait SCPhs2 Wait DHKChk Enc Bond CrLocSc - Rsp Pend ReqRsp Cfm Exch Strt Cmtm Nonce Strt DHKChk Pend Pend OobData */ -/* PAIR_REQ */{ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_RSP */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* CONFIRM */{ 0, 4, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* RAND */{ 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, -/* PAIR_FAIL */{ 0, 0x81, 0x81, 0x81, 0x81,0x81, 0x81,0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0, 0 }, -/* ENC_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 }, -/* MASTER_ID */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, -/* ID_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, -/* ID_ADDR */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0 }, -/* SIGN_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, -/* SEC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_PUBLIC_KEY */{ 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_DHKEY_CHCK */{ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0 }, -/* PAIR_KEYPR_NOTIF */{ 0, 9, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0 }, -/* PAIR_COMMITM */{ 0, 8, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0 }, -/* KEY_READY */{ 0, 3, 0, 3, 2, 2, 1, 0, 4, 0, 0, 0, 0, 0, 2, 1, 0 }, -/* ENC_CMPL */{ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, -/* L2C_CONN */{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* L2C_DISC */{ 0, 0x83, 0x83, 0x83, 0x83,0x83, 0x83,0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0 }, -/* IO_RSP */{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SEC_GRANT */{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* TK_REQ */{ 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* AUTH_CMPL */{ 0, 0x82, 0x82, 0x82, 0x82,0x82, 0x82,0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0 }, -/* ENC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, -/* BOND_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, -/* DISCARD_SEC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* PUBL_KEY_EXCH_REQ */{ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* LOC_PUBL_KEY_CRTD */{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, -/* BOTH_PUBL_KEYS_RCVD */{ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_DHKEY_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* HAVE_LOC_NONCE */{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2 }, -/* SC_PHASE1_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, -/* SC_CALC_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, -/* SC_DSPL_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }, -/* SC_NC_OK */{ 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_2_DHCK_CHKS_PRES */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 }, -/* SC_KEY_READY */{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, -/* KEYPR_NOTIF */{ 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* SC_OOB_DATA */{ 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/* CR_LOC_SC_OOB_DATA */{ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +static const UINT8 smp_slave_entry_map[][SMP_STATE_MAX] = { + /* state name: Idle WaitApp SecReq Pair Wait Confirm Rand PublKey SCPhs1 Wait Wait SCPhs2 Wait DHKChk Enc Bond CrLocSc + Rsp Pend ReqRsp Cfm Exch Strt Cmtm Nonce Strt DHKChk Pend Pend OobData */ + /* PAIR_REQ */{ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_RSP */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* CONFIRM */{ 0, 4, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* RAND */{ 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, + /* PAIR_FAIL */{ 0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0, 0 }, + /* ENC_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0 }, + /* MASTER_ID */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + /* ID_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + /* ID_ADDR */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0 }, + /* SIGN_INFO */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, + /* SEC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_PUBLIC_KEY */{ 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_DHKEY_CHCK */{ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0 }, + /* PAIR_KEYPR_NOTIF */{ 0, 9, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0 }, + /* PAIR_COMMITM */{ 0, 8, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0 }, + /* KEY_READY */{ 0, 3, 0, 3, 2, 2, 1, 0, 4, 0, 0, 0, 0, 0, 2, 1, 0 }, + /* ENC_CMPL */{ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + /* L2C_CONN */{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* L2C_DISC */{ 0, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0 }, + /* IO_RSP */{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SEC_GRANT */{ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* TK_REQ */{ 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* AUTH_CMPL */{ 0, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0 }, + /* ENC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, + /* BOND_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, + /* DISCARD_SEC_REQ */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* PUBL_KEY_EXCH_REQ */{ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* LOC_PUBL_KEY_CRTD */{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + /* BOTH_PUBL_KEYS_RCVD */{ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_DHKEY_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* HAVE_LOC_NONCE */{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2 }, + /* SC_PHASE1_CMPLT */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + /* SC_CALC_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, + /* SC_DSPL_NC */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0 }, + /* SC_NC_OK */{ 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_2_DHCK_CHKS_PRES */{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 }, + /* SC_KEY_READY */{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, + /* KEYPR_NOTIF */{ 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* SC_OOB_DATA */{ 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* CR_LOC_SC_OOB_DATA */{ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; -static const UINT8 smp_slave_idle_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* L2C_CONN */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* PAIR_REQ */ {SMP_PROC_PAIR_CMD, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP} -/* CR_LOC_SC_OOB_DATA */ ,{SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA} -}; - -static const UINT8 smp_slave_wait_for_app_response_table [][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* IO_RSP */ {SMP_PROC_IO_RSP, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP}, -/* SEC_GRANT */ {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, - - /* TK ready */ -/* KEY_READY */ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM} -/* DHKey Check from master is received before phase 1 is completed - race */ -/* PAIR_DHKEY_CHCK */,{SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* user confirms NC 'OK', i.e. phase 1 is completed */ -/* SC_NC_OK */ {SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, -/* user-provided passkey is rcvd */ -/* SC_KEY_READY */ {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* PAIR_COMMITM */ {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* PAIR_KEYPR_NOTIF */ {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, -/* KEYPR_NOTIF */ {SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* SC_OOB_DATA */ {SMP_SEND_PAIR_RSP, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, +static const UINT8 smp_slave_idle_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* L2C_CONN */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* PAIR_REQ */ {SMP_PROC_PAIR_CMD, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP} + /* CR_LOC_SC_OOB_DATA */ , {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA} }; -static const UINT8 smp_slave_sec_request_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_REQ */{SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, -/* ENCRYPTED*/{SMP_ENC_CMPL, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, +static const UINT8 smp_slave_wait_for_app_response_table [][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* IO_RSP */ {SMP_PROC_IO_RSP, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP}, + /* SEC_GRANT */ {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, + + /* TK ready */ + /* KEY_READY */ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM} + /* DHKey Check from master is received before phase 1 is completed - race */ + /* PAIR_DHKEY_CHCK */, {SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* user confirms NC 'OK', i.e. phase 1 is completed */ + /* SC_NC_OK */ {SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, + /* user-provided passkey is rcvd */ + /* SC_KEY_READY */ {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* PAIR_COMMITM */ {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* PAIR_KEYPR_NOTIF */ {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP}, + /* KEYPR_NOTIF */ {SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* SC_OOB_DATA */ {SMP_SEND_PAIR_RSP, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, }; -static const UINT8 smp_slave_pair_request_response_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}, -/* TK_REQ */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, - /* TK/Confirm ready */ -/* KEY_READY */{SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP} -/* PUBL_KEY_EXCH_REQ */,{ SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, -/* PAIR_PUBLIC_KEY */ { SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, +static const UINT8 smp_slave_sec_request_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_REQ */{SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, + /* ENCRYPTED*/{SMP_ENC_CMPL, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, }; -static const UINT8 smp_slave_wait_confirm_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SEND_CONFIRM, SMP_STATE_CONFIRM}, -/* KEY_READY*/ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM} +static const UINT8 smp_slave_pair_request_response_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}, + /* TK_REQ */ {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* TK/Confirm ready */ + /* KEY_READY */{SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP} + /* PUBL_KEY_EXCH_REQ */, { SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, + /* PAIR_PUBLIC_KEY */ { SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP}, }; -static const UINT8 smp_slave_confirm_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* RAND */ {SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND}, - - /* TK/Confirm ready */ -/* KEY_READY*/ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM} +static const UINT8 smp_slave_wait_confirm_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* CONFIRM */ {SMP_PROC_CONFIRM, SMP_SEND_CONFIRM, SMP_STATE_CONFIRM}, + /* KEY_READY*/ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM} }; -static const UINT8 smp_slave_rand_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* KEY_READY */ {SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* compare match */ -/* RAND */ {SMP_SEND_RAND, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING} +static const UINT8 smp_slave_confirm_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* RAND */ {SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND}, + + /* TK/Confirm ready */ + /* KEY_READY*/ {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM} }; -static const UINT8 smp_slave_public_key_exch_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* LOC_PUBL_KEY_CRTD */{ SMP_WAIT_FOR_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, -/* PAIR_PUBLIC_KEY */{ SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, -/* BOTH_PUBL_KEYS_RCVD */{ SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, +static const UINT8 smp_slave_rand_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* KEY_READY */ {SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* compare match */ + /* RAND */ {SMP_SEND_RAND, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING} }; -static const UINT8 smp_slave_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* SC_DHKEY_CMPLT */{ SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* HAVE_LOC_NONCE */{ SMP_PROCESS_LOCAL_NONCE,SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT}, -/* TK_REQ */{ SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, -/* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display, it's time to start */ -/* commitment calculation */ -/* KEY_READY */{ SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, -/* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION,SMP_SEND_APP_CBACK, SMP_STATE_SEC_CONN_PHS1_START}, -/*COMMIT*/{SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, +static const UINT8 smp_slave_public_key_exch_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* LOC_PUBL_KEY_CRTD */{ SMP_WAIT_FOR_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, + /* PAIR_PUBLIC_KEY */{ SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}, + /* BOTH_PUBL_KEYS_RCVD */{ SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, }; -static const UINT8 smp_slave_wait_commitment_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_COMMITM */{SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_COMMITMENT, SMP_STATE_WAIT_NONCE}, -/* PAIR_KEYPR_NOTIF */{SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_COMMITMENT}, +static const UINT8 smp_slave_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* SC_DHKEY_CMPLT */{ SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* HAVE_LOC_NONCE */{ SMP_PROCESS_LOCAL_NONCE, SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT}, + /* TK_REQ */{ SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, + /* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display, it's time to start */ + /* commitment calculation */ + /* KEY_READY */{ SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, + /* PAIR_KEYPR_NOTIF */{ SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_SEC_CONN_PHS1_START}, + /*COMMIT*/{SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS1_START}, }; -static const UINT8 smp_slave_wait_nonce_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* peer nonce is received */ -/* RAND */{SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START}, -/* NC model, time to calculate number for NC */ -/* SC_CALC_NC */{SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION, SMP_STATE_WAIT_NONCE}, -/* NC model, time to display calculated number for NC to the user */ -/* SC_DSPL_NC */{SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, +static const UINT8 smp_slave_wait_commitment_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_COMMITM */{SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_COMMITMENT, SMP_STATE_WAIT_NONCE}, + /* PAIR_KEYPR_NOTIF */{SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_COMMITMENT}, }; -static const UINT8 smp_slave_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* SC_PHASE1_CMPLT */{SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_PH2_DHKEY_CHECKS_ARE_PRESENT, SMP_STATE_WAIT_DHK_CHECK}, -/* DHKey Check from master is received before slave DHKey calculation is completed - race */ -/* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, +static const UINT8 smp_slave_wait_nonce_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* peer nonce is received */ + /* RAND */{SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START}, + /* NC model, time to calculate number for NC */ + /* SC_CALC_NC */{SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION, SMP_STATE_WAIT_NONCE}, + /* NC model, time to display calculated number for NC to the user */ + /* SC_DSPL_NC */{SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP}, }; -static const UINT8 smp_slave_wait_dhk_check_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_STATE_DHK_CHECK}, -/* DHKey Check from master was received before slave came to this state */ -/* SC_2_DHCK_CHKS_PRES */{SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, +static const UINT8 smp_slave_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* SC_PHASE1_CMPLT */{SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_PH2_DHKEY_CHECKS_ARE_PRESENT, SMP_STATE_WAIT_DHK_CHECK}, + /* DHKey Check from master is received before slave DHKey calculation is completed - race */ + /* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START}, }; -static const UINT8 smp_slave_dhk_check_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ - -/* locally calculated peer dhkey check is ready -> compare it withs DHKey Check */ -/* actually received from peer */ -/* SC_KEY_READY */{SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, - -/* dhkey checks match -> send local dhkey check to master, go to wait for HCI LE */ -/* Long Term Key Request Event */ -/* PAIR_DHKEY_CHCK */{SMP_SEND_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, +static const UINT8 smp_slave_wait_dhk_check_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* PAIR_DHKEY_CHCK */{SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_STATE_DHK_CHECK}, + /* DHKey Check from master was received before slave came to this state */ + /* SC_2_DHCK_CHKS_PRES */{SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, }; -static const UINT8 smp_slave_enc_pending_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* ENC_REQ */ {SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, +static const UINT8 smp_slave_dhk_check_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ - /* STK ready */ -/* KEY_READY */ {SMP_SEND_LTK_REPLY, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, -/* ENCRYPTED */ {SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, -/* BOND_REQ */ {SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} + /* locally calculated peer dhkey check is ready -> compare it withs DHKey Check */ + /* actually received from peer */ + /* SC_KEY_READY */{SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK}, + + /* dhkey checks match -> send local dhkey check to master, go to wait for HCI LE */ + /* Long Term Key Request Event */ + /* PAIR_DHKEY_CHCK */{SMP_SEND_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, }; -static const UINT8 smp_slave_bond_pending_table[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ - /* LTK ready */ -/* KEY_READY */{ SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, +static const UINT8 smp_slave_enc_pending_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* ENC_REQ */ {SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, - /* rev SRK */ -/* SIGN_INFO */{ SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* ENC_INFO */ { SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* ID_INFO */ { SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* MASTER_ID*/ { SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, -/* ID_ADDR */ { SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} + /* STK ready */ + /* KEY_READY */ {SMP_SEND_LTK_REPLY, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, + /* ENCRYPTED */ {SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}, + /* BOND_REQ */ {SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} +}; +static const UINT8 smp_slave_bond_pending_table[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + + /* LTK ready */ + /* KEY_READY */{ SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + + /* rev SRK */ + /* SIGN_INFO */{ SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* ENC_INFO */ { SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* ID_INFO */ { SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* MASTER_ID*/ { SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}, + /* ID_ADDR */ { SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING} }; -static const UINT8 smp_slave_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = -{ -/* Event Action Next State */ -/* LOC_PUBL_KEY_CRTD */ {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}, -/* HAVE_LOC_NONCE */ {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE} +static const UINT8 smp_slave_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = { + /* Event Action Next State */ + /* LOC_PUBL_KEY_CRTD */ {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION, SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}, + /* HAVE_LOC_NONCE */ {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE} }; -static const tSMP_SM_TBL smp_state_table[][2] = -{ +static const tSMP_SM_TBL smp_state_table[][2] = { /* SMP_STATE_IDLE */ {smp_master_idle_table, smp_slave_idle_table}, @@ -679,7 +638,7 @@ static const tSMP_SM_TBL smp_state_table[][2] = {smp_master_rand_table, smp_slave_rand_table}, /* SMP_STATE_PUBLIC_KEY_EXCH */ - {smp_master_public_key_exchange_table,smp_slave_public_key_exch_table}, + {smp_master_public_key_exchange_table, smp_slave_public_key_exch_table}, /* SMP_STATE_SEC_CONN_PHS1_START */ {smp_master_sec_conn_phs1_start_table, smp_slave_sec_conn_phs1_start_table}, @@ -690,7 +649,7 @@ static const tSMP_SM_TBL smp_state_table[][2] = /* SMP_STATE_WAIT_NONCE */ {smp_master_wait_nonce_table, smp_slave_wait_nonce_table}, - /* SMP_STATE_SEC_CONN_PHS2_START */ + /* SMP_STATE_SEC_CONN_PHS2_START */ {smp_master_sec_conn_phs2_start_table, smp_slave_sec_conn_phs2_start_table}, /* SMP_STATE_WAIT_DHK_CHECK */ @@ -702,7 +661,7 @@ static const tSMP_SM_TBL smp_state_table[][2] = /* SMP_STATE_ENCRYPTION_PENDING */ {smp_master_enc_pending_table, smp_slave_enc_pending_table}, - /* SMP_STATE_BOND_PENDING */ + /* SMP_STATE_BOND_PENDING */ {smp_master_bond_pending_table, smp_slave_bond_pending_table}, /* SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA */ @@ -710,8 +669,7 @@ static const tSMP_SM_TBL smp_state_table[][2] = }; typedef const UINT8 (*tSMP_ENTRY_TBL)[SMP_STATE_MAX]; -static const tSMP_ENTRY_TBL smp_entry_table[] = -{ +static const tSMP_ENTRY_TBL smp_entry_table[] = { smp_master_entry_map, smp_slave_entry_map }; @@ -727,15 +685,12 @@ tSMP_CB smp_cb; *******************************************************************************/ void smp_set_state(tSMP_STATE state) { - if (state < SMP_STATE_MAX) - { + if (state < SMP_STATE_MAX) { SMP_TRACE_DEBUG( "State change: %s(%d) ==> %s(%d)", - smp_get_state_name(smp_cb.state), smp_cb.state, - smp_get_state_name(state), state ); + smp_get_state_name(smp_cb.state), smp_cb.state, + smp_get_state_name(state), state ); smp_cb.state = state; - } - else - { + } else { SMP_TRACE_DEBUG("smp_set_state invalid state =%d", state ); } } @@ -772,55 +727,46 @@ void smp_sm_event(tSMP_CB *p_cb, tSMP_EVENT event, void *p_data) tSMP_ENTRY_TBL entry_table = smp_entry_table[p_cb->role]; SMP_TRACE_EVENT("main smp_sm_event\n"); - if (curr_state >= SMP_STATE_MAX) - { + if (curr_state >= SMP_STATE_MAX) { SMP_TRACE_DEBUG( "Invalid state: %d\n", curr_state) ; return; } - SMP_TRACE_DEBUG( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",\ - (p_cb->role == 0x01) ?"Slave" : "Master\n", smp_get_state_name( p_cb->state), - p_cb->state, smp_get_event_name(event), event) ; + SMP_TRACE_DEBUG( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]", \ + (p_cb->role == 0x01) ? "Slave" : "Master\n", smp_get_state_name( p_cb->state), + p_cb->state, smp_get_event_name(event), event) ; /* look up the state table for the current state */ /* lookup entry /w event & curr_state */ /* If entry is ignore, return. * Otherwise, get state table (according to curr_state or all_state) */ - if ((event <= SMP_MAX_EVT) && ( (entry = entry_table[event - 1][curr_state]) != SMP_SM_IGNORE )) - { - if (entry & SMP_ALL_TBL_MASK) - { + if ((event <= SMP_MAX_EVT) && ( (entry = entry_table[event - 1][curr_state]) != SMP_SM_IGNORE )) { + if (entry & SMP_ALL_TBL_MASK) { entry &= ~SMP_ALL_TBL_MASK; state_table = smp_all_table; - } - else + } else { state_table = smp_state_table[curr_state][p_cb->role]; - } - else - { + } + } else { SMP_TRACE_DEBUG( "Ignore event [%s (%d)] in state [%s (%d)]\n", - smp_get_event_name(event), event, smp_get_state_name(curr_state), - curr_state); + smp_get_event_name(event), event, smp_get_state_name(curr_state), + curr_state); return; } /* Get possible next state from state table. */ - smp_set_state(state_table[entry-1][SMP_SME_NEXT_STATE]); + smp_set_state(state_table[entry - 1][SMP_SME_NEXT_STATE]); /* If action is not ignore, clear param, exec action and get next state. * The action function may set the Param for cback. * Depending on param, call cback or free buffer. */ /* execute action */ /* execute action functions */ - for (i = 0; i < SMP_NUM_ACTIONS; i++) - { - if ((action = state_table[entry-1][i]) != SMP_SM_NO_ACTION) - { + for (i = 0; i < SMP_NUM_ACTIONS; i++) { + if ((action = state_table[entry - 1][i]) != SMP_SM_NO_ACTION) { (*smp_sm_action[action])(p_cb, (tSMP_INT_DATA *)p_data); - } - else - { + } else { break; } } @@ -831,12 +777,11 @@ void smp_sm_event(tSMP_CB *p_cb, tSMP_EVENT event, void *p_data) ** Function smp_get_state_name ** Returns The smp state name. *******************************************************************************/ -const char * smp_get_state_name(tSMP_STATE state) +const char *smp_get_state_name(tSMP_STATE state) { const char *p_str = smp_state_name[SMP_STATE_MAX]; - if (state < SMP_STATE_MAX) - { + if (state < SMP_STATE_MAX) { p_str = smp_state_name[state]; } return p_str; @@ -846,13 +791,12 @@ const char * smp_get_state_name(tSMP_STATE state) ** Function smp_get_event_name ** Returns The smp event name. *******************************************************************************/ -const char * smp_get_event_name(tSMP_EVENT event) +const char *smp_get_event_name(tSMP_EVENT event) { const char *p_str = smp_event_name[SMP_MAX_EVT]; - if (event <= SMP_MAX_EVT) - { - p_str = smp_event_name[event- 1]; + if (event <= SMP_MAX_EVT) { + p_str = smp_event_name[event - 1]; } return p_str; } diff --git a/components/bt/bluedroid/stack/smp/smp_utils.c b/components/bt/bluedroid/stack/smp/smp_utils.c old mode 100755 new mode 100644 index 4d988bad4..0e49bb68d --- a/components/bt/bluedroid/stack/smp/smp_utils.c +++ b/components/bt/bluedroid/stack/smp/smp_utils.c @@ -54,8 +54,7 @@ #define SMP_PAIR_KEYPR_NOTIF_SIZE (1 /* opcode */ + 1 /*Notif Type*/) /* SMP command sizes per spec */ -static const UINT8 smp_cmd_size_per_spec[] = -{ +static const UINT8 smp_cmd_size_per_spec[] = { 0, SMP_PAIRING_REQ_SIZE, /* 0x01: pairing request */ SMP_PAIRING_REQ_SIZE, /* 0x02: pairing response */ @@ -82,8 +81,7 @@ typedef BOOLEAN (*tSMP_CMD_LEN_VALID)(tSMP_CB *p_cb); static BOOLEAN smp_command_has_valid_fixed_length(tSMP_CB *p_cb); -static const tSMP_CMD_LEN_VALID smp_cmd_len_is_valid[] = -{ +static const tSMP_CMD_LEN_VALID smp_cmd_len_is_valid[] = { smp_parameter_unconditionally_invalid, smp_command_has_valid_fixed_length, /* 0x01: pairing request */ smp_command_has_valid_fixed_length, /* 0x02: pairing response */ @@ -108,8 +106,7 @@ typedef BOOLEAN (*tSMP_CMD_PARAM_RANGES_VALID)(tSMP_CB *p_cb); static BOOLEAN smp_pairing_request_response_parameters_are_valid(tSMP_CB *p_cb); static BOOLEAN smp_pairing_keypress_notification_is_valid(tSMP_CB *p_cb); -static const tSMP_CMD_PARAM_RANGES_VALID smp_cmd_param_ranges_are_valid[] = -{ +static const tSMP_CMD_PARAM_RANGES_VALID smp_cmd_param_ranges_are_valid[] = { smp_parameter_unconditionally_invalid, smp_pairing_request_response_parameters_are_valid, /* 0x01: pairing request */ smp_pairing_request_response_parameters_are_valid, /* 0x02: pairing response */ @@ -129,7 +126,7 @@ static const tSMP_CMD_PARAM_RANGES_VALID smp_cmd_param_ranges_are_valid[] = }; /* type for action functions */ -typedef BT_HDR * (*tSMP_CMD_ACT)(UINT8 cmd_code, tSMP_CB *p_cb); +typedef BT_HDR *(*tSMP_CMD_ACT)(UINT8 cmd_code, tSMP_CB *p_cb); static BT_HDR *smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb); static BT_HDR *smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb); @@ -146,8 +143,7 @@ static BT_HDR *smp_build_pairing_commitment_cmd(UINT8 cmd_code, tSMP_CB *p_cb); static BT_HDR *smp_build_pair_dhkey_check_cmd(UINT8 cmd_code, tSMP_CB *p_cb); static BT_HDR *smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP_CB *p_cb); -static const tSMP_CMD_ACT smp_cmd_build_act[] = -{ +static const tSMP_CMD_ACT smp_cmd_build_act[] = { NULL, smp_build_pairing_cmd, /* 0x01: pairing request */ smp_build_pairing_cmd, /* 0x02: pairing response */ @@ -166,106 +162,148 @@ static const tSMP_CMD_ACT smp_cmd_build_act[] = smp_build_pairing_commitment_cmd /* 0x0F: pairing commitment */ }; -static const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = -{ +static const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = { /* display only */ /* Display Yes/No */ /* keyboard only */ - /* No Input/Output */ /* keyboard display */ + /* No Input/Output */ /* keyboard display */ - /* initiator */ - /* model = tbl[peer_io_caps][loc_io_caps] */ - /* Display Only */ - {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, + /* initiator */ + /* model = tbl[peer_io_caps][loc_io_caps] */ + /* Display Only */ + { { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY + }, - /* Display Yes/No */ - {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, + /* Display Yes/No */ + { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY + }, - /* Keyboard only */ - {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, + /* Keyboard only */ + { + SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF + }, - /* No Input No Output */ - {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY}, + /* No Input No Output */ + { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY + }, - /* keyboard display */ - {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}}, + /* keyboard display */ + { + SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF + } + }, - /* responder */ - /* model = tbl[loc_io_caps][peer_io_caps] */ - /* Display Only */ - {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, + /* responder */ + /* model = tbl[loc_io_caps][peer_io_caps] */ + /* Display Only */ + { { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF + }, - /* Display Yes/No */ - {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}, + /* Display Yes/No */ + { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF + }, - /* keyboard only */ - {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}, + /* keyboard only */ + { + SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY + }, - /* No Input No Output */ - {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY}, + /* No Input No Output */ + { + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY + }, - /* keyboard display */ - {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_KEY_NOTIF, - SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}} + /* keyboard display */ + { + SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_KEY_NOTIF, + SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY + } + } }; -static const UINT8 smp_association_table_sc[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = -{ - /* display only */ /* Display Yes/No */ /* keyboard only */ - /* No InputOutput */ /* keyboard display */ +static const UINT8 smp_association_table_sc[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] = { + /* display only */ /* Display Yes/No */ /* keyboard only */ + /* No InputOutput */ /* keyboard display */ - /* initiator */ - /* model = tbl[peer_io_caps][loc_io_caps] */ + /* initiator */ + /* model = tbl[peer_io_caps][loc_io_caps] */ - /* Display Only */ - {{SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT}, + /* Display Only */ + { { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT + }, - /* Display Yes/No */ - {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}, + /* Display Yes/No */ + { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP + }, - /* keyboard only */ - {SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP}, + /* keyboard only */ + { + SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP + }, - /* No Input No Output */ - {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS}, + /* No Input No Output */ + { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS + }, - /* keyboard display */ - {SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}}, + /* keyboard display */ + { + SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP + } + }, - /* responder */ - /* model = tbl[loc_io_caps][peer_io_caps] */ + /* responder */ + /* model = tbl[loc_io_caps][peer_io_caps] */ - /* Display Only */ - {{SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP}, + /* Display Only */ + { { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP + }, - /* Display Yes/No */ - {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}, + /* Display Yes/No */ + { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP + }, - /* keyboard only */ - {SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT}, + /* keyboard only */ + { + SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT + }, - /* No Input No Output */ - {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS}, + /* No Input No Output */ + { + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS + }, - /* keyboard display */ - {SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, - SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}} + /* keyboard display */ + { + SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, + SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP + } + } }; static tSMP_ASSO_MODEL smp_select_legacy_association_model(tSMP_CB *p_cb); @@ -283,23 +321,21 @@ BOOLEAN smp_send_msg_to_L2CAP(BD_ADDR rem_bda, BT_HDR *p_toL2CAP) UINT16 l2cap_ret; UINT16 fixed_cid = L2CAP_SMP_CID; - if (smp_cb.smp_over_br) - { + if (smp_cb.smp_over_br) { fixed_cid = L2CAP_SMP_BR_CID; } SMP_TRACE_EVENT("%s", __FUNCTION__); smp_cb.total_tx_unacked += 1; - if ((l2cap_ret = L2CA_SendFixedChnlData (fixed_cid, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED) - { + if ((l2cap_ret = L2CA_SendFixedChnlData (fixed_cid, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED) { smp_cb.total_tx_unacked -= 1; SMP_TRACE_ERROR("SMP failed to pass msg:0x%0x to L2CAP", - *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset)); + *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset)); return FALSE; - } - else + } else { return TRUE; + } } /******************************************************************************* @@ -316,13 +352,11 @@ BOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb) UINT8 failure = SMP_PAIR_INTERNAL_ERR; SMP_TRACE_EVENT("smp_send_cmd on l2cap cmd_code=0x%x\n", cmd_code); if ( cmd_code <= (SMP_OPCODE_MAX + 1 /* for SMP_OPCODE_PAIR_COMMITM */) && - smp_cmd_build_act[cmd_code] != NULL) - { + smp_cmd_build_act[cmd_code] != NULL) { p_buf = (*smp_cmd_build_act[cmd_code])(cmd_code, p_cb); if (p_buf != NULL && - smp_send_msg_to_L2CAP(p_cb->pairing_bda, p_buf)) - { + smp_send_msg_to_L2CAP(p_cb->pairing_bda, p_buf)) { sent = TRUE; btu_stop_timer (&p_cb->rsp_timer_ent); @@ -331,14 +365,10 @@ BOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb) } } - if (!sent) - { - if (p_cb->smp_over_br) - { + if (!sent) { + if (p_cb->smp_over_br) { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &failure); - } - else - { + } else { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); } } @@ -362,12 +392,9 @@ void smp_rsp_timeout(TIMER_LIST_ENT *p_tle) SMP_TRACE_EVENT("%s state:%d br_state:%d", __FUNCTION__, p_cb->state, p_cb->br_state); - if (p_cb->smp_over_br) - { + if (p_cb->smp_over_br) { smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &failure); - } - else - { + } else { smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); } } @@ -379,14 +406,13 @@ void smp_rsp_timeout(TIMER_LIST_ENT *p_tle) ** Description Build pairing request command. ** *******************************************************************************/ -BT_HDR * smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +BT_HDR *smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; SMP_TRACE_EVENT("smp_build_pairing_cmd"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, cmd_code); @@ -412,15 +438,14 @@ BT_HDR * smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build confirm request command. ** *******************************************************************************/ -static BT_HDR * smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; UNUSED(cmd_code); SMP_TRACE_EVENT("smp_build_confirm_cmd\n"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_CONFIRM); @@ -439,7 +464,7 @@ static BT_HDR * smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build Random command. ** *******************************************************************************/ -static BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; @@ -447,8 +472,7 @@ static BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb) SMP_TRACE_EVENT("%s\n", __func__); if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_RAND_CMD_SIZE + L2CAP_MIN_OFFSET)) - != NULL) - { + != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_RAND); @@ -467,15 +491,14 @@ static BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build security information command. ** *******************************************************************************/ -static BT_HDR * smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; UNUSED(cmd_code); SMP_TRACE_EVENT("smp_build_encrypt_info_cmd\n"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_ENCRYPT_INFO); @@ -495,7 +518,7 @@ static BT_HDR * smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build security information command. ** *******************************************************************************/ -static BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; @@ -503,8 +526,7 @@ static BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb) SMP_TRACE_EVENT("%s\n", __func__); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_MASTER_ID); @@ -525,7 +547,7 @@ static BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build identity information command. ** *******************************************************************************/ -static BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; @@ -534,8 +556,7 @@ static BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) UNUSED(p_cb); SMP_TRACE_EVENT("smp_build_identity_info_cmd\n"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; BTM_GetDeviceIDRoot(irk); @@ -557,7 +578,7 @@ static BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build identity address information command. ** *******************************************************************************/ -static BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL; UINT8 *p; @@ -565,8 +586,7 @@ static BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb) UNUSED(cmd_code); UNUSED(p_cb); SMP_TRACE_EVENT("smp_build_id_addr_cmd\n"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_ID_ADDR); @@ -587,15 +607,14 @@ static BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build signing information command. ** *******************************************************************************/ -static BT_HDR * smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; UNUSED(cmd_code); SMP_TRACE_EVENT("smp_build_signing_info_cmd\n"); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_SIGN_INFO); @@ -615,15 +634,14 @@ static BT_HDR * smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build Pairing Fail command. ** *******************************************************************************/ -static BT_HDR * smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; UNUSED(cmd_code); SMP_TRACE_EVENT("%s\n", __func__); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED); @@ -650,8 +668,7 @@ static BT_HDR *smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb) UNUSED(cmd_code); SMP_TRACE_EVENT("%s\n", __func__); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_SEC_REQ); @@ -660,7 +677,7 @@ static BT_HDR *smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb) p_buf->offset = L2CAP_MIN_OFFSET; p_buf->len = SMP_SECURITY_REQUEST_SIZE; - SMP_TRACE_EVENT("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ, p_cb->loc_auth_req ); + SMP_TRACE_EVENT("opcode=%d auth_req=0x%x", SMP_OPCODE_SEC_REQ, p_cb->loc_auth_req ); } return p_buf; @@ -678,7 +695,7 @@ static BT_HDR *smp_build_pair_public_key_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; - UINT8 publ_key[2*BT_OCTET32_LEN]; + UINT8 publ_key[2 * BT_OCTET32_LEN]; UINT8 *p_publ_key = publ_key; UNUSED(cmd_code); @@ -688,12 +705,11 @@ static BT_HDR *smp_build_pair_public_key_cmd(UINT8 cmd_code, tSMP_CB *p_cb) memcpy(p_publ_key + BT_OCTET32_LEN, p_cb->loc_publ_key.y, BT_OCTET32_LEN); if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + - SMP_PAIR_PUBL_KEY_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + SMP_PAIR_PUBL_KEY_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_PUBLIC_KEY); - ARRAY_TO_STREAM (p, p_publ_key, 2*BT_OCTET32_LEN); + ARRAY_TO_STREAM (p, p_publ_key, 2 * BT_OCTET32_LEN); p_buf->offset = L2CAP_MIN_OFFSET; p_buf->len = SMP_PAIR_PUBL_KEY_SIZE; @@ -717,8 +733,7 @@ static BT_HDR *smp_build_pairing_commitment_cmd(UINT8 cmd_code, tSMP_CB *p_cb) SMP_TRACE_EVENT("%s\n", __func__); if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_COMMITM_SIZE + L2CAP_MIN_OFFSET)) - != NULL) - { + != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_CONFIRM); @@ -746,8 +761,7 @@ static BT_HDR *smp_build_pair_dhkey_check_cmd(UINT8 cmd_code, tSMP_CB *p_cb) SMP_TRACE_EVENT("%s\n", __FUNCTION__); if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + - SMP_PAIR_DHKEY_CHECK_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + SMP_PAIR_DHKEY_CHECK_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_DHKEY_CHECK); @@ -767,7 +781,7 @@ static BT_HDR *smp_build_pair_dhkey_check_cmd(UINT8 cmd_code, tSMP_CB *p_cb) ** Description Build keypress notification command. ** *******************************************************************************/ -static BT_HDR * smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP_CB *p_cb) +static BT_HDR *smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP_CB *p_cb) { BT_HDR *p_buf = NULL ; UINT8 *p; @@ -775,8 +789,7 @@ static BT_HDR * smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP SMP_TRACE_EVENT("%s\n", __FUNCTION__); if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR)\ - + SMP_PAIR_KEYPR_NOTIF_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + + SMP_PAIR_KEYPR_NOTIF_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_KEYPR_NOTIF); @@ -824,13 +837,13 @@ void smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey) ** Returns void ** *******************************************************************************/ -void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data) +void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 *p_data) { SMP_TRACE_EVENT("smp_mask_enc_key\n"); - if (loc_enc_size < BT_OCTET16_LEN) - { - for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++) + if (loc_enc_size < BT_OCTET16_LEN) { + for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++) { * (p_data + loc_enc_size) = 0; + } } return; } @@ -850,8 +863,7 @@ void smp_xor_128(BT_OCTET16 a, BT_OCTET16 b) UINT8 i, *aa = a, *bb = b; SMP_TRACE_EVENT("smp_xor_128\n"); - for (i = 0; i < BT_OCTET16_LEN; i++) - { + for (i = 0; i < BT_OCTET16_LEN; i++) { aa[i] = aa[i] ^ bb[i]; } } @@ -890,10 +902,11 @@ void smp_remove_fixed_channel(tSMP_CB *p_cb) { SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->smp_over_br) + if (p_cb->smp_over_br) { L2CA_RemoveFixedChnl (L2CAP_SMP_BR_CID, p_cb->pairing_bda); - else + } else { L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda); + } } /******************************************************************************* @@ -944,25 +957,28 @@ void smp_proc_pairing_cmpl(tSMP_CB *p_cb) evt_data.cmplt.reason = p_cb->status; evt_data.cmplt.smp_over_br = p_cb->smp_over_br; - if (p_cb->status == SMP_SUCCESS) + if (p_cb->status == SMP_SUCCESS) { evt_data.cmplt.sec_level = p_cb->sec_level; + } evt_data.cmplt.is_pair_cancel = FALSE; - if (p_cb->is_pair_cancel) + if (p_cb->is_pair_cancel) { evt_data.cmplt.is_pair_cancel = TRUE; + } SMP_TRACE_DEBUG ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x\n", - evt_data.cmplt.reason, - evt_data.cmplt.sec_level ); + evt_data.cmplt.reason, + evt_data.cmplt.sec_level ); memcpy (pairing_bda, p_cb->pairing_bda, BD_ADDR_LEN); smp_reset_control_value(p_cb); - if (p_callback) + if (p_callback) { (*p_callback) (SMP_COMPLT_EVT, pairing_bda, &evt_data); + } } /******************************************************************************* @@ -984,17 +1000,18 @@ BOOLEAN smp_command_has_invalid_parameters(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s for cmd code 0x%02x\n", __func__, cmd_code); if ((cmd_code > (SMP_OPCODE_MAX + 1 /* for SMP_OPCODE_PAIR_COMMITM */)) || - (cmd_code < SMP_OPCODE_MIN)) - { + (cmd_code < SMP_OPCODE_MIN)) { SMP_TRACE_WARNING("Somehow received command with the RESERVED code 0x%02x\n", cmd_code); return TRUE; } - if (!(*smp_cmd_len_is_valid[cmd_code])(p_cb)) + if (!(*smp_cmd_len_is_valid[cmd_code])(p_cb)) { return TRUE; + } - if (!(*smp_cmd_param_ranges_are_valid[cmd_code])(p_cb)) + if (!(*smp_cmd_param_ranges_are_valid[cmd_code])(p_cb)) { return TRUE; + } return FALSE; } @@ -1016,11 +1033,10 @@ BOOLEAN smp_command_has_valid_fixed_length(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s for cmd code 0x%02x\n", __func__, cmd_code); - if (p_cb->rcvd_cmd_len != smp_cmd_size_per_spec[cmd_code]) - { + if (p_cb->rcvd_cmd_len != smp_cmd_size_per_spec[cmd_code]) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with invalid length\ 0x%02x (per spec the length is 0x%02x).\n", - cmd_code, p_cb->rcvd_cmd_len, smp_cmd_size_per_spec[cmd_code]); + cmd_code, p_cb->rcvd_cmd_len, smp_cmd_size_per_spec[cmd_code]); return FALSE; } @@ -1050,35 +1066,31 @@ BOOLEAN smp_pairing_request_response_parameters_are_valid(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s for cmd code 0x%02x\n", __func__, p_cb->rcvd_cmd_code); - if (io_caps >= BTM_IO_CAP_MAX) - { + if (io_caps >= BTM_IO_CAP_MAX) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with IO Capabilty \ value (0x%02x) out of range).\n", - p_cb->rcvd_cmd_code, io_caps); + p_cb->rcvd_cmd_code, io_caps); return FALSE; } - if (!((oob_flag == SMP_OOB_NONE) || (oob_flag == SMP_OOB_PRESENT))) - { + if (!((oob_flag == SMP_OOB_NONE) || (oob_flag == SMP_OOB_PRESENT))) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with OOB data flag value \ (0x%02x) out of range).\n", - p_cb->rcvd_cmd_code, oob_flag); + p_cb->rcvd_cmd_code, oob_flag); return FALSE; } - if (!((bond_flag == SMP_AUTH_NO_BOND) || (bond_flag == SMP_AUTH_BOND))) - { + if (!((bond_flag == SMP_AUTH_NO_BOND) || (bond_flag == SMP_AUTH_BOND))) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Bonding_Flags value (0x%02x)\ out of range).\n", - p_cb->rcvd_cmd_code, bond_flag); + p_cb->rcvd_cmd_code, bond_flag); return FALSE; } - if ((enc_size < SMP_ENCR_KEY_SIZE_MIN) || (enc_size > SMP_ENCR_KEY_SIZE_MAX)) - { + if ((enc_size < SMP_ENCR_KEY_SIZE_MIN) || (enc_size > SMP_ENCR_KEY_SIZE_MAX)) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Maximum Encryption \ Key value (0x%02x) out of range).\n", - p_cb->rcvd_cmd_code, enc_size); + p_cb->rcvd_cmd_code, enc_size); return FALSE; } @@ -1100,11 +1112,10 @@ BOOLEAN smp_pairing_keypress_notification_is_valid(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s for cmd code 0x%02x\n", __func__, p_cb->rcvd_cmd_code); - if (keypress_notification >= BTM_SP_KEY_OUT_OF_RANGE) - { + if (keypress_notification >= BTM_SP_KEY_OUT_OF_RANGE) { SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Pairing Keypress \ Notification value (0x%02x) out of range).\n", - p_cb->rcvd_cmd_code, keypress_notification); + p_cb->rcvd_cmd_code, keypress_notification); return FALSE; } @@ -1152,9 +1163,8 @@ void smp_reject_unexpected_pairing_command(BD_ADDR bd_addr) SMP_TRACE_DEBUG ("%s\n", __FUNCTION__); - if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) +\ - SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL) - { + if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + \ + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED); @@ -1190,28 +1200,24 @@ tSMP_ASSO_MODEL smp_select_association_model(tSMP_CB *p_cb) SMP_TRACE_EVENT("%s\n", __FUNCTION__); SMP_TRACE_DEBUG("%s p_cb->peer_io_caps = %d p_cb->local_io_capability = %d\n", - __FUNCTION__, p_cb->peer_io_caps, p_cb->local_io_capability); + __FUNCTION__, p_cb->peer_io_caps, p_cb->local_io_capability); SMP_TRACE_DEBUG("%s p_cb->peer_oob_flag = %d p_cb->loc_oob_flag = %d\n", - __FUNCTION__, p_cb->peer_oob_flag, p_cb->loc_oob_flag); + __FUNCTION__, p_cb->peer_oob_flag, p_cb->loc_oob_flag); SMP_TRACE_DEBUG("%s p_cb->peer_auth_req = 0x%02x p_cb->loc_auth_req = 0x%02x\n", - __FUNCTION__, p_cb->peer_auth_req, p_cb->loc_auth_req); + __FUNCTION__, p_cb->peer_auth_req, p_cb->loc_auth_req); SMP_TRACE_DEBUG("%s p_cb->secure_connections_only_mode_required = %s\n", - __FUNCTION__, p_cb->secure_connections_only_mode_required ? - "TRUE" : "FALSE"); + __FUNCTION__, p_cb->secure_connections_only_mode_required ? + "TRUE" : "FALSE"); - if ((p_cb->peer_auth_req & SMP_SC_SUPPORT_BIT) && (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT)) - { + if ((p_cb->peer_auth_req & SMP_SC_SUPPORT_BIT) && (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT)) { p_cb->le_secure_connections_mode_is_used = TRUE; } SMP_TRACE_DEBUG("use_sc_process = %d\n", p_cb->le_secure_connections_mode_is_used); - if (p_cb->le_secure_connections_mode_is_used) - { + if (p_cb->le_secure_connections_mode_is_used) { model = smp_select_association_model_secure_connections(p_cb); - } - else - { + } else { model = smp_select_legacy_association_model(p_cb); } return model; @@ -1230,25 +1236,23 @@ tSMP_ASSO_MODEL smp_select_legacy_association_model(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __func__); /* if OOB data is present on both devices, then use OOB association model */ - if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT) + if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT) { return SMP_MODEL_OOB; + } /* else if neither device requires MITM, then use Just Works association model */ - if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req)) + if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req)) { return SMP_MODEL_ENCRYPTION_ONLY; + } /* otherwise use IO capability to select association model */ - if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX) - { - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX) { + if (p_cb->role == HCI_ROLE_MASTER) { model = smp_association_table[p_cb->role][p_cb->peer_io_caps] - [p_cb->local_io_capability]; - } - else - { + [p_cb->local_io_capability]; + } else { model = smp_association_table[p_cb->role][p_cb->local_io_capability] - [p_cb->peer_io_caps]; + [p_cb->peer_io_caps]; } } @@ -1268,25 +1272,23 @@ tSMP_ASSO_MODEL smp_select_association_model_secure_connections(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __func__); /* if OOB data is present on at least one device, then use OOB association model */ - if (p_cb->peer_oob_flag == SMP_OOB_PRESENT || p_cb->loc_oob_flag == SMP_OOB_PRESENT) + if (p_cb->peer_oob_flag == SMP_OOB_PRESENT || p_cb->loc_oob_flag == SMP_OOB_PRESENT) { return SMP_MODEL_SEC_CONN_OOB; + } /* else if neither device requires MITM, then use Just Works association model */ - if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req)) + if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req)) { return SMP_MODEL_SEC_CONN_JUSTWORKS; + } /* otherwise use IO capability to select association model */ - if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX) - { - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX) { + if (p_cb->role == HCI_ROLE_MASTER) { model = smp_association_table_sc[p_cb->role][p_cb->peer_io_caps] - [p_cb->local_io_capability]; - } - else - { + [p_cb->local_io_capability]; + } else { model = smp_association_table_sc[p_cb->role][p_cb->local_io_capability] - [p_cb->peer_io_caps]; + [p_cb->peer_io_caps]; } } @@ -1301,15 +1303,14 @@ tSMP_ASSO_MODEL smp_select_association_model_secure_connections(tSMP_CB *p_cb) *******************************************************************************/ void smp_reverse_array(UINT8 *arr, UINT8 len) { - UINT8 i =0, tmp; + UINT8 i = 0, tmp; SMP_TRACE_DEBUG("smp_reverse_array\n"); - for (i = 0; i < len/2; i ++) - { + for (i = 0; i < len / 2; i ++) { tmp = arr[i]; - arr[i] = arr[len -1 - i]; - arr[len -1 - i] = tmp; + arr[i] = arr[len - 1 - i]; + arr[len - 1 - i] = tmp; } } @@ -1326,8 +1327,8 @@ void smp_reverse_array(UINT8 *arr, UINT8 len) *******************************************************************************/ UINT8 smp_calculate_random_input(UINT8 *random, UINT8 round) { - UINT8 i = round/8; - UINT8 j = round%8; + UINT8 i = round / 8; + UINT8 j = round % 8; UINT8 ri; SMP_TRACE_DEBUG("random: 0x%02x, round: %d, i: %d, j: %d\n", random[i], round, i, j); @@ -1413,8 +1414,7 @@ void smp_collect_peer_ble_address(UINT8 *le_addr, tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __func__); - if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda, &addr_type)) - { + if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda, &addr_type)) { SMP_TRACE_ERROR("can not collect peer le addr information for unknown device\n"); return; } @@ -1444,8 +1444,7 @@ BOOLEAN smp_check_commitment(tSMP_CB *p_cb) print128(expected, (const UINT8 *)"calculated peer commitment"); print128(p_cb->remote_commitment, (const UINT8 *)"received peer commitment"); - if (memcmp(p_cb->remote_commitment, expected, BT_OCTET16_LEN)) - { + if (memcmp(p_cb->remote_commitment, expected, BT_OCTET16_LEN)) { SMP_TRACE_WARNING("Commitment check fails\n"); return FALSE; } @@ -1506,23 +1505,19 @@ BOOLEAN smp_calculate_f5_mackey_and_long_term_key(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->role == HCI_ROLE_MASTER) - { + if (p_cb->role == HCI_ROLE_MASTER) { smp_collect_local_ble_address(a, p_cb); smp_collect_peer_ble_address(b, p_cb); p_na = p_cb->rand; p_nb = p_cb->rrand; - } - else - { + } else { smp_collect_local_ble_address(b, p_cb); smp_collect_peer_ble_address(a, p_cb); p_na = p_cb->rrand; p_nb = p_cb->rand; } - if(!smp_calculate_f5(p_cb->dhkey, p_na, p_nb, a, b, p_cb->mac_key, p_cb->ltk)) - { + if (!smp_calculate_f5(p_cb->dhkey, p_na, p_nb, a, b, p_cb->mac_key, p_cb->ltk)) { SMP_TRACE_ERROR("%s failed\n", __func__); return FALSE; } @@ -1547,25 +1542,21 @@ BOOLEAN smp_request_oob_data(tSMP_CB *p_cb) SMP_TRACE_DEBUG("%s\n", __func__); - if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT) - { + if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT) { /* both local and peer rcvd data OOB */ req_oob_type = SMP_OOB_BOTH; - } - else if (p_cb->peer_oob_flag == SMP_OOB_PRESENT) - { + } else if (p_cb->peer_oob_flag == SMP_OOB_PRESENT) { /* peer rcvd OOB local data, local didn't receive OOB peer data */ req_oob_type = SMP_OOB_LOCAL; - } - else if (p_cb->loc_oob_flag == SMP_OOB_PRESENT) - { + } else if (p_cb->loc_oob_flag == SMP_OOB_PRESENT) { req_oob_type = SMP_OOB_PEER; } SMP_TRACE_DEBUG("req_oob_type = %d\n", req_oob_type); - if (req_oob_type == SMP_OOB_INVALID_TYPE) + if (req_oob_type == SMP_OOB_INVALID_TYPE) { return FALSE; + } p_cb->req_oob_type = req_oob_type; p_cb->cb_evt = SMP_SC_OOB_REQ_EVT; diff --git a/components/bt/bt.c b/components/bt/bt.c index 23f8aea92..4e5ef4db4 100644 --- a/components/bt/bt.c +++ b/components/bt/bt.c @@ -73,7 +73,7 @@ static void IRAM_ATTR interrupt_restore(void) portEXIT_CRITICAL(&global_int_mux); } -static void * IRAM_ATTR semphr_create_wrapper(uint32_t max, uint32_t init) +static void *IRAM_ATTR semphr_create_wrapper(uint32_t max, uint32_t init) { return (void *)xSemaphoreCreateCounting(max, init); } @@ -88,7 +88,7 @@ static int32_t IRAM_ATTR semphr_take_wrapper(void *semphr, uint32_t block_time_m return (int32_t)xSemaphoreTake(semphr, block_time_ms / portTICK_RATE_MS); } -static void * IRAM_ATTR mutex_create_wrapper(void) +static void *IRAM_ATTR mutex_create_wrapper(void) { return (void *)xSemaphoreCreateMutex(); } @@ -127,8 +127,8 @@ static void bt_controller_task(void *pvParam) void bt_controller_init() { xTaskCreatePinnedToCore(bt_controller_task, "btController", - ESP_TASK_BT_CONTROLLER_STACK, NULL, - ESP_TASK_BT_CONTROLLER_PRIO, NULL, 0); + ESP_TASK_BT_CONTROLLER_STACK, NULL, + ESP_TASK_BT_CONTROLLER_PRIO, NULL, 0); } #endif diff --git a/components/bt/component.mk b/components/bt/component.mk index 814ed44ef..35c34e773 100644 --- a/components/bt/component.mk +++ b/components/bt/component.mk @@ -10,14 +10,14 @@ COMPONENT_ADD_INCLUDEDIRS := bluedroid/bta/include \ bluedroid/hci/include \ bluedroid/osi/include \ bluedroid/utils/include \ - bluedroid/profiles/core/include \ - bluedroid/profiles/esp/blufi/include \ - bluedroid/profiles/esp/include \ - bluedroid/profiles/std/battery/include \ - bluedroid/profiles/std/dis/include \ - bluedroid/profiles/std/hid/include \ - bluedroid/profiles/std/rfcomm/include \ - bluedroid/profiles/std/include \ + bluedroid/btc/core/include \ + bluedroid/btc/profile/esp/blufi/include \ + bluedroid/btc/profile/esp/include \ + bluedroid/btc/profile/std/gatt/include \ + bluedroid/btc/profile/std/gap/include \ + bluedroid/btc/profile/std/sdp/include \ + bluedroid/btc/profile/std/include \ + bluedroid/btc/include \ bluedroid/stack/btm/include \ bluedroid/stack/btu/include \ bluedroid/stack/gap/include \ @@ -36,11 +36,11 @@ COMPONENT_ADD_INCLUDEDIRS := bluedroid/bta/include \ bluedroid/include \ include -CFLAGS += -Wno-error=unused-label -Wno-error=return-type -Wno-error=missing-braces -Wno-error=pointer-sign -Wno-error=parentheses +CFLAGS += -Wno-error=unused-label -Wno-error=return-type -Wno-error=missing-braces -Wno-error=pointer-sign -Wno-error=parentheses -Wno-error=format -LIBS := btdm_app coexist +LIBS := btdm_app -COMPONENT_ADD_LDFLAGS := -lbt -L$(abspath lib) \ +COMPONENT_ADD_LDFLAGS := -lbt -L $(COMPONENT_PATH)/lib \ $(addprefix -l,$(LIBS)) \ $(LINKER_SCRIPTS) @@ -59,20 +59,11 @@ COMPONENT_SRCDIRS := bluedroid/bta/dm \ bluedroid/hci \ bluedroid/main \ bluedroid/osi \ - bluedroid/profiles/core \ - bluedroid/profiles/esp/blufi \ - bluedroid/profiles/esp/ble_button \ - bluedroid/profiles/esp/wechat_AirSync \ - bluedroid/profiles/esp \ - bluedroid/profiles/std/battery \ - bluedroid/profiles/std/dis \ - bluedroid/profiles/std/hid \ - bluedroid/profiles/std/hid_le \ - bluedroid/profiles/std/rfcomm \ - bluedroid/profiles/std/sdp \ - bluedroid/profiles/std/gap \ - bluedroid/profiles/std \ - bluedroid/profiles \ + bluedroid/btc/core \ + bluedroid/btc/profile/esp/blufi \ + bluedroid/btc/profile/std/gap \ + bluedroid/btc/profile/std/gatt \ + bluedroid/btc/profile \ bluedroid/stack/btm \ bluedroid/stack/btu \ bluedroid/stack/gap \ @@ -97,5 +88,4 @@ include $(IDF_PATH)/make/component_common.mk ALL_LIB_FILES := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS)) $(COMPONENT_LIBRARY): $(ALL_LIB_FILES) -# automatically trigger a git submodule update if BT library is missing -$(eval $(call SubmoduleCheck,$(ALL_LIB_FILES),$(COMPONENT_PATH)/lib)) +COMPONENT_SUBMODULES += lib diff --git a/components/bt/include/bt.h b/components/bt/include/bt.h index 62a3e60f7..310fdcb92 100644 --- a/components/bt/include/bt.h +++ b/components/bt/include/bt.h @@ -29,37 +29,33 @@ extern "C" { * * This function should be called only once, before any other BT functions are called. */ -void bt_controller_init(); +void bt_controller_init(void); -/** @brief: vhci_host_callback +/** @brief vhci_host_callback * used for vhci call host function to notify what host need to do - * - * notify_host_send_available: notify host can send packet to controller - * notify_host_recv: notify host that controller has packet send to host */ typedef struct vhci_host_callback { - - void (*notify_host_send_available)(void); - int (*notify_host_recv)(uint8_t *data, uint16_t len); + void (*notify_host_send_available)(void); /*!< callback used to notify that the host can send packet to controller */ + int (*notify_host_recv)(uint8_t *data, uint16_t len); /*!< callback used to notify that the controller has a packet to send to the host*/ } vhci_host_callback_t; -/** @brief: API_vhci_host_check_send_available +/** @brief API_vhci_host_check_send_available * used for check actively if the host can send packet to controller or not. - * return true for ready to send, false means cannot send packet + * @return true for ready to send, false means cannot send packet */ bool API_vhci_host_check_send_available(void); -/** @brief: API_vhci_host_send_packet +/** @brief API_vhci_host_send_packet * host send packet to controller - * param data is the packet point, the param len is the packet length - * return void + * @param data the packet point + *,@param len the packet length */ void API_vhci_host_send_packet(uint8_t *data, uint16_t len); -/** @brief: API_vhci_host_register_callback +/** @brief API_vhci_host_register_callback * register the vhci referece callback, the call back * struct defined by vhci_host_callback structure. - * param is the vhci_host_callback type variable + * @param callback vhci_host_callback type variable */ void API_vhci_host_register_callback(const vhci_host_callback_t *callback); diff --git a/components/bt/lib b/components/bt/lib index 0f11ccac9..a0f2d0a96 160000 --- a/components/bt/lib +++ b/components/bt/lib @@ -1 +1 @@ -Subproject commit 0f11ccac9a5f39e28e5d8904634c54acd4f140fd +Subproject commit a0f2d0a961eef1a4926218b26b77011a89e8188f diff --git a/components/driver/component.mk b/components/driver/component.mk index a19b131ef..a208f6ae2 100644 --- a/components/driver/component.mk +++ b/components/driver/component.mk @@ -1,14 +1,8 @@ # # Component Makefile # -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component.mk. By default, -# this will take the sources in this directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the SDK documents if you need to do this. -# COMPONENT_ADD_INCLUDEDIRS := include COMPONENT_PRIV_INCLUDEDIRS := include/driver -include $(IDF_PATH)/make/component_common.mk diff --git a/components/driver/gpio.c b/components/driver/gpio.c index 14dfc00b4..d5d4d9d40 100644 --- a/components/driver/gpio.c +++ b/components/driver/gpio.c @@ -18,34 +18,13 @@ #include "freertos/xtensa_api.h" #include "driver/gpio.h" #include "soc/soc.h" +#include "esp_log.h" -//TODO: move debug options to menuconfig -#define GPIO_DBG_ENABLE (0) -#define GPIO_WARNING_ENABLE (0) -#define GPIO_ERROR_ENABLE (0) -#define GPIO_INFO_ENABLE (0) -//DBG INFOR -#if GPIO_INFO_ENABLE -#define GPIO_INFO ets_printf -#else -#define GPIO_INFO(...) -#endif -#if GPIO_WARNING_ENABLE -#define GPIO_WARNING(format,...) do{\ - ets_printf("[waring][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define GPIO_WARNING(...) -#endif -#if GPIO_ERROR_ENABLE -#define GPIO_ERROR(format,...) do{\ - ets_printf("[error][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define GPIO_ERROR(...) -#endif +static const char* GPIO_TAG = "GPIO"; +#define GPIO_CHECK(a, str, ret_val) if (!(a)) { \ + ESP_LOGE(GPIO_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret_val); \ + } const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT] = { GPIO_PIN_REG_0, @@ -90,33 +69,85 @@ const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT] = { GPIO_PIN_REG_39 }; -static int is_valid_gpio(int gpio_num) -{ - if(gpio_num >= GPIO_PIN_COUNT || GPIO_PIN_MUX_REG[gpio_num] == 0) { - GPIO_ERROR("GPIO io_num=%d does not exist\n",gpio_num); - return 0; - } - return 1; +const gpio_pu_pd_desc_t gpio_pu_pd_desc[GPIO_PIN_COUNT]={ + {RTC_IO_TOUCH_PAD1_REG, RTC_IO_TOUCH_PAD1_RUE_M, RTC_IO_TOUCH_PAD1_RDE_M}, + {PERIPHS_IO_MUX_U0TXD_U, FUN_PU, FUN_PD}, + {RTC_IO_TOUCH_PAD2_REG, RTC_IO_TOUCH_PAD2_RUE_M, RTC_IO_TOUCH_PAD2_RDE_M}, + {PERIPHS_IO_MUX_U0RXD_U, FUN_PU, FUN_PD}, + {RTC_IO_TOUCH_PAD0_REG, RTC_IO_TOUCH_PAD0_RUE_M, RTC_IO_TOUCH_PAD0_RDE_M}, + {PERIPHS_IO_MUX_GPIO5_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_CLK_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_DATA0_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_DATA1_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_DATA2_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_DATA3_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_SD_CMD_U, FUN_PU, FUN_PD}, + {RTC_IO_TOUCH_PAD5_REG, RTC_IO_TOUCH_PAD5_RUE_M, RTC_IO_TOUCH_PAD5_RDE_M}, + {RTC_IO_TOUCH_PAD4_REG, RTC_IO_TOUCH_PAD4_RUE_M, RTC_IO_TOUCH_PAD4_RDE_M}, + {RTC_IO_TOUCH_PAD6_REG, RTC_IO_TOUCH_PAD6_RUE_M, RTC_IO_TOUCH_PAD6_RDE_M}, + {RTC_IO_TOUCH_PAD3_REG, RTC_IO_TOUCH_PAD3_RUE_M, RTC_IO_TOUCH_PAD3_RDE_M}, + {PERIPHS_IO_MUX_GPIO16_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO17_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO18_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO19_U, FUN_PU, FUN_PD}, + {0,0,0}, + {PERIPHS_IO_MUX_GPIO21_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO22_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO23_U, FUN_PU, FUN_PD}, + {0,0,0}, + {RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_RUE_M, RTC_IO_PDAC1_RDE_M}, + {RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_RUE_M, RTC_IO_PDAC2_RDE_M}, + {RTC_IO_TOUCH_PAD7_REG, RTC_IO_TOUCH_PAD7_RUE_M, RTC_IO_TOUCH_PAD7_RDE_M}, + {0,0,0}, + {0,0,0}, + {0,0,0}, + {0,0,0}, + {RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32P_RUE_M, RTC_IO_X32P_RDE_M}, + {RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32N_RUE_M, RTC_IO_X32N_RDE_M}, + {PERIPHS_IO_MUX_GPIO34_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO35_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO36_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO37_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO38_U, FUN_PU, FUN_PD}, + {PERIPHS_IO_MUX_GPIO39_U, FUN_PU, FUN_PD} +}; + + +esp_err_t gpio_pullup_en(gpio_num_t gpio_num) { + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + return ESP_OK; +} + +esp_err_t gpio_pullup_dis(gpio_num_t gpio_num) { + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + return ESP_OK; +} + +esp_err_t gpio_pulldown_en(gpio_num_t gpio_num) { + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); + return ESP_OK; +} + +esp_err_t gpio_pulldown_dis(gpio_num_t gpio_num) { + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); + return ESP_OK; } esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } - if(intr_type >= GPIO_INTR_MAX) { - GPIO_ERROR("Unknown GPIO intr:%u\n",intr_type); - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + GPIO_CHECK(intr_type < GPIO_INTR_MAX, "GPIO interrupt type error", ESP_ERR_INVALID_ARG); GPIO.pin[gpio_num].int_type = intr_type; return ESP_OK; } esp_err_t gpio_intr_enable(gpio_num_t gpio_num) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); if(xPortGetCoreID() == 0) { GPIO.pin[gpio_num].int_ena = GPIO_PRO_CPU_INTR_ENA; //enable pro cpu intr } else { @@ -127,18 +158,14 @@ esp_err_t gpio_intr_enable(gpio_num_t gpio_num) esp_err_t gpio_intr_disable(gpio_num_t gpio_num) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); GPIO.pin[gpio_num].int_ena = 0; //disable GPIO intr return ESP_OK; } static esp_err_t gpio_output_disable(gpio_num_t gpio_num) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); if(gpio_num < 32) { GPIO.enable_w1tc = (0x1 << gpio_num); } else { @@ -149,13 +176,7 @@ static esp_err_t gpio_output_disable(gpio_num_t gpio_num) static esp_err_t gpio_output_enable(gpio_num_t gpio_num) { - if(gpio_num >= 34) { - GPIO_ERROR("io_num=%d can only be input\n",gpio_num); - return ESP_ERR_INVALID_ARG; - } - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "GPIO output gpio_num error", ESP_ERR_INVALID_ARG); if(gpio_num < 32) { GPIO.enable_w1ts = (0x1 << gpio_num); } else { @@ -166,9 +187,7 @@ static esp_err_t gpio_output_enable(gpio_num_t gpio_num) esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level) { - if(!GPIO_IS_VALID_GPIO(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); if(level) { if(gpio_num < 32) { GPIO.out_w1ts = (1 << gpio_num); @@ -196,29 +215,28 @@ int gpio_get_level(gpio_num_t gpio_num) esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + GPIO_CHECK(pull <= GPIO_FLOATING, "GPIO pull mode error", ESP_ERR_INVALID_ARG); esp_err_t ret = ESP_OK; switch(pull) { case GPIO_PULLUP_ONLY: - PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]); - PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); break; case GPIO_PULLDOWN_ONLY: - PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]); - PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); break; case GPIO_PULLUP_PULLDOWN: - PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]); - PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); break; case GPIO_FLOATING: - PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]); - PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); + REG_CLR_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pd); break; default: - GPIO_ERROR("Unknown pull up/down mode,gpio_num=%u,pull=%u\n",gpio_num,pull); + ESP_LOGE(GPIO_TAG, "Unknown pull up/down mode,gpio_num=%u,pull=%u",gpio_num,pull); ret = ESP_ERR_INVALID_ARG; break; } @@ -227,11 +245,9 @@ esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull) esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); if(gpio_num >= 34 && (mode & (GPIO_MODE_DEF_OUTPUT))) { - GPIO_ERROR("io_num=%d can only be input\n",gpio_num); + ESP_LOGE(GPIO_TAG, "io_num=%d can only be input",gpio_num); return ESP_ERR_INVALID_ARG; } esp_err_t ret = ESP_OK; @@ -266,54 +282,56 @@ esp_err_t gpio_config(gpio_config_t *pGPIOConfig) uint64_t gpio_pin_mask = (pGPIOConfig->pin_bit_mask); uint32_t io_reg = 0; uint32_t io_num = 0; - uint64_t bit_valid = 0; + uint8_t input_en = 0; + uint8_t output_en = 0; + uint8_t od_en = 0; + uint8_t pu_en = 0; + uint8_t pd_en = 0; if(pGPIOConfig->pin_bit_mask == 0 || pGPIOConfig->pin_bit_mask >= (((uint64_t) 1) << GPIO_PIN_COUNT)) { - GPIO_ERROR("GPIO_PIN mask error \n"); + ESP_LOGE(GPIO_TAG, "GPIO_PIN mask error "); return ESP_ERR_INVALID_ARG; } if((pGPIOConfig->mode) & (GPIO_MODE_DEF_OUTPUT)) { //GPIO 34/35/36/37/38/39 can only be used as input mode; if((gpio_pin_mask & ( GPIO_SEL_34 | GPIO_SEL_35 | GPIO_SEL_36 | GPIO_SEL_37 | GPIO_SEL_38 | GPIO_SEL_39))) { - GPIO_ERROR("GPIO34-39 can only be used as input mode\n"); + ESP_LOGE(GPIO_TAG, "GPIO34-39 can only be used as input mode"); return ESP_ERR_INVALID_ARG; } } do { io_reg = GPIO_PIN_MUX_REG[io_num]; if(((gpio_pin_mask >> io_num) & BIT(0)) && io_reg) { - GPIO_INFO("Gpio%02d |Mode:",io_num); if((pGPIOConfig->mode) & GPIO_MODE_DEF_INPUT) { - GPIO_INFO("INPUT "); + input_en = 1; PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[io_num]); } else { PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[io_num]); } if((pGPIOConfig->mode) & GPIO_MODE_DEF_OD) { - GPIO_INFO("OD "); + od_en = 1; GPIO.pin[io_num].pad_driver = 1; /*0x01 Open-drain */ } else { GPIO.pin[io_num].pad_driver = 0; /*0x00 Normal gpio output */ } if((pGPIOConfig->mode) & GPIO_MODE_DEF_OUTPUT) { - GPIO_INFO("OUTPUT "); + output_en = 1; gpio_output_enable(io_num); } else { gpio_output_disable(io_num); } - GPIO_INFO("|"); if(pGPIOConfig->pull_up_en) { - GPIO_INFO("PU "); - PIN_PULLUP_EN(io_reg); + pu_en = 1; + REG_SET_BIT(gpio_pu_pd_desc[io_num].reg, gpio_pu_pd_desc[io_num].pu); } else { - PIN_PULLUP_DIS(io_reg); + REG_CLR_BIT(gpio_pu_pd_desc[io_num].reg, gpio_pu_pd_desc[io_num].pu); } if(pGPIOConfig->pull_down_en) { - GPIO_INFO("PD "); - PIN_PULLDWN_EN(io_reg); + pd_en = 1; + REG_SET_BIT(gpio_pu_pd_desc[io_num].reg, gpio_pu_pd_desc[io_num].pd); } else { - PIN_PULLDWN_DIS(io_reg); + REG_CLR_BIT(gpio_pu_pd_desc[io_num].reg, gpio_pu_pd_desc[io_num].pd); } - GPIO_INFO("Intr:%d |\n",pGPIOConfig->intr_type); + ESP_LOGI(GPIO_TAG, "GPIO[%d]| InputEn: %d| OutputEn: %d| OpenDrain: %d| Pullup: %d| Pulldown: %d| Intr:%d ", io_num, input_en, output_en, od_en, pu_en, pd_en, pGPIOConfig->intr_type); gpio_set_intr_type(io_num, pGPIOConfig->intr_type); if(pGPIOConfig->intr_type) { gpio_intr_enable(io_num); @@ -321,8 +339,6 @@ esp_err_t gpio_config(gpio_config_t *pGPIOConfig) gpio_intr_disable(io_num); } PIN_FUNC_SELECT(io_reg, PIN_FUNC_GPIO); /*function number 2 is GPIO_FUNC for each pin */ - } else if(bit_valid && (io_reg == 0)) { - GPIO_WARNING("io_num=%d does not exist\n",io_num); } io_num++; } while(io_num < GPIO_PIN_COUNT); @@ -331,9 +347,7 @@ esp_err_t gpio_config(gpio_config_t *pGPIOConfig) esp_err_t gpio_isr_register(uint32_t gpio_intr_num, void (*fn)(void*), void * arg) { - if(fn == NULL) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(fn, "GPIO ISR null", ESP_ERR_INVALID_ARG); ESP_INTR_DISABLE(gpio_intr_num); intr_matrix_set(xPortGetCoreID(), ETS_GPIO_INTR_SOURCE, gpio_intr_num); xt_set_interrupt_handler(gpio_intr_num, fn, arg); @@ -344,15 +358,13 @@ esp_err_t gpio_isr_register(uint32_t gpio_intr_num, void (*fn)(void*), void * ar /*only level interrupt can be used for wake-up function*/ esp_err_t gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); esp_err_t ret = ESP_OK; if((intr_type == GPIO_INTR_LOW_LEVEL) || (intr_type == GPIO_INTR_HIGH_LEVEL)) { GPIO.pin[gpio_num].int_type = intr_type; GPIO.pin[gpio_num].wakeup_enable = 0x1; } else { - GPIO_ERROR("GPIO wakeup only support Level mode,but edge mode set. gpio_num:%u\n",gpio_num); + ESP_LOGE(GPIO_TAG, "GPIO wakeup only support Level mode,but edge mode set. gpio_num:%u",gpio_num); ret = ESP_ERR_INVALID_ARG; } return ret; @@ -360,9 +372,7 @@ esp_err_t gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type) esp_err_t gpio_wakeup_disable(gpio_num_t gpio_num) { - if(!is_valid_gpio(gpio_num)) { - return ESP_ERR_INVALID_ARG; - } + GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); GPIO.pin[gpio_num].wakeup_enable = 0; return ESP_OK; } diff --git a/components/driver/include/driver/gpio.h b/components/driver/include/driver/gpio.h index 9b47c88e6..de34ac4e3 100644 --- a/components/driver/include/driver/gpio.h +++ b/components/driver/include/driver/gpio.h @@ -20,6 +20,7 @@ #include "soc/gpio_struct.h" #include "soc/rtc_io_reg.h" #include "soc/io_mux_reg.h" +#include "soc/gpio_sig_map.h" #include "rom/gpio.h" #include "esp_attr.h" @@ -27,43 +28,43 @@ extern "C" { #endif -#define GPIO_SEL_0 (BIT(0)) /* Pin 0 selected */ -#define GPIO_SEL_1 (BIT(1)) /* Pin 1 selected */ -#define GPIO_SEL_2 (BIT(2)) /* Pin 2 selected */ -#define GPIO_SEL_3 (BIT(3)) /* Pin 3 selected */ -#define GPIO_SEL_4 (BIT(4)) /* Pin 4 selected */ -#define GPIO_SEL_5 (BIT(5)) /* Pin 5 selected */ -#define GPIO_SEL_6 (BIT(6)) /* Pin 6 selected */ -#define GPIO_SEL_7 (BIT(7)) /* Pin 7 selected */ -#define GPIO_SEL_8 (BIT(8)) /* Pin 8 selected */ -#define GPIO_SEL_9 (BIT(9)) /* Pin 9 selected */ -#define GPIO_SEL_10 (BIT(10)) /* Pin 10 selected */ -#define GPIO_SEL_11 (BIT(11)) /* Pin 11 selected */ -#define GPIO_SEL_12 (BIT(12)) /* Pin 12 selected */ -#define GPIO_SEL_13 (BIT(13)) /* Pin 13 selected */ -#define GPIO_SEL_14 (BIT(14)) /* Pin 14 selected */ -#define GPIO_SEL_15 (BIT(15)) /* Pin 15 selected */ -#define GPIO_SEL_16 (BIT(16)) /* Pin 16 selected */ -#define GPIO_SEL_17 (BIT(17)) /* Pin 17 selected */ -#define GPIO_SEL_18 (BIT(18)) /* Pin 18 selected */ -#define GPIO_SEL_19 (BIT(19)) /* Pin 19 selected */ +#define GPIO_SEL_0 (BIT(0)) /*!< Pin 0 selected */ +#define GPIO_SEL_1 (BIT(1)) /*!< Pin 1 selected */ +#define GPIO_SEL_2 (BIT(2)) /*!< Pin 2 selected */ +#define GPIO_SEL_3 (BIT(3)) /*!< Pin 3 selected */ +#define GPIO_SEL_4 (BIT(4)) /*!< Pin 4 selected */ +#define GPIO_SEL_5 (BIT(5)) /*!< Pin 5 selected */ +#define GPIO_SEL_6 (BIT(6)) /*!< Pin 6 selected */ +#define GPIO_SEL_7 (BIT(7)) /*!< Pin 7 selected */ +#define GPIO_SEL_8 (BIT(8)) /*!< Pin 8 selected */ +#define GPIO_SEL_9 (BIT(9)) /*!< Pin 9 selected */ +#define GPIO_SEL_10 (BIT(10)) /*!< Pin 10 selected */ +#define GPIO_SEL_11 (BIT(11)) /*!< Pin 11 selected */ +#define GPIO_SEL_12 (BIT(12)) /*!< Pin 12 selected */ +#define GPIO_SEL_13 (BIT(13)) /*!< Pin 13 selected */ +#define GPIO_SEL_14 (BIT(14)) /*!< Pin 14 selected */ +#define GPIO_SEL_15 (BIT(15)) /*!< Pin 15 selected */ +#define GPIO_SEL_16 (BIT(16)) /*!< Pin 16 selected */ +#define GPIO_SEL_17 (BIT(17)) /*!< Pin 17 selected */ +#define GPIO_SEL_18 (BIT(18)) /*!< Pin 18 selected */ +#define GPIO_SEL_19 (BIT(19)) /*!< Pin 19 selected */ -#define GPIO_SEL_21 (BIT(21)) /* Pin 21 selected */ -#define GPIO_SEL_22 (BIT(22)) /* Pin 22 selected */ -#define GPIO_SEL_23 (BIT(23)) /* Pin 23 selected */ +#define GPIO_SEL_21 (BIT(21)) /*!< Pin 21 selected */ +#define GPIO_SEL_22 (BIT(22)) /*!< Pin 22 selected */ +#define GPIO_SEL_23 (BIT(23)) /*!< Pin 23 selected */ -#define GPIO_SEL_25 (BIT(25)) /* Pin 25 selected */ -#define GPIO_SEL_26 (BIT(26)) /* Pin 26 selected */ -#define GPIO_SEL_27 (BIT(27)) /* Pin 27 selected */ +#define GPIO_SEL_25 (BIT(25)) /*!< Pin 25 selected */ +#define GPIO_SEL_26 (BIT(26)) /*!< Pin 26 selected */ +#define GPIO_SEL_27 (BIT(27)) /*!< Pin 27 selected */ -#define GPIO_SEL_32 ((uint64_t)(((uint64_t)1)<<32)) /* Pin 32 selected */ -#define GPIO_SEL_33 ((uint64_t)(((uint64_t)1)<<33)) /* Pin 33 selected */ -#define GPIO_SEL_34 ((uint64_t)(((uint64_t)1)<<34)) /* Pin 34 selected */ -#define GPIO_SEL_35 ((uint64_t)(((uint64_t)1)<<35)) /* Pin 35 selected */ -#define GPIO_SEL_36 ((uint64_t)(((uint64_t)1)<<36)) /* Pin 36 selected */ -#define GPIO_SEL_37 ((uint64_t)(((uint64_t)1)<<37)) /* Pin 37 selected */ -#define GPIO_SEL_38 ((uint64_t)(((uint64_t)1)<<38)) /* Pin 38 selected */ -#define GPIO_SEL_39 ((uint64_t)(((uint64_t)1)<<39)) /* Pin 39 selected */ +#define GPIO_SEL_32 ((uint64_t)(((uint64_t)1)<<32)) /*!< Pin 32 selected */ +#define GPIO_SEL_33 ((uint64_t)(((uint64_t)1)<<33)) /*!< Pin 33 selected */ +#define GPIO_SEL_34 ((uint64_t)(((uint64_t)1)<<34)) /*!< Pin 34 selected */ +#define GPIO_SEL_35 ((uint64_t)(((uint64_t)1)<<35)) /*!< Pin 35 selected */ +#define GPIO_SEL_36 ((uint64_t)(((uint64_t)1)<<36)) /*!< Pin 36 selected */ +#define GPIO_SEL_37 ((uint64_t)(((uint64_t)1)<<37)) /*!< Pin 37 selected */ +#define GPIO_SEL_38 ((uint64_t)(((uint64_t)1)<<38)) /*!< Pin 38 selected */ +#define GPIO_SEL_39 ((uint64_t)(((uint64_t)1)<<39)) /*!< Pin 39 selected */ #define GPIO_PIN_REG_0 PERIPHS_IO_MUX_GPIO0_U #define GPIO_PIN_REG_1 PERIPHS_IO_MUX_U0TXD_U @@ -116,223 +117,223 @@ extern const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT]; #define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num < GPIO_PIN_COUNT && GPIO_PIN_MUX_REG[gpio_num] != 0)) //to decide whether it is a valid GPIO number #define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((GPIO_IS_VALID_GPIO(gpio_num)) && (gpio_num < 34)) //to decide whether it can be a valid GPIO number of output mode +/** + * @brief Pullup/pulldown information for a single GPIO pad + */ +typedef struct { + uint32_t reg; /*!< Register to modify to enable or disable pullups or pulldowns */ + uint32_t pu; /*!< Bit to set or clear in the above register to enable or disable the pullup, respectively */ + uint32_t pd; /*!< Bit to set or clear in the above register to enable or disable the pulldown, respectively */ +} gpio_pu_pd_desc_t; + + +/** + * Per-GPIO pullup/pulldown information + * On the ESP32, some GPIOs need their pullups and pulldowns enabled and disabled in the RTC + * peripheral instead of in the GPIO peripheral. This array documents for every GPIO what bit + * to set or clear. + * + * This array is non-static, so if you need a very quick way of toggling the pull-up/downs, you can just + * do e.g. REG_SET_BIT(gpio_pu_pd_desc[gpio_num].reg, gpio_pu_pd_desc[gpio_num].pu); inline. + * + * ToDo: Functions using the contents of this array will do a read/modify/write on GPIO as well as RTC + * registers. We may need to look into muxes/locks for other code that accesses these RTC registers when we + * write drivers for the RTC stuff. + */ +extern const gpio_pu_pd_desc_t gpio_pu_pd_desc[GPIO_PIN_COUNT]; + + typedef enum { - GPIO_NUM_0 = 0, - GPIO_NUM_1 = 1, - GPIO_NUM_2 = 2, - GPIO_NUM_3 = 3, - GPIO_NUM_4 = 4, - GPIO_NUM_5 = 5, - GPIO_NUM_6 = 6, - GPIO_NUM_7 = 7, - GPIO_NUM_8 = 8, - GPIO_NUM_9 = 9, - GPIO_NUM_10 = 10, - GPIO_NUM_11 = 11, - GPIO_NUM_12 = 12, - GPIO_NUM_13 = 13, - GPIO_NUM_14 = 14, - GPIO_NUM_15 = 15, - GPIO_NUM_16 = 16, - GPIO_NUM_17 = 17, - GPIO_NUM_18 = 18, - GPIO_NUM_19 = 19, + GPIO_NUM_0 = 0, /*!< GPIO0, input and output */ + GPIO_NUM_1 = 1, /*!< GPIO1, input and output */ + GPIO_NUM_2 = 2, /*!< GPIO2, input and output */ + GPIO_NUM_3 = 3, /*!< GPIO3, input and output */ + GPIO_NUM_4 = 4, /*!< GPIO4, input and output */ + GPIO_NUM_5 = 5, /*!< GPIO5, input and output */ + GPIO_NUM_6 = 6, /*!< GPIO6, input and output */ + GPIO_NUM_7 = 7, /*!< GPIO7, input and output */ + GPIO_NUM_8 = 8, /*!< GPIO8, input and output */ + GPIO_NUM_9 = 9, /*!< GPIO9, input and output */ + GPIO_NUM_10 = 10, /*!< GPIO10, input and output */ + GPIO_NUM_11 = 11, /*!< GPIO11, input and output */ + GPIO_NUM_12 = 12, /*!< GPIO12, input and output */ + GPIO_NUM_13 = 13, /*!< GPIO13, input and output */ + GPIO_NUM_14 = 14, /*!< GPIO14, input and output */ + GPIO_NUM_15 = 15, /*!< GPIO15, input and output */ + GPIO_NUM_16 = 16, /*!< GPIO16, input and output */ + GPIO_NUM_17 = 17, /*!< GPIO17, input and output */ + GPIO_NUM_18 = 18, /*!< GPIO18, input and output */ + GPIO_NUM_19 = 19, /*!< GPIO19, input and output */ - GPIO_NUM_21 = 21, - GPIO_NUM_22 = 22, - GPIO_NUM_23 = 23, + GPIO_NUM_21 = 21, /*!< GPIO21, input and output */ + GPIO_NUM_22 = 22, /*!< GPIO22, input and output */ + GPIO_NUM_23 = 23, /*!< GPIO23, input and output */ - GPIO_NUM_25 = 25, - GPIO_NUM_26 = 26, - GPIO_NUM_27 = 27, + GPIO_NUM_25 = 25, /*!< GPIO25, input and output */ + GPIO_NUM_26 = 26, /*!< GPIO26, input and output */ + GPIO_NUM_27 = 27, /*!< GPIO27, input and output */ - GPIO_NUM_32 = 32, - GPIO_NUM_33 = 33, - GPIO_NUM_34 = 34, /*input mode only */ - GPIO_NUM_35 = 35, /*input mode only */ - GPIO_NUM_36 = 36, /*input mode only */ - GPIO_NUM_37 = 37, /*input mode only */ - GPIO_NUM_38 = 38, /*input mode only */ - GPIO_NUM_39 = 39, /*input mode only */ + GPIO_NUM_32 = 32, /*!< GPIO32, input and output */ + GPIO_NUM_33 = 33, /*!< GPIO32, input and output */ + GPIO_NUM_34 = 34, /*!< GPIO34, input mode only */ + GPIO_NUM_35 = 35, /*!< GPIO35, input mode only */ + GPIO_NUM_36 = 36, /*!< GPIO36, input mode only */ + GPIO_NUM_37 = 37, /*!< GPIO37, input mode only */ + GPIO_NUM_38 = 38, /*!< GPIO38, input mode only */ + GPIO_NUM_39 = 39, /*!< GPIO39, input mode only */ } gpio_num_t; typedef enum { - GPIO_INTR_DISABLE = 0, /* disable GPIO interrupt */ - GPIO_INTR_POSEDGE = 1, /* GPIO interrupt type : rising edge */ - GPIO_INTR_NEGEDGE = 2, /* GPIO interrupt type : falling edge */ - GPIO_INTR_ANYEDGE = 3, /* GPIO interrupt type : both rising and falling edge */ - GPIO_INTR_LOW_LEVEL = 4, /* GPIO interrupt type : input low level trigger */ - GPIO_INTR_HIGH_LEVEL = 5, /* GPIO interrupt type : input high level trigger */ + GPIO_INTR_DISABLE = 0, /*!< Disable GPIO interrupt */ + GPIO_INTR_POSEDGE = 1, /*!< GPIO interrupt type : rising edge */ + GPIO_INTR_NEGEDGE = 2, /*!< GPIO interrupt type : falling edge */ + GPIO_INTR_ANYEDGE = 3, /*!< GPIO interrupt type : both rising and falling edge */ + GPIO_INTR_LOW_LEVEL = 4, /*!< GPIO interrupt type : input low level trigger */ + GPIO_INTR_HIGH_LEVEL = 5, /*!< GPIO interrupt type : input high level trigger */ GPIO_INTR_MAX, } gpio_int_type_t; typedef enum { - GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT, /* GPIO mode : input only */ - GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT, /* GPIO mode : output only mode */ - GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)), /* GPIO mode : output only with open-drain mode */ - GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)), /* GPIO mode : output and input with open-drain mode*/ - GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)), /* GPIO mode : output and input mode */ + GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT, /*!< GPIO mode : input only */ + GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT, /*!< GPIO mode : output only mode */ + GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)), /*!< GPIO mode : output only with open-drain mode */ + GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)), /*!< GPIO mode : output and input with open-drain mode*/ + GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)), /*!< GPIO mode : output and input mode */ } gpio_mode_t; typedef enum { - GPIO_PULLUP_DISABLE = 0x0, /* disable GPIO pull-up resistor */ - GPIO_PULLUP_ENABLE = 0x1, /* enable GPIO pull-up resistor */ + GPIO_PULLUP_DISABLE = 0x0, /*!< Disable GPIO pull-up resistor */ + GPIO_PULLUP_ENABLE = 0x1, /*!< Enable GPIO pull-up resistor */ } gpio_pullup_t; typedef enum { - GPIO_PULLDOWN_DISABLE = 0x0, /* disable GPIO pull-down resistor */ - GPIO_PULLDOWN_ENABLE = 0x1, /* enable GPIO pull-down resistor */ + GPIO_PULLDOWN_DISABLE = 0x0, /*!< Disable GPIO pull-down resistor */ + GPIO_PULLDOWN_ENABLE = 0x1, /*!< Enable GPIO pull-down resistor */ } gpio_pulldown_t; +/** + * @brief Configuration parameters of GPIO pad for gpio_config function + */ typedef struct { - uint64_t pin_bit_mask; /* GPIO pin: set with bit mask, each bit maps to a GPIO */ - gpio_mode_t mode; /* GPIO mode: set input/output mode */ - gpio_pullup_t pull_up_en; /* GPIO pull-up */ - gpio_pulldown_t pull_down_en; /* GPIO pull-down */ - gpio_int_type_t intr_type; /* GPIO interrupt type */ + uint64_t pin_bit_mask; /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */ + gpio_mode_t mode; /*!< GPIO mode: set input/output mode */ + gpio_pullup_t pull_up_en; /*!< GPIO pull-up */ + gpio_pulldown_t pull_down_en; /*!< GPIO pull-down */ + gpio_int_type_t intr_type; /*!< GPIO interrupt type */ } gpio_config_t; typedef enum { - GPIO_LOW_LEVEL = 0, - GPIO_HIGH_LEVEL = 1, - GPIO_LEVEL_ERR, -} gpio_level_t; - -typedef enum { - GPIO_PULLUP_ONLY, /* Pad pull up */ - GPIO_PULLDOWN_ONLY, /* Pad pull down */ - GPIO_PULLUP_PULLDOWN, /* Pad pull up + pull down*/ - GPIO_FLOATING, /* Pad floating */ + GPIO_PULLUP_ONLY, /*!< Pad pull up */ + GPIO_PULLDOWN_ONLY, /*!< Pad pull down */ + GPIO_PULLUP_PULLDOWN, /*!< Pad pull up + pull down*/ + GPIO_FLOATING, /*!< Pad floating */ } gpio_pull_mode_t; typedef void (*gpio_event_callback)(gpio_num_t gpio_intr_num); -/** \defgroup Driver_APIs Driver APIs - * @brief Driver APIs - */ - -/** @addtogroup Driver_APIs - * @{ - */ - -/** \defgroup GPIO_Driver_APIs GPIO Driver APIs - * @brief GPIO APIs - */ - -/** @addtogroup GPIO_Driver_APIs - * @{ - */ - /** - * @brief GPIO common configuration + * @brief GPIO common configuration * - * Use this Function ,Configure GPIO's Mode,pull-up,PullDown,IntrType + * Configure GPIO's Mode,pull-up,PullDown,IntrType * - * @parameter[in] pGPIOConfig - * pGPIOConfig.pin_bit_mask : Configure GPIO pins bits,set this parameter with bit mask. - * If you want to configure GPIO34 and GPIO16, pin_bit_mask=GPIO_Pin_16|GPIO_Pin_34; - * pGPIOConfig.mode : Configure GPIO mode,such as output ,input... - * pGPIOConfig.pull_up_en : Enable or Disable pull-up - * pGPIOConfig.pull_down_en : Enable or Disable pull-down - * pGPIOConfig.intr_type : Configure GPIO interrupt trigger type - * @return ESP_OK: success ; - * ESP_ERR_INVALID_ARG: parameter error - * ESP_FAIL : GPIO error + * @param pGPIOConfig Pointer to GPIO configure struct + * + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t gpio_config(gpio_config_t *pGPIOConfig); /** - * @brief GPIO set interrupt trigger type + * @brief GPIO set interrupt trigger type * - * @parameter[in] gpio_num : GPIO number. - * If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16); - * @parameter[in] intr_type: interrupt type, select from gpio_int_type_t + * @param gpio_num GPIO number. If you want to set the trigger type of e.g. of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param intr_type Interrupt type, select from gpio_int_type_t * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type); /** - * @brief enable GPIO module interrupt signal + * @brief Enable GPIO module interrupt signal * - * @parameter[in] gpio_num : GPIO number. - * If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param gpio_num GPIO number. If you want to enable an interrupt on e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t gpio_intr_enable(gpio_num_t gpio_num); /** - * @brief disable GPIO module interrupt signal + * @brief Disable GPIO module interrupt signal * - * @parameter[in] gpio_num : GPIO number. - * If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param gpio_num GPIO number. If you want to disable the interrupt of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t gpio_intr_disable(gpio_num_t gpio_num); /** - * @brief GPIO set output level + * @brief GPIO set output level * - * @parameter[in] gpio_num : GPIO number. - * If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16); - * @parameter[in] level : Output level. 0: low ; 1: high + * @param gpio_num GPIO number. If you want to set the output level of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param level Output level. 0: low ; 1: high * - * @return ESP_OK : success - * ESP_FAIL : GPIO error + * @return + * - ESP_OK Success + * - GPIO_IS_VALID_GPIO GPIO number error * */ esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level); /** - * @brief GPIO get input level + * @brief GPIO get input level * - * @parameter[in] gpio_num : GPIO number. - * If you want to get level of pin GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param gpio_num GPIO number. If you want to get the logic level of e.g. pin GPIO16, gpio_num should be GPIO_NUM_16 (16); * - * @return 0 : the GPIO input level is 0 - * 1 : the GPIO input level is 1 + * @return + * - 0 the GPIO input level is 0 + * - 1 the GPIO input level is 1 * */ int gpio_get_level(gpio_num_t gpio_num); /** - * @brief GPIO set direction + * @brief GPIO set direction * * Configure GPIO direction,such as output_only,input_only,output_and_input * - * @parameter[in] gpio_num : Configure GPIO pins number,it should be GPIO number. - * If you want to set direction of GPIO16, gpio_num should be GPIO_NUM_16 (16); - * @parameter[in] mode : Configure GPIO direction,such as output_only,input_only,... + * @param gpio_num Configure GPIO pins number, it should be GPIO number. If you want to set direction of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param mode GPIO direction * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG : fail - * ESP_FAIL : GPIO error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG GPIO error * */ esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode); /** - * @brief GPIO set pull + * @brief GPIO set pull * * User this Function,configure GPIO pull mode,such as pull-up,pull-down * - * @parameter[in] gpio_num : Configure GPIO pins number,it should be GPIO number. - * If you want to set pull up or down mode for GPIO16,gpio_num should be GPIO_NUM_16 (16); - * @parameter[in] pull : Configure GPIO pull up/down mode,such as pullup_only,pulldown_only,pullup_and_pulldown,... + * @param gpio_num GPIO number. If you want to set pull up or down mode for e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16); + * @param pull GPIO pull up/down mode. * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG : fail - * ESP_FAIL : GPIO error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG : Parameter error * */ esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull); @@ -340,121 +341,187 @@ esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull); /** * @brief enable GPIO wake-up function. * - * @param gpio_num_t gpio_num : GPIO number. + * @param gpio_num GPIO number. * - * @param gpio_int_type_t intr_type : only GPIO_INTR_LOLEVEL\GPIO_INTR_HILEVEL can be used + * @param intr_type GPIO wake-up type. Only GPIO_INTR_LOW_LEVEL or GPIO_INTR_HIGH_LEVEL can be used. * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type); /** - * @brief disable GPIO wake-up function. + * @brief Disable GPIO wake-up function. * - * @param gpio_num_t gpio_num: GPIO number + * @param gpio_num GPIO number * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t gpio_wakeup_disable(gpio_num_t gpio_num); /** * @brief register GPIO interrupt handler, the handler is an ISR. * The handler will be attached to the same CPU core that this function is running on. + * @note * Users should know that which CPU is running and then pick a INUM that is not used by system. * We can find the information of INUM and interrupt level in soc.h. - * TODO: to move INUM options to menu_config - * @parameter uint32_t gpio_intr_num : GPIO interrupt number,check the info in soc.h, and please see the core-isa.h for more details - * @parameter void (* fn)(void* ) : interrupt handler function. - * Note that the handler function MUST be defined with attribution of "IRAM_ATTR". - * @parameter void * arg : parameter for handler function * - * @return ESP_OK : success ; - * ESP_FAIL: gpio error + * @param gpio_intr_num GPIO interrupt number,check the info in soc.h, and please see the core-isa.h for more details + * @param fn Interrupt handler function. + * + * @note + * Note that the handler function MUST be defined with attribution of "IRAM_ATTR". + * + * @param arg Parameter for handler function + * + * @return + * - ESP_OK Success ; + * - ESP_ERR_INVALID_ARG GPIO error */ esp_err_t gpio_isr_register(uint32_t gpio_intr_num, void (*fn)(void*), void * arg); + + +/** + * @brief Enable pull-up on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pullup_en(gpio_num_t gpio_num); + +/** + * @brief Disable pull-up on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pullup_dis(gpio_num_t gpio_num); + +/** + * @brief Enable pull-down on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pulldown_en(gpio_num_t gpio_num); + +/** + * @brief Disable pull-down on GPIO. + * + * @param gpio_num GPIO number + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t gpio_pulldown_dis(gpio_num_t gpio_num); + + /** * *************** ATTENTION ********************/ /** - * - * Each GPIO has its own separate configuration register, so we do not use - * a lock to serialize access to them. This works under the assumption that - * no situation will occur where two tasks try to configure the same GPIO - * pin simultaneously. It is up to the application developer to guarantee this. + *@attention + * Each GPIO has its own separate configuration register, so we do not use + * a lock to serialize access to them. This works under the assumption that + * no situation will occur where two tasks try to configure the same GPIO + * pin simultaneously. It is up to the application developer to guarantee this. */ - -/*----------EXAMPLE TO CONIFGURE GPIO AS OUTPUT ------------ */ -/* gpio_config_t io_conf; +/** + *----------EXAMPLE TO CONIFGURE GPIO AS OUTPUT ------------ * + * @code{c} + * gpio_config_t io_conf; * io_conf.intr_type = GPIO_INTR_DISABLE; //disable interrupt * io_conf.mode = GPIO_MODE_OUTPUT; //set as output mode * io_conf.pin_bit_mask = GPIO_SEL_18 | GPIO_SEL_19; //bit mask of the pins that you want to set,e.g.GPIO18/19 * io_conf.pull_down_en = 0; //disable pull-down mode * io_conf.pull_up_en = 0; //disable pull-up mode * gpio_config(&io_conf); //configure GPIO with the given settings + * @endcode **/ -/*----------EXAMPLE TO CONIFGURE GPIO AS OUTPUT ------------ */ -/* io_conf.intr_type = GPIO_INTR_POSEDGE; //set posedge interrupt + +/** + *----------EXAMPLE TO CONIFGURE GPIO AS OUTPUT ------------ * + * @code{c} + * io_conf.intr_type = GPIO_INTR_POSEDGE; //set posedge interrupt * io_conf.mode = GPIO_MODE_INPUT; //set as input * io_conf.pin_bit_mask = GPIO_SEL_4 | GPIO_SEL_5; //bit mask of the pins that you want to set, e.g.,GPIO4/5 * io_conf.pull_down_en = 0; //disable pull-down mode * io_conf.pull_up_en = 1; //enable pull-up mode * gpio_config(&io_conf); //configure GPIO with the given settings - *----------EXAMPLE TO SET ISR HANDLER ----------------------*/ -/* gpio_isr_register(18,gpio_intr_test,NULL); //hook the isr handler for GPIO interrupt - * //the first parameter is INUM, you can pick one form interrupt level 1/2 which is not used by the system. - * //NOTE1:user should arrange the INUMs that used, better not to use a same INUM for different interrupt. - * //NOTE2:do not pick the INUM that already occupied by the system. - * //NOTE3:refer to soc.h to check which INUMs that can be used. - *-------------EXAMPLE OF HANDLER FUNCTION-------------------*/ -/*#include "esp_attr.h" + * @endcode + */ +/** + *----------EXAMPLE TO SET ISR HANDLER ---------------------- + * @code{c} + * //the first parameter is INUM, you can pick one form interrupt level 1/2 which is not used by the system. + * gpio_isr_register(18,gpio_intr_test,NULL); //hook the isr handler for GPIO interrupt + * @endcode + * @note + * 1. user should arrange the INUMs that used, better not to use a same INUM for different interrupt. + * 2. do not pick the INUM that already occupied by the system. + * 3. refer to soc.h to check which INUMs that can be used. + */ +/** + *-------------EXAMPLE OF HANDLER FUNCTION-------------------* + * @code{c} + * #include "esp_attr.h" * void IRAM_ATTR gpio_intr_test(void* arg) - *{ - * //GPIO intr process - * ets_printf("in gpio_intr\n"); - * uint32_t gpio_num = 0; - * uint32_t gpio_intr_status = READ_PERI_REG(GPIO_STATUS_REG); //read status to get interrupt status for GPIO0-31 - * uint32_t gpio_intr_status_h = READ_PERI_REG(GPIO_STATUS1_REG);//read status1 to get interrupt status for GPIO32-39 - * SET_PERI_REG_MASK(GPIO_STATUS_W1TC_REG, gpio_intr_status); //Clear intr for gpio0-gpio31 - * SET_PERI_REG_MASK(GPIO_STATUS1_W1TC_REG, gpio_intr_status_h); //Clear intr for gpio32-39 - * do { - * if(gpio_num < 32) { - * if(gpio_intr_status & BIT(gpio_num)) { //gpio0-gpio31 - * ets_printf("Intr GPIO%d ,val: %d\n",gpio_num,gpio_get_level(gpio_num)); - * //This is an isr handler, you should post an event to process it in RTOS queue. - * } - * } else { - * if(gpio_intr_status_h & BIT(gpio_num - 32)) { - * ets_printf("Intr GPIO%d, val : %d\n",gpio_num,gpio_get_level(gpio_num)); - * //This is an isr handler, you should post an event to process it in RTOS queue. - * } - * } - * } while(++gpio_num < GPIO_PIN_COUNT); - *} - *----EXAMPLE OF I2C CONFIG AND PICK SIGNAL FOR IO MATRIX---*/ -/* gpio_config_t io_conf; - * io_conf.intr_type = GPIO_INTR_DISABLE; //disable interrupt - * io_conf.mode = GPIO_MODE_INPUT_OUTPUT_OD; //set as output mode - * io_conf.pin_bit_mask = GPIO_SEL_21 | GPIO_SEL_22; //bit mask of the pins that you want to set,e.g.GPIO21/22 - * io_conf.pull_down_en = 0; //disable pull-down mode - * io_conf.pull_up_en = 1; //enable pull-up mode - * gpio_config(&io_conf); //configure GPIO with the given settings - * gpio_matrix_out(21, EXT_I2C_SCL_O_IDX, 0, 0); //set output signal for io_matrix - * gpio_matrix_out(22, EXT_I2C_SDA_O_IDX, 0, 0); //set output signal for io_matrix - * gpio_matrix_in( 22, EXT_I2C_SDA_I_IDX, 0); //set input signal for io_matrix + * { + * //GPIO intr process + * ets_printf("in gpio_intr\n"); + * uint32_t gpio_num = 0; + * uint32_t gpio_intr_status = READ_PERI_REG(GPIO_STATUS_REG); //read status to get interrupt status for GPIO0-31 + * uint32_t gpio_intr_status_h = READ_PERI_REG(GPIO_STATUS1_REG);//read status1 to get interrupt status for GPIO32-39 + * SET_PERI_REG_MASK(GPIO_STATUS_W1TC_REG, gpio_intr_status); //Clear intr for gpio0-gpio31 + * SET_PERI_REG_MASK(GPIO_STATUS1_W1TC_REG, gpio_intr_status_h); //Clear intr for gpio32-39 + * do { + * if(gpio_num < 32) { + * if(gpio_intr_status & BIT(gpio_num)) { //gpio0-gpio31 + * ets_printf("Intr GPIO%d ,val: %d\n",gpio_num,gpio_get_level(gpio_num)); + * //This is an isr handler, you should post an event to process it in RTOS queue. + * } + * } else { + * if(gpio_intr_status_h & BIT(gpio_num - 32)) { + * ets_printf("Intr GPIO%d, val : %d\n",gpio_num,gpio_get_level(gpio_num)); + * //This is an isr handler, you should post an event to process it in RTOS queue. + * } + * } + * } while(++gpio_num < GPIO_PIN_COUNT); + * } + * @endcode + */ + +/** + *----EXAMPLE OF I2C CONFIG AND PICK SIGNAL FOR IO MATRIX---* + * @code{c} + * gpio_config_t io_conf; + * io_conf.intr_type = GPIO_INTR_DISABLE; //disable interrupt + * io_conf.mode = GPIO_MODE_INPUT_OUTPUT_OD; //set as output mode + * io_conf.pin_bit_mask = GPIO_SEL_21 | GPIO_SEL_22; //bit mask of the pins that you want to set,e.g.GPIO21/22 + * io_conf.pull_down_en = 0; //disable pull-down mode + * io_conf.pull_up_en = 1; //enable pull-up mode + * gpio_config(&io_conf); //configure GPIO with the given settings + * gpio_matrix_out(21, EXT_I2C_SCL_O_IDX, 0, 0); //set output signal for io_matrix + * gpio_matrix_out(22, EXT_I2C_SDA_O_IDX, 0, 0); //set output signal for io_matrix + * gpio_matrix_in( 22, EXT_I2C_SDA_I_IDX, 0); //set input signal for io_matrix + * @endcode * */ -/** - * @} - */ - -/** - * @} - */ - #ifdef __cplusplus } #endif diff --git a/components/driver/include/driver/ledc.h b/components/driver/include/driver/ledc.h index 79a6c7f9f..e07787b2b 100644 --- a/components/driver/include/driver/ledc.h +++ b/components/driver/include/driver/ledc.h @@ -30,68 +30,74 @@ extern "C" { #define LEDC_REF_CLK_HZ (1*1000000) typedef enum { - LEDC_HIGH_SPEED_MODE = 0, /*LEDC high speed speed_mode */ + LEDC_HIGH_SPEED_MODE = 0, /*!< LEDC high speed speed_mode */ //in this version, we only support high speed speed_mode. We will access low speed speed_mode later - //LEDC_LOW_SPEED_MODE, /*LEDC low speed speed_mode */ - LEDC_SPEED_MODE_MAX, + //LEDC_LOW_SPEED_MODE, /*!< LEDC low speed speed_mode */ + LEDC_SPEED_MODE_MAX, /*!< LEDC speed limit */ } ledc_mode_t; typedef enum { - LEDC_INTR_DISABLE = 0, /*Disable LEDC interrupt */ - LEDC_INTR_FADE_END, /*Enable LEDC interrupt */ + LEDC_INTR_DISABLE = 0, /*!< Disable LEDC interrupt */ + LEDC_INTR_FADE_END, /*!< Enable LEDC interrupt */ } ledc_intr_type_t; typedef enum { - LEDC_DUTY_DIR_DECREASE = 0, /*LEDC duty decrease direction */ - LEDC_DUTY_DIR_INCREASE = 1, /*LEDC duty increase direction */ + LEDC_DUTY_DIR_DECREASE = 0, /*!< LEDC duty decrease direction */ + LEDC_DUTY_DIR_INCREASE = 1, /*!< LEDC duty increase direction */ } ledc_duty_direction_t; typedef enum { - LEDC_REF_TICK = 0, /*LEDC timer clock divided from reference tick(1Mhz) */ - LEDC_APB_CLK, /*LEDC timer clock divided from APB clock(80Mhz)*/ + LEDC_REF_TICK = 0, /*!< LEDC timer clock divided from reference tick(1Mhz) */ + LEDC_APB_CLK, /*!< LEDC timer clock divided from APB clock(80Mhz)*/ } ledc_clk_src_t; typedef enum { - LEDC_TIMER_0 = 0, /*LEDC source timer TIMER0 */ - LEDC_TIMER_1, /*LEDC source timer TIMER1 */ - LEDC_TIMER_2, /*LEDC source timer TIMER2 */ - LEDC_TIMER_3, /*LEDC source timer TIMER3 */ + LEDC_TIMER_0 = 0, /*!< LEDC source timer TIMER0 */ + LEDC_TIMER_1, /*!< LEDC source timer TIMER1 */ + LEDC_TIMER_2, /*!< LEDC source timer TIMER2 */ + LEDC_TIMER_3, /*!< LEDC source timer TIMER3 */ } ledc_timer_t; typedef enum { - LEDC_CHANNEL_0 = 0, /*LEDC channel 0 */ - LEDC_CHANNEL_1, /*LEDC channel 1 */ - LEDC_CHANNEL_2, /*LEDC channel 2 */ - LEDC_CHANNEL_3, /*LEDC channel 3 */ - LEDC_CHANNEL_4, /*LEDC channel 4 */ - LEDC_CHANNEL_5, /*LEDC channel 5 */ - LEDC_CHANNEL_6, /*LEDC channel 6 */ - LEDC_CHANNEL_7, /*LEDC channel 7 */ + LEDC_CHANNEL_0 = 0, /*!< LEDC channel 0 */ + LEDC_CHANNEL_1, /*!< LEDC channel 1 */ + LEDC_CHANNEL_2, /*!< LEDC channel 2 */ + LEDC_CHANNEL_3, /*!< LEDC channel 3 */ + LEDC_CHANNEL_4, /*!< LEDC channel 4 */ + LEDC_CHANNEL_5, /*!< LEDC channel 5 */ + LEDC_CHANNEL_6, /*!< LEDC channel 6 */ + LEDC_CHANNEL_7, /*!< LEDC channel 7 */ } ledc_channel_t; typedef enum { - LEDC_TIMER_10_BIT = 10, /*LEDC PWM depth 10Bit */ - LEDC_TIMER_11_BIT = 11, /*LEDC PWM depth 11Bit */ - LEDC_TIMER_12_BIT = 12, /*LEDC PWM depth 12Bit */ - LEDC_TIMER_13_BIT = 13, /*LEDC PWM depth 13Bit */ - LEDC_TIMER_14_BIT = 14, /*LEDC PWM depth 14Bit */ - LEDC_TIMER_15_BIT = 15, /*LEDC PWM depth 15Bit */ + LEDC_TIMER_10_BIT = 10, /*!< LEDC PWM depth 10Bit */ + LEDC_TIMER_11_BIT = 11, /*!< LEDC PWM depth 11Bit */ + LEDC_TIMER_12_BIT = 12, /*!< LEDC PWM depth 12Bit */ + LEDC_TIMER_13_BIT = 13, /*!< LEDC PWM depth 13Bit */ + LEDC_TIMER_14_BIT = 14, /*!< LEDC PWM depth 14Bit */ + LEDC_TIMER_15_BIT = 15, /*!< LEDC PWM depth 15Bit */ } ledc_timer_bit_t; +/** + * @brief Configuration parameters of LEDC channel for ledc_channel_config function + */ typedef struct { - int gpio_num; /*the LEDC output gpio_num, if you want to use gpio16, gpio_num = 16*/ - ledc_mode_t speed_mode; /*LEDC speed speed_mode, high-speed mode or low-speed mode*/ - ledc_channel_t channel; /*LEDC channel(0 - 7)*/ - ledc_intr_type_t intr_type; /*configure interrupt, Fade interrupt enable or Fade interrupt disable*/ - ledc_timer_t timer_sel; /*Select the timer source of channel (0 - 3)*/ - uint32_t duty; /*LEDC channel duty, the duty range is [0, (2**bit_num) - 1], */ + int gpio_num; /*!< the LEDC output gpio_num, if you want to use gpio16, gpio_num = 16*/ + ledc_mode_t speed_mode; /*!< LEDC speed speed_mode, high-speed mode or low-speed mode*/ + ledc_channel_t channel; /*!< LEDC channel(0 - 7)*/ + ledc_intr_type_t intr_type; /*!< configure interrupt, Fade interrupt enable or Fade interrupt disable*/ + ledc_timer_t timer_sel; /*!< Select the timer source of channel (0 - 3)*/ + uint32_t duty; /*!< LEDC channel duty, the duty range is [0, (2**bit_num) - 1], */ } ledc_channel_config_t; +/** + * @brief Configuration parameters of LEDC Timer timer for ledc_timer_config function + */ typedef struct { - ledc_mode_t speed_mode; /*LEDC speed speed_mode, high-speed mode or low-speed mode*/ - ledc_timer_bit_t bit_num; /*LEDC channel duty depth*/ - ledc_timer_t timer_num; /*The timer source of channel (0 - 3)*/ - uint32_t freq_hz; /*LEDC timer frequency(Hz)*/ + ledc_mode_t speed_mode; /*!< LEDC speed speed_mode, high-speed mode or low-speed mode*/ + ledc_timer_bit_t bit_num; /*!< LEDC channel duty depth*/ + ledc_timer_t timer_num; /*!< The timer source of channel (0 - 3)*/ + uint32_t freq_hz; /*!< LEDC timer frequency(Hz)*/ } ledc_timer_config_t; @@ -100,15 +106,10 @@ typedef struct { * * User this Function, configure LEDC channel with the given channel/output gpio_num/interrupt/source timer/frequency(Hz)/LEDC depth * - * @param[in] ledc_channel_config_t - * ledc_channel_config_t.speed_mode : LEDC speed speed_mode - * ledc_channel_config_t.gpio_num : LEDC output gpio_num, if you want to use gpio16, ledc_channel_config_t.gpio_num = 16 - * ledc_channel_config_t.channel : LEDC channel(0 - 7) - * ledc_channel_config_t.intr_type : configure interrupt, Fade interrupt enable or Fade interrupt disable - * ledc_channel_config_t.timer_sel : Select the timer source of channel (0 - 3), high speed channel must bind with high speed timer. - * ledc_channel_config_t.duty : LEDC channel duty, the duty range is [0, (2**timer_bit_num) - 1], - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @param ledc_conf Pointer of LEDC channel configure struct + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf); @@ -118,14 +119,13 @@ esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf); * * User this Function, configure LEDC timer with the given source timer/frequency(Hz)/bit_num * - * @param[in] ledc_timer_config_t - * ledc_timer_config_t.speed_mode : LEDC speed speed_mode - * ledc_timer_config_t.timer_num : Select the timer source of channel (0 - 3) - * ledc_timer_config_t.freq_hz : LEDC channel frequency(Hz), - * ledc_timer_config_t.bit_num : LEDC channel duty depth - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error - * ESP_FAIL: Can not find a proper pre-divider number base on the given frequency and the current bit_num. + * @param timer_conf Pointer of LEDC timer configure struct + * + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Can not find a proper pre-divider number base on the given frequency and the current bit_num. * */ esp_err_t ledc_timer_config(ledc_timer_config_t* timer_conf); @@ -136,12 +136,13 @@ esp_err_t ledc_timer_config(ledc_timer_config_t* timer_conf); * Call this function to activate the LEDC updated parameters. * After ledc_set_duty, ledc_set_fade, we need to call this function to update the settings. * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel(0-7), select from ledc_channel_t + * @param channel LEDC channel(0-7), select from ledc_channel_t * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error * */ esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel); @@ -151,12 +152,15 @@ esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel); * * Disable LEDC output, and set idle level * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel(0-7), select from ledc_channel_t + * @param channel LEDC channel(0-7), select from ledc_channel_t * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @param idle_level Set output idle level after LEDC stops. + * + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t ledc_stop(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t idle_level); @@ -165,27 +169,29 @@ esp_err_t ledc_stop(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t idl * * Set LEDC frequency(Hz) * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_num : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_num LEDC timer index(0-3), select from ledc_timer_t * - * @param[in] freq_hz : set the LEDC frequency + * @param freq_hz Set the LEDC frequency * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error - * ESP_FAIL: Can not find a proper pre-divider number base on the given frequency and the current bit_num. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_FAIL Can not find a proper pre-divider number base on the given frequency and the current bit_num. */ esp_err_t ledc_set_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num, uint32_t freq_hz); /** * @brief LEDC get channel frequency(Hz) * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_num : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_num LEDC timer index(0-3), select from ledc_timer_t * - * @return 0 : error - * others : current LEDC frequency + * @return + * - 0 error + * - Others Current LEDC frequency * */ uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num); @@ -195,27 +201,29 @@ uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num); * * Set LEDC duty, After the function calls the ledc_update_duty function, the function can take effect. * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel(0-7), select from ledc_channel_t + * @param channel LEDC channel(0-7), select from ledc_channel_t * - * @param[in] duty : set the LEDC duty, the duty range is [0, (2**bit_num) - 1] + * @param duty Set the LEDC duty, the duty range is [0, (2**bit_num) - 1] * - * @return ESP_OK: success - * ESP_ERR_INVALID_ARG: parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty); /** * @brief LEDC get duty * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel(0-7), select from ledc_channel_t + * @param channel LEDC channel(0-7), select from ledc_channel_t * * - * @return -1: parameter error - * other value: current LEDC duty + * @return + * - (-1) parameter error + * - Others Current LEDC duty * */ int ledc_get_duty(ledc_mode_t speed_mode, ledc_channel_t channel); @@ -225,22 +233,23 @@ int ledc_get_duty(ledc_mode_t speed_mode, ledc_channel_t channel); * * Set LEDC gradient, After the function calls the ledc_update_duty function, the function can take effect. * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel(0-7), select from ledc_channel_t + * @param channel LEDC channel(0-7), select from ledc_channel_t * - * @param[in] duty : set the start of the gradient duty, the duty range is [0, (2**bit_num) - 1] + * @param duty Set the start of the gradient duty, the duty range is [0, (2**bit_num) - 1] * - * @param[in] gradule_direction : set the direction of the gradient + * @param gradule_direction Set the direction of the gradient * - * @param[in] step_num : set the number of the gradient + * @param step_num Set the number of the gradient * - * @param[in] duty_cyle_num : set how many LEDC tick each time the gradient lasts + * @param duty_cyle_num Set how many LEDC tick each time the gradient lasts * - * @param[in] duty_scale : set gradient change amplitude + * @param duty_scale Set gradient change amplitude * - * @return ESP_OK : success - * ESP_ERR_INVALID_ARG : parameter error + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t ledc_set_fade(ledc_mode_t speed_mode, uint32_t channel, uint32_t duty, ledc_duty_direction_t gradule_direction, uint32_t step_num, uint32_t duty_cyle_num, uint32_t duty_scale); @@ -248,34 +257,37 @@ esp_err_t ledc_set_fade(ledc_mode_t speed_mode, uint32_t channel, uint32_t duty, /** * @brief register LEDC interrupt handler, the handler is an ISR. * The handler will be attached to the same CPU core that this function is running on. - * Users should know that which CPU is running and then pick a INUM that is not used by system. - * We can find the information of INUM and interrupt level in soc.h. - * TODO: to move INUM options to menu_config - * @param[in] uint32_t ledc_intr_num : LEDC interrupt number, check the info in soc.h, and please see the core-isa.h for more details - * @param[in] void (* fn)(void* ) : interrupt handler function. - * Note that the handler function MUST be defined with attribution of "IRAM_ATTR". - * @param[in] void * arg : parameter for handler function + * @note + * Users should know that which CPU is running and then pick a INUM that is not used by system. + * We can find the information of INUM and interrupt level in soc.h. + * @param ledc_intr_num LEDC interrupt number, check the info in soc.h, and please see the core-isa.h for more details + * @param fn Interrupt handler function. + * @note + * Note that the handler function MUST be defined with attribution of "IRAM_ATTR". + * @param arg Parameter for handler function * - * @return ESP_OK : success ; - * ESP_ERR_INVALID_ARG : function ptr error. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG Function pointer error. */ esp_err_t ledc_isr_register(uint32_t ledc_intr_num, void (*fn)(void*), void * arg); /** * @brief configure LEDC settings * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_sel : timer index(0-3), there are 4 timers in LEDC module + * @param timer_sel Timer index(0-3), there are 4 timers in LEDC module * - * @param[in] div_num : timer clock divide number, the timer clock is divided from the selected clock source + * @param div_num Timer clock divide number, the timer clock is divided from the selected clock source * - * @param[in] bit_num : the count number of one period, counter range is 0 ~ ((2 ** bit_num) - 1) + * @param bit_num The count number of one period, counter range is 0 ~ ((2 ** bit_num) - 1) * - * @param[in] clk_src : select LEDC source clock. + * @param clk_src Select LEDC source clock. * - * @return -1: parameter error - * other value: current LEDC duty + * @return + * - (-1) Parameter error + * - Other Current LEDC duty * */ esp_err_t ledc_timer_set(ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t div_num, uint32_t bit_num, ledc_clk_src_t clk_src); @@ -283,13 +295,14 @@ esp_err_t ledc_timer_set(ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_ /** * @brief reset LEDC timer * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_sel : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_sel LEDC timer index(0-3), select from ledc_timer_t * * - * @return ESP_ERR_INVALID_ARG: parameter error - * ESP_OK: success + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success * */ esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, uint32_t timer_sel); @@ -297,13 +310,14 @@ esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, uint32_t timer_sel); /** * @brief pause LEDC timer counter * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_sel : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_sel LEDC timer index(0-3), select from ledc_timer_t * * - * @return ESP_ERR_INVALID_ARG: parameter error - * ESP_OK: success + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success * */ esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, uint32_t timer_sel); @@ -311,13 +325,14 @@ esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, uint32_t timer_sel); /** * @brief pause LEDC timer resume * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] timer_sel : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_sel LEDC timer index(0-3), select from ledc_timer_t * * - * @return ESP_ERR_INVALID_ARG: parameter error - * ESP_OK: success + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success * */ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, uint32_t timer_sel); @@ -325,15 +340,16 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, uint32_t timer_sel); /** * @brief bind LEDC channel with the selected timer * - * @param[in] speed_mode : select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version + * @param speed_mode Select the LEDC speed_mode, high-speed mode and low-speed mode, now we only support high-speed mode. We will access low-speed mode in next version * - * @param[in] channel : LEDC channel index(0-7), select from ledc_channel_t + * @param channel LEDC channel index(0-7), select from ledc_channel_t * - * @param[in] timer_idx : LEDC timer index(0-3), select from ledc_timer_t + * @param timer_idx LEDC timer index(0-3), select from ledc_timer_t * * - * @return ESP_ERR_INVALID_ARG: parameter error - * ESP_OK: success + * @return + * - ESP_ERR_INVALID_ARG Parameter error + * - ESP_OK Success * */ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, uint32_t channel, uint32_t timer_idx); @@ -342,44 +358,56 @@ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, uint32_t channel, uint * * * ----------------EXAMPLE OF LEDC SETTING --------------------- - * //1. enable LEDC - * periph_module_enable(PERIPH_LEDC_MODULE); //enable LEDC module, or you can not set any register of it. + * @code{c} + * //1. enable LEDC + * //enable LEDC module, or you can not set any register of it. + * periph_module_enable(PERIPH_LEDC_MODULE); + * @endcode * - * //2. set LEDC timer - * ledc_timer_config_t timer_conf = { - * .bit_num = LEDC_TIMER_12_BIT, //set timer counter bit number - * .freq_hz = 1000, //set frequency of pwm, here, 1000Hz - * .speed_mode = LEDC_HIGH_SPEED_MODE //timer mode, - * .timer_num = LEDC_TIMER_0, //timer number - * }; - * ledc_timer_config(&timer_conf); //setup timer. + * @code{c} + * //2. set LEDC timer + * ledc_timer_config_t timer_conf = { + * .bit_num = LEDC_TIMER_12_BIT, //set timer counter bit number + * .freq_hz = 1000, //set frequency of pwm, here, 1000Hz + * .speed_mode = LEDC_HIGH_SPEED_MODE, //timer mode, + * .timer_num = LEDC_TIMER_0, //timer number + * }; + * ledc_timer_config(&timer_conf); //setup timer. + * @endcode * - * //3. set LEDC channel - * ledc_channel_config_t ledc_conf = { - * .channel = LEDC_CHANNEL_0; //set LEDC channel 0 - * .duty = 1000; //set the duty for initialization.(duty range is 0 ~ ((2**bit_num)-1) - * .gpio_num = 16; //GPIO number - * .intr_type = LEDC_INTR_FADE_END; //GPIO INTR TYPE, as an example, we enable fade_end interrupt here. - * .speed_mode = LEDC_HIGH_SPEED_MODE; //set LEDC mode, from ledc_mode_t - * .timer_sel = LEDC_TIMER_0; //set LEDC timer source, if different channel use one timer, the frequency and bit_num of these channels should be the same - * } - * ledc_channel_config(&ledc_conf); //setup the configuration + * @code{c} + * //3. set LEDC channel + * ledc_channel_config_t ledc_conf = { + * .channel = LEDC_CHANNEL_0; //set LEDC channel 0 + * .duty = 1000; //set the duty for initialization.(duty range is 0 ~ ((2**bit_num)-1) + * .gpio_num = 16; //GPIO number + * .intr_type = LEDC_INTR_FADE_END; //GPIO INTR TYPE, as an example, we enable fade_end interrupt here. + * .speed_mode = LEDC_HIGH_SPEED_MODE; //set LEDC mode, from ledc_mode_t + * .timer_sel = LEDC_TIMER_0; //set LEDC timer source, if different channel use one timer, the frequency and bit_num of these channels should be the same + * } + * ledc_channel_config(&ledc_conf); //setup the configuration * * ----------------EXAMPLE OF SETTING DUTY --- ----------------- - * uint32_t ledc_channel = LEDC_CHANNEL_0; //LEDC channel(0-73) - * uint32_t duty = 2000; //duty range is 0 ~ ((2**bit_num)-1) - * LEDC_set_duty(LEDC_HIGH_SPEED_MODE, ledc_channel, duty); //set speed mode, channel, and duty. - * ledc_update_duty(LEDC_HIGH_SPEED_MODE, ledc_channel); //after set duty, we need to call ledc_update_duty to update the settings. - * + * @code{c} + * uint32_t ledc_channel = LEDC_CHANNEL_0; //LEDC channel(0-73) + * uint32_t duty = 2000; //duty range is 0 ~ ((2**bit_num)-1) + * LEDC_set_duty(LEDC_HIGH_SPEED_MODE, ledc_channel, duty); //set speed mode, channel, and duty. + * ledc_update_duty(LEDC_HIGH_SPEED_MODE, ledc_channel); //after set duty, we need to call ledc_update_duty to update the settings. + * @endcode * * ----------------EXAMPLE OF LEDC INTERRUPT ------------------ - * //we have fade_end interrupt and counter overflow interrupt. we just give an example of fade_end interrupt here. - * ledc_isr_register(18, ledc_isr_handler, NULL); //hook the isr handler for LEDC interrupt - * //the first parameter is INUM, you can pick one form interrupt level 1/2 which is not used by the system. - * //NOTE1:user should arrange the INUMs that used, better not to use a same INUM for different interrupt source. - * //NOTE2:do not pick the INUM that already occupied by the system. - * //NOTE3:refer to soc.h to check which INUMs that can be used. + * @code{c} + * //we have fade_end interrupt and counter overflow interrupt. we just give an example of fade_end interrupt here. + * ledc_isr_register(18, ledc_isr_handler, NULL); //hook the isr handler for LEDC interrupt + * @endcode + * @note + * 1. the first parameter is INUM, you can pick one form interrupt level 1/2 which is not used by the system. + * 2. user should arrange the INUMs that used, better not to use a same INUM for different interrupt source. + * 3. do not pick the INUM that already occupied by the system. + * 4. refer to soc.h to check which INUMs that can be used. + * * ----------------EXAMPLE OF INTERRUPT HANDLER --------------- + * @code{c} * #include "esp_attr.h" * void IRAM_ATTR ledc_isr_handler(void* arg) //we should add 'IRAM_ATTR' attribution when we declare the isr function * { @@ -391,7 +419,7 @@ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, uint32_t channel, uint * * LEDC.int_clr.val = intr_st; //clear LEDC interrupt status. * } - * + * @endcode * *--------------------------END OF EXAMPLE -------------------------- */ diff --git a/components/driver/include/driver/periph_ctrl.h b/components/driver/include/driver/periph_ctrl.h index 3faa347b5..d7a98284b 100644 --- a/components/driver/include/driver/periph_ctrl.h +++ b/components/driver/include/driver/periph_ctrl.h @@ -39,6 +39,7 @@ typedef enum { PERIPH_PWM3_MODULE, PERIPH_UHCI0_MODULE, PERIPH_UHCI1_MODULE, + PERIPH_RMT_MODULE, } periph_module_t; /** diff --git a/components/driver/include/driver/rmt.h b/components/driver/include/driver/rmt.h new file mode 100644 index 000000000..50a5c743d --- /dev/null +++ b/components/driver/include/driver/rmt.h @@ -0,0 +1,794 @@ +// Copyright 2015-2016 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 _DRIVER_RMT_CTRL_H_ +#define _DRIVER_RMT_CTRL_H_ +#include "esp_err.h" +#include "soc/rmt_reg.h" +#include "soc/dport_reg.h" +#include "soc/rmt_struct.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/ringbuf.h" +#include "driver/gpio.h" +#include "driver/periph_ctrl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define RMT_MEM_BLOCK_BYTE_NUM (256) +#define RMT_MEM_ITEM_NUM (RMT_MEM_BLOCK_BYTE_NUM/4) + +typedef enum { + RMT_CHANNEL_0=0, /*!< RMT Channel0 */ + RMT_CHANNEL_1, /*!< RMT Channel1 */ + RMT_CHANNEL_2, /*!< RMT Channel2 */ + RMT_CHANNEL_3, /*!< RMT Channel3 */ + RMT_CHANNEL_4, /*!< RMT Channel4 */ + RMT_CHANNEL_5, /*!< RMT Channel5 */ + RMT_CHANNEL_6, /*!< RMT Channel6 */ + RMT_CHANNEL_7, /*!< RMT Channel7 */ + RMT_CHANNEL_MAX +} rmt_channel_t; + +typedef enum { + RMT_MEM_OWNER_TX = 0, /*!< RMT RX mode, RMT transmitter owns the memory block*/ + RMT_MEM_OWNER_RX = 1, /*!< RMT RX mode, RMT receiver owns the memory block*/ + RMT_MEM_OWNER_MAX, +}rmt_mem_owner_t; + +typedef enum { + RMT_BASECLK_REF = 0, /*!< RMT source clock system reference tick, 1MHz by default(Not supported in this version) */ + RMT_BASECLK_APB, /*!< RMT source clock is APB CLK, 80Mhz by default */ + RMT_BASECLK_MAX, +} rmt_source_clk_t; + +typedef enum { + RMT_DATA_MODE_FIFO = 0, /* + +#define UART_FIFO_LEN (128) /*!< Length of the hardware FIFO buffers */ +#define UART_INTR_MASK 0x1ff /*!< mask of all UART interrupts */ +#define UART_LINE_INV_MASK (0x3f << 19) /*!< TBD */ +#define UART_BITRATE_MAX 5000000 /*!< Max bit rate supported by UART */ +#define UART_PIN_NO_CHANGE (-1) /*!< Constant for uart_set_pin function which indicates that UART pin should not be changed */ + +#define UART_INVERSE_DISABLE (0x0) /*!< Disable UART signal inverse*/ +#define UART_INVERSE_RXD (UART_RXD_INV_M) /*!< UART RXD input inverse*/ +#define UART_INVERSE_CTS (UART_CTS_INV_M) /*!< UART CTS input inverse*/ +#define UART_INVERSE_TXD (UART_TXD_INV_M) /*!< UART TXD output inverse*/ +#define UART_INVERSE_RTS (UART_RTS_INV_M) /*!< UART RTS output inverse*/ + +/** + * @brief UART word length constants + */ +typedef enum { + UART_DATA_5_BITS = 0x0, /*!< word length: 5bits*/ + UART_DATA_6_BITS = 0x1, /*!< word length: 6bits*/ + UART_DATA_7_BITS = 0x2, /*!< word length: 7bits*/ + UART_DATA_8_BITS = 0x3, /*!< word length: 8bits*/ + UART_DATA_BITS_MAX = 0X4, +} uart_word_length_t; + +/** + * @brief UART stop bits number + */ +typedef enum { + UART_STOP_BITS_1 = 0x1, /*!< stop bit: 1bit*/ + UART_STOP_BITS_1_5 = 0x2, /*!< stop bit: 1.5bits*/ + UART_STOP_BITS_2 = 0x3, /*!< stop bit: 2bits*/ + UART_STOP_BITS_MAX = 0x4, +} uart_stop_bits_t; + +/** + * @brief UART peripheral number + */ +typedef enum { + UART_NUM_0 = 0x0, /*!< UART base address 0x3ff40000*/ + UART_NUM_1 = 0x1, /*!< UART base address 0x3ff50000*/ + UART_NUM_2 = 0x2, /*!< UART base address 0x3ff6E000*/ + UART_NUM_MAX, +} uart_port_t; + +/** + * @brief UART parity constants + */ +typedef enum { + UART_PARITY_DISABLE = 0x0, /*!< Disable UART parity*/ + UART_PARITY_EVEN = 0x2, /*!< Enable UART even parity*/ + UART_PARITY_ODD = 0x3 /*!< Enable UART odd parity*/ +} uart_parity_t; + +/** + * @brief UART hardware flow control modes + */ +typedef enum { + UART_HW_FLOWCTRL_DISABLE = 0x0, /*!< disable hardware flow control*/ + UART_HW_FLOWCTRL_RTS = 0x1, /*!< enable RX hardware flow control (rts)*/ + UART_HW_FLOWCTRL_CTS = 0x2, /*!< enable TX hardware flow control (cts)*/ + UART_HW_FLOWCTRL_CTS_RTS = 0x3, /*!< enable hardware flow control*/ + UART_HW_FLOWCTRL_MAX = 0x4, +} uart_hw_flowcontrol_t; + +/** + * @brief UART configuration parameters for uart_param_config function + */ +typedef struct { + int baud_rate; /*!< UART baudrate*/ + uart_word_length_t data_bits; /*!< UART byte size*/ + uart_parity_t parity; /*!< UART parity mode*/ + uart_stop_bits_t stop_bits; /*!< UART stop bits*/ + uart_hw_flowcontrol_t flow_ctrl; /*!< UART HW flow control mode(cts/rts)*/ + uint8_t rx_flow_ctrl_thresh ; /*!< UART HW RTS threshold*/ +} uart_config_t; + +/** + * @brief UART interrupt configuration parameters for uart_intr_config function + */ +typedef struct { + uint32_t intr_enable_mask; /*!< UART interrupt enable mask, choose from UART_XXXX_INT_ENA_M under UART_INT_ENA_REG(i), connect with bit-or operator*/ + uint8_t rx_timeout_thresh; /*!< UART timeout interrupt threshold(unit: time of sending one byte)*/ + uint8_t txfifo_empty_intr_thresh; /*!< UART TX empty interrupt threshold.*/ + uint8_t rxfifo_full_thresh; /*!< UART RX full interrupt threshold.*/ +} uart_intr_config_t; + +/** + * @brief UART event types used in the ringbuffer + */ +typedef enum { + UART_DATA, /*!< UART data event*/ + UART_BREAK, /*!< UART break event*/ + UART_BUFFER_FULL, /*!< UART RX buffer full event*/ + UART_FIFO_OVF, /*!< UART FIFO overflow event*/ + UART_FRAME_ERR, /*!< UART RX frame error event*/ + UART_PARITY_ERR, /*!< UART RX parity event*/ + UART_DATA_BREAK, /*!< UART TX data and break event*/ + UART_EVENT_MAX, /*!< UART event max index*/ +} uart_event_type_t; + +/** + * @brief Event structure used in UART event queue + */ +typedef struct { + uart_event_type_t type; /*!< UART event type */ + size_t size; /*!< UART data size for UART_DATA event*/ +} uart_event_t; + +/** + * @brief Set UART data bits. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param data_bit UART data bits + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit); + +/** + * @brief Get UART data bits. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param data_bit Pointer to accept value of UART data bits. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*data_bit) + */ +esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit); + +/** + * @brief Set UART stop bits. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param bit_num UART stop bits + * + * @return + * - ESP_OK Success + * - ESP_FAIL Fail + */ +esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t bit_num); + +/** + * @brief Set UART stop bits. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param stop_bit Pointer to accept value of UART stop bits. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*stop_bit) + */ +esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bit); + +/** + * @brief Set UART parity. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param parity_mode the enum of uart parity configuration + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success + */ +esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode); + +/** + * @brief Get UART parity mode. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param parity_mode Pointer to accept value of UART parity mode. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*parity_mode) + * + */ +esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t* parity_mode); + +/** + * @brief Set UART baud rate. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param baud_rate UART baud-rate. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success + */ +esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baud_rate); + +/** + * @brief Get UART bit-rate. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param baudrate Pointer to accept value of UART baud rate + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*baudrate) + * + */ +esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t* baudrate); + +/** + * @brief Set UART line inverse mode + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param inverse_mask Choose the wires that need to be inversed. + * Inverse_mask should be chosen from UART_INVERSE_RXD/UART_INVERSE_TXD/UART_INVERSE_RTS/UART_INVERSE_CTS, combine with OR operation. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_line_inverse(uart_port_t uart_num, uint32_t inverse_mask); + +/** + * @brief Set hardware flow control. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param flow_ctrl Hardware flow control mode + * @param rx_thresh Threshold of Hardware RX flow control(0 ~ UART_FIFO_LEN). + * Only when UART_HW_FLOWCTRL_RTS is set, will the rx_thresh value be set. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh); + +/** + * @brief Get hardware flow control mode + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param flow_ctrl Option for different flow control mode. + * + * @return + * - ESP_FAIL Parameter error + * - ESP_OK Success, result will be put in (*flow_ctrl) + */ +esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t* flow_ctrl); + +/** + * @brief Clear UART interrupt status + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param clr_mask Bit mask of the status that to be cleared. + * enable_mask should be chosen from the fields of register UART_INT_CLR_REG. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_clear_intr_status(uart_port_t uart_num, uint32_t clr_mask); + +/** + * @brief Set UART interrupt enable + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param enable_mask Bit mask of the enable bits. + * enable_mask should be chosen from the fields of register UART_INT_ENA_REG. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask); + +/** + * @brief Clear UART interrupt enable bits + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param disable_mask Bit mask of the disable bits. + * disable_mask should be chosen from the fields of register UART_INT_ENA_REG. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask); + + +/** + * @brief Enable UART RX interrupt(RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_rx_intr(uart_port_t uart_num); + +/** + * @brief Disable UART RX interrupt(RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_rx_intr(uart_port_t uart_num); + +/** + * @brief Disable UART TX interrupt(RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_disable_tx_intr(uart_port_t uart_num); + +/** + * @brief Enable UART TX interrupt(RX_FULL & RX_TIMEOUT INTERRUPT) + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param enable 1: enable; 0: disable + * @param thresh Threshold of TX interrupt, 0 ~ UART_FIFO_LEN + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh); + +/** + * @brief register UART interrupt handler(ISR). + * + * @note UART ISR handler will be attached to the same CPU core that this function is running on. + * Users should know that which CPU is running and then pick a INUM that is not used by system. + * We can find the information of INUM and interrupt level in soc.h. + * + * @attention The ISR handler function MUST be defined with attribution of "IRAM_ATTR" for now. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param uart_intr_num UART interrupt number,check the info in soc.h, and please refer to core-isa.h for more details + * @param fn Interrupt handler function. + * @param arg parameter for handler function + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_isr_register(uart_port_t uart_num, uint8_t uart_intr_num, void (*fn)(void*), void * arg); + +/** + * @brief Set UART pin number + * + * @note Internal signal can be output to multiple GPIO pads. + * Only one GPIO pad can connect with input signal. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param tx_io_num UART TX pin GPIO number, if set to UART_PIN_NO_CHANGE, use the current pin. + * @param rx_io_num UART RX pin GPIO number, if set to UART_PIN_NO_CHANGE, use the current pin. + * @param rts_io_num UART RTS pin GPIO number, if set to UART_PIN_NO_CHANGE, use the current pin. + * @param cts_io_num UART CTS pin GPIO number, if set to UART_PIN_NO_CHANGE, use the current pin. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num); + +/** + * @brief UART set RTS level (before inverse) + * UART rx hardware flow control should not be set. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param level 1: RTS output low(active); 0: RTS output high(block) + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_rts(uart_port_t uart_num, int level); + +/** + * @brief UART set DTR level (before inverse) + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param level 1: DTR output low; 0: DTR output high + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_set_dtr(uart_port_t uart_num, int level); + +/** +* @brief UART parameter configure + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param uart_config UART parameter settings + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config); + +/** +* @brief UART interrupt configure + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param intr_conf UART interrupt settings + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_conf); + +/** + * @brief Install UART driver. + * + * UART ISR handler will be attached to the same CPU core that this function is running on. + * Users should know that which CPU is running and then pick a INUM that is not used by system. + * We can find the information of INUM and interrupt level in soc.h. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param rx_buffer_size UART RX ring buffer size + * @param tx_buffer_size UART TX ring buffer size. + * If set to zero, driver will not use TX buffer, TX function will block task until all data have been sent out.. + * @param queue_size UART event queue size/depth. + * @param uart_intr_num UART interrupt number,check the info in soc.h, and please refer to core-isa.h for more details + * @param uart_queue UART event queue handle, if set NULL, driver will not use an event queue. + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, int uart_intr_num, void* uart_queue); + +/** + * @brief Uninstall UART driver. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_driver_delete(uart_port_t uart_num); + +/** + * @brief Wait UART TX FIFO empty + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param ticks_to_wait Timeout, count in RTOS ticks + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + * - ESP_ERR_TIMEOUT Timeout + */ +esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait); + +/** + * @brief Send data to the UART port from a given buffer and length. + * + * This function will not wait for the space in TX FIFO, just fill the TX FIFO and return when the FIFO is full. + * @note This function should only be used when UART TX buffer is not enabled. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param buffer data buffer address + * @param len data length to send + * + * @return + * - (-1) Parameter error + * - OTHERS(>=0) The number of data that pushed to the TX FIFO + */ +int uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len); + +/** + * @brief Send data to the UART port from a given buffer and length, + * + * If parameter tx_buffer_size is set to zero: + * This function will not return until all the data have been sent out, or at least pushed into TX FIFO. + * + * Otherwise, if tx_buffer_size > 0, this function will return after copying all the data to tx ringbuffer, + * then, UART ISR will move data from ring buffer to TX FIFO gradually. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param src data buffer address + * @param size data length to send + * + * @return + * - (-1) Parameter error + * - OTHERS(>=0) The number of data that pushed to the TX FIFO + */ +int uart_write_bytes(uart_port_t uart_num, const char* src, size_t size); + +/** + * @brief Send data to the UART port from a given buffer and length, + * + * If parameter tx_buffer_size is set to zero: + * This function will not return until all the data and the break signal have been sent out. + * After all data send out, send a break signal. + * + * Otherwise, if tx_buffer_size > 0, this function will return after copying all the data to tx ringbuffer, + * then, UART ISR will move data from ring buffer to TX FIFO gradually. + * After all data send out, send a break signal. + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param src data buffer address + * @param size data length to send + * @param brk_len break signal length (unit: time of one data bit at current_baudrate) + * + * @return + * - (-1) Parameter error + * - OTHERS(>=0) The number of data that pushed to the TX FIFO + */ + +int uart_write_bytes_with_break(uart_port_t uart_num, const char* src, size_t size, int brk_len); + +/** + * @brief UART read bytes from UART buffer + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * @param buf pointer to the buffer. + * @param length data length + * @param ticks_to_wait sTimeout, count in RTOS ticks + * + * @return + * - (-1) Error + * - Others return a char data from uart fifo. + */ +int uart_read_bytes(uart_port_t uart_num, uint8_t* buf, uint32_t length, TickType_t ticks_to_wait); + +/** + * @brief UART ring buffer flush + * + * @param uart_num UART_NUM_0, UART_NUM_1 or UART_NUM_2 + * + * @return + * - ESP_OK Success + * - ESP_FAIL Parameter error + */ +esp_err_t uart_flush(uart_port_t uart_num); + +/***************************EXAMPLE********************************** + * + * + * ----------------EXAMPLE OF UART SETTING --------------------- + * @code{c} + * //1. Setup UART + * #include "freertos/queue.h" + * #define UART_INTR_NUM 17 //choose one interrupt number from soc.h + * //a. Set UART parameter + * int uart_num = 0; //uart port number + * uart_config_t uart_config = { + * .baud_rate = UART_BITRATE_115200, //baudrate + * .data_bits = UART_DATA_8_BITS, //data bit mode + * .parity = UART_PARITY_DISABLE, //parity mode + * .stop_bits = UART_STOP_BITS_1, //stop bit mode + * .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, //hardware flow control(cts/rts) + * .rx_flow_ctrl_thresh = 120, //flow control threshold + * }; + * uart_param_config(uart_num, &uart_config); + * //b1. Setup UART driver(with UART queue) + * QueueHandle_t uart_queue; + * //parameters here are just an example, tx buffer size is 2048 + * uart_driver_install(uart_num, 1024 * 2, 1024 * 2, 10, UART_INTR_NUM, &uart_queue); + * //b2. Setup UART driver(without UART queue) + * //parameters here are just an example, tx buffer size is 0 + * uart_driver_install(uart_num, 1024 * 2, 0, 10, UART_INTR_NUM, NULL); + *@endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //2. Set UART pin + * //set UART pin, not needed if use default pins. + * uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, 15, 13); + * @endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //3. Read data from UART. + * uint8_t data[128]; + * int length = 0; + * length = uart_read_bytes(uart_num, data, sizeof(data), 100); + * @endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //4. Write data to UART. + * char* test_str = "This is a test string.\n" + * uart_write_bytes(uart_num, (const char*)test_str, strlen(test_str)); + * @endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //5. Write data to UART, end with a break signal. + * uart_write_bytes_with_break(0, "test break\n",strlen("test break\n"), 100); + * @endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //6. an example of echo test with hardware flow control on UART1 + * void uart_loop_back_test() + * { + * int uart_num = 1; + * uart_config_t uart_config = { + * .baud_rate = 115200, + * .data_bits = UART_DATA_8_BITS, + * .parity = UART_PARITY_DISABLE, + * .stop_bits = UART_STOP_BITS_1, + * .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS, + * .rx_flow_ctrl_thresh = 122, + * }; + * //Configure UART1 parameters + * uart_param_config(uart_num, &uart_config); + * //Set UART1 pins(TX: IO16, RX: IO17, RTS: IO18, CTS: IO19) + * uart_set_pin(uart_num, 16, 17, 18, 19); + * //Install UART driver( We don't need an event queue here) + * uart_driver_install(uart_num, 1024 * 2, 1024*4, 10, 17, NULL, RINGBUF_TYPE_BYTEBUF); + * uint8_t data[1000]; + * while(1) { + * //Read data from UART + * int len = uart_read_bytes(uart_num, data, sizeof(data), 10); + * //Write data back to UART + * uart_write_bytes(uart_num, (const char*)data, len); + * } + * } + * @endcode + *-----------------------------------------------------------------------------* + * @code{c} + * //7. An example of using UART event queue on UART0. + * #include "freertos/queue.h" + * //A queue to handle UART event. + * QueueHandle_t uart0_queue; + * static const char *TAG = "uart_example"; + * void uart_task(void *pvParameters) + * { + * int uart_num = (int)pvParameters; + * uart_event_t event; + * size_t size = 1024; + * uint8_t* dtmp = (uint8_t*)malloc(size); + * for(;;) { + * //Waiting for UART event. + * if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) { + * ESP_LOGI(TAG, "uart[%d] event:", uart_num); + * switch(event.type) { + * memset(dtmp, 0, size); + * //Event of UART receving data + * case UART_DATA: + * ESP_LOGI(TAG,"data, len: %d", event.size); + * int len = uart_read_bytes(uart_num, dtmp, event.size, 10); + * ESP_LOGI(TAG, "uart read: %d", len); + uart_write_bytes(uart_num, (const char*)dtmp, len); + * break; + * //Event of HW FIFO overflow detected + * case UART_FIFO_OVF: + * ESP_LOGI(TAG, "hw fifo overflow\n"); + * break; + * //Event of UART ring buffer full + * case UART_BUFFER_FULL: + * ESP_LOGI(TAG, "ring buffer full\n"); + * break; + * //Event of UART RX break detected + * case UART_BREAK: + * ESP_LOGI(TAG, "uart rx break\n"); + * break; + * //Event of UART parity check error + * case UART_PARITY_ERR: + * ESP_LOGI(TAG, "uart parity error\n"); + * break; + * //Event of UART frame error + * case UART_FRAME_ERR: + * ESP_LOGI(TAG, "uart frame error\n"); + * break; + * //Others + * default: + * ESP_LOGI(TAG, "uart event type: %d\n", event.type); + * break; + * } + * } + * } + * free(dtmp); + * dtmp = NULL; + * vTaskDelete(NULL); + * } + * + * void uart_queue_test() + * { + * int uart_num = 0; + * uart_config_t uart_config = { + * .baud_rate = 115200, + * .data_bits = UART_DATA_8_BITS, + * .parity = UART_PARITY_DISABLE, + * .stop_bits = UART_STOP_BITS_1, + * .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + * .rx_flow_ctrl_thresh = 122, + * }; + * //Set UART parameters + * uart_param_config(uart_num, &uart_config); + * //Set UART pins,(-1: default pin, no change.) + * uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + * //Set UART log level + * esp_log_level_set(TAG, ESP_LOG_INFO); + * //Install UART driver, and get the queue. + * uart_driver_install(uart_num, 1024 * 2, 1024*4, 10, 17, &uart0_queue); + * //Create a task to handler UART event from ISR + * xTaskCreate(uart_task, "uTask", 1024, (void*)uart_num, 10, NULL); + * } + * @endcode + * + ***************************END OF EXAMPLE**********************************/ + +#ifdef __cplusplus +} +#endif + +#endif /*_DRIVER_UART_H_*/ diff --git a/components/driver/ledc.c b/components/driver/ledc.c index 386c93dfa..41eb82cbd 100644 --- a/components/driver/ledc.c +++ b/components/driver/ledc.c @@ -18,86 +18,19 @@ #include "freertos/xtensa_api.h" #include "soc/gpio_sig_map.h" #include "driver/ledc.h" +#include "esp_log.h" -//TODO: to use APIs in esp_log.h. -#define LEDC_DBG_WARING_ENABLE (0) -#define LEDC_DBG_ERROR_ENABLE (0) -#define LEDC_INFO_ENABLE (0) -#define LEDC_DBG_ENABLE (0) - -//DBG INFOR -#if LEDC_DBG_ENABLE -#define LEDC_DBG(format,...) do{\ - ets_printf("[dbg][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define LEDC_DBG(...) -#endif - -#if LEDC_INFO_ENABLE -#define LEDC_INFO(format,...) do{\ - ets_printf("[info][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define LEDC_INFO(...) -#endif - -#if LEDC_DBG_WARING_ENABLE -#define LEDC_WARING(format,...) do{\ - ets_printf("[waring][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define LEDC_WARING(...) -#endif -#if LEDC_DBG_ERROR_ENABLE -#define LEDC_ERROR(format,...) do{\ - ets_printf("[error][%s#%u]",__FUNCTION__,__LINE__);\ - ets_printf(format,##__VA_ARGS__);\ -}while(0) -#else -#define LEDC_ERROR(...) -#endif - +static const char* LEDC_TAG = "LEDC"; static portMUX_TYPE ledc_spinlock = portMUX_INITIALIZER_UNLOCKED; - -static bool ledc_is_valid_channel(uint32_t channel) -{ - if(channel > LEDC_CHANNEL_7) { - LEDC_ERROR("LEDC CHANNEL ERR: %d\n",channel); - return false; - } - return true; -} - -static bool ledc_is_valid_mode(uint32_t mode) -{ - if(mode >= LEDC_SPEED_MODE_MAX) { - LEDC_ERROR("LEDC MODE ERR: %d\n",mode); - return false; - } - return true; -} - -static bool ledc_is_valid_timer(int timer) -{ - if(timer > LEDC_TIMER_3) { - LEDC_ERROR("LEDC TIMER ERR: %d\n", timer); - return false; - } - return true; -} +#define LEDC_CHECK(a, str, ret_val) if (!(a)) { \ + ESP_LOGE(LEDC_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret_val); \ + } esp_err_t ledc_timer_set(ledc_mode_t speed_mode, ledc_timer_t timer_sel, uint32_t div_num, uint32_t bit_num, ledc_clk_src_t clk_src) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_timer(timer_sel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_sel <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.timer_group[speed_mode].timer[timer_sel].conf.div_num = div_num; LEDC.timer_group[speed_mode].timer[timer_sel].conf.tick_sel = clk_src; @@ -125,12 +58,8 @@ static esp_err_t ledc_duty_config(ledc_mode_t speed_mode, uint32_t channel_num, esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, uint32_t channel, uint32_t timer_idx) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_timer(timer_idx)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_idx <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.channel_group[speed_mode].channel[channel].conf0.timer_sel = timer_idx; portEXIT_CRITICAL(&ledc_spinlock); @@ -139,12 +68,8 @@ esp_err_t ledc_bind_channel_timer(ledc_mode_t speed_mode, uint32_t channel, uint esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, uint32_t timer_sel) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_timer(timer_sel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_sel <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.timer_group[speed_mode].timer[timer_sel].conf.rst = 1; LEDC.timer_group[speed_mode].timer[timer_sel].conf.rst = 0; @@ -154,12 +79,8 @@ esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, uint32_t timer_sel) esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, uint32_t timer_sel) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_timer(timer_sel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_sel <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.timer_group[speed_mode].timer[timer_sel].conf.pause = 1; portEXIT_CRITICAL(&ledc_spinlock); @@ -168,12 +89,8 @@ esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, uint32_t timer_sel) esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, uint32_t timer_sel) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_timer(timer_sel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_sel <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.timer_group[speed_mode].timer[timer_sel].conf.pause = 0; portEXIT_CRITICAL(&ledc_spinlock); @@ -182,9 +99,7 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, uint32_t timer_sel) static esp_err_t ledc_enable_intr_type(ledc_mode_t speed_mode, uint32_t channel, ledc_intr_type_t type) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); uint32_t value; uint32_t intr_type = type; portENTER_CRITICAL(&ledc_spinlock); @@ -200,9 +115,7 @@ static esp_err_t ledc_enable_intr_type(ledc_mode_t speed_mode, uint32_t channel, esp_err_t ledc_isr_register(uint32_t ledc_intr_num, void (*fn)(void*), void * arg) { - if(fn == NULL) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(fn, "ledc isr null", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); ESP_INTR_DISABLE(ledc_intr_num); intr_matrix_set(xPortGetCoreID(), ETS_LEDC_INTR_SOURCE, ledc_intr_num); @@ -218,16 +131,13 @@ esp_err_t ledc_timer_config(ledc_timer_config_t* timer_conf) int bit_num = timer_conf->bit_num; int timer_num = timer_conf->timer_num; int speed_mode = timer_conf->speed_mode; - - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); if(freq_hz == 0 || bit_num == 0 || bit_num > LEDC_TIMER_15_BIT) { - LEDC_ERROR("freq_hz=%u bit_num=%u\n", freq_hz, bit_num); + ESP_LOGE(LEDC_TAG, "freq_hz=%u bit_num=%u", freq_hz, bit_num); return ESP_ERR_INVALID_ARG; } if(timer_num > LEDC_TIMER_3) { - LEDC_ERROR("Time Select %u\n", timer_num); + ESP_LOGE(LEDC_TAG, "Time Select %u", timer_num); return ESP_ERR_INVALID_ARG; } esp_err_t ret = ESP_OK; @@ -239,7 +149,7 @@ esp_err_t ledc_timer_config(ledc_timer_config_t* timer_conf) /*Selet the reference tick*/ div_param = ((uint64_t) LEDC_REF_CLK_HZ << 8) / freq_hz / precision; if(div_param <= 256 || div_param > LEDC_DIV_NUM_HSTIMER0_V) { - LEDC_ERROR("div param err,div_param=%u\n", div_param); + ESP_LOGE(LEDC_TAG, "div param err,div_param=%u", (uint32_t)div_param); ret = ESP_FAIL; } timer_clk_src = LEDC_REF_TICK; @@ -254,6 +164,21 @@ esp_err_t ledc_timer_config(ledc_timer_config_t* timer_conf) return ret; } +esp_err_t ledc_set_pin(int gpio_num, ledc_mode_t speed_mode, ledc_channel_t ledc_channel) +{ + LEDC_CHECK(ledc_channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "ledc GPIO output number error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(gpio_num, GPIO_MODE_OUTPUT); + if(speed_mode == LEDC_HIGH_SPEED_MODE) { + gpio_matrix_out(gpio_num, LEDC_HS_SIG_OUT0_IDX + ledc_channel, 0, 0); + } else { + + } + return ESP_OK; +} + esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf) { uint32_t speed_mode = ledc_conf->speed_mode; @@ -262,21 +187,10 @@ esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf) uint32_t timer_select = ledc_conf->timer_sel; uint32_t intr_type = ledc_conf->intr_type; uint32_t duty = ledc_conf->duty; - - if(!ledc_is_valid_channel(ledc_channel)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!GPIO_IS_VALID_OUTPUT_GPIO(gpio_num)) { - LEDC_ERROR("GPIO number error: IO%d\n ", gpio_num); - return ESP_ERR_INVALID_ARG; - } - if(timer_select > LEDC_TIMER_3) { - LEDC_ERROR("Time Select %u\n", timer_select); - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(ledc_channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "ledc GPIO output number error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(timer_select <= LEDC_TIMER_3, "ledc timer error", ESP_ERR_INVALID_ARG); esp_err_t ret = ESP_OK; /*set channel parameters*/ /* channel parameters decide how the waveform looks like in one period*/ @@ -288,7 +202,7 @@ esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf) ledc_bind_channel_timer(speed_mode, ledc_channel, timer_select); /*set interrupt type*/ ledc_enable_intr_type(speed_mode, ledc_channel, intr_type); - LEDC_INFO("LEDC_PWM CHANNEL %1u|GPIO %02u|Duty %04u|Time %01u\n", + ESP_LOGI(LEDC_TAG, "LEDC_PWM CHANNEL %1u|GPIO %02u|Duty %04u|Time %01u", ledc_channel, gpio_num, duty, timer_select ); /*set LEDC signal in gpio matrix*/ @@ -300,12 +214,8 @@ esp_err_t ledc_channel_config(ledc_channel_config_t* ledc_conf) esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_channel(channel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.channel_group[speed_mode].channel[channel].conf0.sig_out_en = 1; LEDC.channel_group[speed_mode].channel[channel].conf1.duty_start = 1; @@ -315,12 +225,8 @@ esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel) esp_err_t ledc_stop(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t idle_level) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_channel(channel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); LEDC.channel_group[speed_mode].channel[channel].conf0.idle_lv = idle_level & 0x1; LEDC.channel_group[speed_mode].channel[channel].conf0.sig_out_en = 0; @@ -331,18 +237,11 @@ esp_err_t ledc_stop(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t idl esp_err_t ledc_set_fade(ledc_mode_t speed_mode, uint32_t channel, uint32_t duty, ledc_duty_direction_t fade_direction, uint32_t step_num, uint32_t duty_cyle_num, uint32_t duty_scale) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_channel(channel)) { - return ESP_ERR_INVALID_ARG; - } - if(fade_direction > LEDC_DUTY_DIR_INCREASE) { - LEDC_ERROR("Duty direction err\n"); - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(fade_direction <= LEDC_DUTY_DIR_INCREASE, "ledc fade direction error", ESP_ERR_INVALID_ARG); if(step_num > LEDC_DUTY_NUM_HSCH0_V || duty_cyle_num > LEDC_DUTY_CYCLE_HSCH0_V || duty_scale > LEDC_DUTY_SCALE_HSCH0_V) { - LEDC_ERROR("step_num=%u duty_cyle_num=%u duty_scale=%u\n", step_num, duty_cyle_num, duty_scale); + ESP_LOGE(LEDC_TAG, "step_num=%u duty_cyle_num=%u duty_scale=%u", step_num, duty_cyle_num, duty_scale); return ESP_ERR_INVALID_ARG; } ledc_duty_config(speed_mode, @@ -359,12 +258,8 @@ esp_err_t ledc_set_fade(ledc_mode_t speed_mode, uint32_t channel, uint32_t duty, esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } - if(!ledc_is_valid_channel(channel)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); + LEDC_CHECK(channel <= LEDC_CHANNEL_7, "ledc channel error", ESP_ERR_INVALID_ARG); ledc_duty_config(speed_mode, channel, //uint32_t chan_num, 0, //uint32_t hpoint_val, @@ -379,18 +274,14 @@ esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t int ledc_get_duty(ledc_mode_t speed_mode, ledc_channel_t channel) { - if(!ledc_is_valid_mode(speed_mode)) { - return -1; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", (-1)); uint32_t duty = (LEDC.channel_group[speed_mode].channel[channel].duty_rd.duty_read >> 4); return duty; } esp_err_t ledc_set_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num, uint32_t freq_hz) { - if(!ledc_is_valid_mode(speed_mode)) { - return ESP_ERR_INVALID_ARG; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&ledc_spinlock); esp_err_t ret = ESP_OK; uint32_t div_num = 0; @@ -403,7 +294,7 @@ esp_err_t ledc_set_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num, uint32_t div_num = ((uint64_t) LEDC_REF_CLK_HZ << 8) / freq_hz / precision; } if(div_num <= 256 || div_num > LEDC_DIV_NUM_HSTIMER0) { - LEDC_ERROR("div param err,div_param=%u\n", div_num); + ESP_LOGE(LEDC_TAG, "div param err,div_param=%u", div_num); ret = ESP_FAIL; } LEDC.timer_group[speed_mode].timer[timer_num].conf.div_num = div_num; @@ -413,9 +304,7 @@ esp_err_t ledc_set_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num, uint32_t uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num) { - if(!ledc_is_valid_mode(speed_mode)) { - return 0; - } + LEDC_CHECK(speed_mode < LEDC_SPEED_MODE_MAX, "ledc mode error", (0)); portENTER_CRITICAL(&ledc_spinlock); uint32_t freq = 0; uint32_t timer_source_clk = LEDC.timer_group[speed_mode].timer[timer_num].conf.tick_sel; diff --git a/components/driver/periph_ctrl.c b/components/driver/periph_ctrl.c index 3a671abad..00987768a 100644 --- a/components/driver/periph_ctrl.c +++ b/components/driver/periph_ctrl.c @@ -25,6 +25,10 @@ void periph_module_enable(periph_module_t periph) { portENTER_CRITICAL(&periph_spinlock); switch(periph) { + case PERIPH_RMT_MODULE: + SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); + CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); + break; case PERIPH_LEDC_MODULE: SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_LEDC_CLK_EN); CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_LEDC_RST); diff --git a/components/driver/rmt.c b/components/driver/rmt.c new file mode 100644 index 000000000..9fc36d49c --- /dev/null +++ b/components/driver/rmt.c @@ -0,0 +1,717 @@ +// Copyright 2015-2016 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. +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/ringbuf.h" +#include "esp_intr.h" +#include "esp_log.h" +#include "esp_err.h" +#include "soc/gpio_sig_map.h" +#include "soc/rmt_struct.h" +#include "driver/periph_ctrl.h" +#include "driver/rmt.h" + +#define RMT_SOUCCE_CLK_APB (APB_CLK_FREQ) /*!< RMT source clock is APB_CLK */ +#define RMT_SOURCE_CLK_REF (1 * 1000000) /*!< not used yet */ +#define RMT_SOURCE_CLK(select) ((select == RMT_BASECLK_REF) ? (RMT_SOURCE_CLK_REF) : (RMT_SOUCCE_CLK_APB)) /*! RMT source clock frequency */ + +#define RMT_CHANNEL_ERROR_STR "RMT CHANNEL ERR" +#define RMT_ADDR_ERROR_STR "RMT ADDRESS ERR" +#define RMT_MEM_CNT_ERROR_STR "RMT MEM BLOCK NUM ERR" +#define RMT_CARRIER_ERROR_STR "RMT CARRIER LEVEL ERR" +#define RMT_MEM_OWNER_ERROR_STR "RMT MEM OWNER_ERR" +#define RMT_BASECLK_ERROR_STR "RMT BASECLK ERR" +#define RMT_WR_MEM_OVF_ERROR_STR "RMT WR MEM OVERFLOW" +#define RMT_GPIO_ERROR_STR "RMT GPIO ERROR" +#define RMT_MODE_ERROR_STR "RMT MODE ERROR" +#define RMT_CLK_DIV_ERROR_STR "RMT CLK DIV ERR" +#define RMT_DRIVER_ERROR_STR "RMT DRIVER ERR" +#define RMT_DRIVER_LENGTH_ERROR_STR "RMT PARAM LEN ERROR" + +static const char* RMT_TAG = "RMT"; +static bool s_rmt_driver_installed = false; + +#define RMT_CHECK(a, str, ret) if (!(a)) { \ + ESP_LOGE(RMT_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret); \ + } +static portMUX_TYPE rmt_spinlock = portMUX_INITIALIZER_UNLOCKED; + +typedef struct { + int tx_offset; + int tx_len_rem; + int tx_sub_len; + rmt_channel_t channel; + rmt_item32_t* tx_data; + xSemaphoreHandle tx_sem; + RingbufHandle_t tx_buf; + RingbufHandle_t rx_buf; +} rmt_obj_t; + +rmt_obj_t* p_rmt_obj[RMT_CHANNEL_MAX] = {0}; + +static void rmt_set_tx_wrap_en(rmt_channel_t channel, bool en) +{ + portENTER_CRITICAL(&rmt_spinlock); + RMT.apb_conf.mem_tx_wrap_en = en; + portEXIT_CRITICAL(&rmt_spinlock); +} + +static void rmt_set_data_mode(rmt_data_mode_t data_mode) +{ + portENTER_CRITICAL(&rmt_spinlock); + RMT.apb_conf.fifo_mask = data_mode; + portEXIT_CRITICAL(&rmt_spinlock); +} + +esp_err_t rmt_set_clk_div(rmt_channel_t channel, uint8_t div_cnt) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT.conf_ch[channel].conf0.div_cnt = div_cnt; + return ESP_OK; +} + +esp_err_t rmt_get_clk_div(rmt_channel_t channel, uint8_t* div_cnt) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(div_cnt != NULL, RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + *div_cnt = RMT.conf_ch[channel].conf0.div_cnt; + return ESP_OK; +} + +esp_err_t rmt_set_rx_idle_thresh(rmt_channel_t channel, uint16_t thresh) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT.conf_ch[channel].conf0.idle_thres = thresh; + return ESP_OK; +} + +esp_err_t rmt_get_rx_idle_thresh(rmt_channel_t channel, uint16_t *thresh) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(thresh != NULL, RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + *thresh = RMT.conf_ch[channel].conf0.idle_thres; + return ESP_OK; +} + +esp_err_t rmt_set_mem_block_num(rmt_channel_t channel, uint8_t rmt_mem_num) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(rmt_mem_num < 16, RMT_MEM_CNT_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT.conf_ch[channel].conf0.mem_size = rmt_mem_num; + return ESP_OK; +} + +esp_err_t rmt_get_mem_block_num(rmt_channel_t channel, uint8_t* rmt_mem_num) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(rmt_mem_num != NULL, RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + *rmt_mem_num = RMT.conf_ch[channel].conf0.mem_size; + return ESP_OK; +} + +esp_err_t rmt_set_tx_carrier(rmt_channel_t channel, bool carrier_en, uint16_t high_level, uint16_t low_level, + rmt_carrier_level_t carrier_level) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(carrier_level < RMT_CARRIER_LEVEL_MAX, RMT_CARRIER_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT.carrier_duty_ch[channel].high = high_level; + RMT.carrier_duty_ch[channel].low = low_level; + RMT.conf_ch[channel].conf0.carrier_out_lv = carrier_level; + RMT.conf_ch[channel].conf0.carrier_en = carrier_en; + return ESP_OK; +} + +esp_err_t rmt_set_mem_pd(rmt_channel_t channel, bool pd_en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT.conf_ch[channel].conf0.mem_pd = pd_en; + return ESP_OK; +} + +esp_err_t rmt_get_mem_pd(rmt_channel_t channel, bool* pd_en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + *pd_en = (bool) RMT.conf_ch[channel].conf0.mem_pd; + return ESP_OK; +} + +esp_err_t rmt_tx_start(rmt_channel_t channel, bool tx_idx_rst) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + if(tx_idx_rst) { + RMT.conf_ch[channel].conf1.mem_rd_rst = 1; + } + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_TX; + RMT.conf_ch[channel].conf1.tx_start = 1; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_tx_stop(rmt_channel_t channel) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.tx_start = 0; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_rx_start(rmt_channel_t channel, bool rx_idx_rst) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + if(rx_idx_rst) { + RMT.conf_ch[channel].conf1.mem_wr_rst = 1; + } + RMT.conf_ch[channel].conf1.rx_en = 0; + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_RX; + RMT.conf_ch[channel].conf1.rx_en = 1; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_rx_stop(rmt_channel_t channel) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.rx_en = 0; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_memory_rw_rst(rmt_channel_t channel) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.mem_rd_rst = 1; + RMT.conf_ch[channel].conf1.mem_wr_rst = 1; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_set_memory_owner(rmt_channel_t channel, rmt_mem_owner_t owner) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(owner < RMT_MEM_OWNER_MAX, RMT_MEM_OWNER_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.mem_owner = owner; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_get_memory_owner(rmt_channel_t channel, rmt_mem_owner_t* owner) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(owner != NULL, RMT_MEM_OWNER_ERROR_STR, ESP_ERR_INVALID_ARG); + *owner = (rmt_mem_owner_t) RMT.conf_ch[channel].conf1.mem_owner; + return ESP_OK; +} + +esp_err_t rmt_set_tx_loop_mode(rmt_channel_t channel, bool loop_en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.tx_conti_mode = loop_en; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_get_tx_loop_mode(rmt_channel_t channel, bool* loop_en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + *loop_en = (bool) RMT.conf_ch[channel].conf1.tx_conti_mode; + return ESP_OK; +} + +esp_err_t rmt_set_rx_filter(rmt_channel_t channel, bool rx_filter_en, uint8_t thresh) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.rx_filter_en = rx_filter_en; + RMT.conf_ch[channel].conf1.rx_filter_thres = thresh; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_set_source_clk(rmt_channel_t channel, rmt_source_clk_t base_clk) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(base_clk < RMT_BASECLK_MAX, RMT_BASECLK_ERROR_STR, ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.ref_always_on = base_clk; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_get_source_clk(rmt_channel_t channel, rmt_source_clk_t* src_clk) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + *src_clk = (rmt_source_clk_t) (RMT.conf_ch[channel].conf1.ref_always_on); + return ESP_OK; +} + +esp_err_t rmt_set_idle_level(rmt_channel_t channel, bool idle_out_en, rmt_idle_level_t level) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(level < RMT_IDLE_LEVEL_MAX, "RMT IDLE LEVEL ERR", ESP_ERR_INVALID_ARG); + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.idle_out_en = idle_out_en; + RMT.conf_ch[channel].conf1.idle_out_lv = level; + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +esp_err_t rmt_get_status(rmt_channel_t channel, uint32_t* status) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + *status = RMT.status_ch[channel]; + return ESP_OK; +} + +rmt_data_mode_t rmt_get_data_mode() +{ + return (rmt_data_mode_t) (RMT.apb_conf.fifo_mask); +} + +void rmt_set_intr_enable_mask(uint32_t mask) +{ + portENTER_CRITICAL(&rmt_spinlock); + RMT.int_ena.val |= mask; + portEXIT_CRITICAL(&rmt_spinlock); +} + +void rmt_clr_intr_enable_mask(uint32_t mask) +{ + portENTER_CRITICAL(&rmt_spinlock); + RMT.int_ena.val &= (~mask); + portEXIT_CRITICAL(&rmt_spinlock); +} + +esp_err_t rmt_set_rx_intr_en(rmt_channel_t channel, bool en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + if(en) { + rmt_set_intr_enable_mask(BIT(channel * 3 + 1)); + } else { + rmt_clr_intr_enable_mask(BIT(channel * 3 + 1)); + } + return ESP_OK; +} + +esp_err_t rmt_set_err_intr_en(rmt_channel_t channel, bool en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + if(en) { + rmt_set_intr_enable_mask(BIT(channel * 3 + 2)); + } else { + rmt_clr_intr_enable_mask(BIT(channel * 3 + 2)); + } + return ESP_OK; +} + +esp_err_t rmt_set_tx_intr_en(rmt_channel_t channel, bool en) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + if(en) { + rmt_set_intr_enable_mask(BIT(channel * 3)); + } else { + rmt_clr_intr_enable_mask(BIT(channel * 3)); + } + return ESP_OK; +} + +esp_err_t rmt_set_evt_intr_en(rmt_channel_t channel, bool en, uint16_t evt_thresh) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(evt_thresh < 256, "RMT EVT THRESH ERR", ESP_ERR_INVALID_ARG); + if(en) { + RMT.tx_lim_ch[channel].limit = evt_thresh; + rmt_set_tx_wrap_en(channel, true); + rmt_set_intr_enable_mask(BIT(channel + 24)); + } else { + rmt_clr_intr_enable_mask(BIT(channel + 24)); + } + return ESP_OK; +} + +esp_err_t rmt_set_pin(rmt_channel_t channel, rmt_mode_t mode, gpio_num_t gpio_num) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(mode < RMT_MODE_MAX, RMT_MODE_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(((GPIO_IS_VALID_GPIO(gpio_num) && (mode == RMT_MODE_RX)) || (GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) && (mode == RMT_MODE_TX))), + RMT_GPIO_ERROR_STR, ESP_ERR_INVALID_ARG); + + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio_num], 2); + if(mode == RMT_MODE_TX) { + gpio_set_direction(gpio_num, GPIO_MODE_OUTPUT); + gpio_matrix_out(gpio_num, RMT_SIG_OUT0_IDX + channel, 0, 0); + } else { + gpio_set_direction(gpio_num, GPIO_MODE_INPUT); + gpio_matrix_in(gpio_num, RMT_SIG_IN0_IDX + channel, 0); + } + return ESP_OK; +} + +esp_err_t rmt_config(rmt_config_t* rmt_param) +{ + uint8_t mode = rmt_param->rmt_mode; + uint8_t channel = rmt_param->channel; + uint8_t gpio_num = rmt_param->gpio_num; + uint8_t mem_cnt = rmt_param->mem_block_num; + int clk_div = rmt_param->clk_div; + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(GPIO_IS_VALID_GPIO(gpio_num), RMT_GPIO_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK((mem_cnt + channel <= 8 && mem_cnt > 0), RMT_MEM_CNT_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK((clk_div > 0), RMT_CLK_DIV_ERROR_STR, ESP_ERR_INVALID_ARG); + periph_module_enable(PERIPH_RMT_MODULE); + + RMT.conf_ch[channel].conf0.div_cnt = clk_div; + /*Visit data use memory not FIFO*/ + rmt_set_data_mode(RMT_DATA_MODE_MEM); + /*Reset tx/rx memory index */ + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.mem_rd_rst = 1; + RMT.conf_ch[channel].conf1.mem_wr_rst = 1; + portEXIT_CRITICAL(&rmt_spinlock); + + if(mode == RMT_MODE_TX) { + uint32_t rmt_source_clk_hz = 0; + uint32_t carrier_freq_hz = rmt_param->tx_config.carrier_freq_hz; + uint16_t carrier_duty_percent = rmt_param->tx_config.carrier_duty_percent; + uint8_t carrier_level = rmt_param->tx_config.carrier_level; + uint8_t idle_level = rmt_param->tx_config.idle_level; + + portENTER_CRITICAL(&rmt_spinlock); + RMT.conf_ch[channel].conf1.tx_conti_mode = rmt_param->tx_config.loop_en; + /*Memory set block number*/ + RMT.conf_ch[channel].conf0.mem_size = mem_cnt; + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_TX; + /*We use APB clock in this version, which is 80Mhz, later we will release system reference clock*/ + RMT.conf_ch[channel].conf1.ref_always_on = RMT_BASECLK_APB; + rmt_source_clk_hz = RMT_SOURCE_CLK(RMT_BASECLK_APB); + /*Set idle level */ + RMT.conf_ch[channel].conf1.idle_out_en = rmt_param->tx_config.idle_output_en; + RMT.conf_ch[channel].conf1.idle_out_lv = idle_level; + portEXIT_CRITICAL(&rmt_spinlock); + + /*Set carrier*/ + uint32_t duty_div, duty_h, duty_l; + duty_div = rmt_source_clk_hz / carrier_freq_hz; + duty_h = duty_div * carrier_duty_percent / 100; + duty_l = duty_div - duty_h; + RMT.conf_ch[channel].conf0.carrier_out_lv = carrier_level; + RMT.carrier_duty_ch[channel].high = duty_h; + RMT.carrier_duty_ch[channel].low = duty_l; + RMT.conf_ch[channel].conf0.carrier_en = rmt_param->tx_config.carrier_en; + ESP_LOGD(RMT_TAG, "Rmt Tx Channel %u|Gpio %u|Sclk_Hz %u|Div %u|Carrier_Hz %u|Duty %u", + channel, gpio_num, rmt_source_clk_hz, clk_div, carrier_freq_hz, carrier_duty_percent); + } + else if(RMT_MODE_RX == mode) { + uint8_t filter_cnt = rmt_param->rx_config.filter_ticks_thresh; + uint16_t threshold = rmt_param->rx_config.idle_threshold; + + portENTER_CRITICAL(&rmt_spinlock); + /*clock init*/ + RMT.conf_ch[channel].conf1.ref_always_on = RMT_BASECLK_APB; + uint32_t rmt_source_clk_hz = RMT_SOURCE_CLK(RMT_BASECLK_APB); + /*memory set block number and owner*/ + RMT.conf_ch[channel].conf0.mem_size = mem_cnt; + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_RX; + /*Set idle threshold*/ + RMT.conf_ch[channel].conf0.idle_thres = threshold; + /* Set RX filter */ + RMT.conf_ch[channel].conf1.rx_filter_thres = filter_cnt; + RMT.conf_ch[channel].conf1.rx_filter_en = rmt_param->rx_config.filter_en; + portEXIT_CRITICAL(&rmt_spinlock); + + ESP_LOGD(RMT_TAG, "Rmt Rx Channel %u|Gpio %u|Sclk_Hz %u|Div %u|Thresold %u|Filter %u", + channel, gpio_num, rmt_source_clk_hz, clk_div, threshold, filter_cnt); + } + rmt_set_pin(channel, mode, gpio_num); + return ESP_OK; +} + +static void IRAM_ATTR rmt_fill_memory(rmt_channel_t channel, rmt_item32_t* item, uint16_t item_num, uint16_t mem_offset) +{ + portENTER_CRITICAL(&rmt_spinlock); + RMT.apb_conf.fifo_mask = RMT_DATA_MODE_MEM; + portEXIT_CRITICAL(&rmt_spinlock); + int i; + for(i = 0; i < item_num; i++) { + RMTMEM.chan[channel].data32[i + mem_offset].val = item[i].val; + } +} + +esp_err_t rmt_fill_tx_items(rmt_channel_t channel, rmt_item32_t* item, uint16_t item_num, uint16_t mem_offset) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, (0)); + RMT_CHECK((item != NULL), RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK((item_num > 0), RMT_DRIVER_LENGTH_ERROR_STR, ESP_ERR_INVALID_ARG); + + /*Each block has 64 x 32 bits of data*/ + uint8_t mem_cnt = RMT.conf_ch[channel].conf0.mem_size; + RMT_CHECK((mem_cnt * RMT_MEM_ITEM_NUM >= item_num), RMT_WR_MEM_OVF_ERROR_STR, ESP_ERR_INVALID_ARG); + rmt_fill_memory(channel, item, item_num, mem_offset); + return ESP_OK; +} + +esp_err_t rmt_isr_register(uint8_t rmt_intr_num, void (*fn)(void*), void * arg) +{ + RMT_CHECK((fn != NULL), RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(s_rmt_driver_installed == false, "RMT DRIVER INSTALLED, CAN NOT REG ISR HANDLER", ESP_FAIL); + portENTER_CRITICAL(&rmt_spinlock); + ESP_INTR_DISABLE(rmt_intr_num); + intr_matrix_set(xPortGetCoreID(), ETS_RMT_INTR_SOURCE, rmt_intr_num); + xt_set_interrupt_handler(rmt_intr_num, fn, arg); + ESP_INTR_ENABLE(rmt_intr_num); + portEXIT_CRITICAL(&rmt_spinlock); + return ESP_OK; +} + +static int IRAM_ATTR rmt_get_mem_len(rmt_channel_t channel) +{ + int block_num = RMT.conf_ch[channel].conf0.mem_size; + int item_block_len = block_num * RMT_MEM_ITEM_NUM; + volatile rmt_item32_t* data = RMTMEM.chan[channel].data32; + int idx; + for(idx = 0; idx < item_block_len; idx++) { + if(data[idx].duration0 == 0) { + return idx; + } else if(data[idx].duration1 == 0) { + return idx + 1; + } + } + return idx; +} + +static void IRAM_ATTR rmt_driver_isr_default(void* arg) +{ + uint32_t intr_st = RMT.int_st.val; + uint32_t i = 0; + uint8_t channel; + portBASE_TYPE HPTaskAwoken = 0; + for(i = 0; i < 32; i++) { + if(i < 24) { + if(intr_st & (BIT(i))) { + channel = i / 3; + rmt_obj_t* p_rmt = p_rmt_obj[channel]; + switch(i % 3) { + //TX END + case 0: + ESP_EARLY_LOGD(RMT_TAG, "RMT INTR : TX END\n"); + xSemaphoreGiveFromISR(p_rmt->tx_sem, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR(); + } + p_rmt->tx_data = NULL; + p_rmt->tx_len_rem = 0; + p_rmt->tx_offset = 0; + p_rmt->tx_sub_len = 0; + break; + //RX_END + case 1: + ESP_EARLY_LOGD(RMT_TAG, "RMT INTR : RX END"); + RMT.conf_ch[channel].conf1.rx_en = 0; + int item_len = rmt_get_mem_len(channel); + //change memory owner to protect data. + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_TX; + if(p_rmt->rx_buf) { + BaseType_t res = xRingbufferSendFromISR(p_rmt->rx_buf, (void*) RMTMEM.chan[channel].data32, item_len * 4, &HPTaskAwoken); + if(res == pdFALSE) { + ESP_LOGE(RMT_TAG, "RMT RX BUFFER FULL"); + } else { + + } + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR(); + } + } else { + ESP_EARLY_LOGE(RMT_TAG, "RMT RX BUFFER ERROR\n"); + } + RMT.conf_ch[channel].conf1.mem_wr_rst = 1; + RMT.conf_ch[channel].conf1.mem_owner = RMT_MEM_OWNER_RX; + RMT.conf_ch[channel].conf1.rx_en = 1; + break; + //ERR + case 2: + ESP_EARLY_LOGE(RMT_TAG, "RMT[%d] ERR", channel); + ESP_EARLY_LOGE(RMT_TAG, "status: 0x%08x", RMT.status_ch[channel]); + RMT.int_ena.val &= (~(BIT(i))); + break; + default: + break; + } + RMT.int_clr.val = BIT(i); + } + } else { + if(intr_st & (BIT(i))) { + channel = i - 24; + rmt_obj_t* p_rmt = p_rmt_obj[channel]; + RMT.int_clr.val = BIT(i); + ESP_EARLY_LOGD(RMT_TAG, "RMT CH[%d]: EVT INTR", channel); + if(p_rmt->tx_data == NULL) { + //skip + } else { + rmt_item32_t* pdata = p_rmt->tx_data; + int len_rem = p_rmt->tx_len_rem; + if(len_rem >= p_rmt->tx_sub_len) { + rmt_fill_memory(channel, pdata, p_rmt->tx_sub_len, p_rmt->tx_offset); + p_rmt->tx_data += p_rmt->tx_sub_len; + p_rmt->tx_len_rem -= p_rmt->tx_sub_len; + } else if(len_rem == 0) { + RMTMEM.chan[channel].data32[p_rmt->tx_offset].val = 0; + } else { + rmt_fill_memory(channel, pdata, len_rem, p_rmt->tx_offset); + RMTMEM.chan[channel].data32[p_rmt->tx_offset + len_rem].val = 0; + p_rmt->tx_data += len_rem; + p_rmt->tx_len_rem -= len_rem; + } + if(p_rmt->tx_offset == 0) { + p_rmt->tx_offset = p_rmt->tx_sub_len; + } else { + p_rmt->tx_offset = 0; + } + } + } + } + } +} + +esp_err_t rmt_driver_uninstall(rmt_channel_t channel) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + if(p_rmt_obj[channel] == NULL) { + return ESP_OK; + } + xSemaphoreTake(p_rmt_obj[channel]->tx_sem, portMAX_DELAY); + rmt_set_rx_intr_en(channel, 0); + rmt_set_err_intr_en(channel, 0); + rmt_set_tx_intr_en(channel, 0); + rmt_set_evt_intr_en(channel, 0, 0xffff); + if(p_rmt_obj[channel]->tx_sem) { + vSemaphoreDelete(p_rmt_obj[channel]->tx_sem); + p_rmt_obj[channel]->tx_sem = NULL; + } + if(p_rmt_obj[channel]->rx_buf) { + vRingbufferDelete(p_rmt_obj[channel]->rx_buf); + p_rmt_obj[channel]->rx_buf = NULL; + } + free(p_rmt_obj[channel]); + p_rmt_obj[channel] = NULL; + s_rmt_driver_installed = false; + return ESP_OK; +} + +esp_err_t rmt_driver_install(rmt_channel_t channel, size_t rx_buf_size, int rmt_intr_num) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + if(p_rmt_obj[channel] != NULL) { + ESP_LOGD(RMT_TAG, "RMT DRIVER ALREADY INSTALLED"); + return ESP_FAIL; + } + + ESP_INTR_DISABLE(rmt_intr_num); + p_rmt_obj[channel] = (rmt_obj_t*) malloc(sizeof(rmt_obj_t)); + + if(p_rmt_obj[channel] == NULL) { + ESP_LOGE(RMT_TAG, "RMT driver malloc error"); + return ESP_FAIL; + } + memset(p_rmt_obj[channel], 0, sizeof(rmt_obj_t)); + + p_rmt_obj[channel]->tx_len_rem = 0; + p_rmt_obj[channel]->tx_data = NULL; + p_rmt_obj[channel]->channel = channel; + p_rmt_obj[channel]->tx_offset = 0; + p_rmt_obj[channel]->tx_sub_len = 0; + + if(p_rmt_obj[channel]->tx_sem == NULL) { + p_rmt_obj[channel]->tx_sem = xSemaphoreCreateBinary(); + xSemaphoreGive(p_rmt_obj[channel]->tx_sem); + } + if(p_rmt_obj[channel]->rx_buf == NULL && rx_buf_size > 0) { + p_rmt_obj[channel]->rx_buf = xRingbufferCreate(rx_buf_size, RINGBUF_TYPE_NOSPLIT); + rmt_set_rx_intr_en(channel, 1); + rmt_set_err_intr_en(channel, 1); + } + if(s_rmt_driver_installed == false) { + rmt_isr_register(rmt_intr_num, rmt_driver_isr_default, NULL); + s_rmt_driver_installed = true; + } + rmt_set_tx_intr_en(channel, 1); + ESP_INTR_ENABLE(rmt_intr_num); + return ESP_OK; +} + +esp_err_t rmt_write_items(rmt_channel_t channel, rmt_item32_t* rmt_item, int item_num, bool wait_tx_done) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(p_rmt_obj[channel] != NULL, RMT_DRIVER_ERROR_STR, ESP_FAIL); + RMT_CHECK(rmt_item != NULL, RMT_ADDR_ERROR_STR, ESP_FAIL); + RMT_CHECK(item_num > 0, RMT_DRIVER_LENGTH_ERROR_STR, ESP_ERR_INVALID_ARG); + rmt_obj_t* p_rmt = p_rmt_obj[channel]; + int block_num = RMT.conf_ch[channel].conf0.mem_size; + int item_block_len = block_num * RMT_MEM_ITEM_NUM; + int item_sub_len = block_num * RMT_MEM_ITEM_NUM / 2; + int len_rem = item_num; + xSemaphoreTake(p_rmt->tx_sem, portMAX_DELAY); + // fill the memory block first + if(item_num >= item_block_len) { + rmt_fill_memory(channel, rmt_item, item_block_len, 0); + RMT.tx_lim_ch[channel].limit = item_sub_len; + RMT.apb_conf.mem_tx_wrap_en = 1; + len_rem -= item_block_len; + RMT.conf_ch[channel].conf1.tx_conti_mode = 0; + rmt_set_evt_intr_en(channel, 1, item_sub_len); + p_rmt->tx_data = rmt_item + item_block_len; + p_rmt->tx_len_rem = len_rem; + p_rmt->tx_offset = 0; + p_rmt->tx_sub_len = item_sub_len; + } else { + rmt_fill_memory(channel, rmt_item, len_rem, 0); + RMTMEM.chan[channel].data32[len_rem].val = 0; + len_rem = 0; + } + rmt_tx_start(channel, true); + if(wait_tx_done) { + xSemaphoreTake(p_rmt->tx_sem, portMAX_DELAY); + xSemaphoreGive(p_rmt->tx_sem); + } + return ESP_OK; +} + +esp_err_t rmt_wait_tx_done(rmt_channel_t channel) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(p_rmt_obj[channel] != NULL, RMT_DRIVER_ERROR_STR, ESP_FAIL); + xSemaphoreTake(p_rmt_obj[channel]->tx_sem, portMAX_DELAY); + xSemaphoreGive(p_rmt_obj[channel]->tx_sem); + return ESP_OK; +} + +esp_err_t rmt_get_ringbuf_handler(rmt_channel_t channel, RingbufHandle_t* buf_handler) +{ + RMT_CHECK(channel < RMT_CHANNEL_MAX, RMT_CHANNEL_ERROR_STR, ESP_ERR_INVALID_ARG); + RMT_CHECK(p_rmt_obj[channel] != NULL, RMT_DRIVER_ERROR_STR, ESP_FAIL); + RMT_CHECK(buf_handler != NULL, RMT_ADDR_ERROR_STR, ESP_ERR_INVALID_ARG); + *buf_handler = p_rmt_obj[channel]->rx_buf; + return ESP_OK; +} + diff --git a/components/driver/uart.c b/components/driver/uart.c new file mode 100644 index 000000000..59b4904dc --- /dev/null +++ b/components/driver/uart.c @@ -0,0 +1,1028 @@ +// Copyright 2015-2016 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. +#include +#include "esp_types.h" +#include "esp_attr.h" +#include "esp_intr.h" +#include "esp_log.h" +#include "malloc.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/xtensa_api.h" +#include "freertos/task.h" +#include "freertos/ringbuf.h" +#include "soc/dport_reg.h" +#include "soc/uart_struct.h" +#include "driver/uart.h" +#include "driver/gpio.h" + +static const char* UART_TAG = "UART"; +#define UART_CHECK(a, str, ret) if (!(a)) { \ + ESP_LOGE(UART_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \ + return (ret); \ + } +#define UART_EMPTY_THRESH_DEFAULT (10) +#define UART_FULL_THRESH_DEFAULT (120) +#define UART_TOUT_THRESH_DEFAULT (10) +#define UART_ENTER_CRITICAL_ISR(mux) portENTER_CRITICAL_ISR(mux) +#define UART_EXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux) +#define UART_ENTER_CRITICAL(mux) portENTER_CRITICAL(mux) +#define UART_EXIT_CRITICAL(mux) portEXIT_CRITICAL(mux) + +typedef struct { + uart_event_type_t type; /*!< UART TX data type */ + struct { + int brk_len; + size_t size; + uint8_t data[0]; + } tx_data; +} uart_tx_data_t; + +typedef struct { + uart_port_t uart_num; /*!< UART port number*/ + int queue_size; /*!< UART event queue size*/ + QueueHandle_t xQueueUart; /*!< UART queue handler*/ + int intr_num; /*!< UART interrupt number*/ + //rx parameters + SemaphoreHandle_t rx_mux; /*!< UART RX data mutex*/ + int rx_buf_size; /*!< RX ring buffer size */ + RingbufHandle_t rx_ring_buf; /*!< RX ring buffer handler*/ + bool rx_buffer_full_flg; /*!< RX ring buffer full flag. */ + int rx_cur_remain; /*!< Data number that waiting to be read out in ring buffer item*/ + uint8_t* rx_ptr; /*!< pointer to the current data in ring buffer*/ + uint8_t* rx_head_ptr; /*!< pointer to the head of RX item*/ + uint8_t rx_data_buf[UART_FIFO_LEN]; /*!< Data buffer to stash FIFO data*/ + uint8_t rx_stash_len; /*!< stashed data length.(When using flow control, after reading out FIFO data, if we fail to push to buffer, we can just stash them.) */ + //tx parameters + SemaphoreHandle_t tx_fifo_sem; /*!< UART TX FIFO semaphore*/ + SemaphoreHandle_t tx_mux; /*!< UART TX mutex*/ + SemaphoreHandle_t tx_done_sem; /*!< UART TX done semaphore*/ + SemaphoreHandle_t tx_brk_sem; /*!< UART TX send break done semaphore*/ + int tx_buf_size; /*!< TX ring buffer size */ + RingbufHandle_t tx_ring_buf; /*!< TX ring buffer handler*/ + bool tx_waiting_fifo; /*!< this flag indicates that some task is waiting for FIFO empty interrupt, used to send all data without any data buffer*/ + uint8_t* tx_ptr; /*!< TX data pointer to push to FIFO in TX buffer mode*/ + uart_tx_data_t* tx_head; /*!< TX data pointer to head of the current buffer in TX ring buffer*/ + uint32_t tx_len_tot; /*!< Total length of current item in ring buffer*/ + uint32_t tx_len_cur; + uint8_t tx_brk_flg; /*!< Flag to indicate to send a break signal in the end of the item sending procedure */ + uint8_t tx_brk_len; /*!< TX break signal cycle length/number */ + uint8_t tx_waiting_brk; /*!< Flag to indicate that TX FIFO is ready to send break signal after FIFO is empty, do not push data into TX FIFO right now.*/ +} uart_obj_t; + + + +static uart_obj_t *p_uart_obj[UART_NUM_MAX] = {0}; +/* DRAM_ATTR is required to avoid UART array placed in flash, due to accessed from ISR */ +static DRAM_ATTR uart_dev_t* const UART[UART_NUM_MAX] = {&UART0, &UART1, &UART2}; +static portMUX_TYPE uart_spinlock[UART_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; + +esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((data_bit < UART_DATA_BITS_MAX), "data bit error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.bit_num = data_bit; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + *(data_bit) = UART[uart_num]->conf0.bit_num; + return ESP_OK; +} + +esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bit) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((stop_bit < UART_STOP_BITS_MAX), "stop bit error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.stop_bit_num = stop_bit; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bit) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + (*stop_bit) = UART[uart_num]->conf0.stop_bit_num; + return ESP_OK; +} + +esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.parity = parity_mode & 0x1; + UART[uart_num]->conf0.parity_en = (parity_mode >> 1) & 0x1; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t* parity_mode) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + int val = UART[uart_num]->conf0.val; + if(val & UART_PARITY_EN_M) { + if(val & UART_PARITY_M) { + (*parity_mode) = UART_PARITY_ODD; + } else { + (*parity_mode) = UART_PARITY_EVEN; + } + } else { + (*parity_mode) = UART_PARITY_DISABLE; + } + return ESP_OK; +} + +esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baud_rate) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((baud_rate < UART_BITRATE_MAX), "baud_rate error", ESP_FAIL); + uint32_t clk_div = (((UART_CLK_FREQ) << 4) / baud_rate); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->clk_div.div_int = clk_div >> 4; + UART[uart_num]->clk_div.div_frag = clk_div & 0xf; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t* baudrate) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + uint32_t clk_div = (UART[uart_num]->clk_div.div_int << 4) | UART[uart_num]->clk_div.div_frag; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + (*baudrate) = ((UART_CLK_FREQ) << 4) / clk_div; + return ESP_OK; +} + +esp_err_t uart_set_line_inverse(uart_port_t uart_num, uint32_t inverse_mask) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((((inverse_mask & UART_LINE_INV_MASK) == 0) && (inverse_mask != 0)), "inverse_mask error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + CLEAR_PERI_REG_MASK(UART_CONF0_REG(uart_num), UART_LINE_INV_MASK); + SET_PERI_REG_MASK(UART_CONF0_REG(uart_num), inverse_mask); + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +//only when UART_HW_FLOWCTRL_RTS is set , will the rx_thresh value be set. +esp_err_t uart_set_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((rx_thresh < UART_FIFO_LEN), "rx flow thresh error", ESP_FAIL); + UART_CHECK((flow_ctrl < UART_HW_FLOWCTRL_MAX), "hw_flowctrl mode error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + if(flow_ctrl & UART_HW_FLOWCTRL_RTS) { + UART[uart_num]->conf1.rx_flow_thrhd = rx_thresh; + UART[uart_num]->conf1.rx_flow_en = 1; + } else { + UART[uart_num]->conf1.rx_flow_en = 0; + } + if(flow_ctrl & UART_HW_FLOWCTRL_CTS) { + UART[uart_num]->conf0.tx_flow_en = 1; + } else { + UART[uart_num]->conf0.tx_flow_en = 0; + } + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t* flow_ctrl) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + uart_hw_flowcontrol_t val = UART_HW_FLOWCTRL_DISABLE; + if(UART[uart_num]->conf1.rx_flow_en) { + val |= UART_HW_FLOWCTRL_RTS; + } + if(UART[uart_num]->conf0.tx_flow_en) { + val |= UART_HW_FLOWCTRL_CTS; + } + (*flow_ctrl) = val; + return ESP_OK; +} + +static esp_err_t uart_reset_fifo(uart_port_t uart_num) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.rxfifo_rst = 1; + UART[uart_num]->conf0.rxfifo_rst = 0; + UART[uart_num]->conf0.txfifo_rst = 1; + UART[uart_num]->conf0.txfifo_rst = 0; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_clear_intr_status(uart_port_t uart_num, uint32_t clr_mask) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + //intr_clr register is write-only + UART[uart_num]->int_clr.val = clr_mask; + return ESP_OK; +} + +esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + SET_PERI_REG_MASK(UART_INT_CLR_REG(uart_num), enable_mask); + SET_PERI_REG_MASK(UART_INT_ENA_REG(uart_num), enable_mask); + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + CLEAR_PERI_REG_MASK(UART_INT_ENA_REG(uart_num), disable_mask); + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_enable_rx_intr(uart_port_t uart_num) +{ + uart_enable_intr_mask(uart_num, UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA); + return ESP_OK; +} + +esp_err_t uart_disable_rx_intr(uart_port_t uart_num) +{ + uart_disable_intr_mask(uart_num, UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA); + return ESP_OK; +} + +esp_err_t uart_disable_tx_intr(uart_port_t uart_num) +{ + uart_disable_intr_mask(uart_num, UART_TXFIFO_EMPTY_INT_ENA); + return ESP_OK; +} + +esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((thresh < UART_FIFO_LEN), "empty intr threshold error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->int_clr.txfifo_empty = 1; + UART[uart_num]->conf1.txfifo_empty_thrhd = thresh & UART_TXFIFO_EMPTY_THRHD_V; + UART[uart_num]->int_ena.txfifo_empty = enable & 0x1; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + ESP_INTR_ENABLE(p_uart_obj[uart_num]->intr_num); + return ESP_OK; +} + +esp_err_t uart_isr_register(uart_port_t uart_num, uint8_t uart_intr_num, void (*fn)(void*), void * arg) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + ESP_INTR_DISABLE(uart_intr_num); + switch(uart_num) { + case UART_NUM_1: + intr_matrix_set(xPortGetCoreID(), ETS_UART1_INTR_SOURCE, uart_intr_num); + break; + case UART_NUM_2: + intr_matrix_set(xPortGetCoreID(), ETS_UART2_INTR_SOURCE, uart_intr_num); + break; + case UART_NUM_0: + default: + intr_matrix_set(xPortGetCoreID(), ETS_UART0_INTR_SOURCE, uart_intr_num); + break; + } + xt_set_interrupt_handler(uart_intr_num, fn, arg); + ESP_INTR_ENABLE(uart_intr_num); + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +//internal signal can be output to multiple GPIO pads +//only one GPIO pad can connect with input signal +esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((tx_io_num < 0 || (GPIO_IS_VALID_OUTPUT_GPIO(tx_io_num))), "tx_io_num error", ESP_FAIL); + UART_CHECK((rx_io_num < 0 || (GPIO_IS_VALID_GPIO(rx_io_num))), "rx_io_num error", ESP_FAIL); + UART_CHECK((rts_io_num < 0 || (GPIO_IS_VALID_OUTPUT_GPIO(rts_io_num))), "rts_io_num error", ESP_FAIL); + UART_CHECK((cts_io_num < 0 || (GPIO_IS_VALID_GPIO(cts_io_num))), "cts_io_num error", ESP_FAIL); + + int tx_sig, rx_sig, rts_sig, cts_sig; + switch(uart_num) { + case UART_NUM_0: + tx_sig = U0TXD_OUT_IDX; + rx_sig = U0RXD_IN_IDX; + rts_sig = U0RTS_OUT_IDX; + cts_sig = U0CTS_IN_IDX; + break; + case UART_NUM_1: + tx_sig = U1TXD_OUT_IDX; + rx_sig = U1RXD_IN_IDX; + rts_sig = U1RTS_OUT_IDX; + cts_sig = U1CTS_IN_IDX; + break; + case UART_NUM_2: + tx_sig = U2TXD_OUT_IDX; + rx_sig = U2RXD_IN_IDX; + rts_sig = U2RTS_OUT_IDX; + cts_sig = U2CTS_IN_IDX; + break; + case UART_NUM_MAX: + default: + tx_sig = U0TXD_OUT_IDX; + rx_sig = U0RXD_IN_IDX; + rts_sig = U0RTS_OUT_IDX; + cts_sig = U0CTS_IN_IDX; + break; + } + if(tx_io_num >= 0) { + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[tx_io_num], PIN_FUNC_GPIO); + gpio_set_direction(tx_io_num, GPIO_MODE_OUTPUT); + gpio_matrix_out(tx_io_num, tx_sig, 0, 0); + } + + if(rx_io_num >= 0) { + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[rx_io_num], PIN_FUNC_GPIO); + gpio_set_direction(rx_io_num, GPIO_MODE_INPUT); + gpio_matrix_in(rx_io_num, rx_sig, 0); + } + if(rts_io_num >= 0) { + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[rts_io_num], PIN_FUNC_GPIO); + gpio_set_direction(rts_io_num, GPIO_MODE_OUTPUT); + gpio_matrix_out(rts_io_num, rts_sig, 0, 0); + } + if(cts_io_num >= 0) { + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[cts_io_num], PIN_FUNC_GPIO); + gpio_set_direction(cts_io_num, GPIO_MODE_INPUT); + gpio_matrix_in(cts_io_num, cts_sig, 0); + } + return ESP_OK; +} + +esp_err_t uart_set_rts(uart_port_t uart_num, int level) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((UART[uart_num]->conf1.rx_flow_en != 1), "disable hw flowctrl before using sw control", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.sw_rts = level & 0x1; + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_set_dtr(uart_port_t uart_num, int level) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->conf0.sw_dtr = level & 0x1; + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((uart_config), "param null", ESP_FAIL); + if(uart_num == UART_NUM_0) { + periph_module_enable(PERIPH_UART0_MODULE); + } else if(uart_num == UART_NUM_1) { + periph_module_enable(PERIPH_UART1_MODULE); + } else if(uart_num == UART_NUM_2) { + periph_module_enable(PERIPH_UART2_MODULE); + } + uart_set_hw_flow_ctrl(uart_num, uart_config->flow_ctrl, uart_config->rx_flow_ctrl_thresh); + uart_set_baudrate(uart_num, uart_config->baud_rate); + UART[uart_num]->conf0.val = ( + (uart_config->parity << UART_PARITY_S) + | (uart_config->stop_bits << UART_STOP_BIT_NUM_S) + | (uart_config->data_bits << UART_BIT_NUM_S) + | ((uart_config->flow_ctrl & UART_HW_FLOWCTRL_CTS) ? UART_TX_FLOW_EN : 0x0) + | UART_TICK_REF_ALWAYS_ON_M); + return ESP_OK; +} + +esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_conf) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((intr_conf), "param null", ESP_FAIL); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->int_clr.val = UART_INTR_MASK; + if(intr_conf->intr_enable_mask & UART_RXFIFO_TOUT_INT_ENA_M) { + UART[uart_num]->conf1.rx_tout_thrhd = ((intr_conf->rx_timeout_thresh) & UART_RX_TOUT_THRHD_V); + UART[uart_num]->conf1.rx_tout_en = 1; + } else { + UART[uart_num]->conf1.rx_tout_en = 0; + } + if(intr_conf->intr_enable_mask & UART_RXFIFO_FULL_INT_ENA_M) { + UART[uart_num]->conf1.rxfifo_full_thrhd = intr_conf->rxfifo_full_thresh; + } + if(intr_conf->intr_enable_mask & UART_TXFIFO_EMPTY_INT_ENA_M) { + UART[uart_num]->conf1.txfifo_empty_thrhd = intr_conf->txfifo_empty_intr_thresh; + } + UART[uart_num]->int_ena.val = intr_conf->intr_enable_mask; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_FAIL; +} + +//internal isr handler for default driver code. +static void IRAM_ATTR uart_rx_intr_handler_default(void *param) +{ + uart_obj_t *p_uart = (uart_obj_t*) param; + uint8_t uart_num = p_uart->uart_num; + uart_dev_t* uart_reg = UART[uart_num]; + uint8_t buf_idx = 0; + uint32_t uart_intr_status = UART[uart_num]->int_st.val; + int rx_fifo_len = 0; + uart_event_t uart_event; + portBASE_TYPE HPTaskAwoken = 0; + + while(uart_intr_status != 0x0) { + buf_idx = 0; + uart_event.type = UART_EVENT_MAX; + if(uart_intr_status & UART_TXFIFO_EMPTY_INT_ST_M) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.txfifo_empty = 0; + uart_reg->int_clr.txfifo_empty = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + if(p_uart->tx_waiting_brk) { + continue; + } + //TX semaphore will only be used when tx_buf_size is zero. + if(p_uart->tx_waiting_fifo == true && p_uart->tx_buf_size == 0) { + p_uart->tx_waiting_fifo = false; + xSemaphoreGiveFromISR(p_uart->tx_fifo_sem, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + } + else { + //We don't use TX ring buffer, because the size is zero. + if(p_uart->tx_buf_size == 0) { + continue; + } + int tx_fifo_rem = UART_FIFO_LEN - UART[uart_num]->status.txfifo_cnt; + bool en_tx_flg = false; + //We need to put a loop here, in case all the buffer items are very short. + //That would cause a watch_dog reset because empty interrupt happens so often. + //Although this is a loop in ISR, this loop will execute at most 128 turns. + while(tx_fifo_rem) { + if(p_uart->tx_len_tot == 0 || p_uart->tx_ptr == NULL || p_uart->tx_len_cur == 0) { + size_t size; + p_uart->tx_head = (uart_tx_data_t*) xRingbufferReceiveFromISR(p_uart->tx_ring_buf, &size); + if(p_uart->tx_head) { + //The first item is the data description + //Get the first item to get the data information + if(p_uart->tx_len_tot == 0) { + p_uart->tx_ptr = NULL; + p_uart->tx_len_tot = p_uart->tx_head->tx_data.size; + if(p_uart->tx_head->type == UART_DATA_BREAK) { + p_uart->tx_len_tot = p_uart->tx_head->tx_data.size; + p_uart->tx_brk_flg = 1; + p_uart->tx_brk_len = p_uart->tx_head->tx_data.brk_len; + } + //We have saved the data description from the 1st item, return buffer. + vRingbufferReturnItemFromISR(p_uart->tx_ring_buf, p_uart->tx_head, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + }else if(p_uart->tx_ptr == NULL) { + //Update the TX item pointer, we will need this to return item to buffer. + p_uart->tx_ptr = (uint8_t*) p_uart->tx_head; + en_tx_flg = true; + p_uart->tx_len_cur = size; + } + } + else { + //Can not get data from ring buffer, return; + break; + } + } + if(p_uart->tx_len_tot > 0 && p_uart->tx_ptr && p_uart->tx_len_cur > 0) { + //To fill the TX FIFO. + int send_len = p_uart->tx_len_cur > tx_fifo_rem ? tx_fifo_rem : p_uart->tx_len_cur; + for(buf_idx = 0; buf_idx < send_len; buf_idx++) { + WRITE_PERI_REG(UART_FIFO_AHB_REG(uart_num), *(p_uart->tx_ptr++) & 0xff); + } + p_uart->tx_len_tot -= send_len; + p_uart->tx_len_cur -= send_len; + tx_fifo_rem -= send_len; + if(p_uart->tx_len_cur == 0) { + //Return item to ring buffer. + vRingbufferReturnItemFromISR(p_uart->tx_ring_buf, p_uart->tx_head, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + p_uart->tx_head = NULL; + p_uart->tx_ptr = NULL; + //Sending item done, now we need to send break if there is a record. + //Set TX break signal after FIFO is empty + if(p_uart->tx_brk_flg == 1 && p_uart->tx_len_tot == 0) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.tx_brk_done = 0; + uart_reg->idle_conf.tx_brk_num = p_uart->tx_brk_len; + uart_reg->conf0.txd_brk = 1; + uart_reg->int_clr.tx_brk_done = 1; + uart_reg->int_ena.tx_brk_done = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + p_uart->tx_waiting_brk = 1; + } else { + //enable TX empty interrupt + en_tx_flg = true; + } + } else { + //enable TX empty interrupt + en_tx_flg = true; + } + } + } + if(en_tx_flg) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_clr.txfifo_empty = 1; + uart_reg->int_ena.txfifo_empty = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + } + } + } + else if((uart_intr_status & UART_RXFIFO_TOUT_INT_ST_M) || (uart_intr_status & UART_RXFIFO_FULL_INT_ST_M)) { + if(p_uart->rx_buffer_full_flg == false) { + //Get the buffer from the FIFO + rx_fifo_len = uart_reg->status.rxfifo_cnt; + p_uart->rx_stash_len = rx_fifo_len; + //We have to read out all data in RX FIFO to clear the interrupt signal + while(buf_idx < rx_fifo_len) { + p_uart->rx_data_buf[buf_idx++] = uart_reg->fifo.rw_byte; + } + //After Copying the Data From FIFO ,Clear intr_status + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_clr.rxfifo_tout = 1; + uart_reg->int_clr.rxfifo_full = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_event.type = UART_DATA; + uart_event.size = rx_fifo_len; + //If we fail to push data to ring buffer, we will have to stash the data, and send next time. + //Mainly for applications that uses flow control or small ring buffer. + if(pdFALSE == xRingbufferSendFromISR(p_uart->rx_ring_buf, p_uart->rx_data_buf, p_uart->rx_stash_len, &HPTaskAwoken)) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.rxfifo_full = 0; + uart_reg->int_ena.rxfifo_tout = 0; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + p_uart->rx_buffer_full_flg = true; + uart_event.type = UART_BUFFER_FULL; + } else { + uart_event.type = UART_DATA; + } + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + } else { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.rxfifo_full = 0; + uart_reg->int_ena.rxfifo_tout = 0; + uart_reg->int_clr.val = UART_RXFIFO_FULL_INT_CLR_M | UART_RXFIFO_TOUT_INT_CLR_M; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_event.type = UART_BUFFER_FULL; + } + } else if(uart_intr_status & UART_RXFIFO_OVF_INT_ST_M) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->conf0.rxfifo_rst = 1; + uart_reg->conf0.rxfifo_rst = 0; + uart_reg->int_clr.rxfifo_ovf = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_event.type = UART_FIFO_OVF; + } else if(uart_intr_status & UART_BRK_DET_INT_ST_M) { + uart_reg->int_clr.brk_det = 1; + uart_event.type = UART_BREAK; + } else if(uart_intr_status & UART_PARITY_ERR_INT_ST_M ) { + uart_reg->int_clr.parity_err = 1; + uart_event.type = UART_FRAME_ERR; + } else if(uart_intr_status & UART_FRM_ERR_INT_ST_M) { + uart_reg->int_clr.frm_err = 1; + uart_event.type = UART_PARITY_ERR; + } else if(uart_intr_status & UART_TX_BRK_DONE_INT_ST_M) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->conf0.txd_brk = 0; + uart_reg->int_ena.tx_brk_done = 0; + uart_reg->int_clr.tx_brk_done = 1; + if(p_uart->tx_brk_flg == 1) { + uart_reg->int_ena.txfifo_empty = 1; + } + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + if(p_uart->tx_brk_flg == 1) { + p_uart->tx_brk_flg = 0; + p_uart->tx_waiting_brk = 0; + } else { + xSemaphoreGiveFromISR(p_uart->tx_brk_sem, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + } + } else if(uart_intr_status & UART_TX_BRK_IDLE_DONE_INT_ST_M) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.tx_brk_idle_done = 0; + uart_reg->int_clr.tx_brk_idle_done = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + } else if(uart_intr_status & UART_TX_DONE_INT_ST_M) { + UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]); + uart_reg->int_ena.tx_done = 0; + uart_reg->int_clr.tx_done = 1; + UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]); + xSemaphoreGiveFromISR(p_uart_obj[uart_num]->tx_done_sem, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + } + else { + uart_reg->int_clr.val = uart_intr_status; /*simply clear all other intr status*/ + uart_event.type = UART_EVENT_MAX; + } + + if(uart_event.type != UART_EVENT_MAX && p_uart->xQueueUart) { + xQueueSendFromISR(p_uart->xQueueUart, (void * )&uart_event, &HPTaskAwoken); + if(HPTaskAwoken == pdTRUE) { + portYIELD_FROM_ISR() ; + } + } + uart_intr_status = uart_reg->int_st.val; + } +} + +/**************************************************************/ +esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((p_uart_obj[uart_num]), "uart driver error", ESP_FAIL); + BaseType_t res; + portTickType ticks_end = xTaskGetTickCount() + ticks_to_wait; + //Take tx_mux + res = xSemaphoreTake(p_uart_obj[uart_num]->tx_mux, (portTickType)ticks_to_wait); + if(res == pdFALSE) { + return ESP_ERR_TIMEOUT; + } + ticks_to_wait = ticks_end - xTaskGetTickCount(); + xSemaphoreTake(p_uart_obj[uart_num]->tx_done_sem, 0); + ticks_to_wait = ticks_end - xTaskGetTickCount(); + if(UART[uart_num]->status.txfifo_cnt == 0) { + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + return ESP_OK; + } + uart_enable_intr_mask(uart_num, UART_TX_DONE_INT_ENA_M); + //take 2nd tx_done_sem, wait given from ISR + res = xSemaphoreTake(p_uart_obj[uart_num]->tx_done_sem, (portTickType)ticks_to_wait); + if(res == pdFALSE) { + uart_disable_intr_mask(uart_num, UART_TX_DONE_INT_ENA_M); + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + return ESP_ERR_TIMEOUT; + } + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + return ESP_OK; +} + +static esp_err_t uart_set_break(uart_port_t uart_num, int break_num) +{ + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->idle_conf.tx_brk_num = break_num; + UART[uart_num]->conf0.txd_brk = 1; + UART[uart_num]->int_clr.tx_brk_done = 1; + UART[uart_num]->int_ena.tx_brk_done = 1; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + return ESP_OK; +} + +//Fill UART tx_fifo and return a number, +//This function by itself is not thread-safe, always call from within a muxed section. +static int uart_fill_fifo(uart_port_t uart_num, const char* buffer, uint32_t len) +{ + uint8_t i = 0; + uint8_t tx_fifo_cnt = UART[uart_num]->status.txfifo_cnt; + uint8_t tx_remain_fifo_cnt = (UART_FIFO_LEN - tx_fifo_cnt); + uint8_t copy_cnt = (len >= tx_remain_fifo_cnt ? tx_remain_fifo_cnt : len); + for(i = 0; i < copy_cnt; i++) { + WRITE_PERI_REG(UART_FIFO_AHB_REG(uart_num), buffer[i]); + } + return copy_cnt; +} + +int uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", (-1)); + UART_CHECK((p_uart_obj[uart_num]), "uart driver error", (-1)); + UART_CHECK(buffer, "buffer null", (-1)); + if(len == 0) { + return 0; + } + xSemaphoreTake(p_uart_obj[uart_num]->tx_mux, (portTickType)portMAX_DELAY); + int tx_len = uart_fill_fifo(uart_num, (const char*) buffer, len); + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + return tx_len; +} + +static int uart_tx_all(uart_port_t uart_num, const char* src, size_t size, bool brk_en, int brk_len) +{ + if(size == 0) { + return 0; + } + size_t original_size = size; + + //lock for uart_tx + xSemaphoreTake(p_uart_obj[uart_num]->tx_mux, (portTickType)portMAX_DELAY); + if(p_uart_obj[uart_num]->tx_buf_size > 0) { + int max_size = xRingbufferGetMaxItemSize(p_uart_obj[uart_num]->tx_ring_buf); + int offset = 0; + uart_tx_data_t evt; + evt.tx_data.size = size; + evt.tx_data.brk_len = brk_len; + if(brk_en) { + evt.type = UART_DATA_BREAK; + } else { + evt.type = UART_DATA; + } + xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void*) &evt, sizeof(uart_tx_data_t), portMAX_DELAY); + while(size > 0) { + int send_size = size > max_size / 2 ? max_size / 2 : size; + xRingbufferSend(p_uart_obj[uart_num]->tx_ring_buf, (void*) (src + offset), send_size, portMAX_DELAY); + size -= send_size; + offset += send_size; + } + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + uart_enable_tx_intr(uart_num, 1, UART_EMPTY_THRESH_DEFAULT); + } else { + while(size) { + //semaphore for tx_fifo available + if(pdTRUE == xSemaphoreTake(p_uart_obj[uart_num]->tx_fifo_sem, (portTickType)portMAX_DELAY)) { + size_t sent = uart_fill_fifo(uart_num, (char*) src, size); + if(sent < size) { + p_uart_obj[uart_num]->tx_waiting_fifo = true; + uart_enable_tx_intr(uart_num, 1, UART_EMPTY_THRESH_DEFAULT); + } + size -= sent; + src += sent; + } + } + if(brk_en) { + uart_set_break(uart_num, brk_len); + xSemaphoreTake(p_uart_obj[uart_num]->tx_brk_sem, (portTickType)portMAX_DELAY); + } + xSemaphoreGive(p_uart_obj[uart_num]->tx_fifo_sem); + } + xSemaphoreGive(p_uart_obj[uart_num]->tx_mux); + return original_size; +} + +int uart_write_bytes(uart_port_t uart_num, const char* src, size_t size) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", (-1)); + UART_CHECK((p_uart_obj[uart_num] != NULL), "uart driver error", (-1)); + UART_CHECK(src, "buffer null", (-1)); + return uart_tx_all(uart_num, src, size, 0, 0); +} + +int uart_write_bytes_with_break(uart_port_t uart_num, const char* src, size_t size, int brk_len) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", (-1)); + UART_CHECK((p_uart_obj[uart_num]), "uart driver error", (-1)); + UART_CHECK((size > 0), "uart size error", (-1)); + UART_CHECK((src), "uart data null", (-1)); + UART_CHECK((brk_len > 0 && brk_len < 256), "break_num error", (-1)); + return uart_tx_all(uart_num, src, size, 1, brk_len); +} + +int uart_read_bytes(uart_port_t uart_num, uint8_t* buf, uint32_t length, TickType_t ticks_to_wait) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", (-1)); + UART_CHECK((buf), "uart_num error", (-1)); + UART_CHECK((p_uart_obj[uart_num]), "uart driver error", (-1)); + uint8_t* data = NULL; + size_t size; + size_t copy_len = 0; + int len_tmp; + if(xSemaphoreTake(p_uart_obj[uart_num]->rx_mux,(portTickType)ticks_to_wait) != pdTRUE) { + return -1; + } + while(length) { + if(p_uart_obj[uart_num]->rx_cur_remain == 0) { + data = (uint8_t*) xRingbufferReceive(p_uart_obj[uart_num]->rx_ring_buf, &size, (portTickType) ticks_to_wait); + if(data) { + p_uart_obj[uart_num]->rx_head_ptr = data; + p_uart_obj[uart_num]->rx_ptr = data; + p_uart_obj[uart_num]->rx_cur_remain = size; + } else { + xSemaphoreGive(p_uart_obj[uart_num]->rx_mux); + return copy_len; + } + } + if(p_uart_obj[uart_num]->rx_cur_remain > length) { + len_tmp = length; + } else { + len_tmp = p_uart_obj[uart_num]->rx_cur_remain; + } + memcpy(buf + copy_len, p_uart_obj[uart_num]->rx_ptr, len_tmp); + p_uart_obj[uart_num]->rx_ptr += len_tmp; + p_uart_obj[uart_num]->rx_cur_remain -= len_tmp; + copy_len += len_tmp; + length -= len_tmp; + if(p_uart_obj[uart_num]->rx_cur_remain == 0) { + vRingbufferReturnItem(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_head_ptr); + p_uart_obj[uart_num]->rx_head_ptr = NULL; + p_uart_obj[uart_num]->rx_ptr = NULL; + if(p_uart_obj[uart_num]->rx_buffer_full_flg) { + BaseType_t res = xRingbufferSend(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_data_buf, p_uart_obj[uart_num]->rx_stash_len, 1); + if(res == pdTRUE) { + p_uart_obj[uart_num]->rx_buffer_full_flg = false; + uart_enable_rx_intr(p_uart_obj[uart_num]->uart_num); + } + } + } + } + xSemaphoreGive(p_uart_obj[uart_num]->rx_mux); + return copy_len; +} + +esp_err_t uart_flush(uart_port_t uart_num) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((p_uart_obj[uart_num]), "uart driver error", ESP_FAIL); + uart_obj_t* p_uart = p_uart_obj[uart_num]; + uint8_t* data; + size_t size; + + //rx sem protect the ring buffer read related functions + xSemaphoreTake(p_uart->rx_mux, (portTickType)portMAX_DELAY); + ESP_INTR_DISABLE(p_uart->intr_num); + while(true) { + if(p_uart->rx_head_ptr) { + vRingbufferReturnItem(p_uart->rx_ring_buf, p_uart->rx_head_ptr); + p_uart->rx_ptr = NULL; + p_uart->rx_cur_remain = 0; + p_uart->rx_head_ptr = NULL; + } + data = (uint8_t*) xRingbufferReceive(p_uart->rx_ring_buf, &size, (portTickType) 0); + if(data == NULL) { + break; + } + vRingbufferReturnItem(p_uart->rx_ring_buf, data); + } + p_uart->rx_ptr = NULL; + p_uart->rx_cur_remain = 0; + p_uart->rx_head_ptr = NULL; + ESP_INTR_ENABLE(p_uart->intr_num); + xSemaphoreGive(p_uart->rx_mux); + + if(p_uart->tx_buf_size > 0) { + xSemaphoreTake(p_uart->tx_mux, (portTickType)portMAX_DELAY); + ESP_INTR_DISABLE(p_uart->intr_num); + UART_ENTER_CRITICAL(&uart_spinlock[uart_num]); + UART[uart_num]->int_ena.txfifo_empty = 0; + UART[uart_num]->int_clr.txfifo_empty = 1; + UART_EXIT_CRITICAL(&uart_spinlock[uart_num]); + do { + data = (uint8_t*) xRingbufferReceive(p_uart->tx_ring_buf, &size, (portTickType) 0); + if(data == NULL) { + break; + } + vRingbufferReturnItem(p_uart->rx_ring_buf, data); + } while(1); + p_uart->tx_brk_flg = 0; + p_uart->tx_brk_len = 0; + p_uart->tx_head = NULL; + p_uart->tx_len_cur = 0; + p_uart->tx_len_tot = 0; + p_uart->tx_ptr = NULL; + p_uart->tx_waiting_brk = 0; + p_uart->tx_waiting_fifo = false; + ESP_INTR_ENABLE(p_uart->intr_num); + xSemaphoreGive(p_uart->tx_mux); + } + uart_reset_fifo(uart_num); + return ESP_OK; +} + +esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, int uart_intr_num, void* uart_queue) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + UART_CHECK((rx_buffer_size > 0), "uart rx buffer length error", ESP_FAIL); + if(p_uart_obj[uart_num] == NULL) { + ESP_INTR_DISABLE(uart_intr_num); + p_uart_obj[uart_num] = (uart_obj_t*) malloc(sizeof(uart_obj_t)); + if(p_uart_obj[uart_num] == NULL) { + ESP_LOGE(UART_TAG, "UART driver malloc error"); + return ESP_FAIL; + } + p_uart_obj[uart_num]->uart_num = uart_num; + p_uart_obj[uart_num]->tx_fifo_sem = xSemaphoreCreateBinary(); + xSemaphoreGive(p_uart_obj[uart_num]->tx_fifo_sem); + p_uart_obj[uart_num]->tx_done_sem = xSemaphoreCreateBinary(); + p_uart_obj[uart_num]->tx_brk_sem = xSemaphoreCreateBinary(); + p_uart_obj[uart_num]->tx_mux = xSemaphoreCreateMutex(); + p_uart_obj[uart_num]->rx_mux = xSemaphoreCreateMutex(); + p_uart_obj[uart_num]->intr_num = uart_intr_num; + p_uart_obj[uart_num]->queue_size = queue_size; + p_uart_obj[uart_num]->tx_ptr = NULL; + p_uart_obj[uart_num]->tx_head = NULL; + p_uart_obj[uart_num]->tx_len_tot = 0; + p_uart_obj[uart_num]->tx_brk_flg = 0; + p_uart_obj[uart_num]->tx_brk_len = 0; + p_uart_obj[uart_num]->tx_waiting_brk = 0; + + if(uart_queue) { + p_uart_obj[uart_num]->xQueueUart = xQueueCreate(queue_size, sizeof(uart_event_t)); + *((QueueHandle_t*) uart_queue) = p_uart_obj[uart_num]->xQueueUart; + ESP_LOGI(UART_TAG, "queue free spaces: %d", uxQueueSpacesAvailable(p_uart_obj[uart_num]->xQueueUart)); + } else { + p_uart_obj[uart_num]->xQueueUart = NULL; + } + p_uart_obj[uart_num]->rx_buffer_full_flg = false; + p_uart_obj[uart_num]->tx_waiting_fifo = false; + p_uart_obj[uart_num]->rx_ptr = NULL; + p_uart_obj[uart_num]->rx_cur_remain = 0; + p_uart_obj[uart_num]->rx_head_ptr = NULL; + p_uart_obj[uart_num]->rx_ring_buf = xRingbufferCreate(rx_buffer_size, RINGBUF_TYPE_BYTEBUF); + if(tx_buffer_size > 0) { + p_uart_obj[uart_num]->tx_ring_buf = xRingbufferCreate(tx_buffer_size, RINGBUF_TYPE_NOSPLIT); + p_uart_obj[uart_num]->tx_buf_size = tx_buffer_size; + } else { + p_uart_obj[uart_num]->tx_ring_buf = NULL; + p_uart_obj[uart_num]->tx_buf_size = 0; + } + } else { + ESP_LOGE(UART_TAG, "UART driver already installed"); + return ESP_FAIL; + } + uart_isr_register(uart_num, uart_intr_num, uart_rx_intr_handler_default, p_uart_obj[uart_num]); + uart_intr_config_t uart_intr = { + .intr_enable_mask = UART_RXFIFO_FULL_INT_ENA_M + | UART_RXFIFO_TOUT_INT_ENA_M + | UART_FRM_ERR_INT_ENA_M + | UART_RXFIFO_OVF_INT_ENA_M + | UART_BRK_DET_INT_ENA_M + | UART_PARITY_ERR_INT_ENA_M, + .rxfifo_full_thresh = UART_FULL_THRESH_DEFAULT, + .rx_timeout_thresh = UART_TOUT_THRESH_DEFAULT, + .txfifo_empty_intr_thresh = UART_EMPTY_THRESH_DEFAULT + }; + uart_intr_config(uart_num, &uart_intr); + ESP_INTR_ENABLE(uart_intr_num); + return ESP_OK; +} + +//Make sure no other tasks are still using UART before you call this function +esp_err_t uart_driver_delete(uart_port_t uart_num) +{ + UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); + if(p_uart_obj[uart_num] == NULL) { + ESP_LOGI(UART_TAG, "ALREADY NULL"); + return ESP_OK; + } + ESP_INTR_DISABLE(p_uart_obj[uart_num]->intr_num); + uart_disable_rx_intr(uart_num); + uart_disable_tx_intr(uart_num); + uart_isr_register(uart_num, p_uart_obj[uart_num]->intr_num, NULL, NULL); + + if(p_uart_obj[uart_num]->tx_fifo_sem) { + vSemaphoreDelete(p_uart_obj[uart_num]->tx_fifo_sem); + p_uart_obj[uart_num]->tx_fifo_sem = NULL; + } + if(p_uart_obj[uart_num]->tx_done_sem) { + vSemaphoreDelete(p_uart_obj[uart_num]->tx_done_sem); + p_uart_obj[uart_num]->tx_done_sem = NULL; + } + if(p_uart_obj[uart_num]->tx_brk_sem) { + vSemaphoreDelete(p_uart_obj[uart_num]->tx_brk_sem); + p_uart_obj[uart_num]->tx_brk_sem = NULL; + } + if(p_uart_obj[uart_num]->tx_mux) { + vSemaphoreDelete(p_uart_obj[uart_num]->tx_mux); + p_uart_obj[uart_num]->tx_mux = NULL; + } + if(p_uart_obj[uart_num]->rx_mux) { + vSemaphoreDelete(p_uart_obj[uart_num]->rx_mux); + p_uart_obj[uart_num]->rx_mux = NULL; + } + if(p_uart_obj[uart_num]->xQueueUart) { + vQueueDelete(p_uart_obj[uart_num]->xQueueUart); + p_uart_obj[uart_num]->xQueueUart = NULL; + } + if(p_uart_obj[uart_num]->rx_ring_buf) { + vRingbufferDelete(p_uart_obj[uart_num]->rx_ring_buf); + p_uart_obj[uart_num]->rx_ring_buf = NULL; + } + if(p_uart_obj[uart_num]->tx_ring_buf) { + vRingbufferDelete(p_uart_obj[uart_num]->tx_ring_buf); + p_uart_obj[uart_num]->tx_ring_buf = NULL; + } + + free(p_uart_obj[uart_num]); + p_uart_obj[uart_num] = NULL; + return ESP_OK; +} diff --git a/components/esp32/Kconfig b/components/esp32/Kconfig index 5ae68c368..8300b444c 100644 --- a/components/esp32/Kconfig +++ b/components/esp32/Kconfig @@ -38,6 +38,14 @@ config ESP32_ENABLE_STACK_BT # bool "None" #endchoice +config SW_COEXIST_ENABLE + bool "Software do control of wifi/bt coexisit" + depends on ESP32_ENABLE_STACK_BT && ESP32_ENABLE_STACK_WIFI + default "n" + help + Software do something control of wifi/bt coexist. For some heavy traffic senario, + do sotware coexist, may be better. + config MEMMAP_BT bool depends on ESP32_ENABLE_STACK_BT @@ -319,6 +327,88 @@ config BROWNOUT_DET_RESETDELAY before trying to restart the chip. You can set the delay here. +choice ESP32_TIME_SYSCALL + prompt "Timers used for gettimeofday function" + default ESP32_TIME_SYSCALL_USE_RTC_FRC1 + help + This setting defines which hardware timers are used to + implement 'gettimeofday' and 'time' functions in C library. + + - If only FRC1 timer is used, gettimeofday will provide time at + microsecond resolution. Time will not be preserved when going + into deep sleep mode. + - If both FRC1 and RTC timers are used, timekeeping will + continue in deep sleep. Time will be reported at 1 microsecond + resolution. + - If only RTC timer is used, timekeeping will continue in + deep sleep, but time will be measured at 6.(6) microsecond + resolution. Also the gettimeofday function itself may take + longer to run. + - If no timers are used, gettimeofday and time functions + return -1 and set errno to ENOSYS. + +config ESP32_TIME_SYSCALL_USE_RTC + bool "RTC" +config ESP32_TIME_SYSCALL_USE_RTC_FRC1 + bool "RTC and FRC1" +config ESP32_TIME_SYSCALL_USE_FRC1 + bool "FRC1" +config ESP32_TIME_SYSCALL_USE_NONE + bool "None" +endchoice +choice ESP32_RTC_CLOCK_SOURCE + prompt "RTC clock source" + default ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC + help + Choose which clock is used as RTC clock source. + The only available option for now is to use internal + 150kHz RC oscillator. + +config ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC + bool "Internal RC" +config ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL + bool "External 32kHz crystal" + depends on DOCUMENTATION_FOR_RTC_CNTL +endchoice + + +config ESP32_PHY_AUTO_INIT + bool "Initialize PHY in startup code" + default y + help + If enabled, PHY will be initialized in startup code, before + app_main function runs. + If this is undesired, disable this option and call esp_phy_init + from the application before enabling WiFi or BT. + + If this option is enabled, startup code will also initialize + NVS prior to initializing PHY. + + If unsure, choose 'y'. + +config ESP32_PHY_INIT_DATA_IN_PARTITION + bool "Use a partition to store PHY init data" + default n + help + If enabled, PHY init data will be loaded from a partition. + When using a custom partition table, make sure that PHY data + partition is included (type: 'data', subtype: 'phy'). + With default partition tables, this is done automatically. + If PHY init data is stored in a partition, it has to be flashed there, + otherwise runtime error will occur. + + If this option is not enabled, PHY init data will be embedded + into the application binary. + + If unsure, choose 'n'. + +config ESP32_PHY_MAX_TX_POWER + int "Max TX power (dBm)" + range 0 20 + default 20 + help + Set maximum transmit power. Actual transmit power for high + data rates may be lower than this setting. endmenu diff --git a/components/esp32/Makefile.projbuild b/components/esp32/Makefile.projbuild new file mode 100644 index 000000000..01f8d03c5 --- /dev/null +++ b/components/esp32/Makefile.projbuild @@ -0,0 +1,32 @@ +ifdef CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION + +PHY_INIT_DATA_OBJ = $(BUILD_DIR_BASE)/phy_init_data.o +PHY_INIT_DATA_BIN = $(BUILD_DIR_BASE)/phy_init_data.bin + +# Command to flash PHY init data partition +PHY_INIT_DATA_FLASH_CMD = $(ESPTOOLPY_SERIAL) write_flash $(CONFIG_PHY_DATA_OFFSET) $(PHY_INIT_DATA_BIN) +ESPTOOL_ALL_FLASH_ARGS += $(CONFIG_PHY_DATA_OFFSET) $(PHY_INIT_DATA_BIN) + +ESP32_COMPONENT_PATH := $(COMPONENT_PATH) + +$(PHY_INIT_DATA_OBJ): $(ESP32_COMPONENT_PATH)/phy_init_data.h $(BUILD_DIR_BASE)/include/sdkconfig.h + $(summary) CC $(notdir $@) + printf "#include \"phy_init_data.h\"\n" | $(CC) -I $(BUILD_DIR_BASE)/include -I $(ESP32_COMPONENT_PATH) -I $(ESP32_COMPONENT_PATH)/include -c -o $@ -xc - + +$(PHY_INIT_DATA_BIN): $(PHY_INIT_DATA_OBJ) + $(summary) BIN $(notdir $@) + $(OBJCOPY) -O binary $< $@ + +phy_init_data: $(PHY_INIT_DATA_BIN) + +phy_init_data-flash: $(BUILD_DIR_BASE)/phy_init_data.bin + @echo "Flashing PHY init data..." + $(PHY_INIT_DATA_FLASH_CMD) + +phy_init_data-clean: + rm -f $(PHY_INIT_DATA_BIN) $(PHY_INIT_DATA_OBJ) + +all: phy_init_data +flash: phy_init_data + +endif # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION diff --git a/components/esp32/component.mk b/components/esp32/component.mk index 249d533fa..8059d157c 100644 --- a/components/esp32/component.mk +++ b/components/esp32/component.mk @@ -1,33 +1,23 @@ # # Component Makefile # -# This Makefile should, at the very least, just include $(IDF_PATH)/make/component_common.mk. By default, -# this will take the sources in this directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the esp-idf build system document if you need to do this. -# --include include/config/auto.conf COMPONENT_SRCDIRS := . hwcrypto -LIBS := crypto core net80211 phy rtc pp wpa smartconfig coexist +LIBS := core net80211 phy rtc pp wpa smartconfig coexist wps LINKER_SCRIPTS += -T esp32_out.ld -T esp32.common.ld -T esp32.rom.ld -T esp32.peripherals.ld COMPONENT_ADD_LDFLAGS := -lesp32 \ - $(abspath libhal.a) \ - -L$(abspath lib) \ + $(COMPONENT_PATH)/libhal.a \ + -L$(COMPONENT_PATH)/lib \ $(addprefix -l,$(LIBS)) \ - -L $(abspath ld) \ + -L $(COMPONENT_PATH)/ld \ $(LINKER_SCRIPTS) -include $(IDF_PATH)/make/component_common.mk - ALL_LIB_FILES := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS)) -# automatically trigger a git submodule update -# if any libraries are missing -$(eval $(call SubmoduleCheck,$(ALL_LIB_FILES),$(COMPONENT_PATH)/lib)) +COMPONENT_SUBMODULES += lib # this is a hack to make sure the app is re-linked if the binary # libraries change or are updated. If they change, the main esp32 @@ -44,8 +34,6 @@ $(COMPONENT_LIBRARY): $(ALL_LIB_FILES) # saves us from having to add the target to a Makefile.projbuild $(COMPONENT_LIBRARY): esp32_out.ld -# .. is BUILD_DIR_BASE here, as component makefiles -# are evaluated with CWD=component build dir esp32_out.ld: $(COMPONENT_PATH)/ld/esp32.ld ../include/sdkconfig.h $(CC) -I ../include -C -P -x c -E $< -o $@ diff --git a/components/esp32/cpu_freq.c b/components/esp32/cpu_freq.c index 327ea6386..c9d310459 100644 --- a/components/esp32/cpu_freq.c +++ b/components/esp32/cpu_freq.c @@ -33,8 +33,8 @@ typedef enum{ extern void phy_get_romfunc_addr(); // TODO: these functions need to be moved from librtc to ESP-IDF -extern void rtc_init_lite(); -extern void rtc_set_cpu_freq(xtal_freq_t xtal_freq, cpu_freq_t cpu_freq); +extern void rtc_init_lite(xtal_freq_t xtal_freq); +extern void rtc_set_cpu_freq(cpu_freq_t cpu_freq); /* * This function is not exposed as an API at this point, @@ -52,7 +52,7 @@ void esp_set_cpu_freq(void) // wait uart tx finish, otherwise some uart output will be lost uart_tx_wait_idle(0); - rtc_init_lite(); + rtc_init_lite(XTAL_AUTO); cpu_freq_t freq = CPU_80M; switch(freq_mhz) { case 240: @@ -73,7 +73,7 @@ void esp_set_cpu_freq(void) // wait uart tx finish, otherwise some uart output will be lost uart_tx_wait_idle(0); - rtc_set_cpu_freq(XTAL_AUTO, freq); + rtc_set_cpu_freq(freq); ets_update_cpu_frequency(freq_mhz); } diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index d94a4e6e7..c4b9a7e24 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -19,6 +19,8 @@ #include "rom/ets_sys.h" #include "rom/uart.h" +#include "rom/rtc.h" +#include "rom/cache.h" #include "soc/cpu.h" #include "soc/dport_reg.h" @@ -48,6 +50,8 @@ #include "esp_brownout.h" #include "esp_int_wdt.h" #include "esp_task_wdt.h" +#include "esp_phy_init.h" +#include "esp_coexist.h" #include "trax.h" void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))); @@ -60,11 +64,14 @@ static bool app_cpu_started = false; #endif //!CONFIG_FREERTOS_UNICORE static void do_global_ctors(void); +static void do_phy_init(); static void main_task(void* args); extern void app_main(void); extern int _bss_start; extern int _bss_end; +extern int _rtc_bss_start; +extern int _rtc_bss_end; extern int _init_start; extern void (*__init_array_start)(void); extern void (*__init_array_end)(void); @@ -95,6 +102,11 @@ void IRAM_ATTR call_start_cpu0() memset(&_bss_start, 0, (&_bss_end - &_bss_start) * sizeof(_bss_start)); + /* Unless waking from deep sleep (implying RTC memory is intact), clear RTC bss */ + if (rtc_get_reset_reason(0) != DEEPSLEEP_RESET) { + memset(&_rtc_bss_start, 0, (&_rtc_bss_end - &_rtc_bss_start) * sizeof(_rtc_bss_start)); + } + // Initialize heap allocator heap_alloc_caps_init(); @@ -102,7 +114,9 @@ void IRAM_ATTR call_start_cpu0() #if !CONFIG_FREERTOS_UNICORE ESP_EARLY_LOGI(TAG, "Starting app cpu, entry point is %p", call_start_cpu1); - + //Flush and enable icache for APP CPU + Cache_Flush(1); + Cache_Read_Enable(1); //Un-stall the app cpu; the panic handler may have stalled it. CLEAR_PERI_REG_MASK(RTC_CNTL_SW_CPU_STALL_REG, RTC_CNTL_SW_STALL_APPCPU_C1_M); CLEAR_PERI_REG_MASK(RTC_CNTL_OPTIONS0_REG, RTC_CNTL_SW_STALL_APPCPU_C0_M); @@ -161,13 +175,14 @@ void start_cpu0_default(void) #if CONFIG_TASK_WDT esp_task_wdt_init(); #endif - esp_setup_syscalls(); + esp_setup_syscall_table(); + esp_setup_time_syscalls(); esp_vfs_dev_uart_register(); esp_reent_init(_GLOBAL_REENT); const char* default_uart_dev = "/dev/uart/0"; + _GLOBAL_REENT->_stdin = fopen(default_uart_dev, "r"); _GLOBAL_REENT->_stdout = fopen(default_uart_dev, "w"); _GLOBAL_REENT->_stderr = fopen(default_uart_dev, "w"); - _GLOBAL_REENT->_stdin = fopen(default_uart_dev, "r"); do_global_ctors(); #if !CONFIG_FREERTOS_UNICORE esp_crosscore_int_init(); @@ -175,6 +190,17 @@ void start_cpu0_default(void) esp_ipc_init(); spi_flash_init(); +#if CONFIG_ESP32_PHY_AUTO_INIT + nvs_flash_init(); + do_phy_init(); +#endif + +#if CONFIG_SW_COEXIST_ENABLE + if (coex_init() == ESP_OK) { + coexist_set_enable(true); + } +#endif + xTaskCreatePinnedToCore(&main_task, "main", ESP_TASK_MAIN_STACK, NULL, ESP_TASK_MAIN_PRIO, NULL, 0); @@ -212,3 +238,36 @@ static void main_task(void* args) vTaskDelete(NULL); } +static void do_phy_init() +{ + esp_phy_calibration_mode_t calibration_mode = PHY_RF_CAL_PARTIAL; + if (rtc_get_reset_reason(0) == DEEPSLEEP_RESET) { + calibration_mode = PHY_RF_CAL_NONE; + } + const esp_phy_init_data_t* init_data = esp_phy_get_init_data(); + if (init_data == NULL) { + ESP_LOGE(TAG, "failed to obtain PHY init data"); + abort(); + } + esp_phy_calibration_data_t* cal_data = + (esp_phy_calibration_data_t*) calloc(sizeof(esp_phy_calibration_data_t), 1); + if (cal_data == NULL) { + ESP_LOGE(TAG, "failed to allocate memory for RF calibration data"); + abort(); + } + esp_err_t err = esp_phy_load_cal_data_from_nvs(cal_data); + if (err != ESP_OK) { + ESP_LOGW(TAG, "failed to load RF calibration data, falling back to full calibration"); + calibration_mode = PHY_RF_CAL_FULL; + } + + esp_phy_init(init_data, calibration_mode, cal_data); + + if (calibration_mode != PHY_RF_CAL_NONE) { + err = esp_phy_store_cal_data_to_nvs(cal_data); + } else { + err = ESP_OK; + } + esp_phy_release_init_data(init_data); + free(cal_data); // PHY maintains a copy of calibration data, so we can free this +} diff --git a/components/esp32/crosscore_int.c b/components/esp32/crosscore_int.c index 60a45da40..60f972a2a 100644 --- a/components/esp32/crosscore_int.c +++ b/components/esp32/crosscore_int.c @@ -45,14 +45,9 @@ the ISR will cause it to switch _away_ from it. portYIELD_FROM_ISR will probably */ static void esp_crosscore_isr(void *arg) { uint32_t myReasonVal; -#if 0 //A pointer to the correct reason array item is passed to this ISR. volatile uint32_t *myReason=arg; -#else - //The previous line does not work yet, the interrupt code needs work to understand two separate interrupt and argument - //tables... this is a valid but slightly less optimal replacement. - volatile uint32_t *myReason=&reason[xPortGetCoreID()]; -#endif + //Clear the interrupt first. if (xPortGetCoreID()==0) { WRITE_PERI_REG(DPORT_CPU_INTR_FROM_CPU_0_REG, 0); diff --git a/components/esp32/deepsleep.c b/components/esp32/deepsleep.c index 61268bce6..742ff8cf4 100644 --- a/components/esp32/deepsleep.c +++ b/components/esp32/deepsleep.c @@ -40,8 +40,7 @@ void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) } void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void) { - // - //mmu_init(0); + /* Clear MMU for CPU 0 */ REG_SET_BIT(DPORT_PRO_CACHE_CTRL1_REG, DPORT_PRO_CACHE_MMU_IA_CLR); REG_CLR_BIT(DPORT_PRO_CACHE_CTRL1_REG, DPORT_PRO_CACHE_MMU_IA_CLR); } diff --git a/components/esp32/event_default_handlers.c b/components/esp32/event_default_handlers.c index 37ba63404..d3bf57fc8 100644 --- a/components/esp32/event_default_handlers.c +++ b/components/esp32/event_default_handlers.c @@ -18,9 +18,11 @@ #include "esp_err.h" #include "esp_wifi.h" +#include "esp_wifi_internal.h" #include "esp_event.h" #include "esp_event_loop.h" #include "esp_task.h" +#include "rom/ets_sys.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -66,6 +68,10 @@ static system_event_handle_t g_system_event_handle_table[] = { {SYSTEM_EVENT_STA_DISCONNECTED, system_event_sta_disconnected_handle_default}, {SYSTEM_EVENT_STA_AUTHMODE_CHANGE, NULL}, {SYSTEM_EVENT_STA_GOT_IP, system_event_sta_got_ip_default}, + {SYSTEM_EVENT_STA_WPS_ER_SUCCESS, NULL}, + {SYSTEM_EVENT_STA_WPS_ER_FAILED, NULL}, + {SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, NULL}, + {SYSTEM_EVENT_STA_WPS_ER_PIN, NULL}, {SYSTEM_EVENT_AP_START, system_event_ap_start_handle_default}, {SYSTEM_EVENT_AP_STOP, system_event_ap_stop_handle_default}, {SYSTEM_EVENT_AP_STACONNECTED, NULL}, @@ -76,8 +82,7 @@ static system_event_handle_t g_system_event_handle_table[] = { static esp_err_t system_event_sta_got_ip_default(system_event_t *event) { - extern esp_err_t esp_wifi_set_sta_ip(void); - WIFI_API_CALL_CHECK("esp_wifi_set_sta_ip", esp_wifi_set_sta_ip(), ESP_OK); + WIFI_API_CALL_CHECK("esp_wifi_internal_set_sta_ip", esp_wifi_internal_set_sta_ip(), ESP_OK); ESP_LOGI(TAG, "ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR, IP2STR(&event->event_info.got_ip.ip_info.ip), @@ -92,7 +97,7 @@ esp_err_t system_event_ap_start_handle_default(system_event_t *event) tcpip_adapter_ip_info_t ap_ip; uint8_t ap_mac[6]; - WIFI_API_CALL_CHECK("esp_wifi_reg_rxcb", esp_wifi_reg_rxcb(WIFI_IF_AP, (wifi_rxcb_t)tcpip_adapter_ap_input), ESP_OK); + WIFI_API_CALL_CHECK("esp_wifi_internal_reg_rxcb", esp_wifi_internal_reg_rxcb(WIFI_IF_AP, (wifi_rxcb_t)tcpip_adapter_ap_input), ESP_OK); WIFI_API_CALL_CHECK("esp_wifi_mac_get", esp_wifi_get_mac(WIFI_IF_AP, ap_mac), ESP_OK); tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ap_ip); @@ -103,7 +108,7 @@ esp_err_t system_event_ap_start_handle_default(system_event_t *event) esp_err_t system_event_ap_stop_handle_default(system_event_t *event) { - WIFI_API_CALL_CHECK("esp_wifi_reg_rxcb", esp_wifi_reg_rxcb(WIFI_IF_AP, NULL), ESP_OK); + WIFI_API_CALL_CHECK("esp_wifi_internal_reg_rxcb", esp_wifi_internal_reg_rxcb(WIFI_IF_AP, NULL), ESP_OK); tcpip_adapter_stop(TCPIP_ADAPTER_IF_AP); @@ -133,7 +138,7 @@ esp_err_t system_event_sta_connected_handle_default(system_event_t *event) { tcpip_adapter_dhcp_status_t status; - WIFI_API_CALL_CHECK("esp_wifi_reg_rxcb", esp_wifi_reg_rxcb(WIFI_IF_STA, (wifi_rxcb_t)tcpip_adapter_sta_input), ESP_OK); + WIFI_API_CALL_CHECK("esp_wifi_internal_reg_rxcb", esp_wifi_internal_reg_rxcb(WIFI_IF_STA, (wifi_rxcb_t)tcpip_adapter_sta_input), ESP_OK); tcpip_adapter_up(TCPIP_ADAPTER_IF_STA); @@ -165,7 +170,7 @@ esp_err_t system_event_sta_connected_handle_default(system_event_t *event) esp_err_t system_event_sta_disconnected_handle_default(system_event_t *event) { tcpip_adapter_down(TCPIP_ADAPTER_IF_STA); - WIFI_API_CALL_CHECK("esp_wifi_reg_rxcb", esp_wifi_reg_rxcb(WIFI_IF_STA, NULL), ESP_OK); + WIFI_API_CALL_CHECK("esp_wifi_internal_reg_rxcb", esp_wifi_internal_reg_rxcb(WIFI_IF_STA, NULL), ESP_OK); return ESP_OK; } @@ -196,16 +201,14 @@ static esp_err_t esp_system_event_debug(system_event_t *event) } case SYSTEM_EVENT_STA_CONNECTED: { system_event_sta_connected_t *connected = &event->event_info.connected; - ESP_LOGD(TAG, "SYSTEM_EVENT_STA_CONNECTED, ssid:%s, ssid_len:%d, bssid:%02x:%02x:%02x:%02x:%02x:%02x, channel:%d, authmode:%d", \ - connected->ssid, connected->ssid_len, connected->bssid[0], connected->bssid[0], connected->bssid[1], \ - connected->bssid[3], connected->bssid[4], connected->bssid[5], connected->channel, connected->authmode); + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_CONNECTED, ssid:%s, ssid_len:%d, bssid:" MACSTR ", channel:%d, authmode:%d", \ + connected->ssid, connected->ssid_len, MAC2STR(connected->bssid), connected->channel, connected->authmode); break; } case SYSTEM_EVENT_STA_DISCONNECTED: { system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected; - ESP_LOGD(TAG, "SYSTEM_EVENT_STA_DISCONNECTED, ssid:%s, ssid_len:%d, bssid:%02x:%02x:%02x:%02x:%02x:%02x, reason:%d", \ - disconnected->ssid, disconnected->ssid_len, disconnected->bssid[0], disconnected->bssid[0], disconnected->bssid[1], \ - disconnected->bssid[3], disconnected->bssid[4], disconnected->bssid[5], disconnected->reason); + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_DISCONNECTED, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d", \ + disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason); break; } case SYSTEM_EVENT_STA_AUTHMODE_CHANGE: { @@ -221,6 +224,22 @@ static esp_err_t esp_system_event_debug(system_event_t *event) IP2STR(&got_ip->ip_info.gw)); break; } + case SYSTEM_EVENT_STA_WPS_ER_SUCCESS: { + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_SUCCESS"); + break; + } + case SYSTEM_EVENT_STA_WPS_ER_FAILED: { + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_FAILED"); + break; + } + case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT: { + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_TIMEOUT"); + break; + } + case SYSTEM_EVENT_STA_WPS_ER_PIN: { + ESP_LOGD(TAG, "SYSTEM_EVENT_STA_WPS_ER_PIN"); + break; + } case SYSTEM_EVENT_AP_START: { ESP_LOGD(TAG, "SYSTEM_EVENT_AP_START"); break; @@ -231,23 +250,21 @@ static esp_err_t esp_system_event_debug(system_event_t *event) } case SYSTEM_EVENT_AP_STACONNECTED: { system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected; - ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STACONNECTED, mac:%02x:%02x:%02x:%02x:%02x:%02x, aid:%d", \ - staconnected->mac[0], staconnected->mac[0], staconnected->mac[1], \ - staconnected->mac[3], staconnected->mac[4], staconnected->mac[5], staconnected->aid); + ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STACONNECTED, mac:" MACSTR ", aid:%d", \ + MAC2STR(staconnected->mac), staconnected->aid); break; } case SYSTEM_EVENT_AP_STADISCONNECTED: { system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected; - ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STADISCONNECTED, mac:%02x:%02x:%02x:%02x:%02x:%02x, aid:%d", \ - stadisconnected->mac[0], stadisconnected->mac[0], stadisconnected->mac[1], \ - stadisconnected->mac[3], stadisconnected->mac[4], stadisconnected->mac[5], stadisconnected->aid); + ESP_LOGD(TAG, "SYSTEM_EVENT_AP_STADISCONNECTED, mac:" MACSTR ", aid:%d", \ + MAC2STR(stadisconnected->mac), stadisconnected->aid); break; } case SYSTEM_EVENT_AP_PROBEREQRECVED: { system_event_ap_probe_req_rx_t *ap_probereqrecved = &event->event_info.ap_probereqrecved; - ESP_LOGD(TAG, "SYSTEM_EVENT_AP_PROBEREQRECVED, rssi:%d, mac:%02x:%02x:%02x:%02x:%02x:%02x", \ - ap_probereqrecved->rssi, ap_probereqrecved->mac[0], ap_probereqrecved->mac[0], ap_probereqrecved->mac[1], \ - ap_probereqrecved->mac[3], ap_probereqrecved->mac[4], ap_probereqrecved->mac[5]); + ESP_LOGD(TAG, "SYSTEM_EVENT_AP_PROBEREQRECVED, rssi:%d, mac:" MACSTR, \ + ap_probereqrecved->rssi, \ + MAC2STR(ap_probereqrecved->mac)); break; } default: { diff --git a/components/esp32/freertos_hooks.c b/components/esp32/freertos_hooks.c new file mode 100644 index 000000000..d59a20363 --- /dev/null +++ b/components/esp32/freertos_hooks.c @@ -0,0 +1,96 @@ +// Copyright 2015-2016 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. + + +#include +#include +#include +#include "esp_attr.h" +#include "esp_freertos_hooks.h" + +//We use just a static array here because it's not expected many components will need +//an idle or tick hook. +#define MAX_HOOKS 8 + +static esp_freertos_idle_cb_t idle_cb[MAX_HOOKS]={0}; +static esp_freertos_tick_cb_t tick_cb[MAX_HOOKS]={0}; + +void IRAM_ATTR esp_vApplicationTickHook() +{ + int n; + for (n=0; n + #include -extern "C" unsigned long crc32_le(unsigned long crc_in, unsigned char const* data, unsigned int length) -{ - uint32_t i; - bool bit; - uint8_t c; - uint32_t crc = (uint32_t) crc_in; +#ifdef __cplusplus +extern "C" { +#endif - while (length--) { - c = *data++; - for (i = 0x80; i > 0; i >>= 1) { - bit = crc & 0x80000000; - if (c & i) { - bit = !bit; - } - crc <<= 1; - if (bit) { - crc ^= 0x04c11db7; - } - } - } - return crc; +/** + * @brief Init software coexist + * + * @return Init ok or failed. + */ +esp_err_t coex_init(void); + +/** + * @brief Get software coexist enable or not + * + * @return software coexist enable status. + */ +bool coexist_get_enable(void); + +/** + * @brief Set software coexist enable or not + * + * @param enable software coexist or disable it + * + * @return Void. + */ +void coexist_set_enable(bool enable); + +#ifdef __cplusplus } +#endif diff --git a/components/esp32/include/esp_deepsleep.h b/components/esp32/include/esp_deepsleep.h index 3683a8eea..59b312918 100644 --- a/components/esp32/include/esp_deepsleep.h +++ b/components/esp32/include/esp_deepsleep.h @@ -54,37 +54,7 @@ void system_deep_sleep(uint64_t time_in_us); * to run code immediately when the chip wakes from * sleep. * - * For example: - * @code - * void RTC_IRAM_ATTR esp_wake_deep_sleep(void) { - * esp_default_wake_deep_sleep(); - * // Add additional functionality here - * } - * - * (Implementing this function is not required for normal operation, - * in the usual case your app will start normally when waking from - * deep sleep.) - * - * esp_wake_deep_sleep() functionality is limited: - * - * - Runs immediately on wake, so most of the SoC is freshly reset - - * flash is unmapped and hardware is otherwise uninitialised. - * - * - Can only call functions implemented in ROM, or marked RTC_IRAM_ATTR. - * - * - Static variables marked RTC_DATA_ATTR will have initial values on - * cold boot, and maintain these values between sleep/wake cycles. - * - * - Read-only data should be marked RTC_RODATA_ATTR. Strings must be - * declared as variables also using RTC_RODATA_ATTR, like this: - * RTC_RODATA_ATTR const char message[] = "Hello from very early boot!\n"; - * - * - Any other static memory will not be initialised (either to zero, - * or to any predefined value). - * - * - * - If you implement your own stub, the first call the stub makes - should be to esp_default_wake_deep_sleep(). + * See docs/deep-sleep-stub.rst for details. */ void esp_wake_deep_sleep(void); @@ -115,9 +85,7 @@ esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void); /* The default esp-idf-provided esp_wake_deep_sleep() stub. - If you replace esp_wake_deep_sleep() in your program, or use - esp_set_deep_sleep_wake_stub(), then it is recommended you call - esp_default_wake_deep_sleep() as the first function in your stub. + See docs/deep-sleep-stub.rst for details. */ void esp_default_wake_deep_sleep(void); diff --git a/components/esp32/include/esp_err.h b/components/esp32/include/esp_err.h index af9d2ec33..a1f4b8f35 100644 --- a/components/esp32/include/esp_err.h +++ b/components/esp32/include/esp_err.h @@ -33,6 +33,11 @@ typedef int32_t esp_err_t; #define ESP_ERR_INVALID_STATE 0x103 #define ESP_ERR_INVALID_SIZE 0x104 #define ESP_ERR_NOT_FOUND 0x105 +#define ESP_ERR_NOT_SUPPORTED 0x106 +#define ESP_ERR_TIMEOUT 0x107 + + +#define ESP_ERR_WIFI_BASE 0x3000 /*!< Starting number of WiFi error codes */ /** * Macro which can be used to check the error code, diff --git a/components/esp32/include/esp_event.h b/components/esp32/include/esp_event.h index 0ca4ca90b..06e35d6ad 100644 --- a/components/esp32/include/esp_event.h +++ b/components/esp32/include/esp_event.h @@ -35,11 +35,16 @@ typedef enum { SYSTEM_EVENT_STA_DISCONNECTED, /**< ESP32 station disconnected from AP */ SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by ESP32 station changed */ SYSTEM_EVENT_STA_GOT_IP, /**< ESP32 station got IP from connected AP */ + SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /**< ESP32 station wps succeeds in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_FAILED, /**< ESP32 station wps fails in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /**< ESP32 station wps timeout in enrollee mode */ + SYSTEM_EVENT_STA_WPS_ER_PIN, /**< ESP32 station wps pin code in enrollee mode */ SYSTEM_EVENT_AP_START, /**< ESP32 soft-AP start */ SYSTEM_EVENT_AP_STOP, /**< ESP32 soft-AP stop */ SYSTEM_EVENT_AP_STACONNECTED, /**< a station connected to ESP32 soft-AP */ SYSTEM_EVENT_AP_STADISCONNECTED, /**< a station disconnected from ESP32 soft-AP */ SYSTEM_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */ + SYSTEM_EVENT_AP_STA_GOT_IP6, /**< ESP32 station or ap interface v6IP addr is preferred */ SYSTEM_EVENT_MAX } system_event_id_t; @@ -73,6 +78,14 @@ typedef struct { tcpip_adapter_ip_info_t ip_info; } system_event_sta_got_ip_t; +typedef struct { + uint8_t pin_code[8]; /**< PIN code of station in enrollee mode */ +} system_event_sta_wps_er_pin_t; + +typedef struct { + tcpip_adapter_ip6_info_t ip6_info; +} system_event_ap_sta_got_ip6_t; + typedef struct { uint8_t mac[6]; /**< MAC address of the station connected to ESP32 soft-AP */ uint8_t aid; /**< the aid that ESP32 soft-AP gives to the station connected to */ @@ -94,9 +107,11 @@ typedef union { system_event_sta_scan_done_t scan_done; /**< ESP32 station scan (APs) done */ system_event_sta_authmode_change_t auth_change; /**< the auth mode of AP ESP32 station connected to changed */ system_event_sta_got_ip_t got_ip; /**< ESP32 station got IP */ + system_event_sta_wps_er_pin_t sta_er_pin; /**< ESP32 station WPS enrollee mode PIN code received */ system_event_ap_staconnected_t sta_connected; /**< a station connected to ESP32 soft-AP */ system_event_ap_stadisconnected_t sta_disconnected; /**< a station disconnected to ESP32 soft-AP */ system_event_ap_probe_req_rx_t ap_probereqrecved; /**< ESP32 soft-AP receive probe request packet */ + system_event_ap_sta_got_ip6_t got_ip6; /**< ESP32 station or ap ipv6 addr state change to preferred */ } system_event_info_t; typedef struct { diff --git a/components/esp32/include/esp_flash_data_types.h b/components/esp32/include/esp_flash_data_types.h index 4bf886c84..783f2c59b 100644 --- a/components/esp32/include/esp_flash_data_types.h +++ b/components/esp32/include/esp_flash_data_types.h @@ -21,57 +21,9 @@ extern "C" { #endif -#define ESP_PARTITION_TABLE_ADDR 0x4000 +#define ESP_PARTITION_TABLE_ADDR 0x8000 #define ESP_PARTITION_MAGIC 0x50AA -/* SPI flash mode, used in esp_image_header_t */ -typedef enum { - ESP_IMAGE_SPI_MODE_QIO, - ESP_IMAGE_SPI_MODE_QOUT, - ESP_IMAGE_SPI_MODE_DIO, - ESP_IMAGE_SPI_MODE_DOUT, - ESP_IMAGE_SPI_MODE_FAST_READ, - ESP_IMAGE_SPI_MODE_SLOW_READ -} esp_image_spi_mode_t; - -/* SPI flash clock frequency */ -enum { - ESP_IMAGE_SPI_SPEED_40M, - ESP_IMAGE_SPI_SPEED_26M, - ESP_IMAGE_SPI_SPEED_20M, - ESP_IMAGE_SPI_SPEED_80M = 0xF -} esp_image_spi_freq_t; - -/* Supported SPI flash sizes */ -typedef enum { - ESP_IMAGE_FLASH_SIZE_1MB = 0, - ESP_IMAGE_FLASH_SIZE_2MB, - ESP_IMAGE_FLASH_SIZE_4MB, - ESP_IMAGE_FLASH_SIZE_8MB, - ESP_IMAGE_FLASH_SIZE_16MB, - ESP_IMAGE_FLASH_SIZE_MAX -} esp_image_flash_size_t; - -/* Main header of binary image */ -typedef struct { - uint8_t magic; - uint8_t blocks; - uint8_t spi_mode; /* flash read mode (esp_image_spi_mode_t as uint8_t) */ - uint8_t spi_speed: 4; /* flash frequency (esp_image_spi_freq_t as uint8_t) */ - uint8_t spi_size: 4; /* flash chip size (esp_image_flash_size_t as uint8_t) */ - uint32_t entry_addr; - uint8_t encrypt_flag; /* encrypt flag */ - uint8_t secure_boot_flag; /* secure boot flag */ - uint8_t extra_header[14]; /* ESP32 additional header, unused by second bootloader */ -} esp_image_header_t; - -/* Header of binary image segment */ -typedef struct { - uint32_t load_addr; - uint32_t data_len; -} esp_image_section_header_t; - - /* OTA selection structure (two copies in the OTA data partition.) Size of 32 bytes is friendly to flash encryption */ typedef struct { diff --git a/components/esp32/include/esp_freertos_hooks.h b/components/esp32/include/esp_freertos_hooks.h new file mode 100644 index 000000000..45a164972 --- /dev/null +++ b/components/esp32/include/esp_freertos_hooks.h @@ -0,0 +1,83 @@ +// Copyright 2015-2016 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_FREERTOS_HOOKS_H__ +#define __ESP_FREERTOS_HOOKS_H__ + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + Definitions for the tickhook and idlehook callbacks +*/ +typedef bool (*esp_freertos_idle_cb_t)(); +typedef void (*esp_freertos_tick_cb_t)(); + +/** + * @brief Register a callback to be called on the freertos idle hook + * The callback should return true if it's okay for the core to + * sleep until an interrupt (or FreeRTOS tick) happens and false + * if it should be called again as fast as possible. + * + * @warning Idle callbacks MUST NOT, UNDER ANY CIRCUMSTANCES, CALL + * A FUNCTION THAT MIGHT BLOCK. + * + * @param esp_freertos_idle_cb_t new_idle_cb : Callback to be called + * + * @return ESP_OK : Callback registered + * @return ESP_ERR_NO_MEM : No more space to register hook + */ +esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb); + +/** + * @brief Register a callback to be called on the freertos tick hook + * + * @param esp_freertos_tick_cb_t new_tick_cb : Callback to be called + * + * @return ESP_OK : Callback registered + * @return ESP_ERR_NO_MEM : No more space to register hook + */ +esp_err_t esp_register_freertos_tick_hook(esp_freertos_tick_cb_t tick_cb); + + +/** + * @brief Unregister an idle callback registered earlier + * + * @param esp_freertos_idle_cb_t new_idle_cb : Callback to be unregistered + * + * @return void + */ +void esp_deregister_freertos_idle_hook(esp_freertos_idle_cb_t old_idle_cb); + + +/** + * @brief Unregister a tick callback registered earlier + * + * @param esp_freertos_idle_cb_t new_idle_cb : Callback to be unregistered + * + * @return void + */ +void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb); + +#ifdef __cplusplus +} +#endif + + +#endif \ No newline at end of file diff --git a/components/esp32/include/esp_int_wdt.h b/components/esp32/include/esp_int_wdt.h index 438740039..b32d0219f 100644 --- a/components/esp32/include/esp_int_wdt.h +++ b/components/esp32/include/esp_int_wdt.h @@ -41,9 +41,6 @@ This uses the TIMERG1 WDT. * @brief Initialize the interrupt watchdog. This is called in the init code if * the interrupt watchdog is enabled in menuconfig. * - * @param null - * - * @return null */ void esp_int_wdt_init(); diff --git a/components/esp32/include/esp_intr.h b/components/esp32/include/esp_intr.h index e138133f6..579eb6353 100644 --- a/components/esp32/include/esp_intr.h +++ b/components/esp32/include/esp_intr.h @@ -82,126 +82,6 @@ extern "C" { #define ESP_INTR_DISABLE(inum) \ xt_ints_off((1< +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file PHY init parameters and API + */ + + +/** + * @brief Structure holding PHY init parameters + */ +typedef struct { + uint8_t param_ver_id; /*!< init_data structure version */ + uint8_t crystal_select; /*!< 0: 40MHz, 1: 26 MHz, 2: 24 MHz, 3: auto */ + uint8_t wifi_rx_gain_swp_step_1; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_2; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_3; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_4; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_5; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_6; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_7; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_8; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_9; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_10; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_11; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_12; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_13; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_14; /*!< do not change */ + uint8_t wifi_rx_gain_swp_step_15; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_1; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_2; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_3; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_4; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_5; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_6; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_7; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_8; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_9; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_10; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_11; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_12; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_13; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_14; /*!< do not change */ + uint8_t bt_rx_gain_swp_step_15; /*!< do not change */ + uint8_t gain_cmp_1; /*!< do not change */ + uint8_t gain_cmp_6; /*!< do not change */ + uint8_t gain_cmp_11; /*!< do not change */ + uint8_t gain_cmp_ext2_1; /*!< do not change */ + uint8_t gain_cmp_ext2_6; /*!< do not change */ + uint8_t gain_cmp_ext2_11; /*!< do not change */ + uint8_t gain_cmp_ext3_1; /*!< do not change */ + uint8_t gain_cmp_ext3_6; /*!< do not change */ + uint8_t gain_cmp_ext3_11; /*!< do not change */ + uint8_t gain_cmp_bt_ofs_1; /*!< do not change */ + uint8_t gain_cmp_bt_ofs_6; /*!< do not change */ + uint8_t gain_cmp_bt_ofs_11; /*!< do not change */ + uint8_t target_power_qdb_0; /*!< 78 means target power is 78/4=19.5dbm */ + uint8_t target_power_qdb_1; /*!< 76 means target power is 76/4=19dbm */ + uint8_t target_power_qdb_2; /*!< 74 means target power is 74/4=18.5dbm */ + uint8_t target_power_qdb_3; /*!< 68 means target power is 68/4=17dbm */ + uint8_t target_power_qdb_4; /*!< 64 means target power is 64/4=16dbm */ + uint8_t target_power_qdb_5; /*!< 52 means target power is 52/4=13dbm */ + uint8_t target_power_index_mcs0; /*!< target power index is 0, means target power is target_power_qdb_0 19.5dbm; (1m,2m,5.5m,11m,6m,9m) */ + uint8_t target_power_index_mcs1; /*!< target power index is 0, means target power is target_power_qdb_0 19.5dbm; (12m) */ + uint8_t target_power_index_mcs2; /*!< target power index is 1, means target power is target_power_qdb_1 19dbm; (18m) */ + uint8_t target_power_index_mcs3; /*!< target power index is 1, means target power is target_power_qdb_1 19dbm; (24m) */ + uint8_t target_power_index_mcs4; /*!< target power index is 2, means target power is target_power_qdb_2 18.5dbm; (36m) */ + uint8_t target_power_index_mcs5; /*!< target power index is 3, means target power is target_power_qdb_3 17dbm; (48m) */ + uint8_t target_power_index_mcs6; /*!< target power index is 4, means target power is target_power_qdb_4 16dbm; (54m) */ + uint8_t target_power_index_mcs7; /*!< target power index is 5, means target power is target_power_qdb_5 13dbm */ + uint8_t pwr_ind_11b_en; /*!< 0: 11b power is same as mcs0 and 6m, 1: 11b power different with OFDM */ + uint8_t pwr_ind_11b_0; /*!< 1m, 2m power index [0~5] */ + uint8_t pwr_ind_11b_1; /*!< 5.5m, 11m power index [0~5] */ + uint8_t chan_backoff_en; /*!< 0: channel backoff disable, 1:channel backoff enable */ + uint8_t chan1_power_backoff_qdb; /*!< 4 means backoff is 1db */ + uint8_t chan2_power_backoff_qdb; /*!< see chan1_power_backoff_qdb */ + uint8_t chan3_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan4_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan5_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan6_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan7_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan8_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan9_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan10_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan11_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan12_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan13_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan14_power_backoff_qdb; /*!< chan1_power_backoff_qdb */ + uint8_t chan1_rate_backoff_index; /*!< if bit i is set, backoff data rate is target_power_qdb_i */ + uint8_t chan2_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan3_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan4_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan5_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan6_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan7_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan8_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan9_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan10_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan11_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan12_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan13_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t chan14_rate_backoff_index; /*!< see chan1_rate_backoff_index */ + uint8_t spur_freq_cfg_msb_1; /*!< first spur: */ + uint8_t spur_freq_cfg_1; /*!< spur_freq_cfg = (spur_freq_cfg_msb_1 <<8) | spur_freq_cfg_1 */ + uint8_t spur_freq_cfg_div_1; /*!< spur_freq=spur_freq_cfg/spur_freq_cfg_div_1 */ + uint8_t spur_freq_en_h_1; /*!< the seventh bit for total enable */ + uint8_t spur_freq_en_l_1; /*!< each bit for 1 channel, and use [spur_freq_en_h, spur_freq_en_l] to select the spur's channel priority */ + uint8_t spur_freq_cfg_msb_2; /*!< second spur: */ + uint8_t spur_freq_cfg_2; /*!< spur_freq_cfg = (spur_freq_cfg_msb_2 <<8) | spur_freq_cfg_2 */ + uint8_t spur_freq_cfg_div_2; /*!< spur_freq=spur_freq_cfg/spur_freq_cfg_div_2 */ + uint8_t spur_freq_en_h_2; /*!< the seventh bit for total enable */ + uint8_t spur_freq_en_l_2; /*!< each bit for 1 channel, and use [spur_freq_en_h, spur_freq_en_l] to select the spur's channel priority */ + uint8_t spur_freq_cfg_msb_3; /*!< third spur: */ + uint8_t spur_freq_cfg_3; /*!< spur_freq_cfg = (spur_freq_cfg_msb_3 <<8) | spur_freq_cfg_3 */ + uint8_t spur_freq_cfg_div_3; /*!< spur_freq=spur_freq_cfg/spur_freq_cfg_div_3 */ + uint8_t spur_freq_en_h_3; /*!< the seventh bit for total enable */ + uint8_t spur_freq_en_l_3; /*!< each bit for 1 channel, and use [spur_freq_en_h, spur_freq_en_l] to select the spur's channel priority, */ + uint8_t reserved[23]; /*!< reserved for future expansion */ +} esp_phy_init_data_t; + +/** + * @brief Opaque PHY calibration data + */ +typedef struct { + uint8_t opaque[1904]; /*!< calibration data */ +} esp_phy_calibration_data_t; + +typedef enum { + PHY_RF_CAL_PARTIAL = 0x00000000, /*!< Do part of RF calibration. This should be used after power-on reset. */ + PHY_RF_CAL_NONE = 0x00000001, /*!< Don't do any RF calibration. This mode is only suggested to be used after deep sleep reset. */ + PHY_RF_CAL_FULL = 0x00000002 /*!< Do full RF calibration. Produces best results, but also consumes a lot of time and current. Suggested to be used once. */ +} esp_phy_calibration_mode_t; + +/** + * @brief Get PHY init data + * + * If "Use a partition to store PHY init data" option is set in menuconfig, + * This function will load PHY init data from a partition. Otherwise, + * PHY init data will be compiled into the application itself, and this function + * will return a pointer to PHY init data located in read-only memory (DROM). + * + * If "Use a partition to store PHY init data" option is enabled, this function + * may return NULL if the data loaded from flash is not valid. + * + * @note Call esp_phy_release_init_data to release the pointer obtained using + * this function after the call to esp_wifi_init. + * + * @return pointer to PHY init data structure + */ +const esp_phy_init_data_t* esp_phy_get_init_data(); + +/** + * @brief Release PHY init data + * @param data pointer to PHY init data structure obtained from + * esp_phy_get_init_data function + */ +void esp_phy_release_init_data(const esp_phy_init_data_t* data); + +/** + * @brief Function called by esp_phy_init to load PHY calibration data + * + * This is a convenience function which can be used to load PHY calibration + * data from NVS. Data can be stored to NVS using esp_phy_store_cal_data_to_nvs + * function. + * + * If calibration data is not present in the NVS, or + * data is not valid (was obtained for a chip with a different MAC address, + * or obtained for a different version of software), this function will + * return an error. + * + * If "Initialize PHY in startup code" option is set in menuconfig, this + * function will be used to load calibration data. To provide a different + * mechanism for loading calibration data, disable + * "Initialize PHY in startup code" option in menuconfig and call esp_phy_init + * function from the application. For an example usage of esp_phy_init and + * this function, see do_phy_init function in cpu_start.c + * + * @param out_cal_data pointer to calibration data structure to be filled with + * loaded data. + * @return ESP_OK on success + */ +esp_err_t esp_phy_load_cal_data_from_nvs(esp_phy_calibration_data_t* out_cal_data); + +/** + * @brief Function called by esp_phy_init to store PHY calibration data + * + * This is a convenience function which can be used to store PHY calibration + * data to the NVS. Calibration data is returned by esp_phy_init function. + * Data saved using this function to the NVS can later be loaded using + * esp_phy_store_cal_data_to_nvs function. + * + * If "Initialize PHY in startup code" option is set in menuconfig, this + * function will be used to store calibration data. To provide a different + * mechanism for storing calibration data, disable + * "Initialize PHY in startup code" option in menuconfig and call esp_phy_init + * function from the application. + * + * @param cal_data pointer to calibration data which has to be saved. + * @return ESP_OK on success + */ +esp_err_t esp_phy_store_cal_data_to_nvs(const esp_phy_calibration_data_t* cal_data); + +/** + * @brief Initialize PHY module + * + * PHY module should be initialized in order to use WiFi or BT. + * If "Initialize PHY in startup code" option is set in menuconfig, + * this function will be called automatically before app_main is called, + * using parameters obtained from esp_phy_get_init_data. + * + * Applications which don't need to enable PHY on every start up should + * disable this menuconfig option and call esp_phy_init before calling + * esp_wifi_init or bt_controller_init. See do_phy_init function in + * cpu_start.c for an example of using this function. + * + * @param init_data PHY parameters. Default set of parameters can + * be obtained by calling esp_phy_get_default_init_data + * function. + * @param mode Calibration mode (Full, partial, or no calibration) + * @param[inout] calibration_data + * @return ESP_OK on success. + */ +esp_err_t esp_phy_init(const esp_phy_init_data_t* init_data, + esp_phy_calibration_mode_t mode, esp_phy_calibration_data_t* calibration_data); + + +#ifdef __cplusplus +} +#endif + diff --git a/components/esp32/include/esp_system.h b/components/esp32/include/esp_system.h index 84133366d..d416e23d0 100644 --- a/components/esp32/include/esp_system.h +++ b/components/esp32/include/esp_system.h @@ -32,6 +32,13 @@ extern "C" { * @{ */ +/** + * @attention application don't need to call this function anymore. It do nothing and will + * be removed in future version. + */ +void system_init(void) __attribute__ ((deprecated)); + + /** * @brief Get information of the SDK version. * @@ -169,8 +176,6 @@ bool system_rtc_mem_write(uint16_t dst, const void *src, uint16_t n); esp_err_t system_efuse_read_mac(uint8_t mac[6]); -void system_init(void); - /** * @} */ diff --git a/components/esp32/include/esp_task_wdt.h b/components/esp32/include/esp_task_wdt.h index bbc499567..eb7737700 100644 --- a/components/esp32/include/esp_task_wdt.h +++ b/components/esp32/include/esp_task_wdt.h @@ -42,9 +42,6 @@ This uses the TIMERG0 WDT. * @brief Initialize the task watchdog. This is called in the init code, if the * task watchdog is enabled in menuconfig. * - * @param null - * - * @return null */ void esp_task_wdt_init(); @@ -52,9 +49,6 @@ void esp_task_wdt_init(); * @brief Feed the watchdog. After the first feeding session, the watchdog will expect the calling * task to keep feeding the watchdog until task_wdt_delete() is called. * - * @param null - * - * @return null */ void esp_task_wdt_feed(); @@ -63,9 +57,6 @@ void esp_task_wdt_feed(); /** * @brief Delete the watchdog for the current task. * - * @param null - * - * @return null */ void esp_task_wdt_delete(); diff --git a/components/esp32/include/esp_wifi.h b/components/esp32/include/esp_wifi.h index 80ced5dc6..65a91929d 100644 --- a/components/esp32/include/esp_wifi.h +++ b/components/esp32/include/esp_wifi.h @@ -70,6 +70,27 @@ extern "C" { #endif +#define ESP_ERR_WIFI_OK ESP_OK /*!< No error */ +#define ESP_ERR_WIFI_FAIL ESP_FAIL /*!< General fail code */ +#define ESP_ERR_WIFI_NO_MEM ESP_ERR_NO_MEM /*!< Out of memory */ +#define ESP_ERR_WIFI_ARG ESP_ERR_INVALID_ARG /*!< Invalid argument */ +#define ESP_ERR_WIFI_NOT_SUPPORT ESP_ERR_NOT_SUPPORTED /*!< Indicates that API is not supported yet */ + +#define ESP_ERR_WIFI_NOT_INIT (ESP_ERR_WIFI_BASE + 1) /*!< WiFi driver is not installed by esp_wifi_init */ +#define ESP_ERR_WIFI_NOT_START (ESP_ERR_WIFI_BASE + 2) /*!< WiFi driver is not started by esp_wifi_start */ +#define ESP_ERR_WIFI_IF (ESP_ERR_WIFI_BASE + 3) /*!< WiFi interface error */ +#define ESP_ERR_WIFI_MODE (ESP_ERR_WIFI_BASE + 4) /*!< WiFi mode error */ +#define ESP_ERR_WIFI_STATE (ESP_ERR_WIFI_BASE + 5) /*!< WiFi internal state error */ +#define ESP_ERR_WIFI_CONN (ESP_ERR_WIFI_BASE + 6) /*!< WiFi internal control block of station or soft-AP error */ +#define ESP_ERR_WIFI_NVS (ESP_ERR_WIFI_BASE + 7) /*!< WiFi internal NVS module error */ +#define ESP_ERR_WIFI_MAC (ESP_ERR_WIFI_BASE + 8) /*!< MAC address is invalid */ +#define ESP_ERR_WIFI_SSID (ESP_ERR_WIFI_BASE + 9) /*!< SSID is invalid */ +#define ESP_ERR_WIFI_PASSWORD (ESP_ERR_WIFI_BASE + 10) /*!< Passord is invalid */ +#define ESP_ERR_WIFI_TIMEOUT (ESP_ERR_WIFI_BASE + 11) /*!< Timeout error */ + +/** + * @brief WiFi stack configuration parameters passed to esp_wifi_init call. + */ typedef struct { system_event_handler_t event_handler; /**< WiFi event handler */ } wifi_init_config_t; @@ -90,10 +111,12 @@ typedef struct { * will post station connected event to this queue. If the queue is not initialized, WiFi * will not post any events * - * @param wifi_init_config_t *config : provide WiFi init configuration + * @param config provide WiFi init configuration * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NO_MEM: out of memory + * - others: refer to error code esp_err.h */ esp_err_t esp_wifi_init(wifi_init_config_t *config); @@ -103,8 +126,7 @@ esp_err_t esp_wifi_init(wifi_init_config_t *config); * * @attention 1. This API should be called if you want to remove WiFi driver from the system * - * @return ESP_OK : succeed - * @return others : fail + * @return ESP_OK: succeed */ esp_err_t esp_wifi_deinit(void); @@ -114,20 +136,25 @@ esp_err_t esp_wifi_deinit(void); * Set the WiFi operating mode as station, soft-AP or station+soft-AP, * The default mode is soft-AP mode. * - * @param wifi_mode_t mode : WiFi operating modes: + * @param mode WiFi operating mode * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - others: refer to error code in esp_err.h */ esp_err_t esp_wifi_set_mode(wifi_mode_t mode); /** * @brief Get current operating mode of WiFi * - * @param wifi_mode_t *mode : store current WiFi mode + * @param[out] mode store current WiFi mode * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_mode(wifi_mode_t *mode); @@ -137,23 +164,25 @@ esp_err_t esp_wifi_get_mode(wifi_mode_t *mode); * If mode is WIFI_MODE_AP, it create soft-AP control block and start soft-AP * If mode is WIFI_MODE_APSTA, it create soft-AP and station control block and start soft-AP and station * - * @param null - * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_NO_MEM: out of memory + * - ESP_ERR_WIFI_CONN: WiFi internal error, station or soft-AP control block wrong + * - ESP_ERR_WIFI_FAIL: other WiFi internal errors */ esp_err_t esp_wifi_start(void); /** * @brief Stop WiFi - If mode is WIFI_MODE_STA, it stop station and free station control block + * If mode is WIFI_MODE_STA, it stop station and free station control block * If mode is WIFI_MODE_AP, it stop soft-AP and free soft-AP control block * If mode is WIFI_MODE_APSTA, it stop station/soft-AP and free station/soft-AP control block * - * @param null - * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init */ esp_err_t esp_wifi_stop(void); @@ -163,40 +192,47 @@ esp_err_t esp_wifi_stop(void); * @attention 1. This API only impact WIFI_MODE_STA or WIFI_MODE_APSTA mode * @attention 2. If the ESP32 is connected to an AP, call esp_wifi_disconnect to disconnect. * - * @param null - * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_CONN: WiFi internal error, station or soft-AP control block wrong + * - ESP_ERR_WIFI_SSID: SSID of AP which station connects is invalid */ esp_err_t esp_wifi_connect(void); /** * @brief Disconnect the ESP32 WiFi station from the AP. * - * @param null - * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_FAIL: other WiFi internal errors */ esp_err_t esp_wifi_disconnect(void); /** * @brief Currently this API is just an stub API * - * @param null - * - * @return ESP_OK : succeed - * @return others : fail + + * @return + * - ESP_OK: succeed + * - others: fail */ esp_err_t esp_wifi_clear_fast_connect(void); /** * @brief deauthenticate all stations or associated id equals to aid * - * @param uint16_t aid : when aid is 0, deauthenticate all stations, otherwise deauthenticate station whose associated id is aid + * @param aid when aid is 0, deauthenticate all stations, otherwise deauthenticate station whose associated id is aid * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong */ esp_err_t esp_wifi_deauth_sta(uint16_t aid); @@ -207,76 +243,87 @@ esp_err_t esp_wifi_deauth_sta(uint16_t aid); * will be freed in esp_wifi_get_ap_list, so generally, call esp_wifi_get_ap_list to cause * the memory to be freed once the scan is done * - * @param struct scan_config *config : configuration of scanning - * @param bool block : if block is true, this API will block the caller until the scan is done, otherwise + * @param config configuration of scanning + * @param block if block is true, this API will block the caller until the scan is done, otherwise * it will return immediately * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_TIMEOUT: blocking scan is timeout + * - others: refer to error code in esp_err.h */ -esp_err_t esp_wifi_scan_start(wifi_scan_config_t *conf, bool block); +esp_err_t esp_wifi_scan_start(wifi_scan_config_t *config, bool block); /** * @brief Stop the scan in process * - * @param null - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start */ esp_err_t esp_wifi_scan_stop(void); /** * @brief Get number of APs found in last scan * - * @param uint16_t *number : store number of APIs found in last scan + * @param[out] number store number of APIs found in last scan * - * @attention This API can only be called when the scan is completed, otherwise it may get wrong value + * @attention This API can only be called when the scan is completed, otherwise it may get wrong value. * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_scan_get_ap_num(uint16_t *number); /** * @brief Get AP list found in last scan * - * @param uint16_t *number : as input param, it stores max AP number ap_records can hold, as output param, it store - the actual AP number this API returns - * @param wifi_ap_record_t *ap_records: wifi_ap_record_t array to hold the found APs + * @param[inout] number As input param, it stores max AP number ap_records can hold. + * As output param, it receives the actual AP number this API returns. + * @param ap_records wifi_ap_record_t array to hold the found APs * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_NOT_START: WiFi is not started by esp_wifi_start + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_NO_MEM: out of memory */ esp_err_t esp_wifi_scan_get_ap_records(uint16_t *number, wifi_ap_record_t *ap_records); /** - * @brief Get information of AP associated with ESP32 station + * @brief Get information of AP which the ESP32 station is associated with * - * @param wifi_ap_record_t *ap_info: the wifi_ap_record_t to hold station assocated AP + * @param ap_info the wifi_ap_record_t to hold AP information * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - others: fail */ esp_err_t esp_wifi_sta_get_ap_info(wifi_ap_record_t *ap_info); /** * @brief Set current power save type * - * @param wifi_ps_type_t type : power save type + * @param type power save type * - * @return ESP_OK : succeed - * @return others : fail + * @return ESP_ERR_WIFI_NOT_SUPPORT: not supported yet */ esp_err_t esp_wifi_set_ps(wifi_ps_type_t type); /** * @brief Get current power save type * - * @param wifi_ps_type_t *type : store current power save type + * @param[out] type: store current power save type * - * @return ESP_OK : succeed - * @return others : fail + * @return ESP_ERR_WIFI_NOT_SUPPORT: not supported yet */ esp_err_t esp_wifi_get_ps(wifi_ps_type_t *type); @@ -286,36 +333,47 @@ esp_err_t esp_wifi_get_ps(wifi_ps_type_t *type); * * @attention Currently we only support 802.11b or 802.11bg or 802.11bgn mode * - * @param wifi_interface_t ifx : interfaces - * @param uint8_t protocol : WiFi protocol bitmap + * @param ifx interfaces + * @param protocol_bitmap WiFi protocol bitmap * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - others: refer to error codes in esp_err.h */ esp_err_t esp_wifi_set_protocol(wifi_interface_t ifx, uint8_t protocol_bitmap); /** - * @brief Get the current protocol bitmap of specified ifx + * @brief Get the current protocol bitmap of the specified interface * - * @param wifi_interface_t ifx : interfaces - * @param uint8_t protocol : store current WiFi protocol bitmap of interface ifx + * @param ifx interface + * @param[out] protocol_bitmap store current WiFi protocol bitmap of interface ifx * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_ARG: invalid argument + * - others: refer to error codes in esp_err.h */ esp_err_t esp_wifi_get_protocol(wifi_interface_t ifx, uint8_t *protocol_bitmap); /** * @brief Set the bandwidth of ESP32 specified interface * - * @attention 1. API return false if try to configure a interface that is not enable + * @attention 1. API return false if try to configure an interface that is not enabled * @attention 2. WIFI_BW_HT40 is supported only when the interface support 11N * - * @param wifi_interface_t ifx : interface to be configured - * @param wifi_bandwidth_t bw : bandwidth + * @param ifx interface to be configured + * @param bw bandwidth * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_ARG: invalid argument + * - others: refer to error codes in esp_err.h */ esp_err_t esp_wifi_set_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t bw); @@ -324,37 +382,45 @@ esp_err_t esp_wifi_set_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t bw); * * @attention 1. API return false if try to get a interface that is not enable * - * @param wifi_interface_t ifx : interface to be configured - * @param wifi_bandwidth_t *bw : store bandwidth of interface ifx + * @param ifx interface to be configured + * @param[out] bw store bandwidth of interface ifx * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_bandwidth(wifi_interface_t ifx, wifi_bandwidth_t *bw); /** - * @brief Set primary/second channel of ESP32 + * @brief Set primary/secondary channel of ESP32 * * @attention 1. This is a special API for sniffer * - * @param uint8_t primary : for HT20, primary is the channel number, for HT40, primary is the primary channel - * @param wifi_second_chan_t second : for HT20, second is ignored, for HT40, second is the second channel + * @param primary for HT20, primary is the channel number, for HT40, primary is the primary channel + * @param second for HT20, second is ignored, for HT40, second is the second channel * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_set_channel(uint8_t primary, wifi_second_chan_t second); /** - * @brief Get the primary/second channel of ESP32 + * @brief Get the primary/secondary channel of ESP32 * * @attention 1. API return false if try to get a interface that is not enable * - * @param uint8_t *primary : store current primary channel - * @param wifi_second_chan_t *second : store current second channel + * @param primary store current primary channel + * @param[out] second store current second channel * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_channel(uint8_t *primary, wifi_second_chan_t *second); @@ -362,20 +428,25 @@ esp_err_t esp_wifi_get_channel(uint8_t *primary, wifi_second_chan_t *second); * @brief Set country code * The default value is WIFI_COUNTRY_CN * - * @param wifi_country_t country : country type + * @param country country type * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - others: refer to error code in esp_err.h */ esp_err_t esp_wifi_set_country(wifi_country_t country); /** * @brief Get country code * - * @param wifi_country_t country : store current country + * @param country store current country * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_country(wifi_country_t *country); @@ -384,69 +455,82 @@ esp_err_t esp_wifi_get_country(wifi_country_t *country); * * @attention 1. This API can only be called when the interface is disabled * @attention 2. ESP32 soft-AP and station have different MAC addresses, do not set them to be the same. - * - The bit0 of the first byte of ESP32 MAC address can not be 1. For example, the MAC address + * @attention 3. The bit 0 of the first byte of ESP32 MAC address can not be 1. For example, the MAC address * can set to be "1a:XX:XX:XX:XX:XX", but can not be "15:XX:XX:XX:XX:XX". * - * @param wifi_interface_t ifx : interface - * @param uint8 mac[6]: the MAC address. + * @param ifx interface + * @param mac the MAC address * - * @return true : succeed - * @return false : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_MAC: invalid mac address + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong + * - others: refer to error codes in esp_err.h */ esp_err_t esp_wifi_set_mac(wifi_interface_t ifx, uint8_t mac[6]); /** * @brief Get mac of specified interface * - * @param uint8_t mac[6] : store mac of this interface ifx + * @param ifx interface + * @param[out] mac store mac of the interface ifx * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface */ esp_err_t esp_wifi_get_mac(wifi_interface_t ifx, uint8_t mac[6]); /** * @brief The RX callback function in the promiscuous mode. * - * Each time a packet is received, the callback function will be called. + * Each time a packet is received, the callback function will be called. * - * @param void *buf : the data received - * @param uint16_t len : data length + * @param buf the data received + * @param len data length * - * @return ESP_OK : succeed - * @return others : fail + * @return none */ typedef void (* wifi_promiscuous_cb_t)(void *buf, uint16_t len); /** * @brief Register the RX callback function in the promiscuous mode. * - * Each time a packet is received, the registered callback function will be called. + * Each time a packet is received, the registered callback function will be called. * - * @param wifi_promiscuous_cb_t cb : callback + * @param cb callback * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init */ esp_err_t esp_wifi_set_promiscuous_rx_cb(wifi_promiscuous_cb_t cb); /** * @brief Enable the promiscuous mode. * - * @param bool promiscuous : false - disable / true - enable + * @param en false - disable, true - enable * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init */ esp_err_t esp_wifi_set_promiscuous(bool en); /** * @brief Get the promiscuous mode. * - * @param bool *enable : store the current status of promiscuous mode + * @param[out] en store the current status of promiscuous mode * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_promiscuous(bool *en); @@ -458,22 +542,32 @@ esp_err_t esp_wifi_get_promiscuous(bool *en); * @attention 3. ESP32 is limited to only one channel, so when in the soft-AP+station mode, the soft-AP will adjust its channel automatically to be the same as * the channel of the ESP32 station. * - * @param wifi_interface_t ifx : interface - * @param wifi_config_t *conf : station or soft-AP configuration + * @param ifx interface + * @param conf station or soft-AP configuration * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface + * - ESP_ERR_WIFI_MODE: invalid mode + * - ESP_ERR_WIFI_PASSWORD: invalid password + * - ESP_ERR_WIFI_NVS: WiFi internal NVS error + * - others: refer to the erro code in esp_err.h */ esp_err_t esp_wifi_set_config(wifi_interface_t ifx, wifi_config_t *conf); /** * @brief Get configuration of specified interface * - * @param wifi_interface_t ifx : interface - * @param wifi_config_t *conf : station or soft-AP configuration + * @param ifx interface + * @param[out] conf station or soft-AP configuration * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_IF: invalid interface */ esp_err_t esp_wifi_get_config(wifi_interface_t ifx, wifi_config_t *conf); @@ -482,10 +576,14 @@ esp_err_t esp_wifi_get_config(wifi_interface_t ifx, wifi_config_t *conf); * * @attention SSC only API * - * @param wifi_sta_list_t *sta: station list + * @param[out] sta station list * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_MODE: WiFi mode is wrong + * - ESP_ERR_WIFI_CONN: WiFi internal error, the station/soft-AP control block is invalid */ esp_err_t esp_wifi_ap_get_sta_list(wifi_sta_list_t *sta); @@ -495,97 +593,76 @@ esp_err_t esp_wifi_ap_get_sta_list(wifi_sta_list_t *sta); * * @attention 1. The default value is WIFI_STORAGE_FLASH * - * @param wifi_storage_t storage : storage type + * @param storage : storage type * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_set_storage(wifi_storage_t storage); -/** - * @brief The WiFi RX callback function - * - * Each time the WiFi need to forward the packets to high layer, the callback function will be called - * - */ -typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb); - -/** - * @brief Set the WiFi RX callback - * - * @attention 1. Currently we support only one RX callback for each interface - * - * @param wifi_interface_t ifx : interface - * @param wifi_rxcb_t fn : WiFi RX callback - * - * @return ESP_OK : succeed - * @return others : fail - */ -esp_err_t esp_wifi_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn); - /** * @brief Set auto connect * The default value is true * - * @attention 1. + * @param en : true - enable auto connect / false - disable auto connect * - * @param bool en : true - enable auto connect / false - disable auto connect - * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_MODE: WiFi internal error, the station/soft-AP control block is invalid + * - others: refer to error code in esp_err.h */ esp_err_t esp_wifi_set_auto_connect(bool en); /** * @brief Get the auto connect flag * - * @param bool *en : store current auto connect configuration + * @param[out] en store current auto connect configuration * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument */ esp_err_t esp_wifi_get_auto_connect(bool *en); /** * @brief Set vendor specific element * - * @param bool enable : enable or not - * @param wifi_vendor_ie_type_t type : 0 - WIFI_VND_IE_TYPE_BEACON - * 1 - WIFI_VND_IE_TYPE_PROBE_REQ - * 2 - WIFI_VND_IE_TYPE_PROBE_RESP - * 3 - WIFI_VND_IE_TYPE_ASSOC_REQ - * 4 - WIFI_VND_IE_TYPE_ASSOC_RESP - * @param wifi_vendor_ie_id_t idx : 0 - WIFI_VND_IE_ID_0 - 1 - WIFI_VND_IE_ID_1 - * @param uint8_t *vnd_ie : pointer to a vendor specific element + * @param enable enable or not + * @param type information element type + * @param idx information element index + * @param vnd_ie pointer to a vendor specific element * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init + * - ESP_ERR_WIFI_ARG: invalid argument + * - ESP_ERR_WIFI_NO_MEM: out of memory */ esp_err_t esp_wifi_set_vendor_ie(bool enable, wifi_vendor_ie_type_t type, wifi_vendor_ie_id_t idx, uint8_t *vnd_ie); /** * @brief Define function pointer for vendor specific element callback - * @param void *ctx : reserved - * @param wifi_vendor_ie_type_t type : 0 - WIFI_VND_IE_TYPE_BEACON - * 1 - WIFI_VND_IE_TYPE_PROBE_REQ - * 2 - WIFI_VND_IE_TYPE_PROBE_RESP - * 3 - WIFI_VND_IE_TYPE_ASSOC_REQ - * 4 - WIFI_VND_IE_TYPE_ASSOC_RESP - * @param const uint8_t sa[6] : source address - * @param const uint8_t *vnd_ie : pointer to a vendor specific element - * @param int rssi : received signal strength indication + * @param ctx reserved + * @param type information element type + * @param sa source address + * @param vnd_ie pointer to a vendor specific element + * @param rssi received signal strength indication */ typedef void (*esp_vendor_ie_cb_t) (void *ctx, wifi_vendor_ie_type_t type, const uint8_t sa[6], const uint8_t *vnd_ie, int rssi); /** * @brief Set vendor specific element callback * - * @param esp_vendor_ie_cb_t cb : callback function - * @param void *ctx : reserved + * @param cb callback function + * @param ctx reserved * - * @return ESP_OK : succeed - * @return others : fail + * @return + * - ESP_OK: succeed + * - ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by eps_wifi_init */ esp_err_t esp_wifi_set_vendor_ie_cb(esp_vendor_ie_cb_t cb, void *ctx); diff --git a/components/esp32/include/esp_wifi_internal.h b/components/esp32/include/esp_wifi_internal.h index 217d5f6d1..2015b5063 100644 --- a/components/esp32/include/esp_wifi_internal.h +++ b/components/esp32/include/esp_wifi_internal.h @@ -62,16 +62,48 @@ void esp_wifi_internal_free_rx_buffer(void* buffer); /** * @brief transmit the buffer via wifi driver * - * @attention1 TODO should modify the return type from bool to int - * * @param wifi_interface_t wifi_if : wifi interface id * @param void *buffer : the buffer to be tansmit * @param u16_t len : the length of buffer * - * @return True : success transmit the buffer to wifi driver - * False : failed to transmit the buffer to wifi driver + * @return + * - ERR_OK : Successfully transmit the buffer to wifi driver + * - ERR_MEM : Out of memory + * - ERR_IF : WiFi driver error + * - ERR_ARG : Invalid argument */ -bool esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, u16_t len); +int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, u16_t len); + +/** + * @brief The WiFi RX callback function + * + * Each time the WiFi need to forward the packets to high layer, the callback function will be called + * + */ +typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb); + +/** + * @brief Set the WiFi RX callback + * + * @attention 1. Currently we support only one RX callback for each interface + * + * @param wifi_interface_t ifx : interface + * @param wifi_rxcb_t fn : WiFi RX callback + * + * @return ESP_OK : succeed + * @return others : fail + */ +esp_err_t esp_wifi_internal_reg_rxcb(wifi_interface_t ifx, wifi_rxcb_t fn); + +/** + * @brief Notify WIFI driver that the station got ip successfully + * + * @param none + * + * @return ESP_OK : succeed + * @return others : fail + */ +esp_err_t esp_wifi_internal_set_sta_ip(void); #ifdef __cplusplus } diff --git a/components/esp32/include/esp_wps.h b/components/esp32/include/esp_wps.h new file mode 100644 index 000000000..f95eaa5e2 --- /dev/null +++ b/components/esp32/include/esp_wps.h @@ -0,0 +1,111 @@ +// Copyright 2015-2016 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_WPS_H__ +#define __ESP_WPS_H__ + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup WiFi_APIs WiFi Related APIs + * @brief WiFi APIs + */ + +/** @addtogroup WiFi_APIs + * @{ + */ + +/** \defgroup WPS_APIs WPS APIs + * @brief ESP32 WPS APIs + * + * WPS can only be used when ESP32 station is enabled. + * + */ + +/** @addtogroup WPS_APIs + * @{ + */ + +#define ESP_ERR_WIFI_REGISTRAR (ESP_ERR_WIFI_BASE + 51) /*!< WPS registrar is not supported */ +#define ESP_ERR_WIFI_WPS_TYPE (ESP_ERR_WIFI_BASE + 52) /*!< WPS type error */ +#define ESP_ERR_WIFI_WPS_SM (ESP_ERR_WIFI_BASE + 53) /*!< WPS state machine is not initialized */ + +typedef enum wps_type { + WPS_TYPE_DISABLE = 0, + WPS_TYPE_PBC, + WPS_TYPE_PIN, + WPS_TYPE_MAX, +} wps_type_t; + +/** + * @brief Enable Wi-Fi WPS function. + * + * @attention WPS can only be used when ESP32 station is enabled. + * + * @param wps_type_t wps_type : WPS type, so far only WPS_TYPE_PBC and WPS_TYPE_PIN is supported + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_TYPE : wps type is invalid + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + * - ESP_ERR_WIFI_FAIL : wps initialization fails + */ +esp_err_t esp_wifi_wps_enable(wps_type_t wps_type); + +/** + * @brief Disable Wi-Fi WPS function and release resource it taken. + * + * @param null + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + */ +esp_err_t esp_wifi_wps_disable(void); + +/** + * @brief WPS starts to work. + * + * @attention WPS can only be used when ESP32 station is enabled. + * + * @param timeout_ms : maximum blocking time before API return. + * - 0 : non-blocking + * - 1~120000 : blocking time (not supported in IDF v1.0) + * + * @return + * - ESP_OK : succeed + * - ESP_ERR_WIFI_WPS_TYPE : wps type is invalid + * - ESP_ERR_WIFI_WPS_MODE : wifi is not in station mode or sniffer mode is on + * - ESP_ERR_WIFI_WPS_SM : wps state machine is not initialized + * - ESP_ERR_WIFI_FAIL : wps initialization fails + */ +esp_err_t esp_wifi_wps_start(int timeout_ms); + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ESP_WPS_H__ */ diff --git a/components/esp32/include/rom/secure_boot.h b/components/esp32/include/rom/secure_boot.h index cfeda0893..bd4f32ed9 100644 --- a/components/esp32/include/rom/secure_boot.h +++ b/components/esp32/include/rom/secure_boot.h @@ -25,7 +25,7 @@ void ets_secure_boot_start(void); void ets_secure_boot_finish(void); -void ets_secure_boot_hash(uint32_t *buf); +void ets_secure_boot_hash(const uint32_t *buf); void ets_secure_boot_obtain(void); diff --git a/components/esp32/include/soc/dport_reg.h b/components/esp32/include/soc/dport_reg.h index 0c43c0874..1be0fdee1 100644 --- a/components/esp32/include/soc/dport_reg.h +++ b/components/esp32/include/soc/dport_reg.h @@ -1028,6 +1028,7 @@ #define DPORT_WIFI_RST_EN_REG (DR_REG_DPORT_BASE + 0x0D0) /* DPORT_WIFI_RST : R/W ;bitpos:[31:0] ;default: 32'h0 ; */ /*description: */ +#define DPORT_MAC_RST (BIT(2)) #define DPORT_WIFI_RST 0xFFFFFFFF #define DPORT_WIFI_RST_M ((DPORT_WIFI_RST_V)<<(DPORT_WIFI_RST_S)) #define DPORT_WIFI_RST_V 0xFFFFFFFF diff --git a/components/esp32/include/soc/efuse_reg.h b/components/esp32/include/soc/efuse_reg.h index a0f0a07da..291e3984e 100644 --- a/components/esp32/include/soc/efuse_reg.h +++ b/components/esp32/include/soc/efuse_reg.h @@ -29,6 +29,16 @@ #define EFUSE_RD_EFUSE_RD_DIS_M ((EFUSE_RD_EFUSE_RD_DIS_V)<<(EFUSE_RD_EFUSE_RD_DIS_S)) #define EFUSE_RD_EFUSE_RD_DIS_V 0xF #define EFUSE_RD_EFUSE_RD_DIS_S 16 + +/* Read disable bits for efuse blocks 1-3 */ +#define EFUSE_RD_DIS_BLK1 (1<<16) +#define EFUSE_RD_DIS_BLK2 (1<<17) +#define EFUSE_RD_DIS_BLK3 (1<<18) +/* Read disable FLASH_CRYPT_CONFIG, CODING_SCHEME & KEY_STATUS + in efuse block 0 +*/ +#define EFUSE_RD_DIS_BLK0_PARTIAL (1<<19) + /* EFUSE_RD_EFUSE_WR_DIS : RO ;bitpos:[15:0] ;default: 16'b0 ; */ /*description: read for efuse_wr_disable*/ #define EFUSE_RD_EFUSE_WR_DIS 0x0000FFFF @@ -36,6 +46,22 @@ #define EFUSE_RD_EFUSE_WR_DIS_V 0xFFFF #define EFUSE_RD_EFUSE_WR_DIS_S 0 +/* Write disable bits */ +#define EFUSE_WR_DIS_RD_DIS (1<<0) /*< disable writing read disable reg */ +#define EFUSE_WR_DIS_WR_DIS (1<<1) /*< disable writing write disable reg */ +#define EFUSE_WR_DIS_FLASH_CRYPT_CNT (1<<2) +#define EFUSE_WR_DIS_MAC_SPI_CONFIG_HD (1<<3) /*< disable writing MAC & SPI config hd efuses */ +#define EFUSE_WR_DIS_XPD_SDIO (1<<5) /*< disable writing SDIO config efuses */ +#define EFUSE_WR_DIS_SPI_PAD_CONFIG (1<<6) /*< disable writing SPI_PAD_CONFIG efuses */ +#define EFUSE_WR_DIS_BLK1 (1<<7) /*< disable writing BLK1 efuses */ +#define EFUSE_WR_DIS_BLK2 (1<<8) /*< disable writing BLK2 efuses */ +#define EFUSE_WR_DIS_BLK3 (1<<9) /*< disable writing BLK3 efuses */ +#define EFUSE_WR_DIS_FLASH_CRYPT_CODING_SCHEME (1<<10) /*< disable writing FLASH_CRYPT_CONFIG and CODING_SCHEME efuses */ +#define EFUSE_WR_DIS_ABS_DONE_0 (1<<12) /*< disable writing ABS_DONE_0 efuse */ +#define EFUSE_WR_DIS_ABS_DONE_1 (1<<13) /*< disable writing ABS_DONE_1 efuse */ +#define EFUSE_WR_DIS_JTAG_DISABLE (1<<14) /*< disable writing JTAG_DISABLE efuse */ +#define EFUSE_WR_DIS_CONSOLE_DL_DISABLE (1<<15) /*< disable writing CONSOLE_DEBUG_DISABLE, DISABLE_DL_ENCRYPT, DISABLE_DL_DECRYPT and DISABLE_DL_CACHE efuses */ + #define EFUSE_BLK0_RDATA1_REG (DR_REG_EFUSE_BASE + 0x004) /* EFUSE_RD_WIFI_MAC_CRC_LOW : RO ;bitpos:[31:0] ;default: 32'b0 ; */ /*description: read for low 32bit WIFI_MAC_Address*/ diff --git a/components/esp32/include/soc/frc_timer_reg.h b/components/esp32/include/soc/frc_timer_reg.h new file mode 100644 index 000000000..d76199c4f --- /dev/null +++ b/components/esp32/include/soc/frc_timer_reg.h @@ -0,0 +1,49 @@ +// Copyright 2015-2016 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 _SOC_FRC_TIMER_REG_H_ +#define _SOC_FRC_TIMER_REG_H_ + +#include "soc.h" + +/** + * These are the register definitions for "legacy" timers + */ + +#define REG_FRC_TIMER_BASE(i) (DR_REG_FRC_TIMER_BASE + i*0x20) + +#define FRC_TIMER_LOAD_REG(i) (REG_FRC_TIMER_BASE(i) + 0x0) // timer load value (23 bit for i==0, 32 bit for i==1) +#define FRC_TIMER_LOAD_VALUE(i) ((i == 0)?0x007FFFFF:0xffffffff) +#define FRC_TIMER_LOAD_VALUE_S 0 + +#define FRC_TIMER_COUNT_REG(i) (REG_FRC_TIMER_BASE(i) + 0x4) // timer count value (23 bit for i==0, 32 bit for i==1) +#define FRC_TIMER_COUNT ((i == 0)?0x007FFFFF:0xffffffff) +#define FRC_TIMER_COUNT_S 0 + +#define FRC_TIMER_CTRL_REG(i) (REG_FRC_TIMER_BASE(i) + 0x8) +#define FRC_TIMER_INT_ENABLE (BIT(8)) // enable interrupt +#define FRC_TIMER_ENABLE (BIT(7)) // enable timer +#define FRC_TIMER_AUTOLOAD (BIT(6)) // enable autoload +#define FRC_TIMER_PRESCALER 0x00000007 // 0: divide by 1, 2: divide by 16, 4: divide by 256 +#define FRC_TIMER_PRESCALER_S 1 +#define FRC_TIMER_EDGE_INT (BIT(0)) // 0: level, 1: edge + +#define FRC_TIMER_INT_REG(i) (REG_FRC_TIMER_BASE(i) + 0xC) +#define FRC_TIMER_INT_CLR (BIT(0)) // clear interrupt + +#define FRC_TIMER_ALARM_REG(i) (REG_FRC_TIMER_BASE(i) + 0x10) // timer alarm value; register only present for i == 1 +#define FRC_TIMER_ALARM 0xFFFFFFFF +#define FRC_TIMER_ALARM_S 0 + +#endif //_SOC_FRC_TIMER_REG_H_ diff --git a/components/esp32/include/soc/hwcrypto_reg.h b/components/esp32/include/soc/hwcrypto_reg.h new file mode 100644 index 000000000..4f38b1ba9 --- /dev/null +++ b/components/esp32/include/soc/hwcrypto_reg.h @@ -0,0 +1,37 @@ +// Copyright 2015-2016 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 __HWCRYPTO_REG_H__ +#define __HWCRYPTO_REG_H__ + +#include "soc.h" + +/* registers for RSA acceleration via Multiple Precision Integer ops */ +#define RSA_MEM_M_BLOCK_BASE ((DR_REG_RSA_BASE)+0x000) +/* RB & Z use the same memory block, depending on phase of operation */ +#define RSA_MEM_RB_BLOCK_BASE ((DR_REG_RSA_BASE)+0x200) +#define RSA_MEM_Z_BLOCK_BASE ((DR_REG_RSA_BASE)+0x200) +#define RSA_MEM_Y_BLOCK_BASE ((DR_REG_RSA_BASE)+0x400) +#define RSA_MEM_X_BLOCK_BASE ((DR_REG_RSA_BASE)+0x600) + +#define RSA_M_DASH_REG (DR_REG_RSA_BASE + 0x800) +#define RSA_MODEXP_MODE_REG (DR_REG_RSA_BASE + 0x804) +#define RSA_START_MODEXP_REG (DR_REG_RSA_BASE + 0x808) +#define RSA_MULT_MODE_REG (DR_REG_RSA_BASE + 0x80c) +#define RSA_MULT_START_REG (DR_REG_RSA_BASE + 0x810) + +#define RSA_INTERRUPT_REG (DR_REG_RSA_BASE + 0X814) + +#define RSA_CLEAN_ADDR (DR_REG_RSA_BASE + 0X818) + +#endif diff --git a/components/esp32/include/soc/io_mux_reg.h b/components/esp32/include/soc/io_mux_reg.h index 208a60703..de8fe7ec9 100644 --- a/components/esp32/include/soc/io_mux_reg.h +++ b/components/esp32/include/soc/io_mux_reg.h @@ -34,10 +34,41 @@ #define PIN_INPUT_ENABLE(PIN_NAME) SET_PERI_REG_MASK(PIN_NAME,FUN_IE) #define PIN_INPUT_DISABLE(PIN_NAME) CLEAR_PERI_REG_MASK(PIN_NAME,FUN_IE) #define PIN_SET_DRV(PIN_NAME, drv) REG_SET_FIELD(PIN_NAME, FUN_DRV, (drv)); -#define PIN_PULLUP_DIS(PIN_NAME) REG_CLR_BIT(PIN_NAME, FUN_PU) -#define PIN_PULLUP_EN(PIN_NAME) REG_SET_BIT(PIN_NAME, FUN_PU) -#define PIN_PULLDWN_DIS(PIN_NAME) REG_CLR_BIT(PIN_NAME, FUN_PD) -#define PIN_PULLDWN_EN(PIN_NAME) REG_SET_BIT(PIN_NAME, FUN_PD) + +/* + * @attention + * The PIN_PULL[UP|DWN]_[EN|DIS]() functions used to exist as macros in previous SDK versions. + * Unfortunately, however, they do not work for some GPIOs on the ESP32 chip, which needs pullups + * and -downs turned on and off through RTC registers. The functions still exist for compatibility + * with older code, but are marked as deprecated in order to generate a warning. + * Please replace them in this fashion: (make sure to include driver/gpio.h as well) + * PIN_PULLUP_EN(GPIO_PIN_MUX_REG[x]) -> gpio_pullup_en(x) + * PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[x]) -> gpio_pullup_dis(x) + * PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[x]) -> gpio_pulldown_en(x) + * PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[x]) -> gpio_pulldown_dis(x) + * +*/ +static inline void __attribute__ ((deprecated)) PIN_PULLUP_DIS(uint32_t PIN_NAME) +{ + REG_CLR_BIT(PIN_NAME, FUN_PU); +} + +static inline void __attribute__ ((deprecated)) PIN_PULLUP_EN(uint32_t PIN_NAME) +{ + REG_SET_BIT(PIN_NAME, FUN_PU); +} + +static inline void __attribute__ ((deprecated)) PIN_PULLDWN_DIS(uint32_t PIN_NAME) +{ + REG_CLR_BIT(PIN_NAME, FUN_PD); +} + +static inline void __attribute__ ((deprecated)) PIN_PULLDWN_EN(uint32_t PIN_NAME) +{ + REG_SET_BIT(PIN_NAME, FUN_PD); +} + + #define PIN_FUNC_SELECT(PIN_NAME, FUNC) REG_SET_FIELD(PIN_NAME, MCU_SEL, FUNC) #define PIN_FUNC_GPIO 2 diff --git a/components/esp32/include/soc/rmt_reg.h b/components/esp32/include/soc/rmt_reg.h index a95aa6c08..07ba24ac7 100644 --- a/components/esp32/include/soc/rmt_reg.h +++ b/components/esp32/include/soc/rmt_reg.h @@ -2163,7 +2163,8 @@ #define RMT_DATE_V 0xFFFFFFFF #define RMT_DATE_S 0 - +/* RMT memory block address */ +#define RMT_CHANNEL_MEM(i) (DR_REG_RMT_BASE + 0x800 + 64 * 4 * (i)) #endif /*_SOC_RMT_REG_H_ */ diff --git a/components/esp32/include/soc/rmt_struct.h b/components/esp32/include/soc/rmt_struct.h index fb4c21055..335cb8194 100644 --- a/components/esp32/include/soc/rmt_struct.h +++ b/components/esp32/include/soc/rmt_struct.h @@ -226,19 +226,35 @@ typedef volatile struct { } rmt_dev_t; extern rmt_dev_t RMT; -//Allow access to RMT memory using RMTMEM.chan[0].data[8] +typedef struct { + union { + struct { + uint32_t duration0 :15; + uint32_t level0 :1; + uint32_t duration1 :15; + uint32_t level1 :1; + }; + uint32_t val; + }; +} rmt_item32_t; + +typedef struct { + union { + struct { + uint16_t duration :15; + uint16_t level :1; + }; + uint16_t val; + }; +} rmt_item16_t; + +//Allow access to RMT memory using RMTMEM.chan[0].data32[8] typedef volatile struct { struct { union { - struct { - uint32_t level1: 1; - uint32_t duration1: 15; - uint32_t level0: 1; - uint32_t duration0: 15; - - }; - uint32_t val; - } data[64]; + rmt_item32_t data32[64]; + rmt_item16_t data16[128]; + }; } chan[8]; } rmt_mem_t; extern rmt_mem_t RMTMEM; diff --git a/components/esp32/include/soc/rtc_cntl_reg.h b/components/esp32/include/soc/rtc_cntl_reg.h index bb4e2afce..d99cec186 100644 --- a/components/esp32/include/soc/rtc_cntl_reg.h +++ b/components/esp32/include/soc/rtc_cntl_reg.h @@ -239,6 +239,9 @@ #define RTC_CNTL_TIME_VALID_V 0x1 #define RTC_CNTL_TIME_VALID_S 30 +/* frequency of RTC slow clock, Hz */ +#define RTC_CTNL_SLOWCLK_FREQ 150000 + #define RTC_CNTL_TIME0_REG (DR_REG_RTCCNTL_BASE + 0x10) /* RTC_CNTL_TIME_LO : RO ;bitpos:[31:0] ;default: 32'h0 ; */ /*description: RTC timer low 32 bits*/ diff --git a/components/esp32/include/soc/soc.h b/components/esp32/include/soc/soc.h index 971d46071..da81d75bd 100755 --- a/components/esp32/include/soc/soc.h +++ b/components/esp32/include/soc/soc.h @@ -141,6 +141,7 @@ //}} #define DR_REG_DPORT_BASE 0x3ff00000 +#define DR_REG_RSA_BASE 0x3ff02000 #define DR_REG_UART_BASE 0x3ff40000 #define DR_REG_SPI1_BASE 0x3ff42000 #define DR_REG_SPI0_BASE 0x3ff43000 @@ -148,6 +149,7 @@ #define DR_REG_GPIO_SD_BASE 0x3ff44f00 #define DR_REG_FE2_BASE 0x3ff45000 #define DR_REG_FE_BASE 0x3ff46000 +#define DR_REG_FRC_TIMER_BASE 0x3ff47000 #define DR_REG_RTCCNTL_BASE 0x3ff48000 #define DR_REG_RTCIO_BASE 0x3ff48400 #define DR_REG_SARADC_BASE 0x3ff48800 @@ -281,9 +283,9 @@ * 19 2 extern level * 20 2 extern level * 21 2 extern level - * 22 3 extern edge + * 22 3 extern edge FRC1 timer * 23 3 extern level - * 24 4 extern level + * 24 4 extern level TG1_WDT * 25 4 extern level Reserved Reserved * 26 5 extern level Reserved Reserved * 27 3 extern level Reserved Reserved @@ -301,8 +303,10 @@ #define ETS_T0_WDT_INUM 3 #define ETS_WBB_INUM 4 #define ETS_TG0_T1_INUM 10 /**< use edge interrupt*/ +#define ETS_FRC1_INUM 22 +#define ETS_T1_WDT_INUM 24 -//CPU0 Intrrupt number used in ROM, should be cancelled in SDK +//CPU0 Interrupt number used in ROM, should be cancelled in SDK #define ETS_SLC_INUM 1 #define ETS_UART0_INUM 5 #define ETS_UART1_INUM 5 diff --git a/components/esp32/include/soc/uart_reg.h b/components/esp32/include/soc/uart_reg.h index 155700b29..8cac4bb83 100644 --- a/components/esp32/include/soc/uart_reg.h +++ b/components/esp32/include/soc/uart_reg.h @@ -18,8 +18,10 @@ #include "soc.h" #define REG_UART_BASE( i ) (DR_REG_UART_BASE + (i) * 0x10000 + ( i > 1 ? 0xe000 : 0 ) ) - +#define REG_UART_AHB_BASE(i) (0x60000000 + (i) * 0x10000 + ( i > 1 ? 0xe000 : 0 ) ) +#define UART_FIFO_AHB_REG(i) (REG_UART_AHB_BASE(i) + 0x0) #define UART_FIFO_REG(i) (REG_UART_BASE(i) + 0x0) + /* UART_RXFIFO_RD_BYTE : RO ;bitpos:[7:0] ;default: 8'b0 ; */ /*description: This register stores one byte data read by rx fifo.*/ #define UART_RXFIFO_RD_BYTE 0x000000FF diff --git a/components/esp32/int_wdt.c b/components/esp32/int_wdt.c index 11de8f20d..fe3ddab37 100644 --- a/components/esp32/int_wdt.c +++ b/components/esp32/int_wdt.c @@ -25,6 +25,7 @@ #include "esp_err.h" #include "esp_intr.h" #include "esp_attr.h" +#include "esp_freertos_hooks.h" #include "soc/timer_group_struct.h" #include "soc/timer_group_reg.h" @@ -36,6 +37,38 @@ #define WDT_INT_NUM 24 +//Take care: the tick hook can also be called before esp_int_wdt_init() is called. +#if CONFIG_INT_WDT_CHECK_CPU1 +//Not static; the ISR assembly checks this. +bool int_wdt_app_cpu_ticked=false; + +static void IRAM_ATTR tick_hook(void) { + if (xPortGetCoreID()!=0) { + int_wdt_app_cpu_ticked=true; + } else { + //Only feed wdt if app cpu also ticked. + if (int_wdt_app_cpu_ticked) { + TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; + TIMERG1.wdt_config2=CONFIG_INT_WDT_TIMEOUT_MS*2; //Set timeout before interrupt + TIMERG1.wdt_config3=CONFIG_INT_WDT_TIMEOUT_MS*4; //Set timeout before reset + TIMERG1.wdt_feed=1; + TIMERG1.wdt_wprotect=0; + int_wdt_app_cpu_ticked=false; + } + } +} +#else +static void IRAM_ATTR tick_hook(void) { + if (xPortGetCoreID()!=0) return; + TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; + TIMERG1.wdt_config2=CONFIG_INT_WDT_TIMEOUT_MS*2; //Set timeout before interrupt + TIMERG1.wdt_config3=CONFIG_INT_WDT_TIMEOUT_MS*4; //Set timeout before reset + TIMERG1.wdt_feed=1; + TIMERG1.wdt_wprotect=0; +} +#endif + + void esp_int_wdt_init() { TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; TIMERG1.wdt_config0.sys_reset_length=7; //3.2uS @@ -53,6 +86,7 @@ void esp_int_wdt_init() { TIMERG1.wdt_wprotect=0; TIMERG1.int_clr_timers.wdt=1; TIMERG1.int_ena.wdt=1; + esp_register_freertos_tick_hook(tick_hook); ESP_INTR_DISABLE(WDT_INT_NUM); intr_matrix_set(xPortGetCoreID(), ETS_TG1_WDT_LEVEL_INTR_SOURCE, WDT_INT_NUM); //We do not register a handler for the interrupt because it is interrupt level 4 which @@ -62,35 +96,5 @@ void esp_int_wdt_init() { } -//Take care: the tick hook can also be called before esp_int_wdt_init() is called. -#if CONFIG_INT_WDT_CHECK_CPU1 -//Not static; the ISR assembly checks this. -bool int_wdt_app_cpu_ticked=false; - -void IRAM_ATTR vApplicationTickHook(void) { - if (xPortGetCoreID()!=0) { - int_wdt_app_cpu_ticked=true; - } else { - //Only feed wdt if app cpu also ticked. - if (int_wdt_app_cpu_ticked) { - TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config2=CONFIG_INT_WDT_TIMEOUT_MS*2; //Set timeout before interrupt - TIMERG1.wdt_config3=CONFIG_INT_WDT_TIMEOUT_MS*4; //Set timeout before reset - TIMERG1.wdt_feed=1; - TIMERG1.wdt_wprotect=0; - int_wdt_app_cpu_ticked=false; - } - } -} -#else -void IRAM_ATTR vApplicationTickHook(void) { - if (xPortGetCoreID()!=0) return; - TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; - TIMERG1.wdt_config2=CONFIG_INT_WDT_TIMEOUT_MS*2; //Set timeout before interrupt - TIMERG1.wdt_config3=CONFIG_INT_WDT_TIMEOUT_MS*4; //Set timeout before reset - TIMERG1.wdt_feed=1; - TIMERG1.wdt_wprotect=0; -} -#endif #endif \ No newline at end of file diff --git a/components/esp32/ld/esp32.common.ld b/components/esp32/ld/esp32.common.ld index 7b14b6da1..aafafbb49 100644 --- a/components/esp32/ld/esp32.common.ld +++ b/components/esp32/ld/esp32.common.ld @@ -3,8 +3,38 @@ ENTRY(call_start_cpu0); SECTIONS { + /* RTC fast memory holds RTC wake stub code, + including from any source file named rtc_wake_stub*.c + */ + .rtc.text : + { + . = ALIGN(4); + *(.rtc.literal .rtc.text) + *rtc_wake_stub*.o(.literal .text .literal.* .text.*) + } >rtc_iram_seg + + /* RTC slow memory holds RTC wake stub + data/rodata, including from any source file + named rtc_wake_stub*.c + */ + .rtc.data : + { + *(.rtc.data) + *(.rtc.rodata) + *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*) + } > rtc_slow_seg + + /* RTC bss, from any source file named rtc_wake_stub*.c */ + .rtc.bss (NOLOAD) : + { + _rtc_bss_start = ABSOLUTE(.); + *rtc_wake_stub*.o(.bss .bss.*) + *rtc_wake_stub*.o(COMMON) + _rtc_bss_end = ABSOLUTE(.); + } > rtc_slow_seg + /* Send .iram0 code to iram */ - .iram0.vectors : + .iram0.vectors : { /* Vectors go to IRAM */ _init_start = ABSOLUTE(.); @@ -155,16 +185,4 @@ SECTIONS _text_end = ABSOLUTE(.); _etext = .; } >iram0_2_seg - - .rtc.text : - { - . = ALIGN(4); - *(.rtc.literal .rtc.text) - } >rtc_iram_seg - - .rtc.data : - { - *(.rtc.data) - *(.rtc.rodata) - } > rtc_slow_seg } diff --git a/components/esp32/ld/esp32.rom.ld b/components/esp32/ld/esp32.rom.ld index 5266a679b..af9522976 100644 --- a/components/esp32/ld/esp32.rom.ld +++ b/components/esp32/ld/esp32.rom.ld @@ -1841,3 +1841,22 @@ PROVIDE ( _xtos_syscall_handler = 0x40000790 ); PROVIDE ( _xtos_unhandled_exception = 0x4000c024 ); PROVIDE ( _xtos_unhandled_interrupt = 0x4000c01c ); PROVIDE ( _xtos_vpri_enabled = 0x3ffe0654 ); +/* Following are static data, but can be used, not generated by script <<<<< btdm data */ +PROVIDE ( ld_acl_env = 0x3ffb8258 ); +PROVIDE ( ld_active_ch_map = 0x3ffb8334 ); +PROVIDE ( ld_bcst_acl_env = 0x3ffb8274 ); +PROVIDE ( ld_csb_rx_env = 0x3ffb8278 ); +PROVIDE ( ld_csb_tx_env = 0x3ffb827c ); +PROVIDE ( ld_env = 0x3ffb9510 ); +PROVIDE ( ld_fm_env = 0x3ffb8284 ); +PROVIDE ( ld_inq_env = 0x3ffb82e4 ); +PROVIDE ( ld_iscan_env = 0x3ffb82e8 ); +PROVIDE ( ld_page_env = 0x3ffb82f0 ); +PROVIDE ( ld_pca_env = 0x3ffb82f4 ); +PROVIDE ( ld_pscan_env = 0x3ffb8308 ); +PROVIDE ( ld_sched_env = 0x3ffb830c ); +PROVIDE ( ld_sched_params = 0x3ffb96c0 ); +PROVIDE ( ld_sco_env = 0x3ffb824c ); +PROVIDE ( ld_sscan_env = 0x3ffb832c ); +PROVIDE ( ld_strain_env = 0x3ffb8330 ); +/* Above are static data, but can be used, not generated by script >>>>> btdm data */ diff --git a/components/esp32/lib b/components/esp32/lib index 2afb6bb13..93fcc0324 160000 --- a/components/esp32/lib +++ b/components/esp32/lib @@ -1 +1 @@ -Subproject commit 2afb6bb13ec50bf46128331fa7b6835d672c0414 +Subproject commit 93fcc0324cd9b4de8ae381a876d371dfd4eff8e3 diff --git a/components/esp32/phy.h b/components/esp32/phy.h new file mode 100644 index 000000000..81990f2e3 --- /dev/null +++ b/components/esp32/phy.h @@ -0,0 +1,64 @@ +// Copyright 2015-2016 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. + +#pragma once +#include "esp_phy_init.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file phy.h + * @brief Declarations for functions provided by libphy.a + */ + +/** + * @brief Initialize function pointer table in PHY library. + * @note This function should be called before register_chipv7_phy. + */ +void phy_get_romfunc_addr(void); + +/** + * @brief Initialize PHY module and do RF calibration + * @param[in] init_data Initialization parameters to be used by the PHY + * @param[inout] cal_data As input, calibration data previously obtained. As output, will contain new calibration data. + * @param[in] cal_mode RF calibration mode + * @return reserved for future use + */ +int register_chipv7_phy(const esp_phy_init_data_t* init_data, esp_phy_calibration_data_t *cal_data, esp_phy_calibration_mode_t cal_mode); + +/** + * @brief Get the format version of calibration data used by PHY library. + * @return Format version number, OR'ed with BIT(16) if PHY is in WIFI only mode. + */ +uint32_t phy_get_rf_cal_version(); + +/** + * @brief Set RF/BB for only WIFI mode or coexist(WIFI & BT) mode + * @param[in] true is for only WIFI mode, false is for coexist mode. default is 0. + * @return NULL + */ +void phy_set_wifi_mode_only(bool wifi_only); + +/** + * @brief Set BT the highest priority in coexist mode. + * @return NULL + */ +void coex_bt_high_prio(void); + +#ifdef __cplusplus +} +#endif + diff --git a/components/esp32/phy_init.c b/components/esp32/phy_init.c new file mode 100644 index 000000000..32d8f64ed --- /dev/null +++ b/components/esp32/phy_init.c @@ -0,0 +1,224 @@ +// Copyright 2015-2016 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. + +#include +#include +#include +#include + +#include "rom/ets_sys.h" +#include "soc/dport_reg.h" + +#include "esp_err.h" +#include "esp_phy_init.h" +#include "esp_system.h" +#include "phy.h" +#include "esp_log.h" +#include "nvs.h" +#include "sdkconfig.h" +#include "phy_init_data.h" + +static const char* TAG = "phy_init"; + + +esp_err_t esp_phy_init(const esp_phy_init_data_t* init_data, + esp_phy_calibration_mode_t mode, esp_phy_calibration_data_t* calibration_data) +{ + assert(init_data); + assert(calibration_data); + // Initialize PHY pointer table + phy_get_romfunc_addr(); + REG_SET_BIT(DPORT_WIFI_RST_EN_REG, DPORT_MAC_RST); + REG_CLR_BIT(DPORT_WIFI_RST_EN_REG, DPORT_MAC_RST); + // Enable WiFi peripheral clock + SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, 0x87cf); + ESP_LOGV(TAG, "register_chipv7_phy, init_data=%p, cal_data=%p, mode=%d", + init_data, calibration_data, mode); + phy_set_wifi_mode_only(0); + register_chipv7_phy(init_data, calibration_data, mode); + coex_bt_high_prio(); + return ESP_OK; +} + +// PHY init data handling functions +#if CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION +#include "esp_partition.h" + +const esp_phy_init_data_t* esp_phy_get_init_data() +{ + const esp_partition_t* partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_PHY, NULL); + if (partition == NULL) { + ESP_LOGE(TAG, "PHY data partition not found"); + return NULL; + } + ESP_LOGD(TAG, "loading PHY init data from partition at offset 0x%x", partition->address); + size_t init_data_store_length = sizeof(phy_init_magic_pre) + + sizeof(esp_phy_init_data_t) + sizeof(phy_init_magic_post); + uint8_t* init_data_store = (uint8_t*) malloc(init_data_store_length); + if (init_data_store == NULL) { + ESP_LOGE(TAG, "failed to allocate memory for PHY init data"); + return NULL; + } + esp_err_t err = esp_partition_read(partition, 0, init_data_store, init_data_store_length); + if (err != ESP_OK) { + ESP_LOGE(TAG, "failed to read PHY data partition (%d)", err); + return NULL; + } + if (memcmp(init_data_store, PHY_INIT_MAGIC, sizeof(phy_init_magic_pre)) != 0 || + memcmp(init_data_store + init_data_store_length - sizeof(phy_init_magic_post), + PHY_INIT_MAGIC, sizeof(phy_init_magic_post)) != 0) { + ESP_LOGE(TAG, "failed to validate PHY data partition"); + return NULL; + } + ESP_LOGE(TAG, "PHY data partition validated"); + return (const esp_phy_init_data_t*) (init_data_store + sizeof(phy_init_magic_pre)); +} + +void esp_phy_release_init_data(const esp_phy_init_data_t* init_data) +{ + free((uint8_t*) init_data - sizeof(phy_init_magic_pre)); +} + +#else // CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION + +// phy_init_data.h will declare static 'phy_init_data' variable initialized with default init data + +const esp_phy_init_data_t* esp_phy_get_init_data() +{ + ESP_LOGD(TAG, "loading PHY init data from application binary"); + return &phy_init_data; +} + +void esp_phy_release_init_data(const esp_phy_init_data_t* init_data) +{ + // no-op +} +#endif // CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION + + +// PHY calibration data handling functions +static const char* PHY_NAMESPACE = "phy"; +static const char* PHY_CAL_VERSION_KEY = "cal_version"; +static const char* PHY_CAL_MAC_KEY = "cal_mac"; +static const char* PHY_CAL_DATA_KEY = "cal_data"; + +static esp_err_t load_cal_data_from_nvs_handle(nvs_handle handle, + esp_phy_calibration_data_t* out_cal_data); + +static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle, + const esp_phy_calibration_data_t* cal_data); + +esp_err_t esp_phy_load_cal_data_from_nvs(esp_phy_calibration_data_t* out_cal_data) +{ + nvs_handle handle; + esp_err_t err = nvs_open(PHY_NAMESPACE, NVS_READONLY, &handle); + if (err != ESP_OK) { + ESP_LOGD(TAG, "%s: failed to open NVS namespace (%d)", __func__, err); + return err; + } + else { + err = load_cal_data_from_nvs_handle(handle, out_cal_data); + nvs_close(handle); + return err; + } +} + +esp_err_t esp_phy_store_cal_data_to_nvs(const esp_phy_calibration_data_t* cal_data) +{ + nvs_handle handle; + esp_err_t err = nvs_open(PHY_NAMESPACE, NVS_READWRITE, &handle); + if (err != ESP_OK) { + ESP_LOGD(TAG, "%s: failed to open NVS namespace (%d)", __func__, err); + return err; + } + else { + err = store_cal_data_to_nvs_handle(handle, cal_data); + nvs_close(handle); + return err; + } +} + +static esp_err_t load_cal_data_from_nvs_handle(nvs_handle handle, + esp_phy_calibration_data_t* out_cal_data) +{ + esp_err_t err; + uint32_t cal_data_version; + err = nvs_get_u32(handle, PHY_CAL_VERSION_KEY, &cal_data_version); + if (err != ESP_OK) { + ESP_LOGD(TAG, "%s: failed to get cal_version (%d)", __func__, err); + return err; + } + uint32_t cal_format_version = phy_get_rf_cal_version() & (~BIT(16)); + ESP_LOGV(TAG, "phy_get_rf_cal_version: %d\n", cal_format_version); + if (cal_data_version != cal_format_version) { + ESP_LOGD(TAG, "%s: expected calibration data format %d, found %d", + __func__, cal_format_version, cal_data_version); + return ESP_FAIL; + } + uint8_t cal_data_mac[6]; + size_t length = sizeof(cal_data_mac); + err = nvs_get_blob(handle, PHY_CAL_MAC_KEY, cal_data_mac, &length); + if (err != ESP_OK) { + ESP_LOGD(TAG, "%s: failed to get cal_mac (%d)", __func__, err); + return err; + } + if (length != sizeof(cal_data_mac)) { + ESP_LOGD(TAG, "%s: invalid length of cal_mac (%d)", __func__, length); + return ESP_ERR_INVALID_SIZE; + } + uint8_t sta_mac[6]; + system_efuse_read_mac(sta_mac); + if (memcmp(sta_mac, cal_data_mac, sizeof(sta_mac)) != 0) { + ESP_LOGE(TAG, "%s: calibration data MAC check failed: expected " \ + MACSTR ", found " MACSTR, + __func__, MAC2STR(sta_mac), MAC2STR(cal_data_mac)); + return ESP_FAIL; + } + length = sizeof(*out_cal_data); + err = nvs_get_blob(handle, PHY_CAL_DATA_KEY, out_cal_data, &length); + if (err != ESP_OK) { + ESP_LOGE(TAG, "%s: failed to get cal_data(%d)", __func__, err); + return err; + } + if (length != sizeof(*out_cal_data)) { + ESP_LOGD(TAG, "%s: invalid length of cal_data (%d)", __func__, length); + return ESP_ERR_INVALID_SIZE; + } + return ESP_OK; +} + +static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle, + const esp_phy_calibration_data_t* cal_data) +{ + esp_err_t err; + uint32_t cal_format_version = phy_get_rf_cal_version() & (~BIT(16)); + ESP_LOGV(TAG, "phy_get_rf_cal_version: %d\n", cal_format_version); + err = nvs_set_u32(handle, PHY_CAL_VERSION_KEY, cal_format_version); + if (err != ESP_OK) { + return err; + } + uint8_t sta_mac[6]; + system_efuse_read_mac(sta_mac); + err = nvs_set_blob(handle, PHY_CAL_MAC_KEY, sta_mac, sizeof(sta_mac)); + if (err != ESP_OK) { + return err; + } + err = nvs_set_blob(handle, PHY_CAL_DATA_KEY, cal_data, sizeof(*cal_data)); + return err; +} + +void register_chipv7_phy_stub() +{ +} diff --git a/components/esp32/phy_init_data.h b/components/esp32/phy_init_data.h new file mode 100644 index 000000000..206598f97 --- /dev/null +++ b/components/esp32/phy_init_data.h @@ -0,0 +1,139 @@ +// Copyright 2016 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. + +#pragma once +#include "esp_phy_init.h" +#include "sdkconfig.h" + +// constrain a value between 'low' and 'high', inclusive +#define LIMIT(val, low, high) ((val < low) ? low : (val > high) ? high : val) + +#define PHY_INIT_MAGIC "PHYINIT" + +static const char phy_init_magic_pre[] = PHY_INIT_MAGIC; + +/** + * @brief Structure containing default recommended PHY initialization parameters. + */ +static const esp_phy_init_data_t phy_init_data= { + .param_ver_id = 0, + .crystal_select = 3, + .wifi_rx_gain_swp_step_1 = 0x05, + .wifi_rx_gain_swp_step_2 = 0x04, + .wifi_rx_gain_swp_step_3 = 0x06, + .wifi_rx_gain_swp_step_4 = 0x05, + .wifi_rx_gain_swp_step_5 = 0x01, + .wifi_rx_gain_swp_step_6 = 0x06, + .wifi_rx_gain_swp_step_7 = 0x05, + .wifi_rx_gain_swp_step_8 = 0x04, + .wifi_rx_gain_swp_step_9 = 0x06, + .wifi_rx_gain_swp_step_10 = 0x04, + .wifi_rx_gain_swp_step_11 = 0x05, + .wifi_rx_gain_swp_step_12 = 0x00, + .wifi_rx_gain_swp_step_13 = 0x00, + .wifi_rx_gain_swp_step_14 = 0x00, + .wifi_rx_gain_swp_step_15 = 0x00, + .bt_rx_gain_swp_step_1 = 0x05, + .bt_rx_gain_swp_step_2 = 0x04, + .bt_rx_gain_swp_step_3 = 0x06, + .bt_rx_gain_swp_step_4 = 0x05, + .bt_rx_gain_swp_step_5 = 0x01, + .bt_rx_gain_swp_step_6 = 0x06, + .bt_rx_gain_swp_step_7 = 0x05, + .bt_rx_gain_swp_step_8 = 0x00, + .bt_rx_gain_swp_step_9 = 0x00, + .bt_rx_gain_swp_step_10 = 0x00, + .bt_rx_gain_swp_step_11 = 0x00, + .bt_rx_gain_swp_step_12 = 0x00, + .bt_rx_gain_swp_step_13 = 0x00, + .bt_rx_gain_swp_step_14 = 0x00, + .bt_rx_gain_swp_step_15 = 0x00, + .gain_cmp_1 = 0x0a, + .gain_cmp_6 = 0x0a, + .gain_cmp_11 = 0x0c, + .gain_cmp_ext2_1 = 0xf0, + .gain_cmp_ext2_6 = 0xf0, + .gain_cmp_ext2_11 = 0xf0, + .gain_cmp_ext3_1 = 0xe0, + .gain_cmp_ext3_6 = 0xe0, + .gain_cmp_ext3_11 = 0xe0, + .gain_cmp_bt_ofs_1 = 0x18, + .gain_cmp_bt_ofs_6 = 0x18, + .gain_cmp_bt_ofs_11 = 0x18, + .target_power_qdb_0 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 78), + .target_power_qdb_1 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 76), + .target_power_qdb_2 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 74), + .target_power_qdb_3 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 68), + .target_power_qdb_4 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 64), + .target_power_qdb_5 = LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 52), + .target_power_index_mcs0 = 0, + .target_power_index_mcs1 = 0, + .target_power_index_mcs2 = 1, + .target_power_index_mcs3 = 1, + .target_power_index_mcs4 = 2, + .target_power_index_mcs5 = 3, + .target_power_index_mcs6 = 4, + .target_power_index_mcs7 = 5, + .pwr_ind_11b_en = 0, + .pwr_ind_11b_0 = 0, + .pwr_ind_11b_1 = 0, + .chan_backoff_en = 0, + .chan1_power_backoff_qdb = 0, + .chan2_power_backoff_qdb = 0, + .chan3_power_backoff_qdb = 0, + .chan4_power_backoff_qdb = 0, + .chan5_power_backoff_qdb = 0, + .chan6_power_backoff_qdb = 0, + .chan7_power_backoff_qdb = 0, + .chan8_power_backoff_qdb = 0, + .chan9_power_backoff_qdb = 0, + .chan10_power_backoff_qdb = 0, + .chan11_power_backoff_qdb = 0, + .chan12_power_backoff_qdb = 0, + .chan13_power_backoff_qdb = 0, + .chan14_power_backoff_qdb = 0, + .chan1_rate_backoff_index = 0, + .chan2_rate_backoff_index = 0, + .chan3_rate_backoff_index = 0, + .chan4_rate_backoff_index = 0, + .chan5_rate_backoff_index = 0, + .chan6_rate_backoff_index = 0, + .chan7_rate_backoff_index = 0, + .chan8_rate_backoff_index = 0, + .chan9_rate_backoff_index = 0, + .chan10_rate_backoff_index = 0, + .chan11_rate_backoff_index = 0, + .chan12_rate_backoff_index = 0, + .chan13_rate_backoff_index = 0, + .chan14_rate_backoff_index = 0, + .spur_freq_cfg_msb_1 = 0, + .spur_freq_cfg_1 = 0, + .spur_freq_cfg_div_1 = 0, + .spur_freq_en_h_1 = 0, + .spur_freq_en_l_1 = 0, + .spur_freq_cfg_msb_2 = 0, + .spur_freq_cfg_2 = 0, + .spur_freq_cfg_div_2 = 0, + .spur_freq_en_h_2 = 0, + .spur_freq_en_l_2 = 0, + .spur_freq_cfg_msb_3 = 0, + .spur_freq_cfg_3 = 0, + .spur_freq_cfg_div_3 = 0, + .spur_freq_en_h_3 = 0, + .spur_freq_en_l_3 = 0, + .reserved = {0} +}; + +static const char phy_init_magic_post[] = PHY_INIT_MAGIC; + diff --git a/components/esp32/task_wdt.c b/components/esp32/task_wdt.c index bec1cadaa..6f3959125 100644 --- a/components/esp32/task_wdt.c +++ b/components/esp32/task_wdt.c @@ -22,10 +22,13 @@ #include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" #include #include "esp_err.h" #include "esp_intr.h" #include "esp_attr.h" +#include "esp_freertos_hooks.h" #include "soc/timer_group_struct.h" #include "soc/timer_group_reg.h" #include "esp_log.h" @@ -44,6 +47,8 @@ struct wdt_task_t { }; static wdt_task_t *wdt_task_list=NULL; +static portMUX_TYPE taskwdt_spinlock = portMUX_INITIALIZER_UNLOCKED; + static void IRAM_ATTR task_wdt_isr(void *arg) { wdt_task_t *wdttask; @@ -54,24 +59,35 @@ static void IRAM_ATTR task_wdt_isr(void *arg) { TIMERG0.wdt_wprotect=0; //Ack interrupt TIMERG0.int_clr_timers.wdt=1; + //We are taking a spinlock while doing I/O (ets_printf) here. Normally, that is a pretty + //bad thing, possibly (temporarily) hanging up the 2nd core and stopping FreeRTOS. In this case, + //something bad already happened and reporting this is considered more important + //than the badness caused by a spinlock here. + portENTER_CRITICAL(&taskwdt_spinlock); + if (!wdt_task_list) { + //No task on list. Maybe none registered yet. + portEXIT_CRITICAL(&taskwdt_spinlock); + return; + } //Watchdog got triggered because at least one task did not report in. - ets_printf("Task watchdog got triggered. The following tasks did not feed the watchdog in time:\n"); + ets_printf(DRAM_STR("Task watchdog got triggered. The following tasks did not feed the watchdog in time:\n")); for (wdttask=wdt_task_list; wdttask!=NULL; wdttask=wdttask->next) { if (!wdttask->fed_watchdog) { - cpu=xTaskGetAffinity(wdttask->task_handle)==0?"CPU 0":"CPU 1"; - if (xTaskGetAffinity(wdttask->task_handle)==tskNO_AFFINITY) cpu="CPU 0/1"; - printf(" - %s (%s)\n", pcTaskGetTaskName(wdttask->task_handle), cpu); + cpu=xTaskGetAffinity(wdttask->task_handle)==0?DRAM_STR("CPU 0"):DRAM_STR("CPU 1"); + if (xTaskGetAffinity(wdttask->task_handle)==tskNO_AFFINITY) cpu=DRAM_STR("CPU 0/1"); + ets_printf(DRAM_STR(" - %s (%s)\n"), pcTaskGetTaskName(wdttask->task_handle), cpu); } } - ets_printf("Tasks currently running:\n"); + ets_printf(DRAM_STR("Tasks currently running:\n")); for (int x=0; xnext) { @@ -113,14 +131,18 @@ void esp_task_wdt_feed() { //Reset fed_watchdog status for (wdttask=wdt_task_list; wdttask->next!=NULL; wdttask=wdttask->next) wdttask->fed_watchdog=false; } + portEXIT_CRITICAL(&taskwdt_spinlock); } void esp_task_wdt_delete() { TaskHandle_t handle=xTaskGetCurrentTaskHandle(); wdt_task_t *wdttask=wdt_task_list; + portENTER_CRITICAL(&taskwdt_spinlock); + //Wdt task list can't be empty if (!wdt_task_list) { ESP_LOGE(TAG, "task_wdt_delete: No tasks in list?"); + portEXIT_CRITICAL(&taskwdt_spinlock); return; } if (handle==wdt_task_list) { @@ -129,17 +151,39 @@ void esp_task_wdt_delete() { free(wdttask); } else { //Find current task in list + if (wdt_task_list->task_handle==handle) { + //Task is the very first one. + wdt_task_t *freeme=wdt_task_list; + wdt_task_list=wdt_task_list->next; + free(freeme); + portEXIT_CRITICAL(&taskwdt_spinlock); + return; + } while (wdttask->next!=NULL && wdttask->next->task_handle!=handle) wdttask=wdttask->next; if (!wdttask->next) { ESP_LOGE(TAG, "task_wdt_delete: Task never called task_wdt_feed!"); + portEXIT_CRITICAL(&taskwdt_spinlock); return; } wdt_task_t *freeme=wdttask->next; wdttask->next=wdttask->next->next; free(freeme); } + portEXIT_CRITICAL(&taskwdt_spinlock); } + +#if CONFIG_TASK_WDT_CHECK_IDLE_TASK +static bool idle_hook(void) { +#if !CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 + if (xPortGetCoreID()!=0) return true; +#endif + esp_task_wdt_feed(); + return true; +} +#endif + + void esp_task_wdt_init() { TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE; TIMERG0.wdt_config0.sys_reset_length=7; //3.2uS @@ -153,6 +197,9 @@ void esp_task_wdt_init() { TIMERG0.wdt_config0.en=1; TIMERG0.wdt_feed=1; TIMERG0.wdt_wprotect=0; +#if CONFIG_TASK_WDT_CHECK_IDLE_TASK + esp_register_freertos_idle_hook(idle_hook); +#endif ESP_INTR_DISABLE(ETS_T0_WDT_INUM); intr_matrix_set(xPortGetCoreID(), ETS_TG0_WDT_LEVEL_INTR_SOURCE, ETS_T0_WDT_INUM); xt_set_interrupt_handler(ETS_T0_WDT_INUM, task_wdt_isr, NULL); @@ -161,13 +208,5 @@ void esp_task_wdt_init() { ESP_INTR_ENABLE(ETS_T0_WDT_INUM); } -#if CONFIG_TASK_WDT_CHECK_IDLE_TASK -void vApplicationIdleHook(void) { -#if !CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 - if (xPortGetCoreID()!=0) return; -#endif - esp_task_wdt_feed(); -} -#endif #endif \ No newline at end of file diff --git a/components/esp32/test/Kconfig b/components/esp32/test/Kconfig new file mode 100644 index 000000000..af5e5b45e --- /dev/null +++ b/components/esp32/test/Kconfig @@ -0,0 +1,9 @@ +menu "TESTS" + +config FP_TEST_ENABLE + bool "Enable test fp" + default "y" + help + For FPGA single core CPU which has no floating point support, floating point test should be disabled. + +endmenu diff --git a/components/esp32/test/component.mk b/components/esp32/test/component.mk new file mode 100644 index 000000000..5e7d11ddf --- /dev/null +++ b/components/esp32/test/component.mk @@ -0,0 +1,17 @@ +# +#Component Makefile +# + +COMPONENT_EXTRA_CLEAN := test_tjpgd_logo.h + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive + +COMPONENT_SRCDIRS := . test_vectors + +include $(IDF_PATH)/make/component_common.mk + +test_tjpgd.o: test_tjpgd_logo.h + +test_tjpgd_logo.h: $(COMPONENT_PATH)/logo.jpg + $(summary) XXD logo.jpg + $(Q) cd $(COMPONENT_PATH); xxd -i logo.jpg $(COMPONENT_BUILD_DIR)/test_tjpgd_logo.h diff --git a/components/esp32/test/logo.jpg b/components/esp32/test/logo.jpg new file mode 100644 index 000000000..2bd9e775e Binary files /dev/null and b/components/esp32/test/logo.jpg differ diff --git a/components/esp32/test/test_ahb_arb.c b/components/esp32/test/test_ahb_arb.c new file mode 100644 index 000000000..65f4906fd --- /dev/null +++ b/components/esp32/test/test_ahb_arb.c @@ -0,0 +1,293 @@ + +#include +#include +#include +#include "rom/ets_sys.h" +#include "rom/lldesc.h" +#include "rom/gpio.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" + +#include "unity.h" + +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" +#include "soc/gpio_sig_map.h" +#include "soc/gpio_reg.h" +#include "soc/i2s_reg.h" + + +#define DPORT_I2S0_CLK_EN (BIT(4)) +#define DPORT_I2S0_RST (BIT(4)) + + +/* +This test tests the s32c1i instruction when the AHB bus is also used. To create some AHB traffic, we use the I2S interface +to copy bytes over from one memory location to another. DO NOT USE the i2s routines inhere, they've been trial-and-error'ed until +the point where they happened to do what I want. +*/ + +static void lcdIfaceInit() +{ + SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S0_CLK_EN); + CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S0_RST); + + //Init pins to i2s functions + SET_PERI_REG_MASK(GPIO_ENABLE_W1TS_REG, (1 << 11) | (1 << 3) | (1 << 0) | (1 << 2) | (1 << 5) | (1 << 16) | (1 << 17) | (1 << 18) | (1 << 19) | (1 << 20)); //ENABLE GPIO oe_enable + + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO16_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO17_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO18_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO19_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO20_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 2); //11 + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO26_U, 0); //RS + + WRITE_PERI_REG(GPIO_FUNC0_OUT_SEL_CFG_REG, (148 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC2_OUT_SEL_CFG_REG, (149 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC5_OUT_SEL_CFG_REG, (150 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC16_OUT_SEL_CFG_REG, (151 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC17_OUT_SEL_CFG_REG, (152 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC18_OUT_SEL_CFG_REG, (153 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC19_OUT_SEL_CFG_REG, (154 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC20_OUT_SEL_CFG_REG, (155 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC26_OUT_SEL_CFG_REG, (156 << GPIO_FUNC0_OUT_SEL_S)); //RS + WRITE_PERI_REG(GPIO_FUNC11_OUT_SEL_CFG_REG, (I2S0O_WS_OUT_IDX << GPIO_FUNC0_OUT_SEL_S)); +// WRITE_PERI_REG(GPIO_FUNC11_OUT_SEL_CFG, (I2S0O_BCK_OUT_IDX< +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + + +/* +This test tests the 'fast' peripherial bus at 0x3ff40000. This bus is connected directly to the core, and as such +can receive 'speculative' reads, that is, reads that may or may not actually be executed in the code flow. This +may mess with any FIFOs mapped in the region: if a byte gets dropped due to a missed speculative read, the fifo +may advance to the next byte anyway. + +This code tests reading/writing from the UART1 FIFO, using both cores. For this to work, it's required that the +UARTs RX and TX lines are connected. +*/ + + +void test_fastbus_cp(int fifo_addr, unsigned char *buf, int len, int *dummy); + +static volatile int state = 0; +static volatile int xor = 0; +static unsigned char res[128]; + +static void tskOne(void *pvParameters) +{ + int run = 0, err = 0; + int x; + int ct[256]; + volatile int w; + int dummy; + while (1) { + state = 1; + for (x = 0; x < 64; x++) { + WRITE_PERI_REG(UART_FIFO_REG(1), x ^ xor); + } + for (w = 0; w < (1 << 14); w++); //delay + state = 2; + test_fastbus_cp(UART_FIFO_REG(1), &res[0], 64, &dummy); + for (w = 0; w < (1 << 10); w++); //delay + for (x = 0; x < 255; x++) { + ct[x] = 0; //zero ctrs + } + for (x = 0; x < 128; x++) { + ct[(int)res[x]^xor]++; //count values + } + for (x = 0; x < 255; x++) { //check counts + if (ct[x] != (x < 128 ? 1 : 0)) { + //Disregard first few loops; there may be crap in the fifo. + if (run > 2) { + err++; + printf("Error! Received value %d %d times!\n", x, ct[x]); + } + } + } + run++; + if ((run & 255) == 0) { + printf("Loop %d errct %d\n", run, err); + } + xor = (xor + 1) & 0xff; + } +} + +#define FB2ADDR 0x40098000 + +static void tskTwo(void *pvParameters) +{ + int x; + int dummy; + int *p = (int *)FB2ADDR; + int *s = (int *)test_fastbus_cp; + for (x = 0; x < 100; x++) { + *p++ = *s++; + } + void (*test_fastbus_cp2)(int fifo_addr, unsigned char * buf, int len, int * dummy) = (void *)FB2ADDR; + + + while (1) { + while (state != 1) ; + for (x = 64; x < 128; x++) { + WRITE_PERI_REG(UART_FIFO_REG(1), x ^ xor); + } + while (state != 2); + test_fastbus_cp2(UART_FIFO_REG(1), &res[64], 64, &dummy); + } +} + + +// TODO: split this thing into separate orthogonal tests +TEST_CASE("Fast I/O bus test", "[hw]") +{ + int i; + if ((REG_UART_BASE(0) >> 16) != 0x3ff4) { + printf("Error! Uart base isn't on fast bus.\n"); + TEST_ASSERT(0); + } + + PIN_PULLUP_DIS(PERIPHS_IO_MUX_SD_DATA3_U); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA2_U, FUNC_SD_DATA2_U1RXD); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA3_U, FUNC_SD_DATA3_U1TXD); + + int reg_val = (1 << UART_RXFIFO_FULL_THRHD_S); + WRITE_PERI_REG(UART_CONF1_REG(1), reg_val); + WRITE_PERI_REG(UART_CLKDIV_REG(1), 0x30); //semi-random +// CLEAR_PERI_REG_MASK(UART_INT_ENA_REG(1), UART_TXFIFO_EMPTY_INT_ENA|UART_RXFIFO_TOUT_INT_ENA); + + TaskHandle_t th[2]; + printf("Creating tasks\n"); + xTaskCreatePinnedToCore(tskOne , "tskone" , 2048, NULL, 3, &th[0], 0); + xTaskCreatePinnedToCore(tskTwo , "tsktwo" , 2048, NULL, 3, &th[1], 1); + + // Let stuff run for 20s + while (1) { + vTaskDelay(20000 / portTICK_PERIOD_MS); + } + + //Shut down all the tasks + for (i = 0; i < 2; i++) { + vTaskDelete(th[i]); + } + xt_ints_off(1 << ETS_UART0_INUM); +} + diff --git a/components/esp32/test/test_fastbus_asm.S b/components/esp32/test/test_fastbus_asm.S new file mode 100644 index 000000000..1ced09fcf --- /dev/null +++ b/components/esp32/test/test_fastbus_asm.S @@ -0,0 +1,32 @@ +/* +This little bit of code is executed in-place by one CPU, but copied to a different memory region +by the other CPU. Make sure it stays position-independent. +*/ + .text + .align 4 + .global test_fastbus_cp + .type test_fastbus_cp,@function +//Args: +//a2 - fifo addr +//a3 - buf addr +//a4 - len +//a5 - ptr to int to use +test_fastbus_cp: + entry a1,64 +back: + beqi a4, 0, out //check if loop done + s32i a4, a5, 0 //store value, for shits and/or giggles + memw //make sure write happens + l32i a4, a5, 0 //load value again, to thwart any prediction in the pipeline + bbsi a4, 0, pred //Random jump to check predictive reads. Both branches should do the same. + l32i a6, a2, 0 //read from fifo 1 + j predout +pred: + l32i a6, a2, 0 //read from fifo 2 +predout: + s8i a6, a3, 0 //store result + addi a3, a3, 1 //inc ptr + addi a4, a4, -1 //next + j back //loop again +out: + retw //and we are done diff --git a/components/esp32/test/test_fp.c b/components/esp32/test/test_fp.c new file mode 100644 index 000000000..5c2573b22 --- /dev/null +++ b/components/esp32/test/test_fp.c @@ -0,0 +1,195 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" + +#if CONFIG_FP_TEST_ENABLE +static float addsf(float a, float b) +{ + float result; + asm volatile ( + "wfr f0, %1\n" + "wfr f1, %2\n" + "add.s f2, f0, f1\n" + "rfr %0, f2\n" + :"=r"(result):"r"(a), "r"(b) + ); + return result; +} + +static float mulsf(float a, float b) +{ + float result; + asm volatile ( + "wfr f0, %1\n" + "wfr f1, %2\n" + "mul.s f2, f0, f1\n" + "rfr %0, f2\n" + :"=r"(result):"r"(a), "r"(b) + ); + return result; +} + +static float divsf(float a, float b) +{ + float result; + asm volatile ( + "wfr f0, %1\n" + "wfr f1, %2\n" + "div0.s f3, f1 \n" + "nexp01.s f4, f1 \n" + "const.s f5, 1 \n" + "maddn.s f5, f4, f3 \n" + "mov.s f6, f3 \n" + "mov.s f7, f1 \n" + "nexp01.s f8, f0 \n" + "maddn.s f6, f5, f3 \n" + "const.s f5, 1 \n" + "const.s f2, 0 \n" + "neg.s f9, f8 \n" + "maddn.s f5,f4,f6 \n" + "maddn.s f2, f0, f3 \n" + "mkdadj.s f7, f0 \n" + "maddn.s f6,f5,f6 \n" + "maddn.s f9,f4,f2 \n" + "const.s f5, 1 \n" + "maddn.s f5,f4,f6 \n" + "maddn.s f2,f9,f6 \n" + "neg.s f9, f8 \n" + "maddn.s f6,f5,f6 \n" + "maddn.s f9,f4,f2 \n" + "addexpm.s f2, f7 \n" + "addexp.s f6, f7 \n" + "divn.s f2,f9,f6\n" + "rfr %0, f2\n" + :"=r"(result):"r"(a), "r"(b) + ); + return result; +} + +static float sqrtsf(float a) +{ + float result; + asm volatile ( + "wfr f0, %1\n" + "sqrt0.s f2, f0\n" + "const.s f5, 0\n" + "maddn.s f5, f2, f2\n" + "nexp01.s f3, f0\n" + "const.s f4, 3\n" + "addexp.s f3, f4\n" + "maddn.s f4, f5, f3\n" + "nexp01.s f5, f0\n" + "neg.s f6, f5\n" + "maddn.s f2, f4, f2\n" + "const.s f1, 0\n" + "const.s f4, 0\n" + "const.s f7, 0\n" + "maddn.s f1, f6, f2\n" + "maddn.s f4, f2, f3\n" + "const.s f6, 3\n" + "maddn.s f7, f6, f2\n" + "maddn.s f5, f1, f1\n" + "maddn.s f6, f4, f2\n" + "neg.s f3, f7\n" + "maddn.s f1, f5, f3\n" + "maddn.s f7, f6, f7\n" + "mksadj.s f2, f0\n" + "nexp01.s f5, f0\n" + "maddn.s f5, f1, f1\n" + "neg.s f3, f7\n" + "addexpm.s f1, f2\n" + "addexp.s f3, f2\n" + "divn.s f1, f5, f3\n" + "rfr %0, f1\n" + :"=r"(result):"r"(a) + ); + return result; +} + +TEST_CASE("test FP add", "[fp]") +{ + float a = 100.0f; + float b = 0.5f; + float c = addsf(a, b); + float eps = c - 100.5f; + printf("a=%g b=%g c=%g eps=%g\r\n", a, b, c, eps); + TEST_ASSERT_TRUE(fabs(eps) < 0.000001); +} + +TEST_CASE("test FP mul", "[fp]") +{ + float a = 100.0f; + float b = 0.05f; + float c = mulsf(a, b); + float eps = c - 5.0f; + printf("a=%g b=%g c=%g eps=%g\r\n", a, b, c, eps); + TEST_ASSERT_TRUE(fabs(eps) < 0.000001); +} + +TEST_CASE("test FP div", "[fp]") +{ + float a = 100.0f; + float b = 5.0f; + float c = divsf(a, b); + float eps = c - 20.0f; + printf("a=%g b=%g c=%g eps=%g\r\n", a, b, c, eps); + TEST_ASSERT_TRUE(fabs(eps) < 0.000001); +} + +TEST_CASE("test FP sqrt", "[fp]") +{ + float a = 100.0f; + float c = sqrtsf(a); + float eps = c - 10.0f; + printf("a=%g c=%g eps=%g\r\n", a, c, eps); + TEST_ASSERT_TRUE(fabs(eps) < 0.000001); +} + + +struct TestFPState { + int fail; + int done; +}; + +static const int testFpIter = 100000; + +static void tskTestFP(void *pvParameters) +{ + struct TestFPState *state = (struct TestFPState *) pvParameters; + for (int i = 0; i < testFpIter; ++i) { + // calculate zero in a slightly obscure way + float y = sqrtsf(addsf(1.0f, divsf(mulsf(sqrtsf(2), sqrtsf(2)), 2.0f))); + y = mulsf(y, y); + y = addsf(y, -2.0f); + // check that result is not far from zero + float eps = fabs(y); + if (eps > 1e-6f) { + state->fail++; + printf("%s: i=%d y=%f eps=%f\r\n", __func__, i, y, eps); + } + } + state->done++; + vTaskDelete(NULL); +} + +TEST_CASE("context switch saves FP registers", "[fp]") +{ + struct TestFPState state; + state.done = 0; + state.fail = 0; + xTaskCreatePinnedToCore(tskTestFP, "tsk1", 2048, &state, 3, NULL, 0); + xTaskCreatePinnedToCore(tskTestFP, "tsk2", 2048, &state, 3, NULL, 0); + xTaskCreatePinnedToCore(tskTestFP, "tsk3", 2048, &state, 3, NULL, 1); + xTaskCreatePinnedToCore(tskTestFP, "tsk4", 2048, &state, 3, NULL, 0); + while (state.done != 4) { + vTaskDelay(100 / portTICK_PERIOD_MS); + } + if (state.fail) { + const int total = testFpIter * 4; + printf("Failed: %d, total: %d\r\n", state.fail, total); + } + TEST_ASSERT(state.fail == 0); +} +#endif diff --git a/components/esp32/test/test_miniz.c b/components/esp32/test/test_miniz.c new file mode 100644 index 000000000..3453c859a --- /dev/null +++ b/components/esp32/test/test_miniz.c @@ -0,0 +1,77 @@ + + +#include +#include "rom/miniz.h" +#include "unity.h" + + +#define DATASIZE (1024*64) + +TEST_CASE("Test miniz compression/decompression", "[miniz]") +{ + int x; + char b; + char *inbuf, *outbuf; + tdefl_compressor *comp; + tinfl_decompressor *decomp; + tdefl_status status; + size_t inbytes = 0, outbytes = 0, inpos = 0, outpos = 0, compsz; + printf("Allocating data buffer and filling it with semi-random data\n"); + inbuf = malloc(DATASIZE); + TEST_ASSERT(inbuf != NULL); + srand(0); + for (x = 0; x < DATASIZE; x++) { + inbuf[x] = (x & 1) ? rand() & 0xff : 0; + } + printf("Allocating compressor & outbuf (%d bytes)\n", sizeof(tdefl_compressor)); + comp = malloc(sizeof(tdefl_compressor)); + TEST_ASSERT(comp != NULL); + outbuf = malloc(DATASIZE); + TEST_ASSERT(outbuf != NULL); + printf("Compressing...\n"); + status = tdefl_init(comp, NULL, NULL, TDEFL_WRITE_ZLIB_HEADER | 1500); + TEST_ASSERT(status == TDEFL_STATUS_OKAY); + while (inbytes != DATASIZE) { + outbytes = DATASIZE - outpos; + inbytes = DATASIZE - inpos; + tdefl_compress(comp, &inbuf[inpos], &inbytes, &outbuf[outpos], &outbytes, TDEFL_FINISH); + printf("...Compressed %d into %d bytes\n", inbytes, outbytes); + inpos += inbytes; outpos += outbytes; + } + compsz = outpos; + free(comp); + //Kill inbuffer + for (x = 0; x < DATASIZE; x++) { + inbuf[x] = 0; + } + free(inbuf); + + inbuf = outbuf; + outbuf = malloc(DATASIZE); + TEST_ASSERT(outbuf != NULL); + printf("Reinflating...\n"); + decomp = malloc(sizeof(tinfl_decompressor)); + TEST_ASSERT(decomp != NULL); + tinfl_init(decomp); + inpos = 0; outpos = 0; + while (inbytes != compsz) { + outbytes = DATASIZE - outpos; + inbytes = compsz - inpos; + tinfl_decompress(decomp, (const mz_uint8 *)&inbuf[inpos], &inbytes, (uint8_t *)outbuf, (mz_uint8 *)&outbuf[outpos], &outbytes, TINFL_FLAG_PARSE_ZLIB_HEADER); + printf("...Decompressed %d into %d bytes\n", inbytes, outbytes); + inpos += inbytes; outpos += outbytes; + } + printf("Checking if same...\n"); + srand(0); + for (x = 0; x < DATASIZE; x++) { + b = (x & 1) ? rand() & 0xff : 0; + if (outbuf[x] != b) { + printf("Pos %x: %hhx!=%hhx\n", x, outbuf[x], b); + TEST_ASSERT(0); + } + } + printf("Great Success!\n"); + free(inbuf); + free(outbuf); + free(decomp); +} diff --git a/components/esp32/test/test_tjpgd.c b/components/esp32/test/test_tjpgd.c new file mode 100644 index 000000000..60c687f07 --- /dev/null +++ b/components/esp32/test/test_tjpgd.c @@ -0,0 +1,91 @@ + + +#include +#include "rom/tjpgd.h" +#include +#include +#include +#include "unity.h" + +#include "test_tjpgd_logo.h" + +typedef struct { + const unsigned char *inData; + int inPos; + unsigned char *outData; + int outW; + int outH; +} JpegDev; + + +static UINT infunc(JDEC *decoder, BYTE *buf, UINT len) +{ + JpegDev *jd = (JpegDev *)decoder->device; + printf("Reading %d bytes from pos %d\n", len, jd->inPos); + if (buf != NULL) { + memcpy(buf, jd->inData + jd->inPos, len); + } + jd->inPos += len; + return len; +} + + +static UINT outfunc(JDEC *decoder, void *bitmap, JRECT *rect) +{ + unsigned char *in = (unsigned char *)bitmap; + unsigned char *out; + int y; + printf("Rect %d,%d - %d,%d\n", rect->top, rect->left, rect->bottom, rect->right); + JpegDev *jd = (JpegDev *)decoder->device; + for (y = rect->top; y <= rect->bottom; y++) { + out = jd->outData + ((jd->outW * y) + rect->left) * 3; + memcpy(out, in, ((rect->right - rect->left) + 1) * 3); + in += ((rect->right - rect->left) + 1) * 3; + } + return 1; +} + +#define TESTW 48 +#define TESTH 48 +#define WORKSZ 3100 + +TEST_CASE("Test JPEG decompression library", "[tjpgd]") +{ + char aapix[] = " .:;+=xX$$"; + unsigned char *decoded, *p; + char *work; + int r; + int x, y, v; + JDEC decoder; + JpegDev jd; + decoded = malloc(48 * 48 * 3); + for (x = 0; x < 48 * 48 * 3; x += 2) { + decoded[x] = 0; decoded[x + 1] = 0xff; + } + work = malloc(WORKSZ); + memset(work, 0, WORKSZ); + + jd.inData = logo_jpg; + jd.inPos = 0; + jd.outData = decoded; + jd.outW = TESTW; + jd.outH = TESTH; + + r = jd_prepare(&decoder, infunc, work, WORKSZ, (void *)&jd); + TEST_ASSERT_EQUAL(r, JDR_OK); + r = jd_decomp(&decoder, outfunc, 0); + TEST_ASSERT_EQUAL(r, JDR_OK); + + p = decoded + 2; + for (y = 0; y < TESTH; y++) { + for (x = 0; x < TESTH; x++) { + v = ((*p) * (sizeof(aapix) - 2) * 2) / 256; + printf("%c%c", aapix[v / 2], aapix[(v + 1) / 2]); + p += 3; + } + printf("%c%c", ' ', '\n'); + } + + free(work); + free(decoded); +} diff --git a/components/esp32/test/test_unal_dma.c b/components/esp32/test/test_unal_dma.c new file mode 100644 index 000000000..3726632a4 --- /dev/null +++ b/components/esp32/test/test_unal_dma.c @@ -0,0 +1,205 @@ + +#include +#include +#include +#include +#include "rom/ets_sys.h" +#include "rom/lldesc.h" +#include "rom/gpio.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" + +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" +#include "soc/gpio_sig_map.h" +#include "soc/gpio_reg.h" +#include "soc/i2s_reg.h" + + +#define DPORT_I2S0_CLK_EN (BIT(4)) +#define DPORT_I2S0_RST (BIT(4)) + +static volatile lldesc_t dmaDesc[2]; + + +//hacked up routine to essentially do a memcpy() using dma. Supports max 4K-1 bytes. +static void dmaMemcpy(void *in, void *out, int len) +{ + volatile int i; + SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S0_CLK_EN); + CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S0_RST); + + //Init pins to i2s functions + SET_PERI_REG_MASK(GPIO_ENABLE_W1TS_REG, (1 << 11) | (1 << 3) | (1 << 0) | (1 << 2) | (1 << 5) | (1 << 16) | (1 << 17) | (1 << 18) | (1 << 19) | (1 << 20)); //ENABLE GPIO oe_enable + + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO16_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO17_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO18_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO19_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO20_U, 0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 2); //11 + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO26_U, 0); //RS + + WRITE_PERI_REG(GPIO_FUNC0_OUT_SEL_CFG_REG, (148 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC2_OUT_SEL_CFG_REG, (149 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC5_OUT_SEL_CFG_REG, (150 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC16_OUT_SEL_CFG_REG, (151 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC17_OUT_SEL_CFG_REG, (152 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC18_OUT_SEL_CFG_REG, (153 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC19_OUT_SEL_CFG_REG, (154 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC20_OUT_SEL_CFG_REG, (155 << GPIO_FUNC0_OUT_SEL_S)); + WRITE_PERI_REG(GPIO_FUNC26_OUT_SEL_CFG_REG, (156 << GPIO_FUNC0_OUT_SEL_S)); //RS + WRITE_PERI_REG(GPIO_FUNC11_OUT_SEL_CFG_REG, (I2S0O_WS_OUT_IDX << GPIO_FUNC0_OUT_SEL_S)); +// WRITE_PERI_REG(GPIO_FUNC11_OUT_SEL_CFG, (I2S0O_BCK_OUT_IDX<setup != NULL) { + /* setup */ + if (setjmp(env)) { + add_failure(runner, verbosity); + return; + } + tc->setup(); + } + /* test */ + if (setjmp(env)) { + add_failure(runner, verbosity); + return; + } + (tc->tests[i])(); + + /* teardown */ + if (tc->teardown != NULL) { + if (setjmp(env)) { + add_failure(runner, verbosity); + return; + } + tc->teardown(); + } +} + void srunner_run_all(SRunner *runner, int verbosity) { - Suite *suite; - TCase *tc; assert(runner != NULL); - suite = runner->suite; - tc = suite->tests; + assert(runner->suite != NULL); + TCase *tc = runner->suite->tests; while (tc != NULL) { - int i; - for (i = 0; i < tc->ntests; ++i) { + for (int i = 0; i < tc->ntests; ++i) { runner->nchecks++; - - if (tc->setup != NULL) { - /* setup */ - if (setjmp(env)) { - add_failure(runner, verbosity); - continue; - } - tc->setup(); - } - /* test */ - if (setjmp(env)) { - add_failure(runner, verbosity); - continue; - } - (tc->tests[i])(); - - /* teardown */ - if (tc->teardown != NULL) { - if (setjmp(env)) { - add_failure(runner, verbosity); - continue; - } - tc->teardown(); - } + run_test(runner, verbosity, tc, i); + tc = tc->next_tcase; } - tc = tc->next_tcase; } if (verbosity) { int passed = runner->nchecks - runner->nfailures; diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index 91e824b2d..b9db00e50 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -141,6 +141,35 @@ config FREERTOS_ISR_STACKSIZE The interrupt handlers have their own stack. The size of the stack can be defined here. Each processor has its own stack, so the total size occupied will be twice this. +config FREERTOS_LEGACY_HOOKS + bool "Use FreeRTOS legacy hooks" + default n + help + FreeRTOS offers a number of hooks/callback functions that are called when a timer + tick happens, the idle thread runs etc. esp-idf replaces these by runtime registerable + hooks using the esp_register_freertos_xxx_hook system, but for legacy reasons the old + hooks can also still be enabled. Please enable this only if you have code that for some + reason can't be migrated to the esp_register_freertos_xxx_hook system. + +if FREERTOS_LEGACY_HOOKS + +config FREERTOS_LEGACY_IDLE_HOOK + bool "Enable legacy idle hook" + default n + help + If enabled, FreeRTOS will call a function called vApplicationIdleHook when the idle thread + on a CPU is running. Please make sure your code defines such a function. + +config FREERTOS_LEGACY_TICK_HOOK + bool "Enable legacy tick hook" + default n + help + If enabled, FreeRTOS will call a function called vApplicationTickHook when a FreeRTOS + tick is executed. Please make sure your code defines such a function. + +endif #FREERTOS_LEGACY_HOOKS + + menuconfig FREERTOS_DEBUG_INTERNALS bool "Debug FreeRTOS internals" default n diff --git a/components/freertos/component.mk b/components/freertos/component.mk index 6702d1b95..0240ea235 100644 --- a/components/freertos/component.mk +++ b/components/freertos/component.mk @@ -6,4 +6,3 @@ COMPONENT_ADD_LDFLAGS = -l$(COMPONENT_NAME) -Wl,--undefined=uxTopUsedPriority COMPONENT_ADD_INCLUDEDIRS := include COMPONENT_PRIV_INCLUDEDIRS := include/freertos -include $(IDF_PATH)/make/component_common.mk diff --git a/components/freertos/include/freertos/FreeRTOS.h b/components/freertos/include/freertos/FreeRTOS.h index f6c9aa497..4c60308f7 100644 --- a/components/freertos/include/freertos/FreeRTOS.h +++ b/components/freertos/include/freertos/FreeRTOS.h @@ -895,7 +895,8 @@ typedef struct xSTATIC_TCB uint32_t ulDummy18; uint32_t ucDummy19; #endif - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + #if( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) \ + || ( portUSING_MPU_WRAPPERS == 1 ) ) uint8_t uxDummy20; #endif @@ -927,7 +928,6 @@ typedef struct xSTATIC_QUEUE StaticList_t xDummy3[ 2 ]; UBaseType_t uxDummy4[ 3 ]; - BaseType_t ucDummy5[ 2 ]; #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) uint8_t ucDummy6; @@ -943,12 +943,12 @@ typedef struct xSTATIC_QUEUE #endif struct { - volatile uint32_t mux; + volatile uint32_t ucDummy10; #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG - const char *lastLockedFn; - int lastLockedLine; + void *pvDummy8; + UBaseType_t uxDummy11; #endif - } mux; + } sDummy12; } StaticQueue_t; typedef StaticQueue_t StaticSemaphore_t; diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index 224857c86..4f1012657 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -108,6 +108,7 @@ /* configASSERT behaviour */ #ifndef __ASSEMBLER__ +#include /* for abort() */ #include "rom/ets_sys.h" #if defined(CONFIG_FREERTOS_ASSERT_DISABLE) @@ -126,8 +127,6 @@ #endif #if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION -#include -#include "rom/ets_sys.h" #define UNTESTED_FUNCTION() { ets_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) #else #define UNTESTED_FUNCTION() @@ -152,9 +151,9 @@ *----------------------------------------------------------*/ #define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK ( CONFIG_TASK_WDT_CHECK_IDLE_TASK ) +#define configUSE_IDLE_HOOK ( CONFIG_FREERTOS_LEGACY_IDLE_HOOK ) -#define configUSE_TICK_HOOK ( CONFIG_INT_WDT ) +#define configUSE_TICK_HOOK ( CONFIG_FREERTOS_LEGACY_TICK_HOOK ) #define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ ) @@ -265,12 +264,6 @@ #define INCLUDE_eTaskGetState 1 #define configUSE_QUEUE_SETS 1 -#if (!defined XT_INTEXC_HOOKS) -#define configXT_INTEXC_HOOKS 1 /* Exception hooks used by certain tests */ -#if configUSE_TRACE_FACILITY_2 -#define configASSERT_2 1 /* Specific to Xtensa port */ -#endif -#endif #define configXT_BOARD 1 /* Board mode */ #define configXT_SIMULATOR 0 diff --git a/components/freertos/include/freertos/list.h b/components/freertos/include/freertos/list.h index b63df7f72..8606deba5 100644 --- a/components/freertos/include/freertos/list.h +++ b/components/freertos/include/freertos/list.h @@ -190,6 +190,10 @@ struct xLIST_ITEM }; typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticListItem_t) == sizeof(ListItem_t), "StaticListItem_t != ListItem_t"); +#endif + struct xMINI_LIST_ITEM { listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ @@ -199,6 +203,11 @@ struct xMINI_LIST_ITEM }; typedef struct xMINI_LIST_ITEM MiniListItem_t; +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticMiniListItem_t) == sizeof(MiniListItem_t), "StaticMiniListItem_t != MiniListItem_t"); +#endif + + /* * Definition of the type of queue used by the scheduler. */ @@ -211,6 +220,10 @@ typedef struct xLIST listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ } List_t; +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticList_t) == sizeof(List_t), "StaticList_t != List_t"); +#endif + /* * Access macro to set the owner of a list item. The owner of a list item * is the object (usually a TCB) that contains the list item. diff --git a/components/freertos/include/freertos/ringbuf.h b/components/freertos/include/freertos/ringbuf.h index 7884e9856..93ba30758 100644 --- a/components/freertos/include/freertos/ringbuf.h +++ b/components/freertos/include/freertos/ringbuf.h @@ -18,22 +18,34 @@ to this bit of memory will block. The requirement for items to be contiguous is slightly problematic when the only way to place the next item would involve a wraparound from the end to the beginning of the ringbuffer. This can -be solved in two ways: -- allow_split_items = pdTRUE: The insertion code will split the item in two items; one which fits +be solved (or not) in a few ways: +- type = RINGBUF_TYPE_ALLOWSPLIT: The insertion code will split the item in two items; one which fits in the space left at the end of the ringbuffer, one that contains the remaining data which is placed in the beginning. Two xRingbufferReceive calls will be needed to retrieve the data. -- allow_split_items = pdFALSE: The insertion code will leave the room at the end of the ringbuffer +- type = RINGBUF_TYPE_NOSPLIT: The insertion code will leave the room at the end of the ringbuffer unused and instead will put the entire item at the start of the ringbuffer, as soon as there is enough free space. +- type = RINGBUF_TYPE_BYTEBUF: This is your conventional byte-based ringbuffer. It does have no +overhead, but it has no item contiguousness either: a read will just give you the entire written +buffer space, or the space up to the end of the buffer, and writes can be broken up in any way +possible. Note that this type cannot do a 2nd read before returning the memory of the 1st. The maximum size of an item will be affected by this decision. When split items are allowed, it's acceptable to push items of (buffer_size)-16 bytes into the buffer. When it's not allowed, the -maximum size is (buffer_size/2)-8 bytes. +maximum size is (buffer_size/2)-8 bytes. The bytebuf can fill the entire buffer with data, it has +no overhead. */ //An opaque handle for a ringbuff object. typedef void * RingbufHandle_t; +//The various types of buffer +typedef enum { + RINGBUF_TYPE_NOSPLIT = 0, + RINGBUF_TYPE_ALLOWSPLIT, + RINGBUF_TYPE_BYTEBUF +} ringbuf_type_t; + /** * @brief Create a ring buffer @@ -45,7 +57,7 @@ typedef void * RingbufHandle_t; * * @return A RingbufHandle_t handle to the created ringbuffer, or NULL in case of error. */ -RingbufHandle_t xRingbufferCreate(size_t buf_length, BaseType_t allow_split_items); +RingbufHandle_t xRingbufferCreate(size_t buf_length, ringbuf_type_t type); /** @@ -120,6 +132,34 @@ void *xRingbufferReceive(RingbufHandle_t ringbuf, size_t *item_size, TickType_t void *xRingbufferReceiveFromISR(RingbufHandle_t ringbuf, size_t *item_size); +/** + * @brief Retrieve bytes from a ByteBuf type of ring buffer, specifying the maximum amount of bytes + * to return + * + * @param ringbuf - Ring buffer to retrieve the item from + * @param item_size - Pointer to a variable to which the size of the retrieved item will be written. + * @param xTicksToWait - Ticks to wait for items in the ringbuffer. + * + * @return Pointer to the retrieved item on success; *item_size filled with the length of the + * item. NULL on timeout, *item_size is untouched in that case. + */ +void *xRingbufferReceiveUpTo(RingbufHandle_t ringbuf, size_t *item_size, TickType_t ticks_to_wait, size_t wanted_size); + + +/** + * @brief Retrieve bytes from a ByteBuf type of ring buffer, specifying the maximum amount of bytes + * to return. Call this from an ISR. + * + * @param ringbuf - Ring buffer to retrieve the item from + * @param item_size - Pointer to a variable to which the size of the retrieved item will be written. + * + * @return Pointer to the retrieved item on success; *item_size filled with the length of the + * item. NULL when the ringbuffer is empty, *item_size is untouched in that case. + */ +void *xRingbufferReceiveUpToFromISR(RingbufHandle_t ringbuf, size_t *item_size, size_t wanted_size); + + + /** * @brief Return a previously-retrieved item to the ringbuffer * diff --git a/components/freertos/include/freertos/xtensa_api.h b/components/freertos/include/freertos/xtensa_api.h index 04ad7d62d..87922691d 100644 --- a/components/freertos/include/freertos/xtensa_api.h +++ b/components/freertos/include/freertos/xtensa_api.h @@ -42,7 +42,8 @@ typedef void (*xt_exc_handler)(XtExcFrame *); /* ------------------------------------------------------------------------------- - Call this function to set a handler for the specified exception. + Call this function to set a handler for the specified exception. The handler + will be installed on the core that calls this function. n - Exception number (type) f - Handler function address, NULL to uninstall handler. @@ -61,7 +62,8 @@ extern xt_exc_handler xt_set_exception_handler(int n, xt_exc_handler f); /* ------------------------------------------------------------------------------- - Call this function to set a handler for the specified interrupt. + Call this function to set a handler for the specified interrupt. The handler + will be installed on the core that calls this function. n - Interrupt number. f - Handler function address, NULL to uninstall handler. @@ -73,7 +75,8 @@ extern xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg); /* ------------------------------------------------------------------------------- - Call this function to enable the specified interrupts. + Call this function to enable the specified interrupts on the core that runs + this code. mask - Bit mask of interrupts to be enabled. ------------------------------------------------------------------------------- @@ -83,7 +86,8 @@ extern void xt_ints_on(unsigned int mask); /* ------------------------------------------------------------------------------- - Call this function to disable the specified interrupts. + Call this function to disable the specified interrupts on the core that runs + this code. mask - Bit mask of interrupts to be disabled. ------------------------------------------------------------------------------- diff --git a/components/freertos/queue.c b/components/freertos/queue.c index f404a243e..7c491f695 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -179,6 +179,11 @@ typedef struct QueueDefinition name below to enable the use of older kernel aware debuggers. */ typedef xQUEUE Queue_t; +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticQueue_t) == sizeof(Queue_t), "StaticQueue_t != Queue_t"); +#endif + + /*-----------------------------------------------------------*/ /* diff --git a/components/freertos/readme_smp.txt b/components/freertos/readme_smp.txt index 38f332416..fdd9b146b 100644 --- a/components/freertos/readme_smp.txt +++ b/components/freertos/readme_smp.txt @@ -19,11 +19,6 @@ it would on a single-core system: the other core still will keep on executing all it's own. Use a mux, queue or semaphore to protect your structures instead. -- While each core has individual interrupts, the handlers are shared. This -means that when you set a handler for an interrupt, it will get triggered if -the interrupt is triggered on both CPU0 as well as on CPU1. This is something -we may change in future FreeRTOS-esp32 releases. - - This FreeRTOS version has the task local storage backported from the 8.2.x versions. It, however, has an addition: you can also set a callback when you set the pointer. This callback will be called by the idle task, with the diff --git a/components/freertos/ringbuf.c b/components/freertos/ringbuf.c index 6045c5a69..67323e327 100644 --- a/components/freertos/ringbuf.c +++ b/components/freertos/ringbuf.c @@ -18,6 +18,7 @@ #include "freertos/queue.h" #include "freertos/xtensa_api.h" #include "freertos/ringbuf.h" +#include "esp_attr.h" #include #include #include @@ -25,6 +26,7 @@ typedef enum { flag_allowsplit = 1, + flag_bytebuf = 2, } rbflag_t; typedef enum { @@ -33,8 +35,10 @@ typedef enum { } itemflag_t; +typedef struct ringbuf_t ringbuf_t; + //The ringbuffer structure -typedef struct { +struct ringbuf_t { SemaphoreHandle_t free_space_sem; //Binary semaphore, wakes up writing threads when there's more free space SemaphoreHandle_t items_buffered_sem; //Binary semaphore, indicates there are new packets in the circular buffer. See remark. size_t size; //Size of the data storage @@ -44,7 +48,12 @@ typedef struct { uint8_t *data; //Data storage portMUX_TYPE mux; //Spinlock for actual data/ptr/struct modification rbflag_t flags; -} ringbuf_t; + size_t maxItemSize; + //The following keep function pointers to hold different implementations for ringbuffer management. + BaseType_t (*copyItemToRingbufImpl)(ringbuf_t *rb, uint8_t *buffer, size_t buffer_size); + uint8_t *(*getItemFromRingbufImpl)(ringbuf_t *rb, size_t *length, int wanted_length); + void (*returnItemToRingbufImpl)(ringbuf_t *rb, void *item); +}; @@ -73,14 +82,16 @@ static int ringbufferFreeMem(ringbuf_t *rb) return free_size-1; } -//Copies a single item to the ring buffer. Assumes there is space in the ringbuffer and + +//Copies a single item to the ring buffer; refuses to split items. Assumes there is space in the ringbuffer and //the ringbuffer is locked. Increases write_ptr to the next item. Returns pdTRUE on //success, pdFALSE if it can't make the item fit and the calling routine needs to retry //later or fail. //This function by itself is not threadsafe, always call from within a muxed section. -static BaseType_t copyItemToRingbuf(ringbuf_t *rb, uint8_t *buffer, size_t buffer_size) +static BaseType_t copyItemToRingbufNoSplit(ringbuf_t *rb, uint8_t *buffer, size_t buffer_size) { - size_t rbuffer_size=(buffer_size+3)&~3; //Payload length, rounded to next 32-bit value + size_t rbuffer_size; + rbuffer_size=(buffer_size+3)&~3; //Payload length, rounded to next 32-bit value configASSERT(((int)rb->write_ptr&3)==0); //write_ptr needs to be 32-bit aligned configASSERT(rb->write_ptr-(rb->data+rb->size) >= sizeof(buf_entry_hdr_t)); //need to have at least the size //of a header to the end of the ringbuff @@ -88,65 +99,28 @@ static BaseType_t copyItemToRingbuf(ringbuf_t *rb, uint8_t *buffer, size_t buffe //See if we have enough contiguous space to write the buffer. if (rem_len < rbuffer_size + sizeof(buf_entry_hdr_t)) { - //The buffer can't be contiguously written to the ringbuffer, but needs special handling. Do - //that depending on how the ringbuffer is configured. - //The code here is also expected to check if the buffer, mangled in whatever way is implemented, - //will still fit, and return pdFALSE if that is not the case. - if (rb->flags & flag_allowsplit) { - //Buffer plus header is not going to fit in the room from wr_pos to the end of the - //ringbuffer... we need to split the write in two. - //First, see if this will fit at all. - if (ringbufferFreeMem(rb) < (sizeof(buf_entry_hdr_t)*2)+rbuffer_size) { - //Will not fit. - return pdFALSE; - } - //Because the code at the end of the function makes sure we always have - //room for a header, this should never assert. - configASSERT(rem_len>=sizeof(buf_entry_hdr_t)); - //Okay, it should fit. Write everything. - //First, place bit of buffer that does fit. Write header first... - buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->write_ptr; - hdr->flags=0; - hdr->len=rem_len-sizeof(buf_entry_hdr_t); - rb->write_ptr+=sizeof(buf_entry_hdr_t); - rem_len-=sizeof(buf_entry_hdr_t); - if (rem_len!=0) { - //..then write the data bit that fits. - memcpy(rb->write_ptr, buffer, rem_len); - //Update vars so the code later on will write the rest of the data. - buffer+=rem_len; - rbuffer_size-=rem_len; - buffer_size-=rem_len; - } else { - //Huh, only the header fit. Mark as dummy so the receive function doesn't receive - //an useless zero-byte packet. - hdr->flags|=iflag_dummydata; - } - rb->write_ptr=rb->data; - } else { - //Buffer plus header is not going to fit in the room from wr_pos to the end of the - //ringbuffer... but we're not allowed to split the buffer. We need to fill the - //rest of the ringbuffer with a dummy item so we can place the data at the _start_ of - //the ringbuffer.. - //First, find out if we actually have enough space at the start of the ringbuffer to - //make this work (Again, we need 4 bytes extra because otherwise read_ptr==free_ptr) - if (rb->free_ptr-rb->data < rbuffer_size+sizeof(buf_entry_hdr_t)+4) { - //Will not fit. - return pdFALSE; - } - //If the read buffer hasn't wrapped around yet, there's no way this will work either. - if (rb->free_ptr > rb->write_ptr) { - //No luck. - return pdFALSE; - } - - //Okay, it will fit. Mark the rest of the ringbuffer space with a dummy packet. - buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->write_ptr; - hdr->flags=iflag_dummydata; - //Reset the write pointer to the start of the ringbuffer so the code later on can - //happily write the data. - rb->write_ptr=rb->data; + //Buffer plus header is not going to fit in the room from wr_pos to the end of the + //ringbuffer... but we're not allowed to split the buffer. We need to fill the + //rest of the ringbuffer with a dummy item so we can place the data at the _start_ of + //the ringbuffer.. + //First, find out if we actually have enough space at the start of the ringbuffer to + //make this work (Again, we need 4 bytes extra because otherwise read_ptr==free_ptr) + if (rb->free_ptr-rb->data < rbuffer_size+sizeof(buf_entry_hdr_t)+4) { + //Will not fit. + return pdFALSE; } + //If the read buffer hasn't wrapped around yet, there's no way this will work either. + if (rb->free_ptr > rb->write_ptr) { + //No luck. + return pdFALSE; + } + + //Okay, it will fit. Mark the rest of the ringbuffer space with a dummy packet. + buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->write_ptr; + hdr->flags=iflag_dummydata; + //Reset the write pointer to the start of the ringbuffer so the code later on can + //happily write the data. + rb->write_ptr=rb->data; } else { //No special handling needed. Checking if it's gonna fit probably still is a good idea. if (ringbufferFreeMem(rb) < sizeof(buf_entry_hdr_t)+rbuffer_size) { @@ -174,9 +148,117 @@ static BaseType_t copyItemToRingbuf(ringbuf_t *rb, uint8_t *buffer, size_t buffe return pdTRUE; } +//Copies a single item to the ring buffer; allows split items. Assumes there is space in the ringbuffer and +//the ringbuffer is locked. Increases write_ptr to the next item. Returns pdTRUE on +//success, pdFALSE if it can't make the item fit and the calling routine needs to retry +//later or fail. +//This function by itself is not threadsafe, always call from within a muxed section. +static BaseType_t copyItemToRingbufAllowSplit(ringbuf_t *rb, uint8_t *buffer, size_t buffer_size) +{ + size_t rbuffer_size; + rbuffer_size=(buffer_size+3)&~3; //Payload length, rounded to next 32-bit value + configASSERT(((int)rb->write_ptr&3)==0); //write_ptr needs to be 32-bit aligned + configASSERT(rb->write_ptr-(rb->data+rb->size) >= sizeof(buf_entry_hdr_t)); //need to have at least the size + //of a header to the end of the ringbuff + size_t rem_len=(rb->data + rb->size) - rb->write_ptr; //length remaining until end of ringbuffer + + //See if we have enough contiguous space to write the buffer. + if (rem_len < rbuffer_size + sizeof(buf_entry_hdr_t)) { + //The buffer can't be contiguously written to the ringbuffer, but needs special handling. Do + //that depending on how the ringbuffer is configured. + //The code here is also expected to check if the buffer, mangled in whatever way is implemented, + //will still fit, and return pdFALSE if that is not the case. + //Buffer plus header is not going to fit in the room from wr_pos to the end of the + //ringbuffer... we need to split the write in two. + //First, see if this will fit at all. + if (ringbufferFreeMem(rb) < (sizeof(buf_entry_hdr_t)*2)+rbuffer_size) { + //Will not fit. + return pdFALSE; + } + //Because the code at the end of the function makes sure we always have + //room for a header, this should never assert. + configASSERT(rem_len>=sizeof(buf_entry_hdr_t)); + //Okay, it should fit. Write everything. + //First, place bit of buffer that does fit. Write header first... + buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->write_ptr; + hdr->flags=0; + hdr->len=rem_len-sizeof(buf_entry_hdr_t); + rb->write_ptr+=sizeof(buf_entry_hdr_t); + rem_len-=sizeof(buf_entry_hdr_t); + if (rem_len!=0) { + //..then write the data bit that fits. + memcpy(rb->write_ptr, buffer, rem_len); + //Update vars so the code later on will write the rest of the data. + buffer+=rem_len; + rbuffer_size-=rem_len; + buffer_size-=rem_len; + } else { + //Huh, only the header fit. Mark as dummy so the receive function doesn't receive + //an useless zero-byte packet. + hdr->flags|=iflag_dummydata; + } + rb->write_ptr=rb->data; + } else { + //No special handling needed. Checking if it's gonna fit probably still is a good idea. + if (ringbufferFreeMem(rb) < sizeof(buf_entry_hdr_t)+rbuffer_size) { + //Buffer is not going to fit, period. + return pdFALSE; + } + } + + //If we are here, the buffer is guaranteed to fit in the space starting at the write pointer. + buf_entry_hdr_t *hdr=(buf_entry_hdr_t *)rb->write_ptr; + hdr->len=buffer_size; + hdr->flags=0; + rb->write_ptr+=sizeof(buf_entry_hdr_t); + memcpy(rb->write_ptr, buffer, buffer_size); + rb->write_ptr+=rbuffer_size; + + //The buffer will wrap around if we don't have room for a header anymore. + if ((rb->data+rb->size)-rb->write_ptr < sizeof(buf_entry_hdr_t)) { + //'Forward' the write buffer until we are at the start of the ringbuffer. + //The read pointer will always be at the start of a full header, which cannot + //exist at the point of the current write pointer, so there's no chance of overtaking + //that. + rb->write_ptr=rb->data; + } + return pdTRUE; +} + + +//Copies a bunch of daya to the ring bytebuffer. Assumes there is space in the ringbuffer and +//the ringbuffer is locked. Increases write_ptr to the next item. Returns pdTRUE on +//success, pdFALSE if it can't make the item fit and the calling routine needs to retry +//later or fail. +//This function by itself is not threadsafe, always call from within a muxed section. +static BaseType_t copyItemToRingbufByteBuf(ringbuf_t *rb, uint8_t *buffer, size_t buffer_size) +{ + size_t rem_len=(rb->data + rb->size) - rb->write_ptr; //length remaining until end of ringbuffer + + //See if we have enough contiguous space to write the buffer. + if (rem_len < buffer_size) { + //...Nope. Write the data bit that fits. + memcpy(rb->write_ptr, buffer, rem_len); + //Update vars so the code later on will write the rest of the data. + buffer+=rem_len; + buffer_size-=rem_len; + rb->write_ptr=rb->data; + } + + //If we are here, the buffer is guaranteed to fit in the space starting at the write pointer. + memcpy(rb->write_ptr, buffer, buffer_size); + rb->write_ptr+=buffer_size; + //The buffer will wrap around if we're at the end. + if ((rb->data+rb->size)==rb->write_ptr) { + rb->write_ptr=rb->data; + } + return pdTRUE; +} + //Retrieves a pointer to the data of the next item, or NULL if this is not possible. //This function by itself is not threadsafe, always call from within a muxed section. -static uint8_t *getItemFromRingbuf(ringbuf_t *rb, size_t *length) +//Because we always return one item, this function ignores the wanted_length variable. +static uint8_t *getItemFromRingbufDefault(ringbuf_t *rb, size_t *length, int wanted_length) { uint8_t *ret; configASSERT(((int)rb->read_ptr&3)==0); @@ -210,10 +292,48 @@ static uint8_t *getItemFromRingbuf(ringbuf_t *rb, size_t *length) return ret; } +//Retrieves a pointer to the data in the buffer, or NULL if this is not possible. +//This function by itself is not threadsafe, always call from within a muxed section. +//This function honours the wanted_length and will never return more data than this. +static uint8_t *getItemFromRingbufByteBuf(ringbuf_t *rb, size_t *length, int wanted_length) +{ + uint8_t *ret; + if (rb->read_ptr != rb->free_ptr) { + //This type of ringbuff does not support multiple outstanding buffers. + return NULL; + } + if (rb->read_ptr == rb->write_ptr) { + //No data available. + return NULL; + } + ret=rb->read_ptr; + if (rb->read_ptr > rb->write_ptr) { + //Available data wraps around. Give data until the end of the buffer. + *length=rb->size-(rb->read_ptr - rb->data); + if (wanted_length != 0 && *length > wanted_length) { + *length=wanted_length; + rb->read_ptr+=wanted_length; + } else { + rb->read_ptr=rb->data; + } + } else { + //Return data up to write pointer. + *length=rb->write_ptr -rb->read_ptr; + if (wanted_length != 0 && *length > wanted_length) { + *length=wanted_length; + rb->read_ptr+=wanted_length; + } else { + rb->read_ptr=rb->write_ptr; + } + } + return ret; +} + + //Returns an item to the ringbuffer. Will mark the item as free, and will see if the free pointer //can be increase. //This function by itself is not threadsafe, always call from within a muxed section. -static void returnItemToRingbuf(ringbuf_t *rb, void *item) { +static void returnItemToRingbufDefault(ringbuf_t *rb, void *item) { uint8_t *data=(uint8_t*)item; configASSERT(((int)rb->free_ptr&3)==0); configASSERT(data >= rb->data); @@ -243,12 +363,26 @@ static void returnItemToRingbuf(ringbuf_t *rb, void *item) { if ((rb->data+rb->size)-rb->free_ptr < sizeof(buf_entry_hdr_t)) { rb->free_ptr=rb->data; } + //The free_ptr can not exceed read_ptr, otherwise write_ptr might overwrite read_ptr. + //Read_ptr can not set to rb->data with free_ptr, otherwise write_ptr might wrap around to rb->data. + if(rb->free_ptr == rb->read_ptr) break; //Next header hdr=(buf_entry_hdr_t *)rb->free_ptr; } } +//Returns an item to the ringbuffer. Will mark the item as free, and will see if the free pointer +//can be increase. +//This function by itself is not threadsafe, always call from within a muxed section. +static void returnItemToRingbufBytebuf(ringbuf_t *rb, void *item) { + uint8_t *data=(uint8_t*)item; + configASSERT(data >= rb->data); + configASSERT(data < rb->data+rb->size); + //Free the read memory. + rb->free_ptr=rb->read_ptr; +} + void xRingbufferPrintInfo(RingbufHandle_t ringbuf) { ringbuf_t *rb=(ringbuf_t *)ringbuf; @@ -259,7 +393,7 @@ void xRingbufferPrintInfo(RingbufHandle_t ringbuf) -RingbufHandle_t xRingbufferCreate(size_t buf_length, BaseType_t allow_split_items) +RingbufHandle_t xRingbufferCreate(size_t buf_length, ringbuf_type_t type) { ringbuf_t *rb = malloc(sizeof(ringbuf_t)); if (rb==NULL) goto err; @@ -273,9 +407,35 @@ RingbufHandle_t xRingbufferCreate(size_t buf_length, BaseType_t allow_split_item rb->free_space_sem = xSemaphoreCreateBinary(); rb->items_buffered_sem = xSemaphoreCreateBinary(); rb->flags=0; - if (allow_split_items) rb->flags|=flag_allowsplit; + if (type==RINGBUF_TYPE_ALLOWSPLIT) { + rb->flags|=flag_allowsplit; + rb->copyItemToRingbufImpl=copyItemToRingbufAllowSplit; + rb->getItemFromRingbufImpl=getItemFromRingbufDefault; + rb->returnItemToRingbufImpl=returnItemToRingbufDefault; + //Calculate max item size. Worst case, we need to split an item into two, which means two headers of overhead. + rb->maxItemSize=rb->size-(sizeof(buf_entry_hdr_t)*2)-4; + } else if (type==RINGBUF_TYPE_BYTEBUF) { + rb->flags|=flag_bytebuf; + rb->copyItemToRingbufImpl=copyItemToRingbufByteBuf; + rb->getItemFromRingbufImpl=getItemFromRingbufByteBuf; + rb->returnItemToRingbufImpl=returnItemToRingbufBytebuf; + //Calculate max item size. We have no headers and can split anywhere -> size is total size minus one. + rb->maxItemSize=rb->size-1; + } else if (type==RINGBUF_TYPE_NOSPLIT) { + rb->copyItemToRingbufImpl=copyItemToRingbufNoSplit; + rb->getItemFromRingbufImpl=getItemFromRingbufDefault; + rb->returnItemToRingbufImpl=returnItemToRingbufDefault; + //Calculate max item size. Worst case, we have the write ptr in such a position that we are lacking four bytes of free + //memory to put an item into the rest of the memory. If this happens, we have to dummy-fill + //(item_data-4) bytes of buffer, then we only have (size-(item_data-4) bytes left to fill + //with the real item. (item size being header+data) + rb->maxItemSize=(rb->size/2)-sizeof(buf_entry_hdr_t)-4; + } else { + configASSERT(0); + } if (rb->free_space_sem == NULL || rb->items_buffered_sem == NULL) goto err; vPortCPUInitializeMutex(&rb->mux); + return (RingbufHandle_t)rb; err: @@ -303,18 +463,7 @@ size_t xRingbufferGetMaxItemSize(RingbufHandle_t ringbuf) { ringbuf_t *rb=(ringbuf_t *)ringbuf; configASSERT(rb); - //In both cases, we return 4 bytes less than what we actually can have. If the ringbuffer is - //indeed entirely filled, read_ptr==free_ptr, which throws off the free space calculation. - if (rb->flags & flag_allowsplit) { - //Worst case, we need to split an item into two, which means two headers of overhead. - return rb->size-(sizeof(buf_entry_hdr_t)*2)-4; - } else { - //Worst case, we have the write ptr in such a position that we are lacking four bytes of free - //memory to put an item into the rest of the memory. If this happens, we have to dummy-fill - //(item_data-4) bytes of buffer, then we only have (size-(item_data-4) bytes left to fill - //with the real item. (item size being header+data) - return (rb->size/2)-sizeof(buf_entry_hdr_t)-4; - } + return rb->maxItemSize; } BaseType_t xRingbufferSend(RingbufHandle_t ringbuf, void *data, size_t dataSize, TickType_t ticks_to_wait) @@ -322,7 +471,8 @@ BaseType_t xRingbufferSend(RingbufHandle_t ringbuf, void *data, size_t dataSize, ringbuf_t *rb=(ringbuf_t *)ringbuf; size_t needed_size=dataSize+sizeof(buf_entry_hdr_t); BaseType_t done=pdFALSE; - portTickType ticks_end=xTaskGetTickCount() + ticks_to_wait; + TickType_t ticks_end = xTaskGetTickCount() + ticks_to_wait; + TickType_t ticks_remaining = ticks_to_wait; configASSERT(rb); @@ -337,22 +487,31 @@ BaseType_t xRingbufferSend(RingbufHandle_t ringbuf, void *data, size_t dataSize, if (ringbufferFreeMem(rb) < needed_size) { //Data does not fit yet. Wait until the free_space_sem is given, then re-evaluate. - BaseType_t r = xSemaphoreTake(rb->free_space_sem, ticks_to_wait); + BaseType_t r = xSemaphoreTake(rb->free_space_sem, ticks_remaining); if (r == pdFALSE) { //Timeout. return pdFALSE; } - //Adjust ticks_to_wait; we may have waited less than that and in the case the free memory still is not enough, + //Adjust ticks_remaining; we may have waited less than that and in the case the free memory still is not enough, //we will need to wait some more. - ticks_to_wait = ticks_end - xTaskGetTickCount(); + if (ticks_to_wait != portMAX_DELAY) { + ticks_remaining = ticks_end - xTaskGetTickCount(); + } + + // ticks_remaining will always be less than or equal to the original ticks_to_wait, + // unless the timeout is reached - in which case it unsigned underflows to a much + // higher value. + // + // (Check is written this non-intuitive way to allow for the case where xTaskGetTickCount() + // has overflowed but the ticks_end value has not overflowed.) } - } while (ringbufferFreeMem(rb) < needed_size && ticks_to_wait>=0); - + } while (ringbufferFreeMem(rb) < needed_size && ticks_remaining > 0 && ticks_remaining <= ticks_to_wait); + //Lock the mux in order to make sure no one else is messing with the ringbuffer and do the copy. portENTER_CRITICAL(&rb->mux); //Another thread may have been able to sneak its write first. Check again now we locked the ringbuff, and retry //everything if this is the case. Otherwise, we can write and are done. - done=copyItemToRingbuf(rb, data, dataSize); + done=rb->copyItemToRingbufImpl(rb, data, dataSize); portEXIT_CRITICAL(&rb->mux); } xSemaphoreGive(rb->items_buffered_sem); @@ -371,8 +530,7 @@ BaseType_t xRingbufferSendFromISR(RingbufHandle_t ringbuf, void *data, size_t da //Does not fit in the remaining space in the ringbuffer. write_succeeded=pdFALSE; } else { - copyItemToRingbuf(rb, data, dataSize); - write_succeeded=pdTRUE; + write_succeeded = rb->copyItemToRingbufImpl(rb, data, dataSize); } portEXIT_CRITICAL_ISR(&rb->mux); if (write_succeeded) { @@ -382,7 +540,7 @@ BaseType_t xRingbufferSendFromISR(RingbufHandle_t ringbuf, void *data, size_t da } -void *xRingbufferReceive(RingbufHandle_t ringbuf, size_t *item_size, TickType_t ticks_to_wait) +static void *xRingbufferReceiveGeneric(RingbufHandle_t ringbuf, size_t *item_size, TickType_t ticks_to_wait, size_t wanted_size) { ringbuf_t *rb=(ringbuf_t *)ringbuf; uint8_t *itemData; @@ -399,7 +557,7 @@ void *xRingbufferReceive(RingbufHandle_t ringbuf, size_t *item_size, TickType_t } //Okay, we seem to have data in the buffer. Grab the mux and copy it out if it's still there. portENTER_CRITICAL(&rb->mux); - itemData=getItemFromRingbuf(rb, item_size); + itemData=rb->getItemFromRingbufImpl(rb, item_size, wanted_size); portEXIT_CRITICAL(&rb->mux); if (itemData) { //We managed to get an item. @@ -409,6 +567,11 @@ void *xRingbufferReceive(RingbufHandle_t ringbuf, size_t *item_size, TickType_t return (void*)itemData; } +void *xRingbufferReceive(RingbufHandle_t ringbuf, size_t *item_size, TickType_t ticks_to_wait) +{ + return xRingbufferReceiveGeneric(ringbuf, item_size, ticks_to_wait, 0); +} + void *xRingbufferReceiveFromISR(RingbufHandle_t ringbuf, size_t *item_size) { @@ -416,7 +579,28 @@ void *xRingbufferReceiveFromISR(RingbufHandle_t ringbuf, size_t *item_size) uint8_t *itemData; configASSERT(rb); portENTER_CRITICAL_ISR(&rb->mux); - itemData=getItemFromRingbuf(rb, item_size); + itemData=rb->getItemFromRingbufImpl(rb, item_size, 0); + portEXIT_CRITICAL_ISR(&rb->mux); + return (void*)itemData; +} + +void *xRingbufferReceiveUpTo(RingbufHandle_t ringbuf, size_t *item_size, TickType_t ticks_to_wait, size_t wanted_size) { + ringbuf_t *rb=(ringbuf_t *)ringbuf; + if (wanted_size == 0) return NULL; + configASSERT(rb); + configASSERT(rb->flags & flag_bytebuf); + return xRingbufferReceiveGeneric(ringbuf, item_size, ticks_to_wait, wanted_size); +} + +void *xRingbufferReceiveUpToFromISR(RingbufHandle_t ringbuf, size_t *item_size, size_t wanted_size) +{ + ringbuf_t *rb=(ringbuf_t *)ringbuf; + uint8_t *itemData; + if (wanted_size == 0) return NULL; + configASSERT(rb); + configASSERT(rb->flags & flag_bytebuf); + portENTER_CRITICAL_ISR(&rb->mux); + itemData=rb->getItemFromRingbufImpl(rb, item_size, 0); portEXIT_CRITICAL_ISR(&rb->mux); return (void*)itemData; } @@ -426,7 +610,7 @@ void vRingbufferReturnItem(RingbufHandle_t ringbuf, void *item) { ringbuf_t *rb=(ringbuf_t *)ringbuf; portENTER_CRITICAL_ISR(&rb->mux); - returnItemToRingbuf(rb, item); + rb->returnItemToRingbufImpl(rb, item); portEXIT_CRITICAL_ISR(&rb->mux); xSemaphoreGive(rb->free_space_sem); } @@ -436,7 +620,7 @@ void vRingbufferReturnItemFromISR(RingbufHandle_t ringbuf, void *item, BaseType_ { ringbuf_t *rb=(ringbuf_t *)ringbuf; portENTER_CRITICAL_ISR(&rb->mux); - returnItemToRingbuf(rb, item); + rb->returnItemToRingbufImpl(rb, item); portEXIT_CRITICAL_ISR(&rb->mux); xSemaphoreGiveFromISR(rb->free_space_sem, higher_prio_task_awoken); } diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index b79d3a98b..16cce3b96 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -242,6 +242,10 @@ typedef struct tskTaskControlBlock below to enable the use of older kernel aware debuggers. */ typedef tskTCB TCB_t; +#if __GNUC_PREREQ(4, 6) +_Static_assert(sizeof(StaticTask_t) == sizeof(TCB_t), "StaticTask_t != TCB_t"); +#endif + /* * Some kernel aware debuggers require the data the debugger needs access to to * be global, rather than file scope. @@ -476,6 +480,7 @@ to its original value when it is released. */ #if configUSE_TICK_HOOK > 0 extern void vApplicationTickHook( void ); #endif +extern void esp_vApplicationTickHook( void ); #if portFIRST_TASK_HOOK extern void vPortFirstTaskHook(TaskFunction_t taskfn); @@ -2360,22 +2365,21 @@ BaseType_t xSwitchRequired = pdFALSE; We can't really calculate what we need, that's done on core 0... just assume we need a switch. ToDo: Make this more intelligent? -- JD */ - //We do need the tick hook to satisfy the int watchdog. - #if ( configUSE_TICK_HOOK == 1 ) { /* Guard against the tick hook being called when the pended tick count is being unwound (when the scheduler is being unlocked). */ if( ( uxSchedulerSuspended[ xPortGetCoreID() ] != ( UBaseType_t ) pdFALSE ) || uxPendedTicks == ( UBaseType_t ) 0U ) { + #if ( configUSE_TICK_HOOK == 1 ) vApplicationTickHook(); + #endif /* configUSE_TICK_HOOK */ + esp_vApplicationTickHook(); } else { mtCOVERAGE_TEST_MARKER(); } } - #endif /* configUSE_TICK_HOOK */ - return pdTRUE; } @@ -2506,20 +2510,21 @@ BaseType_t xSwitchRequired = pdFALSE; } #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ - #if ( configUSE_TICK_HOOK == 1 ) { /* Guard against the tick hook being called when the pended tick count is being unwound (when the scheduler is being unlocked). */ if( uxPendedTicks == ( UBaseType_t ) 0U ) { + #if ( configUSE_TICK_HOOK == 1 ) vApplicationTickHook(); + #endif /* configUSE_TICK_HOOK */ + esp_vApplicationTickHook(); } else { mtCOVERAGE_TEST_MARKER(); } } - #endif /* configUSE_TICK_HOOK */ taskEXIT_CRITICAL_ISR(&xTaskQueueMutex); } else @@ -2533,6 +2538,7 @@ BaseType_t xSwitchRequired = pdFALSE; vApplicationTickHook(); } #endif + esp_vApplicationTickHook(); } #if ( configUSE_PREEMPTION == 1 ) @@ -2702,7 +2708,7 @@ void vTaskSwitchContext( void ) taskENTER_CRITICAL_ISR(&xTaskQueueMutex); unsigned portBASE_TYPE foundNonExecutingWaiter = pdFALSE, ableToSchedule = pdFALSE, resetListHead; - unsigned portBASE_TYPE uxDynamicTopReady = uxTopReadyPriority; + portBASE_TYPE uxDynamicTopReady = uxTopReadyPriority; unsigned portBASE_TYPE holdTop=pdFALSE; /* @@ -2715,8 +2721,6 @@ void vTaskSwitchContext( void ) while ( ableToSchedule == pdFALSE && uxDynamicTopReady >= 0 ) { - configASSERT( uxTopReadyPriority>=0 ); - configASSERT( uxDynamicTopReady>=0 ); resetListHead = pdFALSE; // Nothing to do for empty lists if (!listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxDynamicTopReady ] ) )) { @@ -3270,6 +3274,12 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) vApplicationIdleHook(); } #endif /* configUSE_IDLE_HOOK */ + { + /* Call the esp-idf hook system */ + extern void esp_vApplicationIdleHook( void ); + esp_vApplicationIdleHook(); + } + /* This conditional compilation should use inequality to 0, not equality to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when diff --git a/components/freertos/test/component.mk b/components/freertos/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/freertos/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/freertos/test/test_freertos.c b/components/freertos/test/test_freertos.c new file mode 100644 index 000000000..ced375279 --- /dev/null +++ b/components/freertos/test/test_freertos.c @@ -0,0 +1,229 @@ +/* + Test for multicore FreeRTOS. This test spins up threads, fiddles with queues etc. +*/ + +#include +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + + +void ets_isr_unmask(uint32_t unmask); + +static xQueueHandle myQueue; +static xQueueHandle uartRxQueue; + +int ctr; + +#if 1 +//Idle-loop for delay. Tests involuntary yielding +static void cvTaskDelay(int dummy) +{ + volatile int i; + for (i = 0; i < (1 << 17); i++); +} +#else +//Delay task execution using FreeRTOS methods. Tests voluntary yielding. +#define cvTaskDelay(x) vTaskDelay(x) +#endif + +#if 0 +static void dosegfault3(int i) +{ + volatile char *p = (volatile char *)0; + *p = i; +} + +static void dosegfault2(int i) +{ + if (i > 3) { + dosegfault3(i); + } +} + +static void dosegfault(int i) +{ + if (i < 5) { + dosegfault(i + 1); + } + dosegfault2(i); +} +#endif + +static void queueSender(void *pvParameters) +{ + int myCtr = xPortGetCoreID() * 100000; + while (1) { + printf("Core %d: Send to queue: %d\n", xPortGetCoreID(), myCtr); + xQueueSend(myQueue, (void *)(&myCtr), portMAX_DELAY); + printf("Send to queue done.\n"); + cvTaskDelay(100); + myCtr++; + } +} + +static void queueReceiver(void *pvParameters) +{ + int theCtr; + while (1) { + xQueueReceive(myQueue, &theCtr, portMAX_DELAY); + printf("Core %d: Receive from queue: %d\n", xPortGetCoreID(), theCtr); + } +} + + +static void tskone(void *pvParameters) +{ +// char *p=(char *)0; + while (1) { + ctr++; +// if (ctr>60) dosegfault(3); + printf("Task1, core %d, ctr=%d\n", xPortGetCoreID(), ctr); + cvTaskDelay(500); + } +} + +static void tsktwo(void *pvParameters) +{ + while (1) { + ctr++; + printf("Task2, core %d, ctr=%d\n", xPortGetCoreID(), ctr); + cvTaskDelay(500); + } +} + +static void tskthree(void *pvParameters) +{ + while (1) { + ctr++; + printf("Task3, core %d, ctr=%d\n", xPortGetCoreID(), ctr); + cvTaskDelay(500); + } +} + +static void tskfour(void *pvParameters) +{ + while (1) { + ctr++; + printf("Task4, core %d, ctr=%d\n", xPortGetCoreID(), ctr); + cvTaskDelay(500); + } +} + +static void tskfive(void *pvParameters) +{ + while (1) { + ctr++; + printf("Task5, core %d, ctr=%d\n", xPortGetCoreID(), ctr); + cvTaskDelay(500); + } +} + +static void tskyield(void *pvParameters) +{ + while (1) { + portYIELD(); + } +} + +static void tskUartRecv(void *pvParameters) +{ + char c; + while (1) { + xQueueReceive(uartRxQueue, &c, portMAX_DELAY); + printf("Uart received %c!\n", c); + } +} + + +static void uartIsrHdl(void *arg) +{ + char c; + BaseType_t xHigherPriorityTaskWoken; + SET_PERI_REG_MASK(UART_INT_CLR_REG(0), UART_RXFIFO_FULL_INT_CLR); + while (READ_PERI_REG(UART_STATUS_REG(0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) { + c = READ_PERI_REG(UART_FIFO_REG(0)); + xQueueSendFromISR(uartRxQueue, &c, &xHigherPriorityTaskWoken); + printf("ISR: %c\n", c); + } + if (xHigherPriorityTaskWoken) { + portYIELD_FROM_ISR(); + } +} + +static void uartRxInit(xQueueHandle q) +{ + uint32_t reg_val; + + PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_U0RXD); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD_U0TXD); + + + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_U0RXD); + +// reg_val = READ_PERI_REG(UART_CONF1(0)); + reg_val = (1 << UART_RXFIFO_FULL_THRHD_S); + WRITE_PERI_REG(UART_CONF1_REG(0), reg_val); + CLEAR_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_TXFIFO_EMPTY_INT_ENA | UART_RXFIFO_TOUT_INT_ENA); + SET_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_RXFIFO_FULL_INT_ENA); + + printf("Enabling int %d\n", ETS_UART0_INUM); + REG_SET_FIELD(DPORT_PRO_UART_INTR_MAP_REG, DPORT_PRO_UART_INTR_MAP, ETS_UART0_INUM); + REG_SET_FIELD(DPORT_PRO_UART1_INTR_MAP_REG, DPORT_PRO_UART1_INTR_MAP, ETS_UART0_INUM); + + xt_set_interrupt_handler(ETS_UART0_INUM, uartIsrHdl, NULL); + xt_ints_on(1 << ETS_UART0_INUM); + +} + +// TODO: split this thing into separate orthogonal tests +TEST_CASE("Bunch of FreeRTOS tests", "[freertos]") +{ + char *tst; + TaskHandle_t th[12]; + int i; + printf("%s\n", __FUNCTION__); + tst = pvPortMalloc(16); + printf("Test malloc returns addr %p\n", tst); + printf("Free heap: %u\n", xPortGetFreeHeapSize()); + myQueue = xQueueCreate(10, sizeof(int)); + uartRxQueue = xQueueCreate(256, sizeof(char)); + printf("Free heap: %u\n", xPortGetFreeHeapSize()); + + printf("Creating tasks\n"); + xTaskCreatePinnedToCore(tskyield , "tskyield1" , 2048, NULL, 3, &th[0], 0); + xTaskCreatePinnedToCore(tskyield , "tskyield2" , 2048, NULL, 3, &th[1], 1); + + xTaskCreatePinnedToCore(tskone , "tskone" , 2048, NULL, 3, &th[2], 0); + xTaskCreatePinnedToCore(tsktwo , "tsktwo" , 2048, NULL, 3, &th[3], 1); + xTaskCreatePinnedToCore(tskthree, "tskthree", 2048, NULL, 3, &th[4], 0); + xTaskCreatePinnedToCore(tskfour , "tskfour" , 2048, NULL, 3, &th[5], tskNO_AFFINITY); + xTaskCreatePinnedToCore(tskfive , "tskfive" , 2048, NULL, 3, &th[6], tskNO_AFFINITY); + xTaskCreatePinnedToCore(queueSender , "qsend1" , 2048, NULL, 3, &th[7], 0); + xTaskCreatePinnedToCore(queueSender , "qsend2" , 2048, NULL, 3, &th[8], 1); + xTaskCreatePinnedToCore(queueReceiver , "qrecv1" , 2048, NULL, 3, &th[9], 1); + xTaskCreatePinnedToCore(queueReceiver , "qrecv2" , 2048, NULL, 3, &th[10], 0); + xTaskCreatePinnedToCore(tskUartRecv , "tskuart" , 2048, NULL, 4, &th[11], 1); + printf("Free heap: %u\n", xPortGetFreeHeapSize()); + uartRxInit(uartRxQueue); + + // Let stuff run for 20s + vTaskDelay(20000 / portTICK_PERIOD_MS); + + //Shut down all the tasks + for (i = 0; i < 12; i++) { + vTaskDelete(th[i]); + } + xt_ints_off(1 << ETS_UART0_INUM); +} + diff --git a/components/freertos/test/test_freertos_eventgroups.c b/components/freertos/test/test_freertos_eventgroups.c new file mode 100644 index 000000000..35a5cc4ed --- /dev/null +++ b/components/freertos/test/test_freertos_eventgroups.c @@ -0,0 +1,105 @@ +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/event_groups.h" +#include "unity.h" + +#define BIT_CALL (1 << 0) +#define BIT_RESPONSE(TASK) (1 << (TASK+1)) +#define ALL_RESPONSE_BITS (((1 << NUM_TASKS) - 1) << 1) + +static const int NUM_TASKS = 4; +static const int COUNT = 4000; +static EventGroupHandle_t eg; + +static void task_event_group_call_response(void *param) +{ + int task_num = (int)param; + + printf("Started %d\n", task_num); + + for (int i = 0; i < COUNT; i++) { + /* Wait until the common "call" bit is set, starts off all tasks + (clear on return) */ + while (!xEventGroupWaitBits(eg, BIT_CALL, true, false, portMAX_DELAY)) { + } + + /* Set our individual "response" bit */ + xEventGroupSetBits(eg, BIT_RESPONSE(task_num)); + } + + printf("Task %d done\n", task_num); + + /* Delay is due to not-yet-fixed bug with deleting tasks at same time */ + vTaskDelay(100 / portTICK_RATE_MS); + vTaskDelete(NULL); +} + +TEST_CASE("FreeRTOS Event Groups", "[freertos]") +{ + eg = xEventGroupCreate(); + + /* Note: task_event_group_call_response all have higher priority than us, so will block together. + + This is important because we need to know they'll all have blocked on BIT_CALL each time we + signal it, or they get out of sync. + */ + for (int c = 0; c < NUM_TASKS; c++) { + xTaskCreatePinnedToCore(task_event_group_call_response, "tsk_call_resp", 4096, (void *)c, configMAX_PRIORITIES - 1, NULL, c % portNUM_PROCESSORS); + } + /* Scheduler weirdness, if we don't sleep a few ticks here then the tasks on the other CPU aren't running yet... */ + vTaskDelay(10); + + for (int i = 0; i < COUNT; i++) { + if (i % 100 == 0) { + //printf("Call %d\n", i); + } + /* signal all tasks with "CALL" bit... */ + xEventGroupSetBits(eg, BIT_CALL); + + while (xEventGroupWaitBits(eg, ALL_RESPONSE_BITS, true, true, portMAX_DELAY) != ALL_RESPONSE_BITS) { + } + } +} + + +#define BIT_DONE(X) (1<<(NUM_TASKS+1+X)) + +static void task_test_sync(void *param) +{ + int task_num = (int)param; + + printf("Started %d\n", task_num); + + for (int i = 0; i < COUNT; i++) { + /* set our bit, and wait on all tasks to set their bits */ + xEventGroupSync(eg, BIT_RESPONSE(task_num), ALL_RESPONSE_BITS, portMAX_DELAY); + /* clear our bit */ + xEventGroupClearBits(eg, BIT_RESPONSE(task_num)); + } + int after_done = xEventGroupSetBits(eg, BIT_DONE(task_num)); + + printf("Done %d = %x\n", task_num, after_done); + + /* Delay is due to not-yet-fixed bug with deleting tasks at same time */ + vTaskDelay(100 / portTICK_RATE_MS); + vTaskDelete(NULL); +} + +TEST_CASE("FreeRTOS Event Group Sync", "[freertos]") +{ + eg = xEventGroupCreate(); + + for (int c = 0; c < NUM_TASKS; c++) { + xTaskCreatePinnedToCore(task_test_sync, "task_test_sync", 4096, (void *)c, configMAX_PRIORITIES - 1, NULL, c % portNUM_PROCESSORS); + } + + for (int c = 0; c < NUM_TASKS; c++) { + printf("Waiting on %d (%x)\n", c, BIT_DONE(c)); + xEventGroupWaitBits(eg, BIT_DONE(c), false, false, portMAX_DELAY); + } +} + diff --git a/components/freertos/test/test_freertos_task_delete.c b/components/freertos/test/test_freertos_task_delete.c new file mode 100644 index 000000000..3101db256 --- /dev/null +++ b/components/freertos/test/test_freertos_task_delete.c @@ -0,0 +1,22 @@ +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/event_groups.h" +#include "unity.h" + +static void task_delete_self(void *param) +{ + printf("Task %p running on core %d. Deleting shortly...\n", xTaskGetCurrentTaskHandle(), xPortGetCoreID()); + vTaskDelete(NULL); +} + +TEST_CASE("FreeRTOS Delete Tasks", "[freertos]") +{ + xTaskCreatePinnedToCore(task_delete_self, "tsk_self_a", 4096, NULL, configMAX_PRIORITIES - 1, NULL, 0); + xTaskCreatePinnedToCore(task_delete_self, "tsk_self_a", 4096, NULL, configMAX_PRIORITIES - 1, NULL, 0); + vTaskDelay(200 / portTICK_PERIOD_MS); + printf("Done?\n"); +} diff --git a/components/freertos/test/test_newlib_reent.c b/components/freertos/test/test_newlib_reent.c new file mode 100644 index 000000000..e0ec4aa45 --- /dev/null +++ b/components/freertos/test/test_newlib_reent.c @@ -0,0 +1,60 @@ +/* + Test for multicore FreeRTOS. This test spins up threads, fiddles with queues etc. +*/ + +#include +#include +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + + +volatile static int done; +volatile static int error; + +static void tskTestRand(void *pvParameters) +{ + int l; + srand(0x1234); + vTaskDelay((int)pvParameters / portTICK_PERIOD_MS); + l = rand(); + printf("Rand1: %d\n", l); + if (l != 869320854) { + error++; + } + vTaskDelay((int)pvParameters / portTICK_PERIOD_MS); + l = rand(); + printf("Rand2: %d\n", l); + if (l != 1148737841) { + error++; + } + done++; + vTaskDelete(NULL); +} + + + +// TODO: split this thing into separate orthogonal tests +TEST_CASE("Test for per-task non-reentrant tasks", "[freertos]") +{ + done = 0; + error = 0; + xTaskCreatePinnedToCore(tskTestRand, "tsk1", 2048, (void *)100, 3, NULL, 0); + xTaskCreatePinnedToCore(tskTestRand, "tsk2", 2048, (void *)200, 3, NULL, 0); + xTaskCreatePinnedToCore(tskTestRand, "tsk3", 2048, (void *)300, 3, NULL, 1); + xTaskCreatePinnedToCore(tskTestRand, "tsk4", 2048, (void *)400, 3, NULL, 0); + while (done != 4) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + TEST_ASSERT(error == 0); +} + diff --git a/components/freertos/test/test_panic.c b/components/freertos/test/test_panic.c new file mode 100644 index 000000000..782b7a564 --- /dev/null +++ b/components/freertos/test/test_panic.c @@ -0,0 +1,26 @@ +/* + Test for multicore FreeRTOS. This test spins up threads, fiddles with queues etc. +*/ + +#include +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + + +TEST_CASE("Panic handler", "[freertos]") +{ + volatile int *i; + i = (volatile int *)0x0; + *i = 1; +} + diff --git a/components/freertos/test/test_ringbuf.c b/components/freertos/test/test_ringbuf.c new file mode 100644 index 000000000..7d3c8788c --- /dev/null +++ b/components/freertos/test/test_ringbuf.c @@ -0,0 +1,197 @@ +/* + Test for multicore FreeRTOS ringbuffer. +*/ + +#include +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/ringbuf.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + +#include +#include + +void ets_isr_unmask(uint32_t unmask); + +static RingbufHandle_t rb; +typedef enum { + TST_MOSTLYFILLED, + TST_MOSTLYEMPTY, + TST_INTTOTASK, + TST_TASKTOINT, +} testtype_t; + +static volatile testtype_t testtype; + +static void task1(void *arg) +{ + testtype_t oldtest; + char buf[100]; + int i = 0; + int x, r; + while (1) { + oldtest = testtype; + if (testtype == TST_MOSTLYFILLED || testtype == TST_MOSTLYEMPTY) { + for (x = 0; x < 10; x++) { + sprintf(buf, "This is test %d item %d.", (int)testtype, i++); + ets_printf("TSK w"); + xRingbufferPrintInfo(rb); + r = xRingbufferSend(rb, buf, strlen(buf) + 1, 2000 / portTICK_PERIOD_MS); + if (!r) { + printf("Test %d: Timeout on send!\n", (int)testtype); + } + if (testtype == TST_MOSTLYEMPTY) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + } + //Send NULL event to stop other side. + r = xRingbufferSend(rb, NULL, 0, 10000 / portTICK_PERIOD_MS); + } + while (oldtest == testtype) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + } +} + +static void task2(void *arg) +{ + testtype_t oldtest; + char *buf; + size_t len; + while (1) { + oldtest = testtype; + if (testtype == TST_MOSTLYFILLED || testtype == TST_MOSTLYEMPTY) { + while (1) { + ets_printf("TSK r"); + xRingbufferPrintInfo(rb); + buf = xRingbufferReceive(rb, &len, 2000 / portTICK_PERIOD_MS); + if (buf == NULL) { + printf("Test %d: Timeout on recv!\n", (int)testtype); + } else if (len == 0) { + printf("End packet received.\n"); + vRingbufferReturnItem(rb, buf); + break; + } else { + printf("Received: %s (%d bytes, %p)\n", buf, len, buf); + vRingbufferReturnItem(rb, buf); + } + if (testtype == TST_MOSTLYFILLED) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + } + } + while (oldtest == testtype) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + } +} + + + +static void uartIsrHdl(void *arg) +{ + char c; + char buf[50]; + char *item; + int r; + size_t len; + BaseType_t xHigherPriorityTaskWoken; + SET_PERI_REG_MASK(UART_INT_CLR_REG(0), UART_RXFIFO_FULL_INT_CLR); + while (READ_PERI_REG(UART_STATUS_REG(0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) { + c = READ_PERI_REG(UART_FIFO_REG(0)); + if (c == 'r') { + ets_printf("ISR r"); + xRingbufferPrintInfo(rb); + item = xRingbufferReceiveFromISR(rb, &len); + if (item == NULL) { + ets_printf("ISR recv fail!\n"); + } else if (len == 0) { + ets_printf("ISR recv NULL!\n"); + vRingbufferReturnItemFromISR(rb, item, &xHigherPriorityTaskWoken); + } else { + ets_printf("ISR recv '%s' (%d bytes, %p)\n", buf, len, buf); + vRingbufferReturnItemFromISR(rb, item, &xHigherPriorityTaskWoken); + } + } else { + sprintf(buf, "UART: %c", c); + ets_printf("ISR w"); + xRingbufferPrintInfo(rb); + r = xRingbufferSendFromISR(rb, buf, strlen(buf) + 1, &xHigherPriorityTaskWoken); + if (!r) { + ets_printf("ISR send fail\n"); + } + } + } + if (xHigherPriorityTaskWoken) { + portYIELD_FROM_ISR(); + } +} + +static void uartRxInit() +{ + uint32_t reg_val; + PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_U0RXD); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD_U0TXD); + +// reg_val = READ_PERI_REG(UART_CONF1(0)); + reg_val = (1 << UART_RXFIFO_FULL_THRHD_S); + WRITE_PERI_REG(UART_CONF1_REG(0), reg_val); + CLEAR_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_TXFIFO_EMPTY_INT_ENA | UART_RXFIFO_TOUT_INT_ENA); + SET_PERI_REG_MASK(UART_INT_ENA_REG(0), UART_RXFIFO_FULL_INT_ENA); + + printf("Enabling int %d\n", ETS_UART0_INUM); + REG_SET_FIELD(DPORT_PRO_UART_INTR_MAP_REG, DPORT_PRO_UART_INTR_MAP, ETS_UART0_INUM); + REG_SET_FIELD(DPORT_PRO_UART1_INTR_MAP_REG, DPORT_PRO_UART1_INTR_MAP, ETS_UART0_INUM); + + xt_set_interrupt_handler(ETS_UART0_INUM, uartIsrHdl, NULL); + xt_ints_on(1 << ETS_UART0_INUM); + +} + +static void testRingbuffer(int type) +{ + TaskHandle_t th[2]; + int i; + rb = xRingbufferCreate(32 * 3, type); + + testtype = TST_MOSTLYFILLED; + + xTaskCreatePinnedToCore(task1 , "tskone" , 2048, NULL, 3, &th[0], 0); + xTaskCreatePinnedToCore(task2 , "tsktwo" , 2048, NULL, 3, &th[1], 0); + uartRxInit(); + + printf("Press 'r' to read an event in isr, any other key to write one.\n"); + printf("Test: mostlyfilled; putting 10 items in ringbuff ASAP, reading 1 a second\n"); + vTaskDelay(15000 / portTICK_PERIOD_MS); + printf("Test: mostlyempty; putting 10 items in ringbuff @ 1/sec, reading as fast as possible\n"); + testtype = TST_MOSTLYEMPTY; + vTaskDelay(15000 / portTICK_PERIOD_MS); + + //Shut down all the tasks + for (i = 0; i < 2; i++) { + vTaskDelete(th[i]); + } + xt_ints_off(1 << ETS_UART0_INUM); +} + +// TODO: split this thing into separate orthogonal tests +TEST_CASE("FreeRTOS ringbuffer test, no splitting items", "[freertos]") +{ + testRingbuffer(0); +} + +TEST_CASE("FreeRTOS ringbuffer test, w/ splitting items", "[freertos]") +{ + testRingbuffer(1); +} + diff --git a/components/freertos/test/test_tls_deletecb.c b/components/freertos/test/test_tls_deletecb.c new file mode 100644 index 000000000..5277b761a --- /dev/null +++ b/components/freertos/test/test_tls_deletecb.c @@ -0,0 +1,58 @@ +#include +#include +#include "rom/ets_sys.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "freertos/queue.h" +#include "freertos/xtensa_api.h" +#include "unity.h" +#include "soc/uart_reg.h" +#include "soc/dport_reg.h" +#include "soc/io_mux_reg.h" + + + +static void tskdelcb(int no, void *arg) +{ + printf("Delete callback: %d = %p!\n", no, arg); +} + + +static void tska(void *pvParameters) +{ + vTaskSetThreadLocalStoragePointerAndDelCallback(xTaskGetCurrentTaskHandle(), 0, (void *)0xAAAAAAAA, tskdelcb); + while (1) { + vTaskDelay(10000000 / portTICK_PERIOD_MS); + } +} + +static void tskb(void *pvParameters) +{ + vTaskSetThreadLocalStoragePointerAndDelCallback(xTaskGetCurrentTaskHandle(), 0, (void *)0xBBBBBBBB, tskdelcb); + vTaskDelay(2000 / portTICK_PERIOD_MS); + TaskHandle_t a = (TaskHandle_t)pvParameters; + printf("Killing task A\n"); + vTaskDelete(a); + while (1) { + vTaskDelay(10000000 / portTICK_PERIOD_MS); + } +} + + +// TODO: split this thing into separate orthogonal tests +TEST_CASE("Freertos TLS delete cb", "[freertos]") +{ + TaskHandle_t a, b; + + xTaskCreatePinnedToCore(tska , "tska" , 2048, NULL, 3, &a, 0); + xTaskCreatePinnedToCore(tskb , "tska" , 2048, a, 3, &b, 0); + + // Let stuff run for 20s + vTaskDelay(5000 / portTICK_PERIOD_MS); + printf("Killing task B\n"); + //Shut down b + vTaskDelete(b); +} + diff --git a/components/freertos/xtensa_intr.c b/components/freertos/xtensa_intr.c index f5ca7d151..e9c0b79b9 100644 --- a/components/freertos/xtensa_intr.c +++ b/components/freertos/xtensa_intr.c @@ -30,7 +30,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +#include "freertos/FreeRTOS.h" #include "freertos/xtensa_api.h" +#include "freertos/portable.h" #include "rom/ets_sys.h" @@ -39,7 +41,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* Handler table is in xtensa_intr_asm.S */ // Todo: Make multicore - JD -extern xt_exc_handler _xt_exception_table[XCHAL_EXCCAUSE_NUM]; +extern xt_exc_handler _xt_exception_table[XCHAL_EXCCAUSE_NUM*portNUM_PROCESSORS]; /* @@ -66,6 +68,8 @@ xt_exc_handler xt_set_exception_handler(int n, xt_exc_handler f) if( n < 0 || n >= XCHAL_EXCCAUSE_NUM ) return 0; /* invalid exception number */ + /* Convert exception number to _xt_exception_table name */ + n = n * portNUM_PROCESSORS + xPortGetCoreID(); old = _xt_exception_table[n]; if (f) { @@ -89,7 +93,7 @@ typedef struct xt_handler_table_entry { void * arg; } xt_handler_table_entry; -extern xt_handler_table_entry _xt_interrupt_table[XCHAL_NUM_INTERRUPTS]; +extern xt_handler_table_entry _xt_interrupt_table[XCHAL_NUM_INTERRUPTS*portNUM_PROCESSORS]; /* @@ -118,6 +122,9 @@ xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg) if( Xthal_intlevel[n] > XCHAL_EXCM_LEVEL ) return 0; /* priority level too high to safely handle in C */ + /* Convert exception number to _xt_exception_table name */ + n = n * portNUM_PROCESSORS + xPortGetCoreID(); + entry = _xt_interrupt_table + n; old = entry->handler; diff --git a/components/freertos/xtensa_intr_asm.S b/components/freertos/xtensa_intr_asm.S index 5f9890dfe..8c7ae63fd 100644 --- a/components/freertos/xtensa_intr_asm.S +++ b/components/freertos/xtensa_intr_asm.S @@ -30,6 +30,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include "xtensa_context.h" +#include "FreeRTOSConfig.h" #if XCHAL_HAVE_INTERRUPTS @@ -59,6 +60,15 @@ _xt_vpri_mask: .word 0xFFFFFFFF /* Virtual priority mask */ Table of C-callable interrupt handlers for each interrupt. Note that not all slots can be filled, because interrupts at level > EXCM_LEVEL will not be dispatched to a C handler by default. + + Stored as: + int 0 cpu 0 + int 0 cpu 1 + ... + int 0 cpu n + int 1 cpu 0 + int 1 cpu 1 + etc ------------------------------------------------------------------------------- */ @@ -69,7 +79,7 @@ _xt_vpri_mask: .word 0xFFFFFFFF /* Virtual priority mask */ _xt_interrupt_table: .set i, 0 - .rept XCHAL_NUM_INTERRUPTS + .rept XCHAL_NUM_INTERRUPTS*portNUM_PROCESSORS .word xt_unhandled_interrupt /* handler address */ .word i /* handler arg (default: intnum) */ .set i, i+1 @@ -85,6 +95,15 @@ _xt_interrupt_table: Table of C-callable exception handlers for each exception. Note that not all slots will be active, because some exceptions (e.g. coprocessor exceptions) are always handled by the OS and cannot be hooked by user handlers. + + Stored as: + exc 0 cpu 0 + exc 0 cpu 1 + ... + exc 0 cpu n + exc 1 cpu 0 + exc 1 cpu 1 + etc ------------------------------------------------------------------------------- */ @@ -93,7 +112,7 @@ _xt_interrupt_table: .align 4 _xt_exception_table: - .rept XCHAL_EXCCAUSE_NUM + .rept XCHAL_EXCCAUSE_NUM * portNUM_PROCESSORS .word xt_unhandled_exception /* handler address */ .endr diff --git a/components/freertos/xtensa_vectors.S b/components/freertos/xtensa_vectors.S index 7cf70f003..f180705e7 100644 --- a/components/freertos/xtensa_vectors.S +++ b/components/freertos/xtensa_vectors.S @@ -113,6 +113,27 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define XIE_ARG 4 #define XIE_SIZE 8 + +/* + Macro get_percpu_entry_for - convert a per-core ID into a multicore entry. + Basically does reg=reg*portNUM_PROCESSORS+current_core_id + Multiple versions here to optimize for specific portNUM_PROCESSORS values. +*/ + .macro get_percpu_entry_for reg scratch +#if (portNUM_PROCESSORS == 1) + /* No need to do anything */ +#elif (portNUM_PROCESSORS == 2) + /* Optimized 2-core code. */ + getcoreid \scratch + addx2 \reg,\reg,\scratch +#else + /* Generalized n-core code. Untested! */ + movi \scratch,portNUM_PROCESSORS + mull \scratch,\reg,\scratch + getcoreid \reg + add \reg,\scratch,\reg +#endif + .endm /* -------------------------------------------------------------------------------- Macro extract_msb - return the input with only the highest bit set. @@ -229,6 +250,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */ + get_percpu_entry_for a3, a12 movi a4, _xt_interrupt_table addx8 a3, a3, a4 /* a3 = address of interrupt table entry */ l32i a4, a3, XIE_HANDLER /* a4 = handler address */ @@ -395,6 +417,9 @@ panic_print_hex_ok: with index 0 containing the entry for user exceptions. Initialized with all 0s, meaning no handler is installed at each level. See comment in xtensa_rtos.h for more details. + + *WARNING* This array is for all CPUs, that is, installing a hook for + one CPU will install it for all others as well! -------------------------------------------------------------------------------- */ @@ -688,6 +713,7 @@ _xt_user_exc: rsr a2, EXCCAUSE /* recover exc cause */ movi a3, _xt_exception_table + get_percpu_entry_for a3, a4 addx4 a4, a2, a3 /* a4 = address of exception table entry */ l32i a4, a4, 0 /* a4 = handler address */ #ifdef __XTENSA_CALL0_ABI__ diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_01.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_01.yml index 25a3ccda9..e86fac28a 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_01.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_01.yml @@ -4,7 +4,7 @@ Filter: - Add: ID: [^TCPIP_DHCP_0302, TCPIP_DHCP_0302, TCPIP_DHCP_0301, TCPIP_TCP_0403, TCPIP_TCP_0402, TCPIP_TCP_0401, TCPIP_TCP_0407, TCPIP_TCP_0406, ^TCPIP_TCP_0411, TCPIP_TCP_0404, - TCPIP_TCP_0408, TCPIP_TCP_0110, TCPIP_TCP_0115, TCPIP_IP_0101, TCPIP_IP_0102, - ^TCPIP_IGMP_0102, ^TCPIP_IGMP_0101, ^TCPIP_IGMP_0104, TCPIP_IGMP_0104, TCPIP_IGMP_0103, - TCPIP_IGMP_0102, TCPIP_IGMP_0101, TCPIP_UDP_0108, TCPIP_UDP_0106, TCPIP_UDP_0107, - TCPIP_UDP_0105, TCPIP_UDP_0101, TCPIP_IGMP_0204, TCPIP_IGMP_0201, TCPIP_IGMP_0202] + TCPIP_TCP_0408, TCPIP_TCP_0110, ^TCPIP_TCP_0111, TCPIP_TCP_0115, TCPIP_IP_0101, + TCPIP_IP_0102, ^TCPIP_IGMP_0102, ^TCPIP_IGMP_0101, ^TCPIP_IGMP_0104, TCPIP_IGMP_0104, + TCPIP_IGMP_0103, TCPIP_IGMP_0102, TCPIP_IGMP_0101, TCPIP_UDP_0108, TCPIP_UDP_0106, + TCPIP_UDP_0107, TCPIP_UDP_0105, TCPIP_UDP_0101, TCPIP_IGMP_0204, TCPIP_IGMP_0201] diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_02.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_02.yml index 73618e0d7..a746cdd91 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_02.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_02.yml @@ -2,7 +2,7 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC2, SSC1] Filter: - Add: - ID: [TCPIP_IGMP_0203, ^TCPIP_TCP_0403, ^TCPIP_TCP_0408, TCPIP_UDP_0201, TCPIP_UDP_0202, + ID: [TCPIP_IGMP_0202, TCPIP_IGMP_0203, ^TCPIP_TCP_0403, ^TCPIP_TCP_0408, TCPIP_UDP_0201, ^TCPIP_DHCP_0301, ^TCPIP_TCP_0101, ^TCPIP_TCP_0103, ^TCPIP_TCP_0105, ^TCPIP_TCP_0104, ^TCPIP_TCP_0107, ^TCPIP_TCP_0106, ^TCPIP_DHCP_0210, ^TCPIP_DHCP_0211, ^TCPIP_DHCP_0212, ^TCPIP_TCP_0404, TCPIP_TCP_0212, TCPIP_TCP_0210, ^TCPIP_TCP_0406, ^TCPIP_TCP_0407, diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_03.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_03.yml index b326ed721..f5f0abe5d 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_03.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_03.yml @@ -4,7 +4,7 @@ Filter: - Add: ID: [^TCPIP_IP_0102, ^TCPIP_UDP_0105, ^TCPIP_UDP_0107, ^TCPIP_UDP_0106, ^TCPIP_UDP_0101, TCPIP_TCP_0202, ^TCPIP_UDP_0108, ^TCPIP_IGMP_0201, ^TCPIP_IGMP_0203, ^TCPIP_IGMP_0202, - ^TCPIP_IGMP_0103, TCPIP_UDP_0114, TCPIP_UDP_0113, TCPIP_UDP_0112, TCPIP_DHCP_0205, - TCPIP_DHCP_0202, TCPIP_DHCP_0203, ^TCPIP_TCP_0102, TCPIP_TCP_0106, TCPIP_TCP_0107, - TCPIP_TCP_0104, TCPIP_TCP_0105, TCPIP_TCP_0102, TCPIP_TCP_0103, TCPIP_TCP_0101, - ^TCPIP_TCP_0116, ^TCPIP_TCP_0114, ^TCPIP_TCP_0115, ^TCPIP_TCP_0112, ^TCPIP_TCP_0113] + ^TCPIP_IGMP_0103, TCPIP_UDP_0114, TCPIP_UDP_0113, TCPIP_UDP_0112, TCPIP_UDP_0202, + TCPIP_DHCP_0205, TCPIP_DHCP_0202, TCPIP_DHCP_0203, ^TCPIP_TCP_0102, TCPIP_TCP_0106, + TCPIP_TCP_0107, TCPIP_TCP_0104, TCPIP_TCP_0105, TCPIP_TCP_0102, TCPIP_TCP_0103, + TCPIP_TCP_0101, ^TCPIP_TCP_0116, ^TCPIP_TCP_0114, ^TCPIP_TCP_0115, ^TCPIP_TCP_0112] diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_04.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_04.yml index 314de4a7e..b59e8c60c 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_04.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_04.yml @@ -2,7 +2,7 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC2, SSC1] Filter: - Add: - ID: [^TCPIP_TCP_0110, ^TCPIP_TCP_0111, TCPIP_DHCP_0209, ^TCPIP_DHCP_0209, ^TCPIP_DHCP_0207, + ID: [^TCPIP_TCP_0113, ^TCPIP_TCP_0110, TCPIP_DHCP_0209, ^TCPIP_DHCP_0209, ^TCPIP_DHCP_0207, ^TCPIP_DHCP_0206, ^TCPIP_DHCP_0205, ^TCPIP_DHCP_0204, ^TCPIP_DHCP_0203, ^TCPIP_DHCP_0202, ^TCPIP_DHCP_0201, TCPIP_TCP_0204, TCPIP_TCP_0207, TCPIP_TCP_0206, TCPIP_TCP_0201, ^TCPIP_DHCP_0101, TCPIP_TCP_0203, ^TCPIP_DHCP_0103, ^TCPIP_DHCP_0208, TCPIP_TCP_0208, diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_07.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_07.yml index 9b3d943fe..839ac972f 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_07.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_07.yml @@ -2,9 +2,9 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC2, SSC1] Filter: - Add: - ID: [TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, + ID: [TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303, + TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_ICMP_0101, TCPIP_DNS_0102, TCPIP_DNS_0102, TCPIP_DNS_0102, TCPIP_DNS_0102, TCPIP_DNS_0102, TCPIP_DNS_0101, TCPIP_DNS_0101, TCPIP_DNS_0101, TCPIP_DNS_0101, TCPIP_DNS_0101, ^TCPIP_ICMP_0101, ^TCPIP_ICMP_0101, ^TCPIP_ICMP_0101, ^TCPIP_ICMP_0101, ^TCPIP_ICMP_0101, - TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109, - TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104] + TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109, TCPIP_UDP_0109] diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_08.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_08.yml index a2f8f0df0..b318b0937 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_08.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_08.yml @@ -2,9 +2,9 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC1] Filter: - Add: - ID: [TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, + ID: [TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104, TCPIP_UDP_0104, + TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0102, TCPIP_UDP_0103, TCPIP_UDP_0103, TCPIP_UDP_0103, TCPIP_UDP_0103, TCPIP_UDP_0103, ^TCPIP_UDP_0307, ^TCPIP_UDP_0307, ^TCPIP_UDP_0307, ^TCPIP_UDP_0307, ^TCPIP_UDP_0307, ^TCPIP_UDP_0306, ^TCPIP_UDP_0306, ^TCPIP_UDP_0306, ^TCPIP_UDP_0306, ^TCPIP_UDP_0306, - ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, - ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304] + ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305, ^TCPIP_UDP_0305] diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_09.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_09.yml index 146b98cf7..50b50a3eb 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_09.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_09.yml @@ -2,7 +2,7 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC1] Filter: - Add: - ID: [^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, + ID: [^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0304, ^TCPIP_UDP_0302, ^TCPIP_UDP_0302, ^TCPIP_UDP_0302, ^TCPIP_UDP_0302, ^TCPIP_UDP_0302, ^TCPIP_UDP_0301, ^TCPIP_UDP_0301, ^TCPIP_UDP_0301, ^TCPIP_UDP_0301, ^TCPIP_UDP_0301, ^TCPIP_UDP_0104, ^TCPIP_UDP_0104, ^TCPIP_UDP_0104, ^TCPIP_UDP_0104, ^TCPIP_UDP_0104, diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_11.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_11.yml index 86690db67..be615d087 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_11.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_11.yml @@ -7,4 +7,4 @@ Filter: TCPIP_UDP_0307, TCPIP_UDP_0307, TCPIP_UDP_0307, TCPIP_UDP_0307, TCPIP_UDP_0307, TCPIP_UDP_0301, TCPIP_UDP_0301, TCPIP_UDP_0301, TCPIP_UDP_0301, TCPIP_UDP_0301, TCPIP_UDP_0302, TCPIP_UDP_0302, TCPIP_UDP_0302, TCPIP_UDP_0302, TCPIP_UDP_0302, - TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303, TCPIP_UDP_0303] + TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103] diff --git a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_12.yml b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_12.yml index 4e0495e44..73b0187ee 100644 --- a/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_12.yml +++ b/components/idf_test/integration_test/CIConfigs/IT_Function_TCPIP_12.yml @@ -2,5 +2,5 @@ Config: {execute count: 1, execute order: in order} DUT: [SSC1] Filter: - Add: - ID: [TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103, TCPIP_DNS_0103, + ID: [^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0303, ^TCPIP_UDP_0110, ^TCPIP_UDP_0110, ^TCPIP_UDP_0110, ^TCPIP_UDP_0110, ^TCPIP_UDP_0110] diff --git a/components/idf_test/integration_test/InitialConditionAll.yml b/components/idf_test/integration_test/InitialConditionAll.yml index ba06af9f8..382189455 100644 --- a/components/idf_test/integration_test/InitialConditionAll.yml +++ b/components/idf_test/integration_test/InitialConditionAll.yml @@ -2933,3 +2933,27 @@ initial condition: start: 87.0 tag: T3_PHY1 test script: InitCondBase +- check cmd set: + - '' + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + force restore cmd set: + - '' + - - FREBOOT UT1 + - [''] + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + initial condition detail: At UT menu page + restore cmd set: + - '' + - - FREBOOT UT1 + - [''] + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + restore post cmd set: + - '' + - - DELAY 0.1 + - [''] + script path: InitCondBase.py + tag: UTINIT1 + test script: InitCondBase diff --git a/components/idf_test/integration_test/TestEnvAll.yml b/components/idf_test/integration_test/TestEnvAll.yml index 2e59961d9..b8a2a497c 100644 --- a/components/idf_test/integration_test/TestEnvAll.yml +++ b/components/idf_test/integration_test/TestEnvAll.yml @@ -141,6 +141,29 @@ test environment: PC wired NIC should set static IP address within the same subnet with AP. Must use onboard wired NIC.', test script: EnvBase} +- {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_Sleep1, + test environment detail: 'AP support DTIM placed with AT target. + + SSC target connect with Raspberry Pi by UART. + + Multimeter connect with Raspberry Pi via GPIB. + + Series multimeter between GND and VCC of SSC1. + + SSC1''s light sleep wakeup pin and wakeup indication connect with Raspberry Pi''s + GPIO. + + SSC1''s XPD connect with RSTB.', test script: EnvBase} +- {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_Sleep2, + test environment detail: 'AP support DTIM placed with AT target. + + SSC target connect with Raspberry Pi by UART. + + Multimeter connect with Raspberry Pi via GPIB. + + Series multimeter between GND and VCC of SSC1. + + SSC1''s RSTB pin connect with Raspberry Pi''s GPIO.', test script: EnvBase} - {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_TempBox, test environment detail: '1 SSC target connect with PC by UART. @@ -179,6 +202,12 @@ test environment: SSC2', additional param list: '', basic param list: '', script path: EnvBase.py, tag: SSC_T2_GPIO3, test environment detail: '[TBD] 2个ESP_8266通过UART连到PC, ESP_8266之间需要测试的Target_GPIO相连', test script: EnvBase} +- {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_JAP, + test environment detail: 'PC has 1 wired NIC connected to APC. + + APC control the power supply of multiple APs. + + 2 SSC target connect with PC by UART.', test script: EnvBase} - {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_PhyMode, test environment detail: '2 SSC target connect with PC by UART. @@ -191,28 +220,6 @@ test environment: test environment detail: '2 SSC target connect with PC by UART. Put them to Shield box.', test script: EnvBase} -- {PC OS: '', Special: Y, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_Sleep1, - test environment detail: 'AP support DTIM placed with AT target. - - 2 SSC target connect with PC by UART. - - Multimeter connect with PC via GPIB. - - Series multimeter between GND and VCC of SSC1. - - SSC1''s light sleep wakeup pin and wakeup indication connect with AT2''s GPIO. - - SSC1''s XPD connect with RSTB.', test script: EnvBase} -- {PC OS: '', Special: Y, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_Sleep2, - test environment detail: 'AP support DTIM placed with AT target. - - 2 SSC target connect with PC by UART. - - Multimeter connect with PC via GPIB. - - Series multimeter between GND and VCC of SSC1. - - SSC1''s RSTB pin connect with AT2''s GPIO.', test script: EnvBase} - {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_SmartConfig, test environment detail: '2 SSC target connect with PC by UART. @@ -263,6 +270,8 @@ test environment: SSC2', additional param list: '', basic param list: '', script path: EnvBase.py, tag: UART_T1_2, test environment detail: '[TBD] ESP_8266通过UART_0通过USB, UART_1 TXD 通过 TTLcable 连到PC', test script: EnvBase} +- {PC OS: '', Special: N, Target Count: 1.0, script path: EnvBase.py, tag: UT_T1_1, + test environment detail: Environment for running ESP32 unit tests, test script: EnvBase} - {PC OS: linux, Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: WebServer_T1_1, test environment detail: 'Web Server target connect with PC by UART. diff --git a/components/idf_test/uint_test/TestCaseAll.yml b/components/idf_test/uint_test/TestCaseAll.yml deleted file mode 100644 index 2b2c65e0b..000000000 --- a/components/idf_test/uint_test/TestCaseAll.yml +++ /dev/null @@ -1 +0,0 @@ -test cases: [] diff --git a/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml b/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml new file mode 100644 index 000000000..c3561aa0c --- /dev/null +++ b/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml @@ -0,0 +1,8 @@ +Config: {execute count: 1, execute order: in order} +DUT: [UT1] +Filter: +- Add: + ID: [SYS_OS_0102, SYS_MISC_0103, SYS_MISC_0102, SYS_MISC_0105, SYS_MISC_0104, + SYS_MISC_0107, SYS_MISC_0106, SYS_MISC_0109, SYS_MISC_0108, SYS_MISC_0112, SYS_MISC_0113, + SYS_MISC_0110, SYS_MISC_0111, SYS_MISC_0115, SYS_LIB_0103, SYS_LIB_0102, SYS_LIB_0101, + SYS_LIB_0106, SYS_LIB_0105, SYS_LIB_0104] diff --git a/components/idf_test/uint_test/InitialConditionAll.yml b/components/idf_test/unit_test/InitialConditionAll.yml similarity index 99% rename from components/idf_test/uint_test/InitialConditionAll.yml rename to components/idf_test/unit_test/InitialConditionAll.yml index ba06af9f8..382189455 100644 --- a/components/idf_test/uint_test/InitialConditionAll.yml +++ b/components/idf_test/unit_test/InitialConditionAll.yml @@ -2933,3 +2933,27 @@ initial condition: start: 87.0 tag: T3_PHY1 test script: InitCondBase +- check cmd set: + - '' + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + force restore cmd set: + - '' + - - FREBOOT UT1 + - [''] + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + initial condition detail: At UT menu page + restore cmd set: + - '' + - - FREBOOT UT1 + - [''] + - - UT UT1 - + - [R UT1 C Tests C Failures C Ignored] + restore post cmd set: + - '' + - - DELAY 0.1 + - [''] + script path: InitCondBase.py + tag: UTINIT1 + test script: InitCondBase diff --git a/components/idf_test/unit_test/TestCaseAll.yml b/components/idf_test/unit_test/TestCaseAll.yml new file mode 100644 index 000000000..6f974e0bf --- /dev/null +++ b/components/idf_test/unit_test/TestCaseAll.yml @@ -0,0 +1,461 @@ +test cases: +- CI ready: 'Yes' + ID: SYS_LIB_0101 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "check if ROM is used for functions" + - [dummy] + comment: check if ROM is used for functions + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_LIB_0102 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test time functions" + - [dummy] + comment: test time functions + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_LIB_0103 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test sscanf function" + - [dummy] + comment: test sscanf function + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_LIB_0104 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test sprintf function" + - [dummy] + comment: test sprintf function + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_LIB_0105 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test atoX functions" + - [dummy] + comment: test atoX functions + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_LIB_0106 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test ctype functions" + - [dummy] + comment: test ctype functions + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run lib test + sub module: Std Lib + summary: lib unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: lib + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0102 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "mbedtls MPI self-tests" + - [dummy] + comment: mbedtls MPI self-tests + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run bignum test + sub module: Misc + summary: bignum unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: bignum + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0103 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test AES thread safety" + - [dummy] + comment: test AES thread safety + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run hwcrypto test + sub module: Misc + summary: hwcrypto unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: hwcrypto + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0104 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test AES acceleration" + - [dummy] + comment: test AES acceleration + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run hwcrypto test + sub module: Misc + summary: hwcrypto unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: hwcrypto + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0105 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test SHA thread safety" + - [dummy] + comment: test SHA thread safety + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run hwcrypto test + sub module: Misc + summary: hwcrypto unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: hwcrypto + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0106 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "context switch saves FP registers" + - [dummy] + comment: context switch saves FP registers + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run fp test + sub module: Misc + summary: fp unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: fp + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0107 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test FP sqrt" + - [dummy] + comment: test FP sqrt + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run fp test + sub module: Misc + summary: fp unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: fp + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0108 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test FP div" + - [dummy] + comment: test FP div + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run fp test + sub module: Misc + summary: fp unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: fp + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0109 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test FP mul" + - [dummy] + comment: test FP mul + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run fp test + sub module: Misc + summary: fp unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: fp + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0110 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test FP add" + - [dummy] + comment: test FP add + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run fp test + sub module: Misc + summary: fp unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: fp + version: v1 (2016-10-26) +- CI ready: 'Yes' + ID: SYS_MISC_0111 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "Test JPEG decompression library" + - [dummy] + comment: Test JPEG decompression library + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run JPEG decompression test + sub module: Misc + summary: JPEG decompression library unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: tjpgd + version: v1 (2016-10-31) +- CI ready: 'Yes' + ID: SYS_MISC_0112 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "mbedtls AES self-tests" + - [dummy] + comment: mbedtls AES self-tests + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run mbedtls AES self-tests + sub module: Misc + summary: mbedtls AES unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: mbedtls AES + version: v1 (2016-10-31) +- CI ready: 'Yes' + ID: SYS_MISC_0113 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "mbedtls SHA self-tests" + - [dummy] + comment: mbedtls SHA self-tests + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run mbedtls SHA self-tests + sub module: Misc + summary: mbedtls SHA unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: mbedtls SHA + version: v1 (2016-10-31) +- CI ready: 'Yes' + ID: SYS_MISC_0115 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "test SHA acceleration" + - [dummy] + comment: test SHA acceleration + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run SHA acceleration test + sub module: Misc + summary: SHA acceleration unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: SHA acceleration + version: v1 (2016-10-31) +- CI ready: 'Yes' + ID: SYS_OS_0102 + SDK: ESP32_IDF + Test App: UT + auto test: 'Yes' + category: Function + cmd set: + - IDFUnitTest/UnitTest + - - test_case = "Freertos TLS delete cb" + - [dummy] + comment: Freertos TLS delete cb + execution time: 0 + expected result: 1. set succeed + initial condition: UTINIT1 + level: Unit + module: System + steps: 1. run Freertos TLS delete cb test + sub module: OS + summary: Freertos TLS delete cb unit test + test environment: UT_T1_1 + test point 1: basic function + test point 2: Freertos TLS delete cb + version: v1 (2016-10-31) diff --git a/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py new file mode 100644 index 000000000..bfc8edeaa --- /dev/null +++ b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py @@ -0,0 +1,51 @@ +import re +import time + +from TCAction import PerformanceTCBase +from TCAction import TCActionBase +from NativeLog import NativeLog + +class UnitTest(PerformanceTCBase.PerformanceTCBase): + def __init__(self, name, test_env, cmd_set, timeout=30, log_path=TCActionBase.LOG_PATH): + PerformanceTCBase.PerformanceTCBase.__init__(self, name, test_env, cmd_set=cmd_set, + timeout=timeout, log_path=log_path) + + self.test_case = None + self.test_timeout = 20 + + # load param from excel + for i in range(1, len(cmd_set)): + if cmd_set[i][0] != "dummy": + cmd_string = "self." + cmd_set[i][0] + exec cmd_string + self.result_cntx = TCActionBase.ResultCheckContext(self, test_env, self.tc_name) + pass + + def send_commands(self): + self.flush_data("UT1") + + try: + # add case select by name mark " before case name + self.serial_write_line("UT1", "\"" + self.test_case) + data = "" + for _ in range(self.timeout): + time.sleep(1) #wait for test to run before reading result + data += self.serial_read_data("UT1") + if re.search('[^0] Tests 0 F', data): #check that number of tests run != 0 and number of tests failed == 0 + self.set_result("Succeed") + break + else: + self.set_result("Fail") + + except StandardError,e: + NativeLog.add_exception_log(e) + + def execute(self): + TCActionBase.TCActionBase.execute(self) + self.send_commands() + +def main(): + pass + +if __name__ == '__main__': + pass diff --git a/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/__init__.py b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/__init__.py new file mode 100755 index 000000000..876a5d402 --- /dev/null +++ b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/__init__.py @@ -0,0 +1 @@ +__all__ = ["UnitTest"] diff --git a/components/idf_test/uint_test/TestEnvAll.yml b/components/idf_test/unit_test/TestEnvAll.yml similarity index 93% rename from components/idf_test/uint_test/TestEnvAll.yml rename to components/idf_test/unit_test/TestEnvAll.yml index 2e59961d9..b8a2a497c 100644 --- a/components/idf_test/uint_test/TestEnvAll.yml +++ b/components/idf_test/unit_test/TestEnvAll.yml @@ -141,6 +141,29 @@ test environment: PC wired NIC should set static IP address within the same subnet with AP. Must use onboard wired NIC.', test script: EnvBase} +- {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_Sleep1, + test environment detail: 'AP support DTIM placed with AT target. + + SSC target connect with Raspberry Pi by UART. + + Multimeter connect with Raspberry Pi via GPIB. + + Series multimeter between GND and VCC of SSC1. + + SSC1''s light sleep wakeup pin and wakeup indication connect with Raspberry Pi''s + GPIO. + + SSC1''s XPD connect with RSTB.', test script: EnvBase} +- {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_Sleep2, + test environment detail: 'AP support DTIM placed with AT target. + + SSC target connect with Raspberry Pi by UART. + + Multimeter connect with Raspberry Pi via GPIB. + + Series multimeter between GND and VCC of SSC1. + + SSC1''s RSTB pin connect with Raspberry Pi''s GPIO.', test script: EnvBase} - {PC OS: '', Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: SSC_T1_TempBox, test environment detail: '1 SSC target connect with PC by UART. @@ -179,6 +202,12 @@ test environment: SSC2', additional param list: '', basic param list: '', script path: EnvBase.py, tag: SSC_T2_GPIO3, test environment detail: '[TBD] 2个ESP_8266通过UART连到PC, ESP_8266之间需要测试的Target_GPIO相连', test script: EnvBase} +- {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_JAP, + test environment detail: 'PC has 1 wired NIC connected to APC. + + APC control the power supply of multiple APs. + + 2 SSC target connect with PC by UART.', test script: EnvBase} - {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_PhyMode, test environment detail: '2 SSC target connect with PC by UART. @@ -191,28 +220,6 @@ test environment: test environment detail: '2 SSC target connect with PC by UART. Put them to Shield box.', test script: EnvBase} -- {PC OS: '', Special: Y, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_Sleep1, - test environment detail: 'AP support DTIM placed with AT target. - - 2 SSC target connect with PC by UART. - - Multimeter connect with PC via GPIB. - - Series multimeter between GND and VCC of SSC1. - - SSC1''s light sleep wakeup pin and wakeup indication connect with AT2''s GPIO. - - SSC1''s XPD connect with RSTB.', test script: EnvBase} -- {PC OS: '', Special: Y, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_Sleep2, - test environment detail: 'AP support DTIM placed with AT target. - - 2 SSC target connect with PC by UART. - - Multimeter connect with PC via GPIB. - - Series multimeter between GND and VCC of SSC1. - - SSC1''s RSTB pin connect with AT2''s GPIO.', test script: EnvBase} - {PC OS: '', Special: N, Target Count: 2.0, script path: EnvBase.py, tag: SSC_T2_SmartConfig, test environment detail: '2 SSC target connect with PC by UART. @@ -263,6 +270,8 @@ test environment: SSC2', additional param list: '', basic param list: '', script path: EnvBase.py, tag: UART_T1_2, test environment detail: '[TBD] ESP_8266通过UART_0通过USB, UART_1 TXD 通过 TTLcable 连到PC', test script: EnvBase} +- {PC OS: '', Special: N, Target Count: 1.0, script path: EnvBase.py, tag: UT_T1_1, + test environment detail: Environment for running ESP32 unit tests, test script: EnvBase} - {PC OS: linux, Special: Y, Target Count: 1.0, script path: EnvBase.py, tag: WebServer_T1_1, test environment detail: 'Web Server target connect with PC by UART. diff --git a/components/json/component.mk b/components/json/component.mk index 311a902f9..2dd6ea8b8 100644 --- a/components/json/component.mk +++ b/components/json/component.mk @@ -1,13 +1,7 @@ # # Component Makefile # -# This Makefile should, at the very least, just include $(SDK_PATH)/Makefile. By default, -# this will take the sources in this directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the SDK documents if you need to do this. -# COMPONENT_ADD_INCLUDEDIRS := include port/include COMPONENT_SRCDIRS := library port -include $(IDF_PATH)/make/component_common.mk diff --git a/components/log/README.rst b/components/log/README.rst new file mode 100644 index 000000000..d378179c8 --- /dev/null +++ b/components/log/README.rst @@ -0,0 +1,61 @@ +Logging library +=============== + +Overview +-------- + +Log library has two ways of managing log verbosity: compile time, set via menuconfig; and runtime, using ``esp_log_set_level`` function. + +At compile time, filtering is done using ``CONFIG_LOG_DEFAULT_LEVEL`` macro, set via menuconfig. All logging statments for levels higher than ``CONFIG_LOG_DEFAULT_LEVEL`` will be removed by the preprocessor. + +At run time, all logs below ``CONFIG_LOG_DEFAULT_LEVEL`` are enabled by default. ``esp_log_set_level`` function may be used to set logging level per module. Modules are identified by their tags, which are human-readable ASCII zero-terminated strings. + +How to use this library +----------------------- + +In each C file which uses logging functionality, define TAG variable like this: + +.. code-block:: c + + static const char* TAG = "MyModule"; + +then use one of logging macros to produce output, e.g: + +.. code-block:: c + + ESP_LOGW(TAG, "Baud rate error %.1f%%. Requested: %d baud, actual: %d baud", error * 100, baud_req, baud_real); + +Several macros are available for different verbosity levels: + +* ``ESP_LOGE`` - error +* ``ESP_LOGW`` - warning +* ``ESP_LOGI`` - info +* ``ESP_LOGD`` - debug +* ``ESP_LOGV`` - verbose + +Additionally there is an _EARLY_ variant for each of these macros (e.g. ``ESP_EARLY_LOGE`` ).These variants can run in startup code, before heap allocator and syscalls have been initialized. When compiling bootloader, normal ``ESP_LOGx`` macros fall back to the same implementation as ``ESP_EARLY_LOGx`` macros. So the only place where ``ESP_EARLY_LOGx`` have to be used explicitly is the early startup code, such as heap allocator initialization code. + +(Note that such distinction would not have been necessary if we would have an ``ets_vprintf`` function in the ROM. Then it would be possible to switch implementation from _EARLY_ version to normal version on the fly. Unfortunately, ``ets_vprintf`` in ROM has been inlined by the compiler into ``ets_printf``, so it is not accessible outside.) + +To override default verbosity level at file or component scope, define ``LOG_LOCAL_LEVEL`` macro. At file scope, define it before including ``esp_log.h``, e.g.: + +.. code-block:: c + + #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE + #include "esp_log.h" + + +At component scope, define it in component makefile: + +.. code-block:: make + + CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG + +To configure logging output per module at runtime, add calls to ``esp_log_set_level`` function: + +.. code-block:: c + + esp_log_set_level("*", ESP_LOG_ERROR); // set all components to ERROR level + esp_log_set_level("wifi", ESP_LOG_WARN); // enable WARN logs from WiFi stack + esp_log_set_level("dhcpc", ESP_LOG_INFO); // enable INFO logs from DHCP client + diff --git a/components/log/component.mk b/components/log/component.mk index ef497a7ec..c2c4c03a1 100755 --- a/components/log/component.mk +++ b/components/log/component.mk @@ -1,3 +1,5 @@ -COMPONENT_ADD_INCLUDEDIRS := include +# +# Component Makefile +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) -include $(IDF_PATH)/make/component_common.mk diff --git a/components/log/include/esp_log.h b/components/log/include/esp_log.h index 8ca6e241d..f4b9aa288 100644 --- a/components/log/include/esp_log.h +++ b/components/log/include/esp_log.h @@ -19,81 +19,25 @@ #include #include "sdkconfig.h" +#ifdef BOOTLOADER_BUILD +#include +#endif + #ifdef __cplusplus extern "C" { #endif /** - * @brief Logging library - * - * Log library has two ways of managing log verbosity: compile time, set via - * menuconfig, and runtime, using esp_log_set_level function. - * - * At compile time, filtering is done using CONFIG_LOG_DEFAULT_LEVEL macro, set via - * menuconfig. All logging statments for levels higher than CONFIG_LOG_DEFAULT_LEVEL - * will be removed by the preprocessor. - * - * At run time, all logs below CONFIG_LOG_DEFAULT_LEVEL are enabled by default. - * esp_log_set_level function may be used to set logging level per module. - * Modules are identified by their tags, which are human-readable ASCII - * zero-terminated strings. - * - * How to use this library: - * - * In each C file which uses logging functionality, define TAG variable like this: - * - * static const char* TAG = "MyModule"; - * - * then use one of logging macros to produce output, e.g: - * - * ESP_LOGW(TAG, "Baud rate error %.1f%%. Requested: %d baud, actual: %d baud", error * 100, baud_req, baud_real); - * - * Several macros are available for different verbosity levels: - * - * ESP_LOGE — error - * ESP_LOGW — warning - * ESP_LOGI — info - * ESP_LOGD - debug - * ESP_LOGV - verbose - * - * Additionally there is an _EARLY_ variant for each of these macros (e.g. ESP_EARLY_LOGE). - * These variants can run in startup code, before heap allocator and syscalls - * have been initialized. - * When compiling bootloader, normal ESP_LOGx macros fall back to the same implementation - * as ESP_EARLY_LOGx macros. So the only place where ESP_EARLY_LOGx have to be used explicitly - * is the early startup code, such as heap allocator initialization code. - * - * (Note that such distinction would not have been necessary if we would have an - * ets_vprintf function in the ROM. Then it would be possible to switch implementation - * from _EARLY version to normal version on the fly. Unfortunately, ets_vprintf in ROM - * has been inlined by the compiler into ets_printf, so it is not accessible outside.) - * - * To override default verbosity level at file or component scope, define LOG_LOCAL_LEVEL macro. - * At file scope, define it before including esp_log.h, e.g.: - * - * #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE - * #include "esp_log.h" - * - * At component scope, define it in component makefile: - * - * CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG - * - * To configure logging output per module at runtime, add calls to esp_log_set_level function: - * - * esp_log_set_level("*", ESP_LOG_ERROR); // set all components to ERROR level - * esp_log_set_level("wifi", ESP_LOG_WARN); // enable WARN logs from WiFi stack - * esp_log_set_level("dhcpc", ESP_LOG_INFO); // enable INFO logs from DHCP client + * @brief Log level * */ - - typedef enum { - ESP_LOG_NONE, // No log output - ESP_LOG_ERROR, // Critical errors, software module can not recover on its own - ESP_LOG_WARN, // Error conditions from which recovery measures have been taken - ESP_LOG_INFO, // Information messages which describe normal flow of events - ESP_LOG_DEBUG, // Extra information which is not necessary for normal use (values, pointers, sizes, etc). - ESP_LOG_VERBOSE // Bigger chunks of debugging information, or frequent messages which can potentially flood the output. + ESP_LOG_NONE, /*!< No log output */ + ESP_LOG_ERROR, /*!< Critical errors, software module can not recover on its own */ + ESP_LOG_WARN, /*!< Error conditions from which recovery measures have been taken */ + ESP_LOG_INFO, /*!< Information messages which describe normal flow of events */ + ESP_LOG_DEBUG, /*!< Extra information which is not necessary for normal use (values, pointers, sizes, etc). */ + ESP_LOG_VERBOSE /*!< Bigger chunks of debugging information, or frequent messages which can potentially flood the output. */ } esp_log_level_t; typedef int (*vprintf_like_t)(const char *, va_list); @@ -120,17 +64,6 @@ void esp_log_level_set(const char* tag, esp_log_level_t level); */ void esp_log_set_vprintf(vprintf_like_t func); -/** - * @brief Write message into the log - * - * This function is not intended to be used directly. Instead, use one of - * ESP_LOGE, ESP_LOGW, ESP_LOGI, ESP_LOGD, ESP_LOGV macros. - * - * This function or these macros should not be used from an interrupt. - */ -void esp_log_write(esp_log_level_t level, const char* tag, const char* format, ...) __attribute__ ((format (printf, 3, 4))); - - /** * @brief Function which returns timestamp to be used in log output * @@ -143,7 +76,17 @@ void esp_log_write(esp_log_level_t level, const char* tag, const char* format, . * * @return timestamp, in milliseconds */ -uint32_t esp_log_timestamp(); +uint32_t esp_log_timestamp(void); + +/** + * @brief Write message into the log + * + * This function is not intended to be used directly. Instead, use one of + * ESP_LOGE, ESP_LOGW, ESP_LOGI, ESP_LOGD, ESP_LOGV macros. + * + * This function or these macros should not be used from an interrupt. + */ +void esp_log_write(esp_log_level_t level, const char* tag, const char* format, ...) __attribute__ ((format (printf, 3, 4))); #if CONFIG_LOG_COLORS diff --git a/components/log/log.c b/components/log/log.c index a2b41d7e6..9670b82df 100644 --- a/components/log/log.c +++ b/components/log/log.c @@ -284,7 +284,15 @@ static inline void heap_swap(int i, int j) } #endif //BOOTLOADER_BUILD -IRAM_ATTR uint32_t esp_log_early_timestamp() + +#ifndef BOOTLOADER_BUILD +#define ATTR IRAM_ATTR +#else +#define ATTR +#endif // BOOTLOADER_BUILD + + +uint32_t ATTR esp_log_early_timestamp() { return xthal_get_ccount() / (CPU_CLK_FREQ_ROM / 1000); } @@ -305,9 +313,6 @@ uint32_t IRAM_ATTR esp_log_timestamp() #else -uint32_t IRAM_ATTR esp_log_timestamp() -{ - return esp_log_early_timestamp(); -} +uint32_t esp_log_timestamp() __attribute__((alias("esp_log_early_timestamp"))); #endif //BOOTLOADER_BUILD diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 15c94c66b..bf7bff15b 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -1,5 +1,21 @@ menu "LWIP" +config L2_TO_L3_COPY + bool "Enable copy between Layer2 and Layer3 packets" + default 0 + help + If this feature is enabled, all traffic from layer2(WIFI Driver) will be + copied to a new buffer before sending it to layer3(LWIP stack), freeing + the layer2 buffer. + Please be notified that the total layer2 receiving buffer is fixed and + ESP32 currently supports 25 layer2 receiving buffer, when layer2 buffer + runs out of memory, then the incoming packets will be dropped in hardware. + The layer3 buffer is allocated from the heap, so the total layer3 receiving + buffer depends on the available heap size, when heap runs out of memory, + no copy will be sent to layer3 and packet will be dropped in layer2. + Please make sure you fully understand the impact of this feature before + enabling it. + config LWIP_MAX_SOCKETS int "Max number of open sockets" range 1 16 @@ -24,6 +40,15 @@ config LWIP_SO_REUSE Enabling this option allows binding to a port which remains in TIME_WAIT. +config LWIP_DHCP_MAX_NTP_SERVERS + int "Maximum number of NTP servers" + default 1 + range 1 16 + help + Set maxumum number of NTP servers used by LwIP SNTP module. + First argument of sntp_setserver/sntp_setservername functions + is limited to this value. + endmenu diff --git a/components/lwip/api/sockets.c b/components/lwip/api/sockets.c index 455d007ea..4acf518cc 100755 --- a/components/lwip/api/sockets.c +++ b/components/lwip/api/sockets.c @@ -382,31 +382,6 @@ static void lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, static void lwip_socket_drop_registered_memberships(int s); #endif /* LWIP_IGMP */ -#if ESP_LWIP -#include "esp_wifi_internal.h" -#include "esp_system.h" - -/* Please be notified that this flow control is just a workaround for fixing wifi Q full issue. - * Under UDP/TCP pressure test, we found that the sockets may cause wifi tx queue full if the socket - * sending speed is faster than the wifi sending speed, it will finally cause the packet to be dropped - * in wifi layer, it's not acceptable in some application. That's why we introdue the tx flow control here. - * However, current solution is just a workaround, we need to consider the return value of wifi tx interface, - * and feedback the return value to lwip and let lwip do the flow control itself. - */ -static inline void esp32_tx_flow_ctrl(void) -{ - uint8_t _wait_delay = 1; - - while ((system_get_free_heap_size() < HEAP_HIGHWAT) || esp_wifi_internal_tx_is_stop()){ - vTaskDelay(_wait_delay/portTICK_RATE_MS); - if (_wait_delay < 64) _wait_delay *= 2; - } -} - -#else -#define esp32_tx_flow_ctrl() -#endif - /** The global array of available sockets */ static struct lwip_sock sockets[NUM_SOCKETS]; #if ESP_THREAD_SAFE @@ -1208,8 +1183,6 @@ lwip_send(int s, const void *data, size_t size, int flags) #endif /* (LWIP_UDP || LWIP_RAW) */ } - esp32_tx_flow_ctrl(); - write_flags = NETCONN_COPY | ((flags & MSG_MORE) ? NETCONN_MORE : 0) | ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0); @@ -1391,8 +1364,6 @@ lwip_sendto(int s, const void *data, size_t size, int flags, #endif /* LWIP_TCP */ } - esp32_tx_flow_ctrl(); - if ((to != NULL) && !SOCK_ADDR_TYPE_MATCH(to, sock)) { /* sockaddr does not match socket type (IPv4/IPv6) */ sock_set_errno(sock, err_to_errno(ERR_VAL)); @@ -2804,8 +2775,12 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ case IPPROTO_IPV6: switch (optname) { case IPV6_V6ONLY: - /* @todo: this does not work for datagram sockets, yet */ + /* @todo: this does not work for datagram sockets, yet */ +#if CONFIG_MDNS + //LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP); +#else LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP); +#endif if (*(const int*)optval) { netconn_set_ipv6only(sock->conn, 1); } else { diff --git a/components/lwip/component.mk b/components/lwip/component.mk index 5d1502004..49fc644ae 100644 --- a/components/lwip/component.mk +++ b/components/lwip/component.mk @@ -8,4 +8,3 @@ COMPONENT_SRCDIRS := api apps/sntp apps core/ipv4 core/ipv6 core netif port/free CFLAGS += -Wno-address -Wno-unused-variable -Wno-unused-but-set-variable -include $(IDF_PATH)/make/component_common.mk diff --git a/components/lwip/core/ipv4/autoip.c b/components/lwip/core/ipv4/autoip.c index 19b192836..faac4957c 100755 --- a/components/lwip/core/ipv4/autoip.c +++ b/components/lwip/core/ipv4/autoip.c @@ -72,6 +72,7 @@ #include "lwip/netif.h" #include "lwip/autoip.h" #include "netif/etharp.h" +#include "lwip/dhcp.h" #include #include @@ -269,6 +270,12 @@ autoip_bind(struct netif *netif) netif_set_addr(netif, &autoip->llipaddr, &sn_mask, &gw_addr); /* interface is used by routing now that an address is set */ +#if ESP_LWIP + struct dhcp *dhcp = netif->dhcp; + if (dhcp->cb != NULL) { + dhcp->cb(); + } +#endif return ERR_OK; } diff --git a/components/lwip/core/ipv6/nd6.c b/components/lwip/core/ipv6/nd6.c index 36f8f78c3..1cec55db9 100755 --- a/components/lwip/core/ipv6/nd6.c +++ b/components/lwip/core/ipv6/nd6.c @@ -632,6 +632,22 @@ nd6_input(struct pbuf *p, struct netif *inp) pbuf_free(p); } +#ifdef ESP_LWIP + +/** Set callback for ipv6 addr status changed . + * + * @param netif the netif from which to remove the struct dhcp + * @param cb callback for dhcp + */ +void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index)) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + + if (netif != NULL && netif_is_up(netif)) { + netif->ipv6_addr_cb = cb; + } +} +#endif /** * Periodic timer for Neighbor discovery functions: @@ -797,6 +813,12 @@ nd6_tmr(void) if ((netif->ip6_addr_state[i] & 0x07) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) { /* No NA received in response. Mark address as valid. */ netif->ip6_addr_state[i] = IP6_ADDR_PREFERRED; +#ifdef ESP_LWIP + if (netif->ipv6_addr_cb != NULL) { + netif->ipv6_addr_cb(netif, i); + } +#endif + /* TODO implement preferred and valid lifetimes. */ } else if (netif->flags & NETIF_FLAG_UP) { #if LWIP_IPV6_MLD diff --git a/components/lwip/core/netif.c b/components/lwip/core/netif.c index 5c308a957..f745f29ac 100755 --- a/components/lwip/core/netif.c +++ b/components/lwip/core/netif.c @@ -968,9 +968,6 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) } } -#if ESP_LWIP - ip6_addr_set( ip_2_ip6(&netif->link_local_addr), ip_2_ip6(&netif->ip6_addr[0]) ); -#endif /* Set address state. */ #if LWIP_IPV6_DUP_DETECT_ATTEMPTS @@ -1022,44 +1019,6 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos return ERR_VAL; } - -#if ESP_LWIP -void -netif_create_ip4_linklocal_address(struct netif * netif) -{ -#if 1 - ip_addr_t linklocal; - ip_addr_t linklocal_mask; - ip4_addr_t addr = {0}; - /* Link-local prefix and mask. */ - IP4_ADDR(ip_2_ip4(&linklocal), 169, 254, 0, 0); - IP4_ADDR(ip_2_ip4(&linklocal_mask), 255, 255, 0, 0); - - if (!ip4_addr_netcmp( ip_2_ip4(&linklocal), ip_2_ip4(&netif->link_local_addr), ip_2_ip4(&linklocal_mask) ) && - !ip4_addr_isany(ip_2_ip4(&netif->ip_addr)) ) { - IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3( ip_2_ip4(&netif->ip_addr) ) - , ip4_addr4( ip_2_ip4(&netif->ip_addr) ) ); - return; - } - - while ( !(addr.addr) || !ip4_addr4(&addr) ) - //os_get_random((unsigned char *)&addr, sizeof(addr)); - addr.addr = LWIP_RAND(); - - - if ( ip_2_ip4(&netif->netmask)->addr > IP_CLASSB_NET && - !ip4_addr_isany( ip_2_ip4(&netif->ip_addr) )) { // random host address - IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3( ip_2_ip4(&netif->ip_addr)) - , ip4_addr4(&addr)); - } else { - IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3(&addr), ip4_addr4(&addr) ); - } -#endif -} - -#endif - - /** Dummy IPv6 output function for netifs not supporting IPv6 */ static err_t diff --git a/components/lwip/include/lwip/lwip/autoip.h b/components/lwip/include/lwip/lwip/autoip.h index c89fe3ff1..3bb413f49 100755 --- a/components/lwip/include/lwip/lwip/autoip.h +++ b/components/lwip/include/lwip/lwip/autoip.h @@ -68,8 +68,13 @@ extern "C" { #define ANNOUNCE_NUM 2 /* (number of announcement packets) */ #define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ #define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ +#if CONFIG_MDNS +#define MAX_CONFLICTS 9 /* (max conflicts before rate limiting) */ +#define RATE_LIMIT_INTERVAL 20 /* seconds (delay between successive attempts) */ +#else #define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ #define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ +#endif #define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ /* AutoIP client states */ diff --git a/components/lwip/include/lwip/lwip/nd6.h b/components/lwip/include/lwip/lwip/nd6.h index d0646f1b4..27a4c8137 100755 --- a/components/lwip/include/lwip/lwip/nd6.h +++ b/components/lwip/include/lwip/lwip/nd6.h @@ -352,6 +352,10 @@ err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p); void nd6_reachability_hint(const ip6_addr_t * ip6addr); #endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ +#if ESP_LWIP +/** set nd6 callback when ipv6 addr state pref*/ +void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index)); +#endif #ifdef __cplusplus } #endif diff --git a/components/lwip/include/lwip/lwip/netif.h b/components/lwip/include/lwip/lwip/netif.h index 666f77eb9..34e6d4489 100755 --- a/components/lwip/include/lwip/lwip/netif.h +++ b/components/lwip/include/lwip/lwip/netif.h @@ -190,11 +190,6 @@ struct netif { /** pointer to next in linked list */ struct netif *next; -#if ESP_LWIP -//ip_addr_t is changed by marco IPV4, IPV6 - ip_addr_t link_local_addr; -#endif - #if LWIP_IPV4 /** IP address configuration in network byte order */ ip_addr_t ip_addr; @@ -207,6 +202,10 @@ struct netif { /** The state of each IPv6 address (Tentative, Preferred, etc). * @see ip6_addr.h */ u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES]; +#if ESP_LWIP + void (*ipv6_addr_cb)(struct netif* netif, u8_t ip_idex); /* callback for ipv6 addr states changed */ +#endif + #endif /* LWIP_IPV6 */ /** This function is called by the network device driver * to pass a packet up the TCP/IP stack. */ diff --git a/components/lwip/include/lwip/lwip/opt.h b/components/lwip/include/lwip/lwip/opt.h index 51d340e00..c42f3cd73 100755 --- a/components/lwip/include/lwip/lwip/opt.h +++ b/components/lwip/include/lwip/lwip/opt.h @@ -3008,6 +3008,13 @@ #define LWIP_PERF 0 #endif +/** + * ESP_L2_TO_L3_COPY: enable memcpy when receiving packet from L2 + */ +#ifndef ESP_L2_TO_L3_COPY +#define ESP_L2_TO_L3_COPY 0 +#endif + #ifndef ESP_THREAD_SAFE_DEBUG #define ESP_THREAD_SAFE_DEBUG 0 #endif diff --git a/components/lwip/include/lwip/port/lwipopts.h b/components/lwip/include/lwip/port/lwipopts.h index 67a62b822..6786ff711 100755 --- a/components/lwip/include/lwip/port/lwipopts.h +++ b/components/lwip/include/lwip/port/lwipopts.h @@ -33,6 +33,9 @@ #define __LWIPOPTS_H__ #include +#include +#include +#include #include "esp_task.h" #include "sdkconfig.h" @@ -62,8 +65,8 @@ */ #define SMEMCPY(dst,src,len) memcpy(dst,src,len) -extern unsigned long os_random(void); -#define LWIP_RAND rand +#define LWIP_RAND rand + /* ------------------------------------ ---------- Memory options ---------- @@ -197,13 +200,35 @@ extern unsigned long os_random(void); */ #define LWIP_DHCP 1 +#define DHCP_MAXRTX 0 -#define DHCP_MAXRTX 0 //(*(volatile uint32*)0x600011E0) /* ------------------------------------ ---------- AUTOIP options ---------- ------------------------------------ */ +#if CONFIG_MDNS + /** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#define LWIP_AUTOIP 1 + +/** +* LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on +* the same interface at the same time. +*/ +#define LWIP_DHCP_AUTOIP_COOP 1 + +/** +* LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes +* that should be sent before falling back on AUTOIP. This can be set +* as low as 1 to get an AutoIP address very quickly, but you should +* be prepared to handle a changing IP address when DHCP overrides +* AutoIP. +*/ +#define LWIP_DHCP_AUTOIP_COOP_TRIES 2 +#endif + /* ---------------------------------- ---------- SNMP options ---------- @@ -305,6 +330,19 @@ extern unsigned long os_random(void); ---------- LOOPIF options ---------- ------------------------------------ */ +#if CONFIG_MDNS +/** + * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP + * address equal to the netif IP address, looping them back up the stack. + */ +#define LWIP_NETIF_LOOPBACK 1 + +/** + * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback + * sending for each netif (0 = disabled) + */ +#define LWIP_LOOPBACK_MAX_PBUFS 8 +#endif /* ------------------------------------ @@ -411,6 +449,15 @@ extern unsigned long os_random(void); */ #define SO_REUSE CONFIG_LWIP_SO_REUSE +#if CONFIG_MDNS +/** + * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets + * to all local matches if SO_REUSEADDR is turned on. + * WARNING: Adds a memcpy for every packet if passing to more than one pcb! + */ +#define SO_REUSE_RXTOALL 1 +#endif + /* ---------------------------------------- ---------- Statistics options ---------- @@ -512,6 +559,7 @@ extern unsigned long os_random(void); /* Enable all Espressif-only options */ #define ESP_LWIP 1 +#define ESP_LWIP_ARP 1 #define ESP_PER_SOC_TCP_WND 1 #define ESP_THREAD_SAFE 1 #define ESP_THREAD_SAFE_DEBUG LWIP_DBG_OFF @@ -522,7 +570,7 @@ extern unsigned long os_random(void); #define ESP_RANDOM_TCP_PORT 1 #define ESP_IP4_ATON 1 #define ESP_LIGHT_SLEEP 1 - +#define ESP_L2_TO_L3_COPY CONFIG_L2_TO_L3_COPY #define TCP_WND_DEFAULT (4*TCP_MSS) #define TCP_SND_BUF_DEFAULT (2*TCP_MSS) @@ -550,12 +598,25 @@ extern unsigned char misc_prof_get_tcp_snd_buf(void); #define CHECKSUM_CHECK_UDP 0 #define CHECKSUM_CHECK_IP 0 -#define HEAP_HIGHWAT 20*1024 - #define LWIP_NETCONN_FULLDUPLEX 1 #define LWIP_NETCONN_SEM_PER_THREAD 1 +#define LWIP_DHCP_MAX_NTP_SERVERS CONFIG_LWIP_DHCP_MAX_NTP_SERVERS +#define LWIP_TIMEVAL_PRIVATE 0 +#define SNTP_SET_SYSTEM_TIME_US(sec, us) \ + do { \ + struct timeval tv = { .tv_sec = sec, .tv_usec = us }; \ + settimeofday(&tv, NULL); \ + } while (0); + +#define SNTP_GET_SYSTEM_TIME(sec, us) \ + do { \ + struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; \ + gettimeofday(&tv, NULL); \ + (sec) = tv.tv_sec; \ + (us) = tv.tv_usec; \ + } while (0); #define SOC_SEND_LOG //printf diff --git a/components/lwip/netif/etharp.c b/components/lwip/netif/etharp.c index 776e949f7..b51a20222 100755 --- a/components/lwip/netif/etharp.c +++ b/components/lwip/netif/etharp.c @@ -1192,11 +1192,28 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) } #if ARP_QUEUE_LEN if (qlen >= ARP_QUEUE_LEN) { +#if ESP_LWIP_ARP + int l; + struct etharp_q_entry *r; + + l = qlen - 1; + r = arp_table[i].q; + while (l--) + r = r->next; + r->next = NULL; + + pbuf_free(new_entry->p); + memp_free(MEMP_ARP_QUEUE, new_entry); + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue the packet %p (queue is full)\n", (void *)q)); + return ERR_MEM; +#else struct etharp_q_entry *old; old = arp_table[i].q; arp_table[i].q = arp_table[i].q->next; pbuf_free(old->p); memp_free(MEMP_ARP_QUEUE, old); +#endif } #endif LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); diff --git a/components/lwip/port/netif/wlanif.c b/components/lwip/port/netif/wlanif.c index 548bb7f97..f5d34179a 100755 --- a/components/lwip/port/netif/wlanif.c +++ b/components/lwip/port/netif/wlanif.c @@ -118,40 +118,29 @@ low_level_init(struct netif *netif) static err_t low_level_output(struct netif *netif, struct pbuf *p) { - struct pbuf *q; - wifi_interface_t wifi_if = tcpip_adapter_get_wifi_if(netif); + wifi_interface_t wifi_if = tcpip_adapter_get_wifi_if(netif); + struct pbuf *q = p; + err_t ret; - if (wifi_if >= WIFI_IF_MAX) { - return ERR_IF; - } - -#if ESP_LWIP - q = p; - u16_t pbuf_x_len = 0; - pbuf_x_len = q->len; - if(q->next !=NULL) - { - //char cnt = 0; - struct pbuf *tmp = q->next; - while(tmp != NULL) - { - memcpy( (u8_t *)( (u8_t *)(q->payload) + pbuf_x_len), (u8_t *)tmp->payload , tmp->len ); - pbuf_x_len += tmp->len; - //cnt++; - tmp = tmp->next; + if (wifi_if >= WIFI_IF_MAX) { + return ERR_IF; + } + + if(q->next == NULL) { + ret = esp_wifi_internal_tx(wifi_if, q->payload, q->len); + } else { + LWIP_DEBUGF(PBUF_DEBUG, ("low_level_output: pbuf is a list, application may has bug")); + q = pbuf_alloc(PBUF_RAW_TX, p->tot_len, PBUF_RAM); + if (q != NULL) { + pbuf_copy(q, p); + } else { + return ERR_MEM; } + ret = esp_wifi_internal_tx(wifi_if, q->payload, q->len); + pbuf_free(q); } - - esp_wifi_internal_tx(wifi_if, q->payload, pbuf_x_len); - return ERR_OK; - -#else - for(q = p; q != NULL; q = q->next) { - esp_wifi_internal_tx(wifi_if, q->payload, q->len); - } -#endif - - return ERR_OK; + + return ret; } /** @@ -164,40 +153,37 @@ low_level_output(struct netif *netif, struct pbuf *p) * @param netif the lwip network interface structure for this ethernetif */ void -#if ESP_LWIP wlanif_input(struct netif *netif, void *buffer, u16_t len, void* eb) -#else -wlanif_input(struct netif *netif, void *buffer, uint16 len) -#endif { struct pbuf *p; -#if ESP_LWIP - if(buffer== NULL) + if(!buffer || !netif) goto _exit; - if(netif == NULL) - goto _exit; -#endif -#if ESP_LWIP - p = pbuf_alloc(PBUF_RAW, len, PBUF_REF); - if (p == NULL){ -#if ESP_PERF - g_rx_alloc_pbuf_fail_cnt++; -#endif - return; - } - p->payload = buffer; - p->eb = eb; -#else - p = pbuf_alloc(PBUF_IP, len, PBUF_POOL); +#if (ESP_L2_TO_L3_COPY == 1) + //p = pbuf_alloc(PBUF_IP, len, PBUF_POOL); + p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM); if (p == NULL) { + #if ESP_PERF + g_rx_alloc_pbuf_fail_cnt++; + #endif + esp_wifi_internal_free_rx_buffer(eb); return; } memcpy(p->payload, buffer, len); + esp_wifi_internal_free_rx_buffer(eb); +#else + p = pbuf_alloc(PBUF_RAW, len, PBUF_REF); + if (p == NULL){ + #if ESP_PERF + g_rx_alloc_pbuf_fail_cnt++; + #endif + return; + } + p->payload = buffer; + p->eb = eb; #endif - /* full packet send to tcpip_thread to process */ if (netif->input(p, netif) != ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); diff --git a/components/mbedtls/Kconfig b/components/mbedtls/Kconfig index 60facc7d2..d6e2a2dcb 100644 --- a/components/mbedtls/Kconfig +++ b/components/mbedtls/Kconfig @@ -22,7 +22,7 @@ config MBEDTLS_SSL_MAX_CONTENT_LEN config MBEDTLS_DEBUG bool "Enable mbedTLS debugging" - default "no" + default n help Enable mbedTLS debugging functions. @@ -34,4 +34,39 @@ config MBEDTLS_DEBUG functionality. See the "https_request_main" example for a sample function which connects the two together. +config MBEDTLS_HARDWARE_AES + bool "Enable hardware AES acceleration" + default y + help + Enable hardware accelerated AES encryption & decryption. + +config MBEDTLS_HARDWARE_MPI + bool "Enable hardware MPI (bignum) acceleration" + default y + help + Enable hardware accelerated multiple precision integer operations. + + Hardware accelerated multiplication, modulo multiplication, + and modular exponentiation for up to 4096 bit results. + + These operations are used by RSA. + +config MBEDTLS_MPI_USE_INTERRUPT + bool "Use interrupt for MPI operations" + depends on MBEDTLS_HARDWARE_MPI + default y + help + Use an interrupt to coordinate MPI operations. + + This allows other code to run on the CPU while an MPI operation is pending. + Otherwise the CPU busy-waits. + +config MBEDTLS_MPI_INTERRUPT_NUM + int "MPI Interrupt number" + depends on MBEDTLS_MPI_USE_INTERRUPT + default 18 + help + CPU interrupt number for MPI interrupt to connect to. Must be otherwise unused. + Eventually this assignment will be handled automatically at runtime. + endmenu diff --git a/components/mbedtls/component.mk b/components/mbedtls/component.mk index 98838d4d7..bd7209a92 100644 --- a/components/mbedtls/component.mk +++ b/components/mbedtls/component.mk @@ -6,4 +6,3 @@ COMPONENT_ADD_INCLUDEDIRS := port/include include COMPONENT_SRCDIRS := library port -include $(IDF_PATH)/make/component_common.mk diff --git a/components/mbedtls/library/bignum.c b/components/mbedtls/library/bignum.c index e739bc1d3..04ff9e07b 100644 --- a/components/mbedtls/library/bignum.c +++ b/components/mbedtls/library/bignum.c @@ -1092,6 +1092,8 @@ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint return( mbedtls_mpi_sub_mpi( X, A, &_B ) ); } +#if !defined(MBEDTLS_MPI_MUL_MPI_ALT) || !defined(MBEDTLS_MPI_EXP_MOD_ALT) + /* * Helper for mbedtls_mpi multiplication */ @@ -1103,6 +1105,7 @@ static */ __attribute__ ((noinline)) #endif + void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b ) { mbedtls_mpi_uint c = 0, t = 0; @@ -1164,6 +1167,8 @@ void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mp while( c != 0 ); } +#endif + #if !defined(MBEDTLS_MPI_MUL_MPI_ALT) /* * Baseline multiplication: X = A * B (HAC 14.12) @@ -1526,6 +1531,8 @@ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_ return( 0 ); } +#if !defined(MBEDTLS_MPI_EXP_MOD_ALT) + /* * Fast Montgomery initialization (thanks to Tom St Denis) */ @@ -1600,7 +1607,6 @@ static int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint m return( mpi_montmul( A, &U, N, mm, T ) ); } -#if !defined(MBEDTLS_MPI_EXP_MOD_ALT) /* * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) */ diff --git a/components/mbedtls/port/esp_bignum.c b/components/mbedtls/port/esp_bignum.c index 59bdc8726..ec2e42039 100644 --- a/components/mbedtls/port/esp_bignum.c +++ b/components/mbedtls/port/esp_bignum.c @@ -23,514 +23,529 @@ #include #include #include +#include +#include +#include #include "mbedtls/bignum.h" -#include "mbedtls/bn_mul.h" #include "rom/bigint.h" +#include "soc/hwcrypto_reg.h" +#include "esp_system.h" +#include "esp_log.h" +#include "esp_intr.h" +#include "esp_attr.h" -#if defined(MBEDTLS_MPI_MUL_MPI_ALT) || defined(MBEDTLS_MPI_EXP_MOD_ALT) +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" -/* Constants from mbedTLS bignum.c */ -#define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ -#define biL (ciL << 3) /* bits in limb */ +static const __attribute__((unused)) char *TAG = "bignum"; + +#if defined(CONFIG_MBEDTLS_MPI_USE_INTERRUPT) +static SemaphoreHandle_t op_complete_sem; + +static IRAM_ATTR void rsa_complete_isr(void *arg) +{ + BaseType_t higher_woken; + REG_WRITE(RSA_INTERRUPT_REG, 1); + xSemaphoreGiveFromISR(op_complete_sem, &higher_woken); + if (higher_woken) { + portYIELD_FROM_ISR(); + } +} + +static void rsa_isr_initialise() +{ + if (op_complete_sem == NULL) { + op_complete_sem = xSemaphoreCreateBinary(); + intr_matrix_set(xPortGetCoreID(), ETS_RSA_INTR_SOURCE, CONFIG_MBEDTLS_MPI_INTERRUPT_NUM); + xt_set_interrupt_handler(CONFIG_MBEDTLS_MPI_INTERRUPT_NUM, &rsa_complete_isr, NULL); + xthal_set_intclear(1 << CONFIG_MBEDTLS_MPI_INTERRUPT_NUM); + xt_ints_on(1 << CONFIG_MBEDTLS_MPI_INTERRUPT_NUM); + } +} + +#endif /* CONFIG_MBEDTLS_MPI_USE_INTERRUPT */ static _lock_t mpi_lock; -/* At the moment these hardware locking functions aren't exposed publically - for MPI. If you want to use the ROM bigint functions and co-exist with mbedTLS, - please raise a feature request. -*/ -static void esp_mpi_acquire_hardware( void ) +void esp_mpi_acquire_hardware( void ) { /* newlib locks lazy initialize on ESP-IDF */ _lock_acquire(&mpi_lock); ets_bigint_enable(); +#ifdef CONFIG_MBEDTLS_MPI_USE_INTERRUPT + rsa_isr_initialise(); +#endif } -static void esp_mpi_release_hardware( void ) +void esp_mpi_release_hardware( void ) { ets_bigint_disable(); _lock_release(&mpi_lock); } -/* - * Helper for mbedtls_mpi multiplication - * copied/trimmed from mbedtls bignum.c - */ -static void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b ) -{ - mbedtls_mpi_uint c = 0, t = 0; +/* Number of words used to hold 'mpi', rounded up to nearest + 16 words (512 bits) to match hardware support. - for( ; i >= 16; i -= 16 ) - { - MULADDC_INIT - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE + Note that mpi->n (size of memory buffer) may be higher than this + number, if the high bits are mostly zeroes. - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_STOP - } - - for( ; i >= 8; i -= 8 ) - { - MULADDC_INIT - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - - MULADDC_CORE MULADDC_CORE - MULADDC_CORE MULADDC_CORE - MULADDC_STOP - } - - - for( ; i > 0; i-- ) - { - MULADDC_INIT - MULADDC_CORE - MULADDC_STOP - } - - t++; - - do { - *d += c; c = ( *d < c ); d++; - } - while( c != 0 ); -} - - -/* - * Helper for mbedtls_mpi subtraction - * Copied/adapter from mbedTLS bignum.c - */ -static void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d ) -{ - size_t i; - mbedtls_mpi_uint c, z; - - for( i = c = 0; i < n; i++, s++, d++ ) - { - z = ( *d < c ); *d -= c; - c = ( *d < *s ) + z; *d -= *s; - } - - while( c != 0 ) - { - z = ( *d < c ); *d -= c; - c = z; i++; d++; - } -} - - -/* The following 3 Montgomery arithmetic function are - copied from mbedTLS bigint.c verbatim as they are static. - - TODO: find a way to support making the versions in mbedtls - non-static. + This implementation may cause the caller to leak a small amount of + timing information when an operation is performed (length of a + given mpi value, rounded to nearest 512 bits), but not all mbedTLS + RSA operations succeed if we use mpi->N as-is (buffers are too long). */ - -/* - * Fast Montgomery initialization (thanks to Tom St Denis) - */ -static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N ) +static inline size_t hardware_words_needed(const mbedtls_mpi *mpi) { - mbedtls_mpi_uint x, m0 = N->p[0]; - unsigned int i; - - x = m0; - x += ( ( m0 + 2 ) & 4 ) << 1; - - for( i = biL; i >= 8; i /= 2 ) - x *= ( 2 - ( m0 * x ) ); - - *mm = ~x + 1; + size_t res = 1; + for(size_t i = 0; i < mpi->n; i++) { + if( mpi->p[i] != 0 ) { + res = i + 1; + } + } + res = (res + 0xF) & ~0xF; + return res; } -/* - * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) - */ -static int mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm, - const mbedtls_mpi *T ) +/* Convert number of bits to number of words, rounded up to nearest + 512 bit (16 word) block count. +*/ +static inline size_t bits_to_hardware_words(size_t num_bits) { - size_t i, n, m; - mbedtls_mpi_uint u0, u1, *d; + return ((num_bits + 511) / 512) * 16; +} - if( T->n < N->n + 1 || T->p == NULL ) - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); +/* Copy mbedTLS MPI bignum 'mpi' to hardware memory block at 'mem_base'. - memset( T->p, 0, T->n * ciL ); + If num_words is higher than the number of words in the bignum then + these additional words will be zeroed in the memory buffer. +*/ +static inline void mpi_to_mem_block(uint32_t mem_base, const mbedtls_mpi *mpi, size_t num_words) +{ + uint32_t *pbase = (uint32_t *)mem_base; + uint32_t copy_words = num_words < mpi->n ? num_words : mpi->n; - d = T->p; - n = N->n; - m = ( B->n < n ) ? B->n : n; + /* Copy MPI data to memory block registers */ + memcpy(pbase, mpi->p, copy_words * 4); - for( i = 0; i < n; i++ ) - { - /* - * T = (T + u0*B + u1*N) / 2^biL - */ - u0 = A->p[i]; - u1 = ( d[0] + u0 * B->p[0] ) * mm; + /* Zero any remaining memory block data */ + bzero(pbase + copy_words, (num_words - copy_words) * 4); - mpi_mul_hlp( m, B->p, d, u0 ); - mpi_mul_hlp( n, N->p, d, u1 ); + /* Note: not executing memw here, can do it before we start a bignum operation */ +} - *d++ = u0; d[n + 1] = 0; +/* Read mbedTLS MPI bignum back from hardware memory block. + + Reads num_words words from block. + + Can return a failure result if fails to grow the MPI result. +*/ +static inline int mem_block_to_mpi(mbedtls_mpi *x, uint32_t mem_base, int num_words) +{ + int ret = 0; + + MBEDTLS_MPI_CHK( mbedtls_mpi_grow(x, num_words) ); + + /* Copy data from memory block registers */ + memcpy(x->p, (uint32_t *)mem_base, num_words * 4); + + /* Zero any remaining limbs in the bignum, if the buffer is bigger + than num_words */ + for(size_t i = num_words; i < x->n; i++) { + x->p[i] = 0; } - memcpy( A->p, d, ( n + 1 ) * ciL ); - - if( mbedtls_mpi_cmp_abs( A, N ) >= 0 ) - mpi_sub_hlp( n, N->p, A->p ); - else - /* prevent timing attacks */ - mpi_sub_hlp( n, A->p, T->p ); - - return( 0 ); + asm volatile ("memw"); + cleanup: + return ret; } -/* - * Montgomery reduction: A = A * R^-1 mod N + +/** + * + * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1, + * where B^-1(B-1) mod N=1. Actually, only the least significant part of + * N' is needed, hence the definition N0'=N' mod b. We reproduce below the + * simple algorithm from an article by Dusse and Kaliski to efficiently + * find N0' from N0 and b */ -static int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T ) +static mbedtls_mpi_uint modular_inverse(const mbedtls_mpi *M) { - mbedtls_mpi_uint z = 1; - mbedtls_mpi U; + int i; + uint64_t t = 1; + uint64_t two_2_i_minus_1 = 2; /* 2^(i-1) */ + uint64_t two_2_i = 4; /* 2^i */ + uint64_t N = M->p[0]; - U.n = U.s = (int) z; - U.p = &z; + for (i = 2; i <= 32; i++) { + if ((mbedtls_mpi_uint) N * t % two_2_i >= two_2_i_minus_1) { + t += two_2_i_minus_1; + } - return( mpi_montmul( A, &U, N, mm, T ) ); + two_2_i_minus_1 <<= 1; + two_2_i <<= 1; + } + + return (mbedtls_mpi_uint)(UINT32_MAX - t + 1); } - -/* Allocate parameters used by hardware MPI multiply, - and copy mbedtls_mpi structures into them */ -static int mul_pram_alloc(const mbedtls_mpi *A, const mbedtls_mpi *B, char **pA, char **pB, char **pX, size_t *bites) -{ - char *sa, *sb, *sx; -// int algn; - int words, bytes; - int abytes, bbytes; - - if (A->n > B->n) - words = A->n; - else - words = B->n; - - bytes = (words / 16 + ((words % 16) ? 1 : 0 )) * 16 * 4 * 2; - - abytes = A->n * 4; - bbytes = B->n * 4; - - sa = malloc(bytes); - if (!sa) { - return -1; - } - - sb = malloc(bytes); - if (!sb) { - free(sa); - return -1; - } - - sx = malloc(bytes); - if (!sx) { - free(sa); - free(sb); - return -1; - } - - memcpy(sa, A->p, abytes); - memset(sa + abytes, 0, bytes - abytes); - - memcpy(sb, B->p, bbytes); - memset(sb + bbytes, 0, bytes - bbytes); - - *pA = sa; - *pB = sb; - - *pX = sx; - - *bites = bytes * 4; - - return 0; -} - -#if defined(MBEDTLS_MPI_MUL_MPI_ALT) - -int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) -{ - int ret = -1; - size_t i, j; - char *s1 = NULL, *s2 = NULL, *dest = NULL; - size_t bites; - - mbedtls_mpi TA, TB; - - mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB ); - - if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; } - if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; } - - for( i = A->n; i > 0; i-- ) - if( A->p[i - 1] != 0 ) - break; - - for( j = B->n; j > 0; j-- ) - if( B->p[j - 1] != 0 ) - break; - - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); - - if (mul_pram_alloc(A, B, &s1, &s2, &dest, &bites)) { - goto cleanup; - } - - esp_mpi_acquire_hardware(); - if (ets_bigint_mult_prepare((uint32_t *)s1, (uint32_t *)s2, bites)){ - ets_bigint_wait_finish(); - if (ets_bigint_mult_getz((uint32_t *)dest, bites) == true) { - memcpy(X->p, dest, (i + j) * 4); - ret = 0; - } else { - printf("ets_bigint_mult_getz failed\n"); - } - } else{ - printf("Baseline multiplication failed\n"); - } - esp_mpi_release_hardware(); - - X->s = A->s * B->s; - - free(s1); - free(s2); - free(dest); - -cleanup: - - mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA ); - - return( ret ); -} - -#endif /* MBEDTLS_MPI_MUL_MPI_ALT */ - -#if defined(MBEDTLS_MPI_EXP_MOD_ALT) -/* - * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) +/* Calculate Rinv = RR^2 mod M, where: + * + * R = b^n where b = 2^32, n=num_words, + * R = 2^N (where N=num_bits) + * RR = R^2 = 2^(2*N) (where N=num_bits=num_words*32) + * + * This calculation is computationally expensive (mbedtls_mpi_mod_mpi) + * so caller should cache the result where possible. + * + * DO NOT call this function while holding esp_mpi_acquire_hardware(). + * */ -int mbedtls_mpi_exp_mod( mbedtls_mpi* X, const mbedtls_mpi* A, const mbedtls_mpi* E, const mbedtls_mpi* N, mbedtls_mpi* _RR ) +static int calculate_rinv(mbedtls_mpi *Rinv, const mbedtls_mpi *M, int num_words) { int ret; - size_t wbits, wsize, one = 1; - size_t i, j, nblimbs; - size_t bufsize, nbits; - mbedtls_mpi_uint ei, mm, state; - mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos; - int neg; + size_t num_bits = num_words * 32; + mbedtls_mpi RR; + mbedtls_mpi_init(&RR); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&RR, num_bits * 2, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(Rinv, &RR, M)); - if( mbedtls_mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 ) - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + cleanup: + mbedtls_mpi_free(&RR); + return ret; +} - if( mbedtls_mpi_cmp_int( E, 0 ) < 0 ) - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); - /* - * Init temps and window size - */ - mpi_montg_init( &mm, N ); - mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T ); - mbedtls_mpi_init( &Apos ); - memset( W, 0, sizeof( W ) ); +/* Execute RSA operation. op_reg specifies which 'START' register + to write to. +*/ +static inline void execute_op(uint32_t op_reg) +{ + /* Clear interrupt status */ + REG_WRITE(RSA_INTERRUPT_REG, 1); - i = mbedtls_mpi_bitlen( E ); + /* Note: above REG_WRITE includes a memw, so we know any writes + to the memory blocks are also complete. */ - wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : - ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; + REG_WRITE(op_reg, 1); - if( wsize > MBEDTLS_MPI_WINDOW_SIZE ) - wsize = MBEDTLS_MPI_WINDOW_SIZE; +#ifdef CONFIG_MBEDTLS_MPI_USE_INTERRUPT + if (!xSemaphoreTake(op_complete_sem, 2000 / portTICK_PERIOD_MS)) { + ESP_LOGE(TAG, "Timed out waiting for RSA operation (op_reg 0x%x int_reg 0x%x)", + op_reg, REG_READ(RSA_INTERRUPT_REG)); + abort(); /* indicates a fundamental problem with driver */ + } +#else + while(REG_READ(RSA_INTERRUPT_REG) != 1) + { } +#endif - j = N->n + 1; - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) ); + /* clear the interrupt */ + REG_WRITE(RSA_INTERRUPT_REG, 1); +} - /* - * Compensate for negative A (and correct at the end) - */ - neg = ( A->s == -1 ); - if( neg ) - { - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) ); - Apos.s = 1; - A = &Apos; +/* Sub-stages of modulo multiplication/exponentiation operations */ +inline static int modular_multiply_finish(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, size_t num_words); + +/* Z = (X * Y) mod M + + Not an mbedTLS function +*/ +int esp_mpi_mul_mpi_mod(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M) +{ + int ret; + size_t num_words = hardware_words_needed(M); + mbedtls_mpi Rinv; + mbedtls_mpi_uint Mprime; + + /* Calculate and load the first stage montgomery multiplication */ + mbedtls_mpi_init(&Rinv); + MBEDTLS_MPI_CHK(calculate_rinv(&Rinv, M, num_words)); + Mprime = modular_inverse(M); + + esp_mpi_acquire_hardware(); + + /* Load M, X, Rinv, Mprime (Mprime is mod 2^32) */ + mpi_to_mem_block(RSA_MEM_M_BLOCK_BASE, M, num_words); + mpi_to_mem_block(RSA_MEM_X_BLOCK_BASE, X, num_words); + mpi_to_mem_block(RSA_MEM_RB_BLOCK_BASE, &Rinv, num_words); + REG_WRITE(RSA_M_DASH_REG, (uint32_t)Mprime); + + /* "mode" register loaded with number of 512-bit blocks, minus 1 */ + REG_WRITE(RSA_MULT_MODE_REG, (num_words / 16) - 1); + + /* Execute first stage montgomery multiplication */ + execute_op(RSA_MULT_START_REG); + + /* execute second stage */ + MBEDTLS_MPI_CHK( modular_multiply_finish(Z, X, Y, num_words) ); + + esp_mpi_release_hardware(); + + cleanup: + mbedtls_mpi_free(&Rinv); + return ret; +} + +#if defined(MBEDTLS_MPI_EXP_MOD_ALT) + +/* + * Sliding-window exponentiation: Z = X^Y mod M (HAC 14.85) + * + * _Rinv is optional pre-calculated version of Rinv (via calculate_rinv()). + * + * (See RSA Accelerator section in Technical Reference for more about Mprime, Rinv) + * + */ +int mbedtls_mpi_exp_mod( mbedtls_mpi* Z, const mbedtls_mpi* X, const mbedtls_mpi* Y, const mbedtls_mpi* M, mbedtls_mpi* _Rinv ) +{ + int ret = 0; + size_t z_words = hardware_words_needed(Z); + size_t x_words = hardware_words_needed(X); + size_t y_words = hardware_words_needed(Y); + size_t m_words = hardware_words_needed(M); + size_t num_words; + + mbedtls_mpi Rinv_new; /* used if _Rinv == NULL */ + mbedtls_mpi *Rinv; /* points to _Rinv (if not NULL) othwerwise &RR_new */ + mbedtls_mpi_uint Mprime; + + /* "all numbers must be the same length", so choose longest number + as cardinal length of operation... + */ + num_words = z_words; + if (x_words > num_words) { + num_words = x_words; + } + if (y_words > num_words) { + num_words = y_words; + } + if (m_words > num_words) { + num_words = m_words; } - /* - * If 1st call, pre-compute R^2 mod N - */ - if( _RR == NULL || _RR->p == NULL ) - { - MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) ); - - if( _RR != NULL ) - memcpy( _RR, &RR, sizeof( mbedtls_mpi) ); - } - else - memcpy( &RR, _RR, sizeof( mbedtls_mpi) ); - - /* - * W[1] = A * R^2 * R^-1 mod N = A * R mod N - */ - if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 ) - MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) ); - else - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) ); - - mpi_montmul( &W[1], &RR, N, mm, &T ); - - /* - * X = R^2 * R^-1 mod N = R mod N - */ - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) ); - mpi_montred( X, N, mm, &T ); - - if( wsize > 1 ) - { - /* - * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) - */ - j = one << ( wsize - 1 ); - - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) ); - - for( i = 0; i < wsize - 1; i++ ) - mpi_montmul( &W[j], &W[j], N, mm, &T ); - - /* - * W[i] = W[i - 1] * W[1] - */ - for( i = j + 1; i < ( one << wsize ); i++ ) - { - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) ); - - mpi_montmul( &W[i], &W[1], N, mm, &T ); - } + if (num_words * 32 > 4096) { + return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; } - nblimbs = E->n; - bufsize = 0; - nbits = 0; - wbits = 0; - state = 0; - - while( 1 ) - { - if( bufsize == 0 ) - { - if( nblimbs == 0 ) - break; - - nblimbs--; - - bufsize = sizeof( mbedtls_mpi_uint ) << 3; - } - - bufsize--; - - ei = (E->p[nblimbs] >> bufsize) & 1; - - /* - * skip leading 0s - */ - if( ei == 0 && state == 0 ) - continue; - - if( ei == 0 && state == 1 ) - { - /* - * out of window, square X - */ - mpi_montmul( X, X, N, mm, &T ); - continue; - } - - /* - * add ei to current window - */ - state = 2; - - nbits++; - wbits |= ( ei << ( wsize - nbits ) ); - - if( nbits == wsize ) - { - /* - * X = X^wsize R^-1 mod N - */ - for( i = 0; i < wsize; i++ ) - mpi_montmul( X, X, N, mm, &T ); - - /* - * X = X * W[wbits] R^-1 mod N - */ - mpi_montmul( X, &W[wbits], N, mm, &T ); - - state--; - nbits = 0; - wbits = 0; - } + /* Determine RR pointer, either _RR for cached value + or local RR_new */ + if (_Rinv == NULL) { + mbedtls_mpi_init(&Rinv_new); + Rinv = &Rinv_new; + } else { + Rinv = _Rinv; + } + if (Rinv->p == NULL) { + MBEDTLS_MPI_CHK(calculate_rinv(Rinv, M, num_words)); } - /* - * process the remaining bits - */ - for( i = 0; i < nbits; i++ ) - { - mpi_montmul( X, X, N, mm, &T ); + Mprime = modular_inverse(M); - wbits <<= 1; + esp_mpi_acquire_hardware(); - if( ( wbits & ( one << wsize ) ) != 0 ) - mpi_montmul( X, &W[1], N, mm, &T ); + /* "mode" register loaded with number of 512-bit blocks, minus 1 */ + REG_WRITE(RSA_MODEXP_MODE_REG, (num_words / 16) - 1); + + /* Load M, X, Rinv, M-prime (M-prime is mod 2^32) */ + mpi_to_mem_block(RSA_MEM_X_BLOCK_BASE, X, num_words); + mpi_to_mem_block(RSA_MEM_Y_BLOCK_BASE, Y, num_words); + mpi_to_mem_block(RSA_MEM_M_BLOCK_BASE, M, num_words); + mpi_to_mem_block(RSA_MEM_RB_BLOCK_BASE, Rinv, num_words); + REG_WRITE(RSA_M_DASH_REG, Mprime); + + execute_op(RSA_START_MODEXP_REG); + + ret = mem_block_to_mpi(Z, RSA_MEM_Z_BLOCK_BASE, num_words); + + esp_mpi_release_hardware(); + + cleanup: + if (_Rinv == NULL) { + mbedtls_mpi_free(&Rinv_new); } - /* - * X = A^E * R * R^-1 mod N = A^E mod N - */ - mpi_montred( X, N, mm, &T ); - - if( neg ) - { - X->s = -1; - MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) ); - } - -cleanup: - - for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ ) - mbedtls_mpi_free( &W[i] ); - - mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos ); - - if( _RR == NULL || _RR->p == NULL ) - mbedtls_mpi_free( &RR ); - - return( ret ); + return ret; } #endif /* MBEDTLS_MPI_EXP_MOD_ALT */ -#endif /* MBEDTLS_MPI_MUL_MPI_ALT || MBEDTLS_MPI_EXP_MOD_ALT */ +/* Second & final step of a modular multiply - load second multiplication + * factor Y, run the multiply, read back the result into Z. + * + * Called from both mbedtls_mpi_exp_mod and mbedtls_mpi_mod_mpi. + * + * @param Z result value + * @param X first multiplication factor (used to set sign of result). + * @param Y second multiplication factor. + * @param num_words size of modulo operation, in words (limbs). + * Should already be rounded up to a multiple of 16 words (512 bits) & range checked. + * + * Caller must have already called esp_mpi_acquire_hardware(). + */ +static int modular_multiply_finish(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, size_t num_words) +{ + int ret; + /* Load Y to X input memory block, rerun */ + mpi_to_mem_block(RSA_MEM_X_BLOCK_BASE, Y, num_words); + + execute_op(RSA_MULT_START_REG); + + /* Read result into Z */ + ret = mem_block_to_mpi(Z, RSA_MEM_Z_BLOCK_BASE, num_words); + + Z->s = X->s * Y->s; + + return ret; +} + +#if defined(MBEDTLS_MPI_MUL_MPI_ALT) /* MBEDTLS_MPI_MUL_MPI_ALT */ + +static int mpi_mult_mpi_failover_mod_mult(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, size_t num_words); + +/* Z = X * Y */ +int mbedtls_mpi_mul_mpi( mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y ) +{ + int ret; + size_t bits_x, bits_y, words_x, words_y, words_mult, words_z; + + /* Count words needed for X & Y in hardware */ + bits_x = mbedtls_mpi_bitlen(X); + bits_y = mbedtls_mpi_bitlen(Y); + /* Convert bit counts to words, rounded up to 512-bit + (16 word) blocks */ + words_x = bits_to_hardware_words(bits_x); + words_y = bits_to_hardware_words(bits_y); + + /* Short-circuit eval if either argument is 0 or 1. + + This is needed as the mpi modular division + argument will sometimes call in here when one + argument is too large for the hardware unit, but the other + argument is zero or one. + + This leaks some timing information, although overall there is a + lot less timing variation than a software MPI approach. + */ + if (bits_x == 0 || bits_y == 0) { + mbedtls_mpi_lset(Z, 0); + return 0; + } + if (bits_x == 1) { + return mbedtls_mpi_copy(Z, Y); + } + if (bits_y == 1) { + return mbedtls_mpi_copy(Z, X); + } + + words_mult = (words_x > words_y ? words_x : words_y); + + /* Result Z has to have room for double the larger factor */ + words_z = words_mult * 2; + + + /* If either factor is over 2048 bits, we can't use the standard hardware multiplier + (it assumes result is double longest factor, and result is max 4096 bits.) + + However, we can fail over to mod_mult for up to 4096 bits of result (modulo + multiplication doesn't have the same restriction, so result is simply the + number of bits in X plus number of bits in in Y.) + */ + if (words_mult * 32 > 2048) { + /* Calculate new length of Z */ + words_z = bits_to_hardware_words(bits_x + bits_y); + if (words_z * 32 > 4096) { + ESP_LOGE(TAG, "ERROR: %d bit result %d bits * %d bits too large for hardware unit\n", words_z * 32, bits_x, bits_y); + return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + } + else { + return mpi_mult_mpi_failover_mod_mult(Z, X, Y, words_z); + } + } + + /* Otherwise, we can use the (faster) multiply hardware unit */ + + esp_mpi_acquire_hardware(); + + /* Copy X (right-extended) & Y (left-extended) to memory block */ + mpi_to_mem_block(RSA_MEM_X_BLOCK_BASE, X, words_mult); + mpi_to_mem_block(RSA_MEM_Z_BLOCK_BASE + words_mult * 4, Y, words_mult); + /* NB: as Y is left-extended, we don't zero the bottom words_mult words of Y block. + This is OK for now because zeroing is done by hardware when we do esp_mpi_acquire_hardware(). + */ + + REG_WRITE(RSA_M_DASH_REG, 0); + + /* "mode" register loaded with number of 512-bit blocks in result, + plus 7 (for range 9-12). (this is ((N~ / 32) - 1) + 8)) + */ + REG_WRITE(RSA_MULT_MODE_REG, (words_z / 16) + 7); + + execute_op(RSA_MULT_START_REG); + + /* Read back the result */ + ret = mem_block_to_mpi(Z, RSA_MEM_Z_BLOCK_BASE, words_z); + + Z->s = X->s * Y->s; + + esp_mpi_release_hardware(); + + return ret; +} + +/* Special-case of mbedtls_mpi_mult_mpi(), where we use hardware montgomery mod + multiplication to calculate an mbedtls_mpi_mult_mpi result where either + A or B are >2048 bits so can't use the standard multiplication method. + + Result (A bits + B bits) must still be less than 4096 bits. + + This case is simpler than the general case modulo multiply of + esp_mpi_mul_mpi_mod() because we can control the other arguments: + + * Modulus is chosen with M=(2^num_bits - 1) (ie M=R-1), so output + isn't actually modulo anything. + * Mprime and Rinv are therefore predictable as follows: + Mprime = 1 + Rinv = 1 + + (See RSA Accelerator section in Technical Reference for more about Mprime, Rinv) +*/ +static int mpi_mult_mpi_failover_mod_mult(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, size_t num_words) +{ + int ret = 0; + + /* Load coefficients to hardware */ + esp_mpi_acquire_hardware(); + + /* M = 2^num_words - 1, so block is entirely FF */ + for(int i = 0; i < num_words; i++) { + REG_WRITE(RSA_MEM_M_BLOCK_BASE + i * 4, UINT32_MAX); + } + /* Mprime = 1 */ + REG_WRITE(RSA_M_DASH_REG, 1); + + /* "mode" register loaded with number of 512-bit blocks, minus 1 */ + REG_WRITE(RSA_MULT_MODE_REG, (num_words / 16) - 1); + + /* Load X */ + mpi_to_mem_block(RSA_MEM_X_BLOCK_BASE, X, num_words); + + /* Rinv = 1 */ + REG_WRITE(RSA_MEM_RB_BLOCK_BASE, 1); + for(int i = 1; i < num_words; i++) { + REG_WRITE(RSA_MEM_RB_BLOCK_BASE + i * 4, 0); + } + + execute_op(RSA_MULT_START_REG); + + /* finish the modular multiplication */ + MBEDTLS_MPI_CHK( modular_multiply_finish(Z, X, Y, num_words) ); + + esp_mpi_release_hardware(); + + cleanup: + return ret; +} + +#endif /* MBEDTLS_MPI_MUL_MPI_ALT */ diff --git a/components/mbedtls/port/include/aes_alt.h b/components/mbedtls/port/include/aes_alt.h index 7161b282c..d4da6ca87 100644 --- a/components/mbedtls/port/include/aes_alt.h +++ b/components/mbedtls/port/include/aes_alt.h @@ -20,7 +20,6 @@ * * */ - #ifndef AES_ALT_H #define AES_ALT_H @@ -56,4 +55,4 @@ typedef esp_aes_context mbedtls_aes_context; } #endif -#endif /* aes.h */ +#endif diff --git a/components/mbedtls/port/include/mbedtls/bignum.h b/components/mbedtls/port/include/mbedtls/bignum.h new file mode 100644 index 000000000..23cd56348 --- /dev/null +++ b/components/mbedtls/port/include/mbedtls/bignum.h @@ -0,0 +1,78 @@ +// Copyright 2015-2016 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_MBEDTLS_BIGNUM_H__ +#define __ESP_MBEDTLS_BIGNUM_H__ + +#include_next "mbedtls/bignum.h" + +/** + * This is a wrapper for the main mbedtls/bignum.h. This wrapper + * provides a few additional ESP32-only functions. + * + * This is because we don't set MBEDTLS_BIGNUM_ALT in the same way we + * do for AES, SHA, etc. Because we still use most of the bignum.h + * implementation and just replace a few hardware accelerated + * functions (see MBEDTLS_MPI_EXP_MOD_ALT & MBEDTLS_MPI_MUL_MPI_ALT in + * esp_config.h). + * + * @note Unlike the other hardware accelerator support functions in esp32/hwcrypto, there is no + * generic "hwcrypto/bignum.h" header for using these functions without mbedTLS. The reason for this + * is that all of the function implementations depend strongly upon the mbedTLS MPI implementation. + */ + +/** + * @brief Lock access to RSA Accelerator (MPI/bignum operations) + * + * RSA Accelerator hardware unit can only be used by one + * consumer at a time. + * + * @note This function is non-recursive (do not call it twice from the + * same task.) + * + * @note You do not need to call this if you are using the mbedTLS bignum.h + * API or esp_mpi_xxx functions. This function is only needed if you + * want to call ROM RSA functions or access the registers directly. + * + */ +void esp_mpi_acquire_hardware(void); + +/** + * @brief Unlock access to RSA Accelerator (MPI/bignum operations) + * + * Has to be called once for each call to esp_mpi_acquire_hardware(). + * + * @note You do not need to call this if you are using the mbedTLS bignum.h + * API or esp_mpi_xxx functions. This function is only needed if you + * want to call ROM RSA functions or access the registers directly. + */ +void esp_mpi_release_hardware(void); + +/* @brief MPI modular mupltiplication function + * + * Calculates Z = (X * Y) mod M using MPI hardware acceleration. + * + * This is not part of the standard mbedTLS bignum API. + * + * @note All of X, Y & Z should be less than 4096 bit long or an error is returned. + * + * @param Z Result bignum, should be pre-initialised with mbedtls_mpi_init(). + * @param X First multiplication argument. + * @param Y Second multiplication argument. + * @param M Modulus value for result. + * + * @return 0 on success, mbedTLS MPI error codes on failure. + */ +int esp_mpi_mul_mpi_mod(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M); + +#endif diff --git a/components/mbedtls/port/include/mbedtls/esp_config.h b/components/mbedtls/port/include/mbedtls/esp_config.h index 5a69ff78e..db87c6ef3 100644 --- a/components/mbedtls/port/include/mbedtls/esp_config.h +++ b/components/mbedtls/port/include/mbedtls/esp_config.h @@ -239,7 +239,9 @@ /* The following units have ESP32 hardware support, uncommenting each _ALT macro will use the hardware-accelerated implementation. */ +#ifdef CONFIG_MBEDTLS_HARDWARE_AES #define MBEDTLS_AES_ALT +#endif /* Currently hardware SHA does not work with TLS handshake, due to concurrency issue. Internal TW#7111. */ @@ -250,11 +252,11 @@ /* The following MPI (bignum) functions have ESP32 hardware support, Uncommenting these macros will use the hardware-accelerated implementations. - - Disabled as number of limbs limited by bug. Internal TW#7112. */ -//#define MBEDTLS_MPI_EXP_MOD_ALT -//#define MBEDTLS_MPI_MUL_MPI_ALT +#ifdef CONFIG_MBEDTLS_HARDWARE_MPI +#define MBEDTLS_MPI_EXP_MOD_ALT +#define MBEDTLS_MPI_MUL_MPI_ALT +#endif /** * \def MBEDTLS_MD2_PROCESS_ALT diff --git a/components/mbedtls/port/include/sha1_alt.h b/components/mbedtls/port/include/sha1_alt.h index 60297b9fb..f5e69b3f9 100644 --- a/components/mbedtls/port/include/sha1_alt.h +++ b/components/mbedtls/port/include/sha1_alt.h @@ -1,7 +1,16 @@ -/* - * copyright (c) 2010 - 2012 Espressif System - * - */ +// Copyright 2015-2016 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 _SHA1_ALT_H_ #define _SHA1_ALT_H_ diff --git a/components/mbedtls/port/include/sha256_alt.h b/components/mbedtls/port/include/sha256_alt.h index 6d9986b3a..143d8c75e 100644 --- a/components/mbedtls/port/include/sha256_alt.h +++ b/components/mbedtls/port/include/sha256_alt.h @@ -1,8 +1,16 @@ -/* - * copyright (c) 2010 - 2012 Espressif System - * - */ +// Copyright 2015-2016 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 _SHA256_ALT_H_ #define _SHA256_ALT_H_ @@ -30,4 +38,4 @@ typedef esp_sha_context mbedtls_sha256_context; } #endif -#endif /* sha256.h */ +#endif diff --git a/components/mbedtls/port/include/sha512_alt.h b/components/mbedtls/port/include/sha512_alt.h index 241f2be3b..8044b4275 100644 --- a/components/mbedtls/port/include/sha512_alt.h +++ b/components/mbedtls/port/include/sha512_alt.h @@ -1,9 +1,16 @@ -/* - * copyright (c) 2010 - 2012 Espressif System - * - * esf Link List Descriptor - */ +// Copyright 2015-2016 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 _SHA512_ALT_H_ #define _SHA512_ALT_H_ @@ -30,4 +37,4 @@ typedef esp_sha_context mbedtls_sha512_context; } #endif -#endif /* sha512.h */ +#endif diff --git a/components/mbedtls/test/component.mk b/components/mbedtls/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/mbedtls/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/mbedtls/test/test_mbedtls.c b/components/mbedtls/test/test_mbedtls.c new file mode 100644 index 000000000..797c107ef --- /dev/null +++ b/components/mbedtls/test/test_mbedtls.c @@ -0,0 +1,134 @@ +/* mbedTLS internal tests wrapped into Unity + + Focus on testing functionality where we use ESP32 hardware + accelerated crypto features. + + See also test_hwcrypto.c +*/ +#include +#include +#include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" +#include "mbedtls/sha512.h" +#include "mbedtls/aes.h" +#include "mbedtls/bignum.h" +#include "unity.h" + +static int mbedtls_alt_sha256_self_test( int verbose ); + +TEST_CASE("mbedtls SHA self-tests", "[mbedtls]") +{ + TEST_ASSERT_FALSE_MESSAGE(mbedtls_sha1_self_test(1), "SHA1 self-tests should pass."); + TEST_ASSERT_FALSE_MESSAGE(mbedtls_alt_sha256_self_test(1), "SHA256 self-tests should pass."); + TEST_ASSERT_FALSE_MESSAGE(mbedtls_sha512_self_test(1), "SHA512 self-tests should pass."); +} + +TEST_CASE("mbedtls AES self-tests", "[aes]") +{ + TEST_ASSERT_FALSE_MESSAGE(mbedtls_aes_self_test(1), "AES self-tests should pass."); +} + +TEST_CASE("mbedtls MPI self-tests", "[bignum]") +{ + TEST_ASSERT_FALSE_MESSAGE(mbedtls_mpi_self_test(1), "MPI self-tests should pass."); +} + + +/* Following code is a copy of the mbedtls_sha256 test vectors, + with the SHA-224 support removed as we don't currently support this hash. +*/ + +/* + * FIPS-180-2 test vectors + */ +static const unsigned char sha256_test_buf[3][57] = { + { "abc" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { "" } +}; + +static const int sha256_test_buflen[3] = { + 3, 56, 1000 +}; + +static const unsigned char sha256_test_sum[6][32] = { + /* + * SHA-256 test vectors + */ + { + 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, + 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, + 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, + 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD + }, + { + 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8, + 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39, + 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67, + 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 + }, + { + 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92, + 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67, + 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E, + 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 + } +}; + +/* + * Checkup routine + */ +static int mbedtls_alt_sha256_self_test( int verbose ) +{ + int j, n, buflen, ret = 0; + unsigned char buf[1024]; + unsigned char sha256sum[32]; + mbedtls_sha256_context ctx; + + for ( j = 0; j < 3; j++ ) { + mbedtls_sha256_init( &ctx ); + + if ( verbose != 0 ) { + printf( " SHA-%d test #%d: ", 256, j + 1 ); + } + + mbedtls_sha256_starts( &ctx, 0 ); + + if ( j == 2 ) { + memset( buf, 'a', buflen = 1000 ); + + for ( n = 0; n < 1000; n++ ) { + mbedtls_sha256_update( &ctx, buf, buflen ); + } + } else + mbedtls_sha256_update( &ctx, sha256_test_buf[j], + sha256_test_buflen[j] ); + + mbedtls_sha256_finish( &ctx, sha256sum ); + + if ( memcmp( sha256sum, sha256_test_sum[j], 32 ) != 0 ) { + if ( verbose != 0 ) { + printf( "failed\n" ); + } + + mbedtls_sha256_free( &ctx ); + + ret = 1; + goto exit; + } + + if ( verbose != 0 ) { + printf( "passed\n" ); + } + + mbedtls_sha256_free( &ctx ); + } + + if ( verbose != 0 ) { + printf( "\n" ); + } + +exit: + + return ( ret ); +} diff --git a/components/micro-ecc/component.mk b/components/micro-ecc/component.mk new file mode 100644 index 000000000..8c569df59 --- /dev/null +++ b/components/micro-ecc/component.mk @@ -0,0 +1,8 @@ +# only compile the micro-ecc/uECC.c source file +# (SRCDIRS is needed so build system can find the source file) +COMPONENT_SRCDIRS := micro-ecc +COMPONENT_OBJS := micro-ecc/uECC.o + +COMPONENT_ADD_INCLUDEDIRS := micro-ecc + +COMPONENT_SUBMODULES := micro-ecc diff --git a/components/micro-ecc/micro-ecc b/components/micro-ecc/micro-ecc new file mode 160000 index 000000000..14222e062 --- /dev/null +++ b/components/micro-ecc/micro-ecc @@ -0,0 +1 @@ +Subproject commit 14222e062d77f45321676e813d9525f32a88e8fa diff --git a/components/newlib/component.mk b/components/newlib/component.mk index 3731b5ef0..4f567242b 100644 --- a/components/newlib/component.mk +++ b/components/newlib/component.mk @@ -1,5 +1,4 @@ -COMPONENT_ADD_LDFLAGS := $(abspath lib/libc.a) $(abspath lib/libm.a) -lnewlib +COMPONENT_ADD_LDFLAGS := $(COMPONENT_PATH)/lib/libc.a $(COMPONENT_PATH)/lib/libm.a -lnewlib COMPONENT_ADD_INCLUDEDIRS := include platform_include -include $(IDF_PATH)/make/component_common.mk diff --git a/components/newlib/platform_include/esp_newlib.h b/components/newlib/platform_include/esp_newlib.h index 468f2ae34..eac354425 100644 --- a/components/newlib/platform_include/esp_newlib.h +++ b/components/newlib/platform_include/esp_newlib.h @@ -31,7 +31,13 @@ void esp_reent_init(struct _reent* r); * Called from the startup code, not intended to be called from application * code. */ -void esp_setup_syscalls(); +void esp_setup_syscall_table(); +/** + * Initialize hardware timer used as time source for newlib time functions. + * + * Called from the startup code, not intended to be called from application. + */ +void esp_setup_time_syscalls(); #endif //__ESP_NEWLIB_H__ diff --git a/components/newlib/syscall_table.c b/components/newlib/syscall_table.c index b6414af55..feed76817 100644 --- a/components/newlib/syscall_table.c +++ b/components/newlib/syscall_table.c @@ -24,6 +24,7 @@ #include #include "rom/libc_stubs.h" #include "esp_vfs.h" +#include "esp_newlib.h" static struct _reent s_reent; @@ -79,7 +80,7 @@ static struct syscall_stub_table s_stub_table = { ._scanf_float = &_scanf_float, }; -void esp_setup_syscalls() +void esp_setup_syscall_table() { syscall_table_ptr_pro = &s_stub_table; syscall_table_ptr_app = &s_stub_table; diff --git a/components/newlib/test/component.mk b/components/newlib/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/newlib/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/newlib/test/test_newlib.c b/components/newlib/test/test_newlib.c new file mode 100644 index 000000000..b498b4bd4 --- /dev/null +++ b/components/newlib/test/test_newlib.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include "unity.h" + + +TEST_CASE("test ctype functions", "[newlib]") +{ + TEST_ASSERT_TRUE( isalnum('a') && isalnum('A') && isalnum('z') && isalnum('Z') && isalnum('0') && isalnum('9') ); + TEST_ASSERT_FALSE( isalnum('(') || isalnum('-') || isalnum(' ') || isalnum('\x81') || isalnum('.') || isalnum('\\') ); + TEST_ASSERT_TRUE( isalpha('a') && isalpha('A') && isalpha('z') && isalpha('Z') ); + TEST_ASSERT_FALSE( isalpha('0') || isalpha('9') || isalpha(')') || isalpha('\t') || isalpha(' ') || isalpha('\x81') ); + TEST_ASSERT_TRUE( isspace(' ') && isspace('\t') && isspace('\n') && isspace('\r') ); + TEST_ASSERT_FALSE( isspace('0') || isspace('9') || isspace(')') || isspace('A') || isspace('*') || isspace('\x81') || isspace('a')); +} + +TEST_CASE("test atoX functions", "[newlib]") +{ + TEST_ASSERT_EQUAL_INT(-2147483648, atoi("-2147483648")); + TEST_ASSERT_EQUAL_INT(2147483647, atoi("2147483647")); + TEST_ASSERT_EQUAL_INT(42, atoi("000000042")); + TEST_ASSERT_EQUAL_INT(0, strtol("foo", NULL, 10)); +} + +TEST_CASE("test sprintf function", "[newlib]") +{ + char *res = NULL; + asprintf(&res, "%d %011i %lu %p %x %c %.4f\n", 42, 2147483647, 2147483648UL, (void *) 0x40010000, 0x40020000, 'Q', 1.0f / 137.0f); + TEST_ASSERT_NOT_NULL(res); + TEST_ASSERT_EQUAL_STRING(res, "42 02147483647 2147483648 0x40010000 40020000 Q 0.0073\n"); + free(res); +} + +TEST_CASE("test sscanf function", "[newlib]") +{ + const char *src = "42 02147483647 2147483648 0x40010000 40020000 Q 0.0073\n"; + int fourty_two; + int int_max; + unsigned long int_max_plus_one; + void *iram_ptr; + int irom_ptr; + char department; + float inv_fine_structure_constant; + int res = sscanf(src, "%d %d %lu %p %x %c %f", &fourty_two, &int_max, &int_max_plus_one, &iram_ptr, &irom_ptr, &department, &inv_fine_structure_constant); + TEST_ASSERT_EQUAL(7, res); + TEST_ASSERT_EQUAL(42, fourty_two); + TEST_ASSERT_EQUAL(2147483647, int_max); + TEST_ASSERT_EQUAL_UINT32(2147483648UL, int_max_plus_one); + TEST_ASSERT_EQUAL(0x40010000, iram_ptr); + TEST_ASSERT_EQUAL(0x40020000, irom_ptr); + TEST_ASSERT_EQUAL('Q', department); + TEST_ASSERT_TRUE(1.0f / inv_fine_structure_constant > 136 && 1.0f / inv_fine_structure_constant < 138); +} + +TEST_CASE("test time functions", "[newlib]") +{ + time_t now = 1464248488; + setenv("TZ", "UTC-8", 1); + struct tm *tm_utc = gmtime(&now); + TEST_ASSERT_EQUAL( 28, tm_utc->tm_sec); + TEST_ASSERT_EQUAL( 41, tm_utc->tm_min); + TEST_ASSERT_EQUAL( 7, tm_utc->tm_hour); + TEST_ASSERT_EQUAL( 26, tm_utc->tm_mday); + TEST_ASSERT_EQUAL( 4, tm_utc->tm_mon); + TEST_ASSERT_EQUAL(116, tm_utc->tm_year); + TEST_ASSERT_EQUAL( 4, tm_utc->tm_wday); + TEST_ASSERT_EQUAL(146, tm_utc->tm_yday); + + struct tm *tm_local = localtime(&now); + TEST_ASSERT_EQUAL( 28, tm_local->tm_sec); + TEST_ASSERT_EQUAL( 41, tm_local->tm_min); + TEST_ASSERT_EQUAL( 15, tm_local->tm_hour); + TEST_ASSERT_EQUAL( 26, tm_local->tm_mday); + TEST_ASSERT_EQUAL( 4, tm_local->tm_mon); + TEST_ASSERT_EQUAL(116, tm_local->tm_year); + TEST_ASSERT_EQUAL( 4, tm_local->tm_wday); + TEST_ASSERT_EQUAL(146, tm_local->tm_yday); + +} + + +static int checkFnRom(void *fn, char *name) +{ + int fnaddr = (int)fn; + printf("%s: 0X%x\n", name, fnaddr); + if ((fnaddr >= 0x40000000) && (fnaddr < 0x40070000)) { + return 1; + } else { + return 0; + } +} + + +TEST_CASE("check if ROM is used for functions", "[newlib]") +{ + TEST_ASSERT(checkFnRom(printf, "printf")); + TEST_ASSERT(checkFnRom(sscanf, "sscanf")); + TEST_ASSERT(checkFnRom(atoi, "atoi")); + TEST_ASSERT(checkFnRom(strtol, "strtol")); +} \ No newline at end of file diff --git a/components/newlib/time.c b/components/newlib/time.c index 021b29545..3426a01bf 100644 --- a/components/newlib/time.c +++ b/components/newlib/time.c @@ -14,22 +14,173 @@ #include #include +#include +#include #include #include #include #include +#include #include "esp_attr.h" +#include "soc/soc.h" +#include "soc/rtc_cntl_reg.h" +#include "soc/frc_timer_reg.h" +#include "rom/ets_sys.h" +#include "freertos/FreeRTOS.h" +#include "freertos/xtensa_api.h" +#include "freertos/task.h" +#include "sdkconfig.h" +#if defined( CONFIG_ESP32_TIME_SYSCALL_USE_RTC ) || defined( CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 ) +#define WITH_RTC 1 +#endif -clock_t _times_r(struct _reent *r, struct tms *ptms) +#if defined( CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 ) || defined( CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 ) +#define WITH_FRC1 1 +#endif + +#ifdef WITH_RTC +static uint64_t get_rtc_time_us() { - __errno_r(r) = ENOSYS; - return (clock_t) -1; + SET_PERI_REG_MASK(RTC_CNTL_TIME_UPDATE_REG, RTC_CNTL_TIME_UPDATE_M); + while (GET_PERI_REG_MASK(RTC_CNTL_TIME_UPDATE_REG, RTC_CNTL_TIME_VALID_M) == 0) { + ; + } + CLEAR_PERI_REG_MASK(RTC_CNTL_TIME_UPDATE_REG, RTC_CNTL_TIME_UPDATE_M); + uint64_t low = READ_PERI_REG(RTC_CNTL_TIME0_REG); + uint64_t high = READ_PERI_REG(RTC_CNTL_TIME1_REG); + uint64_t ticks = (high << 32) | low; + return ticks * 100 / (RTC_CTNL_SLOWCLK_FREQ / 10000); // scale RTC_CTNL_SLOWCLK_FREQ to avoid overflow +} +#endif // WITH_RTC + + +// s_boot_time: time from Epoch to the first boot time +#ifdef WITH_RTC +static RTC_DATA_ATTR struct timeval s_boot_time; +#elif defined(WITH_FRC1) +static struct timeval s_boot_time; +#endif + +#if defined(WITH_RTC) || defined(WITH_FRC1) +static _lock_t s_boot_time_lock; +#endif + +#ifdef WITH_FRC1 +#define FRC1_PRESCALER 16 +#define FRC1_PRESCALER_CTL 2 +#define FRC1_TICK_FREQ (APB_CLK_FREQ / FRC1_PRESCALER) +#define FRC1_TICKS_PER_US (FRC1_TICK_FREQ / 1000000) +#define FRC1_ISR_PERIOD_US (FRC_TIMER_LOAD_VALUE(0) / FRC1_TICKS_PER_US) +// Counter frequency will be APB_CLK_FREQ / 16 = 5 MHz +// 1 tick = 0.2 us +// Timer has 23 bit counter, so interrupt will fire each 1677721.6 microseconds. +// This is not a whole number, so timer will drift by 0.3 ppm due to rounding error. + +static volatile uint64_t s_microseconds = 0; + +static void IRAM_ATTR frc_timer_isr() +{ + WRITE_PERI_REG(FRC_TIMER_INT_REG(0), FRC_TIMER_INT_CLR); + s_microseconds += FRC1_ISR_PERIOD_US; } -// TODO: read time from RTC -int _gettimeofday_r(struct _reent *r, struct timeval *tv, void *tz) +#endif // WITH_FRC1 + +void esp_setup_time_syscalls() { +#if defined( WITH_FRC1 ) +#if defined( WITH_RTC ) + // initialize time from RTC clock + s_microseconds = get_rtc_time_us(); +#endif //WITH_RTC + + // set up timer + WRITE_PERI_REG(FRC_TIMER_CTRL_REG(0), \ + FRC_TIMER_AUTOLOAD | \ + (FRC1_PRESCALER_CTL << FRC_TIMER_PRESCALER_S) | \ + FRC_TIMER_EDGE_INT); + + WRITE_PERI_REG(FRC_TIMER_LOAD_REG(0), FRC_TIMER_LOAD_VALUE(0)); + SET_PERI_REG_MASK(FRC_TIMER_CTRL_REG(0), + FRC_TIMER_ENABLE | \ + FRC_TIMER_INT_ENABLE); + intr_matrix_set(xPortGetCoreID(), ETS_TIMER1_INTR_SOURCE, ETS_FRC1_INUM); + xt_set_interrupt_handler(ETS_FRC1_INUM, &frc_timer_isr, NULL); + xt_ints_on(1 << ETS_FRC1_INUM); +#endif // WITH_FRC1 +} + +clock_t IRAM_ATTR _times_r(struct _reent *r, struct tms *ptms) +{ + clock_t t = xTaskGetTickCount() * (portTICK_PERIOD_MS * CLK_TCK / 1000); + ptms->tms_cstime = 0; + ptms->tms_cutime = 0; + ptms->tms_stime = t; + ptms->tms_utime = 0; + struct timeval tv = {0, 0}; + _gettimeofday_r(r, &tv, NULL); + return (clock_t) tv.tv_sec; +} + +#if defined( WITH_FRC1 ) || defined( WITH_RTC ) +static uint64_t get_time_since_boot() +{ + uint64_t microseconds = 0; +#ifdef WITH_FRC1 + uint32_t timer_ticks_before = READ_PERI_REG(FRC_TIMER_COUNT_REG(0)); + microseconds = s_microseconds; + uint32_t timer_ticks_after = READ_PERI_REG(FRC_TIMER_COUNT_REG(0)); + if (timer_ticks_after > timer_ticks_before) { + // overflow happened at some point between getting + // timer_ticks_before and timer_ticks_after + // microseconds value is ambiguous, get a new one + microseconds = s_microseconds; + } + microseconds += (FRC_TIMER_LOAD_VALUE(0) - timer_ticks_after) / FRC1_TICKS_PER_US; +#elif defined(WITH_RTC) + microseconds = get_rtc_time_us(); +#endif + return microseconds; +} +#endif // defined( WITH_FRC1 ) || defined( WITH_RTC ) + +int IRAM_ATTR _gettimeofday_r(struct _reent *r, struct timeval *tv, void *tz) +{ + (void) tz; +#if defined( WITH_FRC1 ) || defined( WITH_RTC ) + uint64_t microseconds = get_time_since_boot(); + if (tv) { + _lock_acquire(&s_boot_time_lock); + microseconds += s_boot_time.tv_usec; + tv->tv_sec = s_boot_time.tv_sec + microseconds / 1000000; + tv->tv_usec = microseconds % 1000000; + _lock_release(&s_boot_time_lock); + } + return 0; +#else __errno_r(r) = ENOSYS; return -1; +#endif // defined( WITH_FRC1 ) || defined( WITH_RTC ) +} + +int settimeofday(const struct timeval *tv, const struct timezone *tz) +{ + (void) tz; +#if defined( WITH_FRC1 ) || defined( WITH_RTC ) + if (tv) { + _lock_acquire(&s_boot_time_lock); + uint64_t now = ((uint64_t) tv->tv_sec) * 1000000LL + tv->tv_usec; + uint64_t since_boot = get_time_since_boot(); + uint64_t boot_time = now - since_boot; + + s_boot_time.tv_sec = boot_time / 1000000; + s_boot_time.tv_usec = boot_time % 1000000; + _lock_release(&s_boot_time_lock); + } + return 0; +#else + errno = ENOSYS; + return -1; +#endif } diff --git a/components/nghttp/component.mk b/components/nghttp/component.mk index a4dca5cf7..d2cd0455f 100644 --- a/components/nghttp/component.mk +++ b/components/nghttp/component.mk @@ -5,5 +5,3 @@ COMPONENT_ADD_INCLUDEDIRS := port/include include COMPONENT_SRCDIRS := library port - -include $(IDF_PATH)/make/component_common.mk \ No newline at end of file diff --git a/components/nvs_flash/README.rst b/components/nvs_flash/README.rst index 2f1c46913..ade5518aa 100644 --- a/components/nvs_flash/README.rst +++ b/components/nvs_flash/README.rst @@ -7,14 +7,14 @@ Introduction Non-volatile storage (NVS) library is designed to store key-value pairs in flash. This sections introduces some concepts used by NVS. Underlying storage -~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^ Currently NVS uses a portion of main flash memory through ``spi_flash_{read|write|erase}`` APIs. The range of flash sectors to be used by the library is provided to ``nvs_flash_init`` function. Future versions of this library may add other storage backends to keep data in another flash chip (SPI or I2C), RTC, FRAM, etc. Keys and values -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ NVS operates on key-value pairs. Keys are ASCII strings, maximum key length is currently 15 characters. Values can have one of the following types: @@ -32,12 +32,12 @@ Keys are required to be unique. Writing a value for a key which already exists b Data type check is also performed when reading a value. An error is returned if data type of read operation doesn’t match the data type of the value. Namespaces -~~~~~~~~~~ +^^^^^^^^^^ To mitigate potential conflicts in key names between different components, NVS assigns each key-value pair to one of namespaces. Namespace names follow the same rules as key names, i.e. 15 character maximum length. Namespace name is specified in the ``nvs_open`` call. This call returns an opaque handle, which is used in subsequent calls to ``nvs_read_*``, ``nvs_write_*``, and ``nvs_commit`` functions. This way, handle is associated with a namespace, and key names will not collide with same names in other namespaces. Security, tampering, and robustness -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NVS library doesn't implement tamper prevention measures. It is possible for anyone with physical access to the flash chip to alter, erase, or add key-value pairs. @@ -59,12 +59,12 @@ Internals --------- Log of key-value pairs -~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^ NVS stores key-value pairs sequentially, with new key-value pairs being added at the end. When a value of any given key has to be updated, new key-value pair is added at the end of the log and old key-value pair is marked as erased. Pages and entries -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ NVS library uses two main entities in its operation: pages and entries. Page is a logical structure which stores a portion of the overall log. Logical page corresponds to one physical sector of flash memory. Pages which are in use have a *sequence number* associated with them. Sequence numbers impose an ordering on pages. Higher sequence numbers correspond to pages which were created later. Each page can be in one of the following states: @@ -101,7 +101,7 @@ Mapping from flash sectors to logical pages doesn't have any particular order. L +----------+ +----------+ +----------+ +----------+ Structure of a page -~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^ For now we assume that flash sector size is 4096 bytes and that ESP32 flash encryption hardware operates on 32-byte blocks. It is possible to introduce some settings configurable at compile-time (e.g. via menuconfig) to accommodate flash chips with different sector sizes (although it is not clear if other components in the system, e.g. SPI flash driver and SPI flash cache can support these other sizes). @@ -133,7 +133,7 @@ CRC32 value in header is calculated over the part which doesn't include state va The following sections describe structure of entry state bitmap and entry itself. Entry and entry state bitmap -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Each entry can be in one of the following three states. Each state is represented with two bits in the entry state bitmap. Final four bits in the bitmap (256 - 2 * 126) are unused. @@ -148,7 +148,7 @@ Erased (2'b00) Structure of entry -~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^ For values of primitive types (currently integers from 1 to 8 bytes long), entry holds one key-value pair. For string and blob types, entry holds part of the whole key-value pair. In case when a key-value pair spans multiple entries, all entries are stored in the same page. @@ -200,7 +200,7 @@ Variable length values (strings and blobs) are written into subsequent entries, Namespaces -~~~~~~~~~~ +^^^^^^^^^^ As mentioned above, each key-value pair belongs to one of the namespaces. Namespaces identifiers (strings) are stored as keys of key-value pairs in namespace with index 0. Values corresponding to these keys are indexes of these namespaces. @@ -218,10 +218,9 @@ As mentioned above, each key-value pair belongs to one of the namespaces. Namesp Item hash list -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ To reduce the number of reads performed from flash memory, each member of Page class maintains a list of pairs: (item index; item hash). This list makes searches much quicker. Instead of iterating over all entries, reading them from flash one at a time, ``Page::findItem`` first performs search for item hash in the hash list. This gives the item index within the page, if such an item exists. Due to a hash collision it is possible that a different item will be found. This is handled by falling back to iteration over items in flash. Each node in hash list contains a 24-bit hash and 8-bit item index. Hash is calculated based on item namespace and key name. CRC32 is used for calculation, result is truncated to 24 bits. To reduce overhead of storing 32-bit entries in a linked list, list is implemented as a doubly-linked list of arrays. Each array holds 29 entries, for the total size of 128 bytes, together with linked list pointers and 32-bit count field. Minimal amount of extra RAM useage per page is therefore 128 bytes, maximum is 640 bytes. - diff --git a/components/nvs_flash/component.mk b/components/nvs_flash/component.mk index 02ff8cf03..a905ca689 100755 --- a/components/nvs_flash/component.mk +++ b/components/nvs_flash/component.mk @@ -6,4 +6,3 @@ COMPONENT_ADD_INCLUDEDIRS := include COMPONENT_SRCDIRS := src -include $(IDF_PATH)/make/component_common.mk diff --git a/components/nvs_flash/include/nvs.h b/components/nvs_flash/include/nvs.h index 912ea2210..5f7a93a7b 100644 --- a/components/nvs_flash/include/nvs.h +++ b/components/nvs_flash/include/nvs.h @@ -28,23 +28,27 @@ extern "C" { */ typedef uint32_t nvs_handle; -#define ESP_ERR_NVS_BASE 0x1100 -#define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) -#define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) -#define ESP_ERR_NVS_TYPE_MISMATCH (ESP_ERR_NVS_BASE + 0x03) -#define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) -#define ESP_ERR_NVS_NOT_ENOUGH_SPACE (ESP_ERR_NVS_BASE + 0x05) -#define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) -#define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) -#define ESP_ERR_NVS_REMOVE_FAILED (ESP_ERR_NVS_BASE + 0x08) -#define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) -#define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) -#define ESP_ERR_NVS_INVALID_STATE (ESP_ERR_NVS_BASE + 0x0b) -#define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) +#define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */ +#define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE + 0x01) /*!< The storage driver is not initialized */ +#define ESP_ERR_NVS_NOT_FOUND (ESP_ERR_NVS_BASE + 0x02) /*!< Id namespace doesn’t exist yet and mode is NVS_READONLY */ +#define ESP_ERR_NVS_TYPE_MISMATCH (ESP_ERR_NVS_BASE + 0x03) /*!< TBA */ +#define ESP_ERR_NVS_READ_ONLY (ESP_ERR_NVS_BASE + 0x04) /*!< Storage handle was opened as read only */ +#define ESP_ERR_NVS_NOT_ENOUGH_SPACE (ESP_ERR_NVS_BASE + 0x05) /*!< There is not enough space in the underlying storage to save the value */ +#define ESP_ERR_NVS_INVALID_NAME (ESP_ERR_NVS_BASE + 0x06) /*!< Namespace name doesn’t satisfy constraints */ +#define ESP_ERR_NVS_INVALID_HANDLE (ESP_ERR_NVS_BASE + 0x07) /*!< Handle has been closed or is NULL */ +#define ESP_ERR_NVS_REMOVE_FAILED (ESP_ERR_NVS_BASE + 0x08) /*!< The value wasn’t updated because flash write operation has failed. The value was written however, and update will be finished after re-initialization of nvs, provided that flash operation doesn’t fail again. */ +#define ESP_ERR_NVS_KEY_TOO_LONG (ESP_ERR_NVS_BASE + 0x09) /*!< TBA */ +#define ESP_ERR_NVS_PAGE_FULL (ESP_ERR_NVS_BASE + 0x0a) /*!< TBA */ +#define ESP_ERR_NVS_INVALID_STATE (ESP_ERR_NVS_BASE + 0x0b) /*!< TBA */ +#define ESP_ERR_NVS_INVALID_LENGTH (ESP_ERR_NVS_BASE + 0x0c) /*!< TBA */ +/** + * @brief Mode of opening the non-volatile storage + * + */ typedef enum { - NVS_READONLY, - NVS_READWRITE + NVS_READONLY, /*!< Read only */ + NVS_READWRITE /*!< Read and write */ } nvs_open_mode; /** @@ -58,12 +62,13 @@ typedef enum { * underlying implementation, but is guaranteed to be * at least 16 characters. Shouldn't be empty. * @param[in] open_mode NVS_READWRITE or NVS_READONLY. If NVS_READONLY, will - * open a handle for reading only. All write requests will - * be rejected for this handle. + * open a handle for reading only. All write requests will + * be rejected for this handle. * @param[out] out_handle If successful (return code is zero), handle will be * returned in this argument. * - * @return - ESP_OK if storage handle was opened successfully + * @return + * - ESP_OK if storage handle was opened successfully * - ESP_ERR_NVS_NOT_INITIALIZED if the storage driver is not initialized * - ESP_ERR_NVS_NOT_FOUND id namespace doesn't exist yet and * mode is NVS_READONLY @@ -72,8 +77,9 @@ typedef enum { */ esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle *out_handle); +/**@{*/ /** - * @brief nvs_set_X - set value for given key + * @brief set value for given key * * This family of functions set value for the key, given its name. Note that * actual storage will not be updated until nvs_commit function is called. @@ -84,9 +90,9 @@ esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle *out_ha * implementation, but is guaranteed to be at least * 16 characters. Shouldn't be empty. * @param[in] value The value to set. - * @param[in] length For nvs_set_blob: length of binary value to set, in bytes. * - * @return - ESP_OK if value was set successfully + * @return + * - ESP_OK if value was set successfully * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints @@ -106,10 +112,39 @@ esp_err_t nvs_set_u32 (nvs_handle handle, const char* key, uint32_t value); esp_err_t nvs_set_i64 (nvs_handle handle, const char* key, int64_t value); esp_err_t nvs_set_u64 (nvs_handle handle, const char* key, uint64_t value); esp_err_t nvs_set_str (nvs_handle handle, const char* key, const char* value); -esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length); +/**@}*/ /** - * @brief nvs_get_X - get value for given key + * @brief set variable length binary value for given key + * + * This family of functions set value for the key, given its name. Note that + * actual storage will not be updated until nvs_commit function is called. + * + * @param[in] handle Handle obtained from nvs_open function. + * Handles that were opened read only cannot be used. + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 16 characters. Shouldn't be empty. + * @param[in] value The value to set. + * @param[in] length length of binary value to set, in bytes. + * + * @return + * - ESP_OK if value was set successfully + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_READ_ONLY if storage handle was opened as read only + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_NOT_ENOUGH_SPACE if there is not enough space in the + * underlying storage to save the value + * - ESP_ERR_NVS_REMOVE_FAILED if the value wasn't updated because flash + * write operation has failed. The value was written however, and + * update will be finished after re-initialization of nvs, provided that + * flash operation doesn't fail again. + */ +esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, size_t length); + +/**@{*/ +/** + * @brief get value for given key * * These functions retrieve value for the key, given its name. If key does not * exist, or the requested variable type doesn't match the type which was used @@ -119,34 +154,16 @@ esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, si * * All functions expect out_value to be a pointer to an already allocated variable * of the given type. - * Additionally, nvs_get_str and nvs_get_blob support WinAPI-style length queries. - * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob - * with zero out_value and non-zero pointer to length. Variable pointed to - * by length argument will be set to the required length. For nvs_get_str, - * this length includes the zero terminator. When calling nvs_get_str and - * nvs_get_blob with non-zero out_value, length has to be non-zero and has to - * point to the length available in out_value. - * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and - * nvs_get/set_blob used for arbitrary data structures. * - * Example of using nvs_get_i32: + * \code{c} + * // Example of using nvs_get_i32: * int32_t max_buffer_size = 4096; // default value * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size); * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND); * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still * // have its default value. * - * Example (without error checking) of using nvs_get_str to get a string into dynamic array: - * size_t required_size; - * nvs_get_str(my_handle, "server_name", NULL, &required_size); - * char* server_name = malloc(required_size); - * nvs_get_str(my_handle, "server_name", server_name, &required_size); - * - * Example (without error checking) of using nvs_get_blob to get a binary data - * into a static array: - * uint8_t mac_addr[6]; - * size_t size = sizeof(mac_addr); - * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size); + * \endcode * * @param[in] handle Handle obtained from nvs_open function. * @param[in] key Key name. Maximal length is determined by the underlying @@ -155,14 +172,9 @@ esp_err_t nvs_set_blob(nvs_handle handle, const char* key, const void* value, si * @param out_value Pointer to the output value. * May be NULL for nvs_get_str and nvs_get_blob, in this * case required length will be returned in length argument. - * @param[inout] length For nvs_get_str and nvs_get_blob, non-zero pointer - * to the variable holding the length of out_value. - * In case out_value a zero, will be set to the length - * required to hold the value. In case out_value is not - * zero, will be set to the actual length of the value - * written. For nvs_get_str this includes zero terminator. * - * @return - ESP_OK if the value was retrieved successfully + * @return + * - ESP_OK if the value was retrieved successfully * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints @@ -176,8 +188,68 @@ esp_err_t nvs_get_i32 (nvs_handle handle, const char* key, int32_t* out_value); esp_err_t nvs_get_u32 (nvs_handle handle, const char* key, uint32_t* out_value); esp_err_t nvs_get_i64 (nvs_handle handle, const char* key, int64_t* out_value); esp_err_t nvs_get_u64 (nvs_handle handle, const char* key, uint64_t* out_value); +/**@}*/ + +/** + * @brief get value for given key + * + * These functions retrieve value for the key, given its name. If key does not + * exist, or the requested variable type doesn't match the type which was used + * when setting a value, an error is returned. + * + * In case of any error, out_value is not modified. + * + * All functions expect out_value to be a pointer to an already allocated variable + * of the given type. + * + * nvs_get_str and nvs_get_blob functions support WinAPI-style length queries. + * To get the size necessary to store the value, call nvs_get_str or nvs_get_blob + * with zero out_value and non-zero pointer to length. Variable pointed to + * by length argument will be set to the required length. For nvs_get_str, + * this length includes the zero terminator. When calling nvs_get_str and + * nvs_get_blob with non-zero out_value, length has to be non-zero and has to + * point to the length available in out_value. + * It is suggested that nvs_get/set_str is used for zero-terminated C strings, and + * nvs_get/set_blob used for arbitrary data structures. + * + * \code{c} + * // Example (without error checking) of using nvs_get_str to get a string into dynamic array: + * size_t required_size; + * nvs_get_str(my_handle, "server_name", NULL, &required_size); + * char* server_name = malloc(required_size); + * nvs_get_str(my_handle, "server_name", server_name, &required_size); + * + * // Example (without error checking) of using nvs_get_blob to get a binary data + * into a static array: + * uint8_t mac_addr[6]; + * size_t size = sizeof(mac_addr); + * nvs_get_blob(my_handle, "dst_mac_addr", mac_addr, &size); + * \endcode + * + * @param[in] handle Handle obtained from nvs_open function. + * @param[in] key Key name. Maximal length is determined by the underlying + * implementation, but is guaranteed to be at least + * 16 characters. Shouldn't be empty. + * @param out_value Pointer to the output value. + * May be NULL for nvs_get_str and nvs_get_blob, in this + * case required length will be returned in length argument. + * @param[inout] length A non-zero pointer to the variable holding the length of out_value. + * In case out_value a zero, will be set to the length + * required to hold the value. In case out_value is not + * zero, will be set to the actual length of the value + * written. For nvs_get_str this includes zero terminator. + * + * @return + * - ESP_OK if the value was retrieved successfully + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_INVALID_NAME if key name doesn't satisfy constraints + * - ESP_ERR_NVS_INVALID_LENGTH if length is not sufficient to store data + */ +/**@{*/ esp_err_t nvs_get_str (nvs_handle handle, const char* key, char* out_value, size_t* length); esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size_t* length); +/**@}*/ /** * @brief Erase key-value pair with given key name. @@ -191,7 +263,8 @@ esp_err_t nvs_get_blob(nvs_handle handle, const char* key, void* out_value, size * implementation, but is guaranteed to be at least * 16 characters. Shouldn't be empty. * - * @return - ESP_OK if erase operation was successful + * @return + * - ESP_OK if erase operation was successful * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist @@ -207,7 +280,8 @@ esp_err_t nvs_erase_key(nvs_handle handle, const char* key); * @param[in] handle Storage handle obtained with nvs_open. * Handles that were opened read only cannot be used. * - * @return - ESP_OK if erase operation was successful + * @return + * - ESP_OK if erase operation was successful * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only * - other error codes from the underlying storage driver @@ -224,7 +298,8 @@ esp_err_t nvs_erase_all(nvs_handle handle); * @param[in] handle Storage handle obtained with nvs_open. * Handles that were opened read only cannot be used. * - * @return - ESP_OK if the changes have been written successfully + * @return + * - ESP_OK if the changes have been written successfully * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL * - other error codes from the underlying storage driver */ @@ -249,3 +324,4 @@ void nvs_close(nvs_handle handle); #endif #endif //ESP_NVS_H + diff --git a/components/nvs_flash/include/nvs_flash.h b/components/nvs_flash/include/nvs_flash.h index ce98f3940..0162a8f8a 100644 --- a/components/nvs_flash/include/nvs_flash.h +++ b/components/nvs_flash/include/nvs_flash.h @@ -18,25 +18,13 @@ extern "C" { #endif -/** Initialise NVS flash storage with default flash sector layout - - Temporarily, this region is hardcoded as a 12KB (0x3000 byte) - region starting at 24KB (0x6000 byte) offset in flash. -*/ +/** + * @brief Initialize NVS flash storage with layout given in the partition table. + * + * @return ESP_OK if storage was successfully initialized. + */ esp_err_t nvs_flash_init(void); -/** Initialise NVS flash storage with custom flash sector layout - - @param baseSector Flash sector (units of 4096 bytes) offset to start NVS. - @param sectorCount Length (in flash sectors) of NVS region. - - @return ESP_OK if flash was successfully initialised. - - @note Use this parameter if you're not using the options in menuconfig for - configuring flash layout & partition table. -*/ -esp_err_t nvs_flash_init_custom(uint32_t baseSector, uint32_t sectorCount); - #ifdef __cplusplus } diff --git a/components/nvs_flash/src/nvs_api.cpp b/components/nvs_flash/src/nvs_api.cpp index c1a910260..7c9ec89a6 100644 --- a/components/nvs_flash/src/nvs_api.cpp +++ b/components/nvs_flash/src/nvs_api.cpp @@ -16,6 +16,7 @@ #include "nvs_storage.hpp" #include "intrusive_list.h" #include "nvs_platform.hpp" +#include "esp_partition.h" #include "sdkconfig.h" #ifdef ESP_PLATFORM @@ -61,20 +62,32 @@ extern "C" void nvs_dump() s_nvs_storage.debugDump(); } -extern "C" esp_err_t nvs_flash_init(void) -{ - return nvs_flash_init_custom(6, 3); -} - extern "C" esp_err_t nvs_flash_init_custom(uint32_t baseSector, uint32_t sectorCount) { - Lock::init(); - Lock lock; - ESP_LOGD(TAG, "init start=%d count=%d", baseSector, sectorCount); + ESP_LOGD(TAG, "nvs_flash_init_custom start=%d count=%d", baseSector, sectorCount); s_nvs_handles.clear(); return s_nvs_storage.init(baseSector, sectorCount); } +#ifdef ESP_PLATFORM +extern "C" esp_err_t nvs_flash_init(void) +{ + Lock::init(); + Lock lock; + if (s_nvs_storage.isValid()) { + return ESP_OK; + } + const esp_partition_t* partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, NULL); + if (partition == NULL) { + return ESP_ERR_NOT_FOUND; + } + + return nvs_flash_init_custom(partition->address / SPI_FLASH_SEC_SIZE, + partition->size / SPI_FLASH_SEC_SIZE); +} +#endif + static esp_err_t nvs_find_ns_handle(nvs_handle handle, HandleEntry& entry) { auto it = find_if(begin(s_nvs_handles), end(s_nvs_handles), [=](HandleEntry& e) -> bool { diff --git a/components/nvs_flash/src/nvs_page.cpp b/components/nvs_flash/src/nvs_page.cpp index fae1f6f1b..80ccb1f6d 100644 --- a/components/nvs_flash/src/nvs_page.cpp +++ b/components/nvs_flash/src/nvs_page.cpp @@ -3,7 +3,7 @@ // 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 @@ -114,7 +114,30 @@ esp_err_t Page::writeEntryData(const uint8_t* data, size_t size) assert(mFirstUsedEntry != INVALID_ENTRY); const uint16_t count = size / ENTRY_SIZE; - auto rc = spi_flash_write(getEntryAddress(mNextFreeEntry), data, size); + const uint8_t* buf = data; + +#ifdef ESP_PLATFORM + /* On the ESP32, data can come from DROM, which is not accessible by spi_flash_write + * function. To work around this, we copy the data to heap if it came from DROM. + * Hopefully this won't happen very often in practice. For data from DRAM, we should + * still be able to write it to flash directly. + * TODO: figure out how to make this platform-specific check nicer (probably by introducing + * a platform-specific flash layer). + */ + if ((uint32_t) data < 0x3ff00000) { + buf = (uint8_t*) malloc(size); + if (!buf) { + return ESP_ERR_NO_MEM; + } + memcpy((void*)buf, data, size); + } +#endif //ESP_PLATFORM + auto rc = spi_flash_write(getEntryAddress(mNextFreeEntry), buf, size); +#ifdef ESP_PLATFORM + if (buf != data) { + free((void*)buf); + } +#endif //ESP_PLATFORM if (rc != ESP_OK) { mState = PageState::INVALID; return rc; @@ -131,8 +154,12 @@ esp_err_t Page::writeEntryData(const uint8_t* data, size_t size) esp_err_t Page::writeItem(uint8_t nsIndex, ItemType datatype, const char* key, const void* data, size_t dataSize) { Item item; - esp_err_t err; + + if (mState == PageState::INVALID) { + return ESP_ERR_NVS_INVALID_STATE; + } + if (mState == PageState::UNINITIALIZED) { err = initialize(); if (err != ESP_OK) { @@ -166,7 +193,6 @@ esp_err_t Page::writeItem(uint8_t nsIndex, ItemType datatype, const char* key, c } // write first item - size_t span = (totalSize + ENTRY_SIZE - 1) / ENTRY_SIZE; item = Item(nsIndex, datatype, span, key); mHashList.insert(item, mNextFreeEntry); @@ -215,6 +241,11 @@ esp_err_t Page::readItem(uint8_t nsIndex, ItemType datatype, const char* key, vo { size_t index = 0; Item item; + + if (mState == PageState::INVALID) { + return ESP_ERR_NVS_INVALID_STATE; + } + esp_err_t rc = findItem(nsIndex, datatype, key, index, item); if (rc != ESP_OK) { return rc; @@ -293,6 +324,8 @@ esp_err_t Page::eraseEntryAndSpan(size_t index) } if (item.calculateCrc32() != item.crc32) { rc = alterEntryState(index, EntryState::ERASED); + --mUsedEntryCount; + ++mErasedEntryCount; if (rc != ESP_OK) { return rc; } @@ -465,7 +498,9 @@ esp_err_t Page::mLoadEntryTable() if (end > ENTRY_COUNT) { end = ENTRY_COUNT; } - for (size_t i = 0; i < end; ++i) { + size_t span; + for (size_t i = 0; i < end; i += span) { + span = 1; if (mEntryTable.get(i) == EntryState::ERASED) { lastItemIndex = INVALID_ENTRY; continue; @@ -478,6 +513,11 @@ esp_err_t Page::mLoadEntryTable() mState = PageState::INVALID; return err; } + + mHashList.insert(item, i); + + // search for potential duplicate item + size_t duplicateIndex = mHashList.find(0, item); if (item.crc32 != item.calculateCrc32()) { err = eraseEntryAndSpan(i); @@ -488,25 +528,26 @@ esp_err_t Page::mLoadEntryTable() continue; } - mHashList.insert(item, i); - - if (item.datatype != ItemType::BLOB && item.datatype != ItemType::SZ) { - continue; - } - - size_t span = item.span; - bool needErase = false; - for (size_t j = i; j < i + span; ++j) { - if (mEntryTable.get(j) != EntryState::WRITTEN) { - needErase = true; - lastItemIndex = INVALID_ENTRY; - break; + + if (item.datatype == ItemType::BLOB || item.datatype == ItemType::SZ) { + span = item.span; + bool needErase = false; + for (size_t j = i; j < i + span; ++j) { + if (mEntryTable.get(j) != EntryState::WRITTEN) { + needErase = true; + lastItemIndex = INVALID_ENTRY; + break; + } + } + if (needErase) { + eraseEntryAndSpan(i); + continue; } } - if (needErase) { - eraseEntryAndSpan(i); + + if (duplicateIndex < i) { + eraseEntryAndSpan(duplicateIndex); } - i += span - 1; } // check that last item is not duplicate @@ -638,19 +679,20 @@ esp_err_t Page::findItem(uint8_t nsIndex, ItemType datatype, const char* key, si if (mState == PageState::CORRUPT || mState == PageState::INVALID || mState == PageState::UNINITIALIZED) { return ESP_ERR_NVS_NOT_FOUND; } - - if (itemIndex >= ENTRY_COUNT) { + + size_t findBeginIndex = itemIndex; + if (findBeginIndex >= ENTRY_COUNT) { return ESP_ERR_NVS_NOT_FOUND; } CachedFindInfo findInfo(nsIndex, datatype, key); if (mFindInfo == findInfo) { - itemIndex = mFindInfo.itemIndex(); + findBeginIndex = mFindInfo.itemIndex(); } size_t start = mFirstUsedEntry; - if (itemIndex > mFirstUsedEntry && itemIndex < ENTRY_COUNT) { - start = itemIndex; + if (findBeginIndex > mFirstUsedEntry && findBeginIndex < ENTRY_COUNT) { + start = findBeginIndex; } size_t end = mNextFreeEntry; @@ -785,8 +827,12 @@ void Page::debugDump() const Item item; readEntry(i, item); if (skip == 0) { - printf("W ns=%2u type=%2u span=%3u key=\"%s\"\n", item.nsIndex, static_cast(item.datatype), item.span, item.key); - skip = item.span - 1; + printf("W ns=%2u type=%2u span=%3u key=\"%s\" len=%d\n", item.nsIndex, static_cast(item.datatype), item.span, item.key, (item.span != 1)?((int)item.varLength.dataSize):-1); + if (item.span > 0 && item.span <= ENTRY_COUNT - i) { + skip = item.span - 1; + } else { + skip = 0; + } } else { printf("D\n"); skip--; diff --git a/components/nvs_flash/src/nvs_platform.hpp b/components/nvs_flash/src/nvs_platform.hpp index 374dbca6c..0973c4875 100644 --- a/components/nvs_flash/src/nvs_platform.hpp +++ b/components/nvs_flash/src/nvs_platform.hpp @@ -16,9 +16,6 @@ #ifdef ESP_PLATFORM -#define NVS_DEBUGV(...) ets_printf(__VA_ARGS__) - -#include "rom/ets_sys.h" #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" @@ -30,19 +27,23 @@ class Lock public: Lock() { - assert(mSemaphore); - xSemaphoreTake(mSemaphore, portMAX_DELAY); + if (mSemaphore) { + xSemaphoreTake(mSemaphore, portMAX_DELAY); + } } ~Lock() { - assert(mSemaphore); - xSemaphoreGive(mSemaphore); + if (mSemaphore) { + xSemaphoreGive(mSemaphore); + } } static esp_err_t init() { - assert(mSemaphore == nullptr); + if (mSemaphore) { + return ESP_OK; + } mSemaphore = xSemaphoreCreateMutex(); if (!mSemaphore) { return ESP_ERR_NO_MEM; @@ -52,7 +53,9 @@ public: static void uninit() { - vSemaphoreDelete(mSemaphore); + if (mSemaphore) { + vSemaphoreDelete(mSemaphore); + } mSemaphore = nullptr; } diff --git a/components/nvs_flash/src/nvs_storage.cpp b/components/nvs_flash/src/nvs_storage.cpp index eb90cac5b..f8da28fa2 100644 --- a/components/nvs_flash/src/nvs_storage.cpp +++ b/components/nvs_flash/src/nvs_storage.cpp @@ -69,10 +69,15 @@ esp_err_t Storage::init(uint32_t baseSector, uint32_t sectorCount) return ESP_OK; } +bool Storage::isValid() const +{ + return mState == StorageState::ACTIVE; +} + esp_err_t Storage::findItem(uint8_t nsIndex, ItemType datatype, const char* key, Page* &page, Item& item) { - size_t itemIndex = 0; for (auto it = std::begin(mPageManager); it != std::end(mPageManager); ++it) { + size_t itemIndex = 0; auto err = it->findItem(nsIndex, datatype, key, itemIndex, item); if (err == ESP_OK) { page = it; diff --git a/components/nvs_flash/src/nvs_storage.hpp b/components/nvs_flash/src/nvs_storage.hpp index f8cee9f2a..ecf2651ae 100644 --- a/components/nvs_flash/src/nvs_storage.hpp +++ b/components/nvs_flash/src/nvs_storage.hpp @@ -47,6 +47,8 @@ public: esp_err_t init(uint32_t baseSector, uint32_t sectorCount); + bool isValid() const; + esp_err_t createOrOpenNamespace(const char* nsName, bool canCreate, uint8_t& nsIndex); esp_err_t writeItem(uint8_t nsIndex, ItemType datatype, const char* key, const void* data, size_t dataSize); diff --git a/components/nvs_flash/src/nvs_test_api.h b/components/nvs_flash/src/nvs_test_api.h new file mode 100644 index 000000000..97940092d --- /dev/null +++ b/components/nvs_flash/src/nvs_test_api.h @@ -0,0 +1,47 @@ +// Copyright 2015-2016 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. + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nvs_flash.h" + +/** + * @brief Initialize NVS flash storage with custom flash sector layout + * + * @note This API is intended to be used in unit tests. + * + * @param baseSector Flash sector (units of 4096 bytes) offset to start NVS + * @param sectorCount Length (in flash sectors) of NVS region. + NVS partition must be at least 3 sectors long. + * @return ESP_OK if flash was successfully initialized + */ +esp_err_t nvs_flash_init_custom(uint32_t baseSector, uint32_t sectorCount); + + +/** + * @brief Dump contents of NVS storage to stdout + * + * This function may be used for debugging purposes to inspect the state + * of NVS pages. For each page, list of entries is also dumped. + */ +void nvs_dump(void); + + +#ifdef __cplusplus +} +#endif diff --git a/components/nvs_flash/test/component.mk b/components/nvs_flash/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/nvs_flash/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/nvs_flash/test/test_nvs.c b/components/nvs_flash/test/test_nvs.c new file mode 100644 index 000000000..db97879bc --- /dev/null +++ b/components/nvs_flash/test/test_nvs.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include "unity.h" +#include "nvs.h" +#include "nvs_flash.h" +#include "esp_spi_flash.h" +#include + + +TEST_CASE("various nvs tests", "[nvs]") +{ + nvs_handle handle_1; + TEST_ESP_OK(nvs_flash_init()); + TEST_ESP_ERR(nvs_open("test_namespace1", NVS_READONLY, &handle_1), ESP_ERR_NVS_NOT_FOUND); + + TEST_ESP_ERR(nvs_set_i32(handle_1, "foo", 0x12345678), ESP_ERR_NVS_INVALID_HANDLE); + nvs_close(handle_1); + + TEST_ESP_OK(nvs_open("test_namespace2", NVS_READWRITE, &handle_1)); + TEST_ESP_OK(nvs_erase_all(handle_1)); + TEST_ESP_OK(nvs_set_i32(handle_1, "foo", 0x12345678)); + TEST_ESP_OK(nvs_set_i32(handle_1, "foo", 0x23456789)); + + nvs_handle handle_2; + TEST_ESP_OK(nvs_open("test_namespace3", NVS_READWRITE, &handle_2)); + TEST_ESP_OK(nvs_erase_all(handle_2)); + TEST_ESP_OK(nvs_set_i32(handle_2, "foo", 0x3456789a)); + const char* str = "value 0123456789abcdef0123456789abcdef"; + TEST_ESP_OK(nvs_set_str(handle_2, "key", str)); + + int32_t v1; + TEST_ESP_OK(nvs_get_i32(handle_1, "foo", &v1)); + TEST_ASSERT_EQUAL_INT32(0x23456789, v1); + + int32_t v2; + TEST_ESP_OK(nvs_get_i32(handle_2, "foo", &v2)); + TEST_ASSERT_EQUAL_INT32(0x3456789a, v2); + + char buf[strlen(str) + 1]; + size_t buf_len = sizeof(buf); + + TEST_ESP_OK(nvs_get_str(handle_2, "key", buf, &buf_len)); + + TEST_ASSERT_EQUAL_INT32(0, strcmp(buf, str)); + + nvs_close(handle_1); + nvs_close(handle_2); +} diff --git a/components/nvs_flash/test/Makefile b/components/nvs_flash/test_nvs_host/Makefile similarity index 100% rename from components/nvs_flash/test/Makefile rename to components/nvs_flash/test_nvs_host/Makefile diff --git a/components/nvs_flash/test/catch.hpp b/components/nvs_flash/test_nvs_host/catch.hpp similarity index 100% rename from components/nvs_flash/test/catch.hpp rename to components/nvs_flash/test_nvs_host/catch.hpp diff --git a/components/nvs_flash/test_nvs_host/crc.cpp b/components/nvs_flash/test_nvs_host/crc.cpp new file mode 100644 index 000000000..4cbb9be9e --- /dev/null +++ b/components/nvs_flash/test_nvs_host/crc.cpp @@ -0,0 +1,64 @@ +// Copyright 2015-2016 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. +#include +#include + +static const unsigned int crc32_le_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, + 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, + 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, + 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, + 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, + 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, + 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, + 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, + 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, + 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, + 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, + 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, + 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, + + 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, + 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, + 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, + 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, + 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, + 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, + 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, + 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, + 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, + 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, + 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, + 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, + 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL +}; + + + +extern "C" unsigned int crc32_le(unsigned int crc, unsigned char const * buf,unsigned int len) +{ + unsigned int i; + crc = ~crc; + for(i=0;i>8); + } + return ~crc; +} + diff --git a/components/nvs_flash/test/crc.h b/components/nvs_flash/test_nvs_host/crc.h similarity index 100% rename from components/nvs_flash/test/crc.h rename to components/nvs_flash/test_nvs_host/crc.h diff --git a/components/nvs_flash/test/main.cpp b/components/nvs_flash/test_nvs_host/main.cpp similarity index 100% rename from components/nvs_flash/test/main.cpp rename to components/nvs_flash/test_nvs_host/main.cpp diff --git a/components/nvs_flash/test_nvs_host/sdkconfig.h b/components/nvs_flash/test_nvs_host/sdkconfig.h new file mode 100644 index 000000000..e69de29bb diff --git a/components/nvs_flash/test/spi_flash_emulation.cpp b/components/nvs_flash/test_nvs_host/spi_flash_emulation.cpp similarity index 100% rename from components/nvs_flash/test/spi_flash_emulation.cpp rename to components/nvs_flash/test_nvs_host/spi_flash_emulation.cpp diff --git a/components/nvs_flash/test/spi_flash_emulation.h b/components/nvs_flash/test_nvs_host/spi_flash_emulation.h similarity index 90% rename from components/nvs_flash/test/spi_flash_emulation.h rename to components/nvs_flash/test_nvs_host/spi_flash_emulation.h index ba50c4f9e..14e56bab6 100644 --- a/components/nvs_flash/test/spi_flash_emulation.h +++ b/components/nvs_flash/test_nvs_host/spi_flash_emulation.h @@ -74,11 +74,11 @@ public: return false; } - if (mFailCountdown != SIZE_MAX && mFailCountdown-- == 0) { - return false; - } - for (size_t i = 0; i < size / 4; ++i) { + if (mFailCountdown != SIZE_MAX && mFailCountdown-- == 0) { + return false; + } + uint32_t sv = src[i]; size_t pos = dstAddr / 4 + i; uint32_t& dv = mData[pos]; @@ -141,6 +141,18 @@ public: { return reinterpret_cast(mData.data()); } + + void load(const char* filename) + { + FILE* f = fopen(filename, "rb"); + fseek(f, 0, SEEK_END); + off_t size = ftell(f); + assert(size % SPI_FLASH_SEC_SIZE == 0); + mData.resize(size); + fseek(f, 0, SEEK_SET); + auto s = fread(mData.data(), SPI_FLASH_SEC_SIZE, size / SPI_FLASH_SEC_SIZE, f); + assert(s == static_cast(size / SPI_FLASH_SEC_SIZE)); + } void clearStats() { diff --git a/components/nvs_flash/test/test_compressed_enum_table.cpp b/components/nvs_flash/test_nvs_host/test_compressed_enum_table.cpp similarity index 100% rename from components/nvs_flash/test/test_compressed_enum_table.cpp rename to components/nvs_flash/test_nvs_host/test_compressed_enum_table.cpp diff --git a/components/nvs_flash/test/test_intrusive_list.cpp b/components/nvs_flash/test_nvs_host/test_intrusive_list.cpp similarity index 100% rename from components/nvs_flash/test/test_intrusive_list.cpp rename to components/nvs_flash/test_nvs_host/test_intrusive_list.cpp diff --git a/components/nvs_flash/test/test_nvs.cpp b/components/nvs_flash/test_nvs_host/test_nvs.cpp similarity index 85% rename from components/nvs_flash/test/test_nvs.cpp rename to components/nvs_flash/test_nvs_host/test_nvs.cpp index ce552578d..282d4de48 100644 --- a/components/nvs_flash/test/test_nvs.cpp +++ b/components/nvs_flash/test_nvs_host/test_nvs.cpp @@ -13,7 +13,7 @@ // limitations under the License. #include "catch.hpp" #include "nvs.hpp" -#include "nvs_flash.h" +#include "nvs_test_api.h" #include "spi_flash_emulation.h" #include #include @@ -300,6 +300,27 @@ TEST_CASE("storage doesn't add duplicates within multiple pages", "[nvs]") CHECK(page.findItem(1, itemTypeOf(), "bar") == ESP_OK); } +TEST_CASE("storage can find items on second page if first is not fully written and has cached search data", "[nvs]") +{ + SpiFlashEmulator emu(3); + Storage storage; + CHECK(storage.init(0, 3) == ESP_OK); + int bar = 0; + uint8_t bigdata[100 * 32] = {0}; + // write one big chunk of data + ESP_ERROR_CHECK(storage.writeItem(0, ItemType::BLOB, "first", bigdata, sizeof(bigdata))); + + // write second one; it will not fit into the first page + ESP_ERROR_CHECK(storage.writeItem(0, ItemType::BLOB, "second", bigdata, sizeof(bigdata))); + + size_t size; + ESP_ERROR_CHECK(storage.getItemDataSize(0, ItemType::BLOB, "first", size)); + CHECK(size == sizeof(bigdata)); + ESP_ERROR_CHECK(storage.getItemDataSize(0, ItemType::BLOB, "second", size)); + CHECK(size == sizeof(bigdata)); +} + + TEST_CASE("can write and read variable length data lots of times", "[nvs]") { SpiFlashEmulator emu(8); @@ -894,7 +915,7 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey size_t totalOps = 0; int lastPercent = -1; - for (uint32_t errDelay = 4; ; ++errDelay) { + for (uint32_t errDelay = 0; ; ++errDelay) { INFO(errDelay); emu.randomize(seed); emu.clearStats(); @@ -903,23 +924,25 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey if (totalOps != 0) { int percent = errDelay * 100 / totalOps; - if (percent != lastPercent) { + if (percent > lastPercent) { printf("%d/%d (%d%%)\r\n", errDelay, static_cast(totalOps), percent); lastPercent = percent; } } - TEST_ESP_OK(nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN)); nvs_handle handle; - TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle)); - size_t count = iter_count; - if(test.doRandomThings(handle, gen, count) != ESP_ERR_FLASH_OP_FAIL) { - nvs_close(handle); - break; + + if (nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN) == ESP_OK) { + if (nvs_open("namespace1", NVS_READWRITE, &handle) == ESP_OK) { + if(test.doRandomThings(handle, gen, count) != ESP_ERR_FLASH_OP_FAIL) { + nvs_close(handle); + break; + } + nvs_close(handle); + } } - nvs_close(handle); TEST_ESP_OK(nvs_flash_init_custom(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR_COUNT_MIN)); TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle)); @@ -929,7 +952,7 @@ TEST_CASE("test recovery from sudden poweroff", "[.][long][nvs][recovery][monkey CHECK(0); } nvs_close(handle); - totalOps = emu.getEraseOps() + emu.getWriteOps(); + totalOps = emu.getEraseOps() + emu.getWriteBytes() / 4; } } @@ -951,6 +974,141 @@ TEST_CASE("test for memory leaks in open/set", "[leaks]") } } +TEST_CASE("duplicate items are removed", "[nvs][dupes]") +{ + SpiFlashEmulator emu(3); + { + // create one item + nvs::Page p; + p.load(0); + p.writeItem(1, "opmode", 3); + } + { + // add another two without deleting the first one + nvs::Item item(1, ItemType::U8, 1, "opmode"); + item.data[0] = 2; + item.crc32 = item.calculateCrc32(); + emu.write(3 * 32, reinterpret_cast(&item), sizeof(item)); + emu.write(4 * 32, reinterpret_cast(&item), sizeof(item)); + uint32_t mask = 0xFFFFFFEA; + emu.write(32, &mask, 4); + } + { + // load page and check that second item persists + nvs::Storage s; + s.init(0, 3); + uint8_t val; + ESP_ERROR_CHECK(s.readItem(1, "opmode", val)); + CHECK(val == 2); + } + { + Page p; + p.load(0); + CHECK(p.getErasedEntryCount() == 2); + CHECK(p.getUsedEntryCount() == 1); + } +} + +TEST_CASE("recovery after failure to write data", "[nvs]") +{ + SpiFlashEmulator emu(3); + const char str[] = "value 0123456789abcdef012345678value 0123456789abcdef012345678"; + + // make flash write fail exactly in Page::writeEntryData + emu.failAfter(17); + { + Storage storage; + TEST_ESP_OK(storage.init(0, 3)); + + TEST_ESP_ERR(storage.writeItem(1, ItemType::SZ, "key", str, strlen(str)), ESP_ERR_FLASH_OP_FAIL); + + // check that repeated operations cause an error + TEST_ESP_ERR(storage.writeItem(1, ItemType::SZ, "key", str, strlen(str)), ESP_ERR_NVS_INVALID_STATE); + + uint8_t val; + TEST_ESP_ERR(storage.readItem(1, ItemType::U8, "key", &val, sizeof(val)), ESP_ERR_NVS_NOT_FOUND); + } + { + // load page and check that data was erased + Page p; + p.load(0); + CHECK(p.getErasedEntryCount() == 3); + CHECK(p.getUsedEntryCount() == 0); + + // try to write again + TEST_ESP_OK(p.writeItem(1, ItemType::SZ, "key", str, strlen(str))); + } +} + +TEST_CASE("crc error in variable length item is handled", "[nvs]") +{ + SpiFlashEmulator emu(3); + const uint64_t before_val = 0xbef04e; + const uint64_t after_val = 0xaf7e4; + // write some data + { + Page p; + p.load(0); + TEST_ESP_OK(p.writeItem(0, "before", before_val)); + const char* str = "foobar"; + TEST_ESP_OK(p.writeItem(0, ItemType::SZ, "key", str, strlen(str))); + TEST_ESP_OK(p.writeItem(0, "after", after_val)); + } + // corrupt some data + uint32_t w; + CHECK(emu.read(&w, 32 * 3 + 8, sizeof(w))); + w &= 0xf000000f; + CHECK(emu.write(32 * 3 + 8, &w, sizeof(w))); + // load and check + { + Page p; + p.load(0); + CHECK(p.getUsedEntryCount() == 2); + CHECK(p.getErasedEntryCount() == 2); + + uint64_t val; + TEST_ESP_OK(p.readItem(0, "before", val)); + CHECK(val == before_val); + TEST_ESP_ERR(p.findItem(0, ItemType::SZ, "key"), ESP_ERR_NVS_NOT_FOUND); + TEST_ESP_OK(p.readItem(0, "after", val)); + CHECK(val == after_val); + } +} + + +TEST_CASE("read/write failure (TW8406)", "[nvs]") +{ + SpiFlashEmulator emu(3); + nvs_flash_init_custom(0, 3); + for (int attempts = 0; attempts < 3; ++attempts) { + int i = 0; + nvs_handle light_handle = 0; + char key[15] = {0}; + char data[76] = {12, 13, 14, 15, 16}; + uint8_t number = 20; + size_t data_len = sizeof(data); + + ESP_ERROR_CHECK(nvs_open("LIGHT", NVS_READWRITE, &light_handle)); + ESP_ERROR_CHECK(nvs_set_u8(light_handle, "RecordNum", number)); + for (i = 0; i < number; ++i) { + sprintf(key, "light%d", i); + ESP_ERROR_CHECK(nvs_set_blob(light_handle, key, data, sizeof(data))); + } + nvs_commit(light_handle); + + uint8_t get_number = 0; + ESP_ERROR_CHECK(nvs_get_u8(light_handle, "RecordNum", &get_number)); + REQUIRE(number == get_number); + for (i = 0; i < number; ++i) { + char data[76] = {0}; + sprintf(key, "light%d", i); + ESP_ERROR_CHECK(nvs_get_blob(light_handle, key, data, &data_len)); + } + nvs_close(light_handle); + } +} + + TEST_CASE("dump all performance data", "[nvs]") { std::cout << "====================" << std::endl << "Dumping benchmarks" << std::endl; diff --git a/components/nvs_flash/test/test_spi_flash_emulation.cpp b/components/nvs_flash/test_nvs_host/test_spi_flash_emulation.cpp similarity index 100% rename from components/nvs_flash/test/test_spi_flash_emulation.cpp rename to components/nvs_flash/test_nvs_host/test_spi_flash_emulation.cpp diff --git a/components/openssl/OpenSSL-APIs.rst b/components/openssl/OpenSSL-APIs.rst new file mode 100644 index 000000000..93e438dcf --- /dev/null +++ b/components/openssl/OpenSSL-APIs.rst @@ -0,0 +1,1797 @@ +OpenSSL-APIs +------------ + +This directory does not contain OpenSSL itself, but the code here can be used as a wrapper for applications using the OpenSSL API. +It uses mbedTLS to do the actual work, so anyone compiling openssl code needs the mbedtls library and header file. + +OpenSSL APIs not mentioned in this article are not open to public for the time, +also do not have the corresponding function. +If user calls it directly, it will always return an error or may show cannot link at compiling time. + +Chapter Introduction +==================== + +- Chapter 1. SSL Context Method Create +- Chapter 2. SSL Context Fucntion +- Chapter 3. SSL Fucntion +- Chapter 4. SSL X509 Certification and Private Key Function + + +Chapter 1. SSL Context Method Create +==================================== + +1.1 const SSL_METHOD* ``SSLv3_client_method`` (void) + + Arguments:: + + none + + Return:: + + SSLV3.0 version SSL context client method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = SSLv3_client_method(); + + ... + } + +1.2 const SSL_METHOD* ``TLSv1_client_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.0 version SSL context client method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_client_method(); + + ... + } + +1.3 const SSL_METHOD* ``TLSv1_1_client_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.1 version SSL context client method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_1_client_method(); + + ... + } + +1.4 const SSL_METHOD* ``TLSv1_2_client_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.2 version SSL context client method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_2_client_method(); + + ... + } + +1.5 const SSL_METHOD* ``TLS_client_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.2 version SSL context client method point + + Description:: + + create the default SSL context method, it's always to be TLSV1.2 + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_2_client_method(); + + ... + } + +1.6 const SSL_METHOD* ``SSLv3_server_method`` (void) + + Arguments:: + + none + + Return:: + + SSLV3.0 version SSL context server method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = SSLv3_server_method(); + + ... + } + +1.7 const SSL_METHOD* ``TLSv1_server_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.0 version SSL context server method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_server_method(); + + ... + } + +1.8 const SSL_METHOD* ``TLSv1_1_server_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.1 version SSL context server method point + + Description:: + + create the target SSL context method + + Example : + + void example(void) + { + const SSL_METHOD *method = TLSv1_1_server_method(); + + ... + } + + +1.9 const SSL_METHOD* ``TLSv1_2_server_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.2 version SSL context server method point + + Description:: + + create the target SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_2_server_method(); + + ... + } + +1.10 const SSL_METHOD* ``TLS_server_method`` (void) + + Arguments:: + + none + + Return:: + + TLSV1.2 version SSL context server method point + + Description:: + + create the default SSL context method, it's always to be TLSV1.2 + + Example:: + + void example(void) + { + const SSL_METHOD *method = TLSv1_2_server_method(); + + ... + } + + +Chapter 2. SSL Context Fucntion +=============================== + + +2.1 SSL_CTX* ``SSL_CTX_new`` (const SSL_METHOD *method) + + Arguments:: + + method - the SSL context method point + + Return:: + + context point + + Description:: + + create a SSL context + + Example:: + + void example(void) + { + SSL_CTX *ctx = SSL_CTX_new(SSLv3_server_method()); + + ... + } + + +2.2 ``void SSL_CTX_free`` (SSL_CTX *ctx) + + Arguments:: + + ctx - the SSL context point + + Return:: + + none + + Description:: + + free a SSL context + + Example:: + + void example(void) + { + SSL_CTX *ctx; + + ... ... + + SSL_CTX_free(ctx); + } + + +2.3 ``int SSL_CTX_set_ssl_version`` (SSL_CTX *ctx, const SSL_METHOD *meth) + + Arguments:: + + ctx - SSL context point + meth - SSL method point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + set the SSL context version + + Example:: + + void example(void) + { + SSL_CTX *ctx; + const SSL_METHOD *meth; + + ... ... + + SSL_CTX_set_ssl_version(ctx, meth); + } + + +2.4 const SSL_METHOD* ``SSL_CTX_get_ssl_method`` (SSL_CTX *ctx) + + Arguments:: + + ctx - SSL context point + + Return:: + + SSL context method + + Description:: + + get the SSL context method + + Example:: + + void example(void) + { + const SSL_METHOD *method; + SSL_CTX *ctx; + + ... ... + + method = SSL_CTX_get_ssl_method(ctx); + } + + + +Chapter 3. SSL Fucntion +======================= + + +3.1 SSL* ``SSL_new`` (SSL_CTX *ctx) + + Arguments:: + + ctx - SSL context point + + Return:: + + SSL method + + Description:: + + create a SSL + + Example:: + + void example(void) + { + SSL *ssl; + SSL_CTX *ctx; + + ... ... + + ssl = SSL_new(ctx); + } + + +3.2 void ``SSL_free`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + none + + Description:: + + free SSL + + Example:: + + void example(void) + { + SSL *ssl; + + ... ... + + SSL_free(ssl); + } + + +3.3 int ``SSL_do_handshake`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : OK + 0 : failed, connect is close by remote + -1 : a error catch + + Description:: + + perform the SSL handshake + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_do_handshake(ssl); + } + + +3.4 int ``SSL_connect`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : OK + 0 : failed, connect is close by remote + -1 : a error catch + + Description:: + + connect to the remote SSL server + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_connect(ssl); + } + + +3.5 int ``SSL_accept`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : OK + 0 : failed, connect is close by remote + -1 : a error catch + + Description:: + + accept the remote connection + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_accept(ssl); + } + + +3.6 int ``SSL_shutdown`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : OK + 0 : failed, connect is close by remote + -1 : a error catch + + Description:: + + shutdown the connection + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_shutdown(ssl); + } + + +3.7 int ``SSL_clear`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + shutdown the connection + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_clear(ssl); + } + + +3.8 int ``SSL_read`` (SSL *ssl, void *buffer, int len) + + Arguments:: + + ssl - point + buffer - data buffer point + len - data length + + Return:: + + > 0 : OK, and return received data bytes + = 0 : no data received or connection is closed + < 0 : an error catch + + Description:: + + read data from remote + + Example:: + + void example(void) + { + SSL *ssl; + char *buf; + int len; + int ret; + + ... ... + + ret = SSL_read(ssl, buf, len); + } + +3.9 int ``SSL_write`` (SSL *ssl, const void *buffer, int len) + + Arguments:: + + ssl - SSL point + buffer - data buffer point + len - data length + + Return:: + + > 0 : OK, and return received data bytes + = 0 : no data sent or connection is closed + < 0 : an error catch + + Description:: + + send the data to remote + + Example:: + + void example(void) + { + SSL *ssl; + char *buf; + int len; + int ret; + + ... ... + + ret = SSL_write(ssl, buf, len); + } + + +3.10 ``SSL_CTX *SSL_get_SSL_CTX`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL context + + Description:: + + get SSL context of the SSL + + Example:: + + void example(void) + { + SSL *ssl; + SSL_CTX *ctx; + + ... ... + + ctx = SSL_get_SSL_CTX(ssl); + } + + +3.11 int ``SSL_get_shutdown`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + shutdown mode + + Description:: + + get SSL shutdown mode + + Example:: + + void example(void) + { + SSL *ssl; + int mode; + + ... ... + + mode = SSL_get_SSL_CTX(ssl); + } + + +3.12 void ``SSL_set_shutdown`` (SSL *ssl, int mode) + + Arguments:: + + ssl - SSL point + + Return:: + + shutdown mode + + Description:: + + set SSL shutdown mode + + Example:: + + void example(void) + { + SSL *ssl; + int mode = 0; + + ... ... + + SSL_set_shutdown(ssl, mode); + } + + +3.13 const SSL_METHOD* ``SSL_get_ssl_method`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL method + + Description:: + + set SSL shutdown mode + + Example:: + + void example(void) + { + SSL *ssl; + const SSL_METHOD *method; + + ... ... + + method = SSL_get_ssl_method(ssl); + } + + +3.14 int ``SSL_set_ssl_method`` (SSL *ssl, const SSL_METHOD *method) + + Arguments:: + + ssl - SSL point + meth - SSL method point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + set the SSL method + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + const SSL_METHOD *method; + + ... ... + + ret = SSL_set_ssl_method(ssl, method); + } + + +3.15 int ``SSL_pending`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + data bytes + + Description:: + + get received data bytes + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + + ... ... + + ret = SSL_pending(ssl); + } + + +3.16 int ``SSL_has_pending`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 1 : Yes + 0 : No + + Description:: + + check if data is received + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + + ... ... + + ret = SSL_has_pending(ssl); + } + + +3.17 int ``SSL_get_fd`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + >= 0 : socket id + < 0 : a error catch + + Description:: + + get the socket of the SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + + ... ... + + ret = SSL_get_fd(ssl); + } + + +3.18 int ``SSL_get_rfd`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + >= 0 : socket id + < 0 : a error catch + + Description:: + + get the read only socket of the SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + + ... ... + + ret = SSL_get_rfd(ssl); + } + + +3.19 int ``SSL_get_wfd`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + >= 0 : socket id + < 0 : a error catch + + Description:: + + get the write only socket of the SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + + ... ... + + ret = SSL_get_wfd(ssl); + } + + +3.20 int ``SSL_set_fd`` (SSL *ssl, int fd) + + Arguments:: + + ssl - SSL point + fd - socket id + + Return:: + + 1 : OK + 0 : failed + + Description:: + + set socket to SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + int socket; + + ... ... + + ret = SSL_set_fd(ssl, socket); + } + + +3.21 int ``SSL_set_rfd`` (SSL *ssl, int fd) + + Arguments:: + + ssl - SSL point + fd - socket id + + Return:: + + 1 : OK + 0 : failed + + Description:: + + set read only socket to SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + int socket; + + ... ... + + ret = SSL_set_rfd(ssl, socket); + } + + +3.22 int ``SSL_set_wfd`` (SSL *ssl, int fd) + + Arguments:: + + ssl - SSL point + fd - socket id + + Return:: + + 1 : OK + 0 : failed + + Description:: + + set write only socket to SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + int socket; + + ... ... + + ret = SSL_set_wfd(ssl, socket); + } + + +3.23 int ``SSL_version`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL version + + Description:: + + get SSL version + + Example:: + + void example(void) + { + int version; + SSL *ssl; + + ... ... + + version = SSL_version(ssl); + } + + +3.24 const char* ``SSL_get_version`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL version string + + Description:: + + get the SSL current version string + + Example:: + + void example(void) + { + char *version; + SSL *ssl; + + ... ... + + version = SSL_get_version(ssl); + } + + +3.25 OSSL_HANDSHAKE_STATE ``SSL_get_state`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL state + + Description:: + + get the SSL state + + Example:: + + void example(void) + { + OSSL_HANDSHAKE_STATE state; + SSL *ssl; + + ... ... + + state = SSL_get_state(ssl); + } + + +3.26 const char* ``SSL_alert_desc_string`` (int value) + + Arguments:: + + value - SSL description + + Return:: + + alert value string + + Description:: + + get alert description string + + Example:: + + void example(void) + { + int val; + char *str; + + ... ... + + str = SSL_alert_desc_string(val); + } + + +3.27 const char* ``SSL_alert_desc_string_long`` (int value) + + Arguments:: + + value - SSL description + + Return:: + + alert value long string + + Description:: + + get alert description long string + + Example:: + + void example(void) + { + int val; + char *str; + + ... ... + + str = SSL_alert_desc_string_long(val); + } + + +3.28 const char* ``SSL_alert_type_string`` (int value) + + Arguments:: + + value - SSL type description + + Return:: + + alert type string + + Description:: + + get alert type string + + Example:: + + void example(void) + { + int val; + char *str; + + ... ... + + str = SSL_alert_type_string(val); + } + + +3.29 const char* ``SSL_alert_type_string_long`` (int value) + + Arguments:: + + value - SSL type description + + Return:: + + alert type long string + + Description:: + + get alert type long string + + Example:: + + void example(void) + { + int val; + char *str; + + ... ... + + str = SSL_alert_type_string_long(val); + } + +3.30 const char* ``SSL_rstate_string`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + state string + + Description:: + + get the state string where SSL is reading + + Example:: + + void example(void) + { + SSL *ssl; + char *str; + + ... ... + + str = SSL_rstate_string(ssl); + } + + +3.31 const char* ``SSL_rstate_string_long`` (SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + state long string + + Description:: + + get the state long string where SSL is reading + + Example:: + + void example(void) + { + SSL *ssl; + char *str; + + ... ... + + str = SSL_rstate_string_long(ssl); + } + + +3.32 const char* ``SSL_state_string`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + state string + + Description:: + + get the state string + + Example:: + + void example(void) + { + SSL *ssl; + const char *str; + + ... ... + + str = SSL_state_string(ssl); + } + + +3.33 char* ``SSL_state_string_long`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + state long string + + Description:: + + get the state long string + + Example:: + + void example(void) + { + SSL *ssl; + char *str; + + ... ... + + str = SSL_state_string(ssl); + } + + +3.34 int ``SSL_get_error`` (const SSL *ssl, int ret_code) + + Arguments:: + + ssl - SSL point + ret_code - SSL return code + + Return:: + + SSL error number + + Description:: + + get SSL error code + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + int err; + + ... ... + + err = SSL_get_error(ssl, ret); + } + +3.35 int ``SSL_want`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + specifical statement + + Description:: + + get the SSL specifical statement + + Example:: + + void example(void) + { + SSL *ssl; + int state; + + ... ... + + state = SSL_want(ssl); + } + + +3.36 int ``SSL_want_nothing`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 0 : false + 1 : true + + Description:: + + check if SSL want nothing + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_want(ssl); + } + + +3.37 int ``SSL_want_read`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 0 : false + 1 : true + + Description:: + + check if SSL want to read + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_want_read(ssl); + } + + +3.38 int ``SSL_want_write`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + 0 : false + 1 : true + + Description:: + + check if SSL want to write + + Example:: + + void example(void) + { + SSL *ssl; + int ret; + + ... ... + + ret = SSL_want_write(ssl); + } + + +Chapter 4. SSL X509 Certification and Private Key Function +========================================================== + + +4.1 X509* ``d2i_X509`` (X509 **cert, const unsigned char *buffer, long len) + + Arguments:: + + cert - a point pointed to X509 certification + buffer - a point pointed to the certification context memory point + length - certification bytes + + Return:: + + X509 certification object point + + Description:: + + load a character certification context into system context. If '*cert' is pointed to the + certification, then load certification into it. Or create a new X509 certification object + + Example:: + + void example(void) + { + X509 *new; + X509 *cert; + unsigned char *buffer; + long len; + ... ... + + new = d2i_X509(&cert, buffer, len); + } + + +4.2 int ``SSL_add_client_CA`` (SSL *ssl, X509 *x) + + Arguments:: + + ssl - SSL point + x - CA certification point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + add CA client certification into the SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + X509 *new; + + ... ... + + ret = SSL_add_client_CA(ssl, new); + } + + +4.3 int ``SSL_CTX_add_client_CA`` (SSL_CTX *ctx, X509 *x) + + Arguments:: + + ctx - SSL context point + x - CA certification point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + add CA client certification into the SSL context + + Example:: + + void example(void) + { + int ret; + SSL_CTX *ctx; + X509 *new; + + ... ... + + ret = SSL_add_clSSL_CTX_add_client_CAient_CA(ctx, new); + } + + +4.4 X509* ``SSL_get_certificate`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + SSL certification point + + Description:: + + get the SSL certification point + + Example:: + + void example(void) + { + SSL *ssl; + X509 *cert; + + ... ... + + cert = SSL_get_certificate(ssl); + } + + +4.5 long ``SSL_get_verify_result`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + the result of verifying + + Description:: + + get the verifying result of the SSL certification + + Example:: + + void example(void) + { + SSL *ssl; + long ret; + + ... ... + + ret = SSL_get_verify_result(ssl); + } + + +4.6 int ``SSL_CTX_use_certificate`` (SSL_CTX *ctx, X509 *x) + + Arguments:: + + ctx - the SSL context point + pkey - certification object point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load the certification into the SSL_CTX or SSL object + + Example:: + + void example(void) + { + int ret; + SSL_CTX *ctx + X509 *new; + + ... ... + + ret = SSL_CTX_use_certificate(ctx, new); + } + + +4.7 int ``SSL_CTX_use_certificate_ASN1`` (SSL_CTX *ctx, int len, const unsigned char *d) + + Arguments:: + + ctx - SSL context point + len - certification length + d - data point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load the ASN1 certification into SSL context + + Example:: + + void example(void) + { + int ret; + SSL_CTX *ctx; + const unsigned char *buf; + int len; + + ... ... + + ret = SSL_CTX_use_certificate_ASN1(ctx, len, buf); + } + + +4.8 int ``SSL_CTX_use_PrivateKey`` (SSL_CTX *ctx, EVP_PKEY *pkey) + + Arguments:: + + ctx - SSL context point + pkey - private key object point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load the private key into the context object + + Example:: + + void example(void) + { + int ret; + SSL_CTX *ctx; + EVP_PKEY *pkey; + + ... ... + + ret = SSL_CTX_use_PrivateKey(ctx, pkey); + } + + +4.9 int ``SSL_CTX_use_PrivateKey_ASN1`` (int pk, SSL_CTX *ctx, const unsigned char *d, long len) + + Arguments:: + + ctx - SSL context point + d - data point + len - private key length + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load the ASN1 private key into SSL context + + Example:: + + void example(void) + { + int ret; + int pk; + SSL_CTX *ctx; + const unsigned char *buf; + long len; + + ... ... + + ret = SSL_CTX_use_PrivateKey_ASN1(pk, ctx, buf, len); + } + + +4.10 int ``SSL_CTX_use_RSAPrivateKey_ASN1`` (SSL_CTX *ctx, const unsigned char *d, long len) + + Arguments:: + + ctx - SSL context point + d - data point + len - private key length + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load the RSA ASN1 private key into SSL context + + Example:: + + void example(void) + { + int ret; + SSL_CTX *ctx; + const unsigned char *buf; + long len; + + ... ... + + ret = SSL_CTX_use_RSAPrivateKey_ASN1(ctx, buf, len); + } + + +4.11 int ``SSL_use_certificate_ASN1`` (SSL *ssl, int len, const unsigned char *d) + + Arguments:: + + ssl - SSL point + len - data bytes + d - data point + + Return:: + + 1 : OK + 0 : failed + + Description:: + + load certification into the SSL + + Example:: + + void example(void) + { + int ret; + SSL *ssl; + const unsigned char *buf; + long len; + + ... ... + + ret = SSL_use_certificate_ASN1(ssl, len, buf); + } + + +4.12 X509* ``SSL_get_peer_certificate`` (const SSL *ssl) + + Arguments:: + + ssl - SSL point + + Return:: + + peer certification + + Description:: + + get peer certification + + Example:: + + void example(void) + { + SSL *ssl; + X509 *peer; + + ... ... + + peer = SSL_get_peer_certificate(ssl); + } + diff --git a/components/openssl/component.mk b/components/openssl/component.mk new file mode 100644 index 000000000..be40549d2 --- /dev/null +++ b/components/openssl/component.mk @@ -0,0 +1,9 @@ +# +# Component Makefile +# + +COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_PRIV_INCLUDEDIRS := include/internal include/platform include/openssl + +COMPONENT_SRCDIRS := library platform + diff --git a/components/openssl/include/internal/ssl3.h b/components/openssl/include/internal/ssl3.h new file mode 100644 index 000000000..007b392f3 --- /dev/null +++ b/components/openssl/include/internal/ssl3.h @@ -0,0 +1,44 @@ +// Copyright 2015-2016 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 _SSL3_H_ +#define _SSL3_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +#define SSL3_VERSION 0x0300 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_cert.h b/components/openssl/include/internal/ssl_cert.h new file mode 100644 index 000000000..86cf31ad5 --- /dev/null +++ b/components/openssl/include/internal/ssl_cert.h @@ -0,0 +1,55 @@ +// Copyright 2015-2016 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 _SSL_CERT_H_ +#define _SSL_CERT_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" + +/** + * @brief create a certification object include private key object according to input certification + * + * @param ic - input certification point + * + * @return certification object point + */ +CERT *__ssl_cert_new(CERT *ic); + +/** + * @brief create a certification object include private key object + * + * @param none + * + * @return certification object point + */ +CERT* ssl_cert_new(void); + +/** + * @brief free a certification object + * + * @param cert - certification object point + * + * @return none + */ +void ssl_cert_free(CERT *cert); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_code.h b/components/openssl/include/internal/ssl_code.h new file mode 100644 index 000000000..80fdbb20f --- /dev/null +++ b/components/openssl/include/internal/ssl_code.h @@ -0,0 +1,124 @@ +// Copyright 2015-2016 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 _SSL_CODE_H_ +#define _SSL_CODE_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl3.h" +#include "tls1.h" +#include "x509_vfy.h" + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 + +/* + * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you + * should not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 +# define SSL_ASYNC_PAUSED 5 +# define SSL_ASYNC_NO_JOBS 6 + + +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_ERROR_WANT_ASYNC 9 +# define SSL_ERROR_WANT_ASYNC_JOB 10 + +/* Message flow states */ +typedef enum { + /* No handshake in progress */ + MSG_FLOW_UNINITED, + /* A permanent error with this connection */ + MSG_FLOW_ERROR, + /* We are about to renegotiate */ + MSG_FLOW_RENEGOTIATE, + /* We are reading messages */ + MSG_FLOW_READING, + /* We are writing messages */ + MSG_FLOW_WRITING, + /* Handshake has finished */ + MSG_FLOW_FINISHED +} MSG_FLOW_STATE; + +/* SSL subsystem states */ +typedef enum { + TLS_ST_BEFORE, + TLS_ST_OK, + DTLS_ST_CR_HELLO_VERIFY_REQUEST, + TLS_ST_CR_SRVR_HELLO, + TLS_ST_CR_CERT, + TLS_ST_CR_CERT_STATUS, + TLS_ST_CR_KEY_EXCH, + TLS_ST_CR_CERT_REQ, + TLS_ST_CR_SRVR_DONE, + TLS_ST_CR_SESSION_TICKET, + TLS_ST_CR_CHANGE, + TLS_ST_CR_FINISHED, + TLS_ST_CW_CLNT_HELLO, + TLS_ST_CW_CERT, + TLS_ST_CW_KEY_EXCH, + TLS_ST_CW_CERT_VRFY, + TLS_ST_CW_CHANGE, + TLS_ST_CW_NEXT_PROTO, + TLS_ST_CW_FINISHED, + TLS_ST_SW_HELLO_REQ, + TLS_ST_SR_CLNT_HELLO, + DTLS_ST_SW_HELLO_VERIFY_REQUEST, + TLS_ST_SW_SRVR_HELLO, + TLS_ST_SW_CERT, + TLS_ST_SW_KEY_EXCH, + TLS_ST_SW_CERT_REQ, + TLS_ST_SW_SRVR_DONE, + TLS_ST_SR_CERT, + TLS_ST_SR_KEY_EXCH, + TLS_ST_SR_CERT_VRFY, + TLS_ST_SR_NEXT_PROTO, + TLS_ST_SR_CHANGE, + TLS_ST_SR_FINISHED, + TLS_ST_SW_SESSION_TICKET, + TLS_ST_SW_CERT_STATUS, + TLS_ST_SW_CHANGE, + TLS_ST_SW_FINISHED +} OSSL_HANDSHAKE_STATE; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_dbg.h b/components/openssl/include/internal/ssl_dbg.h new file mode 100644 index 000000000..b4c075463 --- /dev/null +++ b/components/openssl/include/internal/ssl_dbg.h @@ -0,0 +1,93 @@ +// Copyright 2015-2016 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 _SSL_DEBUG_H_ +#define _SSL_DEBUG_H_ + +#include "platform/ssl_opt.h" +#include "platform/ssl_port.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef SSL_DEBUG_ENBALE +#define SSL_DEBUG_ENBALE 0 +#endif + +#ifndef SSL_DEBUG_LEVEL +#define SSL_DEBUG_LEVEL 0 +#endif + +#ifndef SSL_ASSERT_ENABLE +#define SSL_ASSERT_ENABLE 0 +#endif + +#ifndef SSL_DEBUG_LOCATION_ENABLE +#define SSL_DEBUG_LOCATION_ENABLE 0 +#endif + +#if SSL_DEBUG_ENBALE + #if !defined(SSL_PRINT_LOG) || !defined(SSL_ERROR_LOG) || !defined(SSL_LOCAL_LOG) + #include "stdio.h" + extern int printf(const char *fmt, ...); + #ifndef SSL_PRINT_LOG + #define SSL_PRINT_LOG printf + #endif + #ifndef SSL_ERROR_LOG + #define SSL_ERROR_LOG printf + #endif + #ifndef SSL_LOCAL_LOG + #define SSL_LOCAL_LOG printf + #endif + #endif +#else + #ifdef SSL_PRINT_LOG + #undef SSL_PRINT_LOG + #endif + #define SSL_PRINT_LOG(...) + + #ifdef SSL_ERROR_LOG + #undef SSL_ERROR_LOG + #endif + #define SSL_ERROR_LOG(...) + #ifdef SSL_LOCAL_LOG + #undef SSL_LOCAL_LOG + #endif + #define SSL_LOCAL_LOG(...) +#endif + +#if SSL_DEBUG_LOCATION_ENABLE + #define SSL_DEBUG_LOCATION() SSL_LOCAL_LOG("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__) +#else + #define SSL_DEBUG_LOCATION() +#endif + +#if SSL_ASSERT_ENABLE + #define SSL_ASSERT(s) { if (!(s)) { SSL_DEBUG_LOCATION(); } } +#else + #define SSL_ASSERT(s) +#endif + +#define SSL_ERR(err, go, fmt, ...) { SSL_DEBUG_LOCATION(); SSL_ERROR_LOG(fmt, ##__VA_ARGS__); ret = err; goto go; } + +#define SSL_RET(go, fmt, ...) { SSL_DEBUG_LOCATION(); SSL_ERROR_LOG(fmt, ##__VA_ARGS__); goto go; } + +#define SSL_DEBUG(level, fmt, ...) { if (level > SSL_DEBUG_LEVEL) {SSL_PRINT_LOG(fmt, ##__VA_ARGS__);} } + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_lib.h b/components/openssl/include/internal/ssl_lib.h new file mode 100644 index 000000000..bf7de22fd --- /dev/null +++ b/components/openssl/include/internal/ssl_lib.h @@ -0,0 +1,28 @@ +// Copyright 2015-2016 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 _SSL_LIB_H_ +#define _SSL_LIB_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_methods.h b/components/openssl/include/internal/ssl_methods.h new file mode 100644 index 000000000..cd2f8c053 --- /dev/null +++ b/components/openssl/include/internal/ssl_methods.h @@ -0,0 +1,121 @@ +// Copyright 2015-2016 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 _SSL_METHODS_H_ +#define _SSL_METHODS_H_ + +#include "ssl_types.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * TLS method function implement + */ +#define IMPLEMENT_TLS_METHOD_FUNC(func_name, \ + new, free, \ + handshake, shutdown, clear, \ + read, send, pending, \ + set_fd, get_fd, \ + set_bufflen, \ + get_verify_result, \ + get_state) \ + static const SSL_METHOD_FUNC func_name LOCAL_ATRR = { \ + new, \ + free, \ + handshake, \ + shutdown, \ + clear, \ + read, \ + send, \ + pending, \ + set_fd, \ + get_fd, \ + set_bufflen, \ + get_verify_result, \ + get_state \ + }; + +#define IMPLEMENT_TLS_METHOD(ver, mode, fun, func_name) \ + const SSL_METHOD* func_name(void) { \ + static const SSL_METHOD func_name##_data LOCAL_ATRR = { \ + ver, \ + mode, \ + &(fun), \ + }; \ + return &func_name##_data; \ + } + +#define IMPLEMENT_SSL_METHOD(ver, mode, fun, func_name) \ + const SSL_METHOD* func_name(void) { \ + static const SSL_METHOD func_name##_data LOCAL_ATRR = { \ + ver, \ + mode, \ + &(fun), \ + }; \ + return &func_name##_data; \ + } + +#define IMPLEMENT_X509_METHOD(func_name, \ + new, \ + free, \ + load, \ + show_info) \ + const X509_METHOD* func_name(void) { \ + static const X509_METHOD func_name##_data LOCAL_ATRR = { \ + new, \ + free, \ + load, \ + show_info \ + }; \ + return &func_name##_data; \ + } + +#define IMPLEMENT_PKEY_METHOD(func_name, \ + new, \ + free, \ + load) \ + const PKEY_METHOD* func_name(void) { \ + static const PKEY_METHOD func_name##_data LOCAL_ATRR = { \ + new, \ + free, \ + load \ + }; \ + return &func_name##_data; \ + } + +/** + * @brief get X509 object method + * + * @param none + * + * @return X509 object method point + */ +const X509_METHOD* X509_method(void); + +/** + * @brief get private key object method + * + * @param none + * + * @return private key object method point + */ +const PKEY_METHOD* EVP_PKEY_method(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_pkey.h b/components/openssl/include/internal/ssl_pkey.h new file mode 100644 index 000000000..e790fcc99 --- /dev/null +++ b/components/openssl/include/internal/ssl_pkey.h @@ -0,0 +1,86 @@ +// Copyright 2015-2016 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 _SSL_PKEY_H_ +#define _SSL_PKEY_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" + +/** + * @brief create a private key object according to input private key + * + * @param ipk - input private key point + * + * @return new private key object point + */ +EVP_PKEY* __EVP_PKEY_new(EVP_PKEY *ipk); + +/** + * @brief create a private key object + * + * @param none + * + * @return private key object point + */ +EVP_PKEY* EVP_PKEY_new(void); + +/** + * @brief load a character key context into system context. If '*a' is pointed to the + * private key, then load key into it. Or create a new private key object + * + * @param type - private key type + * @param a - a point pointed to a private key point + * @param pp - a point pointed to the key context memory point + * @param length - key bytes + * + * @return private key object point + */ +EVP_PKEY* d2i_PrivateKey(int type, + EVP_PKEY **a, + const unsigned char **pp, + long length); + +/** + * @brief free a private key object + * + * @param pkey - private key object point + * + * @return none + */ +void EVP_PKEY_free(EVP_PKEY *x); + +/** + * @brief load private key into the SSL + * + * @param type - private key type + * @param ssl - SSL point + * @param len - data bytes + * @param d - data point + * + * @return result + * 0 : failed + * 1 : OK + */ + int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const unsigned char *d, long len); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_stack.h b/components/openssl/include/internal/ssl_stack.h new file mode 100644 index 000000000..7a7051a02 --- /dev/null +++ b/components/openssl/include/internal/ssl_stack.h @@ -0,0 +1,52 @@ +#ifndef _SSL_STACK_H_ +#define _SSL_STACK_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" + +#define STACK_OF(type) struct stack_st_##type + +#define SKM_DEFINE_STACK_OF(t1, t2, t3) \ + STACK_OF(t1); \ + static ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ + } \ + +#define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) + +/** + * @brief create a openssl stack object + * + * @param c - stack function + * + * @return openssl stack object point + */ +OPENSSL_STACK* OPENSSL_sk_new(OPENSSL_sk_compfunc c); + +/** + * @brief create a NULL function openssl stack object + * + * @param none + * + * @return openssl stack object point + */ +OPENSSL_STACK *OPENSSL_sk_new_null(void); + +/** + * @brief free openssl stack object + * + * @param openssl stack object point + * + * @return none + */ +void OPENSSL_sk_free(OPENSSL_STACK *stack); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_types.h b/components/openssl/include/internal/ssl_types.h new file mode 100644 index 000000000..5aaee9417 --- /dev/null +++ b/components/openssl/include/internal/ssl_types.h @@ -0,0 +1,288 @@ +// Copyright 2015-2016 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 _SSL_TYPES_H_ +#define _SSL_TYPES_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_code.h" + +typedef void SSL_CIPHER; + +typedef void X509_STORE_CTX; +typedef void X509_STORE; + +typedef void RSA; + +typedef void STACK; +typedef void BIO; + +#define ossl_inline inline + +#define SSL_METHOD_CALL(f, s, ...) s->method->func->ssl_##f(s, ##__VA_ARGS__) +#define X509_METHOD_CALL(f, x, ...) x->method->x509_##f(x, ##__VA_ARGS__) +#define EVP_PKEY_METHOD_CALL(f, k, ...) k->method->pkey_##f(k, ##__VA_ARGS__) + +typedef int (*OPENSSL_sk_compfunc)(const void *, const void *); + +struct stack_st; +typedef struct stack_st OPENSSL_STACK; + +struct ssl_method_st; +typedef struct ssl_method_st SSL_METHOD; + +struct ssl_method_func_st; +typedef struct ssl_method_func_st SSL_METHOD_FUNC; + +struct record_layer_st; +typedef struct record_layer_st RECORD_LAYER; + +struct ossl_statem_st; +typedef struct ossl_statem_st OSSL_STATEM; + +struct ssl_session_st; +typedef struct ssl_session_st SSL_SESSION; + +struct ssl_ctx_st; +typedef struct ssl_ctx_st SSL_CTX; + +struct ssl_st; +typedef struct ssl_st SSL; + +struct cert_st; +typedef struct cert_st CERT; + +struct x509_st; +typedef struct x509_st X509; + +struct X509_VERIFY_PARAM_st; +typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM; + +struct evp_pkey_st; +typedef struct evp_pkey_st EVP_PKEY; + +struct x509_method_st; +typedef struct x509_method_st X509_METHOD; + +struct pkey_method_st; +typedef struct pkey_method_st PKEY_METHOD; + +struct stack_st { + + char **data; + + int num_alloc; + + OPENSSL_sk_compfunc c; +}; + +struct evp_pkey_st { + + void *pkey_pm; + + const PKEY_METHOD *method; +}; + +struct x509_st { + + /* X509 certification platform private point */ + void *x509_pm; + + const X509_METHOD *method; +}; + +struct cert_st { + + int sec_level; + + X509 *x509; + + EVP_PKEY *pkey; + +}; + +struct ossl_statem_st { + + MSG_FLOW_STATE state; + + int hand_state; +}; + +struct record_layer_st { + + int rstate; + + int read_ahead; +}; + +struct ssl_session_st { + + long timeout; + + long time; + + X509 *peer; +}; + +struct X509_VERIFY_PARAM_st { + + int depth; + +}; + +struct ssl_ctx_st +{ + int version; + + int references; + + unsigned long options; + + #if 0 + struct alpn_protocols alpn_protocol; + #endif + + const SSL_METHOD *method; + + CERT *cert; + + X509 *client_CA; + + int verify_mode; + + int (*default_verify_callback) (int ok, X509_STORE_CTX *ctx); + + long session_timeout; + + int read_ahead; + + int read_buffer_len; + + X509_VERIFY_PARAM param; +}; + +struct ssl_st +{ + /* protocol version(one of SSL3.0, TLS1.0, etc.) */ + int version; + + unsigned long options; + + /* shut things down(0x01 : sent, 0x02 : received) */ + int shutdown; + + CERT *cert; + + X509 *client_CA; + + SSL_CTX *ctx; + + const SSL_METHOD *method; + + RECORD_LAYER rlayer; + + /* where we are */ + OSSL_STATEM statem; + + SSL_SESSION *session; + + int verify_mode; + + int (*verify_callback) (int ok, X509_STORE_CTX *ctx); + + int rwstate; + + long verify_result; + + X509_VERIFY_PARAM param; + + int err; + + void (*info_callback) (const SSL *ssl, int type, int val); + + /* SSL low-level system arch point */ + void *ssl_pm; +}; + +struct ssl_method_st { + /* protocol version(one of SSL3.0, TLS1.0, etc.) */ + int version; + + /* SSL mode(client(0) , server(1), not known(-1)) */ + int endpoint; + + const SSL_METHOD_FUNC *func; +}; + +struct ssl_method_func_st { + + int (*ssl_new)(SSL *ssl); + + void (*ssl_free)(SSL *ssl); + + int (*ssl_handshake)(SSL *ssl); + + int (*ssl_shutdown)(SSL *ssl); + + int (*ssl_clear)(SSL *ssl); + + int (*ssl_read)(SSL *ssl, void *buffer, int len); + + int (*ssl_send)(SSL *ssl, const void *buffer, int len); + + int (*ssl_pending)(const SSL *ssl); + + void (*ssl_set_fd)(SSL *ssl, int fd, int mode); + + int (*ssl_get_fd)(const SSL *ssl, int mode); + + void (*ssl_set_bufflen)(SSL *ssl, int len); + + long (*ssl_get_verify_result)(const SSL *ssl); + + OSSL_HANDSHAKE_STATE (*ssl_get_state)(const SSL *ssl); +}; + +struct x509_method_st { + + int (*x509_new)(X509 *x, X509 *m_x); + + void (*x509_free)(X509 *x); + + int (*x509_load)(X509 *x, const unsigned char *buf, int len); + + int (*x509_show_info)(X509 *x); +}; + +struct pkey_method_st { + + int (*pkey_new)(EVP_PKEY *pkey, EVP_PKEY *m_pkey); + + void (*pkey_free)(EVP_PKEY *pkey); + + int (*pkey_load)(EVP_PKEY *pkey, const unsigned char *buf, int len); +}; + +typedef int (*next_proto_cb)(SSL *ssl, unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/ssl_x509.h b/components/openssl/include/internal/ssl_x509.h new file mode 100644 index 000000000..840fbf1ec --- /dev/null +++ b/components/openssl/include/internal/ssl_x509.h @@ -0,0 +1,108 @@ +// Copyright 2015-2016 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 _SSL_X509_H_ +#define _SSL_X509_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" +#include "ssl_stack.h" + +DEFINE_STACK_OF(X509_NAME) + +/** + * @brief create a X509 certification object according to input X509 certification + * + * @param ix - input X509 certification point + * + * @return new X509 certification object point + */ +X509* __X509_new(X509 *ix); + +/** + * @brief create a X509 certification object + * + * @param none + * + * @return X509 certification object point + */ +X509* X509_new(void); + +/** + * @brief load a character certification context into system context. If '*cert' is pointed to the + * certification, then load certification into it. Or create a new X509 certification object + * + * @param cert - a point pointed to X509 certification + * @param buffer - a point pointed to the certification context memory point + * @param length - certification bytes + * + * @return X509 certification object point + */ +X509* d2i_X509(X509 **cert, const unsigned char *buffer, long len); + +/** + * @brief free a X509 certification object + * + * @param x - X509 certification object point + * + * @return none + */ +void X509_free(X509 *x); + +/** + * @brief set SSL context client CA certification + * + * @param ctx - SSL context point + * @param x - X509 certification point + * + * @return result + * 0 : failed + * 1 : OK + */ +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +/** + * @brief add CA client certification into the SSL + * + * @param ssl - SSL point + * @param x - X509 certification point + * + * @return result + * 0 : failed + * 1 : OK + */ +int SSL_add_client_CA(SSL *ssl, X509 *x); + +/** + * @brief load certification into the SSL + * + * @param ssl - SSL point + * @param len - data bytes + * @param d - data point + * + * @return result + * 0 : failed + * 1 : OK + * + */ +int SSL_use_certificate_ASN1(SSL *ssl, int len, const unsigned char *d); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/tls1.h b/components/openssl/include/internal/tls1.h new file mode 100644 index 000000000..a9da53e06 --- /dev/null +++ b/components/openssl/include/internal/tls1.h @@ -0,0 +1,55 @@ +// Copyright 2015-2016 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 _TLS1_H_ +#define _TLS1_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ +# define TLS1_AD_NO_APPLICATION_PROTOCOL 120 /* fatal */ + +/* Special value for method supporting multiple versions */ +#define TLS_ANY_VERSION 0x10000 + +#define TLS1_VERSION 0x0301 +#define TLS1_1_VERSION 0x0302 +#define TLS1_2_VERSION 0x0303 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/internal/x509_vfy.h b/components/openssl/include/internal/x509_vfy.h new file mode 100644 index 000000000..d5b0d1a21 --- /dev/null +++ b/components/openssl/include/internal/x509_vfy.h @@ -0,0 +1,111 @@ +// Copyright 2015-2016 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 _X509_VFY_H_ +#define _X509_VFY_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#define X509_V_OK 0 +#define X509_V_ERR_UNSPECIFIED 1 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +#define X509_V_ERR_UNABLE_TO_GET_CRL 3 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 +#define X509_V_ERR_CRL_NOT_YET_VALID 11 +#define X509_V_ERR_CRL_HAS_EXPIRED 12 +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +#define X509_V_ERR_OUT_OF_MEM 17 +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_INVALID_CA 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +#define X509_V_ERR_INVALID_PURPOSE 26 +#define X509_V_ERR_CERT_UNTRUSTED 27 +#define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +#define X509_V_ERR_AKID_SKID_MISMATCH 30 +#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 +#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +#define X509_V_ERR_INVALID_NON_CA 37 +#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 +#define X509_V_ERR_INVALID_EXTENSION 41 +#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +#define X509_V_ERR_NO_EXPLICIT_POLICY 43 +#define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +#define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 +#define X509_V_ERR_UNNESTED_RESOURCE 46 +#define X509_V_ERR_PERMITTED_VIOLATION 47 +#define X509_V_ERR_EXCLUDED_VIOLATION 48 +#define X509_V_ERR_SUBTREE_MINMAX 49 +/* The application is not happy */ +#define X509_V_ERR_APPLICATION_VERIFICATION 50 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +#define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 +/* Another issuer check debug option */ +#define X509_V_ERR_PATH_LOOP 55 +/* Suite B mode algorithm violation */ +#define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +#define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 +/* Host, email and IP check errors */ +#define X509_V_ERR_HOSTNAME_MISMATCH 62 +#define X509_V_ERR_EMAIL_MISMATCH 63 +#define X509_V_ERR_IP_ADDRESS_MISMATCH 64 +/* DANE TLSA errors */ +#define X509_V_ERR_DANE_NO_MATCH 65 +/* security level errors */ +#define X509_V_ERR_EE_KEY_TOO_SMALL 66 +#define X509_V_ERR_CA_KEY_TOO_SMALL 67 +#define X509_V_ERR_CA_MD_TOO_WEAK 68 +/* Caller error */ +#define X509_V_ERR_INVALID_CALL 69 +/* Issuer lookup error */ +#define X509_V_ERR_STORE_LOOKUP 70 +/* Certificate transparency */ +#define X509_V_ERR_NO_VALID_SCTS 71 + +#define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/openssl/ssl.h b/components/openssl/include/openssl/ssl.h new file mode 100644 index 000000000..7f8eb8830 --- /dev/null +++ b/components/openssl/include/openssl/ssl.h @@ -0,0 +1,1737 @@ +// Copyright 2015-2016 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 _SSL_H_ +#define _SSL_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "internal/ssl_x509.h" +#include "internal/ssl_pkey.h" + +/* +{ +*/ + +/** + * @brief create a SSL context + * + * @param method - the SSL context method point + * + * @return the context point + */ +SSL_CTX* SSL_CTX_new(const SSL_METHOD *method); + +/** + * @brief free a SSL context + * + * @param method - the SSL context point + * + * @return none + */ +void SSL_CTX_free(SSL_CTX *ctx); + +/** + * @brief create a SSL + * + * @param ctx - the SSL context point + * + * @return the SSL point + */ +SSL* SSL_new(SSL_CTX *ctx); + +/** + * @brief free the SSL + * + * @param ssl - the SSL point + * + * @return none + */ +void SSL_free(SSL *ssl); + +/** + * @brief connect to the remote SSL server + * + * @param ssl - the SSL point + * + * @return result + * 1 : OK + * -1 : failed + */ +int SSL_connect(SSL *ssl); + +/** + * @brief accept the remote connection + * + * @param ssl - the SSL point + * + * @return result + * 1 : OK + * -1 : failed + */ +int SSL_accept(SSL *ssl); + +/** + * @brief read data from to remote + * + * @param ssl - the SSL point which has been connected + * @param buffer - the received data buffer point + * @param len - the received data length + * + * @return result + * > 0 : OK, and return received data bytes + * = 0 : connection is closed + * < 0 : an error catch + */ +int SSL_read(SSL *ssl, void *buffer, int len); + +/** + * @brief send the data to remote + * + * @param ssl - the SSL point which has been connected + * @param buffer - the send data buffer point + * @param len - the send data length + * + * @return result + * > 0 : OK, and return sent data bytes + * = 0 : connection is closed + * < 0 : an error catch + */ +int SSL_write(SSL *ssl, const void *buffer, int len); + +/** + * @brief get the verifying result of the SSL certification + * + * @param ssl - the SSL point + * + * @return the result of verifying + */ +long SSL_get_verify_result(const SSL *ssl); + +/** + * @brief shutdown the connection + * + * @param ssl - the SSL point + * + * @return result + * 1 : OK + * 0 : shutdown is not finished + * -1 : an error catch + */ +int SSL_shutdown(SSL *ssl); + +/** + * @brief bind the socket file description into the SSL + * + * @param ssl - the SSL point + * @param fd - socket handle + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_set_fd(SSL *ssl, int fd); + +/** + * @brief These functions load the private key into the SSL_CTX or SSL object + * + * @param ctx - the SSL context point + * @param pkey - private key object point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); + +/** + * @brief These functions load the certification into the SSL_CTX or SSL object + * + * @param ctx - the SSL context point + * @param pkey - certification object point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); + +/** + * @brief create the target SSL context client method + * + * @param none + * + * @return the SSLV2.3 version SSL context client method + */ +const SSL_METHOD* SSLv23_client_method(void); + +/** + * @brief create the target SSL context client method + * + * @param none + * + * @return the TLSV1.0 version SSL context client method + */ +const SSL_METHOD* TLSv1_client_method(void); + +/** + * @brief create the target SSL context client method + * + * @param none + * + * @return the SSLV1.0 version SSL context client method + */ +const SSL_METHOD* SSLv3_client_method(void); + +/** + * @brief create the target SSL context client method + * + * @param none + * + * @return the TLSV1.1 version SSL context client method + */ +const SSL_METHOD* TLSv1_1_client_method(void); + +/** + * @brief create the target SSL context client method + * + * @param none + * + * @return the TLSV1.2 version SSL context client method + */ +const SSL_METHOD* TLSv1_2_client_method(void); + + +/** + * @brief create the target SSL context server method + * + * @param none + * + * @return the SSLV2.3 version SSL context server method + */ +const SSL_METHOD* SSLv23_server_method(void); + +/** + * @brief create the target SSL context server method + * + * @param none + * + * @return the TLSV1.1 version SSL context server method + */ +const SSL_METHOD* TLSv1_1_server_method(void); + +/** + * @brief create the target SSL context server method + * + * @param none + * + * @return the TLSV1.2 version SSL context server method + */ +const SSL_METHOD* TLSv1_2_server_method(void); + +/** + * @brief create the target SSL context server method + * + * @param none + * + * @return the TLSV1.0 version SSL context server method + */ +const SSL_METHOD* TLSv1_server_method(void); + +/** + * @brief create the target SSL context server method + * + * @param none + * + * @return the SSLV3.0 version SSL context server method + */ +const SSL_METHOD* SSLv3_server_method(void); + +/** + * @brief set the SSL context ALPN select callback function + * + * @param ctx - SSL context point + * @param cb - ALPN select callback function + * @param arg - ALPN select callback function entry private data point + * + * @return none + */ +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), + void *arg); + + +/** + * @brief set the SSL context ALPN select protocol + * + * @param ctx - SSL context point + * @param protos - ALPN protocol name + * @param protos_len - ALPN protocol name bytes + * + * @return result + * 0 : OK + * 1 : failed + */ +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, unsigned int protos_len); + +/** + * @brief set the SSL context next ALPN select callback function + * + * @param ctx - SSL context point + * @param cb - ALPN select callback function + * @param arg - ALPN select callback function entry private data point + * + * @return none + */ +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), + void *arg); + +/** + * @brief get SSL error code + * + * @param ssl - SSL point + * @param ret_code - SSL return code + * + * @return SSL error number + */ +int SSL_get_error(const SSL *ssl, int ret_code); + +/** + * @brief clear the SSL error code + * + * @param none + * + * @return none + */ +void ERR_clear_error(void); + +/** + * @brief get the current SSL error code + * + * @param none + * + * @return current SSL error number + */ +int ERR_get_error(void); + +/** + * @brief register the SSL error strings + * + * @param none + * + * @return none + */ +void ERR_load_SSL_strings(void); + +/** + * @brief initialize the SSL library + * + * @param none + * + * @return none + */ +void SSL_library_init(void); + +/** + * @brief generates a human-readable string representing the error code e + * and store it into the "ret" point memory + * + * @param e - error code + * @param ret - memory point to store the string + * + * @return the result string point + */ +char *ERR_error_string(unsigned long e, char *ret); + +/** + * @brief add the SSL context option + * + * @param ctx - SSL context point + * @param opt - new SSL context option + * + * @return the SSL context option + */ +unsigned long SSL_CTX_set_options(SSL_CTX *ctx, unsigned long opt); + +/** + * @brief add the SSL context mode + * + * @param ctx - SSL context point + * @param mod - new SSL context mod + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_mode(SSL_CTX *ctx, int mod); + +/* +} +*/ + +/** + * @brief perform the SSL handshake + * + * @param ssl - SSL point + * + * @return result + * 1 : OK + * 0 : failed + * -1 : a error catch + */ +int SSL_do_handshake(SSL *ssl); + +/** + * @brief get the SSL current version + * + * @param ssl - SSL point + * + * @return the version string + */ +const char *SSL_get_version(const SSL *ssl); + +/** + * @brief set the SSL context version + * + * @param ctx - SSL context point + * @param meth - SSL method point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +/** + * @brief get the bytes numbers which are to be read + * + * @param ssl - SSL point + * + * @return bytes number + */ +int SSL_pending(const SSL *ssl); + +/** + * @brief check if SSL want nothing + * + * @param ssl - SSL point + * + * @return result + * 0 : false + * 1 : true + */ +int SSL_want_nothing(const SSL *ssl); + +/** + * @brief check if SSL want to read + * + * @param ssl - SSL point + * + * @return result + * 0 : false + * 1 : true + */ +int SSL_want_read(const SSL *ssl); + +/** + * @brief check if SSL want to write + * + * @param ssl - SSL point + * + * @return result + * 0 : false + * 1 : true + */ +int SSL_want_write(const SSL *ssl); + +/** + * @brief get the SSL context current method + * + * @param ctx - SSL context point + * + * @return the SSL context current method + */ +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx); + +/** + * @brief get the SSL current method + * + * @param ssl - SSL point + * + * @return the SSL current method + */ +const SSL_METHOD *SSL_get_ssl_method(SSL *ssl); + +/** + * @brief set the SSL method + * + * @param ssl - SSL point + * @param meth - SSL method point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_set_ssl_method(SSL *ssl, const SSL_METHOD *method); + +/** + * @brief add CA client certification into the SSL + * + * @param ssl - SSL point + * @param x - CA certification point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_add_client_CA(SSL *ssl, X509 *x); + +/** + * @brief add CA client certification into the SSL context + * + * @param ctx - SSL context point + * @param x - CA certification point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +/** + * @brief set the SSL CA certification list + * + * @param ssl - SSL point + * @param name_list - CA certification list + * + * @return none + */ +void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list); + +/** + * @brief set the SSL context CA certification list + * + * @param ctx - SSL context point + * @param name_list - CA certification list + * + * @return none + */ +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); + +/** + * @briefget the SSL CA certification list + * + * @param ssl - SSL point + * + * @return CA certification list + */ +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl); + +/** + * @brief get the SSL context CA certification list + * + * @param ctx - SSL context point + * + * @return CA certification list + */ +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx); + +/** + * @brief get the SSL certification point + * + * @param ssl - SSL point + * + * @return SSL certification point + */ +X509 *SSL_get_certificate(const SSL *ssl); + +/** + * @brief get the SSL private key point + * + * @param ssl - SSL point + * + * @return SSL private key point + */ +EVP_PKEY *SSL_get_privatekey(const SSL *ssl); + +/** + * @brief set the SSL information callback function + * + * @param ssl - SSL point + * @param cb - information callback function + * + * @return none + */ +void SSL_set_info_callback(SSL *ssl, void (*cb) (const SSL *ssl, int type, int val)); + +/** + * @brief get the SSL state + * + * @param ssl - SSL point + * + * @return SSL state + */ +OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); + +/** + * @brief set the SSL context read buffer length + * + * @param ctx - SSL context point + * @param len - read buffer length + * + * @return none + */ +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); + +/** + * @brief set the SSL read buffer length + * + * @param ssl - SSL point + * @param len - read buffer length + * + * @return none + */ +void SSL_set_default_read_buffer_len(SSL *ssl, size_t len); + +/** + * @brief set the SSL security level + * + * @param ssl - SSL point + * @param level - security level + * + * @return none + */ +void SSL_set_security_level(SSL *ssl, int level); + +/** + * @brief get the SSL security level + * + * @param ssl - SSL point + * + * @return security level + */ +int SSL_get_security_level(const SSL *ssl); + +/** + * @brief get the SSL verifying mode of the SSL context + * + * @param ctx - SSL context point + * + * @return verifying mode + */ +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); + +/** + * @brief get the SSL verifying depth of the SSL context + * + * @param ctx - SSL context point + * + * @return verifying depth + */ +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); + +/** + * @brief set the SSL context verifying of the SSL context + * + * @param ctx - SSL context point + * @param mode - verifying mode + * @param verify_callback - verifying callback function + * + * @return none + */ +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*verify_callback)(int, X509_STORE_CTX *)); + +/** + * @brief set the SSL verifying of the SSL context + * + * @param ctx - SSL point + * @param mode - verifying mode + * @param verify_callback - verifying callback function + * + * @return none + */ +void SSL_set_verify(SSL *s, int mode, int (*verify_callback)(int, X509_STORE_CTX *)); + +/** + * @brief set the SSL verify depth of the SSL context + * + * @param ctx - SSL context point + * @param depth - verifying depth + * + * @return none + */ +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); + +/** + * @brief certification verifying callback function + * + * @param preverify_ok - verifying result + * @param x509_ctx - X509 certification point + * + * @return verifying result + */ +int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx); + +/** + * @brief set the session timeout time + * + * @param ctx - SSL context point + * @param t - new session timeout time + * + * @return old session timeout time + */ +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); + +/** + * @brief get the session timeout time + * + * @param ctx - SSL context point + * + * @return current session timeout time + */ +long SSL_CTX_get_timeout(const SSL_CTX *ctx); + +/** + * @brief set the SSL context cipher through the list string + * + * @param ctx - SSL context point + * @param str - cipher controller list string + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str); + +/** + * @brief set the SSL cipher through the list string + * + * @param ssl - SSL point + * @param str - cipher controller list string + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_set_cipher_list(SSL *ssl, const char *str); + +/** + * @brief get the SSL cipher list string + * + * @param ssl - SSL point + * + * @return cipher controller list string + */ +const char *SSL_get_cipher_list(const SSL *ssl, int n); + +/** + * @brief get the SSL cipher + * + * @param ssl - SSL point + * + * @return current cipher + */ +const SSL_CIPHER *SSL_get_current_cipher(const SSL *ssl); + +/** + * @brief get the SSL cipher string + * + * @param ssl - SSL point + * + * @return cipher string + */ +const char *SSL_get_cipher(const SSL *ssl); + +/** + * @brief get the SSL context object X509 certification storage + * + * @param ctx - SSL context point + * + * @return x509 certification storage + */ +X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx); + +/** + * @brief set the SSL context object X509 certification store + * + * @param ctx - SSL context point + * @param store - X509 certification store + * + * @return none + */ +void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store); + +/** + * @brief get the SSL specifical statement + * + * @param ssl - SSL point + * + * @return specifical statement + */ +int SSL_want(const SSL *ssl); + +/** + * @brief check if the SSL is SSL_X509_LOOKUP state + * + * @param ssl - SSL point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_want_x509_lookup(const SSL *ssl); + +/** + * @brief reset the SSL + * + * @param ssl - SSL point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_clear(SSL *ssl); + +/** + * @brief get the socket handle of the SSL + * + * @param ssl - SSL point + * + * @return result + * >= 0 : yes, and return socket handle + * < 0 : a error catch + */ +int SSL_get_fd(const SSL *ssl); + +/** + * @brief get the read only socket handle of the SSL + * + * @param ssl - SSL point + * + * @return result + * >= 0 : yes, and return socket handle + * < 0 : a error catch + */ +int SSL_get_rfd(const SSL *ssl); + +/** + * @brief get the write only socket handle of the SSL + * + * @param ssl - SSL point + * + * @return result + * >= 0 : yes, and return socket handle + * < 0 : a error catch + */ +int SSL_get_wfd(const SSL *ssl); + +/** + * @brief set the SSL if we can read as many as data + * + * @param ssl - SSL point + * @param yes - enable the function + * + * @return none + */ +void SSL_set_read_ahead(SSL *s, int yes); + +/** + * @brief set the SSL context if we can read as many as data + * + * @param ctx - SSL context point + * @param yes - enbale the function + * + * @return none + */ +void SSL_CTX_set_read_ahead(SSL_CTX *ctx, int yes); + +/** + * @brief get the SSL ahead signal if we can read as many as data + * + * @param ssl - SSL point + * + * @return SSL context ahead signal + */ +int SSL_get_read_ahead(const SSL *ssl); + +/** + * @brief get the SSL context ahead signal if we can read as many as data + * + * @param ctx - SSL context point + * + * @return SSL context ahead signal + */ +long SSL_CTX_get_read_ahead(SSL_CTX *ctx); + +/** + * @brief check if some data can be read + * + * @param ssl - SSL point + * + * @return + * 1 : there are bytes to be read + * 0 : no data + */ +int SSL_has_pending(const SSL *ssl); + +/** + * @brief load the X509 certification into SSL context + * + * @param ctx - SSL context point + * @param x - X509 certification point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);//loads the certificate x into ctx + +/** + * @brief load the ASN1 certification into SSL context + * + * @param ctx - SSL context point + * @param len - certification length + * @param d - data point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d); + +/** + * @brief load the certification file into SSL context + * + * @param ctx - SSL context point + * @param file - certification file name + * @param type - certification encoding type + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); + +/** + * @brief load the certification chain file into SSL context + * + * @param ctx - SSL context point + * @param file - certification chain file name + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); + + +/** + * @brief load the ASN1 private key into SSL context + * + * @param ctx - SSL context point + * @param d - data point + * @param len - private key length + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, const unsigned char *d, long len);//adds the private key of type pk stored at memory location d (length len) to ctx + +/** + * @brief load the private key file into SSL context + * + * @param ctx - SSL context point + * @param file - private key file name + * @param type - private key encoding type + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); + +/** + * @brief load the RSA private key into SSL context + * + * @param ctx - SSL context point + * @param x - RSA private key point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); + +/** + * @brief load the RSA ASN1 private key into SSL context + * + * @param ctx - SSL context point + * @param d - data point + * @param len - RSA private key length + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len); + +/** + * @brief load the RSA private key file into SSL context + * + * @param ctx - SSL context point + * @param file - RSA private key file name + * @param type - private key encoding type + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); + + +/** + * @brief check if the private key and certification is matched + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_check_private_key(const SSL_CTX *ctx); + +/** + * @brief set the SSL context server information + * + * @param ctx - SSL context point + * @param serverinfo - server information string + * @param serverinfo_length - server information length + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, size_t serverinfo_length); + +/** + * @brief load the SSL context server infomation file into SSL context + * + * @param ctx - SSL context point + * @param file - server information file + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); + +/** + * @brief SSL select next function + * + * @param out - point of output data point + * @param outlen - output data length + * @param in - input data + * @param inlen - input data length + * @param client - client data point + * @param client_len -client data length + * + * @return NPN state + * OPENSSL_NPN_UNSUPPORTED : not support + * OPENSSL_NPN_NEGOTIATED : negotiated + * OPENSSL_NPN_NO_OVERLAP : no overlap + */ +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, unsigned int client_len); + +/** + * @brief load the extra certification chain into the SSL context + * + * @param ctx - SSL context point + * @param x509 - X509 certification + * + * @return result + * 1 : OK + * 0 : failed + */ +long SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *); + +/** + * @brief control the SSL context + * + * @param ctx - SSL context point + * @param cmd - command + * @param larg - parameter length + * @param parg - parameter point + * + * @return result + * 1 : OK + * 0 : failed + */ +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg); + +/** + * @brief get the SSL context cipher + * + * @param ctx - SSL context point + * + * @return SSL context cipher + */ +STACK *SSL_CTX_get_ciphers(const SSL_CTX *ctx); + +/** + * @brief check if the SSL context can read as many as data + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +long SSL_CTX_get_default_read_ahead(SSL_CTX *ctx); + +/** + * @brief get the SSL context extra data + * + * @param ctx - SSL context point + * @param idx - index + * + * @return data point + */ +char *SSL_CTX_get_ex_data(const SSL_CTX *ctx, int idx); + +/** + * @brief get the SSL context quiet shutdown option + * + * @param ctx - SSL context point + * + * @return quiet shutdown option + */ +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); + +/** + * @brief load the SSL context CA file + * + * @param ctx - SSL context point + * @param CAfile - CA certification file + * @param CApath - CA certification file path + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath); + +/** + * @brief add SSL context reference count by '1' + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_up_ref(SSL_CTX *ctx); + +/** + * @brief set SSL context application private data + * + * @param ctx - SSL context point + * @param arg - private data + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_app_data(SSL_CTX *ctx, void *arg); + +/** + * @brief set SSL context client certification callback function + * + * @param ctx - SSL context point + * @param cb - callback function + * + * @return none + */ +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)); + +/** + * @brief set the SSL context if we can read as many as data + * + * @param ctx - SSL context point + * @param m - enable the fuction + * + * @return none + */ +void SSL_CTX_set_default_read_ahead(SSL_CTX *ctx, int m); + +/** + * @brief set SSL context default verifying path + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); + +/** + * @brief set SSL context default verifying directory + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); + +/** + * @brief set SSL context default verifying file + * + * @param ctx - SSL context point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); + +/** + * @brief set SSL context extra data + * + * @param ctx - SSL context point + * @param idx - data index + * @param arg - data point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_set_ex_data(SSL_CTX *s, int idx, char *arg); + +/** + * @brief clear the SSL context option bit of "op" + * + * @param ctx - SSL context point + * @param op - option + * + * @return SSL context option + */ +unsigned long SSL_CTX_clear_options(SSL_CTX *ctx, unsigned long op); + +/** + * @brief get the SSL context option + * + * @param ctx - SSL context point + * @param op - option + * + * @return SSL context option + */ +unsigned long SSL_CTX_get_options(SSL_CTX *ctx); + +/** + * @brief set the SSL context quiet shutdown mode + * + * @param ctx - SSL context point + * @param mode - mode + * + * @return none + */ +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); + +/** + * @brief get the SSL context X509 certification + * + * @param ctx - SSL context point + * + * @return X509 certification + */ +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); + +/** + * @brief get the SSL context private key + * + * @param ctx - SSL context point + * + * @return private key + */ +EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +/** + * @brief set SSL context PSK identity hint + * + * @param ctx - SSL context point + * @param hint - PSK identity hint + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *hint); + +/** + * @brief set SSL context PSK server callback function + * + * @param ctx - SSL context point + * @param callback - callback function + * + * @return none + */ +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, + unsigned int (*callback)(SSL *ssl, + const char *identity, + unsigned char *psk, + int max_psk_len)); +/** + * @brief get alert description string + * + * @param value - alert value + * + * @return alert description string + */ +const char *SSL_alert_desc_string(int value); + +/** + * @brief get alert description long string + * + * @param value - alert value + * + * @return alert description long string + */ +const char *SSL_alert_desc_string_long(int value); + +/** + * @brief get alert type string + * + * @param value - alert value + * + * @return alert type string + */ +const char *SSL_alert_type_string(int value); + +/** + * @brief get alert type long string + * + * @param value - alert value + * + * @return alert type long string + */ +const char *SSL_alert_type_string_long(int value); + +/** + * @brief get SSL context of the SSL + * + * @param ssl - SSL point + * + * @return SSL context + */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); + +/** + * @brief get SSL application data + * + * @param ssl - SSL point + * + * @return application data + */ +char *SSL_get_app_data(SSL *ssl); + +/** + * @brief get SSL cipher bits + * + * @param ssl - SSL point + * @param alg_bits - algorithm bits + * + * @return strength bits + */ +int SSL_get_cipher_bits(const SSL *ssl, int *alg_bits); + +/** + * @brief get SSL cipher name + * + * @param ssl - SSL point + * + * @return SSL cipher name + */ +char *SSL_get_cipher_name(const SSL *ssl); + +/** + * @brief get SSL cipher version + * + * @param ssl - SSL point + * + * @return SSL cipher version + */ +char *SSL_get_cipher_version(const SSL *ssl); + +/** + * @brief get SSL extra data + * + * @param ssl - SSL point + * @param idx - data index + * + * @return extra data + */ +char *SSL_get_ex_data(const SSL *ssl, int idx); + +/** + * @brief get index of the SSL extra data X509 storage context + * + * @param none + * + * @return data index + */ +int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +/** + * @brief get peer certification chain + * + * @param ssl - SSL point + * + * @return certification chain + */ +STACK *SSL_get_peer_cert_chain(const SSL *ssl); + +/** + * @brief get peer certification + * + * @param ssl - SSL point + * + * @return certification + */ +X509 *SSL_get_peer_certificate(const SSL *ssl); + +/** + * @brief get SSL quiet shutdown mode + * + * @param ssl - SSL point + * + * @return quiet shutdown mode + */ +int SSL_get_quiet_shutdown(const SSL *ssl); + +/** + * @brief get SSL read only IO handle + * + * @param ssl - SSL point + * + * @return IO handle + */ +BIO *SSL_get_rbio(const SSL *ssl); + +/** + * @brief get SSL shared ciphers + * + * @param ssl - SSL point + * @param buf - buffer to store the ciphers + * @param len - buffer len + * + * @return shared ciphers + */ +char *SSL_get_shared_ciphers(const SSL *ssl, char *buf, int len); + +/** + * @brief get SSL shutdown mode + * + * @param ssl - SSL point + * + * @return shutdown mode + */ +int SSL_get_shutdown(const SSL *ssl); + +/** + * @brief get SSL session time + * + * @param ssl - SSL point + * + * @return session time + */ +long SSL_get_time(const SSL *ssl); + +/** + * @brief get SSL session timeout time + * + * @param ssl - SSL point + * + * @return session timeout time + */ +long SSL_get_timeout(const SSL *ssl); + +/** + * @brief get SSL verifying mode + * + * @param ssl - SSL point + * + * @return verifying mode + */ +int SSL_get_verify_mode(const SSL *ssl); + +/** + * @brief get SSL write only IO handle + * + * @param ssl - SSL point + * + * @return IO handle + */ +BIO *SSL_get_wbio(const SSL *ssl); + +/** + * @brief load SSL client CA certification file + * + * @param file - file name + * + * @return certification loading object + */ +STACK *SSL_load_client_CA_file(const char *file); + +/** + * @brief add SSL reference by '1' + * + * @param ssl - SSL point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_up_ref(SSL *ssl); + +/** + * @brief read and put data into buf, but not clear the SSL low-level storage + * + * @param ssl - SSL point + * @param buf - storage buffer point + * @param num - data bytes + * + * @return result + * > 0 : OK, and return read bytes + * = 0 : connect is closed + * < 0 : a error catch + */ +int SSL_peek(SSL *ssl, void *buf, int num); + +/** + * @brief make SSL renegotiate + * + * @param ssl - SSL point + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_renegotiate(SSL *ssl); + +/** + * @brief get the state string where SSL is reading + * + * @param ssl - SSL point + * + * @return state string + */ +const char *SSL_rstate_string(SSL *ssl); + +/** + * @brief get the statement long string where SSL is reading + * + * @param ssl - SSL point + * + * @return statement long string + */ +const char *SSL_rstate_string_long(SSL *ssl); + +/** + * @brief set SSL accept statement + * + * @param ssl - SSL point + * + * @return none + */ +void SSL_set_accept_state(SSL *ssl); + +/** + * @brief set SSL application data + * + * @param ssl - SSL point + * @param arg - SSL application data point + * + * @return none + */ +void SSL_set_app_data(SSL *ssl, char *arg); + +/** + * @brief set SSL BIO + * + * @param ssl - SSL point + * @param rbio - read only IO + * @param wbio - write only IO + * + * @return none + */ +void SSL_set_bio(SSL *ssl, BIO *rbio, BIO *wbio); + +/** + * @brief clear SSL option + * + * @param ssl - SSL point + * @param op - clear option + * + * @return SSL option + */ +unsigned long SSL_clear_options(SSL *ssl, unsigned long op); + +/** + * @brief get SSL option + * + * @param ssl - SSL point + * + * @return SSL option + */ +unsigned long SSL_get_options(SSL *ssl); + +/** + * @brief clear SSL option + * + * @param ssl - SSL point + * @param op - setting option + * + * @return SSL option + */ +unsigned long SSL_set_options(SSL *ssl, unsigned long op); + +/** + * @brief set SSL quiet shutdown mode + * + * @param ssl - SSL point + * @param mode - quiet shutdown mode + * + * @return none + */ +void SSL_set_quiet_shutdown(SSL *ssl, int mode); + +/** + * @brief set SSL shutdown mode + * + * @param ssl - SSL point + * @param mode - shutdown mode + * + * @return none + */ +void SSL_set_shutdown(SSL *ssl, int mode); + +/** + * @brief set SSL session time + * + * @param ssl - SSL point + * @param t - session time + * + * @return session time + */ +void SSL_set_time(SSL *ssl, long t); + +/** + * @brief set SSL session timeout time + * + * @param ssl - SSL point + * @param t - session timeout time + * + * @return session timeout time + */ +void SSL_set_timeout(SSL *ssl, long t); + +/** + * @brief get SSL statement string + * + * @param ssl - SSL point + * + * @return SSL statement string + */ +char *SSL_state_string(const SSL *ssl); + +/** + * @brief get SSL statement long string + * + * @param ssl - SSL point + * + * @return SSL statement long string + */ +char *SSL_state_string_long(const SSL *ssl); + +/** + * @brief get SSL renegotiation count + * + * @param ssl - SSL point + * + * @return renegotiation count + */ +long SSL_total_renegotiations(SSL *ssl); + +/** + * @brief get SSL version + * + * @param ssl - SSL point + * + * @return SSL version + */ +int SSL_version(const SSL *ssl); + +/** + * @brief set SSL PSK identity hint + * + * @param ssl - SSL point + * @param hint - identity hint + * + * @return result + * 1 : OK + * 0 : failed + */ +int SSL_use_psk_identity_hint(SSL *ssl, const char *hint); + +/** + * @brief get SSL PSK identity hint + * + * @param ssl - SSL point + * + * @return identity hint + */ +const char *SSL_get_psk_identity_hint(SSL *ssl); + +/** + * @brief get SSL PSK identity + * + * @param ssl - SSL point + * + * @return identity + */ +const char *SSL_get_psk_identity(SSL *ssl); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/openssl/include/platform/ssl_opt.h b/components/openssl/include/platform/ssl_opt.h new file mode 100644 index 000000000..01d438eb8 --- /dev/null +++ b/components/openssl/include/platform/ssl_opt.h @@ -0,0 +1,48 @@ +// Copyright 2015-2016 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 _SSL_OPT_H_ +#define _SSL_OPT_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * if not define "ESP32_IDF_PLATFORM", system will use esp8266 platform interface + */ +#define ESP32_IDF_PLATFORM + +/** + * openssl debug print function enable + */ +#define SSL_DEBUG_ENBALE 0 + +/** + * openssl debug print function level. function whose level is lower that "SSL_DEBUG_LEVEL" + * will not print message + */ +#define SSL_DEBUG_LEVEL 0 + +/** + * openssl assert function enable, it will check the input paramter and print the message + */ +#define SSL_ASSERT_ENABLE 0 + +/** + * openssl location function enable, it will print location of the positioning error + */ +#define SSL_DEBUG_LOCATION_ENABLE 0 + +#endif diff --git a/components/openssl/include/platform/ssl_pm.h b/components/openssl/include/platform/ssl_pm.h new file mode 100644 index 000000000..a516d5742 --- /dev/null +++ b/components/openssl/include/platform/ssl_pm.h @@ -0,0 +1,56 @@ +// Copyright 2015-2016 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 _SSL_PM_H_ +#define _SSL_PM_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ssl_types.h" +#include "ssl_port.h" + +#define LOCAL_ATRR + +int ssl_pm_new(SSL *ssl); +void ssl_pm_free(SSL *ssl); + +int ssl_pm_handshake(SSL *ssl); +int ssl_pm_shutdown(SSL *ssl); +int ssl_pm_clear(SSL *ssl); + +int ssl_pm_read(SSL *ssl, void *buffer, int len); +int ssl_pm_send(SSL *ssl, const void *buffer, int len); +int ssl_pm_pending(const SSL *ssl); + +void ssl_pm_set_fd(SSL *ssl, int fd, int mode); +int ssl_pm_get_fd(const SSL *ssl, int mode); + +OSSL_HANDSHAKE_STATE ssl_pm_get_state(const SSL *ssl); + +void ssl_pm_set_bufflen(SSL *ssl, int len); + +int x509_pm_show_info(X509 *x); +int x509_pm_new(X509 *x, X509 *m_x); +void x509_pm_free(X509 *x); +int x509_pm_load(X509 *x, const unsigned char *buffer, int len); + +int pkey_pm_new(EVP_PKEY *pk, EVP_PKEY *m_pk); +void pkey_pm_free(EVP_PKEY *pk); +int pkey_pm_load(EVP_PKEY *pk, const unsigned char *buffer, int len); + +long ssl_pm_get_verify_result(const SSL *ssl); + +#endif diff --git a/components/openssl/include/platform/ssl_port.h b/components/openssl/include/platform/ssl_port.h new file mode 100644 index 000000000..35c8dc18f --- /dev/null +++ b/components/openssl/include/platform/ssl_port.h @@ -0,0 +1,49 @@ +// Copyright 2015-2016 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 _SSL_PORT_H_ +#define _SSL_PORT_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "platform/ssl_opt.h" + +#ifdef ESP32_IDF_PLATFORM + +#include "esp_types.h" +#include "esp_log.h" + +void *ssl_mem_zalloc(size_t size); +void *ssl_mem_malloc(size_t size); +void ssl_mem_free(void *p); + +void* ssl_memcpy(void *to, const void *from, size_t size); +size_t ssl_strlen(const char *src); + +void ssl_speed_up_enter(void); +void ssl_speed_up_exit(void); + +#define SSL_PRINT_LOG(fmt, ...) ESP_LOGD("openssl", fmt, ##__VA_ARGS__) +#define SSL_ERROR_LOG(fmt, ...) ESP_LOGE("openssl", fmt, ##__VA_ARGS__) +#define SSL_LOCAL_LOG(fmt, ...) ESP_LOGD("openssl", fmt, ##__VA_ARGS__) + +#elif defined(SSL_PLATFORM_USER_INCLUDE) + +SSL_PLATFORM_USER_INCLUDE + +#endif + +#endif diff --git a/components/openssl/library/ssl_cert.c b/components/openssl/library/ssl_cert.c new file mode 100644 index 000000000..0193a441e --- /dev/null +++ b/components/openssl/library/ssl_cert.c @@ -0,0 +1,79 @@ +// Copyright 2015-2016 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. + +#include "ssl_cert.h" +#include "ssl_pkey.h" +#include "ssl_x509.h" +#include "ssl_dbg.h" +#include "ssl_port.h" + +/** + * @brief create a certification object according to input certification + */ +CERT *__ssl_cert_new(CERT *ic) +{ + CERT *cert; + + X509 *ix; + EVP_PKEY *ipk; + + cert = ssl_mem_zalloc(sizeof(CERT)); + if (!cert) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + if (ic) { + ipk = ic->pkey; + ix = ic->x509; + } else { + ipk = NULL; + ix = NULL; + } + + cert->pkey = __EVP_PKEY_new(ipk); + if (!cert->pkey) + SSL_RET(failed2, "__EVP_PKEY_new\n"); + + cert->x509 = __X509_new(ix); + if (!cert->x509) + SSL_RET(failed3, "__X509_new\n"); + + return cert; + +failed3: + EVP_PKEY_free(cert->pkey); +failed2: + ssl_mem_free(cert); +failed1: + return NULL; +} + +/** + * @brief create a certification object include private key object + */ +CERT *ssl_cert_new(void) +{ + return __ssl_cert_new(NULL); +} + +/** + * @brief free a certification object + */ +void ssl_cert_free(CERT *cert) +{ + X509_free(cert->x509); + + EVP_PKEY_free(cert->pkey); + + ssl_mem_free(cert); +} diff --git a/components/openssl/library/ssl_lib.c b/components/openssl/library/ssl_lib.c new file mode 100644 index 000000000..23b8bf4ce --- /dev/null +++ b/components/openssl/library/ssl_lib.c @@ -0,0 +1,1506 @@ +// Copyright 2015-2016 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. + +#include "ssl_lib.h" +#include "ssl_pkey.h" +#include "ssl_x509.h" +#include "ssl_cert.h" +#include "ssl_dbg.h" +#include "ssl_port.h" + +#define SSL_SEND_DATA_MAX_LENGTH 1460 + +/** + * @brief Discover whether the current connection is in the error state + */ +int ossl_statem_in_error(const SSL *ssl) +{ + if (ssl->statem.state == MSG_FLOW_ERROR) + return 1; + + return 0; +} + +/** + * @brief get the SSL specifical statement + */ +int SSL_want(const SSL *ssl) +{ + return ssl->rwstate; +} + +/** + * @brief check if SSL want nothing + */ +int SSL_want_nothing(const SSL *ssl) +{ + return (SSL_want(ssl) == SSL_NOTHING); +} + +/** + * @brief check if SSL want to read + */ +int SSL_want_read(const SSL *ssl) +{ + return (SSL_want(ssl) == SSL_READING); +} + +/** + * @brief check if SSL want to write + */ +int SSL_want_write(const SSL *ssl) +{ + return (SSL_want(ssl) == SSL_WRITING); +} + +/** + * @brief check if SSL want to lookup X509 certification + */ +int SSL_want_x509_lookup(const SSL *ssl) +{ + return (SSL_want(ssl) == SSL_WRITING); +} + +/** + * @brief get SSL error code + */ +int SSL_get_error(const SSL *ssl, int ret_code) +{ + int ret = SSL_ERROR_SYSCALL; + + SSL_ASSERT(ssl); + + if (ret_code > 0) + ret = SSL_ERROR_NONE; + else if (ret_code < 0) + { + if (SSL_want_read(ssl)) + ret = SSL_ERROR_WANT_READ; + else if (SSL_want_write(ssl)) + ret = SSL_ERROR_WANT_WRITE; + else + ret = SSL_ERROR_SYSCALL; //unknown + } + else // ret_code == 0 + { + if (ssl->shutdown & SSL_RECEIVED_SHUTDOWN) + ret = SSL_ERROR_ZERO_RETURN; + else + ret = SSL_ERROR_SYSCALL; + } + + return ret; +} + +/** + * @brief get the SSL state + */ +OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl) +{ + OSSL_HANDSHAKE_STATE state; + + SSL_ASSERT(ssl); + + state = SSL_METHOD_CALL(get_state, ssl); + + return state; +} + +/** + * @brief create a new SSL session object + */ +SSL_SESSION* SSL_SESSION_new(void) +{ + SSL_SESSION *session; + + session = ssl_mem_zalloc(sizeof(SSL_SESSION)); + if (!session) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + session->peer = X509_new(); + if (!session->peer) + SSL_RET(failed2, "X509_new\n"); + + return session; + +failed2: + ssl_mem_free(session); +failed1: + return NULL; +} + +/** + * @brief free a new SSL session object + */ +void SSL_SESSION_free(SSL_SESSION *session) +{ + X509_free(session->peer); + ssl_mem_free(session); +} + +/** + * @brief create a SSL context + */ +SSL_CTX* SSL_CTX_new(const SSL_METHOD *method) +{ + SSL_CTX *ctx; + CERT *cert; + X509 *client_ca; + + if (!method) SSL_RET(go_failed1, "method:NULL\n"); + + client_ca = X509_new(); + if (!client_ca) + SSL_RET(go_failed1, "X509_new\n"); + + cert = ssl_cert_new(); + if (!cert) + SSL_RET(go_failed2, "ssl_cert_new\n"); + + ctx = (SSL_CTX *)ssl_mem_zalloc(sizeof(SSL_CTX)); + if (!ctx) + SSL_RET(go_failed3, "ssl_mem_zalloc:ctx\n"); + + ctx->method = method; + ctx->client_CA = client_ca; + ctx->cert = cert; + + ctx->version = method->version; + + return ctx; + +go_failed3: + ssl_cert_free(cert); +go_failed2: + X509_free(client_ca); +go_failed1: + return NULL; +} + +/** + * @brief free a SSL context + */ +void SSL_CTX_free(SSL_CTX* ctx) +{ + SSL_ASSERT(ctx); + + ssl_cert_free(ctx->cert); + + X509_free(ctx->client_CA); + + ssl_mem_free(ctx); +} + +/** + * @brief set the SSL context version + */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) +{ + SSL_ASSERT(ctx); + SSL_ASSERT(meth); + + ctx->method = meth; + + ctx->version = meth->version; + + return 1; +} + +/** + * @brief get the SSL context current method + */ +const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->method; +} + +/** + * @brief create a SSL + */ +SSL *SSL_new(SSL_CTX *ctx) +{ + int ret = 0; + SSL *ssl; + + if (!ctx) + SSL_RET(failed1, "ctx:NULL\n"); + + ssl = (SSL *)ssl_mem_zalloc(sizeof(SSL)); + if (!ssl) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + ssl->session = SSL_SESSION_new(); + if (!ssl->session) + SSL_RET(failed2, "SSL_SESSION_new\n"); + + ssl->cert = __ssl_cert_new(ctx->cert); + if (!ssl->cert) + SSL_RET(failed3, "__ssl_cert_new\n"); + + ssl->client_CA = __X509_new(ctx->client_CA); + if (!ssl->client_CA) + SSL_RET(failed4, "__X509_new\n"); + + ssl->ctx = ctx; + ssl->method = ctx->method; + + ssl->version = ctx->version; + ssl->options = ctx->options; + + ssl->verify_mode = ctx->verify_mode; + + ret = SSL_METHOD_CALL(new, ssl); + if (ret) + SSL_RET(failed5, "ssl_new\n"); + + ssl->rwstate = SSL_NOTHING; + + return ssl; + +failed5: + X509_free(ssl->client_CA); +failed4: + ssl_cert_free(ssl->cert); +failed3: + SSL_SESSION_free(ssl->session); +failed2: + ssl_mem_free(ssl); +failed1: + return NULL; +} + +/** + * @brief free the SSL + */ +void SSL_free(SSL *ssl) +{ + SSL_ASSERT(ssl); + + SSL_METHOD_CALL(free, ssl); + + X509_free(ssl->client_CA); + + ssl_cert_free(ssl->cert); + + SSL_SESSION_free(ssl->session); + + ssl_mem_free(ssl); +} + +/** + * @brief perform the SSL handshake + */ +int SSL_do_handshake(SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_METHOD_CALL(handshake, ssl); + + return ret; +} + +/** + * @brief connect to the remote SSL server + */ +int SSL_connect(SSL *ssl) +{ + SSL_ASSERT(ssl); + + return SSL_do_handshake(ssl); +} + +/** + * @brief accept the remote connection + */ +int SSL_accept(SSL *ssl) +{ + SSL_ASSERT(ssl); + + return SSL_do_handshake(ssl); +} + +/** + * @brief shutdown the connection + */ +int SSL_shutdown(SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + if (SSL_get_state(ssl) != TLS_ST_OK) return 1; + + ret = SSL_METHOD_CALL(shutdown, ssl); + + return ret; +} + +/** + * @brief reset the SSL + */ +int SSL_clear(SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_shutdown(ssl); + if (1 != ret) + SSL_ERR(0, go_failed1, "SSL_shutdown\n"); + + SSL_METHOD_CALL(free, ssl); + + ret = SSL_METHOD_CALL(new, ssl); + if (!ret) + SSL_ERR(0, go_failed1, "ssl_new\n"); + + return 1; + +go_failed1: + return ret; +} + +/** + * @brief read data from to remote + */ +int SSL_read(SSL *ssl, void *buffer, int len) +{ + int ret; + + SSL_ASSERT(ssl); + SSL_ASSERT(buffer); + SSL_ASSERT(len); + + ssl->rwstate = SSL_READING; + + ret = SSL_METHOD_CALL(read, ssl, buffer, len); + + if (ret == len) + ssl->rwstate = SSL_NOTHING; + + return ret; +} + +/** + * @brief send the data to remote + */ +int SSL_write(SSL *ssl, const void *buffer, int len) +{ + int ret; + int send_bytes; + const unsigned char *pbuf; + + SSL_ASSERT(ssl); + SSL_ASSERT(buffer); + SSL_ASSERT(len); + + ssl->rwstate = SSL_WRITING; + + send_bytes = len; + pbuf = (const unsigned char *)buffer; + + do { + int bytes; + + if (send_bytes > SSL_SEND_DATA_MAX_LENGTH) + bytes = SSL_SEND_DATA_MAX_LENGTH; + else + bytes = send_bytes; + + ret = SSL_METHOD_CALL(send, ssl, buffer, bytes); + if (ret > 0) { + pbuf += ret; + send_bytes -= ret; + } + } while (ret > 0 && send_bytes); + + if (ret >= 0) { + ret = len - send_bytes; + ssl->rwstate = SSL_NOTHING; + } else + ret = -1; + + return ret; +} + +/** + * @brief get SSL context of the SSL + */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->ctx; +} + +/** + * @brief get the SSL current method + */ +const SSL_METHOD *SSL_get_ssl_method(SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->method; +} + +/** + * @brief set the SSL method + */ +int SSL_set_ssl_method(SSL *ssl, const SSL_METHOD *method) +{ + int ret; + + SSL_ASSERT(ssl); + SSL_ASSERT(method); + + if (ssl->version != method->version) { + + ret = SSL_shutdown(ssl); + if (1 != ret) + SSL_ERR(0, go_failed1, "SSL_shutdown\n"); + + SSL_METHOD_CALL(free, ssl); + + ssl->method = method; + + ret = SSL_METHOD_CALL(new, ssl); + if (!ret) + SSL_ERR(0, go_failed1, "ssl_new\n"); + } else { + ssl->method = method; + } + + + return 1; + +go_failed1: + return ret; +} + +/** + * @brief get SSL shutdown mode + */ +int SSL_get_shutdown(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->shutdown; +} + +/** + * @brief set SSL shutdown mode + */ +void SSL_set_shutdown(SSL *ssl, int mode) +{ + SSL_ASSERT(ssl); + + ssl->shutdown = mode; +} + + +/** + * @brief get the number of the bytes to be read + */ +int SSL_pending(const SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_METHOD_CALL(pending, ssl); + + return ret; +} + +/** + * @brief check if some data can be read + */ +int SSL_has_pending(const SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + if (SSL_pending(ssl)) + ret = 1; + else + ret = 0; + + return ret; +} + +/** + * @brief clear the SSL context option bit of "op" + */ +unsigned long SSL_CTX_clear_options(SSL_CTX *ctx, unsigned long op) +{ + return ctx->options &= ~op; +} + +/** + * @brief get the SSL context option + */ +unsigned long SSL_CTX_get_options(SSL_CTX *ctx) +{ + return ctx->options; +} + +/** + * @brief set the option of the SSL context + */ +unsigned long SSL_CTX_set_options(SSL_CTX *ctx, unsigned long opt) +{ + return ctx->options |= opt; +} + +/** + * @brief clear SSL option + */ +unsigned long SSL_clear_options(SSL *ssl, unsigned long op) +{ + SSL_ASSERT(ssl); + + return ssl->options & ~op; +} + +/** + * @brief get SSL option + */ +unsigned long SSL_get_options(SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->options; +} + +/** + * @brief clear SSL option + */ +unsigned long SSL_set_options(SSL *ssl, unsigned long op) +{ + SSL_ASSERT(ssl); + + return ssl->options |= op; +} + +/** + * @brief get the socket handle of the SSL + */ +int SSL_get_fd(const SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_METHOD_CALL(get_fd, ssl, 0); + + return ret; +} + +/** + * @brief get the read only socket handle of the SSL + */ +int SSL_get_rfd(const SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_METHOD_CALL(get_fd, ssl, 0); + + return ret; +} + +/** + * @brief get the write only socket handle of the SSL + */ +int SSL_get_wfd(const SSL *ssl) +{ + int ret; + + SSL_ASSERT(ssl); + + ret = SSL_METHOD_CALL(get_fd, ssl, 0); + + return ret; +} + +/** + * @brief bind the socket file description into the SSL + */ +int SSL_set_fd(SSL *ssl, int fd) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(fd >= 0); + + SSL_METHOD_CALL(set_fd, ssl, fd, 0); + + return 1; +} + +/** + * @brief bind the read only socket file description into the SSL + */ +int SSL_set_rfd(SSL *ssl, int fd) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(fd >= 0); + + SSL_METHOD_CALL(set_fd, ssl, fd, 0); + + return 1; +} + +/** + * @brief bind the write only socket file description into the SSL + */ +int SSL_set_wfd(SSL *ssl, int fd) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(fd >= 0); + + SSL_METHOD_CALL(set_fd, ssl, fd, 0); + + return 1; +} + +/** + * @brief get SSL version + */ +int SSL_version(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->version; +} + +/** + * @brief get the SSL version string + */ +static const char* ssl_protocol_to_string(int version) +{ + const char *str; + + if (version == TLS1_2_VERSION) + str = "TLSv1.2"; + else if (version == TLS1_1_VERSION) + str = "TLSv1.1"; + else if (version == TLS1_VERSION) + str = "TLSv1"; + else if (version == SSL3_VERSION) + str = "SSLv3"; + else + str = "unknown"; + + return str; +} + +/** + * @brief get the SSL current version + */ +const char *SSL_get_version(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl_protocol_to_string(SSL_version(ssl)); +} + +/** + * @brief get alert description string + */ +const char* SSL_alert_desc_string(int value) +{ + const char *str; + + switch (value & 0xff) + { + case SSL3_AD_CLOSE_NOTIFY: + str = "CN"; + break; + case SSL3_AD_UNEXPECTED_MESSAGE: + str = "UM"; + break; + case SSL3_AD_BAD_RECORD_MAC: + str = "BM"; + break; + case SSL3_AD_DECOMPRESSION_FAILURE: + str = "DF"; + break; + case SSL3_AD_HANDSHAKE_FAILURE: + str = "HF"; + break; + case SSL3_AD_NO_CERTIFICATE: + str = "NC"; + break; + case SSL3_AD_BAD_CERTIFICATE: + str = "BC"; + break; + case SSL3_AD_UNSUPPORTED_CERTIFICATE: + str = "UC"; + break; + case SSL3_AD_CERTIFICATE_REVOKED: + str = "CR"; + break; + case SSL3_AD_CERTIFICATE_EXPIRED: + str = "CE"; + break; + case SSL3_AD_CERTIFICATE_UNKNOWN: + str = "CU"; + break; + case SSL3_AD_ILLEGAL_PARAMETER: + str = "IP"; + break; + case TLS1_AD_DECRYPTION_FAILED: + str = "DC"; + break; + case TLS1_AD_RECORD_OVERFLOW: + str = "RO"; + break; + case TLS1_AD_UNKNOWN_CA: + str = "CA"; + break; + case TLS1_AD_ACCESS_DENIED: + str = "AD"; + break; + case TLS1_AD_DECODE_ERROR: + str = "DE"; + break; + case TLS1_AD_DECRYPT_ERROR: + str = "CY"; + break; + case TLS1_AD_EXPORT_RESTRICTION: + str = "ER"; + break; + case TLS1_AD_PROTOCOL_VERSION: + str = "PV"; + break; + case TLS1_AD_INSUFFICIENT_SECURITY: + str = "IS"; + break; + case TLS1_AD_INTERNAL_ERROR: + str = "IE"; + break; + case TLS1_AD_USER_CANCELLED: + str = "US"; + break; + case TLS1_AD_NO_RENEGOTIATION: + str = "NR"; + break; + case TLS1_AD_UNSUPPORTED_EXTENSION: + str = "UE"; + break; + case TLS1_AD_CERTIFICATE_UNOBTAINABLE: + str = "CO"; + break; + case TLS1_AD_UNRECOGNIZED_NAME: + str = "UN"; + break; + case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE: + str = "BR"; + break; + case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE: + str = "BH"; + break; + case TLS1_AD_UNKNOWN_PSK_IDENTITY: + str = "UP"; + break; + default: + str = "UK"; + break; + } + + return str; +} + +/** + * @brief get alert description long string + */ +const char* SSL_alert_desc_string_long(int value) +{ + const char *str; + + switch (value & 0xff) + { + case SSL3_AD_CLOSE_NOTIFY: + str = "close notify"; + break; + case SSL3_AD_UNEXPECTED_MESSAGE: + str = "unexpected_message"; + break; + case SSL3_AD_BAD_RECORD_MAC: + str = "bad record mac"; + break; + case SSL3_AD_DECOMPRESSION_FAILURE: + str = "decompression failure"; + break; + case SSL3_AD_HANDSHAKE_FAILURE: + str = "handshake failure"; + break; + case SSL3_AD_NO_CERTIFICATE: + str = "no certificate"; + break; + case SSL3_AD_BAD_CERTIFICATE: + str = "bad certificate"; + break; + case SSL3_AD_UNSUPPORTED_CERTIFICATE: + str = "unsupported certificate"; + break; + case SSL3_AD_CERTIFICATE_REVOKED: + str = "certificate revoked"; + break; + case SSL3_AD_CERTIFICATE_EXPIRED: + str = "certificate expired"; + break; + case SSL3_AD_CERTIFICATE_UNKNOWN: + str = "certificate unknown"; + break; + case SSL3_AD_ILLEGAL_PARAMETER: + str = "illegal parameter"; + break; + case TLS1_AD_DECRYPTION_FAILED: + str = "decryption failed"; + break; + case TLS1_AD_RECORD_OVERFLOW: + str = "record overflow"; + break; + case TLS1_AD_UNKNOWN_CA: + str = "unknown CA"; + break; + case TLS1_AD_ACCESS_DENIED: + str = "access denied"; + break; + case TLS1_AD_DECODE_ERROR: + str = "decode error"; + break; + case TLS1_AD_DECRYPT_ERROR: + str = "decrypt error"; + break; + case TLS1_AD_EXPORT_RESTRICTION: + str = "export restriction"; + break; + case TLS1_AD_PROTOCOL_VERSION: + str = "protocol version"; + break; + case TLS1_AD_INSUFFICIENT_SECURITY: + str = "insufficient security"; + break; + case TLS1_AD_INTERNAL_ERROR: + str = "internal error"; + break; + case TLS1_AD_USER_CANCELLED: + str = "user canceled"; + break; + case TLS1_AD_NO_RENEGOTIATION: + str = "no renegotiation"; + break; + case TLS1_AD_UNSUPPORTED_EXTENSION: + str = "unsupported extension"; + break; + case TLS1_AD_CERTIFICATE_UNOBTAINABLE: + str = "certificate unobtainable"; + break; + case TLS1_AD_UNRECOGNIZED_NAME: + str = "unrecognized name"; + break; + case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE: + str = "bad certificate status response"; + break; + case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE: + str = "bad certificate hash value"; + break; + case TLS1_AD_UNKNOWN_PSK_IDENTITY: + str = "unknown PSK identity"; + break; + default: + str = "unknown"; + break; + } + + return str; +} + +/** + * @brief get alert type string + */ +const char *SSL_alert_type_string(int value) +{ + const char *str; + + switch (value >> 8) + { + case SSL3_AL_WARNING: + str = "W"; + break; + case SSL3_AL_FATAL: + str = "F"; + break; + default: + str = "U"; + break; + } + + return str; +} + +/** + * @brief get alert type long string + */ +const char *SSL_alert_type_string_long(int value) +{ + const char *str; + + switch (value >> 8) + { + case SSL3_AL_WARNING: + str = "warning"; + break; + case SSL3_AL_FATAL: + str = "fatal"; + break; + default: + str = "unknown"; + break; + } + + return str; +} + +/** + * @brief get the state string where SSL is reading + */ +const char *SSL_rstate_string(SSL *ssl) +{ + const char *str; + + SSL_ASSERT(ssl); + + switch (ssl->rlayer.rstate) + { + case SSL_ST_READ_HEADER: + str = "RH"; + break; + case SSL_ST_READ_BODY: + str = "RB"; + break; + case SSL_ST_READ_DONE: + str = "RD"; + break; + default: + str = "unknown"; + break; + } + + return str; +} + +/** + * @brief get the statement long string where SSL is reading + */ +const char *SSL_rstate_string_long(SSL *ssl) +{ + const char *str = "unknown"; + + SSL_ASSERT(ssl); + + switch (ssl->rlayer.rstate) + { + case SSL_ST_READ_HEADER: + str = "read header"; + break; + case SSL_ST_READ_BODY: + str = "read body"; + break; + case SSL_ST_READ_DONE: + str = "read done"; + break; + default: + break; + } + + return str; +} + +/** + * @brief get SSL statement string + */ +char *SSL_state_string(const SSL *ssl) +{ + char *str = "UNKWN "; + + SSL_ASSERT(ssl); + + if (ossl_statem_in_error(ssl)) + str = "SSLERR"; + else + { + switch (SSL_get_state(ssl)) + { + case TLS_ST_BEFORE: + str = "PINIT "; + break; + case TLS_ST_OK: + str = "SSLOK "; + break; + case TLS_ST_CW_CLNT_HELLO: + str = "TWCH"; + break; + case TLS_ST_CR_SRVR_HELLO: + str = "TRSH"; + break; + case TLS_ST_CR_CERT: + str = "TRSC"; + break; + case TLS_ST_CR_KEY_EXCH: + str = "TRSKE"; + break; + case TLS_ST_CR_CERT_REQ: + str = "TRCR"; + break; + case TLS_ST_CR_SRVR_DONE: + str = "TRSD"; + break; + case TLS_ST_CW_CERT: + str = "TWCC"; + break; + case TLS_ST_CW_KEY_EXCH: + str = "TWCKE"; + break; + case TLS_ST_CW_CERT_VRFY: + str = "TWCV"; + break; + case TLS_ST_SW_CHANGE: + case TLS_ST_CW_CHANGE: + str = "TWCCS"; + break; + case TLS_ST_SW_FINISHED: + case TLS_ST_CW_FINISHED: + str = "TWFIN"; + break; + case TLS_ST_SR_CHANGE: + case TLS_ST_CR_CHANGE: + str = "TRCCS"; + break; + case TLS_ST_SR_FINISHED: + case TLS_ST_CR_FINISHED: + str = "TRFIN"; + break; + case TLS_ST_SW_HELLO_REQ: + str = "TWHR"; + break; + case TLS_ST_SR_CLNT_HELLO: + str = "TRCH"; + break; + case TLS_ST_SW_SRVR_HELLO: + str = "TWSH"; + break; + case TLS_ST_SW_CERT: + str = "TWSC"; + break; + case TLS_ST_SW_KEY_EXCH: + str = "TWSKE"; + break; + case TLS_ST_SW_CERT_REQ: + str = "TWCR"; + break; + case TLS_ST_SW_SRVR_DONE: + str = "TWSD"; + break; + case TLS_ST_SR_CERT: + str = "TRCC"; + break; + case TLS_ST_SR_KEY_EXCH: + str = "TRCKE"; + break; + case TLS_ST_SR_CERT_VRFY: + str = "TRCV"; + break; + case DTLS_ST_CR_HELLO_VERIFY_REQUEST: + str = "DRCHV"; + break; + case DTLS_ST_SW_HELLO_VERIFY_REQUEST: + str = "DWCHV"; + break; + default: + break; + } + } + + return str; +} + +/** + * @brief get SSL statement long string + */ +char *SSL_state_string_long(const SSL *ssl) +{ + char *str = "UNKWN "; + + SSL_ASSERT(ssl); + + if (ossl_statem_in_error(ssl)) + str = "SSLERR"; + else + { + switch (SSL_get_state(ssl)) + { + case TLS_ST_BEFORE: + str = "before SSL initialization"; + break; + case TLS_ST_OK: + str = "SSL negotiation finished successfully"; + break; + case TLS_ST_CW_CLNT_HELLO: + str = "SSLv3/TLS write client hello"; + break; + case TLS_ST_CR_SRVR_HELLO: + str = "SSLv3/TLS read server hello"; + break; + case TLS_ST_CR_CERT: + str = "SSLv3/TLS read server certificate"; + break; + case TLS_ST_CR_KEY_EXCH: + str = "SSLv3/TLS read server key exchange"; + break; + case TLS_ST_CR_CERT_REQ: + str = "SSLv3/TLS read server certificate request"; + break; + case TLS_ST_CR_SESSION_TICKET: + str = "SSLv3/TLS read server session ticket"; + break; + case TLS_ST_CR_SRVR_DONE: + str = "SSLv3/TLS read server done"; + break; + case TLS_ST_CW_CERT: + str = "SSLv3/TLS write client certificate"; + break; + case TLS_ST_CW_KEY_EXCH: + str = "SSLv3/TLS write client key exchange"; + break; + case TLS_ST_CW_CERT_VRFY: + str = "SSLv3/TLS write certificate verify"; + break; + case TLS_ST_CW_CHANGE: + case TLS_ST_SW_CHANGE: + str = "SSLv3/TLS write change cipher spec"; + break; + case TLS_ST_CW_FINISHED: + case TLS_ST_SW_FINISHED: + str = "SSLv3/TLS write finished"; + break; + case TLS_ST_CR_CHANGE: + case TLS_ST_SR_CHANGE: + str = "SSLv3/TLS read change cipher spec"; + break; + case TLS_ST_CR_FINISHED: + case TLS_ST_SR_FINISHED: + str = "SSLv3/TLS read finished"; + break; + case TLS_ST_SR_CLNT_HELLO: + str = "SSLv3/TLS read client hello"; + break; + case TLS_ST_SW_HELLO_REQ: + str = "SSLv3/TLS write hello request"; + break; + case TLS_ST_SW_SRVR_HELLO: + str = "SSLv3/TLS write server hello"; + break; + case TLS_ST_SW_CERT: + str = "SSLv3/TLS write certificate"; + break; + case TLS_ST_SW_KEY_EXCH: + str = "SSLv3/TLS write key exchange"; + break; + case TLS_ST_SW_CERT_REQ: + str = "SSLv3/TLS write certificate request"; + break; + case TLS_ST_SW_SESSION_TICKET: + str = "SSLv3/TLS write session ticket"; + break; + case TLS_ST_SW_SRVR_DONE: + str = "SSLv3/TLS write server done"; + break; + case TLS_ST_SR_CERT: + str = "SSLv3/TLS read client certificate"; + break; + case TLS_ST_SR_KEY_EXCH: + str = "SSLv3/TLS read client key exchange"; + break; + case TLS_ST_SR_CERT_VRFY: + str = "SSLv3/TLS read certificate verify"; + break; + case DTLS_ST_CR_HELLO_VERIFY_REQUEST: + str = "DTLS1 read hello verify request"; + break; + case DTLS_ST_SW_HELLO_VERIFY_REQUEST: + str = "DTLS1 write hello verify request"; + break; + default: + break; + } + } + + return str; +} + +/** + * @brief set the SSL context read buffer length + */ +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len) +{ + SSL_ASSERT(ctx); + SSL_ASSERT(len); + + ctx->read_buffer_len = len; +} + +/** + * @brief set the SSL read buffer length + */ +void SSL_set_default_read_buffer_len(SSL *ssl, size_t len) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(len); + + SSL_METHOD_CALL(set_bufflen, ssl, len); +} + +/** + * @brief set the SSL information callback function + */ +void SSL_set_info_callback(SSL *ssl, void (*cb) (const SSL *ssl, int type, int val)) +{ + SSL_ASSERT(ssl); + + ssl->info_callback = cb; +} + +/** + * @brief add SSL context reference count by '1' + */ +int SSL_CTX_up_ref(SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + /** + * no support multi-thread SSL here + */ + ctx->references++; + + return 1; +} + +/** + * @brief set the SSL security level + */ +void SSL_set_security_level(SSL *ssl, int level) +{ + SSL_ASSERT(ssl); + + ssl->cert->sec_level = level; +} + +/** + * @brief get the SSL security level + */ +int SSL_get_security_level(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->cert->sec_level; +} + +/** + * @brief get the SSL verifying mode of the SSL context + */ +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->verify_mode; +} + +/** + * @brief set the session timeout time + */ +long SSL_CTX_set_timeout(SSL_CTX *ctx, long t) +{ + long l; + + SSL_ASSERT(ctx); + + l = ctx->session_timeout; + ctx->session_timeout = t; + + return l; +} + +/** + * @brief get the session timeout time + */ +long SSL_CTX_get_timeout(const SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->session_timeout; +} + +/** + * @brief set the SSL if we can read as many as data + */ +void SSL_set_read_ahead(SSL *ssl, int yes) +{ + SSL_ASSERT(ssl); + + ssl->rlayer.read_ahead = yes; +} + +/** + * @brief set the SSL context if we can read as many as data + */ +void SSL_CTX_set_read_ahead(SSL_CTX *ctx, int yes) +{ + SSL_ASSERT(ctx); + + ctx->read_ahead = yes; +} + +/** + * @brief get the SSL ahead signal if we can read as many as data + */ +int SSL_get_read_ahead(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->rlayer.read_ahead; +} + +/** + * @brief get the SSL context ahead signal if we can read as many as data + */ +long SSL_CTX_get_read_ahead(SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->read_ahead; +} + +/** + * @brief check if the SSL context can read as many as data + */ +long SSL_CTX_get_default_read_ahead(SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->read_ahead; +} + +/** + * @brief set SSL session time + */ +long SSL_set_time(SSL *ssl, long t) +{ + SSL_ASSERT(ssl); + + ssl->session->time = t; + + return t; +} + +/** + * @brief set SSL session timeout time + */ +long SSL_set_timeout(SSL *ssl, long t) +{ + SSL_ASSERT(ssl); + + ssl->session->timeout = t; + + return t; +} + +/** + * @brief get the verifying result of the SSL certification + */ +long SSL_get_verify_result(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return SSL_METHOD_CALL(get_verify_result, ssl); +} + +/** + * @brief get the SSL verifying depth of the SSL context + */ +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx) +{ + SSL_ASSERT(ctx); + + return ctx->param.depth; +} + +/** + * @brief set the SSL verify depth of the SSL context + */ +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) +{ + SSL_ASSERT(ctx); + + ctx->param.depth = depth; +} + +/** + * @brief get the SSL verifying depth of the SSL + */ +int SSL_get_verify_depth(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->param.depth; +} + +/** + * @brief set the SSL verify depth of the SSL + */ +void SSL_set_verify_depth(SSL *ssl, int depth) +{ + SSL_ASSERT(ssl); + + ssl->param.depth = depth; +} + +/** + * @brief set the SSL context verifying of the SSL context + */ +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*verify_callback)(int, X509_STORE_CTX *)) +{ + SSL_ASSERT(ctx); + + ctx->verify_mode = mode; + ctx->default_verify_callback = verify_callback; +} + +/** + * @brief set the SSL verifying of the SSL context + */ +void SSL_set_verify(SSL *ssl, int mode, int (*verify_callback)(int, X509_STORE_CTX *)) +{ + SSL_ASSERT(ssl); + + ssl->verify_mode = mode; + ssl->verify_callback = verify_callback; +} diff --git a/components/openssl/library/ssl_methods.c b/components/openssl/library/ssl_methods.c new file mode 100644 index 000000000..000236084 --- /dev/null +++ b/components/openssl/library/ssl_methods.c @@ -0,0 +1,81 @@ +// Copyright 2015-2016 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. + +#include "ssl_methods.h" +#include "ssl_pm.h" + +/** + * TLS method function collection + */ +IMPLEMENT_TLS_METHOD_FUNC(TLS_method_func, + ssl_pm_new, ssl_pm_free, + ssl_pm_handshake, ssl_pm_shutdown, ssl_pm_clear, + ssl_pm_read, ssl_pm_send, ssl_pm_pending, + ssl_pm_set_fd, ssl_pm_get_fd, + ssl_pm_set_bufflen, + ssl_pm_get_verify_result, + ssl_pm_get_state); + +/** + * TLS or SSL client method collection + */ +IMPLEMENT_TLS_METHOD(TLS_ANY_VERSION, 0, TLS_method_func, TLS_client_method); + +IMPLEMENT_TLS_METHOD(TLS1_2_VERSION, 0, TLS_method_func, TLSv1_2_client_method); + +IMPLEMENT_TLS_METHOD(TLS1_1_VERSION, 0, TLS_method_func, TLSv1_1_client_method); + +IMPLEMENT_TLS_METHOD(TLS1_VERSION, 0, TLS_method_func, TLSv1_client_method); + +IMPLEMENT_SSL_METHOD(SSL3_VERSION, 0, TLS_method_func, SSLv3_client_method); + +/** + * TLS or SSL server method collection + */ +IMPLEMENT_TLS_METHOD(TLS_ANY_VERSION, 1, TLS_method_func, TLS_server_method); + +IMPLEMENT_TLS_METHOD(TLS1_1_VERSION, 1, TLS_method_func, TLSv1_1_server_method); + +IMPLEMENT_TLS_METHOD(TLS1_2_VERSION, 1, TLS_method_func, TLSv1_2_server_method); + +IMPLEMENT_TLS_METHOD(TLS1_VERSION, 0, TLS_method_func, TLSv1_server_method); + +IMPLEMENT_SSL_METHOD(SSL3_VERSION, 1, TLS_method_func, SSLv3_server_method); + +/** + * TLS or SSL method collection + */ +IMPLEMENT_TLS_METHOD(TLS_ANY_VERSION, -1, TLS_method_func, TLS_method); + +IMPLEMENT_SSL_METHOD(TLS1_2_VERSION, -1, TLS_method_func, TLSv1_2_method); + +IMPLEMENT_SSL_METHOD(TLS1_1_VERSION, -1, TLS_method_func, TLSv1_1_method); + +IMPLEMENT_SSL_METHOD(TLS1_VERSION, -1, TLS_method_func, TLSv1_method); + +IMPLEMENT_SSL_METHOD(SSL3_VERSION, -1, TLS_method_func, SSLv3_method); + +/** + * @brief get X509 object method + */ +IMPLEMENT_X509_METHOD(X509_method, + x509_pm_new, x509_pm_free, + x509_pm_load, x509_pm_show_info); + +/** + * @brief get private key object method + */ +IMPLEMENT_PKEY_METHOD(EVP_PKEY_method, + pkey_pm_new, pkey_pm_free, + pkey_pm_load); diff --git a/components/openssl/library/ssl_pkey.c b/components/openssl/library/ssl_pkey.c new file mode 100644 index 000000000..dbd82dc9c --- /dev/null +++ b/components/openssl/library/ssl_pkey.c @@ -0,0 +1,220 @@ +// Copyright 2015-2016 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. + +#include "ssl_pkey.h" +#include "ssl_methods.h" +#include "ssl_dbg.h" +#include "ssl_port.h" + +/** + * @brief create a private key object according to input private key + */ +EVP_PKEY* __EVP_PKEY_new(EVP_PKEY *ipk) +{ + int ret; + EVP_PKEY *pkey; + + pkey = ssl_mem_zalloc(sizeof(EVP_PKEY)); + if (!pkey) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + if (ipk) { + pkey->method = ipk->method; + } else { + pkey->method = EVP_PKEY_method(); + } + + ret = EVP_PKEY_METHOD_CALL(new, pkey, ipk); + if (ret) + SSL_RET(failed2, "EVP_PKEY_METHOD_CALL\n"); + + return pkey; + +failed2: + ssl_mem_free(pkey); +failed1: + return NULL; +} + +/** + * @brief create a private key object + */ +EVP_PKEY* EVP_PKEY_new(void) +{ + return __EVP_PKEY_new(NULL); +} + +/** + * @brief free a private key object + */ +void EVP_PKEY_free(EVP_PKEY *pkey) +{ + EVP_PKEY_METHOD_CALL(free, pkey); + + ssl_mem_free(pkey); +} + +/** + * @brief load a character key context into system context. If '*a' is pointed to the + * private key, then load key into it. Or create a new private key object + */ +EVP_PKEY *d2i_PrivateKey(int type, + EVP_PKEY **a, + const unsigned char **pp, + long length) +{ + int m = 0; + int ret; + EVP_PKEY *pkey; + + SSL_ASSERT(pp); + SSL_ASSERT(*pp); + SSL_ASSERT(length); + + if (a && *a) { + pkey = *a; + } else { + pkey = EVP_PKEY_new();; + if (!pkey) + SSL_RET(failed1, "EVP_PKEY_new\n"); + m = 1; + } + + ret = EVP_PKEY_METHOD_CALL(load, pkey, *pp, length); + if (ret) + SSL_RET(failed2, "EVP_PKEY_METHOD_CALL\n"); + + if (a) + *a = pkey; + + return pkey; + +failed2: + if (m) + EVP_PKEY_free(pkey); +failed1: + return NULL; +} + +/** + * @brief set the SSL context private key + */ +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey) +{ + SSL_ASSERT(ctx); + SSL_ASSERT(pkey); + + if (ctx->cert->pkey == pkey) + return 1; + + if (ctx->cert->pkey) + EVP_PKEY_free(ctx->cert->pkey); + + ctx->cert->pkey = pkey; + + return 1; +} + +/** + * @brief set the SSL private key + */ +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(pkey); + + if (ssl->cert->pkey == pkey) + return 1; + + if (ssl->cert->pkey) + EVP_PKEY_free(ssl->cert->pkey); + + ssl->cert->pkey = pkey; + + return 1; +} + +/** + * @brief load private key into the SSL context + */ +int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, + const unsigned char *d, long len) +{ + int ret; + EVP_PKEY *pk; + + pk = d2i_PrivateKey(0, NULL, &d, len); + if (!pk) + SSL_RET(failed1, "d2i_PrivateKey\n"); + + ret = SSL_CTX_use_PrivateKey(ctx, pk); + if (!ret) + SSL_RET(failed2, "SSL_CTX_use_PrivateKey\n"); + + return 1; + +failed2: + EVP_PKEY_free(pk); +failed1: + return 0; +} + +/** + * @brief load private key into the SSL + */ +int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, + const unsigned char *d, long len) +{ + int ret; + EVP_PKEY *pk; + + pk = d2i_PrivateKey(0, NULL, &d, len); + if (!pk) + SSL_RET(failed1, "d2i_PrivateKey\n"); + + ret = SSL_use_PrivateKey(ssl, pk); + if (!ret) + SSL_RET(failed2, "SSL_use_PrivateKey\n"); + + return 1; + +failed2: + EVP_PKEY_free(pk); +failed1: + return 0; +} + +/** + * @brief load the private key file into SSL context + */ +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type) +{ + return 0; +} + +/** + * @brief load the private key file into SSL + */ +int SSL_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type) +{ + return 0; +} + +/** + * @brief load the RSA ASN1 private key into SSL context + */ +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len) +{ + return SSL_CTX_use_PrivateKey_ASN1(0, ctx, d, len); +} diff --git a/components/openssl/library/ssl_stack.c b/components/openssl/library/ssl_stack.c new file mode 100644 index 000000000..5dbb69af9 --- /dev/null +++ b/components/openssl/library/ssl_stack.c @@ -0,0 +1,70 @@ +// Copyright 2015-2016 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. + +#include "ssl_stack.h" +#include "ssl_dbg.h" +#include "ssl_port.h" + +#ifndef CONFIG_MIN_NODES + #define MIN_NODES 4 +#else + #define MIN_NODES CONFIG_MIN_NODES +#endif + +/** + * @brief create a openssl stack object + */ +OPENSSL_STACK* OPENSSL_sk_new(OPENSSL_sk_compfunc c) +{ + OPENSSL_STACK *stack; + char **data; + + stack = ssl_mem_zalloc(sizeof(OPENSSL_STACK)); + if (!stack) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + data = ssl_mem_zalloc(sizeof(*data) * MIN_NODES); + if (!data) + SSL_RET(failed2, "ssl_mem_zalloc\n"); + + stack->data = data; + stack->num_alloc = MIN_NODES; + stack->c = c; + + return stack; + +failed2: + ssl_mem_free(stack); +failed1: + return NULL; +} + +/** + * @brief create a NULL function openssl stack object + */ +OPENSSL_STACK *OPENSSL_sk_new_null(void) +{ + return OPENSSL_sk_new((OPENSSL_sk_compfunc)NULL); +} + +/** + * @brief free openssl stack object + */ +void OPENSSL_sk_free(OPENSSL_STACK *stack) +{ + SSL_ASSERT(stack); + + ssl_mem_free(stack->data); + ssl_mem_free(stack); +} diff --git a/components/openssl/library/ssl_x509.c b/components/openssl/library/ssl_x509.c new file mode 100644 index 000000000..d0426db18 --- /dev/null +++ b/components/openssl/library/ssl_x509.c @@ -0,0 +1,267 @@ +// Copyright 2015-2016 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. + +#include "ssl_x509.h" +#include "ssl_methods.h" +#include "ssl_dbg.h" +#include "ssl_port.h" + +/** + * @brief show X509 certification information + */ +int __X509_show_info(X509 *x) +{ + return X509_METHOD_CALL(show_info, x); +} + +/** + * @brief create a X509 certification object according to input X509 certification + */ +X509* __X509_new(X509 *ix) +{ + int ret; + X509 *x; + + x = ssl_mem_zalloc(sizeof(X509)); + if (!x) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + if (ix) + x->method = ix->method; + else + x->method = X509_method(); + + ret = X509_METHOD_CALL(new, x, ix); + if (ret) + SSL_RET(failed2, "x509_new\n"); + + return x; + +failed2: + ssl_mem_free(x); +failed1: + return NULL; +} + +/** + * @brief create a X509 certification object + */ +X509* X509_new(void) +{ + return __X509_new(NULL); +} + +/** + * @brief free a X509 certification object + */ +void X509_free(X509 *x) +{ + X509_METHOD_CALL(free, x); + + ssl_mem_free(x); +}; + +/** + * @brief load a character certification context into system context. If '*cert' is pointed to the + * certification, then load certification into it. Or create a new X509 certification object + */ +X509* d2i_X509(X509 **cert, const unsigned char *buffer, long len) +{ + int m = 0; + int ret; + X509 *x; + + SSL_ASSERT(buffer); + SSL_ASSERT(len); + + if (cert && *cert) { + x = *cert; + } else { + x = X509_new(); + if (!x) + SSL_RET(failed1, "X509_new\n"); + m = 1; + } + + ret = X509_METHOD_CALL(load, x, buffer, len); + if (ret) + SSL_RET(failed2, "x509_load\n"); + + return x; + +failed2: + if (m) + X509_free(x); +failed1: + return NULL; +} + +/** + * @brief set SSL context client CA certification + */ +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x) +{ + SSL_ASSERT(ctx); + SSL_ASSERT(x); + + if (ctx->client_CA == x) + return 1; + + X509_free(ctx->client_CA); + + ctx->client_CA = x; + + return 1; +} + +/** + * @brief add CA client certification into the SSL + */ +int SSL_add_client_CA(SSL *ssl, X509 *x) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(x); + + if (ssl->client_CA == x) + return 1; + + X509_free(ssl->client_CA); + + ssl->client_CA = x; + + return 1; +} + +/** + * @brief set the SSL context certification + */ +int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x) +{ + SSL_ASSERT(ctx); + SSL_ASSERT(x); + + if (ctx->cert->x509 == x) + return 1; + + X509_free(ctx->cert->x509); + + ctx->cert->x509 = x; + + return 1; +} + +/** + * @brief set the SSL certification + */ +int SSL_use_certificate(SSL *ssl, X509 *x) +{ + SSL_ASSERT(ssl); + SSL_ASSERT(x); + + if (ssl->cert->x509 == x) + return 1; + + X509_free(ssl->cert->x509); + + ssl->cert->x509 = x; + + return 1; +} + +/** + * @brief get the SSL certification point + */ +X509 *SSL_get_certificate(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->cert->x509; +} + +/** + * @brief load certification into the SSL context + */ +int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d) +{ + int ret; + X509 *x; + + x = d2i_X509(NULL, d, len); + if (!x) + SSL_RET(failed1, "d2i_X509\n"); + + ret = SSL_CTX_use_certificate(ctx, x); + if (!ret) + SSL_RET(failed2, "SSL_CTX_use_certificate\n"); + + return 1; + +failed2: + X509_free(x); +failed1: + return 0; +} + +/** + * @brief load certification into the SSL + */ +int SSL_use_certificate_ASN1(SSL *ssl, int len, + const unsigned char *d) +{ + int ret; + X509 *x; + + x = d2i_X509(NULL, d, len); + if (!x) + SSL_RET(failed1, "d2i_X509\n"); + + ret = SSL_use_certificate(ssl, x); + if (!ret) + SSL_RET(failed2, "SSL_use_certificate\n"); + + return 1; + +failed2: + X509_free(x); +failed1: + return 0; +} + +/** + * @brief load the certification file into SSL context + */ +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type) +{ + return 0; +} + +/** + * @brief load the certification file into SSL + */ +int SSL_use_certificate_file(SSL *ssl, const char *file, int type) +{ + return 0; +} + +/** + * @brief get peer certification + */ +X509 *SSL_get_peer_certificate(const SSL *ssl) +{ + SSL_ASSERT(ssl); + + return ssl->session->peer; +} + diff --git a/components/openssl/platform/ssl_pm.c b/components/openssl/platform/ssl_pm.c new file mode 100644 index 000000000..a5986dc3e --- /dev/null +++ b/components/openssl/platform/ssl_pm.c @@ -0,0 +1,626 @@ +// Copyright 2015-2016 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. + +#include "ssl_pm.h" +#include "ssl_port.h" +#include "ssl_dbg.h" + +/* mbedtls include */ +#include "mbedtls/platform.h" +#include "mbedtls/net.h" +#include "mbedtls/debug.h" +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" +#include "mbedtls/error.h" +#include "mbedtls/certs.h" + +#if 0 + #define DEBUG_LOAD_BUF_STRING(str) SSL_DEBUG(1, "%s\n", str) +#else + #define DEBUG_LOAD_BUF_STRING(str) +#endif + +#define X509_INFO_STRING_LENGTH 1024 + +struct ssl_pm +{ + /* local socket file description */ + mbedtls_net_context fd; + /* remote client socket file description */ + mbedtls_net_context cl_fd; + + mbedtls_ssl_config conf; + + mbedtls_ctr_drbg_context ctr_drbg; + + mbedtls_ssl_context ssl; + + mbedtls_entropy_context entropy; +}; + +struct x509_pm +{ + mbedtls_x509_crt *x509_crt; + + mbedtls_x509_crt *ex_crt; +}; + +struct pkey_pm +{ + mbedtls_pk_context *pkey; + + mbedtls_pk_context *ex_pkey; +}; + + +unsigned int max_content_len; + + +/*********************************************************************************************/ +/************************************ SSL arch interface *************************************/ + +/** + * @brief create SSL low-level object + */ +int ssl_pm_new(SSL *ssl) +{ + struct ssl_pm *ssl_pm; + int ret; + + const unsigned char pers[] = "OpenSSL PM"; + size_t pers_len = sizeof(pers); + + int endpoint; + int version; + + const SSL_METHOD *method = ssl->method; + + ssl_pm = ssl_mem_zalloc(sizeof(struct ssl_pm)); + if (!ssl_pm) + SSL_ERR(ret, failed1, "ssl_mem_zalloc\n"); + + max_content_len = ssl->ctx->read_buffer_len; + + mbedtls_net_init(&ssl_pm->fd); + mbedtls_net_init(&ssl_pm->cl_fd); + + mbedtls_ssl_config_init(&ssl_pm->conf); + mbedtls_ctr_drbg_init(&ssl_pm->ctr_drbg); + mbedtls_entropy_init(&ssl_pm->entropy); + mbedtls_ssl_init(&ssl_pm->ssl); + + ret = mbedtls_ctr_drbg_seed(&ssl_pm->ctr_drbg, mbedtls_entropy_func, &ssl_pm->entropy, pers, pers_len); + if (ret) + SSL_ERR(ret, failed2, "mbedtls_ctr_drbg_seed:[-0x%x]\n", -ret); + + if (method->endpoint) { + endpoint = MBEDTLS_SSL_IS_SERVER; + } else { + endpoint = MBEDTLS_SSL_IS_CLIENT; + } + ret = mbedtls_ssl_config_defaults(&ssl_pm->conf, endpoint, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); + if (ret) + SSL_ERR(ret, failed2, "mbedtls_ssl_config_defaults:[-0x%x]\n", -ret); + + if (TLS_ANY_VERSION != ssl->version) { + if (TLS1_2_VERSION == ssl->version) + version = MBEDTLS_SSL_MINOR_VERSION_3; + else if (TLS1_1_VERSION == ssl->version) + version = MBEDTLS_SSL_MINOR_VERSION_2; + else if (TLS1_VERSION == ssl->version) + version = MBEDTLS_SSL_MINOR_VERSION_1; + else + version = MBEDTLS_SSL_MINOR_VERSION_0; + + mbedtls_ssl_conf_max_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, version); + mbedtls_ssl_conf_min_version(&ssl_pm->conf, MBEDTLS_SSL_MAJOR_VERSION_3, version); + } + + mbedtls_ssl_conf_rng(&ssl_pm->conf, mbedtls_ctr_drbg_random, &ssl_pm->ctr_drbg); + + mbedtls_ssl_conf_dbg(&ssl_pm->conf, NULL, NULL); + + ret = mbedtls_ssl_setup(&ssl_pm->ssl, &ssl_pm->conf); + if (ret) + SSL_ERR(ret, failed3, "mbedtls_ssl_setup:[-0x%x]\n", -ret); + + mbedtls_ssl_set_bio(&ssl_pm->ssl, &ssl_pm->fd, mbedtls_net_send, mbedtls_net_recv, NULL); + + ssl->ssl_pm = ssl_pm; + + return 0; + +failed3: + mbedtls_ssl_config_free(&ssl_pm->conf); + mbedtls_ctr_drbg_free(&ssl_pm->ctr_drbg); +failed2: + mbedtls_entropy_free(&ssl_pm->entropy); + ssl_mem_free(ssl_pm); +failed1: + return -1; +} + +/** + * @brief free SSL low-level object + */ +void ssl_pm_free(SSL *ssl) +{ + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + mbedtls_ctr_drbg_free(&ssl_pm->ctr_drbg); + mbedtls_entropy_free(&ssl_pm->entropy); + mbedtls_ssl_config_free(&ssl_pm->conf); + mbedtls_ssl_free(&ssl_pm->ssl); + + ssl_mem_free(ssl_pm); + ssl->ssl_pm = NULL; +} + +/** + * @brief reload SSL low-level certification object + */ +static int ssl_pm_reload_crt(SSL *ssl) +{ + int ret; + int mode; + struct ssl_pm *ssl_pm = ssl->ssl_pm; + struct x509_pm *ca_pm = (struct x509_pm *)ssl->client_CA->x509_pm; + + struct pkey_pm *pkey_pm = (struct pkey_pm *)ssl->cert->pkey->pkey_pm; + struct x509_pm *crt_pm = (struct x509_pm *)ssl->cert->x509->x509_pm; + + if (ssl->verify_mode == SSL_VERIFY_PEER) + mode = MBEDTLS_SSL_VERIFY_REQUIRED; + else if (ssl->verify_mode == SSL_VERIFY_FAIL_IF_NO_PEER_CERT) + mode = MBEDTLS_SSL_VERIFY_OPTIONAL; + else if (ssl->verify_mode == SSL_VERIFY_CLIENT_ONCE) + mode = MBEDTLS_SSL_VERIFY_UNSET; + else + mode = MBEDTLS_SSL_VERIFY_NONE; + + mbedtls_ssl_conf_authmode(&ssl_pm->conf, mode); + + if (ca_pm->x509_crt) { + mbedtls_ssl_conf_ca_chain(&ssl_pm->conf, ca_pm->x509_crt, NULL); + } else if (ca_pm->ex_crt) { + mbedtls_ssl_conf_ca_chain(&ssl_pm->conf, ca_pm->ex_crt, NULL); + } + + if (crt_pm->x509_crt && pkey_pm->pkey) { + ret = mbedtls_ssl_conf_own_cert(&ssl_pm->conf, crt_pm->x509_crt, pkey_pm->pkey); + } else if (crt_pm->ex_crt && pkey_pm->ex_pkey) { + ret = mbedtls_ssl_conf_own_cert(&ssl_pm->conf, crt_pm->ex_crt, pkey_pm->ex_pkey); + } else { + ret = 0; + } + + if (ret) + return -1; + + return 0; +} + +/* + * Perform the mbedtls SSL handshake instead of mbedtls_ssl_handshake. + * We can add debug here. + */ +LOCAL int mbedtls_handshake( mbedtls_ssl_context *ssl ) +{ + int ret = 0; + + if (ssl == NULL || ssl->conf == NULL) + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + + while (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) + { + ret = mbedtls_ssl_handshake_step(ssl); + + SSL_DEBUG(1, "ssl ret %d state %d heap %d\n", + ret, ssl->state, system_get_free_heap_size()); + + if (ret != 0) + break; + } + + return ret; +} + +int ssl_pm_handshake(SSL *ssl) +{ + int ret, mbed_ret; + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + mbed_ret = ssl_pm_reload_crt(ssl); + if (mbed_ret) + return 0; + + SSL_DEBUG(1, "ssl_speed_up_enter "); + ssl_speed_up_enter(); + SSL_DEBUG(1, "OK\n"); + + while((mbed_ret = mbedtls_handshake(&ssl_pm->ssl)) != 0) { + if (mbed_ret != MBEDTLS_ERR_SSL_WANT_READ && mbed_ret != MBEDTLS_ERR_SSL_WANT_WRITE) { + break; + } + } + + SSL_DEBUG(1, "ssl_speed_up_exit "); + ssl_speed_up_exit(); + SSL_DEBUG(1, "OK\n"); + + if (!mbed_ret) { + struct x509_pm *x509_pm = (struct x509_pm *)ssl->session->peer->x509_pm; + + ret = 1; + + x509_pm->ex_crt = (mbedtls_x509_crt *)mbedtls_ssl_get_peer_cert(&ssl_pm->ssl); + } else { + ret = 0; + SSL_DEBUG(1, "mbedtls_ssl_handshake [-0x%x]\n", -mbed_ret); + } + + return ret; +} + +int ssl_pm_shutdown(SSL *ssl) +{ + int ret, mbed_ret; + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + mbed_ret = mbedtls_ssl_close_notify(&ssl_pm->ssl); + if (!mbed_ret) { + struct x509_pm *x509_pm = (struct x509_pm *)ssl->session->peer->x509_pm; + + ret = 0; + + x509_pm->ex_crt = NULL; + } + else + ret = -1; + + return ret; +} + +int ssl_pm_clear(SSL *ssl) +{ + return ssl_pm_shutdown(ssl); +} + + +int ssl_pm_read(SSL *ssl, void *buffer, int len) +{ + int ret, mbed_ret; + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + mbed_ret = mbedtls_ssl_read(&ssl_pm->ssl, buffer, len); + if (mbed_ret < 0) + ret = -1; + else if (mbed_ret == 0) + ret = 0; + else + ret = mbed_ret; + + return ret; +} + +int ssl_pm_send(SSL *ssl, const void *buffer, int len) +{ + int ret, mbed_ret; + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + mbed_ret = mbedtls_ssl_write(&ssl_pm->ssl, buffer, len); + if (mbed_ret < 0) + ret = -1; + else if (mbed_ret == 0) + ret = 0; + else + ret = mbed_ret; + + return ret; +} + +int ssl_pm_pending(const SSL *ssl) +{ + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + return mbedtls_ssl_get_bytes_avail(&ssl_pm->ssl); +} + +void ssl_pm_set_fd(SSL *ssl, int fd, int mode) +{ + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + ssl_pm->fd.fd = fd; +} + +int ssl_pm_get_fd(const SSL *ssl, int mode) +{ + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + return ssl_pm->fd.fd; +} + +OSSL_HANDSHAKE_STATE ssl_pm_get_state(const SSL *ssl) +{ + OSSL_HANDSHAKE_STATE state; + + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + switch (ssl_pm->ssl.state) + { + case MBEDTLS_SSL_CLIENT_HELLO: + state = TLS_ST_CW_CLNT_HELLO; + break; + case MBEDTLS_SSL_SERVER_HELLO: + state = TLS_ST_SW_SRVR_HELLO; + break; + case MBEDTLS_SSL_SERVER_CERTIFICATE: + state = TLS_ST_SW_CERT; + break; + case MBEDTLS_SSL_SERVER_HELLO_DONE: + state = TLS_ST_SW_SRVR_DONE; + break; + case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: + state = TLS_ST_CW_KEY_EXCH; + break; + case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: + state = TLS_ST_CW_CHANGE; + break; + case MBEDTLS_SSL_CLIENT_FINISHED: + state = TLS_ST_CW_FINISHED; + break; + case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: + state = TLS_ST_SW_CHANGE; + break; + case MBEDTLS_SSL_SERVER_FINISHED: + state = TLS_ST_SW_FINISHED; + break; + case MBEDTLS_SSL_CLIENT_CERTIFICATE: + state = TLS_ST_CW_CERT; + break; + case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: + state = TLS_ST_SR_KEY_EXCH; + break; + case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET: + state = TLS_ST_SW_SESSION_TICKET; + break; + case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT: + state = TLS_ST_SW_CERT_REQ; + break; + case MBEDTLS_SSL_HANDSHAKE_OVER: + state = TLS_ST_OK; + break; + default : + state = TLS_ST_BEFORE; + break; + } + + return state; +} + +int x509_pm_show_info(X509 *x) +{ + int ret; + char *buf; + mbedtls_x509_crt *x509_crt; + struct x509_pm *x509_pm = x->x509_pm; + + if (x509_pm->x509_crt) + x509_crt = x509_pm->x509_crt; + else if (x509_pm->ex_crt) + x509_crt = x509_pm->ex_crt; + else + x509_crt = NULL; + + if (!x509_crt) + return -1; + + buf = ssl_mem_malloc(X509_INFO_STRING_LENGTH); + if (!buf) + SSL_RET(failed1, ""); + + ret = mbedtls_x509_crt_info(buf, X509_INFO_STRING_LENGTH - 1, "", x509_crt); + if (ret <= 0) + SSL_RET(failed2, ""); + buf[ret] = 0; + + ssl_mem_free(buf); + + SSL_DEBUG(1, "%s", buf); + + return 0; + +failed2: + ssl_mem_free(buf); +failed1: + return -1; +} + +int x509_pm_new(X509 *x, X509 *m_x) +{ + struct x509_pm *x509_pm; + + x509_pm = ssl_mem_zalloc(sizeof(struct x509_pm)); + if (!x509_pm) + SSL_RET(failed1, "ssl_mem_zalloc\n"); + + x->x509_pm = x509_pm; + + if (m_x) { + struct x509_pm *m_x509_pm = (struct x509_pm *)m_x->x509_pm; + + x509_pm->ex_crt = m_x509_pm->x509_crt; + } + + return 0; + +failed1: + return -1; +} + +void x509_pm_free(X509 *x) +{ + struct x509_pm *x509_pm = (struct x509_pm *)x->x509_pm; + + if (x509_pm->x509_crt) { + mbedtls_x509_crt_free(x509_pm->x509_crt); + + ssl_mem_free(x509_pm->x509_crt); + x509_pm->x509_crt = NULL; + } + + ssl_mem_free(x->x509_pm); + x->x509_pm = NULL; +} + +int x509_pm_load(X509 *x, const unsigned char *buffer, int len) +{ + int ret; + unsigned char *load_buf; + struct x509_pm *x509_pm = (struct x509_pm *)x->x509_pm; + + if (x509_pm->x509_crt) + mbedtls_x509_crt_free(x509_pm->x509_crt); + + if (!x509_pm->x509_crt) { + x509_pm->x509_crt = ssl_mem_malloc(sizeof(mbedtls_x509_crt)); + if (!x509_pm->x509_crt) + SSL_RET(failed1, "ssl_mem_malloc\n"); + } + + load_buf = ssl_mem_malloc(len + 1); + if (!load_buf) + SSL_RET(failed2, "ssl_mem_malloc\n"); + + ssl_memcpy(load_buf, buffer, len); + load_buf[len] = '\0'; + + DEBUG_LOAD_BUF_STRING(load_buf); + + mbedtls_x509_crt_init(x509_pm->x509_crt); + + ret = mbedtls_x509_crt_parse(x509_pm->x509_crt, load_buf, len + 1); + ssl_mem_free(load_buf); + + if (ret) + SSL_RET(failed2, "mbedtls_x509_crt_parse, return [-0x%x]\n", -ret); + + return 0; + +failed2: + mbedtls_x509_crt_free(x509_pm->x509_crt); + ssl_mem_free(x509_pm->x509_crt); + x509_pm->x509_crt = NULL; +failed1: + return -1; +} + +int pkey_pm_new(EVP_PKEY *pk, EVP_PKEY *m_pkey) +{ + struct pkey_pm *pkey_pm; + + pkey_pm = ssl_mem_zalloc(sizeof(struct pkey_pm)); + if (!pkey_pm) + return -1; + + pk->pkey_pm = pkey_pm; + + if (m_pkey) { + struct pkey_pm *m_pkey_pm = (struct pkey_pm *)m_pkey->pkey_pm; + + pkey_pm->ex_pkey = m_pkey_pm->pkey; + } + + return 0; +} + +void pkey_pm_free(EVP_PKEY *pk) +{ + struct pkey_pm *pkey_pm = (struct pkey_pm *)pk->pkey_pm; + + if (pkey_pm->pkey) { + mbedtls_pk_free(pkey_pm->pkey); + + ssl_mem_free(pkey_pm->pkey); + pkey_pm->pkey = NULL; + } + + ssl_mem_free(pk->pkey_pm); + pk->pkey_pm = NULL; +} + +int pkey_pm_load(EVP_PKEY *pk, const unsigned char *buffer, int len) +{ + int ret; + unsigned char *load_buf; + struct pkey_pm *pkey_pm = (struct pkey_pm *)pk->pkey_pm; + + if (pkey_pm->pkey) + mbedtls_pk_free(pkey_pm->pkey); + + if (!pkey_pm->pkey) { + pkey_pm->pkey = ssl_mem_malloc(sizeof(mbedtls_pk_context)); + if (!pkey_pm->pkey) + SSL_RET(failed1, "ssl_mem_malloc\n"); + } + + load_buf = ssl_mem_malloc(len + 1); + if (!load_buf) + SSL_RET(failed2, "ssl_mem_malloc\n"); + + ssl_memcpy(load_buf, buffer, len); + load_buf[len] = '\0'; + + DEBUG_LOAD_BUF_STRING(load_buf); + + mbedtls_pk_init(pkey_pm->pkey); + + ret = mbedtls_pk_parse_key(pkey_pm->pkey, load_buf, len + 1, NULL, 0); + ssl_mem_free(load_buf); + + if (ret) + SSL_RET(failed2, "mbedtls_pk_parse_key, return [-0x%x]\n", -ret); + + return 0; + +failed2: + mbedtls_pk_free(pkey_pm->pkey); + ssl_mem_free(pkey_pm->pkey); + pkey_pm->pkey = NULL; +failed1: + return -1; +} + + + +void ssl_pm_set_bufflen(SSL *ssl, int len) +{ + max_content_len = len; +} + +long ssl_pm_get_verify_result(const SSL *ssl) +{ + long ret; + long verify_result; + struct ssl_pm *ssl_pm = (struct ssl_pm *)ssl->ssl_pm; + + ret = mbedtls_ssl_get_verify_result(&ssl_pm->ssl); + + if (!ret) + verify_result = X509_V_OK; + else + verify_result = X509_V_ERR_UNSPECIFIED; + + return verify_result; +} diff --git a/components/openssl/platform/ssl_port.c b/components/openssl/platform/ssl_port.c new file mode 100644 index 000000000..ae3b849ca --- /dev/null +++ b/components/openssl/platform/ssl_port.c @@ -0,0 +1,66 @@ +// Copyright 2015-2016 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. + +#include "ssl_port.h" + +#ifdef ESP32_IDF_PLATFORM + +#include "string.h" +#include "malloc.h" + +/*********************************************************************************************/ +/********************************* SSL general interface *************************************/ + +void* ssl_mem_zalloc(size_t size) +{ + void *p = malloc(size); + + if (p) + memset(p, 0, size); + + return p; +} + +void *ssl_mem_malloc(size_t size) +{ + return malloc(size); +} + +void ssl_mem_free(void *p) +{ + free(p); +} + +void* ssl_memcpy(void *to, const void *from, size_t size) +{ + return memcpy(to, from, size); +} + +size_t ssl_strlen(const char *src) +{ + return strlen(src); +} + +void ssl_speed_up_enter(void) +{ + +} + +void ssl_speed_up_exit(void) +{ + +} + +#endif + diff --git a/components/partition_table/Kconfig.projbuild b/components/partition_table/Kconfig.projbuild index fa2685d7a..1f019a6e3 100644 --- a/components/partition_table/Kconfig.projbuild +++ b/components/partition_table/Kconfig.projbuild @@ -1,49 +1,63 @@ menu "Partition Table" choice - prompt "Partition Table" - default PARTITION_TABLE_SINGLE_APP - help - The partition table to flash to the ESP32. The partition table - determines where apps, data and other resources are expected to - be found. + prompt "Partition Table" + default PARTITION_TABLE_SINGLE_APP + help + The partition table to flash to the ESP32. The partition table + determines where apps, data and other resources are expected to + be found. - The predefined partition table CSV descriptions can be found - in the components/partition_table directory. Otherwise it's - possible to create a new custom partition CSV for your application. + The predefined partition table CSV descriptions can be found + in the components/partition_table directory. Otherwise it's + possible to create a new custom partition CSV for your application. config PARTITION_TABLE_SINGLE_APP - bool "Single factory app, no OTA" + bool "Single factory app, no OTA" config PARTITION_TABLE_TWO_OTA - bool "Factory app, two OTA definitions" + bool "Factory app, two OTA definitions" config PARTITION_TABLE_CUSTOM - bool "Custom partition table CSV" + bool "Custom partition table CSV" endchoice config PARTITION_TABLE_CUSTOM_FILENAME - string "Custom partition CSV file" if PARTITION_TABLE_CUSTOM - default partitions.csv - help - Name of the custom partition CSV filename. This path is evaluated - relative to the project root directory. + string "Custom partition CSV file" if PARTITION_TABLE_CUSTOM + default partitions.csv + help + Name of the custom partition CSV filename. This path is evaluated + relative to the project root directory. config PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET - hex "App offset in flash" if PARTITION_TABLE_CUSTOM - default 0x10000 - help - If using a custom partition table, specify the offset in the flash - where 'make flash' should write the built app. + hex "Factory app partition offset" if PARTITION_TABLE_CUSTOM + default 0x10000 + help + If using a custom partition table, specify the offset in the flash + where 'make flash' should write the built app. + +config PARTITION_TABLE_CUSTOM_PHY_DATA_OFFSET + hex "PHY data partition offset" if PARTITION_TABLE_CUSTOM + depends on ESP32_PHY_INIT_DATA_IN_PARTITION + default 0xf000 + help + If using a custom partition table, specify the offset in the flash + where 'make flash' should write the initial PHY data file. + config PARTITION_TABLE_FILENAME - string - default partitions_singleapp.csv if PARTITION_TABLE_SINGLE_APP - default partitions_two_ota.csv if PARTITION_TABLE_TWO_OTA - default PARTITION_TABLE_CUSTOM_FILENAME if PARTITION_TABLE_CUSTOM + string + default partitions_singleapp.csv if PARTITION_TABLE_SINGLE_APP + default partitions_two_ota.csv if PARTITION_TABLE_TWO_OTA + default PARTITION_TABLE_CUSTOM_FILENAME if PARTITION_TABLE_CUSTOM config APP_OFFSET - hex - default PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET if PARTITION_TABLE_CUSTOM - default 0x10000 # this is the factory app offset used by the default tables + hex + default PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET if PARTITION_TABLE_CUSTOM + default 0x10000 # this is the factory app offset used by the default tables + +config PHY_DATA_OFFSET + hex + default PARTITION_TABLE_CUSTOM_PHY_DATA_OFFSET if PARTITION_TABLE_CUSTOM + default 0xf000 # this is the factory app offset used by the default tables endmenu diff --git a/components/partition_table/Makefile.projbuild b/components/partition_table/Makefile.projbuild index 98631cc85..5bd13f766 100644 --- a/components/partition_table/Makefile.projbuild +++ b/components/partition_table/Makefile.projbuild @@ -11,6 +11,8 @@ # NB: gen_esp32part.py lives in the sdk/bin/ dir not component dir GEN_ESP32PART := $(PYTHON) $(COMPONENT_PATH)/gen_esp32part.py -q +PARTITION_TABLE_OFFSET := 0x8000 + # Path to partition CSV file is relative to project path for custom # partition CSV files, but relative to component dir otherwise.$ PARTITION_TABLE_ROOT := $(call dequote,$(if $(CONFIG_PARTITION_TABLE_CUSTOM),$(PROJECT_PATH),$(COMPONENT_PATH))) @@ -18,28 +20,38 @@ PARTITION_TABLE_CSV_PATH := $(call dequote,$(abspath $(PARTITION_TABLE_ROOT)/$(s PARTITION_TABLE_BIN := $(BUILD_DIR_BASE)/$(notdir $(PARTITION_TABLE_CSV_PATH:.csv=.bin)) -$(PARTITION_TABLE_BIN): $(PARTITION_TABLE_CSV_PATH) +ifdef CONFIG_SECURE_BOOTLOADER_ENABLED +PARTITION_TABLE_BIN_UNSIGNED := $(PARTITION_TABLE_BIN:.bin=-unsigned.bin) +# add an extra signing step for secure partition table +$(PARTITION_TABLE_BIN): $(PARTITION_TABLE_BIN_UNSIGNED) + $(Q) $(ESPSECUREPY) sign_data --keyfile $(SECURE_BOOT_SIGNING_KEY) -o $@ $< +else +# secure bootloader disabled, both files are the same +PARTITION_TABLE_BIN_UNSIGNED := $(PARTITION_TABLE_BIN) +endif + +$(PARTITION_TABLE_BIN_UNSIGNED): $(PARTITION_TABLE_CSV_PATH) $(SDKCONFIG_MAKEFILE) @echo "Building partitions from $(PARTITION_TABLE_CSV_PATH)..." - $(Q) $(GEN_ESP32PART) $< $@ + $(GEN_ESP32PART) $< $@ all_binaries: $(PARTITION_TABLE_BIN) -PARTITION_TABLE_FLASH_CMD = $(ESPTOOLPY_SERIAL) write_flash 0x4000 $(PARTITION_TABLE_BIN) -ESPTOOL_ALL_FLASH_ARGS += 0x4000 $(PARTITION_TABLE_BIN) +PARTITION_TABLE_FLASH_CMD = $(ESPTOOLPY_SERIAL) write_flash $(PARTITION_TABLE_OFFSET) $(PARTITION_TABLE_BIN) +ESPTOOL_ALL_FLASH_ARGS += $(PARTITION_TABLE_OFFSET) $(PARTITION_TABLE_BIN) partition_table: $(PARTITION_TABLE_BIN) @echo "Partition table binary generated. Contents:" @echo $(SEPARATOR) - $(Q) $(GEN_ESP32PART) $< + $(GEN_ESP32PART) $< @echo $(SEPARATOR) @echo "Partition flashing command:" @echo "$(PARTITION_TABLE_FLASH_CMD)" partition_table-flash: $(PARTITION_TABLE_BIN) @echo "Flashing partition table..." - $(Q) $(PARTITION_TABLE_FLASH_CMD) + $(PARTITION_TABLE_FLASH_CMD) partition_table-clean: - $(Q) rm -f $(PARTITION_TABLE_BIN) + rm -f $(PARTITION_TABLE_BIN) clean: partition_table-clean diff --git a/components/partition_table/gen_esp32part.py b/components/partition_table/gen_esp32part.py index 8b5df2b3b..5ead13adc 100755 --- a/components/partition_table/gen_esp32part.py +++ b/components/partition_table/gen_esp32part.py @@ -9,6 +9,8 @@ import struct import argparse import sys +MAX_PARTITION_LENGTH = 0xC00 # 3K for partition data (96 entries) leaves 1K in a 4K sector for signature + __version__ = '1.0' quiet = False @@ -84,15 +86,22 @@ class PartitionTable(list): @classmethod def from_binary(cls, b): - if len(b) % 32 != 0: - raise InputError("Partition table length must be a multiple of 32 bytes. Got %d bytes." % len(b)) result = cls() for o in range(0,len(b),32): - result.append(PartitionDefinition.from_binary(b[o:o+32])) + data = b[o:o+32] + if len(data) != 32: + raise InputError("Ran out of partition table data before reaching end marker") + if data == '\xFF'*32: + break # end of partition table + result.append(PartitionDefinition.from_binary(data)) return result def to_binary(self): - return "".join(e.to_binary() for e in self) + result = "".join(e.to_binary() for e in self) + if len(result )>= MAX_PARTITION_LENGTH: + raise InputError("Binary partition table length (%d) longer than max" % len(result)) + result += "\xFF" * (MAX_PARTITION_LENGTH - len(result)) # pad the sector, for signing + return result def to_csv(self, simple_formatting=False): rows = [ "# Espressif ESP32 Partition Table", @@ -107,7 +116,8 @@ class PartitionDefinition(object): "app" : APP_TYPE, "data" : DATA_TYPE, } - + + # Keep this map in sync with esp_partition_subtype_t enum in esp_partition.h SUBTYPES = { APP_TYPE : { "factory" : 0x00, @@ -115,8 +125,11 @@ class PartitionDefinition(object): }, DATA_TYPE : { "ota" : 0x00, - "rf" : 0x01, - "wifi" : 0x02, + "phy" : 0x01, + "nvs" : 0x02, + "esphttpd" : 0x80, + "fat" : 0x81, + "spiffs" : 0x82, }, } diff --git a/components/partition_table/partitions_singleapp.csv b/components/partition_table/partitions_singleapp.csv index 940b8a76c..e1647008e 100644 --- a/components/partition_table/partitions_singleapp.csv +++ b/components/partition_table/partitions_singleapp.csv @@ -1,4 +1,5 @@ # Name, Type, SubType, Offset, Size +# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild +nvs, data, nvs, 0x9000, 0x6000 +phy_init, data, phy, 0xf000, 0x1000 factory, app, factory, 0x10000, 1M -rfdata, data, rf, , 256K -wifidata, data, wifi, , 256K diff --git a/components/partition_table/partitions_two_ota.csv b/components/partition_table/partitions_two_ota.csv index 8e064e14b..afb43967a 100644 --- a/components/partition_table/partitions_two_ota.csv +++ b/components/partition_table/partitions_two_ota.csv @@ -1,7 +1,8 @@ # Name, Type, SubType, Offset, Size +# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild +nvs, data, nvs, 0x9000, 0x4000 +otadata, data, ota, 0xd000, 0x2000 +phy_init, data, phy, 0xf000, 0x1000 factory, 0, 0, 0x10000, 1M ota_0, 0, ota_0, , 1M ota_1, 0, ota_1, , 1M -rfdata, data, rf, , 256K -wifidata, data, wifi, , 256K -otadata, data, ota, , 256K diff --git a/components/partition_table/test/component.mk b/components/partition_table/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/partition_table/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/partition_table/test/test_partition.c b/components/partition_table/test/test_partition.c new file mode 100644 index 000000000..a4288d8e1 --- /dev/null +++ b/components/partition_table/test/test_partition.c @@ -0,0 +1,95 @@ +#include +#include +#include "unity.h" +#include "esp_partition.h" + + +TEST_CASE("Can read partition table", "[partition]") +{ + + const esp_partition_t *p = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, NULL); + TEST_ASSERT_NOT_NULL(p); + TEST_ASSERT_EQUAL(p->address, 0x10000); + TEST_ASSERT_EQUAL(p->subtype, ESP_PARTITION_SUBTYPE_APP_FACTORY); + + esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, NULL); + TEST_ASSERT_NOT_NULL(it); + int count = 0; + for (; it != NULL; it = esp_partition_next(it)) { + const esp_partition_t *p = esp_partition_get(it); + TEST_ASSERT_NOT_NULL(p); + ++count; + } + esp_partition_iterator_release(it); + TEST_ASSERT_EQUAL(count, 2); + + printf("%d\n", __builtin_clz(count)); +} + +TEST_CASE("Can write, read, mmap partition", "[partition]") +{ + const esp_partition_t *p = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, NULL); + TEST_ASSERT_NOT_NULL(p); + const size_t max_size = 2 * SPI_FLASH_SEC_SIZE; + uint8_t *data = (uint8_t *) malloc(max_size); + TEST_ASSERT_NOT_NULL(data); + + TEST_ASSERT_EQUAL(ESP_OK, esp_partition_erase_range(p, 0, p->size)); + + srand(0); + size_t block_size; + for (size_t offset = 0; offset < p->size; offset += block_size) { + block_size = ((rand() + 4) % max_size) & (~0x3); + size_t left = p->size - offset; + if (block_size > left) { + block_size = left; + } + for (size_t i = 0; i < block_size / 4; ++i) { + ((uint32_t *) (data))[i] = rand(); + if (i == 0 && offset == 0) { + printf("write: %08x\n", ((uint32_t *) (data))[i]); + } + } + TEST_ASSERT_EQUAL(ESP_OK, esp_partition_write(p, offset, data, block_size)); + } + + srand(0); + for (size_t offset = 0; offset < p->size; offset += block_size) { + block_size = ((rand() + 4) % max_size) & (~0x3); + size_t left = p->size - offset; + if (block_size > left) { + block_size = left; + } + TEST_ASSERT_EQUAL(ESP_OK, esp_partition_read(p, offset, data, block_size)); + for (size_t i = 0; i < block_size / 4; ++i) { + TEST_ASSERT_EQUAL(rand(), ((uint32_t *) data)[i]); + } + } + + free(data); + + const uint32_t *mmap_data; + spi_flash_mmap_handle_t mmap_handle; + size_t begin = 3000; + size_t size = 12000; + TEST_ASSERT_EQUAL(ESP_OK, esp_partition_mmap(p, begin, size, SPI_FLASH_MMAP_DATA, + (const void **)&mmap_data, &mmap_handle)); + srand(0); + for (size_t offset = 0; offset < p->size; offset += block_size) { + block_size = ((rand() + 4) % max_size) & (~0x3); + size_t left = p->size - offset; + if (block_size > left) { + block_size = left; + } + for (size_t i = 0; i < block_size / 4; ++i) { + size_t pos = offset + i * 4; + uint32_t expected = rand(); + if (pos < begin || pos >= (begin + size)) { + continue; + } + TEST_ASSERT_EQUAL(expected, mmap_data[(pos - begin) / 4]); + } + } + + spi_flash_munmap(mmap_handle); +} diff --git a/components/partition_table/tests/gen_esp32part_tests.py b/components/partition_table/tests/gen_esp32part_tests.py index 413f1aac9..d12539ea8 100755 --- a/components/partition_table/tests/gen_esp32part_tests.py +++ b/components/partition_table/tests/gen_esp32part_tests.py @@ -37,6 +37,10 @@ LONGER_BINARY_TABLE += "\xAA\x50\x10\x00" + \ "second" + ("\0"*10) + \ "\x00\x00\x00\x00" +def _strip_trailing_ffs(binary_table): + while binary_table.endswith("\xFF"): + binary_table = binary_table[0:len(binary_table)-1] + return binary_table class CSVParserTests(unittest.TestCase): @@ -156,7 +160,7 @@ class BinaryOutputTests(unittest.TestCase): first, 0x30, 0xEE, 0x100400, 0x300000 """ t = PartitionTable.from_csv(csv) - tb = t.to_binary() + tb = _strip_trailing_ffs(t.to_binary()) self.assertEqual(len(tb), 32) self.assertEqual('\xAA\x50', tb[0:2]) # magic self.assertEqual('\x30\xee', tb[2:4]) # type, subtype @@ -170,7 +174,7 @@ first, 0x30, 0xEE, 0x100400, 0x300000 second,0x31, 0xEF, , 0x100000 """ t = PartitionTable.from_csv(csv) - tb = t.to_binary() + tb = _strip_trailing_ffs(t.to_binary()) self.assertEqual(len(tb), 64) self.assertEqual('\xAA\x50', tb[0:2]) self.assertEqual('\xAA\x50', tb[32:34]) @@ -215,7 +219,7 @@ class BinaryParserTests(unittest.TestCase): self.assertEqual(t[2].type, 0x10) self.assertEqual(t[2].name, "second") - round_trip = t.to_binary() + round_trip = _strip_trailing_ffs(t.to_binary()) self.assertEqual(round_trip, LONGER_BINARY_TABLE) def test_bad_magic(self): @@ -267,7 +271,7 @@ class CSVOutputTests(unittest.TestCase): self.assertEqual(row[0], "factory") self.assertEqual(row[1], "app") self.assertEqual(row[2], "2") - self.assertEqual(row[3], "64K") + self.assertEqual(row[3], "0x10000") self.assertEqual(row[4], "1M") # round trip back to a PartitionTable and check is identical @@ -291,7 +295,7 @@ class CommandLineTests(unittest.TestCase): # reopen the CSV and check the generated binary is identical with open(csvpath, 'r') as f: from_csv = PartitionTable.from_csv(f.read()) - self.assertEqual(from_csv.to_binary(), LONGER_BINARY_TABLE) + self.assertEqual(_strip_trailing_ffs(from_csv.to_binary()), LONGER_BINARY_TABLE) # run gen_esp32part.py to conver the CSV to binary again subprocess.check_call([sys.executable, "../gen_esp32part.py", @@ -299,6 +303,7 @@ class CommandLineTests(unittest.TestCase): # assert that file reads back as identical with open(binpath, 'rb') as f: binary_readback = f.read() + binary_readback = _strip_trailing_ffs(binary_readback) self.assertEqual(binary_readback, LONGER_BINARY_TABLE) finally: diff --git a/components/spi_flash/cache_utils.c b/components/spi_flash/cache_utils.c index 6ae47bdb3..904007b31 100644 --- a/components/spi_flash/cache_utils.c +++ b/components/spi_flash/cache_utils.c @@ -38,8 +38,8 @@ static uint32_t s_flash_op_cache_state[2]; #ifndef CONFIG_FREERTOS_UNICORE static SemaphoreHandle_t s_flash_op_mutex; -static bool s_flash_op_can_start = false; -static bool s_flash_op_complete = false; +static volatile bool s_flash_op_can_start = false; +static volatile bool s_flash_op_complete = false; void spi_flash_init_lock() { diff --git a/components/spi_flash/component.mk b/components/spi_flash/component.mk index 459da0641..d511eedb8 100755 --- a/components/spi_flash/component.mk +++ b/components/spi_flash/component.mk @@ -5,4 +5,3 @@ ifdef IS_BOOTLOADER_BUILD COMPONENT_OBJS := spi_flash_rom_patch.o endif -include $(IDF_PATH)/make/component_common.mk diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index 8bf60843a..3358c550f 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -126,10 +126,6 @@ esp_err_t IRAM_ATTR spi_flash_erase_range(uint32_t start_addr, uint32_t size) esp_err_t IRAM_ATTR spi_flash_write(size_t dest_addr, const void *src, size_t size) { - // TODO: replace this check with code which deals with unaligned sources - if (((ptrdiff_t) src) % 4 != 0) { - return ESP_ERR_INVALID_ARG; - } // Destination alignment is also checked in ROM code, but we can give // better error code here // TODO: add handling of unaligned destinations @@ -139,6 +135,12 @@ esp_err_t IRAM_ATTR spi_flash_write(size_t dest_addr, const void *src, size_t si if (size % 4 != 0) { return ESP_ERR_INVALID_SIZE; } + if ((uint32_t) src < 0x3ff00000) { + // if source address is in DROM, we won't be able to read it + // from within SPIWrite + // TODO: consider buffering source data using heap and writing it anyway? + return ESP_ERR_INVALID_ARG; + } // Out of bound writes are checked in ROM code, but we can give better // error code here if (dest_addr + size > g_rom_flashchip.chip_size) { diff --git a/components/spi_flash/include/esp_partition.h b/components/spi_flash/include/esp_partition.h index ae0185dcd..13b803e10 100644 --- a/components/spi_flash/include/esp_partition.h +++ b/components/spi_flash/include/esp_partition.h @@ -25,57 +25,78 @@ extern "C" { #endif +/** + * @file esp_partition.h + * @brief Partition APIs + */ + + +/** + * @brief Partition type + * @note Keep this enum in sync with PartitionDefinition class gen_esp32part.py + */ typedef enum { - ESP_PARTITION_TYPE_APP = 0x00, - ESP_PARTITION_TYPE_DATA = 0x01, - ESP_PARTITION_TYPE_FILESYSTEM = 0x02, + ESP_PARTITION_TYPE_APP = 0x00, //!< Application partition type + ESP_PARTITION_TYPE_DATA = 0x01, //!< Data partition type } esp_partition_type_t; +/** + * @brief Partition subtype + * @note Keep this enum in sync with PartitionDefinition class gen_esp32part.py + */ typedef enum { - ESP_PARTITION_SUBTYPE_APP_FACTORY = 0x00, - ESP_PARTITION_SUBTYPE_APP_OTA_MIN = 0x10, - ESP_PARTITION_SUBTYPE_APP_OTA_0 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 0, - ESP_PARTITION_SUBTYPE_APP_OTA_1 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 1, - ESP_PARTITION_SUBTYPE_APP_OTA_2 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 2, - ESP_PARTITION_SUBTYPE_APP_OTA_3 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 3, - ESP_PARTITION_SUBTYPE_APP_OTA_4 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 4, - ESP_PARTITION_SUBTYPE_APP_OTA_5 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 5, - ESP_PARTITION_SUBTYPE_APP_OTA_6 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 6, - ESP_PARTITION_SUBTYPE_APP_OTA_7 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 7, - ESP_PARTITION_SUBTYPE_APP_OTA_8 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 8, - ESP_PARTITION_SUBTYPE_APP_OTA_9 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 9, - ESP_PARTITION_SUBTYPE_APP_OTA_10 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 10, - ESP_PARTITION_SUBTYPE_APP_OTA_11 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 11, - ESP_PARTITION_SUBTYPE_APP_OTA_12 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 12, - ESP_PARTITION_SUBTYPE_APP_OTA_13 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 13, - ESP_PARTITION_SUBTYPE_APP_OTA_14 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 14, - ESP_PARTITION_SUBTYPE_APP_OTA_15 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 15, - ESP_PARTITION_SUBTYPE_APP_OTA_MAX = 15, - ESP_PARTITION_SUBTYPE_APP_TEST = 0x20, + ESP_PARTITION_SUBTYPE_APP_FACTORY = 0x00, //!< Factory application partition + ESP_PARTITION_SUBTYPE_APP_OTA_MIN = 0x10, //!< Base for OTA partition subtypes + ESP_PARTITION_SUBTYPE_APP_OTA_0 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 0, //!< OTA partition 0 + ESP_PARTITION_SUBTYPE_APP_OTA_1 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 1, //!< OTA partition 1 + ESP_PARTITION_SUBTYPE_APP_OTA_2 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 2, //!< OTA partition 2 + ESP_PARTITION_SUBTYPE_APP_OTA_3 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 3, //!< OTA partition 3 + ESP_PARTITION_SUBTYPE_APP_OTA_4 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 4, //!< OTA partition 4 + ESP_PARTITION_SUBTYPE_APP_OTA_5 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 5, //!< OTA partition 5 + ESP_PARTITION_SUBTYPE_APP_OTA_6 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 6, //!< OTA partition 6 + ESP_PARTITION_SUBTYPE_APP_OTA_7 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 7, //!< OTA partition 7 + ESP_PARTITION_SUBTYPE_APP_OTA_8 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 8, //!< OTA partition 8 + ESP_PARTITION_SUBTYPE_APP_OTA_9 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 9, //!< OTA partition 9 + ESP_PARTITION_SUBTYPE_APP_OTA_10 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 10,//!< OTA partition 10 + ESP_PARTITION_SUBTYPE_APP_OTA_11 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 11,//!< OTA partition 11 + ESP_PARTITION_SUBTYPE_APP_OTA_12 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 12,//!< OTA partition 12 + ESP_PARTITION_SUBTYPE_APP_OTA_13 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 13,//!< OTA partition 13 + ESP_PARTITION_SUBTYPE_APP_OTA_14 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 14,//!< OTA partition 14 + ESP_PARTITION_SUBTYPE_APP_OTA_15 = ESP_PARTITION_SUBTYPE_APP_OTA_MIN + 15,//!< OTA partition 15 + ESP_PARTITION_SUBTYPE_APP_OTA_MAX = 15, //!< Max subtype of OTA partition + ESP_PARTITION_SUBTYPE_APP_TEST = 0x20, //!< Test application partition - ESP_PARTITION_SUBTYPE_DATA_OTA = 0x00, - ESP_PARTITION_SUBTYPE_DATA_RF = 0x01, - ESP_PARTITION_SUBTYPE_DATA_NVS = 0x02, + ESP_PARTITION_SUBTYPE_DATA_OTA = 0x00, //!< OTA selection partition + ESP_PARTITION_SUBTYPE_DATA_PHY = 0x01, //!< PHY init data partition + ESP_PARTITION_SUBTYPE_DATA_NVS = 0x02, //!< NVS partition - ESP_PARTITION_SUBTYPE_FILESYSTEM_ESPHTTPD = 0x00, - ESP_PARTITION_SUBTYPE_FILESYSTEM_FAT = 0x01, - ESP_PARTITION_SUBTYPE_FILESYSTEM_SPIFFS = 0x02, + ESP_PARTITION_SUBTYPE_DATA_ESPHTTPD = 0x80, //!< ESPHTTPD partition + ESP_PARTITION_SUBTYPE_DATA_FAT = 0x81, //!< FAT partition + ESP_PARTITION_SUBTYPE_DATA_SPIFFS = 0x82, //!< SPIFFS partition - ESP_PARTITION_SUBTYPE_ANY = 0xff, + ESP_PARTITION_SUBTYPE_ANY = 0xff, //!< Used to search for partitions with any subtype } esp_partition_subtype_t; +/** + * @brief Convenience macro to get esp_partition_subtype_t value for the i-th OTA partition + */ #define ESP_PARTITION_SUBTYPE_OTA(i) ((esp_partition_subtype_t)(ESP_PARTITION_SUBTYPE_APP_OTA_MIN + ((i) & 0xf))) - +/** + * @brief Opaque partition iterator type + */ typedef struct esp_partition_iterator_opaque_* esp_partition_iterator_t; +/** + * @brief partition information structure + */ typedef struct { - esp_partition_type_t type; - esp_partition_subtype_t subtype; - uint32_t address; - uint32_t size; - char label[17]; - bool encrypted; + esp_partition_type_t type; /*!< partition type (app/data) */ + esp_partition_subtype_t subtype; /*!< partition subtype */ + uint32_t address; /*!< starting address of the partition in flash */ + uint32_t size; /*!< size of the partition, in bytes */ + char label[17]; /*!< partition label, zero-terminated ASCII string */ + bool encrypted; /*!< flag is set to true if partition is encrypted */ } esp_partition_t; /** diff --git a/components/spi_flash/include/esp_spi_flash.h b/components/spi_flash/include/esp_spi_flash.h index c65eaa583..f940c0ad5 100644 --- a/components/spi_flash/include/esp_spi_flash.h +++ b/components/spi_flash/include/esp_spi_flash.h @@ -62,20 +62,22 @@ esp_err_t spi_flash_erase_sector(size_t sector); /** * @brief Erase a range of flash sectors * - * @param uint32_t start_address : Address where erase operation has to start. + * @param start_address Address where erase operation has to start. * Must be 4kB-aligned - * @param uint32_t size : Size of erased range, in bytes. Must be divisible by 4kB. + * @param size Size of erased range, in bytes. Must be divisible by 4kB. * * @return esp_err_t */ -esp_err_t spi_flash_erase_range(size_t start_addr, size_t size); +esp_err_t spi_flash_erase_range(size_t start_address, size_t size); /** * @brief Write data to Flash. * - * @note Both des_addr and src_addr have to be 4-byte aligned. + * @note Address in flash, dest, has to be 4-byte aligned. * This is a temporary limitation which will be removed. + * @note If source address is in DROM, this function will return + * ESP_ERR_INVALID_ARG. * * @param dest destination address in Flash * @param src pointer to the source buffer @@ -88,7 +90,7 @@ esp_err_t spi_flash_write(size_t dest, const void *src, size_t size); /** * @brief Read data from Flash. * - * @note Both des_addr and src_addr have to be 4-byte aligned. + * @note Both src and dest have to be 4-byte aligned. * This is a temporary limitation which will be removed. * * @param src source address of the data in Flash. diff --git a/components/spi_flash/spi_flash_rom_patch.c b/components/spi_flash/spi_flash_rom_patch.c index 7e23beaea..36e5bf823 100644 --- a/components/spi_flash/spi_flash_rom_patch.c +++ b/components/spi_flash/spi_flash_rom_patch.c @@ -19,9 +19,15 @@ static const uint32_t STATUS_QIE_BIT = (1 << 9); /* Quad Enable */ #define SPI_IDX 1 #define OTH_IDX 0 +#ifndef BOOTLOADER_BUILD +#define ATTR IRAM_ATTR +#else +#define ATTR +#endif // BOOTLOADER_BUILD + extern SpiFlashChip SPI_flashchip_data; -static void IRAM_ATTR Wait_SPI_Idle(void) +static void ATTR Wait_SPI_Idle(void) { /* Wait for SPI state machine to be idle */ while((REG_READ(SPI_EXT2_REG(SPI_IDX)) & SPI_ST)) { @@ -42,7 +48,7 @@ static void IRAM_ATTR Wait_SPI_Idle(void) about interrupts, CPU coordination, flash mapping. However some of the functions in esp_spi_flash.c call it. */ -SpiFlashOpResult IRAM_ATTR SPIUnlock(void) +SpiFlashOpResult ATTR SPIUnlock(void) { uint32_t status; diff --git a/components/spi_flash/test/component.mk b/components/spi_flash/test/component.mk new file mode 100644 index 000000000..5dd172bdb --- /dev/null +++ b/components/spi_flash/test/component.mk @@ -0,0 +1,5 @@ +# +#Component Makefile +# + +COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive diff --git a/components/spi_flash/test/test_mmap.c b/components/spi_flash/test/test_mmap.c new file mode 100644 index 000000000..28d9ae6dd --- /dev/null +++ b/components/spi_flash/test/test_mmap.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +uint32_t buffer[1024]; + +static const uint32_t start = 0x200000; +static const uint32_t end = 0x300000; + + + +TEST_CASE("Prepare data for mmap tests", "[mmap]") +{ + srand(0); + for (int block = start / 0x10000; block < end / 0x10000; ++block) { + printf("Writing block %d\n", block); + for (int sector = 0; sector < 16; ++sector) { + for (uint32_t word = 0; word < 1024; ++word) { + uint32_t val = rand(); + if (block == start / 0x10000 && sector == 0 && word == 0) { + printf("first word: %08x\n", val); + } + buffer[word] = val; + } + uint32_t abs_sector = (block) * 16 + sector; + printf("Writing sector %d\n", abs_sector); + ESP_ERROR_CHECK( spi_flash_erase_sector((uint16_t) abs_sector) ); + ESP_ERROR_CHECK( spi_flash_write(abs_sector * SPI_FLASH_SEC_SIZE, (const uint8_t *) buffer, sizeof(buffer)) ); + } + } +} + +TEST_CASE("Can mmap into data address space", "[mmap]") +{ + + printf("Mapping %x (+%x)\n", start, end - start); + spi_flash_mmap_handle_t handle1; + const void *ptr1; + ESP_ERROR_CHECK( spi_flash_mmap(start, end - start, SPI_FLASH_MMAP_DATA, &ptr1, &handle1) ); + printf("mmap_res: handle=%d ptr=%p\n", handle1, ptr1); + + spi_flash_mmap_dump(); + + srand(0); + const uint32_t *data = (const uint32_t *) ptr1; + for (int block = 0; block < (end - start) / 0x10000; ++block) { + for (int sector = 0; sector < 16; ++sector) { + for (uint32_t word = 0; word < 1024; ++word) { + TEST_ASSERT_EQUAL_UINT32(rand(), data[(block * 16 + sector) * 1024 + word]); + } + } + } + printf("Mapping %x (+%x)\n", start - 0x10000, 0x20000); + spi_flash_mmap_handle_t handle2; + const void *ptr2; + ESP_ERROR_CHECK( spi_flash_mmap(start - 0x10000, 0x20000, SPI_FLASH_MMAP_DATA, &ptr2, &handle2) ); + printf("mmap_res: handle=%d ptr=%p\n", handle2, ptr2); + spi_flash_mmap_dump(); + + printf("Mapping %x (+%x)\n", start, 0x10000); + spi_flash_mmap_handle_t handle3; + const void *ptr3; + ESP_ERROR_CHECK( spi_flash_mmap(start, 0x10000, SPI_FLASH_MMAP_DATA, &ptr3, &handle3) ); + printf("mmap_res: handle=%d ptr=%p\n", handle3, ptr3); + spi_flash_mmap_dump(); + + printf("Unmapping handle1\n"); + spi_flash_munmap(handle1); + spi_flash_mmap_dump(); + + printf("Unmapping handle2\n"); + spi_flash_munmap(handle2); + spi_flash_mmap_dump(); + + printf("Unmapping handle3\n"); + spi_flash_munmap(handle3); +} diff --git a/components/spi_flash/test/test_spi_flash.c b/components/spi_flash/test/test_spi_flash.c new file mode 100644 index 000000000..330e37bb8 --- /dev/null +++ b/components/spi_flash/test/test_spi_flash.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include + +#include +#include +#include + +struct flash_test_ctx { + uint32_t offset[2]; + bool fail[2]; + SemaphoreHandle_t done; +}; + +static void flash_test_task(void *arg) +{ + const uint32_t coreid = xPortGetCoreID(); + ets_printf("t%d\n", coreid); + struct flash_test_ctx *ctx = (struct flash_test_ctx *) arg; + vTaskDelay(100 / portTICK_PERIOD_MS); + const uint32_t sector = ctx->offset[coreid]; + ets_printf("es%d\n", coreid); + if (spi_flash_erase_sector(sector) != ESP_OK) { + ctx->fail[coreid] = true; + ets_printf("Erase failed\r\n"); + xSemaphoreGive(ctx->done); + vTaskDelete(NULL); + } + ets_printf("ed%d\n", coreid); + + vTaskDelay(0 / portTICK_PERIOD_MS); + + uint32_t val = 0xabcd1234; + const uint32_t n = 4096; + for (uint32_t offset = 0; offset < n; offset += 4) { + if (spi_flash_write(sector * SPI_FLASH_SEC_SIZE + offset, (const uint8_t *) &val, 4) != ESP_OK) { + ets_printf("Write failed at offset=%d\r\n", offset); + ctx->fail[coreid] = true; + break; + } + } + ets_printf("wd%d\n", coreid); + + vTaskDelay(0 / portTICK_PERIOD_MS); + + uint32_t val_read; + for (uint32_t offset = 0; offset < n; offset += 4) { + if (spi_flash_read(sector * SPI_FLASH_SEC_SIZE + offset, (uint8_t *) &val_read, 4) != ESP_OK) { + ets_printf("Read failed at offset=%d\r\n", offset); + ctx->fail[coreid] = true; + break; + } + if (val_read != val) { + ets_printf("Read invalid value=%08x at offset=%d\r\n", val_read, offset); + ctx->fail[coreid] = true; + break; + } + } + ets_printf("td%d\n", coreid); + xSemaphoreGive(ctx->done); + vTaskDelete(NULL); +} + +TEST_CASE("flash write and erase work both on PRO CPU and on APP CPU", "[spi_flash]") +{ + TaskHandle_t procpu_task; + TaskHandle_t appcpu_task; + struct flash_test_ctx ctx; + + ctx.offset[0] = 6; + ctx.offset[1] = 7; + ctx.fail[0] = 0; + ctx.fail[1] = 0; + ctx.done = xSemaphoreCreateBinary(); + + xTaskCreatePinnedToCore(flash_test_task, "1", 2048, &ctx, 3, &procpu_task, 0); + if (portNUM_PROCESSORS == 2) { + xTaskCreatePinnedToCore(flash_test_task, "2", 2048, &ctx, 3, &appcpu_task, 1); + } + + xSemaphoreTake(ctx.done, portMAX_DELAY); + if (portNUM_PROCESSORS == 2) { + xSemaphoreTake(ctx.done, portMAX_DELAY); + } + + TEST_ASSERT_EQUAL(false, ctx.fail[0]); + if (portNUM_PROCESSORS == 2) { + TEST_ASSERT_EQUAL(false, ctx.fail[1]); + } +} + diff --git a/components/tcpip_adapter/component.mk b/components/tcpip_adapter/component.mk index a57ae0b12..c2c4c03a1 100755 --- a/components/tcpip_adapter/component.mk +++ b/components/tcpip_adapter/component.mk @@ -1,5 +1,5 @@ # # Component Makefile # +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) -include $(IDF_PATH)/make/component_common.mk diff --git a/components/tcpip_adapter/include/tcpip_adapter.h b/components/tcpip_adapter/include/tcpip_adapter.h index e84701688..f7063a8e1 100644 --- a/components/tcpip_adapter/include/tcpip_adapter.h +++ b/components/tcpip_adapter/include/tcpip_adapter.h @@ -64,18 +64,22 @@ typedef struct { ip4_addr_t gw; } tcpip_adapter_ip_info_t; +typedef struct { + ip6_addr_t ip; +} tcpip_adapter_ip6_info_t; + typedef dhcps_lease_t tcpip_adapter_dhcps_lease_t; #if CONFIG_DHCP_STA_LIST typedef struct { uint8_t mac[6]; ip4_addr_t ip; -}tcpip_adapter_sta_info_t; +} tcpip_adapter_sta_info_t; typedef struct { tcpip_adapter_sta_info_t sta[ESP_WIFI_MAX_CONN_NUM]; int num; -}tcpip_adapter_sta_list_t; +} tcpip_adapter_sta_list_t; #endif #endif @@ -211,6 +215,35 @@ esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_i */ esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info); +/** + * @brief create interface's linklocal IPv6 information + * + * @note this function will create a linklocal IPv6 address about input interface, + * if this address status changed to preferred, will call event call back , + * notify user linklocal IPv6 address has been verified + * + * @param[in] tcpip_if: the interface which we want to set IP information + * + * + * @return ESP_OK + * ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS + */ +esp_err_t tcpip_adapter_create_ip6_linklocal(tcpip_adapter_if_t tcpip_if); + +/** + * @brief get interface's linkloacl IPv6 information + * + * There has an IPv6 information copy in adapter library, if interface is up,and IPv6 info + * is preferred,it will get IPv6 linklocal IP successfully + * + * @param[in] tcpip_if: the interface which we want to set IP information + * @param[in] if_ip6: If successful, IPv6 information will be returned in this argument. + * + * @return ESP_OK + * ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS + */ +esp_err_t tcpip_adapter_get_ip6_linklocal(tcpip_adapter_if_t tcpip_if, ip6_addr_t *if_ip6); + #if 0 esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac); @@ -372,6 +405,19 @@ wifi_interface_t tcpip_adapter_get_wifi_if(void *dev); */ esp_err_t tcpip_adapter_get_sta_list(wifi_sta_list_t *wifi_sta_list, tcpip_adapter_sta_list_t *tcpip_sta_list); +#define TCPIP_HOSTNAME_MAX_SIZE 31 +/** + * @brief Set the hostname to the interface + * + * @param[in] tcpip_if: the interface which we will set the hostname + * @param[in] hostname: the host name for set the interfce + * + * @return ESP_OK:success + * ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY:interface status error + * ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS:parameter error + */ +esp_err_t tcpip_adapter_set_hostname(tcpip_adapter_if_t tcpip_if, const char *hostname); + #ifdef __cplusplus } #endif diff --git a/components/tcpip_adapter/tcpip_adapter_lwip.c b/components/tcpip_adapter/tcpip_adapter_lwip.c index 9b6e9d94f..25c801bd0 100644 --- a/components/tcpip_adapter/tcpip_adapter_lwip.c +++ b/components/tcpip_adapter/tcpip_adapter_lwip.c @@ -23,7 +23,8 @@ #include "lwip/tcpip.h" #include "lwip/dhcp.h" #include "lwip/ip_addr.h" - +#include "lwip/ip6_addr.h" +#include "lwip/nd6.h" #include "netif/wlanif.h" #include "apps/dhcpserver.h" @@ -32,6 +33,7 @@ static struct netif *esp_netif[TCPIP_ADAPTER_IF_MAX]; static tcpip_adapter_ip_info_t esp_ip[TCPIP_ADAPTER_IF_MAX]; +static tcpip_adapter_ip6_info_t esp_ip6[TCPIP_ADAPTER_IF_MAX]; static tcpip_adapter_dhcp_status_t dhcps_status = TCPIP_ADAPTER_DHCP_INIT; static tcpip_adapter_dhcp_status_t dhcpc_status = TCPIP_ADAPTER_DHCP_INIT; @@ -234,6 +236,69 @@ esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_i return ESP_OK; } +static void tcpip_adapter_nd6_cb(struct netif *p_netif, uint8_t ip_idex) +{ + tcpip_adapter_ip6_info_t *ip6_info; + + if (!p_netif) { + TCPIP_ADAPTER_DEBUG("null p_netif=%p\n", p_netif); + return; + } + + if (p_netif == esp_netif[TCPIP_ADAPTER_IF_STA]) { + ip6_info = &esp_ip6[TCPIP_ADAPTER_IF_STA]; + } else if(p_netif == esp_netif[TCPIP_ADAPTER_IF_AP]) { + ip6_info = &esp_ip6[TCPIP_ADAPTER_IF_AP]; + } else { + return; + } + + system_event_t evt; + + ip6_addr_set(&ip6_info->ip, ip_2_ip6(&p_netif->ip6_addr[ip_idex])); + + //notify event + evt.event_id = SYSTEM_EVENT_AP_STA_GOT_IP6; + memcpy(&evt.event_info.got_ip6.ip6_info, ip6_info, sizeof(tcpip_adapter_ip6_info_t)); + esp_event_send(&evt); +} + +esp_err_t tcpip_adapter_create_ip6_linklocal(tcpip_adapter_if_t tcpip_if) +{ + struct netif *p_netif; + + if (tcpip_if >= TCPIP_ADAPTER_IF_MAX) { + return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; + } + + p_netif = esp_netif[tcpip_if]; + if(p_netif != NULL && netif_is_up(p_netif)) { + netif_create_ip6_linklocal_address(p_netif, 1); + nd6_set_cb(p_netif, tcpip_adapter_nd6_cb); + + return ESP_OK; + } else { + return ESP_FAIL; + } +} + +esp_err_t tcpip_adapter_get_ip6_linklocal(tcpip_adapter_if_t tcpip_if, ip6_addr_t *if_ip6) +{ + struct netif *p_netif; + + if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || if_ip6 == NULL) { + return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; + } + + p_netif = esp_netif[tcpip_if]; + if (p_netif != NULL && netif_is_up(p_netif) && ip6_addr_ispreferred(netif_ip6_addr_state(p_netif, 0))) { + memcpy(if_ip6, &p_netif->ip6_addr[0], sizeof(ip6_addr_t)); + } else { + return ESP_FAIL; + } + return ESP_OK; +} + #if 0 esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t mac[6]) { @@ -607,4 +672,32 @@ esp_err_t tcpip_adapter_get_sta_list(wifi_sta_list_t *wifi_sta_list, tcpip_adapt return ESP_OK; } +esp_err_t tcpip_adapter_set_hostname(tcpip_adapter_if_t tcpip_if, const char *hostname) +{ + struct netif *p_netif; + static char hostinfo[TCPIP_HOSTNAME_MAX_SIZE + 1]; + + if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || hostname == NULL) { + return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; + } + + if (strlen(hostname) >= TCPIP_HOSTNAME_MAX_SIZE) { + return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; + } + + p_netif = esp_netif[tcpip_if]; + if (p_netif != NULL) { + if (netif_is_up(p_netif)) { + return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY; + } else { + memset(hostinfo, 0, sizeof(hostinfo)); + memcpy(hostinfo, hostname, strlen(hostname)); + p_netif->hostname = hostinfo; + return ESP_OK; + } + } else { + return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS; + } +} + #endif diff --git a/components/vfs/component.mk b/components/vfs/component.mk index fccf88db8..c2c4c03a1 100755 --- a/components/vfs/component.mk +++ b/components/vfs/component.mk @@ -1 +1,5 @@ -include $(IDF_PATH)/make/component_common.mk +# +# Component Makefile +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + diff --git a/components/vfs/include/esp_vfs.h b/components/vfs/include/esp_vfs.h index 2d9e52c5a..7dd273fb0 100644 --- a/components/vfs/include/esp_vfs.h +++ b/components/vfs/include/esp_vfs.h @@ -57,15 +57,15 @@ extern "C" { * flags member to ESP_VFS_FLAG_CONTEXT_PTR and provide the context pointer * to esp_vfs_register function. * If the implementation doesn't use this extra argument, populate the - * members without _p suffix and set flags memeber to ESP_VFS_FLAG_DEFAULT. + * members without _p suffix and set flags member to ESP_VFS_FLAG_DEFAULT. * * If the FS driver doesn't provide some of the functions, set corresponding * members to NULL. */ typedef struct { - int fd_offset; - int flags; + int fd_offset; /*!< file descriptor offset, determined by the FS driver */ + int flags; /*!< ESP_VFS_FLAG_CONTEXT_PTR or ESP_VFS_FLAG_DEFAULT */ union { size_t (*write_p)(void* p, int fd, const void * data, size_t size); size_t (*write)(int fd, const void * data, size_t size); @@ -135,7 +135,7 @@ esp_err_t esp_vfs_register(const char* base_path, const esp_vfs_t* vfs, void* ct * These functions are to be used in newlib syscall table. They will be called by * newlib when it needs to use any of the syscalls. */ - +/**@{*/ ssize_t esp_vfs_write(struct _reent *r, int fd, const void * data, size_t size); off_t esp_vfs_lseek(struct _reent *r, int fd, off_t size, int mode); ssize_t esp_vfs_read(struct _reent *r, int fd, void * dst, size_t size); @@ -146,7 +146,7 @@ int esp_vfs_stat(struct _reent *r, const char * path, struct stat * st); int esp_vfs_link(struct _reent *r, const char* n1, const char* n2); int esp_vfs_unlink(struct _reent *r, const char *path); int esp_vfs_rename(struct _reent *r, const char *src, const char *dst); - +/**@}*/ #ifdef __cplusplus diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index bf26968ff..b60c60a81 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -151,6 +151,10 @@ int esp_vfs_open(struct _reent *r, const char * path, int flags, int mode) const char* path_within_vfs = translate_path(vfs, path); int ret; CHECK_AND_CALL(ret, r, vfs, open, path_within_vfs, flags, mode); + if (ret < 0) { + return ret; + } + assert(ret >= vfs->vfs.fd_offset); return ret - vfs->vfs.fd_offset + (vfs->offset << VFS_INDEX_S); } diff --git a/components/wpa_supplicant/COPYING b/components/wpa_supplicant/COPYING new file mode 100644 index 000000000..7efce0dee --- /dev/null +++ b/components/wpa_supplicant/COPYING @@ -0,0 +1,22 @@ +wpa_supplicant and hostapd +-------------------------- + +Copyright (c) 2002-2016, Jouni Malinen and contributors +All Rights Reserved. + + +See the README file for the current license terms. + +This software was previously distributed under BSD/GPL v2 dual license +terms that allowed either of those license alternatives to be +selected. As of February 11, 2012, the project has chosen to use only +the BSD license option for future distribution. As such, the GPL v2 +license option is no longer used. It should be noted that the BSD +license option (the one with advertisement clause removed) is compatible +with GPL and as such, does not prevent use of this software in projects +that use GPL. + +Some of the files may still include pointers to GPL version 2 license +terms. However, such copyright and license notifications are maintained +only for attribution purposes and any distribution of this software +after February 11, 2012 is no longer under the GPL v2 option. diff --git a/components/wpa_supplicant/component.mk b/components/wpa_supplicant/component.mk new file mode 100644 index 000000000..b01eb83be --- /dev/null +++ b/components/wpa_supplicant/component.mk @@ -0,0 +1,4 @@ +COMPONENT_ADD_INCLUDEDIRS := include port/include +COMPONENT_SRCDIRS := src/crypto + +CFLAGS += -DEMBEDDED_SUPP -D__ets__ -Wno-strict-aliasing diff --git a/components/wpa_supplicant/include/crypto/aes.h b/components/wpa_supplicant/include/crypto/aes.h new file mode 100644 index 000000000..ba384a9da --- /dev/null +++ b/components/wpa_supplicant/include/crypto/aes.h @@ -0,0 +1,27 @@ +/* + * AES functions + * Copyright (c) 2003-2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef AES_H +#define AES_H + +#define AES_BLOCK_SIZE 16 + +void * aes_encrypt_init(const u8 *key, size_t len); +void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt); +void aes_encrypt_deinit(void *ctx); +void * aes_decrypt_init(const u8 *key, size_t len); +void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain); +void aes_decrypt_deinit(void *ctx); + +#endif /* AES_H */ diff --git a/components/wpa_supplicant/include/crypto/aes_i.h b/components/wpa_supplicant/include/crypto/aes_i.h new file mode 100644 index 000000000..1063422a8 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/aes_i.h @@ -0,0 +1,131 @@ +/* + * AES (Rijndael) cipher + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef AES_I_H +#define AES_I_H + +#include "aes.h" + +/* #define FULL_UNROLL */ +#define AES_SMALL_TABLES + +extern const u32 Te0[256]; +extern const u32 Te1[256]; +extern const u32 Te2[256]; +extern const u32 Te3[256]; +extern const u32 Te4[256]; +extern const u32 Td0[256]; +extern const u32 Td1[256]; +extern const u32 Td2[256]; +extern const u32 Td3[256]; +extern const u32 Td4[256]; +extern const u32 rcon[10]; +extern const u8 Td4s[256]; +extern const u8 rcons[10]; + +#ifndef AES_SMALL_TABLES + +#define RCON(i) rcon[(i)] + +#define TE0(i) Te0[((i) >> 24) & 0xff] +#define TE1(i) Te1[((i) >> 16) & 0xff] +#define TE2(i) Te2[((i) >> 8) & 0xff] +#define TE3(i) Te3[(i) & 0xff] +#define TE41(i) (Te4[((i) >> 24) & 0xff] & 0xff000000) +#define TE42(i) (Te4[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE43(i) (Te4[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE44(i) (Te4[(i) & 0xff] & 0x000000ff) +#define TE421(i) (Te4[((i) >> 16) & 0xff] & 0xff000000) +#define TE432(i) (Te4[((i) >> 8) & 0xff] & 0x00ff0000) +#define TE443(i) (Te4[(i) & 0xff] & 0x0000ff00) +#define TE414(i) (Te4[((i) >> 24) & 0xff] & 0x000000ff) +#define TE411(i) (Te4[((i) >> 24) & 0xff] & 0xff000000) +#define TE422(i) (Te4[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE433(i) (Te4[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE444(i) (Te4[(i) & 0xff] & 0x000000ff) +#define TE4(i) (Te4[(i)] & 0x000000ff) + +#define TD0(i) Td0[((i) >> 24) & 0xff] +#define TD1(i) Td1[((i) >> 16) & 0xff] +#define TD2(i) Td2[((i) >> 8) & 0xff] +#define TD3(i) Td3[(i) & 0xff] +#define TD41(i) (Td4[((i) >> 24) & 0xff] & 0xff000000) +#define TD42(i) (Td4[((i) >> 16) & 0xff] & 0x00ff0000) +#define TD43(i) (Td4[((i) >> 8) & 0xff] & 0x0000ff00) +#define TD44(i) (Td4[(i) & 0xff] & 0x000000ff) +#define TD0_(i) Td0[(i) & 0xff] +#define TD1_(i) Td1[(i) & 0xff] +#define TD2_(i) Td2[(i) & 0xff] +#define TD3_(i) Td3[(i) & 0xff] + +#else /* AES_SMALL_TABLES */ + +#define RCON(i) (rcons[(i)] << 24) + +static inline u32 rotr(u32 val, int bits) +{ + return (val >> bits) | (val << (32 - bits)); +} + +#define TE0(i) Te0[((i) >> 24) & 0xff] +#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) +#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) +#define TE3(i) rotr(Te0[(i) & 0xff], 24) +#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) +#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) +#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) +#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) +#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) +#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) +#define TE411(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) +#define TE422(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE433(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE444(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) +#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) + +#define TD0(i) Td0[((i) >> 24) & 0xff] +#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) +#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) +#define TD3(i) rotr(Td0[(i) & 0xff], 24) +#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) +#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) +#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) +#define TD44(i) (Td4s[(i) & 0xff]) +#define TD0_(i) Td0[(i) & 0xff] +#define TD1_(i) rotr(Td0[(i) & 0xff], 8) +#define TD2_(i) rotr(Td0[(i) & 0xff], 16) +#define TD3_(i) rotr(Td0[(i) & 0xff], 24) + +#endif /* AES_SMALL_TABLES */ + +#ifdef _MSC_VER +#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) +#define GETU32(p) SWAP(*((u32 *)(p))) +#define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } +#else +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ +((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +#define PUTU32(ct, st) { \ +(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ +(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } +#endif + +#define AES_PRIV_SIZE (4 * 4 * 15 + 4) +#define AES_PRIV_NR_POS (4 * 15) + +int rijndaelKeySetupEnc(u32 rk[], const u8 cipherKey[], int keyBits); + +#endif /* AES_I_H */ diff --git a/components/wpa_supplicant/include/crypto/aes_wrap.h b/components/wpa_supplicant/include/crypto/aes_wrap.h new file mode 100644 index 000000000..4b1c7b083 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/aes_wrap.h @@ -0,0 +1,48 @@ +/* + * AES-based functions + * + * - AES Key Wrap Algorithm (128-bit KEK) (RFC3394) + * - One-Key CBC MAC (OMAC1) hash with AES-128 + * - AES-128 CTR mode encryption + * - AES-128 EAX mode encryption/decryption + * - AES-128 CBC + * + * Copyright (c) 2003-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef AES_WRAP_H +#define AES_WRAP_H + +int __must_check aes_wrap(const u8 *kek, int n, const u8 *plain, u8 *cipher); +int __must_check aes_unwrap(const u8 *kek, int n, const u8 *cipher, u8 *plain); +int __must_check omac1_aes_128_vector(const u8 *key, size_t num_elem, + const u8 *addr[], const size_t *len, + u8 *mac); +int __must_check omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, + u8 *mac); +int __must_check aes_128_encrypt_block(const u8 *key, const u8 *in, u8 *out); +int __must_check aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, + u8 *data, size_t data_len); +int __must_check aes_128_eax_encrypt(const u8 *key, + const u8 *nonce, size_t nonce_len, + const u8 *hdr, size_t hdr_len, + u8 *data, size_t data_len, u8 *tag); +int __must_check aes_128_eax_decrypt(const u8 *key, + const u8 *nonce, size_t nonce_len, + const u8 *hdr, size_t hdr_len, + u8 *data, size_t data_len, const u8 *tag); +int __must_check aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, + size_t data_len); +int __must_check aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, + size_t data_len); + +#endif /* AES_WRAP_H */ diff --git a/components/wpa_supplicant/include/crypto/base64.h b/components/wpa_supplicant/include/crypto/base64.h new file mode 100644 index 000000000..b87a1682f --- /dev/null +++ b/components/wpa_supplicant/include/crypto/base64.h @@ -0,0 +1,23 @@ +/* + * Base64 encoding/decoding (RFC1341) + * Copyright (c) 2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef BASE64_H +#define BASE64_H + +unsigned char * base64_encode(const unsigned char *src, size_t len, + size_t *out_len); +unsigned char * base64_decode(const unsigned char *src, size_t len, + size_t *out_len); + +#endif /* BASE64_H */ diff --git a/components/wpa_supplicant/include/crypto/common.h b/components/wpa_supplicant/include/crypto/common.h new file mode 100644 index 000000000..319b861e4 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/common.h @@ -0,0 +1,481 @@ +/* + * wpa_supplicant/hostapd / common helper functions, etc. + * Copyright (c) 2002-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef COMMON_H +#define COMMON_H + +#include "os.h" + +#if defined(__XTENSA__) +#include +#define __BYTE_ORDER BYTE_ORDER +#define __LITTLE_ENDIAN LITTLE_ENDIAN +#define __BIG_ENDIAN BIG_ENDIAN +#endif /*__XTENSA__*/ + +#if defined(__linux__) || defined(__GLIBC__) +#include +#include +#endif /* __linux__ */ + +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ + defined(__OpenBSD__) +#include +#include +#define __BYTE_ORDER _BYTE_ORDER +#define __LITTLE_ENDIAN _LITTLE_ENDIAN +#define __BIG_ENDIAN _BIG_ENDIAN +#ifdef __OpenBSD__ +#define bswap_16 swap16 +#define bswap_32 swap32 +#define bswap_64 swap64 +#else /* __OpenBSD__ */ +#define bswap_16 bswap16 +#define bswap_32 bswap32 +#define bswap_64 bswap64 +#endif /* __OpenBSD__ */ +#endif /* defined(__FreeBSD__) || defined(__NetBSD__) || + * defined(__DragonFly__) || defined(__OpenBSD__) */ + +#ifdef __APPLE__ +#include +#include +#define __BYTE_ORDER _BYTE_ORDER +#define __LITTLE_ENDIAN _LITTLE_ENDIAN +#define __BIG_ENDIAN _BIG_ENDIAN +static inline unsigned short bswap_16(unsigned short v) +{ + return ((v & 0xff) << 8) | (v >> 8); +} + +static inline unsigned int bswap_32(unsigned int v) +{ + return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | + ((v & 0xff0000) >> 8) | (v >> 24); +} +#endif /* __APPLE__ */ + +#ifdef CONFIG_TI_COMPILER +#define __BIG_ENDIAN 4321 +#define __LITTLE_ENDIAN 1234 +#ifdef __big_endian__ +#define __BYTE_ORDER __BIG_ENDIAN +#else +#define __BYTE_ORDER __LITTLE_ENDIAN +#endif +#endif /* CONFIG_TI_COMPILER */ + +#ifdef __SYMBIAN32__ +#define __BIG_ENDIAN 4321 +#define __LITTLE_ENDIAN 1234 +#define __BYTE_ORDER __LITTLE_ENDIAN +#endif /* __SYMBIAN32__ */ + +#ifdef CONFIG_NATIVE_WINDOWS +#include + +typedef int socklen_t; + +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0 /* not supported */ +#endif + +#endif /* CONFIG_NATIVE_WINDOWS */ + +#ifdef _MSC_VER +#define inline __inline + +#undef vsnprintf +#define vsnprintf _vsnprintf +#undef close +#define close closesocket +#endif /* _MSC_VER */ + + +/* Define platform specific integer types */ + +#ifdef _MSC_VER +typedef UINT64 u64; +typedef UINT32 u32; +typedef UINT16 u16; +typedef UINT8 u8; +typedef INT64 s64; +typedef INT32 s32; +typedef INT16 s16; +typedef INT8 s8; +#define WPA_TYPES_DEFINED +#endif /* _MSC_VER */ + +#ifdef __vxworks +typedef unsigned long long u64; +typedef UINT32 u32; +typedef UINT16 u16; +typedef UINT8 u8; +typedef long long s64; +typedef INT32 s32; +typedef INT16 s16; +typedef INT8 s8; +#define WPA_TYPES_DEFINED +#endif /* __vxworks */ + +#ifdef CONFIG_TI_COMPILER +#ifdef _LLONG_AVAILABLE +typedef unsigned long long u64; +#else +/* + * TODO: 64-bit variable not available. Using long as a workaround to test the + * build, but this will likely not work for all operations. + */ +typedef unsigned long u64; +#endif +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +#define WPA_TYPES_DEFINED +#endif /* CONFIG_TI_COMPILER */ + +#ifdef __SYMBIAN32__ +#define __REMOVE_PLATSEC_DIAGNOSTICS__ +#include +typedef TUint64 u64; +typedef TUint32 u32; +typedef TUint16 u16; +typedef TUint8 u8; +#define WPA_TYPES_DEFINED +#endif /* __SYMBIAN32__ */ + +#ifndef WPA_TYPES_DEFINED +#ifdef CONFIG_USE_INTTYPES_H +#include +#else +#include +#endif + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; +typedef int64_t s64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; +#define WPA_TYPES_DEFINED +#endif /* !WPA_TYPES_DEFINED */ + + +/* Define platform specific byte swapping macros */ + +#if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) + +static inline unsigned short wpa_swap_16(unsigned short v) +{ + return ((v & 0xff) << 8) | (v >> 8); +} + +static inline unsigned int wpa_swap_32(unsigned int v) +{ + return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | + ((v & 0xff0000) >> 8) | (v >> 24); +} + +#define le_to_host16(n) (n) +#define host_to_le16(n) (n) +#define be_to_host16(n) wpa_swap_16(n) +#define host_to_be16(n) wpa_swap_16(n) +#define le_to_host32(n) (n) +#define be_to_host32(n) wpa_swap_32(n) +#define host_to_be32(n) wpa_swap_32(n) + +#define WPA_BYTE_SWAP_DEFINED + +#endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */ + + +#ifndef WPA_BYTE_SWAP_DEFINED + +#ifndef __BYTE_ORDER +#ifndef __LITTLE_ENDIAN +#ifndef __BIG_ENDIAN +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#if defined(sparc) +#define __BYTE_ORDER __BIG_ENDIAN +#endif +#endif /* __BIG_ENDIAN */ +#endif /* __LITTLE_ENDIAN */ +#endif /* __BYTE_ORDER */ + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define le_to_host16(n) ((__force u16) (le16) (n)) +#define host_to_le16(n) ((__force le16) (u16) (n)) +#define be_to_host16(n) bswap_16((__force u16) (be16) (n)) +#define host_to_be16(n) ((__force be16) bswap_16((n))) +#define le_to_host32(n) ((__force u32) (le32) (n)) +#define host_to_le32(n) ((__force le32) (u32) (n)) +#define be_to_host32(n) bswap_32((__force u32) (be32) (n)) +#define host_to_be32(n) ((__force be32) bswap_32((n))) +#define le_to_host64(n) ((__force u64) (le64) (n)) +#define host_to_le64(n) ((__force le64) (u64) (n)) +#define be_to_host64(n) bswap_64((__force u64) (be64) (n)) +#define host_to_be64(n) ((__force be64) bswap_64((n))) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define le_to_host16(n) bswap_16(n) +#define host_to_le16(n) bswap_16(n) +#define be_to_host16(n) (n) +#define host_to_be16(n) (n) +#define le_to_host32(n) bswap_32(n) +#define be_to_host32(n) (n) +#define host_to_be32(n) (n) +#define le_to_host64(n) bswap_64(n) +#define host_to_le64(n) bswap_64(n) +#define be_to_host64(n) (n) +#define host_to_be64(n) (n) +#ifndef WORDS_BIGENDIAN +#define WORDS_BIGENDIAN +#endif +#else +#error Could not determine CPU byte order +#endif + +#define WPA_BYTE_SWAP_DEFINED +#endif /* !WPA_BYTE_SWAP_DEFINED */ + + +/* Macros for handling unaligned memory accesses */ + +#define WPA_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) +#define WPA_PUT_BE16(a, val) \ + do { \ + (a)[0] = ((u16) (val)) >> 8; \ + (a)[1] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ + ((u32) (a)[2])) +#define WPA_PUT_BE24(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[2] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ + (((u32) (a)[1]) << 8) | ((u32) (a)[0])) +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ + (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ + (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ + (((u64) (a)[6]) << 8) | ((u64) (a)[7])) +#define WPA_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ + (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ + (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ + (((u64) (a)[1]) << 8) | ((u64) (a)[0])) + + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif +#ifndef ETH_P_ALL +#define ETH_P_ALL 0x0003 +#endif +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ +#ifndef ETH_P_EAPOL +#define ETH_P_EAPOL ETH_P_PAE +#endif /* ETH_P_EAPOL */ +#ifndef ETH_P_RSN_PREAUTH +#define ETH_P_RSN_PREAUTH 0x88c7 +#endif /* ETH_P_RSN_PREAUTH */ +#ifndef ETH_P_RRB +#define ETH_P_RRB 0x890D +#endif /* ETH_P_RRB */ + + +#ifdef __GNUC__ +#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) +#define STRUCT_PACKED __attribute__ ((packed)) +#else +#define PRINTF_FORMAT(a,b) +#define STRUCT_PACKED +#endif + +#ifdef CONFIG_ANSI_C_EXTRA + +#if !defined(_MSC_VER) || _MSC_VER < 1400 +/* snprintf - used in number of places; sprintf() is _not_ a good replacement + * due to possible buffer overflow; see, e.g., + * http://www.ijs.si/software/snprintf/ for portable implementation of + * snprintf. */ +int snprintf(char *str, size_t size, const char *format, ...); + +/* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ +int vsnprintf(char *str, size_t size, const char *format, va_list ap); +#endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */ + +/* getopt - only used in main.c */ +int getopt(int argc, char *const argv[], const char *optstring); +extern char *optarg; +extern int optind; + +#ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF +#ifndef __socklen_t_defined +typedef int socklen_t; +#endif +#endif + +/* inline - define as __inline or just define it to be empty, if needed */ +#ifdef CONFIG_NO_INLINE +#define inline +#else +#define inline __inline +#endif + +#ifndef __func__ +#define __func__ "__func__ not defined" +#endif + +#ifndef bswap_16 +#define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) +#endif + +#ifndef bswap_32 +#define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ + (((u32) (a) << 8) & 0xff0000) | \ + (((u32) (a) >> 8) & 0xff00) | \ + (((u32) (a) >> 24) & 0xff)) +#endif + +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0 +#endif + +#ifdef _WIN32_WCE +void perror(const char *s); +#endif /* _WIN32_WCE */ + +#endif /* CONFIG_ANSI_C_EXTRA */ + +#ifndef MAC2STR +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" +#endif + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +/* + * Definitions for sparse validation + * (http://kernel.org/pub/linux/kernel/people/josh/sparse/) + */ +#ifdef __CHECKER__ +#define __force __attribute__((force)) +#define __bitwise __attribute__((bitwise)) +#else +#define __force +#define __bitwise +#endif + +typedef u16 __bitwise be16; +typedef u16 __bitwise le16; +typedef u32 __bitwise be32; +typedef u32 __bitwise le32; +typedef u64 __bitwise be64; +typedef u64 __bitwise le64; + +#ifndef __must_check +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +#define __must_check __attribute__((__warn_unused_result__)) +#else +#define __must_check +#endif /* __GNUC__ */ +#endif /* __must_check */ + +int hwaddr_aton(const char *txt, u8 *addr); +int hwaddr_aton2(const char *txt, u8 *addr); +int hexstr2bin(const char *hex, u8 *buf, size_t len); +void inc_byte_array(u8 *counter, size_t len); +void wpa_get_ntp_timestamp(u8 *buf); +int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); +int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, + size_t len); + +#ifdef CONFIG_NATIVE_WINDOWS +void wpa_unicode2ascii_inplace(TCHAR *str); +TCHAR * wpa_strdup_tchar(const char *str); +#else /* CONFIG_NATIVE_WINDOWS */ +#define wpa_unicode2ascii_inplace(s) do { } while (0) +#define wpa_strdup_tchar(s) strdup((s)) +#endif /* CONFIG_NATIVE_WINDOWS */ + +const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); + +static inline int is_zero_ether_addr(const u8 *a) +{ + return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]); +} + +/* + * gcc 4.4 ends up generating strict-aliasing warnings about some very common + * networking socket uses that do not really result in a real problem and + * cannot be easily avoided with union-based type-punning due to struct + * definitions including another struct in system header files. To avoid having + * to fully disable strict-aliasing warnings, provide a mechanism to hide the + * typecast from aliasing for now. A cleaner solution will hopefully be found + * in the future to handle these cases. + */ +void * __hide_aliasing_typecast(void *foo); +#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a)) + +#endif /* COMMON_H */ diff --git a/components/wpa_supplicant/include/crypto/crypto.h b/components/wpa_supplicant/include/crypto/crypto.h new file mode 100644 index 000000000..f0b9f2243 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/crypto.h @@ -0,0 +1,471 @@ +/* + * WPA Supplicant / wrapper functions for crypto libraries + * Copyright (c) 2004-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + * + * This file defines the cryptographic functions that need to be implemented + * for wpa_supplicant and hostapd. When TLS is not used, internal + * implementation of MD5, SHA1, and AES is used and no external libraries are + * required. When TLS is enabled (e.g., by enabling EAP-TLS or EAP-PEAP), the + * crypto library used by the TLS implementation is expected to be used for + * non-TLS needs, too, in order to save space by not implementing these + * functions twice. + * + * Wrapper code for using each crypto library is in its own file (crypto*.c) + * and one of these files is build and linked in to provide the functions + * defined here. + */ + +#ifndef CRYPTO_H +#define CRYPTO_H + +/** + * md4_vector - MD4 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac); + +/** + * md5_vector - MD5 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac); + +#ifdef CONFIG_FIPS +/** + * md5_vector_non_fips_allow - MD5 hash for data vector (non-FIPS use allowed) + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +int md5_vector_non_fips_allow(size_t num_elem, const u8 *addr[], + const size_t *len, u8 *mac); +#else /* CONFIG_FIPS */ +#define md5_vector_non_fips_allow md5_vector +#endif /* CONFIG_FIPS */ + + +/** + * sha1_vector - SHA-1 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, + u8 *mac); + +/** + * fips186_2-prf - NIST FIPS Publication 186-2 change notice 1 PRF + * @seed: Seed/key for the PRF + * @seed_len: Seed length in bytes + * @x: Buffer for PRF output + * @xlen: Output length in bytes + * Returns: 0 on success, -1 on failure + * + * This function implements random number generation specified in NIST FIPS + * Publication 186-2 for EAP-SIM. This PRF uses a function that is similar to + * SHA-1, but has different message padding. + */ +int __must_check fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, + size_t xlen); + +/** + * sha256_vector - SHA256 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 on failure + */ +int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, + u8 *mac); + +/** + * des_encrypt - Encrypt one block with DES + * @clear: 8 octets (in) + * @key: 7 octets (in) (no parity bits included) + * @cypher: 8 octets (out) + */ +void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher); + +/** + * aes_encrypt_init - Initialize AES for encryption + * @key: Encryption key + * @len: Key length in bytes (usually 16, i.e., 128 bits) + * Returns: Pointer to context data or %NULL on failure + */ +void * aes_encrypt_init(const u8 *key, size_t len); + +/** + * aes_encrypt - Encrypt one AES block + * @ctx: Context pointer from aes_encrypt_init() + * @plain: Plaintext data to be encrypted (16 bytes) + * @crypt: Buffer for the encrypted data (16 bytes) + */ +void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt); + +/** + * aes_encrypt_deinit - Deinitialize AES encryption + * @ctx: Context pointer from aes_encrypt_init() + */ +void aes_encrypt_deinit(void *ctx); + +/** + * aes_decrypt_init - Initialize AES for decryption + * @key: Decryption key + * @len: Key length in bytes (usually 16, i.e., 128 bits) + * Returns: Pointer to context data or %NULL on failure + */ +void * aes_decrypt_init(const u8 *key, size_t len); + +/** + * aes_decrypt - Decrypt one AES block + * @ctx: Context pointer from aes_encrypt_init() + * @crypt: Encrypted data (16 bytes) + * @plain: Buffer for the decrypted data (16 bytes) + */ +void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain); + +/** + * aes_decrypt_deinit - Deinitialize AES decryption + * @ctx: Context pointer from aes_encrypt_init() + */ +void aes_decrypt_deinit(void *ctx); + + +enum crypto_hash_alg { + CRYPTO_HASH_ALG_MD5, CRYPTO_HASH_ALG_SHA1, + CRYPTO_HASH_ALG_HMAC_MD5, CRYPTO_HASH_ALG_HMAC_SHA1, + CRYPTO_HASH_ALG_SHA256, CRYPTO_HASH_ALG_HMAC_SHA256 +}; + + +struct crypto_hash; + +/** + * crypto_hash_init - Initialize hash/HMAC function + * @alg: Hash algorithm + * @key: Key for keyed hash (e.g., HMAC) or %NULL if not needed + * @key_len: Length of the key in bytes + * Returns: Pointer to hash context to use with other hash functions or %NULL + * on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, + size_t key_len); + +/** + * crypto_hash_update - Add data to hash calculation + * @ctx: Context pointer from crypto_hash_init() + * @data: Data buffer to add + * @len: Length of the buffer + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len); + +/** + * crypto_hash_finish - Complete hash calculation + * @ctx: Context pointer from crypto_hash_init() + * @hash: Buffer for hash value or %NULL if caller is just freeing the hash + * context + * @len: Pointer to length of the buffer or %NULL if caller is just freeing the + * hash context; on return, this is set to the actual length of the hash value + * Returns: 0 on success, -1 if buffer is too small (len set to needed length), + * or -2 on other failures (including failed crypto_hash_update() operations) + * + * This function calculates the hash value and frees the context buffer that + * was used for hash calculation. + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int crypto_hash_finish(struct crypto_hash *ctx, u8 *hash, size_t *len); + + +enum crypto_cipher_alg { + CRYPTO_CIPHER_NULL = 0, CRYPTO_CIPHER_ALG_AES, CRYPTO_CIPHER_ALG_3DES, + CRYPTO_CIPHER_ALG_DES, CRYPTO_CIPHER_ALG_RC2, CRYPTO_CIPHER_ALG_RC4 +}; + +struct crypto_cipher; + +/** + * crypto_cipher_init - Initialize block/stream cipher function + * @alg: Cipher algorithm + * @iv: Initialization vector for block ciphers or %NULL for stream ciphers + * @key: Cipher key + * @key_len: Length of key in bytes + * Returns: Pointer to cipher context to use with other cipher functions or + * %NULL on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, + const u8 *iv, const u8 *key, + size_t key_len); + +/** + * crypto_cipher_encrypt - Cipher encrypt + * @ctx: Context pointer from crypto_cipher_init() + * @plain: Plaintext to cipher + * @crypt: Resulting ciphertext + * @len: Length of the plaintext + * Returns: 0 on success, -1 on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_cipher_encrypt(struct crypto_cipher *ctx, + const u8 *plain, u8 *crypt, size_t len); + +/** + * crypto_cipher_decrypt - Cipher decrypt + * @ctx: Context pointer from crypto_cipher_init() + * @crypt: Ciphertext to decrypt + * @plain: Resulting plaintext + * @len: Length of the cipher text + * Returns: 0 on success, -1 on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_cipher_decrypt(struct crypto_cipher *ctx, + const u8 *crypt, u8 *plain, size_t len); + +/** + * crypto_cipher_decrypt - Free cipher context + * @ctx: Context pointer from crypto_cipher_init() + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +void crypto_cipher_deinit(struct crypto_cipher *ctx); + + +struct crypto_public_key; +struct crypto_private_key; + +/** + * crypto_public_key_import - Import an RSA public key + * @key: Key buffer (DER encoded RSA public key) + * @len: Key buffer length in bytes + * Returns: Pointer to the public key or %NULL on failure + * + * This function can just return %NULL if the crypto library supports X.509 + * parsing. In that case, crypto_public_key_from_cert() is used to import the + * public key from a certificate. + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +struct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len); + +/** + * crypto_private_key_import - Import an RSA private key + * @key: Key buffer (DER encoded RSA private key) + * @len: Key buffer length in bytes + * @passwd: Key encryption password or %NULL if key is not encrypted + * Returns: Pointer to the private key or %NULL on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +struct crypto_private_key * crypto_private_key_import(const u8 *key, + size_t len, + const char *passwd); + +/** + * crypto_public_key_from_cert - Import an RSA public key from a certificate + * @buf: DER encoded X.509 certificate + * @len: Certificate buffer length in bytes + * Returns: Pointer to public key or %NULL on failure + * + * This function can just return %NULL if the crypto library does not support + * X.509 parsing. In that case, internal code will be used to parse the + * certificate and public key is imported using crypto_public_key_import(). + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +struct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, + size_t len); + +/** + * crypto_public_key_encrypt_pkcs1_v15 - Public key encryption (PKCS #1 v1.5) + * @key: Public key + * @in: Plaintext buffer + * @inlen: Length of plaintext buffer in bytes + * @out: Output buffer for encrypted data + * @outlen: Length of output buffer in bytes; set to used length on success + * Returns: 0 on success, -1 on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_public_key_encrypt_pkcs1_v15( + struct crypto_public_key *key, const u8 *in, size_t inlen, + u8 *out, size_t *outlen); + +/** + * crypto_private_key_decrypt_pkcs1_v15 - Private key decryption (PKCS #1 v1.5) + * @key: Private key + * @in: Encrypted buffer + * @inlen: Length of encrypted buffer in bytes + * @out: Output buffer for encrypted data + * @outlen: Length of output buffer in bytes; set to used length on success + * Returns: 0 on success, -1 on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_private_key_decrypt_pkcs1_v15( + struct crypto_private_key *key, const u8 *in, size_t inlen, + u8 *out, size_t *outlen); + +/** + * crypto_private_key_sign_pkcs1 - Sign with private key (PKCS #1) + * @key: Private key from crypto_private_key_import() + * @in: Plaintext buffer + * @inlen: Length of plaintext buffer in bytes + * @out: Output buffer for encrypted (signed) data + * @outlen: Length of output buffer in bytes; set to used length on success + * Returns: 0 on success, -1 on failure + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_private_key_sign_pkcs1(struct crypto_private_key *key, + const u8 *in, size_t inlen, + u8 *out, size_t *outlen); + +/** + * crypto_public_key_free - Free public key + * @key: Public key + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +void crypto_public_key_free(struct crypto_public_key *key); + +/** + * crypto_private_key_free - Free private key + * @key: Private key from crypto_private_key_import() + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +void crypto_private_key_free(struct crypto_private_key *key); + +/** + * crypto_public_key_decrypt_pkcs1 - Decrypt PKCS #1 signature + * @key: Public key + * @crypt: Encrypted signature data (using the private key) + * @crypt_len: Encrypted signature data length + * @plain: Buffer for plaintext (at least crypt_len bytes) + * @plain_len: Plaintext length (max buffer size on input, real len on output); + * Returns: 0 on success, -1 on failure + */ +int __must_check crypto_public_key_decrypt_pkcs1( + struct crypto_public_key *key, const u8 *crypt, size_t crypt_len, + u8 *plain, size_t *plain_len); + +/** + * crypto_global_init - Initialize crypto wrapper + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_global_init(void); + +/** + * crypto_global_deinit - Deinitialize crypto wrapper + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +void crypto_global_deinit(void); + +/** + * crypto_mod_exp - Modular exponentiation of large integers + * @base: Base integer (big endian byte array) + * @base_len: Length of base integer in bytes + * @power: Power integer (big endian byte array) + * @power_len: Length of power integer in bytes + * @modulus: Modulus integer (big endian byte array) + * @modulus_len: Length of modulus integer in bytes + * @result: Buffer for the result + * @result_len: Result length (max buffer size on input, real len on output) + * Returns: 0 on success, -1 on failure + * + * This function calculates result = base ^ power mod modulus. modules_len is + * used as the maximum size of modulus buffer. It is set to the used size on + * success. + * + * This function is only used with internal TLSv1 implementation + * (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need + * to implement this. + */ +int __must_check crypto_mod_exp(const u8 *base, size_t base_len, + const u8 *power, size_t power_len, + const u8 *modulus, size_t modulus_len, + u8 *result, size_t *result_len); + +/** + * rc4_skip - XOR RC4 stream to given data with skip-stream-start + * @key: RC4 key + * @keylen: RC4 key length + * @skip: number of bytes to skip from the beginning of the RC4 stream + * @data: data to be XOR'ed with RC4 stream + * @data_len: buf length + * Returns: 0 on success, -1 on failure + * + * Generate RC4 pseudo random stream for the given key, skip beginning of the + * stream, and XOR the end result with the data buffer to perform RC4 + * encryption/decryption. + */ +int rc4_skip(const u8 *key, size_t keylen, size_t skip, + u8 *data, size_t data_len); + +#endif /* CRYPTO_H */ diff --git a/components/wpa_supplicant/include/crypto/dh_group5.h b/components/wpa_supplicant/include/crypto/dh_group5.h new file mode 100644 index 000000000..595f1114f --- /dev/null +++ b/components/wpa_supplicant/include/crypto/dh_group5.h @@ -0,0 +1,23 @@ +/* + * Diffie-Hellman group 5 operations + * Copyright (c) 2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef DH_GROUP5_H +#define DH_GROUP5_H + +void * dh5_init(struct wpabuf **priv, struct wpabuf **publ); +struct wpabuf * dh5_derive_shared(void *ctx, const struct wpabuf *peer_public, + const struct wpabuf *own_private); +void dh5_free(void *ctx); + +#endif /* DH_GROUP5_H */ diff --git a/components/wpa_supplicant/include/crypto/dh_groups.h b/components/wpa_supplicant/include/crypto/dh_groups.h new file mode 100644 index 000000000..5c61539b7 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/dh_groups.h @@ -0,0 +1,32 @@ +/* + * Diffie-Hellman groups + * Copyright (c) 2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef DH_GROUPS_H +#define DH_GROUPS_H + +struct dh_group { + int id; + const u8 *generator; + size_t generator_len; + const u8 *prime; + size_t prime_len; +}; + +const struct dh_group * dh_groups_get(int id); +struct wpabuf * dh_init(const struct dh_group *dh, struct wpabuf **priv); +struct wpabuf * dh_derive_shared(const struct wpabuf *peer_public, + const struct wpabuf *own_private, + const struct dh_group *dh); + +#endif /* DH_GROUPS_H */ diff --git a/components/wpa_supplicant/include/crypto/includes.h b/components/wpa_supplicant/include/crypto/includes.h new file mode 100644 index 000000000..dbc65759b --- /dev/null +++ b/components/wpa_supplicant/include/crypto/includes.h @@ -0,0 +1,65 @@ +/* + * wpa_supplicant/hostapd - Default include files + * Copyright (c) 2005-2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + * + * This header file is included into all C files so that commonly used header + * files can be selected with OS specific ifdef blocks in one place instead of + * having to have OS/C library specific selection in many files. + */ + +#ifndef INCLUDES_H +#define INCLUDES_H + +/* Include possible build time configuration before including anything else */ +//#include "build_config.h" //don't need anymore +#ifndef __ets__ +#include +#include +#include +#include +#ifndef _WIN32_WCE +#ifndef CONFIG_TI_COMPILER +#include +#include +#endif /* CONFIG_TI_COMPILER */ +#include +#endif /* _WIN32_WCE */ +#include +#include + +#ifndef CONFIG_TI_COMPILER +#ifndef _MSC_VER +#include +#endif /* _MSC_VER */ +#endif /* CONFIG_TI_COMPILER */ + +#ifndef CONFIG_NATIVE_WINDOWS +#ifndef CONFIG_TI_COMPILER +//#include +//#include +//#include +#ifndef __vxworks +#ifndef __SYMBIAN32__ +//#include +#endif /* __SYMBIAN32__ */ +#include +#endif /* __vxworks */ +#endif /* CONFIG_TI_COMPILER */ +#endif /* CONFIG_NATIVE_WINDOWS */ + +#else + +#include "rom/ets_sys.h" + +#endif /* !__ets__ */ + +#endif /* INCLUDES_H */ diff --git a/components/wpa_supplicant/include/crypto/md5.h b/components/wpa_supplicant/include/crypto/md5.h new file mode 100644 index 000000000..895259078 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/md5.h @@ -0,0 +1,35 @@ +/* + * MD5 hash implementation and interface functions + * Copyright (c) 2003-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef MD5_H +#define MD5_H + +#define MD5_MAC_LEN 16 + +int hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac); +int hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len, + u8 *mac); +#ifdef CONFIG_FIPS +int hmac_md5_vector_non_fips_allow(const u8 *key, size_t key_len, + size_t num_elem, const u8 *addr[], + const size_t *len, u8 *mac); +int hmac_md5_non_fips_allow(const u8 *key, size_t key_len, const u8 *data, + size_t data_len, u8 *mac); +#else /* CONFIG_FIPS */ +#define hmac_md5_vector_non_fips_allow hmac_md5_vector +#define hmac_md5_non_fips_allow hmac_md5 +#endif /* CONFIG_FIPS */ + +#endif /* MD5_H */ diff --git a/components/wpa_supplicant/include/crypto/md5_i.h b/components/wpa_supplicant/include/crypto/md5_i.h new file mode 100644 index 000000000..b7f659605 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/md5_i.h @@ -0,0 +1,29 @@ +/* + * MD5 internal definitions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef MD5_I_H +#define MD5_I_H + +struct MD5Context { + u32 buf[4]; + u32 bits[2]; + u8 in[64]; +}; + +void MD5Init(struct MD5Context *context); +void MD5Update(struct MD5Context *context, unsigned char const *buf, + unsigned len); +void MD5Final(unsigned char digest[16], struct MD5Context *context); + +#endif /* MD5_I_H */ diff --git a/components/wpa_supplicant/include/crypto/random.h b/components/wpa_supplicant/include/crypto/random.h new file mode 100644 index 000000000..cbfa8773f --- /dev/null +++ b/components/wpa_supplicant/include/crypto/random.h @@ -0,0 +1,34 @@ +/* + * Random number generator + * Copyright (c) 2010-2011, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef RANDOM_H +#define RANDOM_H + +#define CONFIG_NO_RANDOM_POOL + +#ifdef CONFIG_NO_RANDOM_POOL +#define random_init(e) do { } while (0) +#define random_deinit() do { } while (0) +#define random_add_randomness(b, l) do { } while (0) +#define random_get_bytes(b, l) os_get_random((b), (l)) +#define random_pool_ready() 1 +#define random_mark_pool_ready() do { } while (0) +#else /* CONFIG_NO_RANDOM_POOL */ +void random_init(const char *entropy_file); +void random_deinit(void); +void random_add_randomness(const void *buf, size_t len); +int random_get_bytes(void *buf, size_t len); +#endif /* CONFIG_NO_RANDOM_POOL */ + +#endif /* RANDOM_H */ diff --git a/components/wpa_supplicant/include/crypto/sha1.h b/components/wpa_supplicant/include/crypto/sha1.h new file mode 100644 index 000000000..b3d186bdb --- /dev/null +++ b/components/wpa_supplicant/include/crypto/sha1.h @@ -0,0 +1,33 @@ +/* + * SHA1 hash implementation and interface functions + * Copyright (c) 2003-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef SHA1_H +#define SHA1_H + +#define SHA1_MAC_LEN 20 + +int hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac); +int hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len, + u8 *mac); +int sha1_prf(const u8 *key, size_t key_len, const char *label, + const u8 *data, size_t data_len, u8 *buf, size_t buf_len); +int sha1_t_prf(const u8 *key, size_t key_len, const char *label, + const u8 *seed, size_t seed_len, u8 *buf, size_t buf_len); +//int __must_check tls_prf(const u8 *secret, size_t secret_len, +// const char *label, const u8 *seed, size_t seed_len, +// u8 *out, size_t outlen); +int pbkdf2_sha1(const char *passphrase, const char *ssid, size_t ssid_len, + int iterations, u8 *buf, size_t buflen); +#endif /* SHA1_H */ diff --git a/components/wpa_supplicant/include/crypto/sha1_i.h b/components/wpa_supplicant/include/crypto/sha1_i.h new file mode 100644 index 000000000..ec2f82f75 --- /dev/null +++ b/components/wpa_supplicant/include/crypto/sha1_i.h @@ -0,0 +1,29 @@ +/* + * SHA1 internal definitions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef SHA1_I_H +#define SHA1_I_H + +struct SHA1Context { + u32 state[5]; + u32 count[2]; + unsigned char buffer[64]; +}; + +void SHA1Init(struct SHA1Context *context); +void SHA1Update(struct SHA1Context *context, const void *data, u32 len); +void SHA1Final(unsigned char digest[20], struct SHA1Context *context); +void SHA1Transform(u32 state[5], const unsigned char buffer[64]); + +#endif /* SHA1_I_H */ diff --git a/components/wpa_supplicant/include/crypto/sha256.h b/components/wpa_supplicant/include/crypto/sha256.h new file mode 100644 index 000000000..dc597f09b --- /dev/null +++ b/components/wpa_supplicant/include/crypto/sha256.h @@ -0,0 +1,27 @@ +/* + * SHA256 hash implementation and interface functions + * Copyright (c) 2003-2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef SHA256_H +#define SHA256_H + +#define SHA256_MAC_LEN 32 + +void hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac); +void hmac_sha256(const u8 *key, size_t key_len, const u8 *data, + size_t data_len, u8 *mac); +void sha256_prf(const u8 *key, size_t key_len, const char *label, + const u8 *data, size_t data_len, u8 *buf, size_t buf_len); + +#endif /* SHA256_H */ diff --git a/components/wpa_supplicant/include/wpa/ap_config.h b/components/wpa_supplicant/include/wpa/ap_config.h new file mode 100644 index 000000000..761becb48 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/ap_config.h @@ -0,0 +1,544 @@ +/* + * hostapd / Configuration definitions and helpers functions + * Copyright (c) 2003-2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef HOSTAPD_CONFIG_H +#define HOSTAPD_CONFIG_H + +#include "wpa/defs.h" +//#include "ip_addr.h" +#include "wpa/wpa_common.h" +//#include "common/ieee802_11_common.h" +//#include "wps/wps.h" + +#define MAX_STA_COUNT 4 +#define MAX_VLAN_ID 4094 + +typedef u8 macaddr[ETH_ALEN]; + +struct mac_acl_entry { + macaddr addr; + int vlan_id; +}; + +struct hostapd_radius_servers; +struct ft_remote_r0kh; +struct ft_remote_r1kh; + +#define HOSTAPD_MAX_SSID_LEN 32 + +#define NUM_WEP_KEYS 4 +struct hostapd_wep_keys { + u8 idx; + u8 *key[NUM_WEP_KEYS]; + size_t len[NUM_WEP_KEYS]; + int keys_set; + size_t default_len; /* key length used for dynamic key generation */ +}; + +typedef enum hostap_security_policy { + SECURITY_PLAINTEXT = 0, + SECURITY_STATIC_WEP = 1, + SECURITY_IEEE_802_1X = 2, + SECURITY_WPA_PSK = 3, + SECURITY_WPA = 4 +} secpolicy; + +struct hostapd_ssid { + u8 ssid[HOSTAPD_MAX_SSID_LEN]; + size_t ssid_len; + unsigned int ssid_set:1; + unsigned int utf8_ssid:1; + +// char vlan[IFNAMSIZ + 1]; +// secpolicy security_policy; + + struct hostapd_wpa_psk *wpa_psk; + char *wpa_passphrase; +// char *wpa_psk_file; + + struct hostapd_wep_keys wep; + +#if 0 +#define DYNAMIC_VLAN_DISABLED 0 +#define DYNAMIC_VLAN_OPTIONAL 1 +#define DYNAMIC_VLAN_REQUIRED 2 + int dynamic_vlan; +#define DYNAMIC_VLAN_NAMING_WITHOUT_DEVICE 0 +#define DYNAMIC_VLAN_NAMING_WITH_DEVICE 1 +#define DYNAMIC_VLAN_NAMING_END 2 + int vlan_naming; +#ifdef CONFIG_FULL_DYNAMIC_VLAN + char *vlan_tagged_interface; +#endif /* CONFIG_FULL_DYNAMIC_VLAN */ + struct hostapd_wep_keys **dyn_vlan_keys; + size_t max_dyn_vlan_keys; +#endif +}; + +#if 0 +#define VLAN_ID_WILDCARD -1 + +struct hostapd_vlan { + struct hostapd_vlan *next; + int vlan_id; /* VLAN ID or -1 (VLAN_ID_WILDCARD) for wildcard entry */ + char ifname[IFNAMSIZ + 1]; + int dynamic_vlan; +#ifdef CONFIG_FULL_DYNAMIC_VLAN + +#define DVLAN_CLEAN_BR 0x1 +#define DVLAN_CLEAN_VLAN 0x2 +#define DVLAN_CLEAN_VLAN_PORT 0x4 +#define DVLAN_CLEAN_WLAN_PORT 0x8 + int clean; +#endif /* CONFIG_FULL_DYNAMIC_VLAN */ +}; +#endif + +#define PMK_LEN 32 +struct hostapd_sta_wpa_psk_short { + struct hostapd_sta_wpa_psk_short *next; + u8 psk[PMK_LEN]; +}; + +struct hostapd_wpa_psk { + struct hostapd_wpa_psk *next; + int group; + u8 psk[PMK_LEN]; + u8 addr[ETH_ALEN]; +}; + +#if 0 +struct hostapd_eap_user { + struct hostapd_eap_user *next; + u8 *identity; + size_t identity_len; + struct { + int vendor; + u32 method; + } methods[EAP_MAX_METHODS]; + u8 *password; + size_t password_len; + int phase2; + int force_version; + unsigned int wildcard_prefix:1; + unsigned int password_hash:1; /* whether password is hashed with + * nt_password_hash() */ + int ttls_auth; /* EAP_TTLS_AUTH_* bitfield */ +}; + +struct hostapd_radius_attr { + u8 type; + struct wpabuf *val; + struct hostapd_radius_attr *next; +}; + + +#define NUM_TX_QUEUES 4 + +struct hostapd_tx_queue_params { + int aifs; + int cwmin; + int cwmax; + int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */ +}; + + +#define MAX_ROAMING_CONSORTIUM_LEN 15 + +struct hostapd_roaming_consortium { + u8 len; + u8 oi[MAX_ROAMING_CONSORTIUM_LEN]; +}; + +struct hostapd_lang_string { + u8 lang[3]; + u8 name_len; + u8 name[252]; +}; + +#define MAX_NAI_REALMS 10 +#define MAX_NAI_REALMLEN 255 +#define MAX_NAI_EAP_METHODS 5 +#define MAX_NAI_AUTH_TYPES 4 +struct hostapd_nai_realm_data { + u8 encoding; + char realm_buf[MAX_NAI_REALMLEN + 1]; + char *realm[MAX_NAI_REALMS]; + u8 eap_method_count; + struct hostapd_nai_realm_eap { + u8 eap_method; + u8 num_auths; + u8 auth_id[MAX_NAI_AUTH_TYPES]; + u8 auth_val[MAX_NAI_AUTH_TYPES]; + } eap_method[MAX_NAI_EAP_METHODS]; +}; +#endif + +/** + * struct hostapd_bss_config - Per-BSS configuration + */ +struct hostapd_bss_config { +// char iface[IFNAMSIZ + 1]; +// char bridge[IFNAMSIZ + 1]; +// char wds_bridge[IFNAMSIZ + 1]; + +// enum hostapd_logger_level logger_syslog_level, logger_stdout_level; + +// unsigned int logger_syslog; /* module bitfield */ +// unsigned int logger_stdout; /* module bitfield */ + +// char *dump_log_name; /* file name for state dump (SIGUSR1) */ + + int max_num_sta; /* maximum number of STAs in station table */ + + int dtim_period; + + int ieee802_1x; /* use IEEE 802.1X */ + int eapol_version; +// int eap_server; /* Use internal EAP server instead of external +// * RADIUS server */ +// struct hostapd_eap_user *eap_user; +// char *eap_user_sqlite; +// char *eap_sim_db; +// struct hostapd_ip_addr own_ip_addr; +// char *nas_identifier; +// struct hostapd_radius_servers *radius; +// int acct_interim_interval; +// int radius_request_cui; +// struct hostapd_radius_attr *radius_auth_req_attr; +// struct hostapd_radius_attr *radius_acct_req_attr; +// int radius_das_port; +// unsigned int radius_das_time_window; +// int radius_das_require_event_timestamp; +// struct hostapd_ip_addr radius_das_client_addr; +// u8 *radius_das_shared_secret; +// size_t radius_das_shared_secret_len; + + struct hostapd_ssid ssid; + +// char *eap_req_id_text; /* optional displayable message sent with +// * EAP Request-Identity */ +// size_t eap_req_id_text_len; +// int eapol_key_index_workaround; + +// size_t default_wep_key_len; +// int individual_wep_key_len; + int wep_rekeying_period; + int broadcast_key_idx_min, broadcast_key_idx_max; +// int eap_reauth_period; + +// int ieee802_11f; /* use IEEE 802.11f (IAPP) */ +// char iapp_iface[IFNAMSIZ + 1]; /* interface used with IAPP broadcast +// * frames */ + + enum { + ACCEPT_UNLESS_DENIED = 0, + DENY_UNLESS_ACCEPTED = 1, + USE_EXTERNAL_RADIUS_AUTH = 2 + } macaddr_acl; +// struct mac_acl_entry *accept_mac; +// int num_accept_mac; +// struct mac_acl_entry *deny_mac; +// int num_deny_mac; +// int wds_sta; +// int isolate; + + int auth_algs; /* bitfield of allowed IEEE 802.11 authentication + * algorithms, WPA_AUTH_ALG_{OPEN,SHARED,LEAP} */ + + int wpa; /* bitfield of WPA_PROTO_WPA, WPA_PROTO_RSN */ + int wpa_key_mgmt; +#ifdef CONFIG_IEEE80211W + enum mfp_options ieee80211w; + /* dot11AssociationSAQueryMaximumTimeout (in TUs) */ + unsigned int assoc_sa_query_max_timeout; + /* dot11AssociationSAQueryRetryTimeout (in TUs) */ + int assoc_sa_query_retry_timeout; +#endif /* CONFIG_IEEE80211W */ + enum { + PSK_RADIUS_IGNORED = 0, + PSK_RADIUS_ACCEPTED = 1, + PSK_RADIUS_REQUIRED = 2 + } wpa_psk_radius; + int wpa_pairwise; + int wpa_group; + int wpa_group_rekey; + int wpa_strict_rekey; + int wpa_gmk_rekey; + int wpa_ptk_rekey; + int rsn_pairwise; + int rsn_preauth; + char *rsn_preauth_interfaces; + int peerkey; + +#ifdef CONFIG_IEEE80211R + /* IEEE 802.11r - Fast BSS Transition */ + u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN]; + u8 r1_key_holder[FT_R1KH_ID_LEN]; + u32 r0_key_lifetime; + u32 reassociation_deadline; + struct ft_remote_r0kh *r0kh_list; + struct ft_remote_r1kh *r1kh_list; + int pmk_r1_push; + int ft_over_ds; +#endif /* CONFIG_IEEE80211R */ + +// char *ctrl_interface; /* directory for UNIX domain sockets */ +#ifndef CONFIG_NATIVE_WINDOWS +// gid_t ctrl_interface_gid; +#endif /* CONFIG_NATIVE_WINDOWS */ +// int ctrl_interface_gid_set; + +// char *ca_cert; +// char *server_cert; +// char *private_key; +// char *private_key_passwd; +// int check_crl; +// char *dh_file; +// u8 *pac_opaque_encr_key; +// u8 *eap_fast_a_id; +// size_t eap_fast_a_id_len; +// char *eap_fast_a_id_info; +// int eap_fast_prov; +// int pac_key_lifetime; +// int pac_key_refresh_time; +// int eap_sim_aka_result_ind; +// int tnc; +// int fragment_size; +// u16 pwd_group; + +// char *radius_server_clients; +// int radius_server_auth_port; +// int radius_server_ipv6; + +// char *test_socket; /* UNIX domain socket path for driver_test */ + +// int use_pae_group_addr; /* Whether to send EAPOL frames to PAE group +// * address instead of individual address +// * (for driver_wired.c). +// */ + + int ap_max_inactivity; + int ignore_broadcast_ssid; + + int wmm_enabled; + int wmm_uapsd; + +// struct hostapd_vlan *vlan, *vlan_tail; + + macaddr bssid; + + /* + * Maximum listen interval that STAs can use when associating with this + * BSS. If a STA tries to use larger value, the association will be + * denied with status code 51. + */ + u16 max_listen_interval; + +// int disable_pmksa_caching; +// int okc; /* Opportunistic Key Caching */ + +// int wps_state; +#ifdef CONFIG_WPS + int ap_setup_locked; + u8 uuid[16]; + char *wps_pin_requests; + char *device_name; + char *manufacturer; + char *model_name; + char *model_number; + char *serial_number; + u8 device_type[WPS_DEV_TYPE_LEN]; + char *config_methods; + u8 os_version[4]; + char *ap_pin; + int skip_cred_build; + u8 *extra_cred; + size_t extra_cred_len; + int wps_cred_processing; + u8 *ap_settings; + size_t ap_settings_len; + char *upnp_iface; + char *friendly_name; + char *manufacturer_url; + char *model_description; + char *model_url; + char *upc; + struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS]; + int wps_nfc_dev_pw_id; + struct wpabuf *wps_nfc_dh_pubkey; + struct wpabuf *wps_nfc_dh_privkey; + struct wpabuf *wps_nfc_dev_pw; +#endif /* CONFIG_WPS */ +// int pbc_in_m1; + +#define P2P_ENABLED BIT(0) +#define P2P_GROUP_OWNER BIT(1) +#define P2P_GROUP_FORMATION BIT(2) +#define P2P_MANAGE BIT(3) +#define P2P_ALLOW_CROSS_CONNECTION BIT(4) +// int p2p; + +// int disassoc_low_ack; +// int skip_inactivity_poll; + +#define TDLS_PROHIBIT BIT(0) +#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1) +// int tdls; +// int disable_11n; +// int disable_11ac; + + /* IEEE 802.11v */ +// int time_advertisement; +// char *time_zone; +// int wnm_sleep_mode; +// int bss_transition; + + /* IEEE 802.11u - Interworking */ +// int interworking; +// int access_network_type; +// int internet; +// int asra; +// int esr; +// int uesa; +// int venue_info_set; +// u8 venue_group; +// u8 venue_type; +// u8 hessid[ETH_ALEN]; + + /* IEEE 802.11u - Roaming Consortium list */ +// unsigned int roaming_consortium_count; +// struct hostapd_roaming_consortium *roaming_consortium; + + /* IEEE 802.11u - Venue Name duples */ +// unsigned int venue_name_count; +// struct hostapd_lang_string *venue_name; + + /* IEEE 802.11u - Network Authentication Type */ +// u8 *network_auth_type; +// size_t network_auth_type_len; + + /* IEEE 802.11u - IP Address Type Availability */ +// u8 ipaddr_type_availability; +// u8 ipaddr_type_configured; + + /* IEEE 802.11u - 3GPP Cellular Network */ +// u8 *anqp_3gpp_cell_net; +// size_t anqp_3gpp_cell_net_len; + + /* IEEE 802.11u - Domain Name */ +// u8 *domain_name; +// size_t domain_name_len; + +// unsigned int nai_realm_count; +// struct hostapd_nai_realm_data *nai_realm_data; + +// u16 gas_comeback_delay; +// int gas_frag_limit; + +#ifdef CONFIG_HS20 + int hs20; + int disable_dgaf; + unsigned int hs20_oper_friendly_name_count; + struct hostapd_lang_string *hs20_oper_friendly_name; + u8 *hs20_wan_metrics; + u8 *hs20_connection_capability; + size_t hs20_connection_capability_len; + u8 *hs20_operating_class; + u8 hs20_operating_class_len; +#endif /* CONFIG_HS20 */ + +// u8 wps_rf_bands; /* RF bands for WPS (WPS_RF_*) */ + +#ifdef CONFIG_RADIUS_TEST + char *dump_msk_file; +#endif /* CONFIG_RADIUS_TEST */ + +// struct wpabuf *vendor_elements; +}; + + +/** + * struct hostapd_config - Per-radio interface configuration + */ +struct hostapd_config { + struct hostapd_bss_config *bss, *last_bss; + size_t num_bss; + + u16 beacon_int; + int rts_threshold; + int fragm_threshold; + u8 send_probe_response; + u8 channel; + enum hostapd_hw_mode hw_mode; /* HOSTAPD_MODE_IEEE80211A, .. */ + enum { + LONG_PREAMBLE = 0, + SHORT_PREAMBLE = 1 + } preamble; + + int *supported_rates; + int *basic_rates; + + const struct wpa_driver_ops *driver; + + int ap_table_max_size; + int ap_table_expiration_time; + + char country[3]; /* first two octets: country code as described in + * ISO/IEC 3166-1. Third octet: + * ' ' (ascii 32): all environments + * 'O': Outdoor environemnt only + * 'I': Indoor environment only + */ + + int ieee80211d; + +// struct hostapd_tx_queue_params tx_queue[NUM_TX_QUEUES]; + + /* + * WMM AC parameters, in same order as 802.1D, i.e. + * 0 = BE (best effort) + * 1 = BK (background) + * 2 = VI (video) + * 3 = VO (voice) + */ +// struct hostapd_wmm_ac_params wmm_ac_params[4]; + + int ht_op_mode_fixed; + u16 ht_capab; + int ieee80211n; + int secondary_channel; + int require_ht; + u32 vht_capab; + int ieee80211ac; + int require_vht; + u8 vht_oper_chwidth; + u8 vht_oper_centr_freq_seg0_idx; + u8 vht_oper_centr_freq_seg1_idx; +}; + + +int hostapd_mac_comp(const void *a, const void *b); +int hostapd_mac_comp_empty(const void *a); +struct hostapd_config * hostapd_config_defaults(void); +void hostapd_config_defaults_bss(struct hostapd_bss_config *bss); +void hostapd_config_free(struct hostapd_config *conf); +int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries, + const u8 *addr, int *vlan_id); +int hostapd_rate_found(int *list, int rate); +int hostapd_wep_key_cmp(struct hostapd_wep_keys *a, + struct hostapd_wep_keys *b); +const u8 * hostapd_get_psk(const struct hostapd_bss_config *conf, + const u8 *addr, const u8 *prev_psk); +int hostapd_setup_wpa_psk(struct hostapd_bss_config *conf); +//const char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan, +// int vlan_id); +//struct hostapd_radius_attr * +//hostapd_config_get_radius_attr(struct hostapd_radius_attr *attr, u8 type); + +#endif /* HOSTAPD_CONFIG_H */ diff --git a/components/wpa_supplicant/include/wpa/common.h b/components/wpa_supplicant/include/wpa/common.h new file mode 100644 index 000000000..ca80c2394 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/common.h @@ -0,0 +1,324 @@ +/* + * wpa_supplicant/hostapd / common helper functions, etc. + * Copyright (c) 2002-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef COMMON_H +#define COMMON_H + +#if defined(__ets__) +#endif /* ets */ +#include "os.h" + +#if defined(__XTENSA__) +#include +#define __BYTE_ORDER BYTE_ORDER +#define __LITTLE_ENDIAN LITTLE_ENDIAN +#define __BIG_ENDIAN BIG_ENDIAN +#endif /*__XTENSA__*/ + +#if defined(__linux__) || defined(__GLIBC__) || defined(__ets__) +#include +#include +#endif /* __linux__ */ + +/* Define platform specific byte swapping macros */ + +#if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) + +static inline unsigned short wpa_swap_16(unsigned short v) +{ + return ((v & 0xff) << 8) | (v >> 8); +} + +static inline unsigned int wpa_swap_32(unsigned int v) +{ + return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | + ((v & 0xff0000) >> 8) | (v >> 24); +} + +#define le_to_host16(n) (n) +#define host_to_le16(n) (n) +#define be_to_host16(n) wpa_swap_16(n) +#define host_to_be16(n) wpa_swap_16(n) +#define le_to_host32(n) (n) +#define be_to_host32(n) wpa_swap_32(n) +#define host_to_be32(n) wpa_swap_32(n) + +#define WPA_BYTE_SWAP_DEFINED + +#endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */ + + +#ifndef WPA_BYTE_SWAP_DEFINED + +#ifndef __BYTE_ORDER +#ifndef __LITTLE_ENDIAN +#ifndef __BIG_ENDIAN +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#if defined(sparc) +#define __BYTE_ORDER __BIG_ENDIAN +#endif +#endif /* __BIG_ENDIAN */ +#endif /* __LITTLE_ENDIAN */ +#endif /* __BYTE_ORDER */ + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define le_to_host16(n) ((__force u16) (le16) (n)) +#define host_to_le16(n) ((__force le16) (u16) (n)) +#define be_to_host16(n) __bswap_16((__force u16) (be16) (n)) +#define host_to_be16(n) ((__force be16) __bswap_16((n))) +#define le_to_host32(n) ((__force u32) (le32) (n)) +#define host_to_le32(n) ((__force le32) (u32) (n)) +#define be_to_host32(n) __bswap_32((__force u32) (be32) (n)) +#define host_to_be32(n) ((__force be32) __bswap_32((n))) +#define le_to_host64(n) ((__force u64) (le64) (n)) +#define host_to_le64(n) ((__force le64) (u64) (n)) +#define be_to_host64(n) __bswap_64((__force u64) (be64) (n)) +#define host_to_be64(n) ((__force be64) bswap_64((n))) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define le_to_host16(n) __bswap_16(n) +#define host_to_le16(n) __bswap_16(n) +#define be_to_host16(n) (n) +#define host_to_be16(n) (n) +#define le_to_host32(n) __bswap_32(n) +#define be_to_host32(n) (n) +#define host_to_be32(n) (n) +#define le_to_host64(n) __bswap_64(n) +#define host_to_le64(n) __bswap_64(n) +#define be_to_host64(n) (n) +#define host_to_be64(n) (n) +#ifndef WORDS_BIGENDIAN +#define WORDS_BIGENDIAN +#endif +#else +#error Could not determine CPU byte order +#endif + +#define WPA_BYTE_SWAP_DEFINED +#endif /* !WPA_BYTE_SWAP_DEFINED */ + + +/* Macros for handling unaligned memory accesses */ + +#define WPA_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) +#define WPA_PUT_BE16(a, val) \ + do { \ + (a)[0] = ((u16) (val)) >> 8; \ + (a)[1] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ + ((u32) (a)[2])) +#define WPA_PUT_BE24(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[2] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ + (((u32) (a)[1]) << 8) | ((u32) (a)[0])) +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ + (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ + (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ + (((u64) (a)[6]) << 8) | ((u64) (a)[7])) +#define WPA_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +#define WPA_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ + (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ + (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ + (((u64) (a)[1]) << 8) | ((u64) (a)[0])) + + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif +//#ifndef IFNAMSIZ +//#define IFNAMSIZ 16 +//#endif +#ifndef ETH_P_ALL +#define ETH_P_ALL 0x0003 +#endif +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ +#ifndef ETH_P_EAPOL +#define ETH_P_EAPOL ETH_P_PAE +#endif /* ETH_P_EAPOL */ +#ifndef ETH_P_RSN_PREAUTH +#define ETH_P_RSN_PREAUTH 0x88c7 +#endif /* ETH_P_RSN_PREAUTH */ +#ifndef ETH_P_RRB +#define ETH_P_RRB 0x890D +#endif /* ETH_P_RRB */ + + +#ifdef __GNUC__ +#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) +#define STRUCT_PACKED __attribute__ ((packed)) +#else +#define PRINTF_FORMAT(a,b) +#define STRUCT_PACKED +#endif + +#ifdef CONFIG_ANSI_C_EXTRA + +/* inline - define as __inline or just define it to be empty, if needed */ +#ifdef CONFIG_NO_INLINE +#define inline +#else +#define inline __inline +#endif + +#ifndef __func__ +#define __func__ "__func__ not defined" +#endif + +#ifndef bswap_16 +#define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) +#endif + +#ifndef bswap_32 +#define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ + (((u32) (a) << 8) & 0xff0000) | \ + (((u32) (a) >> 8) & 0xff00) | \ + (((u32) (a) >> 24) & 0xff)) +#endif + +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0 +#endif + +#ifdef _WIN32_WCE +void perror(const char *s); +#endif /* _WIN32_WCE */ + +#endif /* CONFIG_ANSI_C_EXTRA */ + +#ifndef MAC2STR +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" +#endif + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +/* + * Definitions for sparse validation + * (http://kernel.org/pub/linux/kernel/people/josh/sparse/) + */ +#ifdef __CHECKER__ +#define __force __attribute__((force)) +#define __bitwise __attribute__((bitwise)) +#else +#define __force +#define __bitwise +#endif + +typedef u16 __bitwise be16; +typedef u16 __bitwise le16; +typedef u32 __bitwise be32; +typedef u32 __bitwise le32; +typedef u64 __bitwise be64; +typedef u64 __bitwise le64; + +#ifndef __must_check +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +#define __must_check __attribute__((__warn_unused_result__)) +#else +#define __must_check +#endif /* __GNUC__ */ +#endif /* __must_check */ + +int hwaddr_aton(const char *txt, u8 *addr); +int hwaddr_aton2(const char *txt, u8 *addr); +int hexstr2bin(const char *hex, u8 *buf, size_t len); +void inc_byte_array(u8 *counter, size_t len); +void wpa_get_ntp_timestamp(u8 *buf); +int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); +int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, + size_t len); + +#ifdef CONFIG_NATIVE_WINDOWS +void wpa_unicode2ascii_inplace(TCHAR *str); +TCHAR * wpa_strdup_tchar(const char *str); +#else /* CONFIG_NATIVE_WINDOWS */ +#define wpa_unicode2ascii_inplace(s) do { } while (0) +#define wpa_strdup_tchar(s) strdup((s)) +#endif /* CONFIG_NATIVE_WINDOWS */ + +const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); +char * wpa_config_parse_string(const char *value, size_t *len); + +static inline int is_zero_ether_addr(const u8 *a) +{ + return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]); +} + +extern const struct eth_addr ethbroadcast; +#define broadcast_ether_addr ðbroadcast + +#include "wpabuf.h" +#include "wpa_debug.h" + + +/* + * gcc 4.4 ends up generating strict-aliasing warnings about some very common + * networking socket uses that do not really result in a real problem and + * cannot be easily avoided with union-based type-punning due to struct + * definitions including another struct in system header files. To avoid having + * to fully disable strict-aliasing warnings, provide a mechanism to hide the + * typecast from aliasing for now. A cleaner solution will hopefully be found + * in the future to handle these cases. + */ +void * __hide_aliasing_typecast(void *foo); +#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a)) + +#endif /* COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa/defs.h b/components/wpa_supplicant/include/wpa/defs.h new file mode 100644 index 000000000..f019cee99 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/defs.h @@ -0,0 +1,307 @@ +/* + * WPA Supplicant - Common definitions + * Copyright (c) 2004-2008, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef DEFS_H +#define DEFS_H + +#ifdef FALSE +#undef FALSE +#endif +#ifdef TRUE +#undef TRUE +#endif +typedef enum { FALSE = 0, TRUE = 1 } Boolean; + +/* +#define WPA_CIPHER_NONE BIT(0) +#define WPA_CIPHER_WEP40 BIT(1) +#define WPA_CIPHER_WEP104 BIT(2) +#define WPA_CIPHER_TKIP BIT(3) +#define WPA_CIPHER_CCMP BIT(4) +#ifdef CONFIG_IEEE80211W +#define WPA_CIPHER_AES_128_CMAC BIT(5) +#endif +*/ + +/* + * NB: these values are ordered carefully; there are lots of + * of implications in any reordering. Beware that 4 is used + * only to indicate h/w TKIP MIC support in driver capabilities; + * there is no separate cipher support (it's rolled into the + * TKIP cipher support). + */ +#define IEEE80211_CIPHER_NONE 0 /* pseudo value */ +#define IEEE80211_CIPHER_TKIP 1 +#define IEEE80211_CIPHER_AES_OCB 2 +#define IEEE80211_CIPHER_AES_CCM 3 +#define IEEE80211_CIPHER_TKIPMIC 4 /* TKIP MIC capability */ +#define IEEE80211_CIPHER_CKIP 5 +#define IEEE80211_CIPHER_WEP 6 +#define IEEE80211_CIPHER_WEP40 7 +#define IEEE80211_CIPHER_WEP104 8 + + +#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+2) + +/* capability bits in ic_cryptocaps/iv_cryptocaps */ +#define IEEE80211_CRYPTO_NONE (1<wpa_state). The current state can be retrieved with + * wpa_supplicant_get_state() function and the state can be changed by calling + * wpa_supplicant_set_state(). In WPA state machine (wpa.c and preauth.c), the + * wrapper functions wpa_sm_get_state() and wpa_sm_set_state() should be used + * to access the state variable. + */ +enum wpa_states { + /** + * WPA_DISCONNECTED - Disconnected state + * + * This state indicates that client is not associated, but is likely to + * start looking for an access point. This state is entered when a + * connection is lost. + */ + WPA_DISCONNECTED, + + /** + * WPA_INACTIVE - Inactive state (wpa_supplicant disabled) + * + * This state is entered if there are no enabled networks in the + * configuration. wpa_supplicant is not trying to associate with a new + * network and external interaction (e.g., ctrl_iface call to add or + * enable a network) is needed to start association. + */ + WPA_INACTIVE, + + /** + * WPA_SCANNING - Scanning for a network + * + * This state is entered when wpa_supplicant starts scanning for a + * network. + */ + WPA_SCANNING, + + /** + * WPA_AUTHENTICATING - Trying to authenticate with a BSS/SSID + * + * This state is entered when wpa_supplicant has found a suitable BSS + * to authenticate with and the driver is configured to try to + * authenticate with this BSS. This state is used only with drivers + * that use wpa_supplicant as the SME. + */ + WPA_AUTHENTICATING, + + /** + * WPA_ASSOCIATING - Trying to associate with a BSS/SSID + * + * This state is entered when wpa_supplicant has found a suitable BSS + * to associate with and the driver is configured to try to associate + * with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this + * state is entered when the driver is configured to try to associate + * with a network using the configured SSID and security policy. + */ + WPA_ASSOCIATING, + + /** + * WPA_ASSOCIATED - Association completed + * + * This state is entered when the driver reports that association has + * been successfully completed with an AP. If IEEE 802.1X is used + * (with or without WPA/WPA2), wpa_supplicant remains in this state + * until the IEEE 802.1X/EAPOL authentication has been completed. + */ + WPA_ASSOCIATED, + + /** + * WPA_4WAY_HANDSHAKE - WPA 4-Way Key Handshake in progress + * + * This state is entered when WPA/WPA2 4-Way Handshake is started. In + * case of WPA-PSK, this happens when receiving the first EAPOL-Key + * frame after association. In case of WPA-EAP, this state is entered + * when the IEEE 802.1X/EAPOL authentication has been completed. + */ + WPA_FIRST_HALF_4WAY_HANDSHAKE, + + WPA_LAST_HALF_4WAY_HANDSHAKE, + + /** + * WPA_GROUP_HANDSHAKE - WPA Group Key Handshake in progress + * + * This state is entered when 4-Way Key Handshake has been completed + * (i.e., when the supplicant sends out message 4/4) and when Group + * Key rekeying is started by the AP (i.e., when supplicant receives + * message 1/2). + */ + WPA_GROUP_HANDSHAKE, + + /** + * WPA_COMPLETED - All authentication completed + * + * This state is entered when the full authentication process is + * completed. In case of WPA2, this happens when the 4-Way Handshake is + * successfully completed. With WPA, this state is entered after the + * Group Key Handshake; with IEEE 802.1X (non-WPA) connection is + * completed after dynamic keys are received (or if not used, after + * the EAP authentication has been completed). With static WEP keys and + * plaintext connections, this state is entered when an association + * has been completed. + * + * This state indicates that the supplicant has completed its + * processing for the association phase and that data connection is + * fully configured. + */ + WPA_COMPLETED, + + WPA_MIC_FAILURE, // first mic_error event occur + + WPA_TKIP_COUNTERMEASURES //in countermeasure period that stop connect with ap in 60 sec +}; + +#define MLME_SETPROTECTION_PROTECT_TYPE_NONE 0 +#define MLME_SETPROTECTION_PROTECT_TYPE_RX 1 +#define MLME_SETPROTECTION_PROTECT_TYPE_TX 2 +#define MLME_SETPROTECTION_PROTECT_TYPE_RX_TX 3 + +#define MLME_SETPROTECTION_KEY_TYPE_GROUP 0 +#define MLME_SETPROTECTION_KEY_TYPE_PAIRWISE 1 + +/** + * enum hostapd_hw_mode - Hardware mode + */ +enum hostapd_hw_mode { + HOSTAPD_MODE_IEEE80211B, + HOSTAPD_MODE_IEEE80211G, + HOSTAPD_MODE_IEEE80211A, + HOSTAPD_MODE_IEEE80211AD, + NUM_HOSTAPD_MODES +}; + +#endif /* DEFS_H */ diff --git a/components/wpa_supplicant/include/wpa/eapol_common.h b/components/wpa_supplicant/include/wpa/eapol_common.h new file mode 100644 index 000000000..6a40ac33b --- /dev/null +++ b/components/wpa_supplicant/include/wpa/eapol_common.h @@ -0,0 +1,71 @@ +/* + * EAPOL definitions shared between hostapd and wpa_supplicant + * Copyright (c) 2002-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef EAPOL_COMMON_H +#define EAPOL_COMMON_H + +/* IEEE Std 802.1X-2004 */ + +struct ieee802_1x_hdr { + u8 version; + u8 type; + be16 length; + /* followed by length octets of data */ +} STRUCT_PACKED; + + +#define EAPOL_VERSION 2 + +enum { IEEE802_1X_TYPE_EAP_PACKET = 0, + IEEE802_1X_TYPE_EAPOL_START = 1, + IEEE802_1X_TYPE_EAPOL_LOGOFF = 2, + IEEE802_1X_TYPE_EAPOL_KEY = 3, + IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT = 4 +}; + +enum { EAPOL_KEY_TYPE_RC4 = 1, EAPOL_KEY_TYPE_RSN = 2, + EAPOL_KEY_TYPE_WPA = 254 }; + +#define IEEE8021X_REPLAY_COUNTER_LEN 8 +#define IEEE8021X_KEY_SIGN_LEN 16 +#define IEEE8021X_KEY_IV_LEN 16 + +#define IEEE8021X_KEY_INDEX_FLAG 0x80 +#define IEEE8021X_KEY_INDEX_MASK 0x03 + +struct ieee802_1x_eapol_key { + u8 type; + /* Note: key_length is unaligned */ + u8 key_length[2]; + /* does not repeat within the life of the keying material used to + * encrypt the Key field; 64-bit NTP timestamp MAY be used here */ + u8 replay_counter[IEEE8021X_REPLAY_COUNTER_LEN]; + u8 key_iv[IEEE8021X_KEY_IV_LEN]; /* cryptographically random number */ + u8 key_index; /* key flag in the most significant bit: + * 0 = broadcast (default key), + * 1 = unicast (key mapping key); key index is in the + * 7 least significant bits */ + /* HMAC-MD5 message integrity check computed with MS-MPPE-Send-Key as + * the key */ + u8 key_signature[IEEE8021X_KEY_SIGN_LEN]; + + /* followed by key: if packet body length = 44 + key length, then the + * key field (of key_length bytes) contains the key in encrypted form; + * if packet body length = 44, key field is absent and key_length + * represents the number of least significant octets from + * MS-MPPE-Send-Key attribute to be used as the keying material; + * RC4 key used in encryption = Key-IV + MS-MPPE-Recv-Key */ +} STRUCT_PACKED; + +#endif /* EAPOL_COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa/hostapd.h b/components/wpa_supplicant/include/wpa/hostapd.h new file mode 100644 index 000000000..1d52659a2 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/hostapd.h @@ -0,0 +1,312 @@ +/* + * hostapd / Initialization and configuration + * Copyright (c) 2002-2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef HOSTAPD_H +#define HOSTAPD_H + +#include "wpa/defs.h" +#include "wpa/ap_config.h" + +struct wpa_driver_ops; +struct wpa_ctrl_dst; +struct radius_server_data; +struct upnp_wps_device_sm; +struct hostapd_data; +struct sta_info; +struct hostap_sta_driver_data; +struct ieee80211_ht_capabilities; +struct full_dynamic_vlan; +enum wps_event; +union wps_event_data; + +struct hostapd_iface; + +struct hapd_interfaces { + int (*reload_config)(struct hostapd_iface *iface); + struct hostapd_config * (*config_read_cb)(const char *config_fname); + int (*ctrl_iface_init)(struct hostapd_data *hapd); + void (*ctrl_iface_deinit)(struct hostapd_data *hapd); + int (*for_each_interface)(struct hapd_interfaces *interfaces, + int (*cb)(struct hostapd_iface *iface, + void *ctx), void *ctx); + int (*driver_init)(struct hostapd_iface *iface); + + size_t count; + int global_ctrl_sock; + char *global_iface_path; + char *global_iface_name; + struct hostapd_iface **iface; +}; + + +struct hostapd_probereq_cb { + int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, + const u8 *ie, size_t ie_len, int ssi_signal); + void *ctx; +}; + +#define HOSTAPD_RATE_BASIC 0x00000001 + +struct hostapd_rate_data { + int rate; /* rate in 100 kbps */ + int flags; /* HOSTAPD_RATE_ flags */ +}; + +struct hostapd_frame_info { + u32 channel; + u32 datarate; + int ssi_signal; /* dBm */ +}; + + +/** + * struct hostapd_data - hostapd per-BSS data structure + */ +struct hostapd_data { +// struct hostapd_iface *iface; + struct hostapd_config *iconf; + struct hostapd_bss_config *conf; + int interface_added; /* virtual interface added for this BSS */ + + u8 own_addr[ETH_ALEN]; + + int num_sta; /* number of entries in sta_list */ +// struct sta_info *sta_list; /* STA info list head */ +//#define STA_HASH_SIZE 256 +//#define STA_HASH(sta) (sta[5]) +// struct sta_info *sta_hash[STA_HASH_SIZE]; + +// /* +// * Bitfield for indicating which AIDs are allocated. Only AID values +// * 1-2007 are used and as such, the bit at index 0 corresponds to AID +// * 1. +// */ +//#define AID_WORDS ((2008 + 31) / 32) +// u32 sta_aid[AID_WORDS]; + +// const struct wpa_driver_ops *driver; +// void *drv_priv; + +// void (*new_assoc_sta_cb)(struct hostapd_data *hapd, +// struct sta_info *sta, int reassoc); + +// void *msg_ctx; /* ctx for wpa_msg() calls */ +// void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */ + +// struct radius_client_data *radius; +// u32 acct_session_id_hi, acct_session_id_lo; +// struct radius_das_data *radius_das; + +// struct iapp_data *iapp; + +// struct hostapd_cached_radius_acl *acl_cache; +// struct hostapd_acl_query_data *acl_queries; + + struct wpa_authenticator *wpa_auth; +// struct eapol_authenticator *eapol_auth; + +// struct rsn_preauth_interface *preauth_iface; +// time_t michael_mic_failure; +// int michael_mic_failures; +// int tkip_countermeasures; + +// int ctrl_sock; +// struct wpa_ctrl_dst *ctrl_dst; + +// void *ssl_ctx; +// void *eap_sim_db_priv; +// struct radius_server_data *radius_srv; + +// int parameter_set_count; + + /* Time Advertisement */ +// u8 time_update_counter; +// struct wpabuf *time_adv; + +#ifdef CONFIG_FULL_DYNAMIC_VLAN + struct full_dynamic_vlan *full_dynamic_vlan; +#endif /* CONFIG_FULL_DYNAMIC_VLAN */ + +// struct l2_packet_data *l2; +// struct wps_context *wps; + +// int beacon_set_done; +// struct wpabuf *wps_beacon_ie; +// struct wpabuf *wps_probe_resp_ie; +#ifdef CONFIG_WPS + unsigned int ap_pin_failures; + unsigned int ap_pin_failures_consecutive; + struct upnp_wps_device_sm *wps_upnp; + unsigned int ap_pin_lockout_time; +#endif /* CONFIG_WPS */ + +// struct hostapd_probereq_cb *probereq_cb; +// size_t num_probereq_cb; + +// void (*public_action_cb)(void *ctx, const u8 *buf, size_t len, +// int freq); +// void *public_action_cb_ctx; + +// int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len, +// int freq); +// void *vendor_action_cb_ctx; + +// void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr, +// const u8 *uuid_e); +// void *wps_reg_success_cb_ctx; + +// void (*wps_event_cb)(void *ctx, enum wps_event event, +// union wps_event_data *data); +// void *wps_event_cb_ctx; + +// void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr, +// int authorized, const u8 *p2p_dev_addr); +// void *sta_authorized_cb_ctx; + +// void (*setup_complete_cb)(void *ctx); +// void *setup_complete_cb_ctx; + +#ifdef CONFIG_P2P + struct p2p_data *p2p; + struct p2p_group *p2p_group; + struct wpabuf *p2p_beacon_ie; + struct wpabuf *p2p_probe_resp_ie; + + /* Number of non-P2P association stations */ + int num_sta_no_p2p; + + /* Periodic NoA (used only when no non-P2P clients in the group) */ + int noa_enabled; + int noa_start; + int noa_duration; +#endif /* CONFIG_P2P */ +#ifdef CONFIG_INTERWORKING + size_t gas_frag_limit; +#endif /* CONFIG_INTERWORKING */ + +#ifdef CONFIG_SQLITE + struct hostapd_eap_user tmp_eap_user; +#endif /* CONFIG_SQLITE */ +}; + +#if 0 +/** + * struct hostapd_iface - hostapd per-interface data structure + */ +struct hostapd_iface { + struct hapd_interfaces *interfaces; + void *owner; + char *config_fname; + struct hostapd_config *conf; + + size_t num_bss; + struct hostapd_data **bss; + + int num_ap; /* number of entries in ap_list */ + struct ap_info *ap_list; /* AP info list head */ + struct ap_info *ap_hash[STA_HASH_SIZE]; + struct ap_info *ap_iter_list; + + unsigned int drv_flags; + + /* + * A bitmap of supported protocols for probe response offload. See + * struct wpa_driver_capa in driver.h + */ + unsigned int probe_resp_offloads; + + struct hostapd_hw_modes *hw_features; + int num_hw_features; + struct hostapd_hw_modes *current_mode; + /* Rates that are currently used (i.e., filtered copy of + * current_mode->channels */ + int num_rates; + struct hostapd_rate_data *current_rates; + int *basic_rates; + int freq; + + u16 hw_flags; + + /* Number of associated Non-ERP stations (i.e., stations using 802.11b + * in 802.11g BSS) */ + int num_sta_non_erp; + + /* Number of associated stations that do not support Short Slot Time */ + int num_sta_no_short_slot_time; + + /* Number of associated stations that do not support Short Preamble */ + int num_sta_no_short_preamble; + + int olbc; /* Overlapping Legacy BSS Condition */ + + /* Number of HT associated stations that do not support greenfield */ + int num_sta_ht_no_gf; + + /* Number of associated non-HT stations */ + int num_sta_no_ht; + + /* Number of HT associated stations 20 MHz */ + int num_sta_ht_20mhz; + + /* Overlapping BSS information */ + int olbc_ht; + + u16 ht_op_mode; + void (*scan_cb)(struct hostapd_iface *iface); +}; +#endif + +#if 0 +/* hostapd.c */ +int hostapd_for_each_interface(struct hapd_interfaces *interfaces, + int (*cb)(struct hostapd_iface *iface, + void *ctx), void *ctx); +int hostapd_reload_config(struct hostapd_iface *iface); +struct hostapd_data * +hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, + struct hostapd_config *conf, + struct hostapd_bss_config *bss); +int hostapd_setup_interface(struct hostapd_iface *iface); +int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err); +void hostapd_interface_deinit(struct hostapd_iface *iface); +void hostapd_interface_free(struct hostapd_iface *iface); +void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, + int reassoc); +void hostapd_interface_deinit_free(struct hostapd_iface *iface); +int hostapd_enable_iface(struct hostapd_iface *hapd_iface); +int hostapd_reload_iface(struct hostapd_iface *hapd_iface); +int hostapd_disable_iface(struct hostapd_iface *hapd_iface); +int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf); +int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf); + +/* utils.c */ +int hostapd_register_probereq_cb(struct hostapd_data *hapd, + int (*cb)(void *ctx, const u8 *sa, + const u8 *da, const u8 *bssid, + const u8 *ie, size_t ie_len, + int ssi_signal), + void *ctx); +void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr); + +/* drv_callbacks.c (TODO: move to somewhere else?) */ +int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, + const u8 *ie, size_t ielen, int reassoc); +void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr); +void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr); +int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, + const u8 *bssid, const u8 *ie, size_t ie_len, + int ssi_signal); +void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht, + int offset); + +const struct hostapd_eap_user * +hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity, + size_t identity_len, int phase2); +#endif + +#endif /* HOSTAPD_H */ diff --git a/components/wpa_supplicant/include/wpa/ieee80211_crypto.h b/components/wpa_supplicant/include/wpa/ieee80211_crypto.h new file mode 100644 index 000000000..be0fb9aa1 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/ieee80211_crypto.h @@ -0,0 +1,226 @@ +/*- + * Copyright (c) 2001 Atsushi Onoe + * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR ``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 AUTHOR 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. + * + * $FreeBSD$ + */ + +/* + * copyright (c) 2010-2011 Espressif System + */ +#ifndef _NET80211_IEEE80211_CRYPTO_H_ +#define _NET80211_IEEE80211_CRYPTO_H_ + +//#include "pp/esf_buf.h" + +/* + * 802.11 protocol crypto-related definitions. + */ +#define IEEE80211_KEYBUF_SIZE 16 +#define IEEE80211_MICBUF_SIZE (8+8) /* space for both tx+rx keys */ + +/* + * Old WEP-style key. Deprecated. + */ + +#if 0 +struct ieee80211_rsnparms { + uint8_t rsn_mcastcipher; /* mcast/group cipher */ + uint8_t rsn_mcastkeylen; /* mcast key length */ + uint8_t rsn_ucastcipher; /* selected unicast cipher */ + uint8_t rsn_ucastkeylen; /* unicast key length */ + uint8_t rsn_keymgmt; /* selected key mgmt algo */ + uint16_t rsn_caps; /* capabilities */ +}; +#endif //0000 + +/* + * Template for a supported cipher. Ciphers register with the + * crypto code and are typically loaded as separate modules + * (the null cipher is always present). + * XXX may need refcnts + */ + +/* + * Crypto key state. There is sufficient room for all supported + * ciphers (see below). The underlying ciphers are handled + * separately through loadable cipher modules that register with + * the generic crypto support. A key has a reference to an instance + * of the cipher; any per-key state is hung off wk_private by the + * cipher when it is attached. Ciphers are automatically called + * to detach and cleanup any such state when the key is deleted. + * + * The generic crypto support handles encap/decap of cipher-related + * frame contents for both hardware- and software-based implementations. + * A key requiring software crypto support is automatically flagged and + * the cipher is expected to honor this and do the necessary work. + * Ciphers such as TKIP may also support mixed hardware/software + * encrypt/decrypt and MIC processing. + */ +typedef uint16_t ieee80211_keyix; /* h/w key index */ + +struct ieee80211_key { + uint8_t wk_keylen; /* key length in bytes */ + uint8_t wk_pad; + uint16_t wk_flags; +#define IEEE80211_KEY_XMIT 0x0001 /* key used for xmit */ +#define IEEE80211_KEY_RECV 0x0002 /* key used for recv */ +#define IEEE80211_KEY_GROUP 0x0004 /* key used for WPA group operation */ +#define IEEE80211_KEY_SWENCRYPT 0x0010 /* host-based encrypt */ +#define IEEE80211_KEY_SWDECRYPT 0x0020 /* host-based decrypt */ +#define IEEE80211_KEY_SWENMIC 0x0040 /* host-based enmic */ +#define IEEE80211_KEY_SWDEMIC 0x0080 /* host-based demic */ +#define IEEE80211_KEY_DEVKEY 0x0100 /* device key request completed */ +#define IEEE80211_KEY_CIPHER0 0x1000 /* cipher-specific action 0 */ +#define IEEE80211_KEY_CIPHER1 0x2000 /* cipher-specific action 1 */ +#define IEEE80211_KEY_EMPTY 0x0000 + ieee80211_keyix wk_keyix; /* h/w key index */ + ieee80211_keyix wk_rxkeyix; /* optional h/w rx key index */ + uint8_t wk_key[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; +#define wk_txmic wk_key+IEEE80211_KEYBUF_SIZE+0 /* XXX can't () right */ +#define wk_rxmic wk_key+IEEE80211_KEYBUF_SIZE+8 /* XXX can't () right */ + /* key receive sequence counter */ + uint64_t wk_keyrsc[IEEE80211_TID_SIZE]; + uint64_t wk_keytsc; /* key transmit sequence counter */ + const struct ieee80211_cipher *wk_cipher; + //void *wk_private; /* private cipher state */ + //uint8_t wk_macaddr[IEEE80211_ADDR_LEN]; //JLU: no need ... +}; +#define IEEE80211_KEY_COMMON /* common flags passed in by apps */\ + (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV | IEEE80211_KEY_GROUP) +#define IEEE80211_KEY_DEVICE /* flags owned by device driver */\ + (IEEE80211_KEY_DEVKEY|IEEE80211_KEY_CIPHER0|IEEE80211_KEY_CIPHER1) + +#define IEEE80211_KEY_SWCRYPT \ + (IEEE80211_KEY_SWENCRYPT | IEEE80211_KEY_SWDECRYPT) +#define IEEE80211_KEY_SWMIC (IEEE80211_KEY_SWENMIC | IEEE80211_KEY_SWDEMIC) + +//#define IEEE80211_KEYIX_NONE ((ieee80211_keyix) -1) + +/* + * NB: these values are ordered carefully; there are lots of + * of implications in any reordering. Beware that 4 is used + * only to indicate h/w TKIP MIC support in driver capabilities; + * there is no separate cipher support (it's rolled into the + * TKIP cipher support). + */ +#define IEEE80211_CIPHER_NONE 0 /* pseudo value */ +#define IEEE80211_CIPHER_TKIP 1 +#define IEEE80211_CIPHER_AES_OCB 2 +#define IEEE80211_CIPHER_AES_CCM 3 +#define IEEE80211_CIPHER_TKIPMIC 4 /* TKIP MIC capability */ +#define IEEE80211_CIPHER_CKIP 5 +#define IEEE80211_CIPHER_WEP 6 +#define IEEE80211_CIPHER_WEP40 7 +#define IEEE80211_CIPHER_WEP104 8 + + +#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+2) + +/* capability bits in ic_cryptocaps/iv_cryptocaps */ +#define IEEE80211_CRYPTO_NONE (1<wk_cipher == &ieee80211_cipher_none) + +struct ieee80211_key *ieee80211_crypto_encap(struct ieee80211_conn *, + esf_buf *); + +struct ieee80211_key *ieee80211_crypto_decap(struct ieee80211_conn *, + esf_buf *, int); + +#if 0 //H/W MIC +/* + * Check and remove any MIC. + */ +static INLINE int +ieee80211_crypto_demic(struct ieee80211vap *vap, struct ieee80211_key *k, + esf_buf *m, int force) +{ + const struct ieee80211_cipher *cip = k->wk_cipher; + return (cip->ic_miclen > 0 ? cip->ic_demic(k, m, force) : 1); +} + +/* + * Add any MIC. + */ +static INLINE int +ieee80211_crypto_enmic(struct ieee80211vap *vap, + struct ieee80211_key *k, esf_buf *m, int force) +{ + const struct ieee80211_cipher *cip = k->wk_cipher; + return (cip->ic_miclen > 0 ? cip->ic_enmic(k, m, force) : 1); +} +#endif //0000 + +/* + * Setup crypto support for a device/shared instance. + */ +void ieee80211_crypto_attach(struct ieee80211com *ic); + +/* + * Reset key state to an unused state. The crypto + * key allocation mechanism insures other state (e.g. + * key data) is properly setup before a key is used. + */ +static inline void +ieee80211_crypto_resetkey(struct ieee80211_key *k) +{ + k->wk_cipher = NULL; + k->wk_flags = IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV; +} + +/* + * Crypt-related notification methods. + */ +//void ieee80211_notify_replay_failure(const struct ieee80211_frame *, const struct ieee80211_key *, +// uint64_t rsc, int tid); +//void ieee80211_notify_michael_failure(const struct ieee80211_frame *, u_int keyix); + +#endif /* _NET80211_IEEE80211_CRYPTO_H_ */ diff --git a/components/wpa_supplicant/include/wpa/ieee802_11_defs.h b/components/wpa_supplicant/include/wpa/ieee802_11_defs.h new file mode 100644 index 000000000..4881e39a0 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/ieee802_11_defs.h @@ -0,0 +1,607 @@ +/* + * IEEE 802.11 Frame type definitions + * Copyright (c) 2002-2009, Jouni Malinen + * Copyright (c) 2007-2008 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef IEEE802_11_DEFS_H +#define IEEE802_11_DEFS_H + +/* IEEE 802.11 defines */ + +#define WLAN_FC_PVER 0x0003 +#define WLAN_FC_TODS 0x0100 +#define WLAN_FC_FROMDS 0x0200 +#define WLAN_FC_MOREFRAG 0x0400 +#define WLAN_FC_RETRY 0x0800 +#define WLAN_FC_PWRMGT 0x1000 +#define WLAN_FC_MOREDATA 0x2000 +#define WLAN_FC_ISWEP 0x4000 +#define WLAN_FC_ORDER 0x8000 + +#define WLAN_FC_GET_TYPE(fc) (((fc) & 0x000c) >> 2) +#define WLAN_FC_GET_STYPE(fc) (((fc) & 0x00f0) >> 4) + +#define WLAN_GET_SEQ_FRAG(seq) ((seq) & (BIT(3) | BIT(2) | BIT(1) | BIT(0))) +#define WLAN_GET_SEQ_SEQ(seq) \ + (((seq) & (~(BIT(3) | BIT(2) | BIT(1) | BIT(0)))) >> 4) + +#define WLAN_FC_TYPE_MGMT 0 +#define WLAN_FC_TYPE_CTRL 1 +#define WLAN_FC_TYPE_DATA 2 + +/* management */ +#define WLAN_FC_STYPE_ASSOC_REQ 0 +#define WLAN_FC_STYPE_ASSOC_RESP 1 +#define WLAN_FC_STYPE_REASSOC_REQ 2 +#define WLAN_FC_STYPE_REASSOC_RESP 3 +#define WLAN_FC_STYPE_PROBE_REQ 4 +#define WLAN_FC_STYPE_PROBE_RESP 5 +#define WLAN_FC_STYPE_BEACON 8 +#define WLAN_FC_STYPE_ATIM 9 +#define WLAN_FC_STYPE_DISASSOC 10 +#define WLAN_FC_STYPE_AUTH 11 +#define WLAN_FC_STYPE_DEAUTH 12 +#define WLAN_FC_STYPE_ACTION 13 + +/* control */ +#define WLAN_FC_STYPE_PSPOLL 10 +#define WLAN_FC_STYPE_RTS 11 +#define WLAN_FC_STYPE_CTS 12 +#define WLAN_FC_STYPE_ACK 13 +#define WLAN_FC_STYPE_CFEND 14 +#define WLAN_FC_STYPE_CFENDACK 15 + +/* data */ +#define WLAN_FC_STYPE_DATA 0 +#define WLAN_FC_STYPE_DATA_CFACK 1 +#define WLAN_FC_STYPE_DATA_CFPOLL 2 +#define WLAN_FC_STYPE_DATA_CFACKPOLL 3 +#define WLAN_FC_STYPE_NULLFUNC 4 +#define WLAN_FC_STYPE_CFACK 5 +#define WLAN_FC_STYPE_CFPOLL 6 +#define WLAN_FC_STYPE_CFACKPOLL 7 +#define WLAN_FC_STYPE_QOS_DATA 8 + +/* Authentication algorithms */ +#define WLAN_AUTH_OPEN 0 +#define WLAN_AUTH_SHARED_KEY 1 +#define WLAN_AUTH_FT 2 +#define WLAN_AUTH_LEAP 128 + +#define WLAN_AUTH_CHALLENGE_LEN 128 + +#define WLAN_CAPABILITY_ESS BIT(0) +#define WLAN_CAPABILITY_IBSS BIT(1) +#define WLAN_CAPABILITY_CF_POLLABLE BIT(2) +#define WLAN_CAPABILITY_CF_POLL_REQUEST BIT(3) +#define WLAN_CAPABILITY_PRIVACY BIT(4) +#define WLAN_CAPABILITY_SHORT_PREAMBLE BIT(5) +#define WLAN_CAPABILITY_PBCC BIT(6) +#define WLAN_CAPABILITY_CHANNEL_AGILITY BIT(7) +#define WLAN_CAPABILITY_SPECTRUM_MGMT BIT(8) +#define WLAN_CAPABILITY_SHORT_SLOT_TIME BIT(10) +#define WLAN_CAPABILITY_DSSS_OFDM BIT(13) + +/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +/* IEEE 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 +/* IEEE 802.11h */ +#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 +#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 +#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 +/* IEEE 802.11g */ +#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 +#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 +#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 +#define WLAN_STATUS_R0KH_UNREACHABLE 28 +/* IEEE 802.11w */ +#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 +#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 +#define WLAN_STATUS_UNSPECIFIED_QOS_FAILURE 32 +#define WLAN_STATUS_REQUEST_DECLINED 37 +#define WLAN_STATUS_INVALID_PARAMETERS 38 +/* IEEE 802.11i */ +#define WLAN_STATUS_INVALID_IE 40 +#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 +#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 +#define WLAN_STATUS_AKMP_NOT_VALID 43 +#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 +#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 +#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 +#define WLAN_STATUS_TS_NOT_CREATED 47 +#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 +#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 +#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 +#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 +/* IEEE 802.11r */ +#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 +#define WLAN_STATUS_INVALID_PMKID 53 +#define WLAN_STATUS_INVALID_MDIE 54 +#define WLAN_STATUS_INVALID_FTIE 55 + +/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */ +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 +/* IEEE 802.11h */ +#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 +#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 +/* IEEE 802.11i */ +#define WLAN_REASON_INVALID_IE 13 +#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 +#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 +#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 +#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 +#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 +#define WLAN_REASON_AKMP_NOT_VALID 20 +#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 +#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 +#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 +#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 + + +/* Information Element IDs */ +#define WLAN_EID_SSID 0 +#define WLAN_EID_SUPP_RATES 1 +#define WLAN_EID_FH_PARAMS 2 +#define WLAN_EID_DS_PARAMS 3 +#define WLAN_EID_CF_PARAMS 4 +#define WLAN_EID_TIM 5 +#define WLAN_EID_IBSS_PARAMS 6 +#define WLAN_EID_COUNTRY 7 +#define WLAN_EID_CHALLENGE 16 +/* EIDs defined by IEEE 802.11h - START */ +#define WLAN_EID_PWR_CONSTRAINT 32 +#define WLAN_EID_PWR_CAPABILITY 33 +#define WLAN_EID_TPC_REQUEST 34 +#define WLAN_EID_TPC_REPORT 35 +#define WLAN_EID_SUPPORTED_CHANNELS 36 +#define WLAN_EID_CHANNEL_SWITCH 37 +#define WLAN_EID_MEASURE_REQUEST 38 +#define WLAN_EID_MEASURE_REPORT 39 +#define WLAN_EID_QUITE 40 +#define WLAN_EID_IBSS_DFS 41 +/* EIDs defined by IEEE 802.11h - END */ +#define WLAN_EID_ERP_INFO 42 +#define WLAN_EID_HT_CAP 45 +#define WLAN_EID_RSN 48 +#define WLAN_EID_EXT_SUPP_RATES 50 +#define WLAN_EID_MOBILITY_DOMAIN 54 +#define WLAN_EID_FAST_BSS_TRANSITION 55 +#define WLAN_EID_TIMEOUT_INTERVAL 56 +#define WLAN_EID_RIC_DATA 57 +#define WLAN_EID_HT_OPERATION 61 +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 +#define WLAN_EID_20_40_BSS_COEXISTENCE 72 +#define WLAN_EID_20_40_BSS_INTOLERANT 73 +#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 +#define WLAN_EID_MMIE 76 +#define WLAN_EID_VENDOR_SPECIFIC 221 + + +/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */ +#define WLAN_ACTION_SPECTRUM_MGMT 0 +#define WLAN_ACTION_QOS 1 +#define WLAN_ACTION_DLS 2 +#define WLAN_ACTION_BLOCK_ACK 3 +#define WLAN_ACTION_PUBLIC 4 +#define WLAN_ACTION_RADIO_MEASUREMENT 5 +#define WLAN_ACTION_FT 6 +#define WLAN_ACTION_HT 7 +#define WLAN_ACTION_SA_QUERY 8 +#define WLAN_ACTION_WMM 17 /* WMM Specification 1.1 */ + +/* SA Query Action frame (IEEE 802.11w/D8.0, 7.4.9) */ +#define WLAN_SA_QUERY_REQUEST 0 +#define WLAN_SA_QUERY_RESPONSE 1 + +#define WLAN_SA_QUERY_TR_ID_LEN 2 + +/* Timeout Interval Type */ +#define WLAN_TIMEOUT_REASSOC_DEADLINE 1 +#define WLAN_TIMEOUT_KEY_LIFETIME 2 +#define WLAN_TIMEOUT_ASSOC_COMEBACK 3 + + +#ifdef _MSC_VER +#pragma pack(push, 1) +#endif /* _MSC_VER */ + +struct ieee80211_hdr { + le16 frame_control; + le16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + le16 seq_ctrl; + /* followed by 'u8 addr4[6];' if ToDS and FromDS is set in data frame + */ +} STRUCT_PACKED; + +#define IEEE80211_DA_FROMDS addr1 +#define IEEE80211_BSSID_FROMDS addr2 +#define IEEE80211_SA_FROMDS addr3 + +#define IEEE80211_HDRLEN (sizeof(struct ieee80211_hdr)) + +#define IEEE80211_FC(type, stype) host_to_le16((type << 2) | (stype << 4)) + +struct ieee80211_mgmt { + le16 frame_control; + le16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + le16 seq_ctrl; + union { + struct { + le16 auth_alg; + le16 auth_transaction; + le16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } STRUCT_PACKED auth; + struct { + le16 reason_code; + } STRUCT_PACKED deauth; + struct { + le16 capab_info; + le16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } STRUCT_PACKED assoc_req; + struct { + le16 capab_info; + le16 status_code; + le16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } STRUCT_PACKED assoc_resp, reassoc_resp; + struct { + le16 capab_info; + le16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } STRUCT_PACKED reassoc_req; + struct { + le16 reason_code; + } STRUCT_PACKED disassoc; + struct { + u8 timestamp[8]; + le16 beacon_int; + le16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } STRUCT_PACKED beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } STRUCT_PACKED probe_req; + struct { + u8 timestamp[8]; + le16 beacon_int; + le16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } STRUCT_PACKED probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } STRUCT_PACKED wmm_action; + struct{ + u8 action_code; + u8 element_id; + u8 length; + u8 switch_mode; + u8 new_chan; + u8 switch_count; + } STRUCT_PACKED chan_switch; + struct { + u8 action; + u8 sta_addr[ETH_ALEN]; + u8 target_ap_addr[ETH_ALEN]; + u8 variable[0]; /* FT Request */ + } STRUCT_PACKED ft_action_req; + struct { + u8 action; + u8 sta_addr[ETH_ALEN]; + u8 target_ap_addr[ETH_ALEN]; + le16 status_code; + u8 variable[0]; /* FT Request */ + } STRUCT_PACKED ft_action_resp; + struct { + u8 action; + u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN]; + } STRUCT_PACKED sa_query_req; + struct { + u8 action; /* */ + u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN]; + } STRUCT_PACKED sa_query_resp; + } u; + } STRUCT_PACKED action; + } u; +} STRUCT_PACKED; + + +struct ieee80211_ht_capabilities { + le16 ht_capabilities_info; + u8 a_mpdu_params; + u8 supported_mcs_set[16]; + le16 ht_extended_capabilities; + le32 tx_bf_capability_info; + u8 asel_capabilities; +} STRUCT_PACKED; + + +struct ieee80211_ht_operation { + u8 control_chan; + u8 ht_param; + le16 operation_mode; + le16 stbc_param; + u8 basic_set[16]; +} STRUCT_PACKED; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif /* _MSC_VER */ + +#define ERP_INFO_NON_ERP_PRESENT BIT(0) +#define ERP_INFO_USE_PROTECTION BIT(1) +#define ERP_INFO_BARKER_PREAMBLE_MODE BIT(2) + + +#define HT_CAP_INFO_LDPC_CODING_CAP ((u16) BIT(0)) +#define HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET ((u16) BIT(1)) +#define HT_CAP_INFO_SMPS_MASK ((u16) (BIT(2) | BIT(3))) +#define HT_CAP_INFO_SMPS_STATIC ((u16) 0) +#define HT_CAP_INFO_SMPS_DYNAMIC ((u16) BIT(2)) +#define HT_CAP_INFO_SMPS_DISABLED ((u16) (BIT(2) | BIT(3))) +#define HT_CAP_INFO_GREEN_FIELD ((u16) BIT(4)) +#define HT_CAP_INFO_SHORT_GI20MHZ ((u16) BIT(5)) +#define HT_CAP_INFO_SHORT_GI40MHZ ((u16) BIT(6)) +#define HT_CAP_INFO_TX_STBC ((u16) BIT(7)) +#define HT_CAP_INFO_RX_STBC_MASK ((u16) (BIT(8) | BIT(9))) +#define HT_CAP_INFO_RX_STBC_1 ((u16) BIT(8)) +#define HT_CAP_INFO_RX_STBC_12 ((u16) BIT(9)) +#define HT_CAP_INFO_RX_STBC_123 ((u16) (BIT(8) | BIT(9))) +#define HT_CAP_INFO_DELAYED_BA ((u16) BIT(10)) +#define HT_CAP_INFO_MAX_AMSDU_SIZE ((u16) BIT(11)) +#define HT_CAP_INFO_DSSS_CCK40MHZ ((u16) BIT(12)) +#define HT_CAP_INFO_PSMP_SUPP ((u16) BIT(13)) +#define HT_CAP_INFO_40MHZ_INTOLERANT ((u16) BIT(14)) +#define HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT ((u16) BIT(15)) + + +#define EXT_HT_CAP_INFO_PCO ((u16) BIT(0)) +#define EXT_HT_CAP_INFO_TRANS_TIME_OFFSET 1 +#define EXT_HT_CAP_INFO_MCS_FEEDBACK_OFFSET 8 +#define EXT_HT_CAP_INFO_HTC_SUPPORTED ((u16) BIT(10)) +#define EXT_HT_CAP_INFO_RD_RESPONDER ((u16) BIT(11)) + + +#define TX_BEAMFORM_CAP_TXBF_CAP ((u32) BIT(0)) +#define TX_BEAMFORM_CAP_RX_STAGGERED_SOUNDING_CAP ((u32) BIT(1)) +#define TX_BEAMFORM_CAP_TX_STAGGERED_SOUNDING_CAP ((u32) BIT(2)) +#define TX_BEAMFORM_CAP_RX_ZLF_CAP ((u32) BIT(3)) +#define TX_BEAMFORM_CAP_TX_ZLF_CAP ((u32) BIT(4)) +#define TX_BEAMFORM_CAP_IMPLICIT_ZLF_CAP ((u32) BIT(5)) +#define TX_BEAMFORM_CAP_CALIB_OFFSET 6 +#define TX_BEAMFORM_CAP_EXPLICIT_CSI_TXBF_CAP ((u32) BIT(8)) +#define TX_BEAMFORM_CAP_EXPLICIT_UNCOMPR_STEERING_MATRIX_CAP ((u32) BIT(9)) +#define TX_BEAMFORM_CAP_EXPLICIT_BF_CSI_FEEDBACK_CAP ((u32) BIT(10)) +#define TX_BEAMFORM_CAP_EXPLICIT_BF_CSI_FEEDBACK_OFFSET 11 +#define TX_BEAMFORM_CAP_EXPLICIT_UNCOMPR_STEERING_MATRIX_FEEDBACK_OFFSET 13 +#define TX_BEAMFORM_CAP_EXPLICIT_COMPRESSED_STEERING_MATRIX_FEEDBACK_OFFSET 15 +#define TX_BEAMFORM_CAP_MINIMAL_GROUPING_OFFSET 17 +#define TX_BEAMFORM_CAP_CSI_NUM_BEAMFORMER_ANT_OFFSET 19 +#define TX_BEAMFORM_CAP_UNCOMPRESSED_STEERING_MATRIX_BEAMFORMER_ANT_OFFSET 21 +#define TX_BEAMFORM_CAP_COMPRESSED_STEERING_MATRIX_BEAMFORMER_ANT_OFFSET 23 +#define TX_BEAMFORM_CAP_SCI_MAX_OF_ROWS_BEANFORMER_SUPPORTED_OFFSET 25 + + +#define ASEL_CAPABILITY_ASEL_CAPABLE ((u8) BIT(0)) +#define ASEL_CAPABILITY_EXPLICIT_CSI_FEEDBACK_BASED_TX_AS_CAP ((u8) BIT(1)) +#define ASEL_CAPABILITY_ANT_INDICES_FEEDBACK_BASED_TX_AS_CAP ((u8) BIT(2)) +#define ASEL_CAPABILITY_EXPLICIT_CSI_FEEDBACK_CAP ((u8) BIT(3)) +#define ASEL_CAPABILITY_ANT_INDICES_FEEDBACK_CAP ((u8) BIT(4)) +#define ASEL_CAPABILITY_RX_AS_CAP ((u8) BIT(5)) +#define ASEL_CAPABILITY_TX_SOUND_PPDUS_CAP ((u8) BIT(6)) + +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) +#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) +#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) +#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) + + +#define OP_MODE_PURE 0 +#define OP_MODE_MAY_BE_LEGACY_STAS 1 +#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 +#define OP_MODE_MIXED 3 + +#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ + ((le16) (0x0001 | 0x0002)) +#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 +#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) +#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) +#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) + +#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) +#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) +#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8)) +#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) +#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) +#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) + + +#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) + * 00:50:F2 */ +#define WPA_IE_VENDOR_TYPE 0x0050f201 +#define WPS_IE_VENDOR_TYPE 0x0050f204 + +#define WMM_OUI_TYPE 2 +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WMM_VERSION 1 + +#define WMM_ACTION_CODE_ADDTS_REQ 0 +#define WMM_ACTION_CODE_ADDTS_RESP 1 +#define WMM_ACTION_CODE_DELTS 2 + +#define WMM_ADDTS_STATUS_ADMISSION_ACCEPTED 0 +#define WMM_ADDTS_STATUS_INVALID_PARAMETERS 1 +/* 2 - Reserved */ +#define WMM_ADDTS_STATUS_REFUSED 3 +/* 4-255 - Reserved */ + +/* WMM TSPEC Direction Field Values */ +#define WMM_TSPEC_DIRECTION_UPLINK 0 +#define WMM_TSPEC_DIRECTION_DOWNLINK 1 +/* 2 - Reserved */ +#define WMM_TSPEC_DIRECTION_BI_DIRECTIONAL 3 + +/* + * WMM Information Element (used in (Re)Association Request frames; may also be + * used in Beacon frames) + */ +struct wmm_information_element { + /* Element ID: 221 (0xdd); Length: 7 */ + /* required fields for WMM version 1 */ + u8 oui[3]; /* 00:50:f2 */ + u8 oui_type; /* 2 */ + u8 oui_subtype; /* 0 */ + u8 version; /* 1 for WMM version 1.0 */ + u8 qos_info; /* AP/STA specific QoS info */ + +} STRUCT_PACKED; + +#define WMM_AC_AIFSN_MASK 0x0f +#define WMM_AC_AIFNS_SHIFT 0 +#define WMM_AC_ACM 0x10 +#define WMM_AC_ACI_MASK 0x60 +#define WMM_AC_ACI_SHIFT 5 + +#define WMM_AC_ECWMIN_MASK 0x0f +#define WMM_AC_ECWMIN_SHIFT 0 +#define WMM_AC_ECWMAX_MASK 0xf0 +#define WMM_AC_ECWMAX_SHIFT 4 + +struct wmm_ac_parameter { + u8 aci_aifsn; /* AIFSN, ACM, ACI */ + u8 cw; /* ECWmin, ECWmax (CW = 2^ECW - 1) */ + le16 txop_limit; +} STRUCT_PACKED; + +/* + * WMM Parameter Element (used in Beacon, Probe Response, and (Re)Association + * Response frmaes) + */ +struct wmm_parameter_element { + /* Element ID: 221 (0xdd); Length: 24 */ + /* required fields for WMM version 1 */ + u8 oui[3]; /* 00:50:f2 */ + u8 oui_type; /* 2 */ + u8 oui_subtype; /* 1 */ + u8 version; /* 1 for WMM version 1.0 */ + u8 qos_info; /* AP/STA specif QoS info */ + u8 reserved; /* 0 */ + struct wmm_ac_parameter ac[4]; /* AC_BE, AC_BK, AC_VI, AC_VO */ + +} STRUCT_PACKED; + +/* WMM TSPEC Element */ +struct wmm_tspec_element { + u8 eid; /* 221 = 0xdd */ + u8 length; /* 6 + 55 = 61 */ + u8 oui[3]; /* 00:50:f2 */ + u8 oui_type; /* 2 */ + u8 oui_subtype; /* 2 */ + u8 version; /* 1 */ + /* WMM TSPEC body (55 octets): */ + u8 ts_info[3]; + le16 nominal_msdu_size; + le16 maximum_msdu_size; + le32 minimum_service_interval; + le32 maximum_service_interval; + le32 inactivity_interval; + le32 suspension_interval; + le32 service_start_time; + le32 minimum_data_rate; + le32 mean_data_rate; + le32 peak_data_rate; + le32 maximum_burst_size; + le32 delay_bound; + le32 minimum_phy_rate; + le16 surplus_bandwidth_allowance; + le16 medium_time; +} STRUCT_PACKED; + + +/* Access Categories / ACI to AC coding */ +enum { + WMM_AC_BE = 0 /* Best Effort */, + WMM_AC_BK = 1 /* Background */, + WMM_AC_VI = 2 /* Video */, + WMM_AC_VO = 3 /* Voice */ +}; + + +#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ + +#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ + +/* cipher suite selectors */ +#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00 +#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01 +#define WLAN_CIPHER_SUITE_TKIP 0x000FAC02 +/* reserved: 0x000FAC03 */ +#define WLAN_CIPHER_SUITE_CCMP 0x000FAC04 +#define WLAN_CIPHER_SUITE_WEP104 0x000FAC05 +#define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06 + +/* AKM suite selectors */ +#define WLAN_AKM_SUITE_8021X 0x000FAC01 +#define WLAN_AKM_SUITE_PSK 0x000FAC02 + +#endif /* IEEE802_11_DEFS_H */ diff --git a/components/wpa_supplicant/include/wpa/ieee802_1x.h b/components/wpa_supplicant/include/wpa/ieee802_1x.h new file mode 100644 index 000000000..e10ff7b31 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/ieee802_1x.h @@ -0,0 +1,64 @@ +/* + * hostapd / IEEE 802.1X-2004 Authenticator + * Copyright (c) 2002-2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef IEEE802_1X_H +#define IEEE802_1X_H + +struct hostapd_data; +struct sta_info; +struct eapol_state_machine; +struct hostapd_config; +struct hostapd_bss_config; +struct hostapd_radius_attr; +struct radius_msg; + + +void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf, + size_t len); + +#if 0 +void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta); +void ieee802_1x_free_station(struct sta_info *sta); + +void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta); +void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta); +void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd, + struct sta_info *sta, int authorized); +void ieee802_1x_dump_state(FILE *f, const char *prefix, struct sta_info *sta); +int ieee802_1x_init(struct hostapd_data *hapd); +void ieee802_1x_deinit(struct hostapd_data *hapd); +int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *buf, size_t len, int ack); +int ieee802_1x_eapol_tx_status(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *data, int len, int ack); +u8 * ieee802_1x_get_identity(struct eapol_state_machine *sm, size_t *len); +u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len, + int idx); +struct wpabuf * ieee802_1x_get_radius_cui(struct eapol_state_machine *sm); +const u8 * ieee802_1x_get_key(struct eapol_state_machine *sm, size_t *len); +void ieee802_1x_notify_port_enabled(struct eapol_state_machine *sm, + int enabled); +void ieee802_1x_notify_port_valid(struct eapol_state_machine *sm, + int valid); +void ieee802_1x_notify_pre_auth(struct eapol_state_machine *sm, int pre_auth); +int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen); +int ieee802_1x_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta, + char *buf, size_t buflen); +void hostapd_get_ntp_timestamp(u8 *buf); +char *eap_type_text(u8 type); + +const char *radius_mode_txt(struct hostapd_data *hapd); +int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta); + +int add_common_radius_attr(struct hostapd_data *hapd, + struct hostapd_radius_attr *req_attr, + struct sta_info *sta, + struct radius_msg *msg); +#endif + +#endif /* IEEE802_1X_H */ diff --git a/components/wpa_supplicant/include/wpa/includes.h b/components/wpa_supplicant/include/wpa/includes.h new file mode 100644 index 000000000..993bc4994 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/includes.h @@ -0,0 +1,31 @@ +/* + * wpa_supplicant/hostapd - Default include files + * Copyright (c) 2005-2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + * + * This header file is included into all C files so that commonly used header + * files can be selected with OS specific ifdef blocks in one place instead of + * having to have OS/C library specific selection in many files. + */ + +#ifndef INCLUDES_H +#define INCLUDES_H + +/* Include possible build time configuration before including anything else */ +//#include "build_config.h" //don't need anymore + +//#include +//#include +//#include +//#include +//#include + +#endif /* INCLUDES_H */ diff --git a/components/wpa_supplicant/include/wpa/list.h b/components/wpa_supplicant/include/wpa/list.h new file mode 100644 index 000000000..c8dccee83 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/list.h @@ -0,0 +1,101 @@ +/* + * Doubly-linked list + * Copyright (c) 2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef LIST_H +#define LIST_H + +/** + * struct dl_list - Doubly-linked list + */ +struct dl_list { + struct dl_list *next; + struct dl_list *prev; +}; + +static inline void dl_list_init(struct dl_list *list) +{ + list->next = list; + list->prev = list; +} + +static inline void dl_list_add(struct dl_list *list, struct dl_list *item) +{ + item->next = list->next; + item->prev = list; + list->next->prev = item; + list->next = item; +} + +static inline void dl_list_add_tail(struct dl_list *list, struct dl_list *item) +{ + dl_list_add(list->prev, item); +} + +static inline void dl_list_del(struct dl_list *item) +{ + item->next->prev = item->prev; + item->prev->next = item->next; + item->next = NULL; + item->prev = NULL; +} + +static inline int dl_list_empty(struct dl_list *list) +{ + return list->next == list; +} + +static inline unsigned int dl_list_len(struct dl_list *list) +{ + struct dl_list *item; + int count = 0; + for (item = list->next; item != list; item = item->next) + count++; + return count; +} + +#ifndef offsetof +#define offsetof(type, member) ((long) &((type *) 0)->member) +#endif + +#define dl_list_entry(item, type, member) \ + ((type *) ((char *) item - offsetof(type, member))) + +#define dl_list_first(list, type, member) \ + (dl_list_empty((list)) ? NULL : \ + dl_list_entry((list)->next, type, member)) + +#define dl_list_last(list, type, member) \ + (dl_list_empty((list)) ? NULL : \ + dl_list_entry((list)->prev, type, member)) + +#define dl_list_for_each(item, list, type, member) \ + for (item = dl_list_entry((list)->next, type, member); \ + &item->member != (list); \ + item = dl_list_entry(item->member.next, type, member)) + +#define dl_list_for_each_safe(item, n, list, type, member) \ + for (item = dl_list_entry((list)->next, type, member), \ + n = dl_list_entry(item->member.next, type, member); \ + &item->member != (list); \ + item = n, n = dl_list_entry(n->member.next, type, member)) + +#define dl_list_for_each_reverse(item, list, type, member) \ + for (item = dl_list_entry((list)->prev, type, member); \ + &item->member != (list); \ + item = dl_list_entry(item->member.prev, type, member)) + +#define DEFINE_DL_LIST(name) \ + struct dl_list name = { &(name), &(name) } + +#endif /* LIST_H */ diff --git a/components/wpa_supplicant/include/wpa/sta_info.h b/components/wpa_supplicant/include/wpa/sta_info.h new file mode 100644 index 000000000..44874a2ff --- /dev/null +++ b/components/wpa_supplicant/include/wpa/sta_info.h @@ -0,0 +1,194 @@ +/* + * hostapd / Station table + * Copyright (c) 2002-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef STA_INFO_H +#define STA_INFO_H + +/* STA flags */ +#define WLAN_STA_AUTH BIT(0) +#define WLAN_STA_ASSOC BIT(1) +#define WLAN_STA_PS BIT(2) +#define WLAN_STA_TIM BIT(3) +#define WLAN_STA_PERM BIT(4) +#define WLAN_STA_AUTHORIZED BIT(5) +#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ +#define WLAN_STA_SHORT_PREAMBLE BIT(7) +#define WLAN_STA_PREAUTH BIT(8) +#define WLAN_STA_WMM BIT(9) +#define WLAN_STA_MFP BIT(10) +#define WLAN_STA_HT BIT(11) +#define WLAN_STA_WPS BIT(12) +#define WLAN_STA_MAYBE_WPS BIT(13) +#define WLAN_STA_WDS BIT(14) +#define WLAN_STA_ASSOC_REQ_OK BIT(15) +#define WLAN_STA_WPS2 BIT(16) +#define WLAN_STA_GAS BIT(17) +#define WLAN_STA_VHT BIT(18) +#define WLAN_STA_PENDING_DISASSOC_CB BIT(29) +#define WLAN_STA_PENDING_DEAUTH_CB BIT(30) +#define WLAN_STA_NONERP BIT(31) + +/* Maximum number of supported rates (from both Supported Rates and Extended + * Supported Rates IEs). */ +#define WLAN_SUPP_RATES_MAX 32 + + +struct sta_info { + struct sta_info *next; /* next entry in sta list */ + struct sta_info *hnext; /* next entry in hash table list */ + u8 addr[6]; + u16 aid; /* STA's unique AID (1 .. 2007) or 0 if not yet assigned */ + u32 flags; /* Bitfield of WLAN_STA_* */ + u16 capability; + u16 listen_interval; /* or beacon_int for APs */ + u8 supported_rates[WLAN_SUPP_RATES_MAX]; + int supported_rates_len; +// u8 qosinfo; /* Valid when WLAN_STA_WMM is set */ + +// unsigned int nonerp_set:1; +// unsigned int no_short_slot_time_set:1; +// unsigned int no_short_preamble_set:1; +// unsigned int no_ht_gf_set:1; +// unsigned int no_ht_set:1; +// unsigned int ht_20mhz_set:1; +// unsigned int no_p2p_set:1; + + u16 auth_alg; +// u8 previous_ap[6]; + + enum { + STA_NULLFUNC = 0, STA_DISASSOC, STA_DEAUTH, STA_REMOVE + } timeout_next; + +// u16 deauth_reason; +// u16 disassoc_reason; + + /* IEEE 802.1X related data */ +// struct eapol_state_machine *eapol_sm; + + /* IEEE 802.11f (IAPP) related data */ +// struct ieee80211_mgmt *last_assoc_req; + +// u32 acct_session_id_hi; +// u32 acct_session_id_lo; +// time_t acct_session_start; +// int acct_session_started; +// int acct_terminate_cause; /* Acct-Terminate-Cause */ +// int acct_interim_interval; /* Acct-Interim-Interval */ + +// unsigned long last_rx_bytes; +// unsigned long last_tx_bytes; +// u32 acct_input_gigawords; /* Acct-Input-Gigawords */ +// u32 acct_output_gigawords; /* Acct-Output-Gigawords */ + +// u8 *challenge; /* IEEE 802.11 Shared Key Authentication Challenge */ + + struct wpa_state_machine *wpa_sm; +// struct rsn_preauth_interface *preauth_iface; + + struct hostapd_ssid *ssid; /* SSID selection based on (Re)AssocReq */ +// struct hostapd_ssid *ssid_probe; /* SSID selection based on ProbeReq */ + +// int vlan_id; + /* PSKs from RADIUS authentication server */ +// struct hostapd_sta_wpa_psk_short *psk; + +// char *identity; /* User-Name from RADIUS */ +// char *radius_cui; /* Chargeable-User-Identity from RADIUS */ + +// struct ieee80211_ht_capabilities *ht_capabilities; +// struct ieee80211_vht_capabilities *vht_capabilities; + +#ifdef CONFIG_IEEE80211W + int sa_query_count; /* number of pending SA Query requests; + * 0 = no SA Query in progress */ + int sa_query_timed_out; + u8 *sa_query_trans_id; /* buffer of WLAN_SA_QUERY_TR_ID_LEN * + * sa_query_count octets of pending SA Query + * transaction identifiers */ + struct os_time sa_query_start; +#endif /* CONFIG_IEEE80211W */ + +#ifdef CONFIG_INTERWORKING +#define GAS_DIALOG_MAX 8 /* Max concurrent dialog number */ + struct gas_dialog_info *gas_dialog; + u8 gas_dialog_next; +#endif /* CONFIG_INTERWORKING */ + +// struct wpabuf *wps_ie; /* WPS IE from (Re)Association Request */ +// struct wpabuf *p2p_ie; /* P2P IE from (Re)Association Request */ +// struct wpabuf *hs20_ie; /* HS 2.0 IE from (Re)Association Request */ + +// struct os_time connected_time; + +#ifdef CONFIG_SAE + enum { SAE_INIT, SAE_COMMIT, SAE_CONFIRM } sae_state; + u16 sae_send_confirm; +#endif /* CONFIG_SAE */ +}; + + +/* Default value for maximum station inactivity. After AP_MAX_INACTIVITY has + * passed since last received frame from the station, a nullfunc data frame is + * sent to the station. If this frame is not acknowledged and no other frames + * have been received, the station will be disassociated after + * AP_DISASSOC_DELAY seconds. Similarly, the station will be deauthenticated + * after AP_DEAUTH_DELAY seconds has passed after disassociation. */ +#define AP_MAX_INACTIVITY (5 * 60) +#define AP_DISASSOC_DELAY (1) +#define AP_DEAUTH_DELAY (1) +/* Number of seconds to keep STA entry with Authenticated flag after it has + * been disassociated. */ +#define AP_MAX_INACTIVITY_AFTER_DISASSOC (1 * 30) +/* Number of seconds to keep STA entry after it has been deauthenticated. */ +#define AP_MAX_INACTIVITY_AFTER_DEAUTH (1 * 5) + + +struct hostapd_data; + +int ap_for_each_sta(struct hostapd_data *hapd, + int (*cb)(struct hostapd_data *hapd, struct sta_info *sta, + void *ctx), + void *ctx); +struct sta_info * ap_get_sta(struct hostapd_data *hapd, const u8 *sta); +void ap_sta_hash_add(struct hostapd_data *hapd, struct sta_info *sta); +void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta); +void hostapd_free_stas(struct hostapd_data *hapd); +void ap_handle_timer(void *eloop_ctx, void *timeout_ctx); +void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta, + u32 session_timeout); +void ap_sta_no_session_timeout(struct hostapd_data *hapd, + struct sta_info *sta); +struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr); +void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta, + u16 reason); +void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta, + u16 reason); +#ifdef CONFIG_WPS +int ap_sta_wps_cancel(struct hostapd_data *hapd, + struct sta_info *sta, void *ctx); +#endif /* CONFIG_WPS */ +int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta, + int old_vlanid); +void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta); +void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta); +int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta); +void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *addr, u16 reason); + +void ap_sta_set_authorized(struct hostapd_data *hapd, + struct sta_info *sta, int authorized); +static inline int ap_sta_is_authorized(struct sta_info *sta) +{ + return sta->flags & WLAN_STA_AUTHORIZED; +} + +void ap_sta_deauth_cb(struct hostapd_data *hapd, struct sta_info *sta); +void ap_sta_disassoc_cb(struct hostapd_data *hapd, struct sta_info *sta); + +#endif /* STA_INFO_H */ diff --git a/components/wpa_supplicant/include/wpa/state_machine.h b/components/wpa_supplicant/include/wpa/state_machine.h new file mode 100644 index 000000000..ce8c51e77 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/state_machine.h @@ -0,0 +1,138 @@ +/* + * wpa_supplicant/hostapd - State machine definitions + * Copyright (c) 2002-2005, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + * + * This file includes a set of pre-processor macros that can be used to + * implement a state machine. In addition to including this header file, each + * file implementing a state machine must define STATE_MACHINE_DATA to be the + * data structure including state variables (enum machine_state, + * Boolean changed), and STATE_MACHINE_DEBUG_PREFIX to be a string that is used + * as a prefix for all debug messages. If SM_ENTRY_MA macro is used to define + * a group of state machines with shared data structure, STATE_MACHINE_ADDR + * needs to be defined to point to the MAC address used in debug output. + * SM_ENTRY_M macro can be used to define similar group of state machines + * without this additional debug info. + */ + +#ifndef STATE_MACHINE_H +#define STATE_MACHINE_H + +/** + * SM_STATE - Declaration of a state machine function + * @machine: State machine name + * @state: State machine state + * + * This macro is used to declare a state machine function. It is used in place + * of a C function definition to declare functions to be run when the state is + * entered by calling SM_ENTER or SM_ENTER_GLOBAL. + */ +#define SM_STATE(machine, state) \ +static void ICACHE_FLASH_ATTR sm_ ## machine ## _ ## state ## _Enter(STATE_MACHINE_DATA *sm, \ + int global) + +/** + * SM_ENTRY - State machine function entry point + * @machine: State machine name + * @state: State machine state + * + * This macro is used inside each state machine function declared with + * SM_STATE. SM_ENTRY should be in the beginning of the function body, but + * after declaration of possible local variables. This macro prints debug + * information about state transition and update the state machine state. + */ +#define SM_ENTRY(machine, state) \ +if (!global || sm->machine ## _state != machine ## _ ## state) { \ + sm->changed = TRUE; \ + wpa_printf(MSG_DEBUG, STATE_MACHINE_DEBUG_PREFIX ": " #machine \ + " entering state " #state); \ +} \ +sm->machine ## _state = machine ## _ ## state; + +/** + * SM_ENTRY_M - State machine function entry point for state machine group + * @machine: State machine name + * @_state: State machine state + * @data: State variable prefix (full variable: prefix_state) + * + * This macro is like SM_ENTRY, but for state machine groups that use a shared + * data structure for more than one state machine. Both machine and prefix + * parameters are set to "sub-state machine" name. prefix is used to allow more + * than one state variable to be stored in the same data structure. + */ +#define SM_ENTRY_M(machine, _state, data) \ +if (!global || sm->data ## _ ## state != machine ## _ ## _state) { \ + sm->changed = TRUE; \ + wpa_printf(MSG_DEBUG, STATE_MACHINE_DEBUG_PREFIX ": " \ + #machine " entering state " #_state); \ +} \ +sm->data ## _ ## state = machine ## _ ## _state; + +/** + * SM_ENTRY_MA - State machine function entry point for state machine group + * @machine: State machine name + * @_state: State machine state + * @data: State variable prefix (full variable: prefix_state) + * + * This macro is like SM_ENTRY_M, but a MAC address is included in debug + * output. STATE_MACHINE_ADDR has to be defined to point to the MAC address to + * be included in debug. + */ +#define SM_ENTRY_MA(machine, _state, data) \ +if (!global || sm->data ## _ ## state != machine ## _ ## _state) { \ + sm->changed = TRUE; \ + wpa_printf(MSG_DEBUG, STATE_MACHINE_DEBUG_PREFIX ": " MACSTR " " \ + #machine " entering state " #_state"\n", \ + MAC2STR(STATE_MACHINE_ADDR)); \ +} \ +sm->data ## _ ## state = machine ## _ ## _state; + +/** + * SM_ENTER - Enter a new state machine state + * @machine: State machine name + * @state: State machine state + * + * This macro expands to a function call to a state machine function defined + * with SM_STATE macro. SM_ENTER is used in a state machine step function to + * move the state machine to a new state. + */ +#define SM_ENTER(machine, state) \ +sm_ ## machine ## _ ## state ## _Enter(sm, 0) + +/** + * SM_ENTER_GLOBAL - Enter a new state machine state based on global rule + * @machine: State machine name + * @state: State machine state + * + * This macro is like SM_ENTER, but this is used when entering a new state + * based on a global (not specific to any particular state) rule. A separate + * macro is used to avoid unwanted debug message floods when the same global + * rule is forcing a state machine to remain in on state. + */ +#define SM_ENTER_GLOBAL(machine, state) \ +sm_ ## machine ## _ ## state ## _Enter(sm, 1) + +/** + * SM_STEP - Declaration of a state machine step function + * @machine: State machine name + * + * This macro is used to declare a state machine step function. It is used in + * place of a C function definition to declare a function that is used to move + * state machine to a new state based on state variables. This function uses + * SM_ENTER and SM_ENTER_GLOBAL macros to enter new state. + */ +#define SM_STEP(machine) \ +static void ICACHE_FLASH_ATTR sm_ ## machine ## _Step(STATE_MACHINE_DATA *sm) + +/** + * SM_STEP_RUN - Call the state machine step function + * @machine: State machine name + * + * This macro expands to a function call to a state machine step function + * defined with SM_STEP macro. + */ +#define SM_STEP_RUN(machine) sm_ ## machine ## _Step(sm) + +#endif /* STATE_MACHINE_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa.h b/components/wpa_supplicant/include/wpa/wpa.h new file mode 100644 index 000000000..2a1adfc56 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa.h @@ -0,0 +1,193 @@ +/* + * wpa_supplicant - WPA definitions + * Copyright (c) 2003-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPA_H +#define WPA_H + +#include "c_types.h" +#include "os_type.h" +#include "common.h" +#include "ets_sys.h" +#include "wpa/defs.h" +#include "wpa/wpa_common.h" + +//#include "net80211/ieee80211_var.h" +//#include "net80211/ieee80211_node.h" + +#define WPA_SM_STATE(_sm) ((_sm)->wpa_state) + +struct wpa_sm; + +int wpa_sm_rx_eapol(u8 *src_addr, u8 *buf, u32 len); + +#define WPA_ASSERT ASSERT + +struct install_key { + int mic_errors_seen; /* Michael MIC errors with the current PTK */ + int keys_cleared; + enum wpa_alg alg; + u8 addr[ETH_ALEN]; + int key_idx; + int set_tx; + u8 seq[10]; + u8 key[32]; +}; + +/** + * struct wpa_sm - Internal WPA state machine data + */ +struct wpa_sm { + u8 pmk[PMK_LEN]; + size_t pmk_len; + +// char *passphrase; //wlan password +// u8 *ssid; //wlan network name +// size_t ssid_len; + + struct wpa_ptk ptk, tptk; + int ptk_set, tptk_set; + u8 snonce[WPA_NONCE_LEN]; + u8 anonce[WPA_NONCE_LEN]; /* ANonce from the last 1/4 msg */ + int renew_snonce; + u8 rx_replay_counter[WPA_REPLAY_COUNTER_LEN]; + int rx_replay_counter_set; + u8 request_counter[WPA_REPLAY_COUNTER_LEN]; + +// void *network_ctx; + + unsigned int pairwise_cipher; + unsigned int group_cipher; + unsigned int key_mgmt; + unsigned int mgmt_group_cipher; + + int rsn_enabled; /* Whether RSN is enabled in configuration */ + + int countermeasures; /*TKIP countermeasures state flag, 1:in countermeasures state*/ + os_timer_t cm_timer; + + u8 *assoc_wpa_ie; /* Own WPA/RSN IE from (Re)AssocReq */ + size_t assoc_wpa_ie_len; + + u8 eapol_version; + + int wpa_ptk_rekey; + u8 own_addr[ETH_ALEN]; + + u8 bssid[ETH_ALEN]; + + unsigned int proto; + enum wpa_states wpa_state; + + u8 *ap_wpa_ie, *ap_rsn_ie; + size_t ap_wpa_ie_len, ap_rsn_ie_len; + + struct install_key install_ptk; + struct install_key install_gtk; + int key_entry_valid; //present current avaliable entry for bssid, for pairkey:0,5,10,15,20, gtk: pairkey_no+i (i:1~4) + +// char *msg; //send eapol msg buff +// size_t msg_len; //msg length:6 + sizeof(eth) + data_len + +// struct netif *ifp; + struct pbuf *pb; + + void (* sendto) (struct pbuf *pb); + void (*config_assoc_ie) (uint8 proto, u8 *assoc_buf, u32 assoc_wpa_ie_len); + void (*install_ppkey) (enum wpa_alg alg, uint8 *addr, int key_idx, int set_tx, + uint8 *seq, size_t seq_len, uint8 *key, size_t key_len, int key_entry_valid); + void (*wpa_deauthenticate)(uint8 reason_code); + void (*wpa_neg_complete)(); + struct wpa_gtk_data gd; //used for calllback save param + uint16 key_info; //used for txcallback param +}; + +struct l2_ethhdr { + u8 h_dest[ETH_ALEN]; + u8 h_source[ETH_ALEN]; + be16 h_proto; +} STRUCT_PACKED; + +/** + * set_key - Configure encryption key + * @ifname: Interface name (for multi-SSID/VLAN support) + * @priv: private driver interface data + * @alg: encryption algorithm (%WPA_ALG_NONE, %WPA_ALG_WEP, + * %WPA_ALG_TKIP, %WPA_ALG_CCMP, %WPA_ALG_IGTK, %WPA_ALG_PMK); + * %WPA_ALG_NONE clears the key. + * @addr: address of the peer STA or ff:ff:ff:ff:ff:ff for + * broadcast/default keys + * @key_idx: key index (0..3), usually 0 for unicast keys; 0..4095 for + * IGTK + * @set_tx: configure this key as the default Tx key (only used when + * driver does not support separate unicast/individual key + * @seq: sequence number/packet number, seq_len octets, the next + * packet number to be used for in replay protection; configured + * for Rx keys (in most cases, this is only used with broadcast + * keys and set to zero for unicast keys) + * @seq_len: length of the seq, depends on the algorithm: + * TKIP: 6 octets, CCMP: 6 octets, IGTK: 6 octets + * @key: key buffer; TKIP: 16-byte temporal key, 8-byte Tx Mic key, + * 8-byte Rx Mic Key + * @key_len: length of the key buffer in octets (WEP: 5 or 13, + * TKIP: 32, CCMP: 16, IGTK: 16) + * + * Returns: 0 on success, -1 on failure + * + * Configure the given key for the kernel driver. If the driver + * supports separate individual keys (4 default keys + 1 individual), + * addr can be used to determine whether the key is default or + * individual. If only 4 keys are supported, the default key with key + * index 0 is used as the individual key. STA must be configured to use + * it as the default Tx key (set_tx is set) and accept Rx for all the + * key indexes. In most cases, WPA uses only key indexes 1 and 2 for + * broadcast keys, so key index 0 is available for this kind of + * configuration. + * + * Please note that TKIP keys include separate TX and RX MIC keys and + * some drivers may expect them in different order than wpa_supplicant + * is using. If the TX/RX keys are swapped, all TKIP encrypted packets + * will tricker Michael MIC errors. This can be fixed by changing the + * order of MIC keys by swapping te bytes 16..23 and 24..31 of the key + * in driver_*.c set_key() implementation, see driver_ndis.c for an + * example on how this can be done. + */ + + +/** + * send_eapol - Optional function for sending EAPOL packets + * @priv: private driver interface data + * @dest: Destination MAC address + * @proto: Ethertype + * @data: EAPOL packet starting with IEEE 802.1X header + * @data_len: Size of the EAPOL packet + * + * Returns: 0 on success, -1 on failure + * + * This optional function can be used to override l2_packet operations + * with driver specific functionality. If this function pointer is set, + * l2_packet module is not used at all and the driver interface code is + * responsible for receiving and sending all EAPOL packets. The + * received EAPOL packets are sent to core code with EVENT_EAPOL_RX + * event. The driver interface is required to implement get_mac_addr() + * handler if send_eapol() is used. + */ + +#define KEYENTRY_TABLE_MAP(key_entry_valid) ((key_entry_valid)%5) + +void pp_michael_mic_failure(uint16 isunicast); + +void wpa_sm_set_state(enum wpa_states state); + +#endif /* WPA_H */ + diff --git a/components/wpa_supplicant/include/wpa/wpa_auth.h b/components/wpa_supplicant/include/wpa/wpa_auth.h new file mode 100644 index 000000000..c72992349 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_auth.h @@ -0,0 +1,292 @@ +/* + * hostapd - IEEE 802.11i-2004 / WPA Authenticator + * Copyright (c) 2004-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef WPA_AUTH_H +#define WPA_AUTH_H + +#include "wpa/defs.h" +#include "wpa/eapol_common.h" +#include "wpa/wpa_common.h" + +#ifdef _MSC_VER +#pragma pack(push, 1) +#endif /* _MSC_VER */ + +/* IEEE Std 802.11r-2008, 11A.10.3 - Remote request/response frame definition + */ +struct ft_rrb_frame { + u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */ + u8 packet_type; /* FT_PACKET_REQUEST/FT_PACKET_RESPONSE */ + le16 action_length; /* little endian length of action_frame */ + u8 ap_address[ETH_ALEN]; + /* + * Followed by action_length bytes of FT Action frame (from Category + * field to the end of Action Frame body. + */ +} STRUCT_PACKED; + +#define RSN_REMOTE_FRAME_TYPE_FT_RRB 1 + +#define FT_PACKET_REQUEST 0 +#define FT_PACKET_RESPONSE 1 +/* Vendor-specific types for R0KH-R1KH protocol; not defined in 802.11r */ +#define FT_PACKET_R0KH_R1KH_PULL 200 +#define FT_PACKET_R0KH_R1KH_RESP 201 +#define FT_PACKET_R0KH_R1KH_PUSH 202 + +#define FT_R0KH_R1KH_PULL_DATA_LEN 44 +#define FT_R0KH_R1KH_RESP_DATA_LEN 76 +#define FT_R0KH_R1KH_PUSH_DATA_LEN 88 + +struct ft_r0kh_r1kh_pull_frame { + u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */ + u8 packet_type; /* FT_PACKET_R0KH_R1KH_PULL */ + le16 data_length; /* little endian length of data (44) */ + u8 ap_address[ETH_ALEN]; + + u8 nonce[16]; + u8 pmk_r0_name[WPA_PMK_NAME_LEN]; + u8 r1kh_id[FT_R1KH_ID_LEN]; + u8 s1kh_id[ETH_ALEN]; + u8 pad[4]; /* 8-octet boundary for AES key wrap */ + u8 key_wrap_extra[8]; +} STRUCT_PACKED; + +struct ft_r0kh_r1kh_resp_frame { + u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */ + u8 packet_type; /* FT_PACKET_R0KH_R1KH_RESP */ + le16 data_length; /* little endian length of data (76) */ + u8 ap_address[ETH_ALEN]; + + u8 nonce[16]; /* copied from pull */ + u8 r1kh_id[FT_R1KH_ID_LEN]; /* copied from pull */ + u8 s1kh_id[ETH_ALEN]; /* copied from pull */ + u8 pmk_r1[PMK_LEN]; + u8 pmk_r1_name[WPA_PMK_NAME_LEN]; + le16 pairwise; + u8 pad[2]; /* 8-octet boundary for AES key wrap */ + u8 key_wrap_extra[8]; +} STRUCT_PACKED; + +struct ft_r0kh_r1kh_push_frame { + u8 frame_type; /* RSN_REMOTE_FRAME_TYPE_FT_RRB */ + u8 packet_type; /* FT_PACKET_R0KH_R1KH_PUSH */ + le16 data_length; /* little endian length of data (88) */ + u8 ap_address[ETH_ALEN]; + + /* Encrypted with AES key-wrap */ + u8 timestamp[4]; /* current time in seconds since unix epoch, little + * endian */ + u8 r1kh_id[FT_R1KH_ID_LEN]; + u8 s1kh_id[ETH_ALEN]; + u8 pmk_r0_name[WPA_PMK_NAME_LEN]; + u8 pmk_r1[PMK_LEN]; + u8 pmk_r1_name[WPA_PMK_NAME_LEN]; + le16 pairwise; + u8 pad[6]; /* 8-octet boundary for AES key wrap */ + u8 key_wrap_extra[8]; +} STRUCT_PACKED; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif /* _MSC_VER */ + + +/* per STA state machine data */ + +struct wpa_authenticator; +struct wpa_state_machine; +struct rsn_pmksa_cache_entry; +struct eapol_state_machine; + + +struct ft_remote_r0kh { + struct ft_remote_r0kh *next; + u8 addr[ETH_ALEN]; + u8 id[FT_R0KH_ID_MAX_LEN]; + size_t id_len; + u8 key[16]; +}; + + +struct ft_remote_r1kh { + struct ft_remote_r1kh *next; + u8 addr[ETH_ALEN]; + u8 id[FT_R1KH_ID_LEN]; + u8 key[16]; +}; + + +struct wpa_auth_config { + int wpa; + int wpa_key_mgmt; + int wpa_pairwise; + int wpa_group; + int wpa_group_rekey; + int wpa_strict_rekey; + int wpa_gmk_rekey; + int wpa_ptk_rekey; + int rsn_pairwise; + int rsn_preauth; + int eapol_version; + int peerkey; + int wmm_enabled; + int wmm_uapsd; + int disable_pmksa_caching; + int okc; + int tx_status; +#ifdef CONFIG_IEEE80211W + enum mfp_options ieee80211w; +#endif /* CONFIG_IEEE80211W */ +#ifdef CONFIG_IEEE80211R +#define SSID_LEN 32 + u8 ssid[SSID_LEN]; + size_t ssid_len; + u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN]; + u8 r0_key_holder[FT_R0KH_ID_MAX_LEN]; + size_t r0_key_holder_len; + u8 r1_key_holder[FT_R1KH_ID_LEN]; + u32 r0_key_lifetime; + u32 reassociation_deadline; + struct ft_remote_r0kh *r0kh_list; + struct ft_remote_r1kh *r1kh_list; + int pmk_r1_push; + int ft_over_ds; +#endif /* CONFIG_IEEE80211R */ + int disable_gtk; + int ap_mlme; +}; + +typedef enum { + LOGGER_DEBUG, LOGGER_INFO, LOGGER_WARNING +} logger_level; + +typedef enum { + WPA_EAPOL_portEnabled, WPA_EAPOL_portValid, WPA_EAPOL_authorized, + WPA_EAPOL_portControl_Auto, WPA_EAPOL_keyRun, WPA_EAPOL_keyAvailable, + WPA_EAPOL_keyDone, WPA_EAPOL_inc_EapolFramesTx +} wpa_eapol_variable; + +struct wpa_auth_callbacks { + void *ctx; + void (*logger)(void *ctx, const u8 *addr, logger_level level, + const char *txt); + void (*disconnect)(void *ctx, const u8 *addr, u16 reason); + int (*mic_failure_report)(void *ctx, const u8 *addr); + void (*set_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var, + int value); + int (*get_eapol)(void *ctx, const u8 *addr, wpa_eapol_variable var); + const u8 * (*get_psk)(void *ctx, const u8 *addr, const u8 *prev_psk); + int (*get_msk)(void *ctx, const u8 *addr, u8 *msk, size_t *len); + int (*set_key)(void *ctx, int vlan_id, enum wpa_alg alg, + const u8 *addr, int idx, u8 *key, size_t key_len); + int (*get_seqnum)(void *ctx, const u8 *addr, int idx, u8 *seq); + int (*send_eapol)(void *ctx, const u8 *addr, const u8 *data, + size_t data_len, int encrypt); + int (*for_each_sta)(void *ctx, int (*cb)(struct wpa_state_machine *sm, + void *ctx), void *cb_ctx); + int (*for_each_auth)(void *ctx, int (*cb)(struct wpa_authenticator *a, + void *ctx), void *cb_ctx); + int (*send_ether)(void *ctx, const u8 *dst, u16 proto, const u8 *data, + size_t data_len); +#ifdef CONFIG_IEEE80211R + struct wpa_state_machine * (*add_sta)(void *ctx, const u8 *sta_addr); + int (*send_ft_action)(void *ctx, const u8 *dst, + const u8 *data, size_t data_len); + int (*add_tspec)(void *ctx, const u8 *sta_addr, u8 *tspec_ie, + size_t tspec_ielen); +#endif /* CONFIG_IEEE80211R */ +}; + +struct wpa_authenticator * wpa_init(const u8 *addr, + struct wpa_auth_config *conf, + struct wpa_auth_callbacks *cb); +int wpa_init_keys(struct wpa_authenticator *wpa_auth); +void wpa_deinit(struct wpa_authenticator *wpa_auth); +int wpa_reconfig(struct wpa_authenticator *wpa_auth, + struct wpa_auth_config *conf); + +enum { + WPA_IE_OK, WPA_INVALID_IE, WPA_INVALID_GROUP, WPA_INVALID_PAIRWISE, + WPA_INVALID_AKMP, WPA_NOT_ENABLED, WPA_ALLOC_FAIL, + WPA_MGMT_FRAME_PROTECTION_VIOLATION, WPA_INVALID_MGMT_GROUP_CIPHER, + WPA_INVALID_MDIE, WPA_INVALID_PROTO +}; + +int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, + const u8 *wpa_ie, size_t wpa_ie_len/*, + const u8 *mdie, size_t mdie_len*/); +int wpa_auth_uses_mfp(struct wpa_state_machine *sm); +struct wpa_state_machine * +wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr); +int wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm); +void wpa_auth_sta_no_wpa(struct wpa_state_machine *sm); +void wpa_auth_sta_deinit(struct wpa_state_machine *sm); +void wpa_receive(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, + u8 *data, size_t data_len); +typedef enum { + WPA_AUTH, WPA_ASSOC, WPA_DISASSOC, WPA_DEAUTH, WPA_REAUTH, + WPA_REAUTH_EAPOL, WPA_ASSOC_FT +} wpa_event; +void wpa_remove_ptk(struct wpa_state_machine *sm); +int wpa_auth_sm_event(struct wpa_state_machine *sm, wpa_event event); +void wpa_auth_sm_notify(struct wpa_state_machine *sm); +void wpa_gtk_rekey(struct wpa_authenticator *wpa_auth); +int wpa_get_mib(struct wpa_authenticator *wpa_auth, char *buf, size_t buflen); +int wpa_get_mib_sta(struct wpa_state_machine *sm, char *buf, size_t buflen); +void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth); +int wpa_auth_pairwise_set(struct wpa_state_machine *sm); +int wpa_auth_get_pairwise(struct wpa_state_machine *sm); +int wpa_auth_sta_key_mgmt(struct wpa_state_machine *sm); +int wpa_auth_sta_wpa_version(struct wpa_state_machine *sm); +int wpa_auth_sta_clear_pmksa(struct wpa_state_machine *sm, + struct rsn_pmksa_cache_entry *entry); +struct rsn_pmksa_cache_entry * +wpa_auth_sta_get_pmksa(struct wpa_state_machine *sm); +void wpa_auth_sta_local_mic_failure_report(struct wpa_state_machine *sm); +const u8 * wpa_auth_get_wpa_ie(struct wpa_authenticator *wpa_auth, + size_t *len); +int wpa_auth_pmksa_add(struct wpa_state_machine *sm, const u8 *pmk, + int session_timeout, struct eapol_state_machine *eapol); +int wpa_auth_pmksa_add_preauth(struct wpa_authenticator *wpa_auth, + const u8 *pmk, size_t len, const u8 *sta_addr, + int session_timeout, + struct eapol_state_machine *eapol); +int wpa_auth_sta_set_vlan(struct wpa_state_machine *sm, int vlan_id); +void wpa_auth_eapol_key_tx_status(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, int ack); + +#ifdef CONFIG_IEEE80211R +u8 * wpa_sm_write_assoc_resp_ies(struct wpa_state_machine *sm, u8 *pos, + size_t max_len, int auth_alg, + const u8 *req_ies, size_t req_ies_len); +void wpa_ft_process_auth(struct wpa_state_machine *sm, const u8 *bssid, + u16 auth_transaction, const u8 *ies, size_t ies_len, + void (*cb)(void *ctx, const u8 *dst, const u8 *bssid, + u16 auth_transaction, u16 resp, + const u8 *ies, size_t ies_len), + void *ctx); +u16 wpa_ft_validate_reassoc(struct wpa_state_machine *sm, const u8 *ies, + size_t ies_len); +int wpa_ft_action_rx(struct wpa_state_machine *sm, const u8 *data, size_t len); +int wpa_ft_rrb_rx(struct wpa_authenticator *wpa_auth, const u8 *src_addr, + const u8 *data, size_t data_len); +void wpa_ft_push_pmk_r1(struct wpa_authenticator *wpa_auth, const u8 *addr); +#endif /* CONFIG_IEEE80211R */ + +void wpa_wnmsleep_rekey_gtk(struct wpa_state_machine *sm); +void wpa_set_wnmsleep(struct wpa_state_machine *sm, int flag); +int wpa_wnmsleep_gtk_subelem(struct wpa_state_machine *sm, u8 *pos); +int wpa_wnmsleep_igtk_subelem(struct wpa_state_machine *sm, u8 *pos); + +int wpa_auth_uses_sae(struct wpa_state_machine *sm); + +#endif /* WPA_AUTH_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa_auth_i.h b/components/wpa_supplicant/include/wpa/wpa_auth_i.h new file mode 100644 index 000000000..53ad8ea94 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_auth_i.h @@ -0,0 +1,234 @@ +/* + * hostapd - IEEE 802.11i-2004 / WPA Authenticator: Internal definitions + * Copyright (c) 2004-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef WPA_AUTH_I_H +#define WPA_AUTH_I_H + +/* max(dot11RSNAConfigGroupUpdateCount,dot11RSNAConfigPairwiseUpdateCount) */ +#define RSNA_MAX_EAPOL_RETRIES 4 + +struct wpa_group; + +struct wpa_stsl_negotiation { + struct wpa_stsl_negotiation *next; + u8 initiator[ETH_ALEN]; + u8 peer[ETH_ALEN]; +}; + + +struct wpa_state_machine { + struct wpa_authenticator *wpa_auth; + struct wpa_group *group; + + u8 addr[ETH_ALEN]; + + enum { + WPA_PTK_INITIALIZE, WPA_PTK_DISCONNECT, WPA_PTK_DISCONNECTED, + WPA_PTK_AUTHENTICATION, WPA_PTK_AUTHENTICATION2, + WPA_PTK_INITPMK, WPA_PTK_INITPSK, WPA_PTK_PTKSTART, + WPA_PTK_PTKCALCNEGOTIATING, WPA_PTK_PTKCALCNEGOTIATING2, + WPA_PTK_PTKINITNEGOTIATING, WPA_PTK_PTKINITDONE + } wpa_ptk_state; + + enum { + WPA_PTK_GROUP_IDLE = 0, + WPA_PTK_GROUP_REKEYNEGOTIATING, + WPA_PTK_GROUP_REKEYESTABLISHED, + WPA_PTK_GROUP_KEYERROR + } wpa_ptk_group_state; + + Boolean Init; + Boolean DeauthenticationRequest; + Boolean AuthenticationRequest; + Boolean ReAuthenticationRequest; + Boolean Disconnect; + int TimeoutCtr; + int GTimeoutCtr; + Boolean TimeoutEvt; + Boolean EAPOLKeyReceived; + Boolean EAPOLKeyPairwise; + Boolean EAPOLKeyRequest; + Boolean MICVerified; + Boolean GUpdateStationKeys; + u8 ANonce[WPA_NONCE_LEN]; + u8 SNonce[WPA_NONCE_LEN]; + u8 PMK[PMK_LEN]; + struct wpa_ptk PTK; + Boolean PTK_valid; + Boolean pairwise_set; + int keycount; + Boolean Pair; + struct wpa_key_replay_counter { + u8 counter[WPA_REPLAY_COUNTER_LEN]; + Boolean valid; + } key_replay[RSNA_MAX_EAPOL_RETRIES], + prev_key_replay[RSNA_MAX_EAPOL_RETRIES]; + Boolean PInitAKeys; /* WPA only, not in IEEE 802.11i */ + Boolean PTKRequest; /* not in IEEE 802.11i state machine */ + Boolean has_GTK; + Boolean PtkGroupInit; /* init request for PTK Group state machine */ + + u8 *last_rx_eapol_key; /* starting from IEEE 802.1X header */ + size_t last_rx_eapol_key_len; + + unsigned int changed:1; + unsigned int in_step_loop:1; + unsigned int pending_deinit:1; + unsigned int started:1; + unsigned int mgmt_frame_prot:1; + unsigned int rx_eapol_key_secure:1; + unsigned int update_snonce:1; +#ifdef CONFIG_IEEE80211R + unsigned int ft_completed:1; + unsigned int pmk_r1_name_valid:1; +#endif /* CONFIG_IEEE80211R */ + unsigned int is_wnmsleep:1; + + u8 req_replay_counter[WPA_REPLAY_COUNTER_LEN]; + int req_replay_counter_used; + + u8 *wpa_ie; + size_t wpa_ie_len; + + enum { + WPA_VERSION_NO_WPA = 0 /* WPA not used */, + WPA_VERSION_WPA = 1 /* WPA / IEEE 802.11i/D3.0 */, + WPA_VERSION_WPA2 = 2 /* WPA2 / IEEE 802.11i */ + } wpa; + int pairwise; /* Pairwise cipher suite, WPA_CIPHER_* */ + int wpa_key_mgmt; /* the selected WPA_KEY_MGMT_* */ +// struct rsn_pmksa_cache_entry *pmksa; + +// u32 dot11RSNAStatsTKIPLocalMICFailures; +// u32 dot11RSNAStatsTKIPRemoteMICFailures; + +#ifdef CONFIG_IEEE80211R + u8 xxkey[PMK_LEN]; /* PSK or the second 256 bits of MSK */ + size_t xxkey_len; + u8 pmk_r1_name[WPA_PMK_NAME_LEN]; /* PMKR1Name derived from FT Auth + * Request */ + u8 r0kh_id[FT_R0KH_ID_MAX_LEN]; /* R0KH-ID from FT Auth Request */ + size_t r0kh_id_len; + u8 sup_pmk_r1_name[WPA_PMK_NAME_LEN]; /* PMKR1Name from EAPOL-Key + * message 2/4 */ + u8 *assoc_resp_ftie; +#endif /* CONFIG_IEEE80211R */ + + int pending_1_of_4_timeout; +}; + + +/* per group key state machine data */ +struct wpa_group { + struct wpa_group *next; + int vlan_id; + + Boolean GInit; + int GKeyDoneStations; + Boolean GTKReKey; + int GTK_len; + int GN, GM; + Boolean GTKAuthenticator; + u8 Counter[WPA_NONCE_LEN]; + + enum { + WPA_GROUP_GTK_INIT = 0, + WPA_GROUP_SETKEYS, WPA_GROUP_SETKEYSDONE + } wpa_group_state; + + u8 GMK[WPA_GMK_LEN]; + u8 GTK[2][WPA_GTK_MAX_LEN]; + u8 GNonce[WPA_NONCE_LEN]; + Boolean changed; + Boolean first_sta_seen; + Boolean reject_4way_hs_for_entropy; +#ifdef CONFIG_IEEE80211W + u8 IGTK[2][WPA_IGTK_LEN]; + int GN_igtk, GM_igtk; +#endif /* CONFIG_IEEE80211W */ +}; + + +struct wpa_ft_pmk_cache; + +/* per authenticator data */ +struct wpa_authenticator { + struct wpa_group *group; + +// unsigned int dot11RSNAStatsTKIPRemoteMICFailures; +// u32 dot11RSNAAuthenticationSuiteSelected; +// u32 dot11RSNAPairwiseCipherSelected; +// u32 dot11RSNAGroupCipherSelected; +// u8 dot11RSNAPMKIDUsed[PMKID_LEN]; +// u32 dot11RSNAAuthenticationSuiteRequested; /* FIX: update */ +// u32 dot11RSNAPairwiseCipherRequested; /* FIX: update */ +// u32 dot11RSNAGroupCipherRequested; /* FIX: update */ +// unsigned int dot11RSNATKIPCounterMeasuresInvoked; +// unsigned int dot11RSNA4WayHandshakeFailures; + +// struct wpa_stsl_negotiation *stsl_negotiations; + + struct wpa_auth_config conf; +// struct wpa_auth_callbacks cb; + + u8 *wpa_ie; + size_t wpa_ie_len; + + u8 addr[ETH_ALEN]; + +// struct rsn_pmksa_cache *pmksa; +// struct wpa_ft_pmk_cache *ft_pmk_cache; +}; + + +int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len, + const u8 *pmkid); +#if 0 +void wpa_auth_logger(struct wpa_authenticator *wpa_auth, const u8 *addr, + logger_level level, const char *txt); +void wpa_auth_vlogger(struct wpa_authenticator *wpa_auth, const u8 *addr, + logger_level level, const char *fmt, ...); +#endif +void __wpa_send_eapol(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, int key_info, + const u8 *key_rsc, const u8 *nonce, + const u8 *kde, size_t kde_len, + int keyidx, int encr, int force_version); +int wpa_auth_for_each_sta(struct wpa_authenticator *wpa_auth, + int (*cb)(struct wpa_state_machine *sm, void *ctx), + void *cb_ctx); +int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth, + int (*cb)(struct wpa_authenticator *a, void *ctx), + void *cb_ctx); + +#ifdef CONFIG_PEERKEY +int wpa_stsl_remove(struct wpa_authenticator *wpa_auth, + struct wpa_stsl_negotiation *neg); +void wpa_smk_error(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, struct wpa_eapol_key *key); +void wpa_smk_m1(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, struct wpa_eapol_key *key); +void wpa_smk_m3(struct wpa_authenticator *wpa_auth, + struct wpa_state_machine *sm, struct wpa_eapol_key *key); +#endif /* CONFIG_PEERKEY */ + +#ifdef CONFIG_IEEE80211R +int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len); +int wpa_write_ftie(struct wpa_auth_config *conf, const u8 *r0kh_id, + size_t r0kh_id_len, + const u8 *anonce, const u8 *snonce, + u8 *buf, size_t len, const u8 *subelem, + size_t subelem_len); +int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, const u8 *pmk, + struct wpa_ptk *ptk, size_t ptk_len); +struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void); +void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache); +void wpa_ft_install_ptk(struct wpa_state_machine *sm); +#endif /* CONFIG_IEEE80211R */ + +#endif /* WPA_AUTH_I_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa_auth_ie.h b/components/wpa_supplicant/include/wpa/wpa_auth_ie.h new file mode 100644 index 000000000..499913951 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_auth_ie.h @@ -0,0 +1,50 @@ +/* + * hostapd - WPA/RSN IE and KDE definitions + * Copyright (c) 2004-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef WPA_AUTH_IE_H +#define WPA_AUTH_IE_H + +struct wpa_eapol_ie_parse { + const u8 *wpa_ie; + size_t wpa_ie_len; + const u8 *rsn_ie; + size_t rsn_ie_len; + const u8 *pmkid; + const u8 *gtk; + size_t gtk_len; + const u8 *mac_addr; + size_t mac_addr_len; +#ifdef CONFIG_PEERKEY + const u8 *smk; + size_t smk_len; + const u8 *nonce; + size_t nonce_len; + const u8 *lifetime; + size_t lifetime_len; + const u8 *error; + size_t error_len; +#endif /* CONFIG_PEERKEY */ +#ifdef CONFIG_IEEE80211W + const u8 *igtk; + size_t igtk_len; +#endif /* CONFIG_IEEE80211W */ +#ifdef CONFIG_IEEE80211R + const u8 *mdie; + size_t mdie_len; + const u8 *ftie; + size_t ftie_len; +#endif /* CONFIG_IEEE80211R */ +}; + +int wpa_parse_kde_ies(const u8 *buf, size_t len, + struct wpa_eapol_ie_parse *ie); +u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len, + const u8 *data2, size_t data2_len); +int wpa_auth_gen_wpa_ie(struct wpa_authenticator *wpa_auth); + +#endif /* WPA_AUTH_IE_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa_common.h b/components/wpa_supplicant/include/wpa/wpa_common.h new file mode 100644 index 000000000..480cf0e27 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_common.h @@ -0,0 +1,332 @@ +/* + * WPA definitions shared between hostapd and wpa_supplicant + * Copyright (c) 2002-2008, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "os.h" +#ifndef WPA_COMMON_H +#define WPA_COMMON_H + +#define WPA_MAX_SSID_LEN 32 + +/* IEEE 802.11i */ +#define PMKID_LEN 16 +#define PMK_LEN 32 +#define WPA_REPLAY_COUNTER_LEN 8 +#define WPA_NONCE_LEN 32 +#define WPA_KEY_RSC_LEN 8 +#define WPA_GMK_LEN 32 +#define WPA_GTK_MAX_LEN 32 + +#define WPA_SELECTOR_LEN 4 +#define WPA_VERSION 1 +#define RSN_SELECTOR_LEN 4 +#define RSN_VERSION 1 + +#define RSN_SELECTOR(a, b, c, d) \ + ((((u32) (a)) << 24) | (((u32) (b)) << 16) | (((u32) (c)) << 8) | \ + (u32) (d)) + +#define WPA_AUTH_KEY_MGMT_NONE RSN_SELECTOR(0x00, 0x50, 0xf2, 0) +#define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X RSN_SELECTOR(0x00, 0x50, 0xf2, 1) +#define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X RSN_SELECTOR(0x00, 0x50, 0xf2, 2) +#define WPA_CIPHER_SUITE_NONE RSN_SELECTOR(0x00, 0x50, 0xf2, 0) +#define WPA_CIPHER_SUITE_WEP40 RSN_SELECTOR(0x00, 0x50, 0xf2, 1) +#define WPA_CIPHER_SUITE_TKIP RSN_SELECTOR(0x00, 0x50, 0xf2, 2) +#if 0 +#define WPA_CIPHER_SUITE_WRAP RSN_SELECTOR(0x00, 0x50, 0xf2, 3) +#endif +#define WPA_CIPHER_SUITE_CCMP RSN_SELECTOR(0x00, 0x50, 0xf2, 4) +#define WPA_CIPHER_SUITE_WEP104 RSN_SELECTOR(0x00, 0x50, 0xf2, 5) + + +#define RSN_AUTH_KEY_MGMT_UNSPEC_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 1) +#define RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 2) +#ifdef CONFIG_IEEE80211R +#define RSN_AUTH_KEY_MGMT_FT_802_1X RSN_SELECTOR(0x00, 0x0f, 0xac, 3) +#define RSN_AUTH_KEY_MGMT_FT_PSK RSN_SELECTOR(0x00, 0x0f, 0xac, 4) +#endif /* CONFIG_IEEE80211R */ +#define RSN_AUTH_KEY_MGMT_802_1X_SHA256 RSN_SELECTOR(0x00, 0x0f, 0xac, 5) +#define RSN_AUTH_KEY_MGMT_PSK_SHA256 RSN_SELECTOR(0x00, 0x0f, 0xac, 6) + +#define RSN_CIPHER_SUITE_NONE RSN_SELECTOR(0x00, 0x0f, 0xac, 0) +#define RSN_CIPHER_SUITE_WEP40 RSN_SELECTOR(0x00, 0x0f, 0xac, 1) +#define RSN_CIPHER_SUITE_TKIP RSN_SELECTOR(0x00, 0x0f, 0xac, 2) +#if 0 +#define RSN_CIPHER_SUITE_WRAP RSN_SELECTOR(0x00, 0x0f, 0xac, 3) +#endif +#define RSN_CIPHER_SUITE_CCMP RSN_SELECTOR(0x00, 0x0f, 0xac, 4) +#define RSN_CIPHER_SUITE_WEP104 RSN_SELECTOR(0x00, 0x0f, 0xac, 5) +#ifdef CONFIG_IEEE80211W +#define RSN_CIPHER_SUITE_AES_128_CMAC RSN_SELECTOR(0x00, 0x0f, 0xac, 6) +#endif /* CONFIG_IEEE80211W */ +#define RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED RSN_SELECTOR(0x00, 0x0f, 0xac, 7) +#define RSN_CIPHER_SUITE_GCMP RSN_SELECTOR(0x00, 0x0f, 0xac, 8) + +/* EAPOL-Key Key Data Encapsulation + * GroupKey and PeerKey require encryption, otherwise, encryption is optional. + */ +#define RSN_KEY_DATA_GROUPKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 1) +#if 0 +#define RSN_KEY_DATA_STAKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 2) +#endif +#define RSN_KEY_DATA_MAC_ADDR RSN_SELECTOR(0x00, 0x0f, 0xac, 3) +#define RSN_KEY_DATA_PMKID RSN_SELECTOR(0x00, 0x0f, 0xac, 4) +#ifdef CONFIG_PEERKEY +#define RSN_KEY_DATA_SMK RSN_SELECTOR(0x00, 0x0f, 0xac, 5) +#define RSN_KEY_DATA_NONCE RSN_SELECTOR(0x00, 0x0f, 0xac, 6) +#define RSN_KEY_DATA_LIFETIME RSN_SELECTOR(0x00, 0x0f, 0xac, 7) +#define RSN_KEY_DATA_ERROR RSN_SELECTOR(0x00, 0x0f, 0xac, 8) +#endif /* CONFIG_PEERKEY */ +#ifdef CONFIG_IEEE80211W +#define RSN_KEY_DATA_IGTK RSN_SELECTOR(0x00, 0x0f, 0xac, 9) +#endif /* CONFIG_IEEE80211W */ + +#define WPA_OUI_TYPE RSN_SELECTOR(0x00, 0x50, 0xf2, 1) + +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) +#define RSN_SELECTOR_GET(a) WPA_GET_BE32((const u8 *) (a)) + +#define RSN_NUM_REPLAY_COUNTERS_1 0 +#define RSN_NUM_REPLAY_COUNTERS_2 1 +#define RSN_NUM_REPLAY_COUNTERS_4 2 +#define RSN_NUM_REPLAY_COUNTERS_16 3 + +#ifdef _MSC_VER +#pragma pack(push, 1) +#endif /* _MSC_VER */ + +#ifdef CONFIG_IEEE80211W +#define WPA_IGTK_LEN 16 +#endif /* CONFIG_IEEE80211W */ + + +/* IEEE 802.11, 7.3.2.25.3 RSN Capabilities */ +#define WPA_CAPABILITY_PREAUTH BIT(0) +#define WPA_CAPABILITY_NO_PAIRWISE BIT(1) +/* B2-B3: PTKSA Replay Counter */ +/* B4-B5: GTKSA Replay Counter */ +#define WPA_CAPABILITY_MFPR BIT(6) +#define WPA_CAPABILITY_MFPC BIT(7) +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) + + +/* IEEE 802.11r */ +#define MOBILITY_DOMAIN_ID_LEN 2 +#define FT_R0KH_ID_MAX_LEN 48 +#define FT_R1KH_ID_LEN 6 +#define WPA_PMK_NAME_LEN 16 + + +/* IEEE 802.11, 8.5.2 EAPOL-Key frames */ +#define WPA_KEY_INFO_TYPE_MASK ((u16) (BIT(0) | BIT(1) | BIT(2))) +#define WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 BIT(0) +#define WPA_KEY_INFO_TYPE_HMAC_SHA1_AES BIT(1) +#define WPA_KEY_INFO_TYPE_AES_128_CMAC 3 +#define WPA_KEY_INFO_KEY_TYPE BIT(3) /* 1 = Pairwise, 0 = Group key */ +/* bit4..5 is used in WPA, but is reserved in IEEE 802.11i/RSN */ +#define WPA_KEY_INFO_KEY_INDEX_MASK (BIT(4) | BIT(5)) +#define WPA_KEY_INFO_KEY_INDEX_SHIFT 4 +#define WPA_KEY_INFO_INSTALL BIT(6) /* pairwise */ +#define WPA_KEY_INFO_TXRX BIT(6) /* group */ +#define WPA_KEY_INFO_ACK BIT(7) +#define WPA_KEY_INFO_MIC BIT(8) +#define WPA_KEY_INFO_SECURE BIT(9) +#define WPA_KEY_INFO_ERROR BIT(10) +#define WPA_KEY_INFO_REQUEST BIT(11) +#define WPA_KEY_INFO_ENCR_KEY_DATA BIT(12) /* IEEE 802.11i/RSN only */ +#define WPA_KEY_INFO_SMK_MESSAGE BIT(13) + + +struct wpa_eapol_key { + u8 type; + /* Note: key_info, key_length, and key_data_length are unaligned */ + u8 key_info[2]; /* big endian */ + u8 key_length[2]; /* big endian */ + u8 replay_counter[WPA_REPLAY_COUNTER_LEN]; + u8 key_nonce[WPA_NONCE_LEN]; + u8 key_iv[16]; + u8 key_rsc[WPA_KEY_RSC_LEN]; + u8 key_id[8]; /* Reserved in IEEE 802.11i/RSN */ + u8 key_mic[16]; + u8 key_data_length[2]; /* big endian */ + /* followed by key_data_length bytes of key_data */ +} STRUCT_PACKED; + +/** + * struct wpa_ptk - WPA Pairwise Transient Key + * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy + */ +struct wpa_ptk { + u8 kck[16]; /* EAPOL-Key Key Confirmation Key (KCK) */ + u8 kek[16]; /* EAPOL-Key Key Encryption Key (KEK) */ + u8 tk1[16]; /* Temporal Key 1 (TK1) */ + union { + u8 tk2[16]; /* Temporal Key 2 (TK2) */ + struct { + u8 tx_mic_key[8]; + u8 rx_mic_key[8]; + } auth; + } u; +} STRUCT_PACKED; + +struct wpa_gtk_data { + enum wpa_alg alg; + int tx, key_rsc_len, keyidx; + u8 gtk[32]; + int gtk_len; +}; + + +/* WPA IE version 1 + * 00-50-f2:1 (OUI:OUI type) + * 0x01 0x00 (version; little endian) + * (all following fields are optional:) + * Group Suite Selector (4 octets) (default: TKIP) + * Pairwise Suite Count (2 octets, little endian) (default: 1) + * Pairwise Suite List (4 * n octets) (default: TKIP) + * Authenticated Key Management Suite Count (2 octets, little endian) + * (default: 1) + * Authenticated Key Management Suite List (4 * n octets) + * (default: unspec 802.1X) + * WPA Capabilities (2 octets, little endian) (default: 0) + */ + +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +} STRUCT_PACKED; + + +/* 1/4: PMKID + * 2/4: RSN IE + * 3/4: one or two RSN IEs + GTK IE (encrypted) + * 4/4: empty + * 1/2: GTK IE (encrypted) + * 2/2: empty + */ + +/* RSN IE version 1 + * 0x01 0x00 (version; little endian) + * (all following fields are optional:) + * Group Suite Selector (4 octets) (default: CCMP) + * Pairwise Suite Count (2 octets, little endian) (default: 1) + * Pairwise Suite List (4 * n octets) (default: CCMP) + * Authenticated Key Management Suite Count (2 octets, little endian) + * (default: 1) + * Authenticated Key Management Suite List (4 * n octets) + * (default: unspec 802.1X) + * RSN Capabilities (2 octets, little endian) (default: 0) + * PMKID Count (2 octets) (default: 0) + * PMKID List (16 * n octets) + * Management Group Cipher Suite (4 octets) (default: AES-128-CMAC) + */ + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +} STRUCT_PACKED; + + +#ifdef CONFIG_PEERKEY +enum { + STK_MUI_4WAY_STA_AP = 1, + STK_MUI_4WAY_STAT_STA = 2, + STK_MUI_GTK = 3, + STK_MUI_SMK = 4 +}; + +enum { + STK_ERR_STA_NR = 1, + STK_ERR_STA_NRSN = 2, + STK_ERR_CPHR_NS = 3, + STK_ERR_NO_STSL = 4 +}; +#endif /* CONFIG_PEERKEY */ + +struct rsn_error_kde { + be16 mui; + be16 error_type; +} STRUCT_PACKED; + +#ifdef CONFIG_IEEE80211W +struct wpa_igtk_kde { + u8 keyid[2]; + u8 pn[6]; + u8 igtk[WPA_IGTK_LEN]; +} STRUCT_PACKED; +#endif /* CONFIG_IEEE80211W */ + +#ifdef CONFIG_IEEE80211R +struct rsn_mdie { + u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN]; + u8 ft_capab; +} STRUCT_PACKED; + +#define RSN_FT_CAPAB_FT_OVER_DS BIT(0) +#define RSN_FT_CAPAB_FT_RESOURCE_REQ_SUPP BIT(1) + +struct rsn_ftie { + u8 mic_control[2]; + u8 mic[16]; + u8 anonce[WPA_NONCE_LEN]; + u8 snonce[WPA_NONCE_LEN]; + /* followed by optional parameters */ +} STRUCT_PACKED; + +#define FTIE_SUBELEM_R1KH_ID 1 +#define FTIE_SUBELEM_GTK 2 +#define FTIE_SUBELEM_R0KH_ID 3 +#define FTIE_SUBELEM_IGTK 4 + +struct rsn_rdie { + u8 id; + u8 descr_count; + le16 status_code; +} STRUCT_PACKED; + +#endif /* CONFIG_IEEE80211R */ + +struct wpa_ie_data { + int proto; + int pairwise_cipher; + int group_cipher; + int key_mgmt; + int capabilities; + size_t num_pmkid; + const u8 *pmkid; + int mgmt_group_cipher; +}; + +const char * wpa_cipher_txt(int cipher); + +int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len, + struct wpa_ie_data *data); + +int wpa_eapol_key_mic(const u8 *key, int ver, const u8 *buf, size_t len, + u8 *mic); +int wpa_compare_rsn_ie(int ft_initial_assoc, + const u8 *ie1, size_t ie1len, + const u8 *ie2, size_t ie2len); + +void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label, + const u8 *addr1, const u8 *addr2, + const u8 *nonce1, const u8 *nonce2, + u8 *ptk, size_t ptk_len, int use_sha256); + +void rsn_pmkid(const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa, + u8 *pmkid, int use_sha256); + +#endif /* WPA_COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa_debug.h b/components/wpa_supplicant/include/wpa/wpa_debug.h new file mode 100644 index 000000000..b78a657e0 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_debug.h @@ -0,0 +1,193 @@ +/* + * wpa_supplicant/hostapd / Debug prints + * Copyright (c) 2002-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPA_DEBUG_H +#define WPA_DEBUG_H + + +enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR }; + +/** EAP authentication completed successfully */ +#define WPA_EVENT_EAP_SUCCESS "CTRL-EVENT-EAP-SUCCESS " + +int wpa_debug_open_file(const char *path); +void wpa_debug_close_file(void); + +/** + * wpa_debug_printf_timestamp - Print timestamp for debug output + * + * This function prints a timestamp in seconds_from_1970.microsoconds + * format if debug output has been configured to include timestamps in debug + * messages. + */ +void wpa_debug_print_timestamp(void); + +/** + * wpa_printf - conditional printf + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. + * + * Note: New line '\n' is added to the end of the text when printing to stdout. + */ +//#define DEBUG_PRINT +//#define MSG_PRINT + +/** + * wpa_hexdump - conditional hex dump + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump. + */ +#ifdef DEBUG_PRINT +#define wpa_printf(level,fmt, args...) ets_printf(fmt,## args) + +static inline void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len) +{ + +} + +static inline void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, size_t len) +{ +} + + +void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len); + +static inline void wpa_hexdump_buf(int level, const char *title, + const struct wpabuf *buf) +{ + wpa_hexdump(level, title, wpabuf_head(buf), wpabuf_len(buf)); +} + +/** + * wpa_hexdump_key - conditional hex dump, hide keys + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump. This works + * like wpa_hexdump(), but by default, does not include secret keys (passwords, + * etc.) in debug output. + */ +void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len); + + +static inline void wpa_hexdump_buf_key(int level, const char *title, + const struct wpabuf *buf) +{ + wpa_hexdump_key(level, title, wpabuf_head(buf), wpabuf_len(buf)); +} + +/** + * wpa_hexdump_ascii - conditional hex dump + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump with both + * the hex numbers and ASCII characters (for printable range) are shown. 16 + * bytes per line will be shown. + */ +void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, + size_t len); + +/** + * wpa_hexdump_ascii_key - conditional hex dump, hide keys + * @level: priority level (MSG_*) of the message + * @title: title of for the message + * @buf: data buffer to be dumped + * @len: length of the buf + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. The contents of buf is printed out has hex dump with both + * the hex numbers and ASCII characters (for printable range) are shown. 16 + * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by + * default, does not include secret keys (passwords, etc.) in debug output. + */ +void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, + size_t len); +#else +#define wpa_printf(level,fmt, args...) +#define wpa_hexdump(...) +#define wpa_hexdump_buf(...) +#define wpa_hexdump_key(...) +#define wpa_hexdump_buf_key(...) +#define wpa_hexdump_ascii(...) +#define wpa_hexdump_ascii_key(...) +#endif + +#define wpa_auth_logger +#define wpa_auth_vlogger + +/** + * wpa_msg - Conditional printf for default target and ctrl_iface monitors + * @ctx: Pointer to context data; this is the ctx variable registered + * with struct wpa_driver_ops::init() + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. The + * output may be directed to stdout, stderr, and/or syslog based on + * configuration. This function is like wpa_printf(), but it also sends the + * same message to all attached ctrl_iface monitors. + * + * Note: New line '\n' is added to the end of the text when printing to stdout. + */ +void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4); + +/** + * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors + * @ctx: Pointer to context data; this is the ctx variable registered + * with struct wpa_driver_ops::init() + * @level: priority level (MSG_*) of the message + * @fmt: printf format string, followed by optional arguments + * + * This function is used to print conditional debugging and error messages. + * This function is like wpa_msg(), but it sends the output only to the + * attached ctrl_iface monitors. In other words, it can be used for frequent + * events that do not need to be sent to syslog. + */ +void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...) +PRINTF_FORMAT(3, 4); + +typedef void (*wpa_msg_cb_func)(void *ctx, int level, const char *txt, + size_t len); + +typedef void (*eloop_timeout_handler)(void *eloop_data, void *user_ctx); + +int eloop_cancel_timeout(eloop_timeout_handler handler, + void *eloop_data, void *user_data); + +int eloop_register_timeout(unsigned int secs, unsigned int usecs, + eloop_timeout_handler handler, + void *eloop_data, void *user_data); + + +#endif /* WPA_DEBUG_H */ diff --git a/components/wpa_supplicant/include/wpa/wpa_i.h b/components/wpa_supplicant/include/wpa/wpa_i.h new file mode 100644 index 000000000..a43c33d33 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_i.h @@ -0,0 +1,89 @@ +/* + * Internal WPA/RSN supplicant state machine definitions + * Copyright (c) 2004-2010, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPA_I_H +#define WPA_I_H + +/** + * set_key - Configure encryption key + * @ifname: Interface name (for multi-SSID/VLAN support) + * @priv: private driver interface data + * @alg: encryption algorithm (%WPA_ALG_NONE, %WPA_ALG_WEP, + * %WPA_ALG_TKIP, %WPA_ALG_CCMP, %WPA_ALG_IGTK, %WPA_ALG_PMK); + * %WPA_ALG_NONE clears the key. + * @addr: address of the peer STA or ff:ff:ff:ff:ff:ff for + * broadcast/default keys + * @key_idx: key index (0..3), usually 0 for unicast keys; 0..4095 for + * IGTK + * @set_tx: configure this key as the default Tx key (only used when + * driver does not support separate unicast/individual key + * @seq: sequence number/packet number, seq_len octets, the next + * packet number to be used for in replay protection; configured + * for Rx keys (in most cases, this is only used with broadcast + * keys and set to zero for unicast keys) + * @seq_len: length of the seq, depends on the algorithm: + * TKIP: 6 octets, CCMP: 6 octets, IGTK: 6 octets + * @key: key buffer; TKIP: 16-byte temporal key, 8-byte Tx Mic key, + * 8-byte Rx Mic Key + * @key_len: length of the key buffer in octets (WEP: 5 or 13, + * TKIP: 32, CCMP: 16, IGTK: 16) + * + * Returns: 0 on success, -1 on failure + * + * Configure the given key for the kernel driver. If the driver + * supports separate individual keys (4 default keys + 1 individual), + * addr can be used to determine whether the key is default or + * individual. If only 4 keys are supported, the default key with key + * index 0 is used as the individual key. STA must be configured to use + * it as the default Tx key (set_tx is set) and accept Rx for all the + * key indexes. In most cases, WPA uses only key indexes 1 and 2 for + * broadcast keys, so key index 0 is available for this kind of + * configuration. + * + * Please note that TKIP keys include separate TX and RX MIC keys and + * some drivers may expect them in different order than wpa_supplicant + * is using. If the TX/RX keys are swapped, all TKIP encrypted packets + * will tricker Michael MIC errors. This can be fixed by changing the + * order of MIC keys by swapping te bytes 16..23 and 24..31 of the key + * in driver_*.c set_key() implementation, see driver_ndis.c for an + * example on how this can be done. + */ + +typedef void (* WPA_SEND_FUNC)(struct pbuf *pb); + +typedef void (* WPA_SET_ASSOC_IE)(uint8 proto, u8 *assoc_buf, u32 assoc_wpa_ie_len); + +typedef void (*WPA_INSTALL_KEY) (enum wpa_alg alg, uint8 *addr, int key_idx, int set_tx, + uint8 *seq, size_t seq_len, uint8 *key, size_t key_len, int key_entry_valid); + +typedef void (*WPA_DEAUTH)(uint8 reason_code); + +typedef void (*WPA_NEG_COMPLETE)(); + +void wpa_register(char * payload, WPA_SEND_FUNC snd_func, \ + WPA_SET_ASSOC_IE set_assoc_ie_func, \ + WPA_INSTALL_KEY ppinstallkey, \ + WPA_DEAUTH wpa_deauth, \ + WPA_NEG_COMPLETE wpa_neg_complete); + +#include "pp/esf_buf.h" +void eapol_txcb(esf_buf_t *eb); + +void wpa_set_profile(uint32 wpa_proto); + +void wpa_set_bss(char *macddr, char * bssid, uint8 pairwise_cipher, uint8 group_cipher, char *passphrase, u8 *ssid, size_t ssid_len); + +int wpa_sm_rx_eapol(u8 *src_addr, u8 *buf, u32 len); +#endif /* WPA_I_H */ + diff --git a/components/wpa_supplicant/include/wpa/wpa_ie.h b/components/wpa_supplicant/include/wpa/wpa_ie.h new file mode 100644 index 000000000..94518d845 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpa_ie.h @@ -0,0 +1,56 @@ +/* + * wpa_supplicant - WPA/RSN IE and KDE definitions + * Copyright (c) 2004-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPA_IE_H +#define WPA_IE_H + +struct wpa_eapol_ie_parse { + const u8 *wpa_ie; + size_t wpa_ie_len; + const u8 *rsn_ie; + size_t rsn_ie_len; + const u8 *pmkid; + const u8 *gtk; + size_t gtk_len; + const u8 *mac_addr; + size_t mac_addr_len; +#ifdef CONFIG_PEERKEY + const u8 *smk; + size_t smk_len; + const u8 *nonce; + size_t nonce_len; + const u8 *lifetime; + size_t lifetime_len; + const u8 *error; + size_t error_len; +#endif /* CONFIG_PEERKEY */ +#ifdef CONFIG_IEEE80211W + const u8 *igtk; + size_t igtk_len; +#endif /* CONFIG_IEEE80211W */ +#ifdef CONFIG_IEEE80211R + const u8 *mdie; + size_t mdie_len; + const u8 *ftie; + size_t ftie_len; + const u8 *reassoc_deadline; + const u8 *key_lifetime; +#endif /* CONFIG_IEEE80211R */ +}; + +int wpa_supplicant_parse_ies(const u8 *buf, size_t len, + struct wpa_eapol_ie_parse *ie); +int wpa_gen_wpa_ie(struct wpa_sm *sm, u8 *wpa_ie, size_t wpa_ie_len); + +#endif /* WPA_IE_H */ diff --git a/components/wpa_supplicant/include/wpa/wpabuf.h b/components/wpa_supplicant/include/wpa/wpabuf.h new file mode 100644 index 000000000..cccfcc80e --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpabuf.h @@ -0,0 +1,168 @@ +/* + * Dynamic data buffer + * Copyright (c) 2007-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPABUF_H +#define WPABUF_H + +/* + * Internal data structure for wpabuf. Please do not touch this directly from + * elsewhere. This is only defined in header file to allow inline functions + * from this file to access data. + */ +struct wpabuf { + size_t size; /* total size of the allocated buffer */ + size_t used; /* length of data in the buffer */ + u8 *ext_data; /* pointer to external data; NULL if data follows + * struct wpabuf */ + /* optionally followed by the allocated buffer */ +}; + + +int wpabuf_resize(struct wpabuf **buf, size_t add_len); +struct wpabuf * wpabuf_alloc(size_t len); +struct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len); +struct wpabuf * wpabuf_alloc_copy(const void *data, size_t len); +struct wpabuf * wpabuf_dup(const struct wpabuf *src); +void wpabuf_free(struct wpabuf *buf); +void * wpabuf_put(struct wpabuf *buf, size_t len); +struct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b); +struct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len); +void wpabuf_printf(struct wpabuf *buf, char *fmt, ...) PRINTF_FORMAT(2, 3); + + +/** + * wpabuf_size - Get the currently allocated size of a wpabuf buffer + * @buf: wpabuf buffer + * Returns: Currently allocated size of the buffer + */ +static inline size_t wpabuf_size(const struct wpabuf *buf) +{ + return buf->size; +} + +/** + * wpabuf_len - Get the current length of a wpabuf buffer data + * @buf: wpabuf buffer + * Returns: Currently used length of the buffer + */ +static inline size_t wpabuf_len(const struct wpabuf *buf) +{ + return buf->used; +} + +/** + * wpabuf_tailroom - Get size of available tail room in the end of the buffer + * @buf: wpabuf buffer + * Returns: Tail room (in bytes) of available space in the end of the buffer + */ +static inline size_t wpabuf_tailroom(const struct wpabuf *buf) +{ + return buf->size - buf->used; +} + +/** + * wpabuf_head - Get pointer to the head of the buffer data + * @buf: wpabuf buffer + * Returns: Pointer to the head of the buffer data + */ +static inline const void * wpabuf_head(const struct wpabuf *buf) +{ + if (buf->ext_data) + return buf->ext_data; + return buf + 1; +} + +static inline const u8 * wpabuf_head_u8(const struct wpabuf *buf) +{ + return wpabuf_head(buf); +} + +/** + * wpabuf_mhead - Get modifiable pointer to the head of the buffer data + * @buf: wpabuf buffer + * Returns: Pointer to the head of the buffer data + */ +static inline void * wpabuf_mhead(struct wpabuf *buf) +{ + if (buf->ext_data) + return buf->ext_data; + return buf + 1; +} + +static inline u8 * wpabuf_mhead_u8(struct wpabuf *buf) +{ + return wpabuf_mhead(buf); +} + +static inline void wpabuf_put_u8(struct wpabuf *buf, u8 data) +{ + u8 *pos = wpabuf_put(buf, 1); + *pos = data; +} + +static inline void wpabuf_put_le16(struct wpabuf *buf, u16 data) +{ + u8 *pos = wpabuf_put(buf, 2); + WPA_PUT_LE16(pos, data); +} + +static inline void wpabuf_put_le32(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 4); + WPA_PUT_LE32(pos, data); +} + +static inline void wpabuf_put_be16(struct wpabuf *buf, u16 data) +{ + u8 *pos = wpabuf_put(buf, 2); + WPA_PUT_BE16(pos, data); +} + +static inline void wpabuf_put_be24(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 3); + WPA_PUT_BE24(pos, data); +} + +static inline void wpabuf_put_be32(struct wpabuf *buf, u32 data) +{ + u8 *pos = wpabuf_put(buf, 4); + WPA_PUT_BE32(pos, data); +} + +static inline void wpabuf_put_data(struct wpabuf *buf, const void *data, + size_t len) +{ + if (data) + os_memcpy(wpabuf_put(buf, len), data, len); +} + +static inline void wpabuf_put_buf(struct wpabuf *dst, + const struct wpabuf *src) +{ + wpabuf_put_data(dst, wpabuf_head(src), wpabuf_len(src)); +} + +static inline void wpabuf_set(struct wpabuf *buf, const void *data, size_t len) +{ + buf->ext_data = (u8 *) data; + buf->size = buf->used = len; +} + +static inline void wpabuf_put_str(struct wpabuf *dst, const char *str) +{ + wpabuf_put_data(dst, str, os_strlen(str)); +} + +#endif /* WPABUF_H */ diff --git a/components/wpa_supplicant/include/wpa/wpas_glue.h b/components/wpa_supplicant/include/wpa/wpas_glue.h new file mode 100644 index 000000000..7e254a2d7 --- /dev/null +++ b/components/wpa_supplicant/include/wpa/wpas_glue.h @@ -0,0 +1,31 @@ +/* + * WPA Supplicant - Glue code to setup EAPOL and RSN modules + * Copyright (c) 2003-2008, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef WPAS_GLUE_H +#define WPAS_GLUE_H + +u8 * wpa_sm_alloc_eapol(struct wpa_sm *sm, u8 type, + const void *data, u16 data_len, + size_t *msg_len, void **data_pos); + +int wpa_sm_mlme_setprotection(struct wpa_sm *sm, const u8 *addr, + int protect_type, int key_type); + +void wpa_sm_deauthenticate(struct wpa_sm *sm, uint8 reason_code); + +void wpa_sm_disassociate(struct wpa_sm *sm, int reason_code); + +int wpa_sm_get_beacon_ie(struct wpa_sm *sm); + +#endif /* WPAS_GLUE_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap.h new file mode 100644 index 000000000..e2cd2dd81 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap.h @@ -0,0 +1,24 @@ +/* + * EAP peer state machine functions (RFC 4137) + * Copyright (c) 2004-2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_H +#define EAP_H + +#include "wpa/defs.h" +#include "eap/eap_defs.h" + +struct eap_sm; + +struct eap_method_type { + int vendor; + u32 method; +}; + +const u8 * eap_get_eapKeyData(struct eap_sm *sm, size_t *len); + +#endif /* EAP_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_common.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_common.h new file mode 100644 index 000000000..38c571005 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_common.h @@ -0,0 +1,23 @@ +/* + * EAP common peer/server definitions + * Copyright (c) 2004-2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_COMMON_H +#define EAP_COMMON_H + +#include "wpa/wpabuf.h" + +int eap_hdr_len_valid(const struct wpabuf *msg, size_t min_payload); +const u8 * eap_hdr_validate(int vendor, EapType eap_type, + const struct wpabuf *msg, size_t *plen); +struct wpabuf * eap_msg_alloc(int vendor, EapType type, size_t payload_len, + u8 code, u8 identifier); +void eap_update_len(struct wpabuf *msg); +u8 eap_get_id(const struct wpabuf *msg); +EapType eap_get_type(const struct wpabuf *msg); + +#endif /* EAP_COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_config.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_config.h new file mode 100644 index 000000000..f35cbf43d --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_config.h @@ -0,0 +1,220 @@ +/* + * EAP peer configuration data + * Copyright (c) 2003-2013, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_CONFIG_H +#define EAP_CONFIG_H + +/** + * struct eap_peer_config - EAP peer configuration/credentials + */ +struct eap_peer_config { + /** + * identity - EAP Identity + * + * This field is used to set the real user identity or NAI (for + * EAP-PSK/PAX/SAKE/GPSK). + */ + u8 *identity; + + /** + * identity_len - EAP Identity length + */ + size_t identity_len; + + /** + * password - Password string for EAP + * + * This field can include either the plaintext password (default + * option) or a NtPasswordHash (16-byte MD4 hash of the unicode + * presentation of the password) if flags field has + * EAP_CONFIG_FLAGS_PASSWORD_NTHASH bit set to 1. NtPasswordHash can + * only be used with authentication mechanism that use this hash as the + * starting point for operation: MSCHAP and MSCHAPv2 (EAP-MSCHAPv2, + * EAP-TTLS/MSCHAPv2, EAP-TTLS/MSCHAP, LEAP). + * + * In addition, this field is used to configure a pre-shared key for + * EAP-PSK/PAX/SAKE/GPSK. The length of the PSK must be 16 for EAP-PSK + * and EAP-PAX and 32 for EAP-SAKE. EAP-GPSK can use a variable length + * PSK. + */ + u8 *password; + + /** + * password_len - Length of password field + */ + size_t password_len; + + /** + * ca_cert - File path to CA certificate file (PEM/DER) + * + * This file can have one or more trusted CA certificates. If ca_cert + * and ca_path are not included, server certificate will not be + * verified. This is insecure and a trusted CA certificate should + * always be configured when using EAP-TLS/TTLS/PEAP. Full path to the + * file should be used since working directory may change when + * wpa_supplicant is run in the background. + * + * Alternatively, a named configuration blob can be used by setting + * this to blob://blob_name. + * + * Alternatively, this can be used to only perform matching of the + * server certificate (SHA-256 hash of the DER encoded X.509 + * certificate). In this case, the possible CA certificates in the + * server certificate chain are ignored and only the server certificate + * is verified. This is configured with the following format: + * hash:://server/sha256/cert_hash_in_hex + * For example: "hash://server/sha256/ + * 5a1bc1296205e6fdbe3979728efe3920798885c1c4590b5f90f43222d239ca6a" + * + * On Windows, trusted CA certificates can be loaded from the system + * certificate store by setting this to cert_store://name, e.g., + * ca_cert="cert_store://CA" or ca_cert="cert_store://ROOT". + * Note that when running wpa_supplicant as an application, the user + * certificate store (My user account) is used, whereas computer store + * (Computer account) is used when running wpasvc as a service. + */ + u8 *ca_cert; + + /** + * ca_path - Directory path for CA certificate files (PEM) + * + * This path may contain multiple CA certificates in OpenSSL format. + * Common use for this is to point to system trusted CA list which is + * often installed into directory like /etc/ssl/certs. If configured, + * these certificates are added to the list of trusted CAs. ca_cert + * may also be included in that case, but it is not required. + */ + u8 *ca_path; + + /** + * client_cert - File path to client certificate file (PEM/DER) + * + * This field is used with EAP method that use TLS authentication. + * Usually, this is only configured for EAP-TLS, even though this could + * in theory be used with EAP-TTLS and EAP-PEAP, too. Full path to the + * file should be used since working directory may change when + * wpa_supplicant is run in the background. + * + * Alternatively, a named configuration blob can be used by setting + * this to blob://blob_name. + */ + u8 *client_cert; + + /** + * private_key - File path to client private key file (PEM/DER/PFX) + * + * When PKCS#12/PFX file (.p12/.pfx) is used, client_cert should be + * commented out. Both the private key and certificate will be read + * from the PKCS#12 file in this case. Full path to the file should be + * used since working directory may change when wpa_supplicant is run + * in the background. + * + * Windows certificate store can be used by leaving client_cert out and + * configuring private_key in one of the following formats: + * + * cert://substring_to_match + * + * hash://certificate_thumbprint_in_hex + * + * For example: private_key="hash://63093aa9c47f56ae88334c7b65a4" + * + * Note that when running wpa_supplicant as an application, the user + * certificate store (My user account) is used, whereas computer store + * (Computer account) is used when running wpasvc as a service. + * + * Alternatively, a named configuration blob can be used by setting + * this to blob://blob_name. + */ + u8 *private_key; + + /** + * private_key_passwd - Password for private key file + * + * If left out, this will be asked through control interface. + */ + u8 *private_key_passwd; + + char *phase1; + + /** + * pin - PIN for USIM, GSM SIM, and smartcards + * + * This field is used to configure PIN for SIM and smartcards for + * EAP-SIM and EAP-AKA. In addition, this is used with EAP-TLS if a + * smartcard is used for private key operations. + * + * If left out, this will be asked through control interface. + */ + char *pin; + + /** + * fragment_size - Maximum EAP fragment size in bytes (default 1398) + * + * This value limits the fragment size for EAP methods that support + * fragmentation (e.g., EAP-TLS and EAP-PEAP). This value should be set + * small enough to make the EAP messages fit in MTU of the network + * interface used for EAPOL. The default value is suitable for most + * cases. + */ + int fragment_size; + +#define EAP_CONFIG_FLAGS_PASSWORD_NTHASH BIT(0) +#define EAP_CONFIG_FLAGS_EXT_PASSWORD BIT(1) + /** + * flags - Network configuration flags (bitfield) + * + * This variable is used for internal flags to describe further details + * for the network parameters. + * bit 0 = password is represented as a 16-byte NtPasswordHash value + * instead of plaintext password + * bit 1 = password is stored in external storage; the value in the + * password field is the name of that external entry + */ + u32 flags; + + /** + * ocsp - Whether to use/require OCSP to check server certificate + * + * 0 = do not use OCSP stapling (TLS certificate status extension) + * 1 = try to use OCSP stapling, but not require response + * 2 = require valid OCSP stapling response + */ + int ocsp; +}; + + +/** + * struct wpa_config_blob - Named configuration blob + * + * This data structure is used to provide storage for binary objects to store + * abstract information like certificates and private keys inlined with the + * configuration data. + */ +struct wpa_config_blob { + /** + * name - Blob name + */ + char *name; + + /** + * data - Pointer to binary data + */ + u8 *data; + + /** + * len - Length of binary data + */ + size_t len; + + /** + * next - Pointer to next blob in the configuration + */ + struct wpa_config_blob *next; +}; + +#endif /* EAP_CONFIG_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_defs.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_defs.h new file mode 100644 index 000000000..10995d386 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_defs.h @@ -0,0 +1,92 @@ +/* + * EAP server/peer: Shared EAP definitions + * Copyright (c) 2004-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_DEFS_H +#define EAP_DEFS_H + +/* RFC 3748 - Extensible Authentication Protocol (EAP) */ + +#ifdef _MSC_VER +#pragma pack(push, 1) +#endif /* _MSC_VER */ + +struct eap_hdr { + u8 code; + u8 identifier; + be16 length; /* including code and identifier; network byte order */ + /* followed by length-4 octets of data */ +} STRUCT_PACKED; + + +#ifdef _MSC_VER +#pragma pack(pop) +#endif /* _MSC_VER */ + +enum { EAP_CODE_REQUEST = 1, EAP_CODE_RESPONSE = 2, EAP_CODE_SUCCESS = 3, + EAP_CODE_FAILURE = 4 }; + +/* EAP Request and Response data begins with one octet Type. Success and + * Failure do not have additional data. */ + +/* + * EAP Method Types as allocated by IANA: + * http://www.iana.org/assignments/eap-numbers + */ +typedef enum { + EAP_TYPE_NONE = 0, + EAP_TYPE_IDENTITY = 1 /* RFC 3748 */, + EAP_TYPE_NOTIFICATION = 2 /* RFC 3748 */, + EAP_TYPE_NAK = 3 /* Response only, RFC 3748 */, + EAP_TYPE_MD5 = 4, /* RFC 3748 */ + EAP_TYPE_OTP = 5 /* RFC 3748 */, + EAP_TYPE_GTC = 6, /* RFC 3748 */ + EAP_TYPE_TLS = 13 /* RFC 2716 */, + EAP_TYPE_LEAP = 17 /* Cisco proprietary */, + EAP_TYPE_SIM = 18 /* RFC 4186 */, + EAP_TYPE_TTLS = 21 /* RFC 5281 */, + EAP_TYPE_AKA = 23 /* RFC 4187 */, + EAP_TYPE_PEAP = 25 /* draft-josefsson-pppext-eap-tls-eap-06.txt */, + EAP_TYPE_MSCHAPV2 = 26 /* draft-kamath-pppext-eap-mschapv2-00.txt */, + EAP_TYPE_TLV = 33 /* draft-josefsson-pppext-eap-tls-eap-07.txt */, + EAP_TYPE_TNC = 38 /* TNC IF-T v1.0-r3; note: tentative assignment; + * type 38 has previously been allocated for + * EAP-HTTP Digest, (funk.com) */, + EAP_TYPE_FAST = 43 /* RFC 4851 */, + EAP_TYPE_PAX = 46 /* RFC 4746 */, + EAP_TYPE_PSK = 47 /* RFC 4764 */, + EAP_TYPE_SAKE = 48 /* RFC 4763 */, + EAP_TYPE_IKEV2 = 49 /* RFC 5106 */, + EAP_TYPE_AKA_PRIME = 50 /* RFC 5448 */, + EAP_TYPE_GPSK = 51 /* RFC 5433 */, + EAP_TYPE_PWD = 52 /* RFC 5931 */, + EAP_TYPE_EKE = 53 /* RFC 6124 */, + EAP_TYPE_EXPANDED = 254 /* RFC 3748 */ +} EapType; + + +/* SMI Network Management Private Enterprise Code for vendor specific types */ +enum { + EAP_VENDOR_IETF = 0, + EAP_VENDOR_MICROSOFT = 0x000137 /* Microsoft */, + EAP_VENDOR_WFA = 0x00372A /* Wi-Fi Alliance */, + EAP_VENDOR_HOSTAP = 39068 /* hostapd/wpa_supplicant project */ +}; + +struct eap_expand { + u8 vendor_id[3]; + be32 vendor_type; + u8 opcode; +} STRUCT_PACKED; + +#define EAP_VENDOR_UNAUTH_TLS EAP_VENDOR_HOSTAP +#define EAP_VENDOR_TYPE_UNAUTH_TLS 1 + +#define EAP_MSK_LEN 64 +#define EAP_EMSK_LEN 64 + +#endif /* EAP_DEFS_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_i.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_i.h new file mode 100644 index 000000000..a4779d13f --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_i.h @@ -0,0 +1,88 @@ +/* + * EAP peer state machines internal structures (RFC 4137) + * Copyright (c) 2004-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_I_H +#define EAP_I_H + +#include "wpa/wpabuf.h" +#include "eap.h" +#include "eap_common.h" +#include "eap_config.h" + +/* RFC 4137 - EAP Peer state machine */ + +typedef enum { + DECISION_FAIL, DECISION_COND_SUCC, DECISION_UNCOND_SUCC +} EapDecision; + +typedef enum { + METHOD_NONE, METHOD_INIT, METHOD_CONT, METHOD_MAY_CONT, METHOD_DONE +} EapMethodState; + +/** + * struct eap_method_ret - EAP return values from struct eap_method::process() + * + * These structure contains OUT variables for the interface between peer state + * machine and methods (RFC 4137, Sect. 4.2). eapRespData will be returned as + * the return value of struct eap_method::process() so it is not included in + * this structure. + */ +struct eap_method_ret { + /** + * ignore - Whether method decided to drop the current packed (OUT) + */ + Boolean ignore; + + /** + * methodState - Method-specific state (IN/OUT) + */ + EapMethodState methodState; + + /** + * decision - Authentication decision (OUT) + */ + EapDecision decision; + + /** + * allowNotifications - Whether method allows notifications (OUT) + */ + Boolean allowNotifications; +}; + +#define CLIENT_CERT_NAME "CLC" +#define CA_CERT_NAME "CAC" +#define PRIVATE_KEY_NAME "PVK" +#define BLOB_NAME_LEN 3 +#define BLOB_NUM 2 + +/** + * struct eap_sm - EAP state machine data + */ +struct eap_sm { + void *eap_method_priv; + + void *ssl_ctx; + + unsigned int workaround; +///////////////////////////////////////////////// + struct pbuf *outbuf; + struct wpa_config_blob blob[BLOB_NUM]; + struct eap_peer_config config; + u8 current_identifier; + u8 ownaddr[ETH_ALEN]; +#ifdef USE_WPA2_TASK +#define SIG_WPA2_NUM 2 + u8 wpa2_sig_cnt[SIG_WPA2_NUM]; +#endif + u8 finish_state; +}; + +struct eap_peer_config * eap_get_config(struct eap_sm *sm); +const struct wpa_config_blob * eap_get_config_blob(struct eap_sm *sm, const char *name); + +#endif /* EAP_I_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls.h new file mode 100644 index 000000000..a8a386f22 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls.h @@ -0,0 +1,25 @@ +/* + * EAP peer: EAP-TLS/PEAP/TTLS/FAST common functions + * Copyright (c) 2004-2009, 2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_TLS_H +#define EAP_TLS_H + +#include "eap_i.h" +#include "eap_common.h" +#include "eap.h" +#include "wpa/wpabuf.h" + +void * eap_tls_init(struct eap_sm *sm); +void eap_tls_deinit(struct eap_sm *sm, void *priv); +struct wpabuf * eap_tls_process(struct eap_sm *sm, void *priv, + struct eap_method_ret *ret, + const struct wpabuf *reqData); + +u8 * eap_tls_getKey(struct eap_sm *sm, void *priv, size_t *len); + +#endif /* EAP_TLS_H */ diff --git a/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls_common.h b/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls_common.h new file mode 100644 index 000000000..1a5e0f89e --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/eap_peer/eap_tls_common.h @@ -0,0 +1,131 @@ +/* + * EAP peer: EAP-TLS/PEAP/TTLS/FAST common functions + * Copyright (c) 2004-2009, 2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EAP_TLS_COMMON_H +#define EAP_TLS_COMMON_H + +/** + * struct eap_ssl_data - TLS data for EAP methods + */ +struct eap_ssl_data { + /** + * conn - TLS connection context data from tls_connection_init() + */ + struct tls_connection *conn; + + /** + * tls_out - TLS message to be sent out in fragments + */ + struct wpabuf *tls_out; + + /** + * tls_out_pos - The current position in the outgoing TLS message + */ + size_t tls_out_pos; + + /** + * tls_out_limit - Maximum fragment size for outgoing TLS messages + */ + size_t tls_out_limit; + + /** + * tls_in - Received TLS message buffer for re-assembly + */ + struct wpabuf *tls_in; + + /** + * tls_in_left - Number of remaining bytes in the incoming TLS message + */ + size_t tls_in_left; + + /** + * tls_in_total - Total number of bytes in the incoming TLS message + */ + size_t tls_in_total; + + /** + * phase2 - Whether this TLS connection is used in EAP phase 2 (tunnel) + */ + int phase2; + + /** + * include_tls_length - Whether the TLS length field is included even + * if the TLS data is not fragmented + */ + int include_tls_length; + + /** + * eap - EAP state machine allocated with eap_peer_sm_init() + */ + struct eap_sm *eap; + + /** + * ssl_ctx - TLS library context to use for the connection + */ + void *ssl_ctx; + + /** + * eap_type - EAP method used in Phase 1 (EAP_TYPE_TLS/PEAP/TTLS/FAST) + */ + u8 eap_type; +}; + + +/* EAP TLS Flags */ +#define EAP_TLS_FLAGS_LENGTH_INCLUDED 0x80 +#define EAP_TLS_FLAGS_MORE_FRAGMENTS 0x40 +#define EAP_TLS_FLAGS_START 0x20 +#define EAP_TLS_VERSION_MASK 0x07 + + /* could be up to 128 bytes, but only the first 64 bytes are used */ +#define EAP_TLS_KEY_LEN 64 + +/* dummy type used as a flag for UNAUTH-TLS */ +#define EAP_UNAUTH_TLS_TYPE 255 + + +int eap_peer_tls_ssl_init(struct eap_sm *sm, struct eap_ssl_data *data, + struct eap_peer_config *config, u8 eap_type); +void eap_peer_tls_ssl_deinit(struct eap_sm *sm, struct eap_ssl_data *data); +u8 * eap_peer_tls_derive_key(struct eap_sm *sm, struct eap_ssl_data *data, + const char *label, size_t len); +u8 * eap_peer_tls_derive_session_id(struct eap_sm *sm, + struct eap_ssl_data *data, u8 eap_type, + size_t *len); +int eap_peer_tls_process_helper(struct eap_sm *sm, struct eap_ssl_data *data, + EapType eap_type, int peap_version, + u8 id, const u8 *in_data, size_t in_len, + struct wpabuf **out_data); +struct wpabuf * eap_peer_tls_build_ack(u8 id, EapType eap_type, + int peap_version); +int eap_peer_tls_reauth_init(struct eap_sm *sm, struct eap_ssl_data *data); +int eap_peer_tls_status(struct eap_sm *sm, struct eap_ssl_data *data, + char *buf, size_t buflen, int verbose); +const u8 * eap_peer_tls_process_init(struct eap_sm *sm, + struct eap_ssl_data *data, + EapType eap_type, + struct eap_method_ret *ret, + const struct wpabuf *reqData, + size_t *len, u8 *flags); +void eap_peer_tls_reset_input(struct eap_ssl_data *data); +void eap_peer_tls_reset_output(struct eap_ssl_data *data); +int eap_peer_tls_decrypt(struct eap_sm *sm, struct eap_ssl_data *data, + const struct wpabuf *in_data, + struct wpabuf **in_decrypted); +int eap_peer_tls_encrypt(struct eap_sm *sm, struct eap_ssl_data *data, + EapType eap_type, int peap_version, u8 id, + const struct wpabuf *in_data, + struct wpabuf **out_data); +int eap_peer_select_phase2_methods(struct eap_peer_config *config, + const char *prefix, + struct eap_method_type **types, + size_t *num_types); +int eap_peer_tls_phase2_nak(struct eap_method_type *types, size_t num_types, + struct eap_hdr *hdr, struct wpabuf **resp); + +#endif /* EAP_TLS_COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/asn1.h b/components/wpa_supplicant/include/wpa2/tls/asn1.h new file mode 100644 index 000000000..6342c4cc7 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/asn1.h @@ -0,0 +1,66 @@ +/* + * ASN.1 DER parsing + * Copyright (c) 2006, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef ASN1_H +#define ASN1_H + +#define ASN1_TAG_EOC 0x00 /* not used with DER */ +#define ASN1_TAG_BOOLEAN 0x01 +#define ASN1_TAG_INTEGER 0x02 +#define ASN1_TAG_BITSTRING 0x03 +#define ASN1_TAG_OCTETSTRING 0x04 +#define ASN1_TAG_NULL 0x05 +#define ASN1_TAG_OID 0x06 +#define ASN1_TAG_OBJECT_DESCRIPTOR 0x07 /* not yet parsed */ +#define ASN1_TAG_EXTERNAL 0x08 /* not yet parsed */ +#define ASN1_TAG_REAL 0x09 /* not yet parsed */ +#define ASN1_TAG_ENUMERATED 0x0A /* not yet parsed */ +#define ASN1_TAG_UTF8STRING 0x0C /* not yet parsed */ +#define ANS1_TAG_RELATIVE_OID 0x0D +#define ASN1_TAG_SEQUENCE 0x10 /* shall be constructed */ +#define ASN1_TAG_SET 0x11 +#define ASN1_TAG_NUMERICSTRING 0x12 /* not yet parsed */ +#define ASN1_TAG_PRINTABLESTRING 0x13 +#define ASN1_TAG_TG1STRING 0x14 /* not yet parsed */ +#define ASN1_TAG_VIDEOTEXSTRING 0x15 /* not yet parsed */ +#define ASN1_TAG_IA5STRING 0x16 +#define ASN1_TAG_UTCTIME 0x17 +#define ASN1_TAG_GENERALIZEDTIME 0x18 /* not yet parsed */ +#define ASN1_TAG_GRAPHICSTRING 0x19 /* not yet parsed */ +#define ASN1_TAG_VISIBLESTRING 0x1A +#define ASN1_TAG_GENERALSTRING 0x1B /* not yet parsed */ +#define ASN1_TAG_UNIVERSALSTRING 0x1C /* not yet parsed */ +#define ASN1_TAG_BMPSTRING 0x1D /* not yet parsed */ + +#define ASN1_CLASS_UNIVERSAL 0 +#define ASN1_CLASS_APPLICATION 1 +#define ASN1_CLASS_CONTEXT_SPECIFIC 2 +#define ASN1_CLASS_PRIVATE 3 + + +struct asn1_hdr { + const u8 *payload; + u8 identifier, class, constructed; + unsigned int tag, length; +}; + +#define ASN1_MAX_OID_LEN 20 +struct asn1_oid { + unsigned long oid[ASN1_MAX_OID_LEN]; + size_t len; +}; + + +int asn1_get_next(const u8 *buf, size_t len, struct asn1_hdr *hdr); +int asn1_parse_oid(const u8 *buf, size_t len, struct asn1_oid *oid); +int asn1_get_oid(const u8 *buf, size_t len, struct asn1_oid *oid, + const u8 **next); +void asn1_oid_to_str(struct asn1_oid *oid, char *buf, size_t len); +unsigned long asn1_bit_string_to_long(const u8 *buf, size_t len); + +#endif /* ASN1_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/bignum.h b/components/wpa_supplicant/include/wpa2/tls/bignum.h new file mode 100644 index 000000000..f25e26783 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/bignum.h @@ -0,0 +1,38 @@ +/* + * Big number math + * Copyright (c) 2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef BIGNUM_H +#define BIGNUM_H + +struct bignum; + +struct bignum * bignum_init(void); +void bignum_deinit(struct bignum *n); +size_t bignum_get_unsigned_bin_len(struct bignum *n); +int bignum_get_unsigned_bin(const struct bignum *n, u8 *buf, size_t *len); +int bignum_set_unsigned_bin(struct bignum *n, const u8 *buf, size_t len); +int bignum_cmp(const struct bignum *a, const struct bignum *b); +int bignum_cmp_d(const struct bignum *a, unsigned long b); +int bignum_add(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_sub(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_mul(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_mulmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d); +int bignum_exptmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d); + +#endif /* BIGNUM_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/libtommath.h b/components/wpa_supplicant/include/wpa2/tls/libtommath.h new file mode 100644 index 000000000..c0409b5e3 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/libtommath.h @@ -0,0 +1,3443 @@ +/* + * Minimal code for RSA support from LibTomMath 0.41 + * http://libtom.org/ + * http://libtom.org/files/ltm-0.41.tar.bz2 + * This library was released in public domain by Tom St Denis. + * + * The combination in this file may not use all of the optimized algorithms + * from LibTomMath and may be considerable slower than the LibTomMath with its + * default settings. The main purpose of having this version here is to make it + * easier to build bignum.c wrapper without having to install and build an + * external library. + * + * If CONFIG_INTERNAL_LIBTOMMATH is defined, bignum.c includes this + * libtommath.c file instead of using the external LibTomMath library. + */ +#include "c_types.h" +#include "os.h" +#include "stdarg.h" + +#ifdef MEMLEAK_DEBUG +static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__; +#endif + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + +#define BN_MP_INVMOD_C +#define BN_S_MP_EXPTMOD_C /* Note: #undef in tommath_superclass.h; this would + * require BN_MP_EXPTMOD_FAST_C instead */ +#define BN_S_MP_MUL_DIGS_C +#define BN_MP_INVMOD_SLOW_C +#define BN_S_MP_SQR_C +#define BN_S_MP_MUL_HIGH_DIGS_C /* Note: #undef in tommath_superclass.h; this + * would require other than mp_reduce */ + +#ifdef LTM_FAST + +/* Use faster div at the cost of about 1 kB */ +#define BN_MP_MUL_D_C + +/* Include faster exptmod (Montgomery) at the cost of about 2.5 kB in code */ +#define BN_MP_EXPTMOD_FAST_C +#define BN_MP_MONTGOMERY_SETUP_C +#define BN_FAST_MP_MONTGOMERY_REDUCE_C +#define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +#define BN_MP_MUL_2_C + +/* Include faster sqr at the cost of about 0.5 kB in code */ +#define BN_FAST_S_MP_SQR_C + +#else /* LTM_FAST */ + +#define BN_MP_DIV_SMALL +#define BN_MP_INIT_MULTI_C +#define BN_MP_CLEAR_MULTI_C +#define BN_MP_ABS_C +#endif /* LTM_FAST */ + +/* Current uses do not require support for negative exponent in exptmod, so we + * can save about 1.5 kB in leaving out invmod. */ +#define LTM_NO_NEG_EXP + +/* from tommath.h */ + +#ifndef MIN + #define MIN(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef MAX + #define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +#define OPT_CAST(x) (x *) + +typedef unsigned long mp_digit; +typedef u64 mp_word; + +#define DIGIT_BIT 28 +#define MP_28BIT + + +#define XMALLOC os_malloc +#define XFREE os_free +#define XREALLOC os_realloc + + +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) + +#define MP_LT -1 /* less than */ +#define MP_EQ 0 /* equal to */ +#define MP_GT 1 /* greater than */ + +#define MP_ZPOS 0 /* positive integer */ +#define MP_NEG 1 /* negative */ + +#define MP_OKAY 0 /* ok result */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ + +#define MP_YES 1 /* yes response */ +#define MP_NO 0 /* no response */ + +typedef int mp_err; + +/* define this to use lower memory usage routines (exptmods mostly) */ +#define MP_LOW_MEM + +/* default precision */ +#ifndef MP_PREC + #ifndef MP_LOW_MEM + #define MP_PREC 32 /* default digits of precision */ + #else + #define MP_PREC 8 /* default digits of precision */ + #endif +#endif + +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ +#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) + +/* the infamous mp_int structure */ +typedef struct { + int used, alloc, sign; + mp_digit *dp; +} mp_int; + + +/* ---> Basic Manipulations <--- */ +#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) +#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) +#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) + + +/* prototypes for copied functions */ +#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) +static int s_mp_exptmod(mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); +static int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +static int s_mp_sqr(mp_int * a, mp_int * b); +static int s_mp_mul_high_digs(mp_int * a, mp_int * b, mp_int * c, int digs); + +static int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); + +#ifdef BN_MP_INIT_MULTI_C +static int mp_init_multi(mp_int *mp, ...); +#endif +#ifdef BN_MP_CLEAR_MULTI_C +static void mp_clear_multi(mp_int *mp, ...); +#endif +static int mp_lshd(mp_int * a, int b); +static void mp_set(mp_int * a, mp_digit b); +static void mp_clamp(mp_int * a); +static void mp_exch(mp_int * a, mp_int * b); +static void mp_rshd(mp_int * a, int b); +static void mp_zero(mp_int * a); +static int mp_mod_2d(mp_int * a, int b, mp_int * c); +static int mp_div_2d(mp_int * a, int b, mp_int * c, mp_int * d); +static int mp_init_copy(mp_int * a, mp_int * b); +static int mp_mul_2d(mp_int * a, int b, mp_int * c); +#ifndef LTM_NO_NEG_EXP +static int mp_div_2(mp_int * a, mp_int * b); +static int mp_invmod(mp_int * a, mp_int * b, mp_int * c); +static int mp_invmod_slow(mp_int * a, mp_int * b, mp_int * c); +#endif /* LTM_NO_NEG_EXP */ +static int mp_copy(mp_int * a, mp_int * b); +static int mp_count_bits(mp_int * a); +static int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d); +static int mp_mod(mp_int * a, mp_int * b, mp_int * c); +static int mp_grow(mp_int * a, int size); +static int mp_cmp_mag(mp_int * a, mp_int * b); +#ifdef BN_MP_ABS_C +static int mp_abs(mp_int * a, mp_int * b); +#endif +static int mp_sqr(mp_int * a, mp_int * b); +static int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); +static int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); +static int mp_2expt(mp_int * a, int b); +static int mp_reduce_setup(mp_int * a, mp_int * b); +static int mp_reduce(mp_int * x, mp_int * m, mp_int * mu); +static int mp_init_size(mp_int * a, int size); +#ifdef BN_MP_EXPTMOD_FAST_C +static int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); +#endif /* BN_MP_EXPTMOD_FAST_C */ +#ifdef BN_FAST_S_MP_SQR_C +static int fast_s_mp_sqr (mp_int * a, mp_int * b); +#endif /* BN_FAST_S_MP_SQR_C */ +#ifdef BN_MP_MUL_D_C +static int mp_mul_d (mp_int * a, mp_digit b, mp_int * c); +#endif /* BN_MP_MUL_D_C */ + + + +/* functions from bn_.c */ + + +/* reverse an array, used for radix code */ +static void ICACHE_FLASH_ATTR +bn_reverse (unsigned char *s, int len) +{ + int ix, iy; + unsigned char t; + + ix = 0; + iy = len - 1; + while (ix < iy) { + t = s[ix]; + s[ix] = s[iy]; + s[iy] = t; + ++ix; + --iy; + } +} + + +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ +static int ICACHE_FLASH_ATTR +s_mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int *x; + int olduse, res, min, max; + + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else { + min = a->used; + max = b->used; + x = b; + } + + /* init result */ + if (c->alloc < max + 1) { + if ((res = mp_grow (c, max + 1)) != MP_OKAY) { + return res; + } + } + + /* get old used digit count and set new one */ + olduse = c->used; + c->used = max + 1; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + + /* first input */ + tmpa = a->dp; + + /* second input */ + tmpb = b->dp; + + /* destination */ + tmpc = c->dp; + + /* zero the carry */ + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in + */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + } + + /* add carry */ + *tmpc++ = u; + + /* clear digits above oldused */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + + +/* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ +static int ICACHE_FLASH_ATTR +s_mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int olduse, res, min, max; + + /* find sizes */ + min = b->used; + max = a->used; + + /* init result */ + if (c->alloc < max) { + if ((res = mp_grow (c, max)) != MP_OKAY) { + return res; + } + } + olduse = c->used; + c->used = max; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + tmpa = a->dp; + tmpb = b->dp; + tmpc = c->dp; + + /* set carry to zero */ + u = 0; + for (i = 0; i < min; i++) { + /* T[i] = A[i] - B[i] - U */ + *tmpc = *tmpa++ - *tmpb++ - u; + + /* U = carry bit of T[i] + * Note this saves performing an AND operation since + * if a carry does occur it will propagate all the way to the + * MSB. As a result a single shift is enough to get the carry + */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, e.g. if A has more digits than B */ + for (; i < max; i++) { + /* T[i] = A[i] - U */ + *tmpc = *tmpa++ - u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + + +/* init a new mp_int */ +static int ICACHE_FLASH_ATTR +mp_init (mp_int * a) +{ + int i; + + /* allocate memory required and clear it */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the digits to zero */ + for (i = 0; i < MP_PREC; i++) { + a->dp[i] = 0; + } + + /* set the used to zero, allocated digits to the default precision + * and sign to positive */ + a->used = 0; + a->alloc = MP_PREC; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + + +/* clear one (frees) */ +static void ICACHE_FLASH_ATTR +mp_clear (mp_int * a) +{ + int i; + + /* only do anything if a hasn't been freed previously */ + if (a->dp != NULL) { + /* first zero the digits */ + for (i = 0; i < a->used; i++) { + a->dp[i] = 0; + } + + /* free ram */ + XFREE(a->dp); + + /* reset members to make debugging easier */ + a->dp = NULL; + a->alloc = a->used = 0; + a->sign = MP_ZPOS; + } +} + + +/* high level addition (handles signs) */ +static int ICACHE_FLASH_ATTR +mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + /* get sign of both inputs */ + sa = a->sign; + sb = b->sign; + + /* handle two cases, not four */ + if (sa == sb) { + /* both positive or both negative */ + /* add their magnitudes, copy the sign */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* one positive, the other negative */ + /* subtract the one with the greater magnitude from */ + /* the one of the lesser magnitude. The result gets */ + /* the sign of the one with the greater magnitude. */ + if (mp_cmp_mag (a, b) == MP_LT) { + c->sign = sb; + res = s_mp_sub (b, a, c); + } else { + c->sign = sa; + res = s_mp_sub (a, b, c); + } + } + return res; +} + + +/* high level subtraction (handles signs) */ +static int ICACHE_FLASH_ATTR +mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + sa = a->sign; + sb = b->sign; + + if (sa != sb) { + /* subtract a negative from a positive, OR */ + /* subtract a positive from a negative. */ + /* In either case, ADD their magnitudes, */ + /* and use the sign of the first number. */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* subtract a positive from a positive, OR */ + /* subtract a negative from a negative. */ + /* First, take the difference between their */ + /* magnitudes, then... */ + if (mp_cmp_mag (a, b) != MP_LT) { + /* Copy the sign from the first */ + c->sign = sa; + /* The first has a larger or equal magnitude */ + res = s_mp_sub (a, b, c); + } else { + /* The result has the *opposite* sign from */ + /* the first number. */ + c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; + /* The second has a larger magnitude */ + res = s_mp_sub (b, a, c); + } + } + return res; +} + + +/* high level multiplication (handles sign) */ +static int ICACHE_FLASH_ATTR +mp_mul (mp_int * a, mp_int * b, mp_int * c) +{ + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + + /* use Toom-Cook? */ +#ifdef BN_MP_TOOM_MUL_C + if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { + res = mp_toom_mul(a, b, c); + } else +#endif +#ifdef BN_MP_KARATSUBA_MUL_C + /* use Karatsuba? */ + if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { + res = mp_karatsuba_mul (a, b, c); + } else +#endif + { + /* can we use the fast multiplier? + * + * The fast multiplier can be used if the output will + * have less than MP_WARRAY digits and the number of + * digits won't affect carry propagation + */ +#ifdef BN_FAST_S_MP_MUL_DIGS_C + int digs = a->used + b->used + 1; + + if ((digs < MP_WARRAY) && + MIN(a->used, b->used) <= + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + res = fast_s_mp_mul_digs (a, b, c, digs); + } else +#endif +#ifdef BN_S_MP_MUL_DIGS_C + res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ +#else +#error mp_mul could fail + res = MP_VAL; +#endif + + } + c->sign = (c->used > 0) ? neg : MP_ZPOS; + return res; +} + + +/* d = a * b (mod c) */ +static int ICACHE_FLASH_ATTR +mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + + +/* c = a mod b, 0 <= c < b */ +static int ICACHE_FLASH_ATTR +mp_mod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int t; + int res; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if (t.sign != b->sign) { + res = mp_add (b, &t, c); + } else { + res = MP_OKAY; + mp_exch (&t, c); + } + + mp_clear (&t); + return res; +} + + +/* this is a shell function that calls either the normal or Montgomery + * exptmod functions. Originally the call to the montgomery code was + * embedded in the normal function but that wasted a lot of stack space + * for nothing (since 99% of the time the Montgomery code would be called) + */ +static int ICACHE_FLASH_ATTR +mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + int dr; + + /* modulus P must be positive */ + if (P->sign == MP_NEG) { + return MP_VAL; + } + + /* if exponent X is negative we have to recurse */ + if (X->sign == MP_NEG) { +#ifdef LTM_NO_NEG_EXP + return MP_VAL; +#else /* LTM_NO_NEG_EXP */ +#ifdef BN_MP_INVMOD_C + mp_int tmpG, tmpX; + int err; + + /* first compute 1/G mod P */ + if ((err = mp_init(&tmpG)) != MP_OKAY) { + return err; + } + if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + + /* now get |X| */ + if ((err = mp_init(&tmpX)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; + } + + /* and now compute (1/G)**|X| instead of G**X [X < 0] */ + err = mp_exptmod(&tmpG, &tmpX, P, Y); + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; +#else +#error mp_exptmod would always fail + /* no invmod */ + return MP_VAL; +#endif +#endif /* LTM_NO_NEG_EXP */ + } + +/* modified diminished radix reduction */ +#if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C) + if (mp_reduce_is_2k_l(P) == MP_YES) { + return s_mp_exptmod(G, X, P, Y, 1); + } +#endif + +#ifdef BN_MP_DR_IS_MODULUS_C + /* is it a DR modulus? */ + dr = mp_dr_is_modulus(P); +#else + /* default to no */ + dr = 0; +#endif + +#ifdef BN_MP_REDUCE_IS_2K_C + /* if not, is it a unrestricted DR modulus? */ + if (dr == 0) { + dr = mp_reduce_is_2k(P) << 1; + } +#endif + + /* if the modulus is odd or dr != 0 use the montgomery method */ +#ifdef BN_MP_EXPTMOD_FAST_C + if (mp_isodd (P) == 1 || dr != 0) { + return mp_exptmod_fast (G, X, P, Y, dr); + } else { +#endif +#ifdef BN_S_MP_EXPTMOD_C + /* otherwise use the generic Barrett reduction technique */ + return s_mp_exptmod (G, X, P, Y, 0); +#else +#error mp_exptmod could fail + /* no exptmod for evens */ + return MP_VAL; +#endif +#ifdef BN_MP_EXPTMOD_FAST_C + } +#endif +} + + +/* compare two ints (signed)*/ +static int ICACHE_FLASH_ATTR +mp_cmp (mp_int * a, mp_int * b) +{ + /* compare based on sign */ + if (a->sign != b->sign) { + if (a->sign == MP_NEG) { + return MP_LT; + } else { + return MP_GT; + } + } + + /* compare digits */ + if (a->sign == MP_NEG) { + /* if negative compare opposite direction */ + return mp_cmp_mag(b, a); + } else { + return mp_cmp_mag(a, b); + } +} + + +/* compare a digit */ +static int ICACHE_FLASH_ATTR +mp_cmp_d(mp_int * a, mp_digit b) +{ + /* compare based on sign */ + if (a->sign == MP_NEG) { + return MP_LT; + } + + /* compare based on magnitude */ + if (a->used > 1) { + return MP_GT; + } + + /* compare the only digit of a to b */ + if (a->dp[0] > b) { + return MP_GT; + } else if (a->dp[0] < b) { + return MP_LT; + } else { + return MP_EQ; + } +} + + +#ifndef LTM_NO_NEG_EXP +/* hac 14.61, pp608 */ +static int ICACHE_FLASH_ATTR +mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + +#ifdef BN_FAST_MP_INVMOD_C + /* if the modulus is odd we can use a faster routine instead */ + if (mp_isodd (b) == 1) { + return fast_mp_invmod (a, b, c); + } +#endif + +#ifdef BN_MP_INVMOD_SLOW_C + return mp_invmod_slow(a, b, c); +#endif + +#ifndef BN_FAST_MP_INVMOD_C +#ifndef BN_MP_INVMOD_SLOW_C +#error mp_invmod would always fail +#endif +#endif + return MP_VAL; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* get the size for an unsigned equivalent */ +static int ICACHE_FLASH_ATTR +mp_unsigned_bin_size (mp_int * a) +{ + int size = mp_count_bits (a); + return (size / 8 + ((size & 7) != 0 ? 1 : 0)); +} + + +#ifndef LTM_NO_NEG_EXP +/* hac 14.61, pp608 */ +static int ICACHE_FLASH_ATTR +mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + + /* init temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, + &A, &B, &C, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x = a, y = b */ + if ((res = mp_mod(a, b, &x)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (b, &y)) != MP_OKAY) { + goto LBL_ERR; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto LBL_ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto LBL_ERR; + } + mp_set (&A, 1); + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto LBL_ERR; + } + /* 4.2 if A or B is odd then */ + if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto LBL_ERR; + } + /* 5.2 if C or D is odd then */ + if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto LBL_ERR; + } + + /* if its too low */ + while (mp_cmp_d(&C, 0) == MP_LT) { + if ((res = mp_add(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* too big */ + while (mp_cmp_mag(&C, b) != MP_LT) { + if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* C is now the inverse */ + mp_exch (&C, c); + res = MP_OKAY; +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); + return res; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* compare maginitude of two ints (unsigned) */ +static int ICACHE_FLASH_ATTR +mp_cmp_mag (mp_int * a, mp_int * b) +{ + int n; + mp_digit *tmpa, *tmpb; + + /* compare based on # of non-zero digits */ + if (a->used > b->used) { + return MP_GT; + } + + if (a->used < b->used) { + return MP_LT; + } + + /* alias for a */ + tmpa = a->dp + (a->used - 1); + + /* alias for b */ + tmpb = b->dp + (a->used - 1); + + /* compare based on digits */ + for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { + if (*tmpa > *tmpb) { + return MP_GT; + } + + if (*tmpa < *tmpb) { + return MP_LT; + } + } + return MP_EQ; +} + + +/* reads a unsigned char array, assumes the msb is stored first [big endian] */ +static int ICACHE_FLASH_ATTR +mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c) +{ + int res; + + /* make sure there are at least two digits */ + if (a->alloc < 2) { + if ((res = mp_grow(a, 2)) != MP_OKAY) { + return res; + } + } + + /* zero the int */ + mp_zero (a); + + /* read the bytes in */ + while (c-- > 0) { + if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { + return res; + } + +#ifndef MP_8BIT + a->dp[0] |= *b++; + a->used += 1; +#else + a->dp[0] = (*b & MP_MASK); + a->dp[1] |= ((*b++ >> 7U) & 1); + a->used += 2; +#endif + } + mp_clamp (a); + return MP_OKAY; +} + + +/* store in unsigned [big endian] format */ +static int ICACHE_FLASH_ATTR +mp_to_unsigned_bin (mp_int * a, unsigned char *b) +{ + int x, res; + mp_int t; + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + x = 0; + while (mp_iszero (&t) == 0) { +#ifndef MP_8BIT + b[x++] = (unsigned char) (t.dp[0] & 255); +#else + b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); +#endif + if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + bn_reverse (b, x); + mp_clear (&t); + return MP_OKAY; +} + + +/* shift right by a certain bit count (store quotient in c, optional remainder in d) */ +static int ICACHE_FLASH_ATTR +mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) +{ + mp_digit D, r, rr; + int x, res; + mp_int t; + + + /* if the shift count is <= 0 then we do no work */ + if (b <= 0) { + res = mp_copy (a, c); + if (d != NULL) { + mp_zero (d); + } + return res; + } + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + /* get the remainder */ + if (d != NULL) { + if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + mp_rshd (c, b / DIGIT_BIT); + } + + /* shift any bit count < DIGIT_BIT */ + D = (mp_digit) (b % DIGIT_BIT); + if (D != 0) { + register mp_digit *tmpc, mask, shift; + + /* mask */ + mask = (((mp_digit)1) << D) - 1; + + /* shift for lsb */ + shift = DIGIT_BIT - D; + + /* alias */ + tmpc = c->dp + (c->used - 1); + + /* carry */ + r = 0; + for (x = c->used - 1; x >= 0; x--) { + /* get the lower bits of this word in a temp */ + rr = *tmpc & mask; + + /* shift the current word and mix in the carry bits from the previous word */ + *tmpc = (*tmpc >> D) | (r << shift); + --tmpc; + + /* set the carry to the carry bits of the current word found above */ + r = rr; + } + } + mp_clamp (c); + if (d != NULL) { + mp_exch (&t, d); + } + mp_clear (&t); + return MP_OKAY; +} + + +static int ICACHE_FLASH_ATTR +mp_init_copy (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_init (a)) != MP_OKAY) { + return res; + } + return mp_copy (b, a); +} + + +/* set to zero */ +static void ICACHE_FLASH_ATTR +mp_zero (mp_int * a) +{ + int n; + mp_digit *tmp; + + a->sign = MP_ZPOS; + a->used = 0; + + tmp = a->dp; + for (n = 0; n < a->alloc; n++) { + *tmp++ = 0; + } +} + + +/* copy, b = a */ +static int ICACHE_FLASH_ATTR +mp_copy (mp_int * a, mp_int * b) +{ + int res, n; + + /* if dst == src do nothing */ + if (a == b) { + return MP_OKAY; + } + + /* grow dest */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + /* zero b and copy the parameters over */ + { + register mp_digit *tmpa, *tmpb; + + /* pointer aliases */ + + /* source */ + tmpa = a->dp; + + /* destination */ + tmpb = b->dp; + + /* copy all the digits */ + for (n = 0; n < a->used; n++) { + *tmpb++ = *tmpa++; + } + + /* clear high digits */ + for (; n < b->used; n++) { + *tmpb++ = 0; + } + } + + /* copy used count and sign */ + b->used = a->used; + b->sign = a->sign; + return MP_OKAY; +} + + +/* shift right a certain amount of digits */ +static void ICACHE_FLASH_ATTR +mp_rshd (mp_int * a, int b) +{ + int x; + + /* if b <= 0 then ignore it */ + if (b <= 0) { + return; + } + + /* if b > used then simply zero it and return */ + if (a->used <= b) { + mp_zero (a); + return; + } + + { + register mp_digit *bottom, *top; + + /* shift the digits down */ + + /* bottom */ + bottom = a->dp; + + /* top [offset into digits] */ + top = a->dp + b; + + /* this is implemented as a sliding window where + * the window is b-digits long and digits from + * the top of the window are copied to the bottom + * + * e.g. + + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> + /\ | ----> + \-------------------/ ----> + */ + for (x = 0; x < (a->used - b); x++) { + *bottom++ = *top++; + } + + /* zero the top digits */ + for (; x < a->used; x++) { + *bottom++ = 0; + } + } + + /* remove excess digits */ + a->used -= b; +} + + +/* swap the elements of two integers, for cases where you can't simply swap the + * mp_int pointers around + */ +static void ICACHE_FLASH_ATTR +mp_exch (mp_int * a, mp_int * b) +{ + mp_int t; + + t = *a; + *a = *b; + *b = t; +} + + +/* trim unused digits + * + * This is used to ensure that leading zero digits are + * trimed and the leading "used" digit will be non-zero + * Typically very fast. Also fixes the sign if there + * are no more leading digits + */ +static void ICACHE_FLASH_ATTR +mp_clamp (mp_int * a) +{ + /* decrease used while the most significant digit is + * zero. + */ + while (a->used > 0 && a->dp[a->used - 1] == 0) { + --(a->used); + } + + /* reset the sign flag if used == 0 */ + if (a->used == 0) { + a->sign = MP_ZPOS; + } +} + + +/* grow as required */ +static int ICACHE_FLASH_ATTR +mp_grow (mp_int * a, int size) +{ + int i; + mp_digit *tmp; + + /* if the alloc size is smaller alloc more ram */ + if (a->alloc < size) { + /* ensure there are always at least MP_PREC digits extra on top */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* reallocate the array a->dp + * + * We store the return in a temporary variable + * in case the operation failed we don't want + * to overwrite the dp member of a. + */ + tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); + if (tmp == NULL) { + /* reallocation failed but "a" is still valid [can be freed] */ + return MP_MEM; + } + + /* reallocation succeeded so set a->dp */ + a->dp = tmp; + + /* zero excess digits */ + i = a->alloc; + a->alloc = size; + for (; i < a->alloc; i++) { + a->dp[i] = 0; + } + } + return MP_OKAY; +} + + +#ifdef BN_MP_ABS_C +/* b = |a| + * + * Simple function copies the input and fixes the sign to positive + */ +static int ICACHE_FLASH_ATTR +mp_abs (mp_int * a, mp_int * b) +{ + int res; + + /* copy a to b */ + if (a != b) { + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + } + + /* force the sign of b to positive */ + b->sign = MP_ZPOS; + + return MP_OKAY; +} +#endif + + +/* set to a digit */ +static void ICACHE_FLASH_ATTR +mp_set (mp_int * a, mp_digit b) +{ + mp_zero (a); + a->dp[0] = b & MP_MASK; + a->used = (a->dp[0] != 0) ? 1 : 0; +} + + +#ifndef LTM_NO_NEG_EXP +/* b = a/2 */ +static int ICACHE_FLASH_ATTR +mp_div_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* copy */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* source alias */ + tmpa = a->dp + b->used - 1; + + /* dest alias */ + tmpb = b->dp + b->used - 1; + + /* carry */ + r = 0; + for (x = b->used - 1; x >= 0; x--) { + /* get the carry for the next iteration */ + rr = *tmpa & 1; + + /* shift the current digit, add in carry and store */ + *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); + + /* forward carry to next iteration */ + r = rr; + } + + /* zero excess digits */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + mp_clamp (b); + return MP_OKAY; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* shift left by a certain bit count */ +static int ICACHE_FLASH_ATTR +mp_mul_2d (mp_int * a, int b, mp_int * c) +{ + mp_digit d; + int res; + + /* copy */ + if (a != c) { + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + } + + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } + + /* shift any bit count < DIGIT_BIT */ + d = (mp_digit) (b % DIGIT_BIT); + if (d != 0) { + register mp_digit *tmpc, shift, mask, r, rr; + register int x; + + /* bitmask for carries */ + mask = (((mp_digit)1) << d) - 1; + + /* shift for msbs */ + shift = DIGIT_BIT - d; + + /* alias */ + tmpc = c->dp; + + /* carry */ + r = 0; + for (x = 0; x < c->used; x++) { + /* get the higher bits of the current word */ + rr = (*tmpc >> shift) & mask; + + /* shift the current word and OR in the carry */ + *tmpc = ((*tmpc << d) | r) & MP_MASK; + ++tmpc; + + /* set the carry to the carry bits of the current word */ + r = rr; + } + + /* set final carry */ + if (r != 0) { + c->dp[(c->used)++] = r; + } + } + mp_clamp (c); + return MP_OKAY; +} + + +#ifdef BN_MP_INIT_MULTI_C +static int ICACHE_FLASH_ATTR +mp_init_multi(mp_int *mp, ...) +{ + mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ + int n = 0; /* Number of ok inits */ + mp_int* cur_arg = mp; + va_list args; + + va_start(args, mp); /* init args to next argument from caller */ + while (cur_arg != NULL) { + if (mp_init(cur_arg) != MP_OKAY) { + /* Oops - error! Back-track and mp_clear what we already + succeeded in init-ing, then return error. + */ + va_list clean_args; + + /* end the current list */ + va_end(args); + + /* now start cleaning up */ + cur_arg = mp; + va_start(clean_args, mp); + while (n--) { + mp_clear(cur_arg); + cur_arg = va_arg(clean_args, mp_int*); + } + va_end(clean_args); + res = MP_MEM; + break; + } + n++; + cur_arg = va_arg(args, mp_int*); + } + va_end(args); + return res; /* Assumed ok, if error flagged above. */ +} +#endif + + +#ifdef BN_MP_CLEAR_MULTI_C +static void ICACHE_FLASH_ATTR +mp_clear_multi(mp_int *mp, ...) +{ + mp_int* next_mp = mp; + va_list args; + va_start(args, mp); + while (next_mp != NULL) { + mp_clear(next_mp); + next_mp = va_arg(args, mp_int*); + } + va_end(args); +} +#endif + + +/* shift left a certain amount of digits */ +static int ICACHE_FLASH_ATTR +mp_lshd (mp_int * a, int b) +{ + int x, res; + + /* if its less than zero return */ + if (b <= 0) { + return MP_OKAY; + } + + /* grow to fit the new digits */ + if (a->alloc < a->used + b) { + if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { + return res; + } + } + + { + register mp_digit *top, *bottom; + + /* increment the used by the shift amount then copy upwards */ + a->used += b; + + /* top */ + top = a->dp + a->used - 1; + + /* base */ + bottom = a->dp + a->used - 1 - b; + + /* much like mp_rshd this is implemented using a sliding window + * except the window goes the otherway around. Copying from + * the bottom to the top. see bn_mp_rshd.c for more info. + */ + for (x = a->used - 1; x >= b; x--) { + *top-- = *bottom--; + } + + /* zero the lower digits */ + top = a->dp; + for (x = 0; x < b; x++) { + *top++ = 0; + } + } + return MP_OKAY; +} + + +/* returns the number of bits in an int */ +static int ICACHE_FLASH_ATTR +mp_count_bits (mp_int * a) +{ + int r; + mp_digit q; + + /* shortcut */ + if (a->used == 0) { + return 0; + } + + /* get number of digits and add that */ + r = (a->used - 1) * DIGIT_BIT; + + /* take the last digit and count the bits in it */ + q = a->dp[a->used - 1]; + while (q > ((mp_digit) 0)) { + ++r; + q >>= ((mp_digit) 1); + } + return r; +} + + +/* calc a value mod 2**b */ +static int ICACHE_FLASH_ATTR +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b >= (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} + + +#ifdef BN_MP_DIV_SMALL + +/* slower bit-bang division... also smaller */ +static int ICACHE_FLASH_ATTR +mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int ta, tb, tq, q; + int res, n, n2; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + /* init our temps */ + if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) { + return res; + } + + + mp_set(&tq, 1); + n = mp_count_bits(a) - mp_count_bits(b); + if (((res = mp_abs(a, &ta)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { + goto LBL_ERR; + } + + while (n-- >= 0) { + if (mp_cmp(&tb, &ta) != MP_GT) { + if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || + ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { + goto LBL_ERR; + } + } + if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || + ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { + goto LBL_ERR; + } + } + + /* now q == quotient and ta == remainder */ + n = a->sign; + n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); + if (c != NULL) { + mp_exch(c, &q); + c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; + } + if (d != NULL) { + mp_exch(d, &ta); + d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; + } +LBL_ERR: + mp_clear_multi(&ta, &tb, &tq, &q, NULL); + return res; +} + +#else + +/* integer signed division. + * c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly + * incomplete. For example, it doesn't consider + * the case where digits are removed from 'x' in + * the inner loop. It also doesn't consider the + * case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as + * 14.20 from HAC but fixed to treat these cases. +*/ +static int ICACHE_FLASH_ATTR +mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int q, x, y, t1, t2; + int res, n, t, i, norm, neg; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { + return res; + } + q.used = a->used + 2; + + if ((res = mp_init (&t1)) != MP_OKAY) { + goto LBL_Q; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto LBL_T1; + } + + if ((res = mp_init_copy (&x, a)) != MP_OKAY) { + goto LBL_T2; + } + + if ((res = mp_init_copy (&y, b)) != MP_OKAY) { + goto LBL_X; + } + + /* fix the sign */ + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + x.sign = y.sign = MP_ZPOS; + + /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ + norm = mp_count_bits(&y) % DIGIT_BIT; + if (norm < (int)(DIGIT_BIT-1)) { + norm = (DIGIT_BIT-1) - norm; + if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { + goto LBL_Y; + } + } else { + norm = 0; + } + + /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ + n = x.used - 1; + t = y.used - 1; + + /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ + if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ + goto LBL_Y; + } + + while (mp_cmp (&x, &y) != MP_LT) { + ++(q.dp[n - t]); + if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { + goto LBL_Y; + } + } + + /* reset y by shifting it back down */ + mp_rshd (&y, n - t); + + /* step 3. for i from n down to (t + 1) */ + for (i = n; i >= (t + 1); i--) { + if (i > x.used) { + continue; + } + + /* step 3.1 if xi == yt then set q{i-t-1} to b-1, + * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ + if (x.dp[i] == y.dp[t]) { + q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); + } else { + mp_word tmp; + tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); + tmp |= ((mp_word) x.dp[i - 1]); + tmp /= ((mp_word) y.dp[t]); + if (tmp > (mp_word) MP_MASK) + tmp = MP_MASK; + q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); + } + + /* while (q{i-t-1} * (yt * b + y{t-1})) > + xi * b**2 + xi-1 * b + xi-2 + + do q{i-t-1} -= 1; + */ + q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; + do { + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; + + /* find left hand */ + mp_zero (&t1); + t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; + t1.dp[1] = y.dp[t]; + t1.used = 2; + if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + /* find right hand */ + t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; + t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; + t2.dp[2] = x.dp[i]; + t2.used = 3; + } while (mp_cmp_mag(&t1, &t2) == MP_GT); + + /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ + if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ + if (x.sign == MP_NEG) { + if ((res = mp_copy (&y, &t1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; + } + } + + /* now q is the quotient and x is the remainder + * [which we have to normalize] + */ + + /* get sign before writing to c */ + x.sign = x.used == 0 ? MP_ZPOS : a->sign; + + if (c != NULL) { + mp_clamp (&q); + mp_exch (&q, c); + c->sign = neg; + } + + if (d != NULL) { + mp_div_2d (&x, norm, &x, NULL); + mp_exch (&x, d); + } + + res = MP_OKAY; + +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); +LBL_Q:mp_clear (&q); + return res; +} + +#endif + + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +static int ICACHE_FLASH_ATTR +s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + int (*redux)(mp_int*,mp_int*,mp_int*); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto LBL_M; + } + + if (redmode == 0) { + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce; + } else { + if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce_2k_l; + } + + /* create M table + * + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P + * + * The first half of the table is not + * computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto LBL_MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + for (x = 0; x < (winsize - 1); x++) { + /* square it */ + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + /* reduce modulo P */ + if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) + * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) + */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_MU; + } + if ((err = redux (&M[x], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits */ + if (digidx == -1) { + break; + } + /* read next digit and reset the bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_MU:mp_clear (&mu); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} + + +/* computes b = a*a */ +static int ICACHE_FLASH_ATTR +mp_sqr (mp_int * a, mp_int * b) +{ + int res; + +#ifdef BN_MP_TOOM_SQR_C + /* use Toom-Cook? */ + if (a->used >= TOOM_SQR_CUTOFF) { + res = mp_toom_sqr(a, b); + /* Karatsuba? */ + } else +#endif +#ifdef BN_MP_KARATSUBA_SQR_C +if (a->used >= KARATSUBA_SQR_CUTOFF) { + res = mp_karatsuba_sqr (a, b); + } else +#endif + { +#ifdef BN_FAST_S_MP_SQR_C + /* can we use the fast comba multiplier? */ + if ((a->used * 2 + 1) < MP_WARRAY && + a->used < + (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { + res = fast_s_mp_sqr (a, b); + } else +#endif +#ifdef BN_S_MP_SQR_C + res = s_mp_sqr (a, b); +#else +#error mp_sqr could fail + res = MP_VAL; +#endif + } + b->sign = MP_ZPOS; + return res; +} + + +/* reduces a modulo n where n is of the form 2**p - d + This differs from reduce_2k since "d" can be larger + than a single digit. +*/ +static int ICACHE_FLASH_ATTR +mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) +{ + mp_int q; + int p, res; + + if ((res = mp_init(&q)) != MP_OKAY) { + return res; + } + + p = mp_count_bits(n); +top: + /* q = a/2**p, a = a mod 2**p */ + if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { + goto ERR; + } + + /* q = q * d */ + if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { + goto ERR; + } + + /* a = a + q */ + if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { + goto ERR; + } + + if (mp_cmp_mag(a, n) != MP_LT) { + s_mp_sub(a, n, a); + goto top; + } + +ERR: + mp_clear(&q); + return res; +} + + +/* determines the setup value */ +static int ICACHE_FLASH_ATTR +mp_reduce_2k_setup_l(mp_int *a, mp_int *d) +{ + int res; + mp_int tmp; + + if ((res = mp_init(&tmp)) != MP_OKAY) { + return res; + } + + if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { + goto ERR; + } + + if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { + goto ERR; + } + +ERR: + mp_clear(&tmp); + return res; +} + + +/* computes a = 2**b + * + * Simple algorithm which zeroes the int, grows it then just sets one bit + * as required. + */ +static int ICACHE_FLASH_ATTR +mp_2expt (mp_int * a, int b) +{ + int res; + + /* zero a as per default */ + mp_zero (a); + + /* grow a to accommodate the single bit */ + if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + + /* set the used count of where the bit will go */ + a->used = b / DIGIT_BIT + 1; + + /* put the single bit in its place */ + a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); + + return MP_OKAY; +} + + +/* pre-calculate the value required for Barrett reduction + * For a given modulus "b" it calulates the value required in "a" + */ +static int ICACHE_FLASH_ATTR +mp_reduce_setup (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { + return res; + } + return mp_div (a, b, a, NULL); +} + + +/* reduces x mod m, assumes 0 < x < m**2, mu is + * precomputed via mp_reduce_setup. + * From HAC pp.604 Algorithm 14.42 + */ +static int ICACHE_FLASH_ATTR +mp_reduce (mp_int * x, mp_int * m, mp_int * mu) +{ + mp_int q; + int res, um = m->used; + + /* q = x */ + if ((res = mp_init_copy (&q, x)) != MP_OKAY) { + return res; + } + + /* q1 = x / b**(k-1) */ + mp_rshd (&q, um - 1); + + /* according to HAC this optimization is ok */ + if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { + if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { + goto CLEANUP; + } + } else { +#ifdef BN_S_MP_MUL_HIGH_DIGS_C + if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) + if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#else + { +#error mp_reduce would always fail + res = MP_VAL; + goto CLEANUP; + } +#endif + } + + /* q3 = q2 / b**(k+1) */ + mp_rshd (&q, um + 1); + + /* x = x mod b**(k+1), quick (no division) */ + if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } + + /* q = q * m mod b**(k+1), quick (no division) */ + if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + + /* x = x - q */ + if ((res = mp_sub (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + + /* If x < 0, add b**(k+1) to it */ + if (mp_cmp_d (x, 0) == MP_LT) { + mp_set (&q, 1); + if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + if ((res = mp_add (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + } + + /* Back off if it's too big */ + while (mp_cmp (x, m) != MP_LT) { + if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { + goto CLEANUP; + } + } + +CLEANUP: + mp_clear (&q); + + return res; +} + + +/* multiplies |a| * |b| and only computes up to digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how + * many digits of output are created. + */ +static int ICACHE_FLASH_ATTR +s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ + if (((digs) < MP_WARRAY) && + MIN (a->used, b->used) < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, digs)) != MP_OKAY) { + return res; + } + t.used = digs; + + /* compute the digits of the product directly */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* set the carry to zero */ + u = 0; + + /* limit ourselves to making digs digits of output */ + pb = MIN (b->used, digs - ix); + + /* setup some aliases */ + /* copy of the digit from a used within the nested loop */ + tmpx = a->dp[ix]; + + /* an alias for the destination shifted ix places */ + tmpt = t.dp + ix; + + /* an alias for the digits of b */ + tmpy = b->dp; + + /* compute the columns of the output and propagate the carry */ + for (iy = 0; iy < pb; iy++) { + /* compute the column as a mp_word */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* the new column is the lower part of the result */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry word from the result */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + /* set carry if it is placed below digs */ + if (ix + iy < digs) { + *tmpt = u; + } + } + + mp_clamp (&t); + mp_exch (&t, c); + + mp_clear (&t); + return MP_OKAY; +} + + +/* Fast (comba) multiplier + * + * This is the fast column-array [comba] multiplier. It is + * designed to compute the columns of the product first + * then handle the carries afterwards. This has the effect + * of making the nested loops that compute the columns very + * simple and schedulable on super-scalar processors. + * + * This has been modified to produce a variable number of + * digits of output so if say only a half-product is required + * you don't have to compute the upper half (a feature + * required for fast Barrett reduction). + * + * Based on Algorithm 14.12 on pp.595 of HAC. + * + */ +static int ICACHE_FLASH_ATTR +fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY]; + register mp_word _W; + + /* grow the destination as required */ + if (c->alloc < digs) { + if ((res = mp_grow (c, digs)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + pa = MIN(digs, a->used + b->used); + + /* clear the carry */ + _W = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty; + int iy; + mp_digit *tmpx, *tmpy; + + /* get offsets into the two bignums */ + ty = MIN(b->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = b->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* execute loop */ + for (iz = 0; iz < iy; ++iz) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + + } + + /* store term */ + W[ix] = ((mp_digit)_W) & MP_MASK; + + /* make next carry */ + _W = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = c->used; + c->used = pa; + + { + register mp_digit *tmpc; + tmpc = c->dp; + for (ix = 0; ix < pa+1; ix++) { + /* now extract the previous digit [below the carry] */ + *tmpc++ = W[ix]; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + mp_clamp (c); + return MP_OKAY; +} + + +/* init an mp_init for a given size */ +static int ICACHE_FLASH_ATTR +mp_init_size (mp_int * a, int size) +{ + int x; + + /* pad size so there are always extra digits */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* alloc mem */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the members */ + a->used = 0; + a->alloc = size; + a->sign = MP_ZPOS; + + /* zero the digits */ + for (x = 0; x < size; x++) { + a->dp[x] = 0; + } + + return MP_OKAY; +} + + +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ +static int ICACHE_FLASH_ATTR +s_mp_sqr (mp_int * a, mp_int * b) +{ + mp_int t; + int res, ix, iy, pa; + mp_word r; + mp_digit u, tmpx, *tmpt; + + pa = a->used; + if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { + return res; + } + + /* default used is maximum possible size */ + t.used = 2*pa + 1; + + for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ + r = ((mp_word) t.dp[2*ix]) + + ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); + + /* store lower part in result */ + t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for where to store the results */ + tmpt = t.dp + (2*ix + 1); + + for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ + r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since it's easier to optimize + */ + r = ((mp_word) *tmpt) + r + r + ((mp_word) u); + + /* store lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + /* propagate upwards */ + while (u != ((mp_digit) 0)) { + r = ((mp_word) *tmpt) + ((mp_word) u); + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + } + + mp_clamp (&t); + mp_exch (&t, b); + mp_clear (&t); + return MP_OKAY; +} + + +/* multiplies |a| * |b| and does not compute the lower digs digits + * [meant to get the higher part of the product] + */ +static int ICACHE_FLASH_ATTR +s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ +#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C + if (((a->used + b->used + 1) < MP_WARRAY) + && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_high_digs (a, b, c, digs); + } +#endif + + if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { + return res; + } + t.used = a->used + b->used + 1; + + pa = a->used; + pb = b->used; + for (ix = 0; ix < pa; ix++) { + /* clear the carry */ + u = 0; + + /* left hand side of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ + tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ + tmpy = b->dp + (digs - ix); + + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* get the lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* carry the carry */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpt = u; + } + mp_clamp (&t); + mp_exch (&t, c); + mp_clear (&t); + return MP_OKAY; +} + + +#ifdef BN_MP_MONTGOMERY_SETUP_C +/* setups the montgomery reduction stuff */ +static int ICACHE_FLASH_ATTR +mp_montgomery_setup (mp_int * n, mp_digit * rho) +{ + mp_digit x, b; + +/* fast inversion mod 2**k + * + * Based on the fact that + * + * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) + * => 2*X*A - X*X*A*A = 1 + * => 2*(1) - (1) = 1 + */ + b = n->dp[0]; + + if ((b & 1) == 0) { + return MP_VAL; + } + + x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ + x *= 2 - b * x; /* here x*a==1 mod 2**8 */ +#if !defined(MP_8BIT) + x *= 2 - b * x; /* here x*a==1 mod 2**16 */ +#endif +#if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) + x *= 2 - b * x; /* here x*a==1 mod 2**32 */ +#endif +#ifdef MP_64BIT + x *= 2 - b * x; /* here x*a==1 mod 2**64 */ +#endif + + /* rho = -1/m mod b */ + *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; + + return MP_OKAY; +} +#endif + + +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C +/* computes xR**-1 == x (mod N) via Montgomery Reduction + * + * This is an optimized implementation of montgomery_reduce + * which uses the comba method to quickly calculate the columns of the + * reduction. + * + * Based on Algorithm 14.32 on pp.601 of HAC. +*/ +int ICACHE_FLASH_ATTR +fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, olduse; + mp_word W[MP_WARRAY]; + + /* get old used count */ + olduse = x->used; + + /* grow a as required */ + if (x->alloc < n->used + 1) { + if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { + return res; + } + } + + /* first we have to get the digits of the input into + * an array of double precision words W[...] + */ + { + register mp_word *_W; + register mp_digit *tmpx; + + /* alias for the W[] array */ + _W = W; + + /* alias for the digits of x*/ + tmpx = x->dp; + + /* copy the digits of a into W[0..a->used-1] */ + for (ix = 0; ix < x->used; ix++) { + *_W++ = *tmpx++; + } + + /* zero the high words of W[a->used..m->used*2] */ + for (; ix < n->used * 2 + 1; ix++) { + *_W++ = 0; + } + } + + /* now we proceed to zero successive digits + * from the least significant upwards + */ + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * m' mod b + * + * We avoid a double precision multiplication (which isn't required) + * by casting the value down to a mp_digit. Note this requires + * that W[ix-1] have the carry cleared (see after the inner loop) + */ + register mp_digit mu; + mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); + + /* a = a + mu * m * b**i + * + * This is computed in place and on the fly. The multiplication + * by b**i is handled by offseting which columns the results + * are added to. + * + * Note the comba method normally doesn't handle carries in the + * inner loop In this case we fix the carry from the previous + * column since the Montgomery reduction requires digits of the + * result (so far) [see above] to work. This is + * handled by fixing up one carry after the inner loop. The + * carry fixups are done in order so after these loops the + * first m->used words of W[] have the carries fixed + */ + { + register int iy; + register mp_digit *tmpn; + register mp_word *_W; + + /* alias for the digits of the modulus */ + tmpn = n->dp; + + /* Alias for the columns set by an offset of ix */ + _W = W + ix; + + /* inner loop */ + for (iy = 0; iy < n->used; iy++) { + *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); + } + } + + /* now fix carry for next digit, W[ix+1] */ + W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); + } + + /* now we have to propagate the carries and + * shift the words downward [all those least + * significant digits we zeroed]. + */ + { + register mp_digit *tmpx; + register mp_word *_W, *_W1; + + /* nox fix rest of carries */ + + /* alias for current word */ + _W1 = W + ix; + + /* alias for next word, where the carry goes */ + _W = W + ++ix; + + for (; ix <= n->used * 2 + 1; ix++) { + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); + } + + /* copy out, A = A/b**n + * + * The result is A/b**n but instead of converting from an + * array of mp_word to mp_digit than calling mp_rshd + * we just copy them in the right order + */ + + /* alias for destination word */ + tmpx = x->dp; + + /* alias for shifted double precision result */ + _W = W + n->used; + + for (ix = 0; ix < n->used + 1; ix++) { + *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); + } + + /* zero oldused digits, if the input a was larger than + * m->used+1 we'll have to clear the digits + */ + for (; ix < olduse; ix++) { + *tmpx++ = 0; + } + } + + /* set the max used and clamp */ + x->used = n->used + 1; + mp_clamp (x); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MUL_2_C +/* b = a*2 */ +static int ICACHE_FLASH_ATTR +mp_mul_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* grow to accommodate result */ + if (b->alloc < a->used + 1) { + if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* alias for source */ + tmpa = a->dp; + + /* alias for dest */ + tmpb = b->dp; + + /* carry */ + r = 0; + for (x = 0; x < a->used; x++) { + + /* get what will be the *next* carry bit from the + * MSB of the current digit + */ + rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); + + /* now shift up this digit, add in the carry [from the previous] */ + *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; + + /* copy the carry that would be from the source + * digit into the next iteration + */ + r = rr; + } + + /* new leading digit? */ + if (r != 0) { + /* add a MSB which is always 1 at this point */ + *tmpb = 1; + ++(b->used); + } + + /* now zero any excess digits on the destination + * that we didn't write to + */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +/* + * shifts with subtractions when the result is greater than b. + * + * The method is slightly modified to shift B unconditionally up to just under + * the leading bit of b. This saves a lot of multiple precision shifting. + */ +static int ICACHE_FLASH_ATTR +mp_montgomery_calc_normalization (mp_int * a, mp_int * b) +{ + int x, bits, res; + + /* how many bits of last digit does b use */ + bits = mp_count_bits (b) % DIGIT_BIT; + + if (b->used > 1) { + if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { + return res; + } + } else { + mp_set(a, 1); + bits = 1; + } + + + /* now compute C = A * B mod b */ + for (x = bits - 1; x < (int)DIGIT_BIT; x++) { + if ((res = mp_mul_2 (a, a)) != MP_OKAY) { + return res; + } + if (mp_cmp_mag (a, b) != MP_LT) { + if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { + return res; + } + } + } + + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_EXPTMOD_FAST_C +/* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + * + * Uses Montgomery or Diminished Radix reduction [whichever appropriate] + */ + +static int ICACHE_FLASH_ATTR +mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res; + mp_digit buf, mp; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* use a pointer to the reduction algorithm. This allows us to use + * one of many reduction algorithms without modding the guts of + * the code with if statements everywhere. + */ + int (*redux)(mp_int*,mp_int*,mp_digit); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* determine and setup reduction code */ + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_SETUP_C + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto LBL_M; + } +#else + err = MP_VAL; + goto LBL_M; +#endif + + /* automatically pick the comba one if available (saves quite a few calls/ifs) */ +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C + if (((P->used * 2 + 1) < MP_WARRAY) && + P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + redux = fast_mp_montgomery_reduce; + } else +#endif + { +#ifdef BN_MP_MONTGOMERY_REDUCE_C + /* use slower baseline Montgomery method */ + redux = mp_montgomery_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + } else if (redmode == 1) { +#if defined(BN_MP_DR_SETUP_C) && defined(BN_MP_DR_REDUCE_C) + /* setup DR reduction for moduli of the form B**k - b */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } else { +#if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) + /* setup DR reduction for moduli of the form 2**k - b */ + if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { + goto LBL_M; + } + redux = mp_reduce_2k; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_M; + } + + /* create M table + * + + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto LBL_RES; + } +#else + err = MP_VAL; + goto LBL_RES; +#endif + + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } + + /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits so break */ + if (digidx == -1) { + break; + } + /* read next digit and reset bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int)DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* get next bit of the window */ + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + if (redmode == 0) { + /* fixup result if Montgomery reduction is used + * recall that any value in a Montgomery system is + * actually multiplied by R mod n. So we have + * to reduce one more time to cancel out the factor + * of R. + */ + if ((err = redux(&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* swap res with Y */ + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} +#endif + + +#ifdef BN_FAST_S_MP_SQR_C +/* the jist of squaring... + * you do like mult except the offset of the tmpx [one that + * starts closer to zero] can't equal the offset of tmpy. + * So basically you set up iy like before then you min it with + * (ty-tx) so that it never happens. You double all those + * you add in the inner loop + +After that loop you do the squares and add them in. +*/ + +static int ICACHE_FLASH_ATTR +fast_s_mp_sqr (mp_int * a, mp_int * b) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY], *tmpx; + mp_word W1; + + /* grow the destination as required */ + pa = a->used + a->used; + if (b->alloc < pa) { + if ((res = mp_grow (b, pa)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + W1 = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty, iy; + mp_word _W; + mp_digit *tmpy; + + /* clear counter */ + _W = 0; + + /* get offsets into the two bignums */ + ty = MIN(a->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = a->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* now for squaring tx can never equal ty + * we halve the distance since they approach at a rate of 2x + * and we have to round because odd cases need to be executed + */ + iy = MIN(iy, (ty-tx+1)>>1); + + /* execute loop */ + for (iz = 0; iz < iy; iz++) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + } + + /* double the inner product and add carry */ + _W = _W + _W + W1; + + /* even columns have the square term in them */ + if ((ix&1) == 0) { + _W += ((mp_word)a->dp[ix>>1])*((mp_word)a->dp[ix>>1]); + } + + /* store it */ + W[ix] = (mp_digit)(_W & MP_MASK); + + /* make next carry */ + W1 = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = b->used; + b->used = a->used+a->used; + + { + mp_digit *tmpb; + tmpb = b->dp; + for (ix = 0; ix < pa; ix++) { + *tmpb++ = W[ix] & MP_MASK; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpb++ = 0; + } + } + mp_clamp (b); + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MUL_D_C +/* multiply by a digit */ +static int ICACHE_FLASH_ATTR +mp_mul_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_digit u, *tmpa, *tmpc; + mp_word r; + int ix, res, olduse; + + /* make sure c is big enough to hold a*b */ + if (c->alloc < a->used + 1) { + if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { + return res; + } + } + + /* get the original destinations used count */ + olduse = c->used; + + /* set the sign */ + c->sign = a->sign; + + /* alias for a->dp [source] */ + tmpa = a->dp; + + /* alias for c->dp [dest] */ + tmpc = c->dp; + + /* zero carry */ + u = 0; + + /* compute columns */ + for (ix = 0; ix < a->used; ix++) { + /* compute product and carry sum for this term */ + r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b); + + /* mask off higher bits to get a single digit */ + *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* send carry into next iteration */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + + /* store final carry [if any] and increment ix offset */ + *tmpc++ = u; + ++ix; + + /* now zero digits above the top */ + while (ix++ < olduse) { + *tmpc++ = 0; + } + + /* set used count */ + c->used = a->used + 1; + mp_clamp(c); + + return MP_OKAY; +} +#endif diff --git a/components/wpa_supplicant/include/wpa2/tls/pkcs1.h b/components/wpa_supplicant/include/wpa2/tls/pkcs1.h new file mode 100644 index 000000000..ed64defaa --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/pkcs1.h @@ -0,0 +1,22 @@ +/* + * PKCS #1 (RSA Encryption) + * Copyright (c) 2006-2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef PKCS1_H +#define PKCS1_H + +int pkcs1_encrypt(int block_type, struct crypto_rsa_key *key, + int use_private, const u8 *in, size_t inlen, + u8 *out, size_t *outlen); +int pkcs1_v15_private_key_decrypt(struct crypto_rsa_key *key, + const u8 *in, size_t inlen, + u8 *out, size_t *outlen); +int pkcs1_decrypt_public_key(struct crypto_rsa_key *key, + const u8 *crypt, size_t crypt_len, + u8 *plain, size_t *plain_len); + +#endif /* PKCS1_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/pkcs5.h b/components/wpa_supplicant/include/wpa2/tls/pkcs5.h new file mode 100644 index 000000000..20ddadc45 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/pkcs5.h @@ -0,0 +1,16 @@ +/* + * PKCS #5 (Password-based Encryption) + * Copyright (c) 2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef PKCS5_H +#define PKCS5_H + +u8 * pkcs5_decrypt(const u8 *enc_alg, size_t enc_alg_len, + const u8 *enc_data, size_t enc_data_len, + const char *passwd, size_t *data_len); + +#endif /* PKCS5_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/pkcs8.h b/components/wpa_supplicant/include/wpa2/tls/pkcs8.h new file mode 100644 index 000000000..bebf840ba --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/pkcs8.h @@ -0,0 +1,16 @@ +/* + * PKCS #8 (Private-key information syntax) + * Copyright (c) 2006-2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef PKCS8_H +#define PKCS8_H + +struct crypto_private_key * pkcs8_key_import(const u8 *buf, size_t len); +struct crypto_private_key * +pkcs8_enc_key_import(const u8 *buf, size_t len, const char *passwd); + +#endif /* PKCS8_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/rsa.h b/components/wpa_supplicant/include/wpa2/tls/rsa.h new file mode 100644 index 000000000..c236a9df4 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/rsa.h @@ -0,0 +1,23 @@ +/* + * RSA + * Copyright (c) 2006, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef RSA_H +#define RSA_H + +struct crypto_rsa_key; + +struct crypto_rsa_key * +crypto_rsa_import_public_key(const u8 *buf, size_t len); +struct crypto_rsa_key * +crypto_rsa_import_private_key(const u8 *buf, size_t len); +size_t crypto_rsa_get_modulus_len(struct crypto_rsa_key *key); +int crypto_rsa_exptmod(const u8 *in, size_t inlen, u8 *out, size_t *outlen, + struct crypto_rsa_key *key, int use_private); +void crypto_rsa_free(struct crypto_rsa_key *key); + +#endif /* RSA_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tls.h b/components/wpa_supplicant/include/wpa2/tls/tls.h new file mode 100644 index 000000000..983999b51 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tls.h @@ -0,0 +1,537 @@ +/* + * SSL/TLS interface definition + * Copyright (c) 2004-2013, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLS_H +#define TLS_H + +struct tls_connection; + +struct tls_keys { + const u8 *master_key; /* TLS master secret */ + size_t master_key_len; + const u8 *client_random; + size_t client_random_len; + const u8 *server_random; + size_t server_random_len; +}; + +enum tls_event { + TLS_CERT_CHAIN_SUCCESS, + TLS_CERT_CHAIN_FAILURE, + TLS_PEER_CERTIFICATE, + TLS_ALERT +}; + +/* + * Note: These are used as identifier with external programs and as such, the + * values must not be changed. + */ +enum tls_fail_reason { + TLS_FAIL_UNSPECIFIED = 0, + TLS_FAIL_UNTRUSTED = 1, + TLS_FAIL_REVOKED = 2, + TLS_FAIL_NOT_YET_VALID = 3, + TLS_FAIL_EXPIRED = 4, + TLS_FAIL_SUBJECT_MISMATCH = 5, + TLS_FAIL_ALTSUBJECT_MISMATCH = 6, + TLS_FAIL_BAD_CERTIFICATE = 7, + TLS_FAIL_SERVER_CHAIN_PROBE = 8 +}; + +union tls_event_data { + struct { + int depth; + const char *subject; + enum tls_fail_reason reason; + const char *reason_txt; + const struct wpabuf *cert; + } cert_fail; + + struct { + int depth; + const char *subject; + const struct wpabuf *cert; + const u8 *hash; + size_t hash_len; + } peer_cert; + + struct { + int is_local; + const char *type; + const char *description; + } alert; +}; + +struct tls_config { + const char *opensc_engine_path; + const char *pkcs11_engine_path; + const char *pkcs11_module_path; + int fips_mode; + int cert_in_cb; + + void (*event_cb)(void *ctx, enum tls_event ev, + union tls_event_data *data); + void *cb_ctx; +}; + +#define TLS_CONN_ALLOW_SIGN_RSA_MD5 BIT(0) +#define TLS_CONN_DISABLE_TIME_CHECKS BIT(1) +#define TLS_CONN_DISABLE_SESSION_TICKET BIT(2) +#define TLS_CONN_REQUEST_OCSP BIT(3) +#define TLS_CONN_REQUIRE_OCSP BIT(4) + +/** + * struct tls_connection_params - Parameters for TLS connection + * @ca_cert: File or reference name for CA X.509 certificate in PEM or DER + * format + * @ca_cert_blob: ca_cert as inlined data or %NULL if not used + * @ca_cert_blob_len: ca_cert_blob length + * @ca_path: Path to CA certificates (OpenSSL specific) + * @subject_match: String to match in the subject of the peer certificate or + * %NULL to allow all subjects + * @altsubject_match: String to match in the alternative subject of the peer + * certificate or %NULL to allow all alternative subjects + * @client_cert: File or reference name for client X.509 certificate in PEM or + * DER format + * @client_cert_blob: client_cert as inlined data or %NULL if not used + * @client_cert_blob_len: client_cert_blob length + * @private_key: File or reference name for client private key in PEM or DER + * format (traditional format (RSA PRIVATE KEY) or PKCS#8 (PRIVATE KEY) + * @private_key_blob: private_key as inlined data or %NULL if not used + * @private_key_blob_len: private_key_blob length + * @private_key_passwd: Passphrase for decrypted private key, %NULL if no + * passphrase is used. + * @dh_file: File name for DH/DSA data in PEM format, or %NULL if not used + * @dh_blob: dh_file as inlined data or %NULL if not used + * @dh_blob_len: dh_blob length + * @engine: 1 = use engine (e.g., a smartcard) for private key operations + * (this is OpenSSL specific for now) + * @engine_id: engine id string (this is OpenSSL specific for now) + * @ppin: pointer to the pin variable in the configuration + * (this is OpenSSL specific for now) + * @key_id: the private key's id when using engine (this is OpenSSL + * specific for now) + * @cert_id: the certificate's id when using engine + * @ca_cert_id: the CA certificate's id when using engine + * @flags: Parameter options (TLS_CONN_*) + * @ocsp_stapling_response: DER encoded file with cached OCSP stapling response + * or %NULL if OCSP is not enabled + * + * TLS connection parameters to be configured with tls_connection_set_params() + * and tls_global_set_params(). + * + * Certificates and private key can be configured either as a reference name + * (file path or reference to certificate store) or by providing the same data + * as a pointer to the data in memory. Only one option will be used for each + * field. + */ +struct tls_connection_params { + const char *ca_cert; + const u8 *ca_cert_blob; + size_t ca_cert_blob_len; + const char *ca_path; + const char *subject_match; + const char *altsubject_match; + const char *client_cert; + const u8 *client_cert_blob; + size_t client_cert_blob_len; + const char *private_key; + const u8 *private_key_blob; + size_t private_key_blob_len; + const char *private_key_passwd; + const char *dh_file; + const u8 *dh_blob; + size_t dh_blob_len; + + /* OpenSSL specific variables */ + int engine; + const char *engine_id; + const char *pin; + const char *key_id; + const char *cert_id; + const char *ca_cert_id; + + unsigned int flags; + const char *ocsp_stapling_response; +}; + + +/** + * tls_init - Initialize TLS library + * @conf: Configuration data for TLS library + * Returns: Context data to be used as tls_ctx in calls to other functions, + * or %NULL on failure. + * + * Called once during program startup and once for each RSN pre-authentication + * session. In other words, there can be two concurrent TLS contexts. If global + * library initialization is needed (i.e., one that is shared between both + * authentication types), the TLS library wrapper should maintain a reference + * counter and do global initialization only when moving from 0 to 1 reference. + */ +void * tls_init(void); + +/** + * tls_deinit - Deinitialize TLS library + * @tls_ctx: TLS context data from tls_init() + * + * Called once during program shutdown and once for each RSN pre-authentication + * session. If global library deinitialization is needed (i.e., one that is + * shared between both authentication types), the TLS library wrapper should + * maintain a reference counter and do global deinitialization only when moving + * from 1 to 0 references. + */ +void tls_deinit(void *tls_ctx); + +/** + * tls_get_errors - Process pending errors + * @tls_ctx: TLS context data from tls_init() + * Returns: Number of found error, 0 if no errors detected. + * + * Process all pending TLS errors. + */ +int tls_get_errors(void *tls_ctx); + +/** + * tls_connection_init - Initialize a new TLS connection + * @tls_ctx: TLS context data from tls_init() + * Returns: Connection context data, conn for other function calls + */ +struct tls_connection * tls_connection_init(void *tls_ctx); + +/** + * tls_connection_deinit - Free TLS connection data + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * + * Release all resources allocated for TLS connection. + */ +void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn); + +/** + * tls_connection_established - Has the TLS connection been completed? + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: 1 if TLS connection has been completed, 0 if not. + */ +int tls_connection_established(void *tls_ctx, struct tls_connection *conn); + +/** + * tls_connection_shutdown - Shutdown TLS connection + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: 0 on success, -1 on failure + * + * Shutdown current TLS connection without releasing all resources. New + * connection can be started by using the same conn without having to call + * tls_connection_init() or setting certificates etc. again. The new + * connection should try to use session resumption. + */ +int tls_connection_shutdown(void *tls_ctx, struct tls_connection *conn); + +enum { + TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED = -3, + TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED = -2 +}; + +/** + * tls_connection_set_params - Set TLS connection parameters + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @params: Connection parameters + * Returns: 0 on success, -1 on failure, + * TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED (-2) on possible PIN error causing + * PKCS#11 engine failure, or + * TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED (-3) on failure to verify the + * PKCS#11 engine private key. + */ +int __must_check +tls_connection_set_params(void *tls_ctx, struct tls_connection *conn, + const struct tls_connection_params *params); + +/** + * tls_global_set_params - Set TLS parameters for all TLS connection + * @tls_ctx: TLS context data from tls_init() + * @params: Global TLS parameters + * Returns: 0 on success, -1 on failure, + * TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED (-2) on possible PIN error causing + * PKCS#11 engine failure, or + * TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED (-3) on failure to verify the + * PKCS#11 engine private key. + */ +int __must_check tls_global_set_params( + void *tls_ctx, const struct tls_connection_params *params); + +/** + * tls_global_set_verify - Set global certificate verification options + * @tls_ctx: TLS context data from tls_init() + * @check_crl: 0 = do not verify CRLs, 1 = verify CRL for the user certificate, + * 2 = verify CRL for all certificates + * Returns: 0 on success, -1 on failure + */ +int __must_check tls_global_set_verify(void *tls_ctx, int check_crl); + +/** + * tls_connection_set_verify - Set certificate verification options + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @verify_peer: 1 = verify peer certificate + * Returns: 0 on success, -1 on failure + */ +int __must_check tls_connection_set_verify(void *tls_ctx, + struct tls_connection *conn, + int verify_peer); + +/** + * tls_connection_get_keys - Get master key and random data from TLS connection + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @keys: Structure of key/random data (filled on success) + * Returns: 0 on success, -1 on failure + */ +int __must_check tls_connection_get_keys(void *tls_ctx, + struct tls_connection *conn, + struct tls_keys *keys); + +/** + * tls_connection_prf - Use TLS-PRF to derive keying material + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @label: Label (e.g., description of the key) for PRF + * @server_random_first: seed is 0 = client_random|server_random, + * 1 = server_random|client_random + * @out: Buffer for output data from TLS-PRF + * @out_len: Length of the output buffer + * Returns: 0 on success, -1 on failure + * + * This function is optional to implement if tls_connection_get_keys() provides + * access to master secret and server/client random values. If these values are + * not exported from the TLS library, tls_connection_prf() is required so that + * further keying material can be derived from the master secret. If not + * implemented, the function will still need to be defined, but it can just + * return -1. Example implementation of this function is in tls_prf_sha1_md5() + * when it is called with seed set to client_random|server_random (or + * server_random|client_random). + */ +int __must_check tls_connection_prf(void *tls_ctx, + struct tls_connection *conn, + const char *label, + int server_random_first, + u8 *out, size_t out_len); + +/** + * tls_connection_handshake - Process TLS handshake (client side) + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @in_data: Input data from TLS server + * @appl_data: Pointer to application data pointer, or %NULL if dropped + * Returns: Output data, %NULL on failure + * + * The caller is responsible for freeing the returned output data. If the final + * handshake message includes application data, this is decrypted and + * appl_data (if not %NULL) is set to point this data. The caller is + * responsible for freeing appl_data. + * + * This function is used during TLS handshake. The first call is done with + * in_data == %NULL and the library is expected to return ClientHello packet. + * This packet is then send to the server and a response from server is given + * to TLS library by calling this function again with in_data pointing to the + * TLS message from the server. + * + * If the TLS handshake fails, this function may return %NULL. However, if the + * TLS library has a TLS alert to send out, that should be returned as the + * output data. In this case, tls_connection_get_failed() must return failure + * (> 0). + * + * tls_connection_established() should return 1 once the TLS handshake has been + * completed successfully. + */ +struct wpabuf * tls_connection_handshake(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data, + struct wpabuf **appl_data); + +struct wpabuf * tls_connection_handshake2(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data, + struct wpabuf **appl_data, + int *more_data_needed); + +/** + * tls_connection_server_handshake - Process TLS handshake (server side) + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @in_data: Input data from TLS peer + * @appl_data: Pointer to application data pointer, or %NULL if dropped + * Returns: Output data, %NULL on failure + * + * The caller is responsible for freeing the returned output data. + */ +struct wpabuf * tls_connection_server_handshake(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data, + struct wpabuf **appl_data); + +/** + * tls_connection_encrypt - Encrypt data into TLS tunnel + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @in_data: Plaintext data to be encrypted + * Returns: Encrypted TLS data or %NULL on failure + * + * This function is used after TLS handshake has been completed successfully to + * send data in the encrypted tunnel. The caller is responsible for freeing the + * returned output data. + */ +struct wpabuf * tls_connection_encrypt(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data); + +/** + * tls_connection_decrypt - Decrypt data from TLS tunnel + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @in_data: Encrypted TLS data + * Returns: Decrypted TLS data or %NULL on failure + * + * This function is used after TLS handshake has been completed successfully to + * receive data from the encrypted tunnel. The caller is responsible for + * freeing the returned output data. + */ +struct wpabuf * tls_connection_decrypt(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data); + +struct wpabuf * tls_connection_decrypt2(void *tls_ctx, + struct tls_connection *conn, + const struct wpabuf *in_data, + int *more_data_needed); + +/** + * tls_connection_resumed - Was session resumption used + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: 1 if current session used session resumption, 0 if not + */ +int tls_connection_resumed(void *tls_ctx, struct tls_connection *conn); + +enum { + TLS_CIPHER_NONE, + TLS_CIPHER_RC4_SHA /* 0x0005 */, + TLS_CIPHER_AES128_SHA /* 0x002f */, + TLS_CIPHER_RSA_DHE_AES128_SHA /* 0x0031 */, + TLS_CIPHER_ANON_DH_AES128_SHA /* 0x0034 */ +}; + +/** + * tls_connection_set_cipher_list - Configure acceptable cipher suites + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @ciphers: Zero (TLS_CIPHER_NONE) terminated list of allowed ciphers + * (TLS_CIPHER_*). + * Returns: 0 on success, -1 on failure + */ +int __must_check tls_connection_set_cipher_list(void *tls_ctx, + struct tls_connection *conn, + u8 *ciphers); + +/** + * tls_get_cipher - Get current cipher name + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @buf: Buffer for the cipher name + * @buflen: buf size + * Returns: 0 on success, -1 on failure + * + * Get the name of the currently used cipher. + */ +int __must_check tls_get_cipher(void *tls_ctx, struct tls_connection *conn, + char *buf, size_t buflen); + +/** + * tls_connection_enable_workaround - Enable TLS workaround options + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: 0 on success, -1 on failure + * + * This function is used to enable connection-specific workaround options for + * buffer SSL/TLS implementations. + */ +int __must_check tls_connection_enable_workaround(void *tls_ctx, + struct tls_connection *conn); + +/** + * tls_connection_client_hello_ext - Set TLS extension for ClientHello + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * @ext_type: Extension type + * @data: Extension payload (%NULL to remove extension) + * @data_len: Extension payload length + * Returns: 0 on success, -1 on failure + */ +int __must_check tls_connection_client_hello_ext(void *tls_ctx, + struct tls_connection *conn, + int ext_type, const u8 *data, + size_t data_len); + +/** + * tls_connection_get_failed - Get connection failure status + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * + * Returns >0 if connection has failed, 0 if not. + */ +int tls_connection_get_failed(void *tls_ctx, struct tls_connection *conn); + +/** + * tls_connection_get_read_alerts - Get connection read alert status + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: Number of times a fatal read (remote end reported error) has + * happened during this connection. + */ +int tls_connection_get_read_alerts(void *tls_ctx, struct tls_connection *conn); + +/** + * tls_connection_get_write_alerts - Get connection write alert status + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: Number of times a fatal write (locally detected error) has happened + * during this connection. + */ +int tls_connection_get_write_alerts(void *tls_ctx, + struct tls_connection *conn); + +/** + * tls_connection_get_keyblock_size - Get TLS key_block size + * @tls_ctx: TLS context data from tls_init() + * @conn: Connection context data from tls_connection_init() + * Returns: Size of the key_block for the negotiated cipher suite or -1 on + * failure + */ +int tls_connection_get_keyblock_size(void *tls_ctx, + struct tls_connection *conn); + +/** + * tls_capabilities - Get supported TLS capabilities + * @tls_ctx: TLS context data from tls_init() + * Returns: Bit field of supported TLS capabilities (TLS_CAPABILITY_*) + */ +unsigned int tls_capabilities(void *tls_ctx); + +typedef int (*tls_session_ticket_cb) +(void *ctx, const u8 *ticket, size_t len, const u8 *client_random, + const u8 *server_random, u8 *master_secret); + +int __must_check tls_connection_set_session_ticket_cb( + void *tls_ctx, struct tls_connection *conn, + tls_session_ticket_cb cb, void *ctx); + +int tls_prf_sha1_md5(const u8 *secret, size_t secret_len, const char *label, + const u8 *seed, size_t seed_len, u8 *out, size_t outlen); + +#endif /* TLS_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_client.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_client.h new file mode 100644 index 000000000..8ec85f1a9 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_client.h @@ -0,0 +1,54 @@ +/* + * TLS v1.0/v1.1/v1.2 client (RFC 2246, RFC 4346, RFC 5246) + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_CLIENT_H +#define TLSV1_CLIENT_H + +#include "tlsv1_cred.h" + +struct tlsv1_client; + +int tlsv1_client_global_init(void); +void tlsv1_client_global_deinit(void); +struct tlsv1_client * tlsv1_client_init(void); +void tlsv1_client_deinit(struct tlsv1_client *conn); +int tlsv1_client_established(struct tlsv1_client *conn); +int tlsv1_client_prf(struct tlsv1_client *conn, const char *label, + int server_random_first, u8 *out, size_t out_len); +u8 * tlsv1_client_handshake(struct tlsv1_client *conn, + const u8 *in_data, size_t in_len, + size_t *out_len, u8 **appl_data, + size_t *appl_data_len, int *need_more_data); +int tlsv1_client_encrypt(struct tlsv1_client *conn, + const u8 *in_data, size_t in_len, + u8 *out_data, size_t out_len); +struct wpabuf * tlsv1_client_decrypt(struct tlsv1_client *conn, + const u8 *in_data, size_t in_len, + int *need_more_data); +int tlsv1_client_get_cipher(struct tlsv1_client *conn, char *buf, + size_t buflen); +int tlsv1_client_shutdown(struct tlsv1_client *conn); +int tlsv1_client_resumed(struct tlsv1_client *conn); +int tlsv1_client_hello_ext(struct tlsv1_client *conn, int ext_type, + const u8 *data, size_t data_len); +int tlsv1_client_get_keys(struct tlsv1_client *conn, struct tls_keys *keys); +int tlsv1_client_get_keyblock_size(struct tlsv1_client *conn); +int tlsv1_client_set_cipher_list(struct tlsv1_client *conn, u8 *ciphers); +int tlsv1_client_set_cred(struct tlsv1_client *conn, + struct tlsv1_credentials *cred); +void tlsv1_client_set_time_checks(struct tlsv1_client *conn, int enabled); + +typedef int (*tlsv1_client_session_ticket_cb) +(void *ctx, const u8 *ticket, size_t len, const u8 *client_random, + const u8 *server_random, u8 *master_secret); + +void tlsv1_client_set_session_ticket_cb(struct tlsv1_client *conn, + tlsv1_client_session_ticket_cb cb, + void *ctx); + +#endif /* TLSV1_CLIENT_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_client_i.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_client_i.h new file mode 100644 index 000000000..55fdcf8d0 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_client_i.h @@ -0,0 +1,84 @@ +/* + * TLSv1 client - internal structures + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_CLIENT_I_H +#define TLSV1_CLIENT_I_H + +struct tlsv1_client { + enum { + CLIENT_HELLO, SERVER_HELLO, SERVER_CERTIFICATE, + SERVER_KEY_EXCHANGE, SERVER_CERTIFICATE_REQUEST, + SERVER_HELLO_DONE, CLIENT_KEY_EXCHANGE, CHANGE_CIPHER_SPEC, + SERVER_CHANGE_CIPHER_SPEC, SERVER_FINISHED, ACK_FINISHED, + ESTABLISHED, FAILED + } state; + + struct tlsv1_record_layer rl; + + u8 session_id[TLS_SESSION_ID_MAX_LEN]; + size_t session_id_len; + u8 client_random[TLS_RANDOM_LEN]; + u8 server_random[TLS_RANDOM_LEN]; + u8 master_secret[TLS_MASTER_SECRET_LEN]; + + u8 alert_level; + u8 alert_description; + + unsigned int certificate_requested:1; + unsigned int session_resumed:1; + unsigned int session_ticket_included:1; + unsigned int use_session_ticket:1; + unsigned int disable_time_checks:1; + + struct crypto_public_key *server_rsa_key; + + struct tls_verify_hash verify; + +#define MAX_CIPHER_COUNT 30 + u16 cipher_suites[MAX_CIPHER_COUNT]; + size_t num_cipher_suites; + + u16 prev_cipher_suite; + + u8 *client_hello_ext; + size_t client_hello_ext_len; + + /* The prime modulus used for Diffie-Hellman */ + u8 *dh_p; + size_t dh_p_len; + /* The generator used for Diffie-Hellman */ + u8 *dh_g; + size_t dh_g_len; + /* The server's Diffie-Hellman public value */ + u8 *dh_ys; + size_t dh_ys_len; + + struct tlsv1_credentials *cred; + + tlsv1_client_session_ticket_cb session_ticket_cb; + void *session_ticket_cb_ctx; + + struct wpabuf *partial_input; +}; + + +void tls_alert(struct tlsv1_client *conn, u8 level, u8 description); +void tlsv1_client_free_dh(struct tlsv1_client *conn); +int tls_derive_pre_master_secret(u8 *pre_master_secret); +int tls_derive_keys(struct tlsv1_client *conn, + const u8 *pre_master_secret, size_t pre_master_secret_len); +u8 * tls_send_client_hello(struct tlsv1_client *conn, size_t *out_len); +u8 * tlsv1_client_send_alert(struct tlsv1_client *conn, u8 level, + u8 description, size_t *out_len); +u8 * tlsv1_client_handshake_write(struct tlsv1_client *conn, size_t *out_len, + int no_appl_data); +int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct, + const u8 *buf, size_t *len, + u8 **out_data, size_t *out_len); + +#endif /* TLSV1_CLIENT_I_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_common.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_common.h new file mode 100644 index 000000000..f28c0cdc4 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_common.h @@ -0,0 +1,261 @@ +/* + * TLSv1 common definitions + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_COMMON_H +#define TLSV1_COMMON_H + +#include "crypto/crypto.h" + +#define TLS_VERSION_1 0x0301 /* TLSv1 */ +#define TLS_VERSION_1_1 0x0302 /* TLSv1.1 */ +#define TLS_VERSION_1_2 0x0303 /* TLSv1.2 */ +#ifdef CONFIG_TLSV12 +#define TLS_VERSION TLS_VERSION_1_2 +#else /* CONFIG_TLSV12 */ +#ifdef CONFIG_TLSV11 +#define TLS_VERSION TLS_VERSION_1_1 +#else /* CONFIG_TLSV11 */ +#define TLS_VERSION TLS_VERSION_1 +#endif /* CONFIG_TLSV11 */ +#endif /* CONFIG_TLSV12 */ +#define TLS_RANDOM_LEN 32 +#define TLS_PRE_MASTER_SECRET_LEN 48 +#define TLS_MASTER_SECRET_LEN 48 +#define TLS_SESSION_ID_MAX_LEN 32 +#define TLS_VERIFY_DATA_LEN 12 + +/* HandshakeType */ +enum { + TLS_HANDSHAKE_TYPE_HELLO_REQUEST = 0, + TLS_HANDSHAKE_TYPE_CLIENT_HELLO = 1, + TLS_HANDSHAKE_TYPE_SERVER_HELLO = 2, + TLS_HANDSHAKE_TYPE_NEW_SESSION_TICKET = 4 /* RFC 4507 */, + TLS_HANDSHAKE_TYPE_CERTIFICATE = 11, + TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE = 12, + TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST = 13, + TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE = 14, + TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY = 15, + TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE = 16, + TLS_HANDSHAKE_TYPE_FINISHED = 20, + TLS_HANDSHAKE_TYPE_CERTIFICATE_URL = 21 /* RFC 4366 */, + TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS = 22 /* RFC 4366 */ +}; + +/* CipherSuite */ +#define TLS_NULL_WITH_NULL_NULL 0x0000 /* RFC 2246 */ +#define TLS_RSA_WITH_NULL_MD5 0x0001 /* RFC 2246 */ +#define TLS_RSA_WITH_NULL_SHA 0x0002 /* RFC 2246 */ +#define TLS_RSA_EXPORT_WITH_RC4_40_MD5 0x0003 /* RFC 2246 */ +#define TLS_RSA_WITH_RC4_128_MD5 0x0004 /* RFC 2246 */ +#define TLS_RSA_WITH_RC4_128_SHA 0x0005 /* RFC 2246 */ +#define TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 0x0006 /* RFC 2246 */ +#define TLS_RSA_WITH_IDEA_CBC_SHA 0x0007 /* RFC 2246 */ +#define TLS_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0008 /* RFC 2246 */ +#define TLS_RSA_WITH_DES_CBC_SHA 0x0009 /* RFC 2246 */ +#define TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x000A /* RFC 2246 */ +#define TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA 0x000B /* RFC 2246 */ +#define TLS_DH_DSS_WITH_DES_CBC_SHA 0x000C /* RFC 2246 */ +#define TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA 0x000D /* RFC 2246 */ +#define TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA 0x000E /* RFC 2246 */ +#define TLS_DH_RSA_WITH_DES_CBC_SHA 0x000F /* RFC 2246 */ +#define TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA 0x0010 /* RFC 2246 */ +#define TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA 0x0011 /* RFC 2246 */ +#define TLS_DHE_DSS_WITH_DES_CBC_SHA 0x0012 /* RFC 2246 */ +#define TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 0x0013 /* RFC 2246 */ +#define TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0014 /* RFC 2246 */ +#define TLS_DHE_RSA_WITH_DES_CBC_SHA 0x0015 /* RFC 2246 */ +#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x0016 /* RFC 2246 */ +#define TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 0x0017 /* RFC 2246 */ +#define TLS_DH_anon_WITH_RC4_128_MD5 0x0018 /* RFC 2246 */ +#define TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA 0x0019 /* RFC 2246 */ +#define TLS_DH_anon_WITH_DES_CBC_SHA 0x001A /* RFC 2246 */ +#define TLS_DH_anon_WITH_3DES_EDE_CBC_SHA 0x001B /* RFC 2246 */ +#define TLS_RSA_WITH_AES_128_CBC_SHA 0x002F /* RFC 3268 */ +#define TLS_DH_DSS_WITH_AES_128_CBC_SHA 0x0030 /* RFC 3268 */ +#define TLS_DH_RSA_WITH_AES_128_CBC_SHA 0x0031 /* RFC 3268 */ +#define TLS_DHE_DSS_WITH_AES_128_CBC_SHA 0x0032 /* RFC 3268 */ +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x0033 /* RFC 3268 */ +#define TLS_DH_anon_WITH_AES_128_CBC_SHA 0x0034 /* RFC 3268 */ +#define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035 /* RFC 3268 */ +#define TLS_DH_DSS_WITH_AES_256_CBC_SHA 0x0036 /* RFC 3268 */ +#define TLS_DH_RSA_WITH_AES_256_CBC_SHA 0x0037 /* RFC 3268 */ +#define TLS_DHE_DSS_WITH_AES_256_CBC_SHA 0x0038 /* RFC 3268 */ +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x0039 /* RFC 3268 */ +#define TLS_DH_anon_WITH_AES_256_CBC_SHA 0x003A /* RFC 3268 */ +#define TLS_RSA_WITH_NULL_SHA256 0x003B /* RFC 5246 */ +#define TLS_RSA_WITH_AES_128_CBC_SHA256 0x003C /* RFC 5246 */ +#define TLS_RSA_WITH_AES_256_CBC_SHA256 0x003D /* RFC 5246 */ +#define TLS_DH_DSS_WITH_AES_128_CBC_SHA256 0x003E /* RFC 5246 */ +#define TLS_DH_RSA_WITH_AES_128_CBC_SHA256 0x003F /* RFC 5246 */ +#define TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 0x0040 /* RFC 5246 */ +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x0067 /* RFC 5246 */ +#define TLS_DH_DSS_WITH_AES_256_CBC_SHA256 0x0068 /* RFC 5246 */ +#define TLS_DH_RSA_WITH_AES_256_CBC_SHA256 0x0069 /* RFC 5246 */ +#define TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 0x006A /* RFC 5246 */ +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x006B /* RFC 5246 */ +#define TLS_DH_anon_WITH_AES_128_CBC_SHA256 0x006C /* RFC 5246 */ +#define TLS_DH_anon_WITH_AES_256_CBC_SHA256 0x006D /* RFC 5246 */ + +/* CompressionMethod */ +#define TLS_COMPRESSION_NULL 0 + +/* HashAlgorithm */ +enum { + TLS_HASH_ALG_NONE = 0, + TLS_HASH_ALG_MD5 = 1, + TLS_HASH_ALG_SHA1 = 2, + TLS_HASH_ALG_SHA224 = 3, + TLS_HASH_ALG_SHA256 = 4, + TLS_HASH_ALG_SHA384 = 5, + TLS_HASH_ALG_SHA512 = 6 +}; + +/* SignatureAlgorithm */ +enum { + TLS_SIGN_ALG_ANONYMOUS = 0, + TLS_SIGN_ALG_RSA = 1, + TLS_SIGN_ALG_DSA = 2, + TLS_SIGN_ALG_ECDSA = 3, +}; + +/* AlertLevel */ +#define TLS_ALERT_LEVEL_WARNING 1 +#define TLS_ALERT_LEVEL_FATAL 2 + +/* AlertDescription */ +#define TLS_ALERT_CLOSE_NOTIFY 0 +#define TLS_ALERT_UNEXPECTED_MESSAGE 10 +#define TLS_ALERT_BAD_RECORD_MAC 20 +#define TLS_ALERT_DECRYPTION_FAILED 21 +#define TLS_ALERT_RECORD_OVERFLOW 22 +#define TLS_ALERT_DECOMPRESSION_FAILURE 30 +#define TLS_ALERT_HANDSHAKE_FAILURE 40 +#define TLS_ALERT_BAD_CERTIFICATE 42 +#define TLS_ALERT_UNSUPPORTED_CERTIFICATE 43 +#define TLS_ALERT_CERTIFICATE_REVOKED 44 +#define TLS_ALERT_CERTIFICATE_EXPIRED 45 +#define TLS_ALERT_CERTIFICATE_UNKNOWN 46 +#define TLS_ALERT_ILLEGAL_PARAMETER 47 +#define TLS_ALERT_UNKNOWN_CA 48 +#define TLS_ALERT_ACCESS_DENIED 49 +#define TLS_ALERT_DECODE_ERROR 50 +#define TLS_ALERT_DECRYPT_ERROR 51 +#define TLS_ALERT_EXPORT_RESTRICTION 60 +#define TLS_ALERT_PROTOCOL_VERSION 70 +#define TLS_ALERT_INSUFFICIENT_SECURITY 71 +#define TLS_ALERT_INTERNAL_ERROR 80 +#define TLS_ALERT_USER_CANCELED 90 +#define TLS_ALERT_NO_RENEGOTIATION 100 +#define TLS_ALERT_UNSUPPORTED_EXTENSION 110 /* RFC 4366 */ +#define TLS_ALERT_CERTIFICATE_UNOBTAINABLE 111 /* RFC 4366 */ +#define TLS_ALERT_UNRECOGNIZED_NAME 112 /* RFC 4366 */ +#define TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE 113 /* RFC 4366 */ +#define TLS_ALERT_BAD_CERTIFICATE_HASH_VALUE 114 /* RFC 4366 */ + +/* ChangeCipherSpec */ +enum { + TLS_CHANGE_CIPHER_SPEC = 1 +}; + +/* TLS Extensions */ +#define TLS_EXT_SERVER_NAME 0 /* RFC 4366 */ +#define TLS_EXT_MAX_FRAGMENT_LENGTH 1 /* RFC 4366 */ +#define TLS_EXT_CLIENT_CERTIFICATE_URL 2 /* RFC 4366 */ +#define TLS_EXT_TRUSTED_CA_KEYS 3 /* RFC 4366 */ +#define TLS_EXT_TRUNCATED_HMAC 4 /* RFC 4366 */ +#define TLS_EXT_STATUS_REQUEST 5 /* RFC 4366 */ +#define TLS_EXT_SESSION_TICKET 35 /* RFC 4507 */ + +#define TLS_EXT_PAC_OPAQUE TLS_EXT_SESSION_TICKET /* EAP-FAST terminology */ + + +typedef enum { + TLS_KEY_X_NULL, + TLS_KEY_X_RSA, + TLS_KEY_X_RSA_EXPORT, + TLS_KEY_X_DH_DSS_EXPORT, + TLS_KEY_X_DH_DSS, + TLS_KEY_X_DH_RSA_EXPORT, + TLS_KEY_X_DH_RSA, + TLS_KEY_X_DHE_DSS_EXPORT, + TLS_KEY_X_DHE_DSS, + TLS_KEY_X_DHE_RSA_EXPORT, + TLS_KEY_X_DHE_RSA, + TLS_KEY_X_DH_anon_EXPORT, + TLS_KEY_X_DH_anon +} tls_key_exchange; + +typedef enum { + TLS_CIPHER_NULL, + TLS_CIPHER_RC4_40, + TLS_CIPHER_RC4_128, + TLS_CIPHER_RC2_CBC_40, + TLS_CIPHER_IDEA_CBC, + TLS_CIPHER_DES40_CBC, + TLS_CIPHER_DES_CBC, + TLS_CIPHER_3DES_EDE_CBC, + TLS_CIPHER_AES_128_CBC, + TLS_CIPHER_AES_256_CBC +} tls_cipher; + +typedef enum { + TLS_HASH_NULL, + TLS_HASH_MD5, + TLS_HASH_SHA, + TLS_HASH_SHA256 +} tls_hash; + +struct tls_cipher_suite { + u16 suite; + tls_key_exchange key_exchange; + tls_cipher cipher; + tls_hash hash; +}; + +typedef enum { + TLS_CIPHER_STREAM, + TLS_CIPHER_BLOCK +} tls_cipher_type; + +struct tls_cipher_data { + tls_cipher cipher; + tls_cipher_type type; + size_t key_material; + size_t expanded_key_material; + size_t block_size; /* also iv_size */ + enum crypto_cipher_alg alg; +}; + + +struct tls_verify_hash { + struct crypto_hash *md5_client; + struct crypto_hash *sha1_client; + struct crypto_hash *sha256_client; + struct crypto_hash *md5_server; + struct crypto_hash *sha1_server; + struct crypto_hash *sha256_server; + struct crypto_hash *md5_cert; + struct crypto_hash *sha1_cert; + struct crypto_hash *sha256_cert; +}; + + +const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite); +const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher); +int tls_server_key_exchange_allowed(tls_cipher cipher); +int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk); +int tls_verify_hash_init(struct tls_verify_hash *verify); +void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf, + size_t len); +void tls_verify_hash_free(struct tls_verify_hash *verify); +int tls_version_ok(u16 ver); +const char * tls_version_str(u16 ver); +int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label, + const u8 *seed, size_t seed_len, u8 *out, size_t outlen); + +#endif /* TLSV1_COMMON_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_cred.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_cred.h new file mode 100644 index 000000000..68fbdc923 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_cred.h @@ -0,0 +1,40 @@ +/* + * TLSv1 credentials + * Copyright (c) 2006-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_CRED_H +#define TLSV1_CRED_H + +struct tlsv1_credentials { + struct x509_certificate *trusted_certs; + struct x509_certificate *cert; + struct crypto_private_key *key; + + /* Diffie-Hellman parameters */ + u8 *dh_p; /* prime */ + size_t dh_p_len; + u8 *dh_g; /* generator */ + size_t dh_g_len; +}; + + +struct tlsv1_credentials * tlsv1_cred_alloc(void); +void tlsv1_cred_free(struct tlsv1_credentials *cred); +int tlsv1_set_ca_cert(struct tlsv1_credentials *cred, const char *cert, + const u8 *cert_blob, size_t cert_blob_len, + const char *path); +int tlsv1_set_cert(struct tlsv1_credentials *cred, const char *cert, + const u8 *cert_blob, size_t cert_blob_len); +int tlsv1_set_private_key(struct tlsv1_credentials *cred, + const char *private_key, + const char *private_key_passwd, + const u8 *private_key_blob, + size_t private_key_blob_len); +int tlsv1_set_dhparams(struct tlsv1_credentials *cred, const char *dh_file, + const u8 *dh_blob, size_t dh_blob_len); + +#endif /* TLSV1_CRED_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_record.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_record.h new file mode 100644 index 000000000..48abcb0d2 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_record.h @@ -0,0 +1,71 @@ +/* + * TLSv1 Record Protocol + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_RECORD_H +#define TLSV1_RECORD_H + +#include "crypto/crypto.h" + +#define TLS_MAX_WRITE_MAC_SECRET_LEN 32 +#define TLS_MAX_WRITE_KEY_LEN 32 +#define TLS_MAX_IV_LEN 16 +#define TLS_MAX_KEY_BLOCK_LEN (2 * (TLS_MAX_WRITE_MAC_SECRET_LEN + \ + TLS_MAX_WRITE_KEY_LEN + TLS_MAX_IV_LEN)) + +#define TLS_SEQ_NUM_LEN 8 +#define TLS_RECORD_HEADER_LEN 5 + +/* ContentType */ +enum { + TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC = 20, + TLS_CONTENT_TYPE_ALERT = 21, + TLS_CONTENT_TYPE_HANDSHAKE = 22, + TLS_CONTENT_TYPE_APPLICATION_DATA = 23 +}; + +struct tlsv1_record_layer { + u16 tls_version; + + u8 write_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; + u8 read_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; + u8 write_key[TLS_MAX_WRITE_KEY_LEN]; + u8 read_key[TLS_MAX_WRITE_KEY_LEN]; + u8 write_iv[TLS_MAX_IV_LEN]; + u8 read_iv[TLS_MAX_IV_LEN]; + + size_t hash_size; + size_t key_material_len; + size_t iv_size; /* also block_size */ + + enum crypto_hash_alg hash_alg; + enum crypto_cipher_alg cipher_alg; + + u8 write_seq_num[TLS_SEQ_NUM_LEN]; + u8 read_seq_num[TLS_SEQ_NUM_LEN]; + + u16 cipher_suite; + u16 write_cipher_suite; + u16 read_cipher_suite; + + struct crypto_cipher *write_cbc; + struct crypto_cipher *read_cbc; +}; + + +int tlsv1_record_set_cipher_suite(struct tlsv1_record_layer *rl, + u16 cipher_suite); +int tlsv1_record_change_write_cipher(struct tlsv1_record_layer *rl); +int tlsv1_record_change_read_cipher(struct tlsv1_record_layer *rl); +int tlsv1_record_send(struct tlsv1_record_layer *rl, u8 content_type, u8 *buf, + size_t buf_size, const u8 *payload, size_t payload_len, + size_t *out_len); +int tlsv1_record_receive(struct tlsv1_record_layer *rl, + const u8 *in_data, size_t in_len, + u8 *out_data, size_t *out_len, u8 *alert); + +#endif /* TLSV1_RECORD_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_server.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_server.h new file mode 100644 index 000000000..a18c69e37 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_server.h @@ -0,0 +1,48 @@ +/* + * TLS v1.0/v1.1/v1.2 server (RFC 2246, RFC 4346, RFC 5246) + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_SERVER_H +#define TLSV1_SERVER_H + +#include "tlsv1_cred.h" + +struct tlsv1_server; + +int tlsv1_server_global_init(void); +void tlsv1_server_global_deinit(void); +struct tlsv1_server * tlsv1_server_init(struct tlsv1_credentials *cred); +void tlsv1_server_deinit(struct tlsv1_server *conn); +int tlsv1_server_established(struct tlsv1_server *conn); +int tlsv1_server_prf(struct tlsv1_server *conn, const char *label, + int server_random_first, u8 *out, size_t out_len); +u8 * tlsv1_server_handshake(struct tlsv1_server *conn, + const u8 *in_data, size_t in_len, size_t *out_len); +int tlsv1_server_encrypt(struct tlsv1_server *conn, + const u8 *in_data, size_t in_len, + u8 *out_data, size_t out_len); +int tlsv1_server_decrypt(struct tlsv1_server *conn, + const u8 *in_data, size_t in_len, + u8 *out_data, size_t out_len); +int tlsv1_server_get_cipher(struct tlsv1_server *conn, char *buf, + size_t buflen); +int tlsv1_server_shutdown(struct tlsv1_server *conn); +int tlsv1_server_resumed(struct tlsv1_server *conn); +int tlsv1_server_get_keys(struct tlsv1_server *conn, struct tls_keys *keys); +int tlsv1_server_get_keyblock_size(struct tlsv1_server *conn); +int tlsv1_server_set_cipher_list(struct tlsv1_server *conn, u8 *ciphers); +int tlsv1_server_set_verify(struct tlsv1_server *conn, int verify_peer); + +typedef int (*tlsv1_server_session_ticket_cb) +(void *ctx, const u8 *ticket, size_t len, const u8 *client_random, + const u8 *server_random, u8 *master_secret); + +void tlsv1_server_set_session_ticket_cb(struct tlsv1_server *conn, + tlsv1_server_session_ticket_cb cb, + void *ctx); + +#endif /* TLSV1_SERVER_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/tlsv1_server_i.h b/components/wpa_supplicant/include/wpa2/tls/tlsv1_server_i.h new file mode 100644 index 000000000..1f61533a5 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/tlsv1_server_i.h @@ -0,0 +1,71 @@ +/* + * TLSv1 server - internal structures + * Copyright (c) 2006-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef TLSV1_SERVER_I_H +#define TLSV1_SERVER_I_H + +struct tlsv1_server { + enum { + CLIENT_HELLO, SERVER_HELLO, SERVER_CERTIFICATE, + SERVER_KEY_EXCHANGE, SERVER_CERTIFICATE_REQUEST, + SERVER_HELLO_DONE, CLIENT_CERTIFICATE, CLIENT_KEY_EXCHANGE, + CERTIFICATE_VERIFY, CHANGE_CIPHER_SPEC, CLIENT_FINISHED, + SERVER_CHANGE_CIPHER_SPEC, SERVER_FINISHED, + ESTABLISHED, FAILED + } state; + + struct tlsv1_record_layer rl; + + u8 session_id[TLS_SESSION_ID_MAX_LEN]; + size_t session_id_len; + u8 client_random[TLS_RANDOM_LEN]; + u8 server_random[TLS_RANDOM_LEN]; + u8 master_secret[TLS_MASTER_SECRET_LEN]; + + u8 alert_level; + u8 alert_description; + + struct crypto_public_key *client_rsa_key; + + struct tls_verify_hash verify; + +#define MAX_CIPHER_COUNT 30 + u16 cipher_suites[MAX_CIPHER_COUNT]; + size_t num_cipher_suites; + + u16 cipher_suite; + + struct tlsv1_credentials *cred; + + int verify_peer; + u16 client_version; + + u8 *session_ticket; + size_t session_ticket_len; + + tlsv1_server_session_ticket_cb session_ticket_cb; + void *session_ticket_cb_ctx; + + int use_session_ticket; + + u8 *dh_secret; + size_t dh_secret_len; +}; + + +void tlsv1_server_alert(struct tlsv1_server *conn, u8 level, u8 description); +int tlsv1_server_derive_keys(struct tlsv1_server *conn, + const u8 *pre_master_secret, + size_t pre_master_secret_len); +u8 * tlsv1_server_handshake_write(struct tlsv1_server *conn, size_t *out_len); +u8 * tlsv1_server_send_alert(struct tlsv1_server *conn, u8 level, + u8 description, size_t *out_len); +int tlsv1_server_process_handshake(struct tlsv1_server *conn, u8 ct, + const u8 *buf, size_t *len); + +#endif /* TLSV1_SERVER_I_H */ diff --git a/components/wpa_supplicant/include/wpa2/tls/x509v3.h b/components/wpa_supplicant/include/wpa2/tls/x509v3.h new file mode 100644 index 000000000..91a35baf9 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/tls/x509v3.h @@ -0,0 +1,123 @@ +/* + * X.509v3 certificate parsing and processing + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef X509V3_H +#define X509V3_H + +#include "asn1.h" + +struct x509_algorithm_identifier { + struct asn1_oid oid; +}; + +struct x509_name_attr { + enum x509_name_attr_type { + X509_NAME_ATTR_NOT_USED, + X509_NAME_ATTR_DC, + X509_NAME_ATTR_CN, + X509_NAME_ATTR_C, + X509_NAME_ATTR_L, + X509_NAME_ATTR_ST, + X509_NAME_ATTR_O, + X509_NAME_ATTR_OU + } type; + char *value; +}; + +#define X509_MAX_NAME_ATTRIBUTES 20 + +struct x509_name { + struct x509_name_attr attr[X509_MAX_NAME_ATTRIBUTES]; + size_t num_attr; + char *email; /* emailAddress */ + + /* from alternative name extension */ + char *alt_email; /* rfc822Name */ + char *dns; /* dNSName */ + char *uri; /* uniformResourceIdentifier */ + u8 *ip; /* iPAddress */ + size_t ip_len; /* IPv4: 4, IPv6: 16 */ + struct asn1_oid rid; /* registeredID */ +}; + +struct x509_certificate { + struct x509_certificate *next; + enum { X509_CERT_V1 = 0, X509_CERT_V2 = 1, X509_CERT_V3 = 2 } version; + unsigned long serial_number; + struct x509_algorithm_identifier signature; + struct x509_name issuer; + struct x509_name subject; + os_time_t not_before; + os_time_t not_after; + struct x509_algorithm_identifier public_key_alg; + u8 *public_key; + size_t public_key_len; + struct x509_algorithm_identifier signature_alg; + u8 *sign_value; + size_t sign_value_len; + + /* Extensions */ + unsigned int extensions_present; +#define X509_EXT_BASIC_CONSTRAINTS (1 << 0) +#define X509_EXT_PATH_LEN_CONSTRAINT (1 << 1) +#define X509_EXT_KEY_USAGE (1 << 2) +#define X509_EXT_SUBJECT_ALT_NAME (1 << 3) +#define X509_EXT_ISSUER_ALT_NAME (1 << 4) + + /* BasicConstraints */ + int ca; /* cA */ + unsigned long path_len_constraint; /* pathLenConstraint */ + + /* KeyUsage */ + unsigned long key_usage; +#define X509_KEY_USAGE_DIGITAL_SIGNATURE (1 << 0) +#define X509_KEY_USAGE_NON_REPUDIATION (1 << 1) +#define X509_KEY_USAGE_KEY_ENCIPHERMENT (1 << 2) +#define X509_KEY_USAGE_DATA_ENCIPHERMENT (1 << 3) +#define X509_KEY_USAGE_KEY_AGREEMENT (1 << 4) +#define X509_KEY_USAGE_KEY_CERT_SIGN (1 << 5) +#define X509_KEY_USAGE_CRL_SIGN (1 << 6) +#define X509_KEY_USAGE_ENCIPHER_ONLY (1 << 7) +#define X509_KEY_USAGE_DECIPHER_ONLY (1 << 8) + + /* + * The DER format certificate follows struct x509_certificate. These + * pointers point to that buffer. + */ + const u8 *cert_start; + size_t cert_len; + const u8 *tbs_cert_start; + size_t tbs_cert_len; +}; + +enum { + X509_VALIDATE_OK, + X509_VALIDATE_BAD_CERTIFICATE, + X509_VALIDATE_UNSUPPORTED_CERTIFICATE, + X509_VALIDATE_CERTIFICATE_REVOKED, + X509_VALIDATE_CERTIFICATE_EXPIRED, + X509_VALIDATE_CERTIFICATE_UNKNOWN, + X509_VALIDATE_UNKNOWN_CA +}; + +void x509_certificate_free(struct x509_certificate *cert); +struct x509_certificate * x509_certificate_parse(const u8 *buf, size_t len); +void x509_name_string(struct x509_name *name, char *buf, size_t len); +int x509_name_compare(struct x509_name *a, struct x509_name *b); +void x509_certificate_chain_free(struct x509_certificate *cert); +int x509_certificate_check_signature(struct x509_certificate *issuer, + struct x509_certificate *cert); +int x509_certificate_chain_validate(struct x509_certificate *trusted, + struct x509_certificate *chain, + int *reason, int disable_time_checks); +struct x509_certificate * +x509_certificate_get_subject(struct x509_certificate *chain, + struct x509_name *name); +int x509_certificate_self_signed(struct x509_certificate *cert); + +#endif /* X509V3_H */ diff --git a/components/wpa_supplicant/include/wpa2/utils/base64.h b/components/wpa_supplicant/include/wpa2/utils/base64.h new file mode 100644 index 000000000..91eb87419 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/utils/base64.h @@ -0,0 +1,17 @@ +/* + * Base64 encoding/decoding (RFC1341) + * Copyright (c) 2005, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef BASE64_H +#define BASE64_H + +unsigned char * _base64_encode(const unsigned char *src, size_t len, + size_t *out_len); +unsigned char * _base64_decode(const unsigned char *src, size_t len, + size_t *out_len); + +#endif /* BASE64_H */ diff --git a/components/wpa_supplicant/include/wpa2/utils/ext_password.h b/components/wpa_supplicant/include/wpa2/utils/ext_password.h new file mode 100644 index 000000000..e3e46ea08 --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/utils/ext_password.h @@ -0,0 +1,33 @@ +/* + * External password backend + * Copyright (c) 2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EXT_PASSWORD_H +#define EXT_PASSWORD_H + +struct ext_password_data; + +#ifdef CONFIG_EXT_PASSWORD + +struct ext_password_data * ext_password_init(const char *backend, + const char *params); +void ext_password_deinit(struct ext_password_data *data); + +struct wpabuf * ext_password_get(struct ext_password_data *data, + const char *name); +void ext_password_free(struct wpabuf *pw); + +#else /* CONFIG_EXT_PASSWORD */ + +#define ext_password_init(b, p) ((void *) 1) +#define ext_password_deinit(d) do { } while (0) +#define ext_password_get(d, n) (NULL) +#define ext_password_free(p) do { } while (0) + +#endif /* CONFIG_EXT_PASSWORD */ + +#endif /* EXT_PASSWORD_H */ diff --git a/components/wpa_supplicant/include/wpa2/utils/ext_password_i.h b/components/wpa_supplicant/include/wpa2/utils/ext_password_i.h new file mode 100644 index 000000000..043e7312c --- /dev/null +++ b/components/wpa_supplicant/include/wpa2/utils/ext_password_i.h @@ -0,0 +1,23 @@ +/* + * External password backend - internal definitions + * Copyright (c) 2012, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef EXT_PASSWORD_I_H +#define EXT_PASSWORD_I_H + +#include "ext_password.h" + +struct ext_password_backend { + const char *name; + void * (*init)(const char *params); + void (*deinit)(void *ctx); + struct wpabuf * (*get)(void *ctx, const char *name); +}; + +struct wpabuf * ext_password_alloc(size_t len); + +#endif /* EXT_PASSWORD_I_H */ diff --git a/components/wpa_supplicant/port/include/byteswap.h b/components/wpa_supplicant/port/include/byteswap.h new file mode 100644 index 000000000..1a8bb8fd1 --- /dev/null +++ b/components/wpa_supplicant/port/include/byteswap.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010 Espressif System + */ + +#ifndef BYTESWAP_H +#define BYTESWAP_H + +/* Swap bytes in 16 bit value. */ +#ifdef __GNUC__ +# define __bswap_16(x) \ + (__extension__ \ + ({ unsigned short int __bsx = (x); \ + ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); })) +#else +static INLINE unsigned short int +__bswap_16 (unsigned short int __bsx) +{ + return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); +} +#endif + +/* Swap bytes in 32 bit value. */ +#ifdef __GNUC__ +# define __bswap_32(x) \ + (__extension__ \ + ({ unsigned int __bsx = (x); \ + ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \ + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); })) +#else +static INLINE unsigned int +__bswap_32 (unsigned int __bsx) +{ + return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); +} +#endif + +#if defined __GNUC__ && __GNUC__ >= 2 +/* Swap bytes in 64 bit value. */ +# define __bswap_constant_64(x) \ + ((((x) & 0xff00000000000000ull) >> 56) \ + | (((x) & 0x00ff000000000000ull) >> 40) \ + | (((x) & 0x0000ff0000000000ull) >> 24) \ + | (((x) & 0x000000ff00000000ull) >> 8) \ + | (((x) & 0x00000000ff000000ull) << 8) \ + | (((x) & 0x0000000000ff0000ull) << 24) \ + | (((x) & 0x000000000000ff00ull) << 40) \ + | (((x) & 0x00000000000000ffull) << 56)) + +# define __bswap_64(x) \ + (__extension__ \ + ({ union { __extension__ unsigned long long int __ll; \ + unsigned int __l[2]; } __w, __r; \ + if (__builtin_constant_p (x)) \ + __r.__ll = __bswap_constant_64 (x); \ + else \ + { \ + __w.__ll = (x); \ + __r.__l[0] = __bswap_32 (__w.__l[1]); \ + __r.__l[1] = __bswap_32 (__w.__l[0]); \ + } \ + __r.__ll; })) +#endif + +#endif /* BYTESWAP_H */ diff --git a/components/wpa_supplicant/port/include/endian.h b/components/wpa_supplicant/port/include/endian.h new file mode 100644 index 000000000..e2df616b7 --- /dev/null +++ b/components/wpa_supplicant/port/include/endian.h @@ -0,0 +1,229 @@ +/*- + * Copyright (c) 2002 Thomas Moestl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR 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 AUTHOR 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. + * + * $FreeBSD$ + */ + +#ifndef _ENDIAN_H_ +#define _ENDIAN_H_ + +#include "byteswap.h" + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BYTE_ORDER +#ifdef __IEEE_LITTLE_ENDIAN +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif + +#define _UINT8_T_DECLARED +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t; +#define _UINT8_T_DECLARED +#endif + +#define _UINT16_T_DECLARED +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t; +#define _UINT16_T_DECLARED +#endif + +#define _UINT32_T_DECLARED +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t; +#define _UINT32_T_DECLARED +#endif + +#define _UINT64_T_DECLARED +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t; +#define _UINT64_T_DECLARED +#endif + +/* + * General byte order swapping functions. + */ +#define bswap16(x) __bswap16(x) +#define bswap32(x) __bswap32(x) +#define bswap64(x) __bswap64(x) + +/* + * Host to big endian, host to little endian, big endian to host, and little + * endian to host byte order functions as detailed in byteorder(9). + */ +#if 1 //BYTE_ORDER == _LITTLE_ENDIAN +#define __bswap16 __bswap_16 +#define __bswap32 __bswap_32 +#define htobe16(x) bswap16((x)) +#define htobe32(x) bswap32((x)) +#define htobe64(x) bswap64((x)) +#define htole16(x) ((uint16_t)(x)) +#define htole32(x) ((uint32_t)(x)) +#define htole64(x) ((uint64_t)(x)) + +#define be16toh(x) bswap16((x)) +#define be32toh(x) bswap32((x)) +#define be64toh(x) bswap64((x)) +#define le16toh(x) ((uint16_t)(x)) +#define le32toh(x) ((uint32_t)(x)) +#define le64toh(x) ((uint64_t)(x)) + +#ifndef htons +#define htons htobe16 +#endif //htons + +#else /* _BYTE_ORDER != _LITTLE_ENDIAN */ +#define htobe16(x) ((uint16_t)(x)) +#define htobe32(x) ((uint32_t)(x)) +#define htobe64(x) ((uint64_t)(x)) +#define htole16(x) bswap16((x)) +#define htole32(x) bswap32((x)) +#define htole64(x) bswap64((x)) + +#define be16toh(x) ((uint16_t)(x)) +#define be32toh(x) ((uint32_t)(x)) +#define be64toh(x) ((uint64_t)(x)) +#define le16toh(x) bswap16((x)) +#define le32toh(x) bswap32((x)) +#define le64toh(x) bswap64((x)) +#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ + +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ + +static INLINE uint16_t +be16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return ((p[0] << 8) | p[1]); +} + +static INLINE uint32_t +be32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); +} + +static INLINE uint64_t +be64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); +} + +static INLINE uint16_t +le16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return ((p[1] << 8) | p[0]); +} + +static INLINE uint32_t +le32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); +} + +static INLINE uint64_t +le64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p)); +} + +static INLINE void +be16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 8) & 0xff; + p[1] = u & 0xff; +} + +static INLINE void +be32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 24) & 0xff; + p[1] = (u >> 16) & 0xff; + p[2] = (u >> 8) & 0xff; + p[3] = u & 0xff; +} + +static INLINE void +be64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + be32enc(p, (uint32_t)(u >> 32)); + be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); +} + +static INLINE void +le16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; +} + +static INLINE void +le32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; + p[2] = (u >> 16) & 0xff; + p[3] = (u >> 24) & 0xff; +} + +static INLINE void +le64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + le32enc(p, (uint32_t)(u & 0xffffffffU)); + le32enc(p + 4, (uint32_t)(u >> 32)); +} + +#endif /* _ENDIAN_H_ */ diff --git a/components/wpa_supplicant/port/include/os.h b/components/wpa_supplicant/port/include/os.h new file mode 100644 index 000000000..e6da894e9 --- /dev/null +++ b/components/wpa_supplicant/port/include/os.h @@ -0,0 +1,286 @@ +/* + * OS specific functions + * Copyright (c) 2005-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef OS_H +#define OS_H +#include "esp_types.h" +#include +#include +#include +#include "rom/ets_sys.h" +#include "lwip/mem.h" +typedef long os_time_t; + +/** + * os_sleep - Sleep (sec, usec) + * @sec: Number of seconds to sleep + * @usec: Number of microseconds to sleep + */ +void os_sleep(os_time_t sec, os_time_t usec); + +struct os_time { + os_time_t sec; + os_time_t usec; +}; + +/** + * os_get_time - Get current time (sec, usec) + * @t: Pointer to buffer for the time + * Returns: 0 on success, -1 on failure + */ +int os_get_time(struct os_time *t); + + +/* Helper macros for handling struct os_time */ + +#define os_time_before(a, b) \ + ((a)->sec < (b)->sec || \ + ((a)->sec == (b)->sec && (a)->usec < (b)->usec)) + +#define os_time_sub(a, b, res) do { \ + (res)->sec = (a)->sec - (b)->sec; \ + (res)->usec = (a)->usec - (b)->usec; \ + if ((res)->usec < 0) { \ + (res)->sec--; \ + (res)->usec += 1000000; \ + } \ +} while (0) + +/** + * os_mktime - Convert broken-down time into seconds since 1970-01-01 + * @year: Four digit year + * @month: Month (1 .. 12) + * @day: Day of month (1 .. 31) + * @hour: Hour (0 .. 23) + * @min: Minute (0 .. 59) + * @sec: Second (0 .. 60) + * @t: Buffer for returning calendar time representation (seconds since + * 1970-01-01 00:00:00) + * Returns: 0 on success, -1 on failure + * + * Note: The result is in seconds from Epoch, i.e., in UTC, not in local time + * which is used by POSIX mktime(). + */ +int os_mktime(int year, int month, int day, int hour, int min, int sec, + os_time_t *t); + + +/** + * os_daemonize - Run in the background (detach from the controlling terminal) + * @pid_file: File name to write the process ID to or %NULL to skip this + * Returns: 0 on success, -1 on failure + */ +int os_daemonize(const char *pid_file); + +/** + * os_daemonize_terminate - Stop running in the background (remove pid file) + * @pid_file: File name to write the process ID to or %NULL to skip this + */ +void os_daemonize_terminate(const char *pid_file); + +/** + * os_get_random - Get cryptographically strong pseudo random data + * @buf: Buffer for pseudo random data + * @len: Length of the buffer + * Returns: 0 on success, -1 on failure + */ +int os_get_random(unsigned char *buf, size_t len); + +/** + * os_random - Get pseudo random value (not necessarily very strong) + * Returns: Pseudo random value + */ +unsigned long os_random(void); + +/** + * os_rel2abs_path - Get an absolute path for a file + * @rel_path: Relative path to a file + * Returns: Absolute path for the file or %NULL on failure + * + * This function tries to convert a relative path of a file to an absolute path + * in order for the file to be found even if current working directory has + * changed. The returned value is allocated and caller is responsible for + * freeing it. It is acceptable to just return the same path in an allocated + * buffer, e.g., return strdup(rel_path). This function is only used to find + * configuration files when os_daemonize() may have changed the current working + * directory and relative path would be pointing to a different location. + */ +char * os_rel2abs_path(const char *rel_path); + +/** + * os_program_init - Program initialization (called at start) + * Returns: 0 on success, -1 on failure + * + * This function is called when a programs starts. If there are any OS specific + * processing that is needed, it can be placed here. It is also acceptable to + * just return 0 if not special processing is needed. + */ +int os_program_init(void); + +/** + * os_program_deinit - Program deinitialization (called just before exit) + * + * This function is called just before a program exists. If there are any OS + * specific processing, e.g., freeing resourced allocated in os_program_init(), + * it should be done here. It is also acceptable for this function to do + * nothing. + */ +void os_program_deinit(void); + +/** + * os_setenv - Set environment variable + * @name: Name of the variable + * @value: Value to set to the variable + * @overwrite: Whether existing variable should be overwritten + * Returns: 0 on success, -1 on error + * + * This function is only used for wpa_cli action scripts. OS wrapper does not + * need to implement this if such functionality is not needed. + */ +int os_setenv(const char *name, const char *value, int overwrite); + +/** + * os_unsetenv - Delete environent variable + * @name: Name of the variable + * Returns: 0 on success, -1 on error + * + * This function is only used for wpa_cli action scripts. OS wrapper does not + * need to implement this if such functionality is not needed. + */ +int os_unsetenv(const char *name); + +/** + * os_readfile - Read a file to an allocated memory buffer + * @name: Name of the file to read + * @len: For returning the length of the allocated buffer + * Returns: Pointer to the allocated buffer or %NULL on failure + * + * This function allocates memory and reads the given file to this buffer. Both + * binary and text files can be read with this function. The caller is + * responsible for freeing the returned buffer with os_free(). + */ +char * os_readfile(const char *name, size_t *len); + +/* + * The following functions are wrapper for standard ANSI C or POSIX functions. + * By default, they are just defined to use the standard function name and no + * os_*.c implementation is needed for them. This avoids extra function calls + * by allowing the C pre-processor take care of the function name mapping. + * + * If the target system uses a C library that does not provide these functions, + * build_config.h can be used to define the wrappers to use a different + * function name. This can be done on function-by-function basis since the + * defines here are only used if build_config.h does not define the os_* name. + * If needed, os_*.c file can be used to implement the functions that are not + * included in the C library on the target system. Alternatively, + * OS_NO_C_LIB_DEFINES can be defined to skip all defines here in which case + * these functions need to be implemented in os_*.c file for the target system. + */ + +#ifndef os_malloc +#define os_malloc(s) malloc((s)) +#endif +#ifndef os_realloc +#define os_realloc(p, s) realloc((p), (s)) +#endif +#ifndef os_zalloc +#define os_zalloc(s) calloc(1, (s)) +#endif +#ifndef os_free +#define os_free(p) free((p)) +#endif + + +#ifndef os_strdup +#ifdef _MSC_VER +#define os_strdup(s) _strdup(s) +#else +#define os_strdup(s) strdup(s) +#endif +#endif +char * ets_strdup(const char *s); + +#ifndef os_memcpy +#define os_memcpy(d, s, n) memcpy((d), (s), (n)) +#endif +#ifndef os_memmove +#define os_memmove(d, s, n) memmove((d), (s), (n)) +#endif +#ifndef os_memset +#define os_memset(s, c, n) memset(s, c, n) +#endif +#ifndef os_memcmp +#define os_memcmp(s1, s2, n) memcmp((s1), (s2), (n)) +#endif + +#ifndef os_strlen +#define os_strlen(s) strlen(s) +#endif +#ifndef os_strcasecmp +#ifdef _MSC_VER +#define os_strcasecmp(s1, s2) _stricmp((s1), (s2)) +#else +#define os_strcasecmp(s1, s2) strcasecmp((s1), (s2)) +#endif +#endif +#ifndef os_strncasecmp +#ifdef _MSC_VER +#define os_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n)) +#else +#define os_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n)) +#endif +#endif +#ifndef os_strchr +#define os_strchr(s, c) strchr((s), (c)) +#endif +#ifndef os_strcmp +#define os_strcmp(s1, s2) strcmp((s1), (s2)) +#endif +#ifndef os_strncmp +#define os_strncmp(s1, s2, n) strncmp((s1), (s2), (n)) +#endif +#ifndef os_strncpy +#define os_strncpy(d, s, n) strncpy((d), (s), (n)) +#endif +#ifndef os_strrchr +//hard cold +#define os_strrchr(s, c) NULL +#endif +#ifndef os_strstr +#define os_strstr(h, n) strstr((h), (n)) +#endif + +#ifndef os_snprintf +#ifdef _MSC_VER +#define os_snprintf _snprintf +#else +#define os_snprintf vsnprintf +#endif +#endif + +/** + * os_strlcpy - Copy a string with size bound and NUL-termination + * @dest: Destination + * @src: Source + * @siz: Size of the target buffer + * Returns: Total length of the target string (length of src) (not including + * NUL-termination) + * + * This function matches in behavior with the strlcpy(3) function in OpenBSD. + */ +size_t os_strlcpy(char *dest, const char *src, size_t siz); + + + +#endif /* OS_H */ diff --git a/components/wpa_supplicant/src/crypto/aes-cbc.c b/components/wpa_supplicant/src/crypto/aes-cbc.c new file mode 100644 index 000000000..016207795 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-cbc.c @@ -0,0 +1,88 @@ +/* + * AES-128 CBC + * + * Copyright (c) 2003-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/aes.h" +#include "crypto/aes_wrap.h" + +/** + * aes_128_cbc_encrypt - AES-128 CBC encryption + * @key: Encryption key + * @iv: Encryption IV for CBC mode (16 bytes) + * @data: Data to encrypt in-place + * @data_len: Length of data in bytes (must be divisible by 16) + * Returns: 0 on success, -1 on failure + */ +int +aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) +{ + void *ctx; + u8 cbc[AES_BLOCK_SIZE]; + u8 *pos = data; + int i, j, blocks; + + ctx = aes_encrypt_init(key, 16); + if (ctx == NULL) + return -1; + os_memcpy(cbc, iv, AES_BLOCK_SIZE); + + blocks = data_len / AES_BLOCK_SIZE; + for (i = 0; i < blocks; i++) { + for (j = 0; j < AES_BLOCK_SIZE; j++) + cbc[j] ^= pos[j]; + aes_encrypt(ctx, cbc, cbc); + os_memcpy(pos, cbc, AES_BLOCK_SIZE); + pos += AES_BLOCK_SIZE; + } + aes_encrypt_deinit(ctx); + return 0; +} + + +/** + * aes_128_cbc_decrypt - AES-128 CBC decryption + * @key: Decryption key + * @iv: Decryption IV for CBC mode (16 bytes) + * @data: Data to decrypt in-place + * @data_len: Length of data in bytes (must be divisible by 16) + * Returns: 0 on success, -1 on failure + */ +int +aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) +{ + void *ctx; + u8 cbc[AES_BLOCK_SIZE], tmp[AES_BLOCK_SIZE]; + u8 *pos = data; + int i, j, blocks; + + ctx = aes_decrypt_init(key, 16); + if (ctx == NULL) + return -1; + os_memcpy(cbc, iv, AES_BLOCK_SIZE); + + blocks = data_len / AES_BLOCK_SIZE; + for (i = 0; i < blocks; i++) { + os_memcpy(tmp, pos, AES_BLOCK_SIZE); + aes_decrypt(ctx, pos, pos); + for (j = 0; j < AES_BLOCK_SIZE; j++) + pos[j] ^= cbc[j]; + os_memcpy(cbc, tmp, AES_BLOCK_SIZE); + pos += AES_BLOCK_SIZE; + } + aes_decrypt_deinit(ctx); + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/aes-internal-dec.c b/components/wpa_supplicant/src/crypto/aes-internal-dec.c new file mode 100644 index 000000000..46371c555 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-internal-dec.c @@ -0,0 +1,172 @@ +/* + * AES (Rijndael) cipher - decrypt + * + * Modifications to public domain implementation: + * - support only 128-bit keys + * - cleanup + * - use C pre-processor to make it easier to change S table access + * - added option (AES_SMALL_TABLES) for reducing code size by about 8 kB at + * cost of reduced throughput (quite small difference on Pentium 4, + * 10-25% when using -O1 or -O2 optimization) + * + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/crypto.h" +#include "crypto/aes_i.h" + + + +//static unsigned char aes_priv_buf[AES_PRIV_SIZE]; + +/** + * Expand the cipher key into the decryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +static int rijndaelKeySetupDec(u32 rk[], const u8 cipherKey[], int keyBits) +{ + int Nr, i, j; + u32 temp; + + /* expand the cipher key: */ + Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); + if (Nr < 0) + return Nr; + /* invert the order of the round keys: */ + for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the + * first and the last: */ + for (i = 1; i < Nr; i++) { + rk += 4; + for (j = 0; j < 4; j++) { + rk[j] = TD0_(TE4((rk[j] >> 24) )) ^ + TD1_(TE4((rk[j] >> 16) & 0xff)) ^ + TD2_(TE4((rk[j] >> 8) & 0xff)) ^ + TD3_(TE4((rk[j] ) & 0xff)); + } + } + + return Nr; +} + +void * aes_decrypt_init(const u8 *key, size_t len) +{ + u32 *rk; + int res; + rk = os_malloc(AES_PRIV_SIZE); + if (rk == NULL) + return NULL; + res = rijndaelKeySetupDec(rk, key, len * 8); + if (res < 0) { + os_free(rk); + return NULL; + } + rk[AES_PRIV_NR_POS] = res; + return rk; +} + +static void rijndaelDecrypt(const u32 rk[/*44*/], int Nr, const u8 ct[16], + u8 pt[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(ct ) ^ rk[0]; + s1 = GETU32(ct + 4) ^ rk[1]; + s2 = GETU32(ct + 8) ^ rk[2]; + s3 = GETU32(ct + 12) ^ rk[3]; + +#define ROUND(i,d,s) \ +d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \ +d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \ +d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \ +d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3] + +#ifdef FULL_UNROLL + + ROUND(1,t,s); + ROUND(2,s,t); + ROUND(3,t,s); + ROUND(4,s,t); + ROUND(5,t,s); + ROUND(6,s,t); + ROUND(7,t,s); + ROUND(8,s,t); + ROUND(9,t,s); + if (Nr > 10) { + ROUND(10,s,t); + ROUND(11,t,s); + if (Nr > 12) { + ROUND(12,s,t); + ROUND(13,t,s); + } + } + + rk += Nr << 2; + +#else /* !FULL_UNROLL */ + + /* Nr - 1 full rounds: */ + r = Nr >> 1; + for (;;) { + ROUND(1,t,s); + rk += 8; + if (--r == 0) + break; + ROUND(0,s,t); + } + +#endif /* ?FULL_UNROLL */ + +#undef ROUND + + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0]; + PUTU32(pt , s0); + s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1]; + PUTU32(pt + 4, s1); + s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2]; + PUTU32(pt + 8, s2); + s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3]; + PUTU32(pt + 12, s3); +} + +void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain) +{ + u32 *rk = ctx; + rijndaelDecrypt(ctx, rk[AES_PRIV_NR_POS], crypt, plain); +} + + +void aes_decrypt_deinit(void *ctx) +{ + os_memset(ctx, 0, AES_PRIV_SIZE); + os_free(ctx); +} diff --git a/components/wpa_supplicant/src/crypto/aes-internal-enc.c b/components/wpa_supplicant/src/crypto/aes-internal-enc.c new file mode 100644 index 000000000..7b1080c45 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-internal-enc.c @@ -0,0 +1,134 @@ +/* + * AES (Rijndael) cipher - encrypt + * + * Modifications to public domain implementation: + * - support only 128-bit keys + * - cleanup + * - use C pre-processor to make it easier to change S table access + * - added option (AES_SMALL_TABLES) for reducing code size by about 8 kB at + * cost of reduced throughput (quite small difference on Pentium 4, + * 10-25% when using -O1 or -O2 optimization) + * + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" +#include "crypto/common.h" +#include "crypto/crypto.h" +#include "crypto/aes_i.h" + +#include "os.h" + +void rijndaelEncrypt(const u32 rk[], int Nr, const u8 pt[16], u8 ct[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt ) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; + +#define ROUND(i,d,s) \ +d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ +d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ +d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ +d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] + +#ifdef FULL_UNROLL + + ROUND(1,t,s); + ROUND(2,s,t); + ROUND(3,t,s); + ROUND(4,s,t); + ROUND(5,t,s); + ROUND(6,s,t); + ROUND(7,t,s); + ROUND(8,s,t); + ROUND(9,t,s); + if (Nr > 10) { + ROUND(10,s,t); + ROUND(11,t,s); + if (Nr > 12) { + ROUND(12,s,t); + ROUND(13,t,s); + } + } + + rk += Nr << 2; + +#else /* !FULL_UNROLL */ + + /* Nr - 1 full rounds: */ + r = Nr >> 1; + for (;;) { + ROUND(1,t,s); + rk += 8; + if (--r == 0) + break; + ROUND(0,s,t); + } + +#endif /* ?FULL_UNROLL */ + +#undef ROUND + + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0]; + PUTU32(ct , s0); + s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1]; + PUTU32(ct + 4, s1); + s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2]; + PUTU32(ct + 8, s2); + s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3]; + PUTU32(ct + 12, s3); +} + + +void * aes_encrypt_init(const u8 *key, size_t len) +{ + u32 *rk; + int res; + rk = os_malloc(AES_PRIV_SIZE); + if (rk == NULL) + return NULL; + res = rijndaelKeySetupEnc(rk, key, len * 8); + if (res < 0) { + os_free(rk); + return NULL; + } + rk[AES_PRIV_NR_POS] = res; + return rk; +} + + +void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt) +{ + u32 *rk = ctx; + rijndaelEncrypt(ctx, rk[AES_PRIV_NR_POS], plain, crypt); +} + + +void aes_encrypt_deinit(void *ctx) +{ + os_memset(ctx, 0, AES_PRIV_SIZE); + os_free(ctx); +} diff --git a/components/wpa_supplicant/src/crypto/aes-internal.c b/components/wpa_supplicant/src/crypto/aes-internal.c new file mode 100644 index 000000000..9618239f9 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-internal.c @@ -0,0 +1,854 @@ +/* + * AES (Rijndael) cipher + * + * Modifications to public domain implementation: + * - support only 128-bit keys + * - cleanup + * - use C pre-processor to make it easier to change S table access + * - added option (AES_SMALL_TABLES) for reducing code size by about 8 kB at + * cost of reduced throughput (quite small difference on Pentium 4, + * 10-25% when using -O1 or -O2 optimization) + * + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +//#include "wpa/common.h" +#include "crypto/common.h" +#include "crypto/crypto.h" +#include "crypto/aes_i.h" + +/* + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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. + */ + +#define AES_SMALL_TABLES + +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; +Te4[x] = S [x].[01, 01, 01, 01]; + +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +const u32 Te0[256] /* ICACHE_RODATA_ATTR */ = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +#ifndef AES_SMALL_TABLES +const u32 Te1[256] /* ICACHE_RODATA_ATTR */ = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +const u32 Te2[256] /* ICACHE_RODATA_ATTR */ = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +const u32 Te3[256] /* ICACHE_RODATA_ATTR */ = { + + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +const u32 Te4[256] /* ICACHE_RODATA_ATTR */ = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +#endif /* AES_SMALL_TABLES */ +const u32 Td0[256] /* ICACHE_RODATA_ATTR */ = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +#ifndef AES_SMALL_TABLES +const u32 Td1[256] /* ICACHE_RODATA_ATTR */ = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +const u32 Td2[256] /* ICACHE_RODATA_ATTR */ = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +const u32 Td3[256] /* ICACHE_RODATA_ATTR */ = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +const u32 Td4[256] /* ICACHE_RODATA_ATTR */ = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; +const u32 rcon[] /* ICACHE_RODATA_ATTR */ = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; +#else /* AES_SMALL_TABLES */ +const u8 Td4s[256] /* ICACHE_RODATA_ATTR */ = { + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, +}; +const u8 rcons[] /* ICACHE_RODATA_ATTR */ = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; +#endif /* AES_SMALL_TABLES */ +/** + * Expand the cipher key into the encryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +int rijndaelKeySetupEnc(u32 rk[], const u8 cipherKey[], int keyBits) +{ + int i; + u32 temp; + + rk[0] = GETU32(cipherKey ); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + + if (keyBits == 128) { + for (i = 0; i < 10; i++) { + temp = rk[3]; + rk[4] = rk[0] ^ TE421(temp) ^ TE432(temp) ^ + TE443(temp) ^ TE414(temp) ^ RCON(i); + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + rk += 4; + } + return 10; + } + + rk[4] = GETU32(cipherKey + 16); + rk[5] = GETU32(cipherKey + 20); + + if (keyBits == 192) { + for (i = 0; i < 8; i++) { + temp = rk[5]; + rk[6] = rk[0] ^ TE421(temp) ^ TE432(temp) ^ + TE443(temp) ^ TE414(temp) ^ RCON(i); + rk[7] = rk[1] ^ rk[6]; + rk[8] = rk[2] ^ rk[7]; + rk[9] = rk[3] ^ rk[8]; + if (i == 7) + return 12; + rk[10] = rk[4] ^ rk[9]; + rk[11] = rk[5] ^ rk[10]; + rk += 6; + } + } + + rk[6] = GETU32(cipherKey + 24); + rk[7] = GETU32(cipherKey + 28); + + if (keyBits == 256) { + for (i = 0; i < 7; i++) { + temp = rk[7]; + rk[8] = rk[0] ^ TE421(temp) ^ TE432(temp) ^ + TE443(temp) ^ TE414(temp) ^ RCON(i); + rk[9] = rk[1] ^ rk[8]; + rk[10] = rk[2] ^ rk[9]; + rk[11] = rk[3] ^ rk[10]; + if (i == 6) + return 14; + temp = rk[11]; + rk[12] = rk[4] ^ TE411(temp) ^ TE422(temp) ^ + TE433(temp) ^ TE444(temp); + rk[13] = rk[5] ^ rk[12]; + rk[14] = rk[6] ^ rk[13]; + rk[15] = rk[7] ^ rk[14]; + rk += 8; + } + } + + return -1; +} diff --git a/components/wpa_supplicant/src/crypto/aes-unwrap.c b/components/wpa_supplicant/src/crypto/aes-unwrap.c new file mode 100644 index 000000000..4a92f1cd3 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-unwrap.c @@ -0,0 +1,80 @@ +/* + * AES key unwrap (128-bit KEK, RFC3394) + * + * Copyright (c) 2003-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/aes.h" +#include "crypto/aes_wrap.h" + +/** + * aes_unwrap - Unwrap key with AES Key Wrap Algorithm (128-bit KEK) (RFC3394) + * @kek: Key encryption key (KEK) + * @n: Length of the plaintext key in 64-bit units; e.g., 2 = 128-bit = 16 + * bytes + * @cipher: Wrapped key to be unwrapped, (n + 1) * 64 bits + * @plain: Plaintext key, n * 64 bits + * Returns: 0 on success, -1 on failure (e.g., integrity verification failed) + */ +int +aes_unwrap(const u8 *kek, int n, const u8 *cipher, u8 *plain) +{ + u8 a[8], *r, b[16]; + int i, j; + void *ctx; + + /* 1) Initialize variables. */ + os_memcpy(a, cipher, 8); + r = plain; + os_memcpy(r, cipher + 8, 8 * n); + + ctx = aes_decrypt_init(kek, 16); + if (ctx == NULL) + return -1; + + /* 2) Compute intermediate values. + * For j = 5 to 0 + * For i = n to 1 + * B = AES-1(K, (A ^ t) | R[i]) where t = n*j+i + * A = MSB(64, B) + * R[i] = LSB(64, B) + */ + for (j = 5; j >= 0; j--) { + r = plain + (n - 1) * 8; + for (i = n; i >= 1; i--) { + os_memcpy(b, a, 8); + b[7] ^= n * j + i; + + os_memcpy(b + 8, r, 8); + aes_decrypt(ctx, b, b); + os_memcpy(a, b, 8); + os_memcpy(r, b + 8, 8); + r -= 8; + } + } + aes_decrypt_deinit(ctx); + + /* 3) Output results. + * + * These are already in @plain due to the location of temporary + * variables. Just verify that the IV matches with the expected value. + */ + for (i = 0; i < 8; i++) { + if (a[i] != 0xa6) + return -1; + } + + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/aes-wrap.c b/components/wpa_supplicant/src/crypto/aes-wrap.c new file mode 100644 index 000000000..388dd97a8 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/aes-wrap.c @@ -0,0 +1,70 @@ +/* + * AES Key Wrap Algorithm (128-bit KEK) (RFC3394) + * + * Copyright (c) 2003-2007, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/aes.h" +#include "crypto/aes_wrap.h" + +/** + * aes_wrap - Wrap keys with AES Key Wrap Algorithm (128-bit KEK) (RFC3394) + * @kek: 16-octet Key encryption key (KEK) + * @n: Length of the plaintext key in 64-bit units; e.g., 2 = 128-bit = 16 + * bytes + * @plain: Plaintext key to be wrapped, n * 64 bits + * @cipher: Wrapped key, (n + 1) * 64 bits + * Returns: 0 on success, -1 on failure + */ +int aes_wrap(const u8 *kek, int n, const u8 *plain, u8 *cipher) +{ + u8 *a, *r, b[16]; + int i, j; + void *ctx; + + a = cipher; + r = cipher + 8; + + /* 1) Initialize variables. */ + os_memset(a, 0xa6, 8); + os_memcpy(r, plain, 8 * n); + + ctx = aes_encrypt_init(kek, 16); + if (ctx == NULL) + return -1; + + /* 2) Calculate intermediate values. + * For j = 0 to 5 + * For i=1 to n + * B = AES(K, A | R[i]) + * A = MSB(64, B) ^ t where t = (n*j)+i + * R[i] = LSB(64, B) + */ + for (j = 0; j <= 5; j++) { + r = cipher + 8; + for (i = 1; i <= n; i++) { + os_memcpy(b, a, 8); + os_memcpy(b + 8, r, 8); + aes_encrypt(ctx, b, b); + os_memcpy(a, b, 8); + a[7] ^= n * j + i; + os_memcpy(r, b + 8, 8); + r += 8; + } + } + aes_encrypt_deinit(ctx); + + /* 3) Output the results. + * + * These are already in @cipher due to the location of temporary + * variables. + */ + + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/bignum.c b/components/wpa_supplicant/src/crypto/bignum.c new file mode 100644 index 000000000..7b8446c3b --- /dev/null +++ b/components/wpa_supplicant/src/crypto/bignum.c @@ -0,0 +1,244 @@ +/* + * Big number math + * Copyright (c) 2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" +#include "crypto/common.h" +#include "wpa/wpabuf.h" +#include "wpa/wpa_debug.h" +#include "bignum.h" + +#define CONFIG_INTERNAL_LIBTOMMATH +#ifdef CONFIG_INTERNAL_LIBTOMMATH +#include "libtommath.h" +#else /* CONFIG_INTERNAL_LIBTOMMATH */ +#include +#endif /* CONFIG_INTERNAL_LIBTOMMATH */ + + +/* + * The current version is just a wrapper for LibTomMath library, so + * struct bignum is just typecast to mp_int. + */ + +/** + * bignum_init - Allocate memory for bignum + * Returns: Pointer to allocated bignum or %NULL on failure + */ +struct bignum * +bignum_init(void) +{ + struct bignum *n = (struct bignum *)os_zalloc(sizeof(mp_int)); + if (n == NULL) + return NULL; + if (mp_init((mp_int *) n) != MP_OKAY) { + os_free(n); + n = NULL; + } + return n; +} + + +/** + * bignum_deinit - Free bignum + * @n: Bignum from bignum_init() + */ +void +bignum_deinit(struct bignum *n) +{ + if (n) { + mp_clear((mp_int *) n); + os_free(n); + } +} + + +/** + * bignum_get_unsigned_bin - Get length of bignum as an unsigned binary buffer + * @n: Bignum from bignum_init() + * Returns: Length of n if written to a binary buffer + */ +size_t +bignum_get_unsigned_bin_len(struct bignum *n) +{ + return mp_unsigned_bin_size((mp_int *) n); +} + + +/** + * bignum_get_unsigned_bin - Set binary buffer to unsigned bignum + * @n: Bignum from bignum_init() + * @buf: Buffer for the binary number + * @len: Length of the buffer, can be %NULL if buffer is known to be long + * enough. Set to used buffer length on success if not %NULL. + * Returns: 0 on success, -1 on failure + */ +int +bignum_get_unsigned_bin(const struct bignum *n, u8 *buf, size_t *len) +{ + size_t need = mp_unsigned_bin_size((mp_int *) n); + if (len && need > *len) { + *len = need; + return -1; + } + if (mp_to_unsigned_bin((mp_int *) n, buf) != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + if (len) + *len = need; + return 0; +} + + +/** + * bignum_set_unsigned_bin - Set bignum based on unsigned binary buffer + * @n: Bignum from bignum_init(); to be set to the given value + * @buf: Buffer with unsigned binary value + * @len: Length of buf in octets + * Returns: 0 on success, -1 on failure + */ +int +bignum_set_unsigned_bin(struct bignum *n, const u8 *buf, size_t len) +{ + if (mp_read_unsigned_bin((mp_int *) n, (u8 *) buf, len) != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} + + +/** + * bignum_cmp - Signed comparison + * @a: Bignum from bignum_init() + * @b: Bignum from bignum_init() + * Returns: 0 on success, -1 on failure + */ +int +bignum_cmp(const struct bignum *a, const struct bignum *b) +{ + return mp_cmp((mp_int *) a, (mp_int *) b); +} + + +/** + * bignum_cmd_d - Compare bignum to standard integer + * @a: Bignum from bignum_init() + * @b: Small integer + * Returns: 0 on success, -1 on failure + */ +int +bignum_cmp_d(const struct bignum *a, unsigned long b) +{ + return mp_cmp_d((mp_int *) a, b); +} + + +/** + * bignum_add - c = a + b + * @a: Bignum from bignum_init() + * @b: Bignum from bignum_init() + * @c: Bignum from bignum_init(); used to store the result of a + b + * Returns: 0 on success, -1 on failure + */ +int +bignum_add(const struct bignum *a, const struct bignum *b, + struct bignum *c) +{ + if (mp_add((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} + + +/** + * bignum_sub - c = a - b + * @a: Bignum from bignum_init() + * @b: Bignum from bignum_init() + * @c: Bignum from bignum_init(); used to store the result of a - b + * Returns: 0 on success, -1 on failure + */ +int +bignum_sub(const struct bignum *a, const struct bignum *b, + struct bignum *c) +{ + if (mp_sub((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} + + +/** + * bignum_mul - c = a * b + * @a: Bignum from bignum_init() + * @b: Bignum from bignum_init() + * @c: Bignum from bignum_init(); used to store the result of a * b + * Returns: 0 on success, -1 on failure + */ +int +bignum_mul(const struct bignum *a, const struct bignum *b, + struct bignum *c) +{ + if (mp_mul((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} + + +/** + * bignum_mulmod - d = a * b (mod c) + * @a: Bignum from bignum_init() + * @b: Bignum from bignum_init() + * @c: Bignum from bignum_init(); modulus + * @d: Bignum from bignum_init(); used to store the result of a * b (mod c) + * Returns: 0 on success, -1 on failure + */ +int +bignum_mulmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d) +{ + if (mp_mulmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d) + != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} + + +/** + * bignum_exptmod - Modular exponentiation: d = a^b (mod c) + * @a: Bignum from bignum_init(); base + * @b: Bignum from bignum_init(); exponent + * @c: Bignum from bignum_init(); modulus + * @d: Bignum from bignum_init(); used to store the result of a^b (mod c) + * Returns: 0 on success, -1 on failure + */ +int +bignum_exptmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d) +{ + if (mp_exptmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d) + != MP_OKAY) { + wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); + return -1; + } + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/bignum.h b/components/wpa_supplicant/src/crypto/bignum.h new file mode 100644 index 000000000..f25e26783 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/bignum.h @@ -0,0 +1,38 @@ +/* + * Big number math + * Copyright (c) 2006, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef BIGNUM_H +#define BIGNUM_H + +struct bignum; + +struct bignum * bignum_init(void); +void bignum_deinit(struct bignum *n); +size_t bignum_get_unsigned_bin_len(struct bignum *n); +int bignum_get_unsigned_bin(const struct bignum *n, u8 *buf, size_t *len); +int bignum_set_unsigned_bin(struct bignum *n, const u8 *buf, size_t len); +int bignum_cmp(const struct bignum *a, const struct bignum *b); +int bignum_cmp_d(const struct bignum *a, unsigned long b); +int bignum_add(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_sub(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_mul(const struct bignum *a, const struct bignum *b, + struct bignum *c); +int bignum_mulmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d); +int bignum_exptmod(const struct bignum *a, const struct bignum *b, + const struct bignum *c, struct bignum *d); + +#endif /* BIGNUM_H */ diff --git a/components/wpa_supplicant/src/crypto/crypto_internal-cipher.c b/components/wpa_supplicant/src/crypto/crypto_internal-cipher.c new file mode 100644 index 000000000..7d8979579 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/crypto_internal-cipher.c @@ -0,0 +1,268 @@ +/* + * Crypto wrapper for internal crypto implementation - Cipher wrappers + * Copyright (c) 2006-2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +//#include "wpa/includes.h" + +//#include "wpa/common.h" +#include "crypto/common.h" +#include "crypto/crypto.h" +#include "crypto/aes.h" +#if defined(CONFIG_DES) || defined(CONFIG_DES3) +#include "crypto/des_i.h" +#endif + +#ifdef MEMLEAK_DEBUG +static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__; +#endif + + +struct crypto_cipher { + enum crypto_cipher_alg alg; + union { + struct { + size_t used_bytes; + u8 key[16]; + size_t keylen; + } rc4; + struct { + u8 cbc[32]; + void *ctx_enc; + void *ctx_dec; + } aes; +#ifdef CONFIG_DES3 + struct { + struct des3_key_s key; + u8 cbc[8]; + } des3; +#endif +#ifdef CONFIG_DES + struct { + u32 ek[32]; + u32 dk[32]; + u8 cbc[8]; + } des; +#endif + } u; +}; + + +struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, + const u8 *iv, const u8 *key, + size_t key_len) +{ + struct crypto_cipher *ctx; + + ctx = (struct crypto_cipher *)os_zalloc(sizeof(*ctx)); + if (ctx == NULL) + return NULL; + + ctx->alg = alg; + + switch (alg) { + case CRYPTO_CIPHER_ALG_RC4: + if (key_len > sizeof(ctx->u.rc4.key)) { + os_free(ctx); + return NULL; + } + ctx->u.rc4.keylen = key_len; + os_memcpy(ctx->u.rc4.key, key, key_len); + break; + case CRYPTO_CIPHER_ALG_AES: + ctx->u.aes.ctx_enc = aes_encrypt_init(key, key_len); + if (ctx->u.aes.ctx_enc == NULL) { + os_free(ctx); + return NULL; + } + ctx->u.aes.ctx_dec = aes_decrypt_init(key, key_len); + if (ctx->u.aes.ctx_dec == NULL) { + aes_encrypt_deinit(ctx->u.aes.ctx_enc); + os_free(ctx); + return NULL; + } + os_memcpy(ctx->u.aes.cbc, iv, AES_BLOCK_SIZE); + break; +#ifdef CONFIG_DES3 + case CRYPTO_CIPHER_ALG_3DES: + if (key_len != 24) { + os_free(ctx); + return NULL; + } + des3_key_setup(key, &ctx->u.des3.key); + os_memcpy(ctx->u.des3.cbc, iv, 8); + break; +#endif +#ifdef CONFIG_DES + case CRYPTO_CIPHER_ALG_DES: + if (key_len != 8) { + os_free(ctx); + return NULL; + } + des_key_setup(key, ctx->u.des.ek, ctx->u.des.dk); + os_memcpy(ctx->u.des.cbc, iv, 8); + break; +#endif + default: + os_free(ctx); + return NULL; + } + + return ctx; +} + + +int crypto_cipher_encrypt(struct crypto_cipher *ctx, const u8 *plain, + u8 *crypt, size_t len) +{ + size_t i, j, blocks; + + switch (ctx->alg) { + case CRYPTO_CIPHER_ALG_RC4: + if (plain != crypt) + os_memcpy(crypt, plain, len); + rc4_skip(ctx->u.rc4.key, ctx->u.rc4.keylen, + ctx->u.rc4.used_bytes, crypt, len); + ctx->u.rc4.used_bytes += len; + break; + case CRYPTO_CIPHER_ALG_AES: + if (len % AES_BLOCK_SIZE) + return -1; + blocks = len / AES_BLOCK_SIZE; + for (i = 0; i < blocks; i++) { + for (j = 0; j < AES_BLOCK_SIZE; j++) + ctx->u.aes.cbc[j] ^= plain[j]; + aes_encrypt(ctx->u.aes.ctx_enc, ctx->u.aes.cbc, + ctx->u.aes.cbc); + os_memcpy(crypt, ctx->u.aes.cbc, AES_BLOCK_SIZE); + plain += AES_BLOCK_SIZE; + crypt += AES_BLOCK_SIZE; + } + break; +#ifdef CONFIG_DES3 + case CRYPTO_CIPHER_ALG_3DES: + if (len % 8) + return -1; + blocks = len / 8; + for (i = 0; i < blocks; i++) { + for (j = 0; j < 8; j++) + ctx->u.des3.cbc[j] ^= plain[j]; + des3_encrypt(ctx->u.des3.cbc, &ctx->u.des3.key, + ctx->u.des3.cbc); + os_memcpy(crypt, ctx->u.des3.cbc, 8); + plain += 8; + crypt += 8; + } + break; +#endif +#ifdef CONFIG_DES + case CRYPTO_CIPHER_ALG_DES: + if (len % 8) + return -1; + blocks = len / 8; + for (i = 0; i < blocks; i++) { + for (j = 0; j < 8; j++) + ctx->u.des3.cbc[j] ^= plain[j]; + des_block_encrypt(ctx->u.des.cbc, ctx->u.des.ek, + ctx->u.des.cbc); + os_memcpy(crypt, ctx->u.des.cbc, 8); + plain += 8; + crypt += 8; + } + break; +#endif + default: + return -1; + } + + return 0; +} + + +int crypto_cipher_decrypt(struct crypto_cipher *ctx, const u8 *crypt, + u8 *plain, size_t len) +{ + size_t i, j, blocks; + u8 tmp[32]; + + switch (ctx->alg) { + case CRYPTO_CIPHER_ALG_RC4: + if (plain != crypt) + os_memcpy(plain, crypt, len); + rc4_skip(ctx->u.rc4.key, ctx->u.rc4.keylen, + ctx->u.rc4.used_bytes, plain, len); + ctx->u.rc4.used_bytes += len; + break; + case CRYPTO_CIPHER_ALG_AES: + if (len % AES_BLOCK_SIZE) + return -1; + blocks = len / AES_BLOCK_SIZE; + for (i = 0; i < blocks; i++) { + os_memcpy(tmp, crypt, AES_BLOCK_SIZE); + aes_decrypt(ctx->u.aes.ctx_dec, crypt, plain); + for (j = 0; j < AES_BLOCK_SIZE; j++) + plain[j] ^= ctx->u.aes.cbc[j]; + os_memcpy(ctx->u.aes.cbc, tmp, AES_BLOCK_SIZE); + plain += AES_BLOCK_SIZE; + crypt += AES_BLOCK_SIZE; + } + break; +#ifdef CONFIG_DES3 + case CRYPTO_CIPHER_ALG_3DES: + if (len % 8) + return -1; + blocks = len / 8; + for (i = 0; i < blocks; i++) { + os_memcpy(tmp, crypt, 8); + des3_decrypt(crypt, &ctx->u.des3.key, plain); + for (j = 0; j < 8; j++) + plain[j] ^= ctx->u.des3.cbc[j]; + os_memcpy(ctx->u.des3.cbc, tmp, 8); + plain += 8; + crypt += 8; + } + break; +#endif +#ifdef CONFIG_DES + case CRYPTO_CIPHER_ALG_DES: + if (len % 8) + return -1; + blocks = len / 8; + for (i = 0; i < blocks; i++) { + os_memcpy(tmp, crypt, 8); + des_block_decrypt(crypt, ctx->u.des.dk, plain); + for (j = 0; j < 8; j++) + plain[j] ^= ctx->u.des.cbc[j]; + os_memcpy(ctx->u.des.cbc, tmp, 8); + plain += 8; + crypt += 8; + } + break; +#endif + default: + return -1; + } + + return 0; +} + + +void crypto_cipher_deinit(struct crypto_cipher *ctx) +{ + switch (ctx->alg) { + case CRYPTO_CIPHER_ALG_AES: + aes_encrypt_deinit(ctx->u.aes.ctx_enc); + aes_decrypt_deinit(ctx->u.aes.ctx_dec); + break; +#ifdef CONFIG_DES3 + case CRYPTO_CIPHER_ALG_3DES: + break; +#endif + default: + break; + } + os_free(ctx); +} diff --git a/components/wpa_supplicant/src/crypto/crypto_internal-modexp.c b/components/wpa_supplicant/src/crypto/crypto_internal-modexp.c new file mode 100644 index 000000000..ea9785700 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/crypto_internal-modexp.c @@ -0,0 +1,56 @@ +/* + * Crypto wrapper for internal crypto implementation - modexp + * Copyright (c) 2006-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "bignum.h" +#include "crypto/crypto.h" + + +int +crypto_mod_exp(const u8 *base, size_t base_len, + const u8 *power, size_t power_len, + const u8 *modulus, size_t modulus_len, + u8 *result, size_t *result_len) +{ + struct bignum *bn_base, *bn_exp, *bn_modulus, *bn_result; + int ret = -1; + + bn_base = bignum_init(); + bn_exp = bignum_init(); + bn_modulus = bignum_init(); + bn_result = bignum_init(); + + if (bn_base == NULL || bn_exp == NULL || bn_modulus == NULL || + bn_result == NULL) + goto error; + + if (bignum_set_unsigned_bin(bn_base, base, base_len) < 0 || + bignum_set_unsigned_bin(bn_exp, power, power_len) < 0 || + bignum_set_unsigned_bin(bn_modulus, modulus, modulus_len) < 0) + goto error; + + if (bignum_exptmod(bn_base, bn_exp, bn_modulus, bn_result) < 0) + goto error; + + ret = bignum_get_unsigned_bin(bn_result, result, result_len); + +error: + bignum_deinit(bn_base); + bignum_deinit(bn_exp); + bignum_deinit(bn_modulus); + bignum_deinit(bn_result); + return ret; +} diff --git a/components/wpa_supplicant/src/crypto/crypto_internal-rsa.c b/components/wpa_supplicant/src/crypto/crypto_internal-rsa.c new file mode 100644 index 000000000..19934f063 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/crypto_internal-rsa.c @@ -0,0 +1,111 @@ +/* + * Crypto wrapper for internal crypto implementation - RSA parts + * Copyright (c) 2006-2009, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "crypto/common.h" +#include "crypto/crypto.h" + +#include "wpa/includes.h" +#include "wpa/common.h" +#include "wpa/wpa_debug.h" + +#include "wpa2/tls/rsa.h" +#include "wpa2/tls/pkcs1.h" +#include "wpa2/tls/pkcs8.h" + +/* Dummy structures; these are just typecast to struct crypto_rsa_key */ +struct crypto_public_key; +struct crypto_private_key; + + +struct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len) +{ + return (struct crypto_public_key *) + crypto_rsa_import_public_key(key, len); +} + + +struct crypto_private_key * crypto_private_key_import(const u8 *key, + size_t len, + const char *passwd) +{ + struct crypto_private_key *res; + + /* First, check for possible PKCS #8 encoding */ + res = pkcs8_key_import(key, len); + if (res) + return res; + + if (passwd) { + /* Try to parse as encrypted PKCS #8 */ + res = pkcs8_enc_key_import(key, len, passwd); + if (res) + return res; + } + + /* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */ + wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private " + "key"); + return (struct crypto_private_key *) + crypto_rsa_import_private_key(key, len); +} + + +struct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, + size_t len) +{ + /* No X.509 support in crypto_internal.c */ + return NULL; +} + + +int crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key, + const u8 *in, size_t inlen, + u8 *out, size_t *outlen) +{ + return pkcs1_encrypt(2, (struct crypto_rsa_key *) key, + 0, in, inlen, out, outlen); +} + + +int crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key, + const u8 *in, size_t inlen, + u8 *out, size_t *outlen) +{ + return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key, + in, inlen, out, outlen); +} + + +int crypto_private_key_sign_pkcs1(struct crypto_private_key *key, + const u8 *in, size_t inlen, + u8 *out, size_t *outlen) +{ + return pkcs1_encrypt(1, (struct crypto_rsa_key *) key, + 1, in, inlen, out, outlen); +} + + +void crypto_public_key_free(struct crypto_public_key *key) +{ + crypto_rsa_free((struct crypto_rsa_key *) key); +} + + +void crypto_private_key_free(struct crypto_private_key *key) +{ + crypto_rsa_free((struct crypto_rsa_key *) key); +} + + +int crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key, + const u8 *crypt, size_t crypt_len, + u8 *plain, size_t *plain_len) +{ + return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key, + crypt, crypt_len, plain, plain_len); +} diff --git a/components/wpa_supplicant/src/crypto/crypto_internal.c b/components/wpa_supplicant/src/crypto/crypto_internal.c new file mode 100644 index 000000000..d8d59dfb9 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/crypto_internal.c @@ -0,0 +1,280 @@ +/* + * Crypto wrapper for internal crypto implementation + * Copyright (c) 2006-2011, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "crypto/includes.h" +#include "crypto/common.h" +//#include "wpa/common.h" +#include "crypto/crypto.h" +//#include "crypto/sha256_i.h" +#include "crypto/sha1_i.h" +#include "crypto/md5_i.h" + +#ifdef MEMLEAK_DEBUG +static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__; +#endif + + +struct crypto_hash { + enum crypto_hash_alg alg; + union { + struct MD5Context md5; + struct SHA1Context sha1; +#ifdef CONFIG_SHA256 + struct sha256_state sha256; +#endif /* CONFIG_SHA256 */ + } u; + u8 key[64]; + size_t key_len; +}; + + +struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, + size_t key_len) +{ + struct crypto_hash *ctx; + u8 k_pad[64]; + u8 tk[32]; + size_t i; + + ctx = (struct crypto_hash *)os_zalloc(sizeof(*ctx)); + if (ctx == NULL) + return NULL; + + ctx->alg = alg; + + switch (alg) { + case CRYPTO_HASH_ALG_MD5: + MD5Init(&ctx->u.md5); + break; + case CRYPTO_HASH_ALG_SHA1: + SHA1Init(&ctx->u.sha1); + break; +#ifdef CONFIG_SHA256 + case CRYPTO_HASH_ALG_SHA256: + sha256_init(&ctx->u.sha256); + break; +#endif /* CONFIG_SHA256 */ + case CRYPTO_HASH_ALG_HMAC_MD5: + if (key_len > sizeof(k_pad)) { + MD5Init(&ctx->u.md5); + MD5Update(&ctx->u.md5, key, key_len); + MD5Final(tk, &ctx->u.md5); + key = tk; + key_len = 16; + } + os_memcpy(ctx->key, key, key_len); + ctx->key_len = key_len; + + os_memcpy(k_pad, key, key_len); + if (key_len < sizeof(k_pad)) + os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x36; + MD5Init(&ctx->u.md5); + MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); + break; + case CRYPTO_HASH_ALG_HMAC_SHA1: + if (key_len > sizeof(k_pad)) { + SHA1Init(&ctx->u.sha1); + SHA1Update(&ctx->u.sha1, key, key_len); + SHA1Final(tk, &ctx->u.sha1); + key = tk; + key_len = 20; + } + os_memcpy(ctx->key, key, key_len); + ctx->key_len = key_len; + + os_memcpy(k_pad, key, key_len); + if (key_len < sizeof(k_pad)) + os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x36; + SHA1Init(&ctx->u.sha1); + SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); + break; +#ifdef CONFIG_SHA256 + case CRYPTO_HASH_ALG_HMAC_SHA256: + if (key_len > sizeof(k_pad)) { + sha256_init(&ctx->u.sha256); + sha256_process(&ctx->u.sha256, key, key_len); + sha256_done(&ctx->u.sha256, tk); + key = tk; + key_len = 32; + } + os_memcpy(ctx->key, key, key_len); + ctx->key_len = key_len; + + os_memcpy(k_pad, key, key_len); + if (key_len < sizeof(k_pad)) + os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x36; + sha256_init(&ctx->u.sha256); + sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); + break; +#endif /* CONFIG_SHA256 */ + default: + os_free(ctx); + return NULL; + } + + return ctx; +} + + +void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len) +{ + if (ctx == NULL) + return; + + switch (ctx->alg) { + case CRYPTO_HASH_ALG_MD5: + case CRYPTO_HASH_ALG_HMAC_MD5: + MD5Update(&ctx->u.md5, data, len); + break; + case CRYPTO_HASH_ALG_SHA1: + case CRYPTO_HASH_ALG_HMAC_SHA1: + SHA1Update(&ctx->u.sha1, data, len); + break; +#ifdef CONFIG_SHA256 + case CRYPTO_HASH_ALG_SHA256: + case CRYPTO_HASH_ALG_HMAC_SHA256: + sha256_process(&ctx->u.sha256, data, len); + break; +#endif /* CONFIG_SHA256 */ + default: + break; + } +} + + +int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len) +{ + u8 k_pad[64]; + size_t i; + + if (ctx == NULL) + return -2; + + if (mac == NULL || len == NULL) { + os_free(ctx); + return 0; + } + + switch (ctx->alg) { + case CRYPTO_HASH_ALG_MD5: + if (*len < 16) { + *len = 16; + os_free(ctx); + return -1; + } + *len = 16; + MD5Final(mac, &ctx->u.md5); + break; + case CRYPTO_HASH_ALG_SHA1: + if (*len < 20) { + *len = 20; + os_free(ctx); + return -1; + } + *len = 20; + SHA1Final(mac, &ctx->u.sha1); + break; +#ifdef CONFIG_SHA256 + case CRYPTO_HASH_ALG_SHA256: + if (*len < 32) { + *len = 32; + os_free(ctx); + return -1; + } + *len = 32; + sha256_done(&ctx->u.sha256, mac); + break; +#endif /* CONFIG_SHA256 */ + case CRYPTO_HASH_ALG_HMAC_MD5: + if (*len < 16) { + *len = 16; + os_free(ctx); + return -1; + } + *len = 16; + + MD5Final(mac, &ctx->u.md5); + + os_memcpy(k_pad, ctx->key, ctx->key_len); + os_memset(k_pad + ctx->key_len, 0, + sizeof(k_pad) - ctx->key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x5c; + MD5Init(&ctx->u.md5); + MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); + MD5Update(&ctx->u.md5, mac, 16); + MD5Final(mac, &ctx->u.md5); + break; + case CRYPTO_HASH_ALG_HMAC_SHA1: + if (*len < 20) { + *len = 20; + os_free(ctx); + return -1; + } + *len = 20; + + SHA1Final(mac, &ctx->u.sha1); + + os_memcpy(k_pad, ctx->key, ctx->key_len); + os_memset(k_pad + ctx->key_len, 0, + sizeof(k_pad) - ctx->key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x5c; + SHA1Init(&ctx->u.sha1); + SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); + SHA1Update(&ctx->u.sha1, mac, 20); + SHA1Final(mac, &ctx->u.sha1); + break; +#ifdef CONFIG_SHA256 + case CRYPTO_HASH_ALG_HMAC_SHA256: + if (*len < 32) { + *len = 32; + os_free(ctx); + return -1; + } + *len = 32; + + sha256_done(&ctx->u.sha256, mac); + + os_memcpy(k_pad, ctx->key, ctx->key_len); + os_memset(k_pad + ctx->key_len, 0, + sizeof(k_pad) - ctx->key_len); + for (i = 0; i < sizeof(k_pad); i++) + k_pad[i] ^= 0x5c; + sha256_init(&ctx->u.sha256); + sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); + sha256_process(&ctx->u.sha256, mac, 32); + sha256_done(&ctx->u.sha256, mac); + break; +#endif /* CONFIG_SHA256 */ + default: + os_free(ctx); + return -1; + } + + os_free(ctx); + + return 0; +} + + +int crypto_global_init(void) +{ + return 0; +} + + +void crypto_global_deinit(void) +{ +} diff --git a/components/wpa_supplicant/src/crypto/dh_group5.c b/components/wpa_supplicant/src/crypto/dh_group5.c new file mode 100644 index 000000000..710f5c7d0 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/dh_group5.c @@ -0,0 +1,43 @@ +/* + * Diffie-Hellman group 5 operations + * Copyright (c) 2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/dh_groups.h" +#include "crypto/dh_group5.h" + + +void * +dh5_init(struct wpabuf **priv, struct wpabuf **publ) +{ + *publ = dh_init(dh_groups_get(5), priv); + if (*publ == 0) + return NULL; + return (void *) 1; +} + + +struct wpabuf * +dh5_derive_shared(void *ctx, const struct wpabuf *peer_public, + const struct wpabuf *own_private) +{ + return dh_derive_shared(peer_public, own_private, dh_groups_get(5)); +} + + +void +dh5_free(void *ctx) +{ +} diff --git a/components/wpa_supplicant/src/crypto/dh_groups.c b/components/wpa_supplicant/src/crypto/dh_groups.c new file mode 100644 index 000000000..6ec9a36a9 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/dh_groups.c @@ -0,0 +1,641 @@ +/* + * Diffie-Hellman groups + * Copyright (c) 2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/crypto.h" +#include "crypto/random.h" +#include "crypto/dh_groups.h" +#include "wpa/wpabuf.h" +#include "wpa/wpa_debug.h" + +extern int crypto_mod_exp(const u8 *base, size_t base_len, + const u8 *power, size_t power_len, + const u8 *modulus, size_t modulus_len, + u8 *result, size_t *result_len); + +#ifdef ALL_DH_GROUPS + +/* RFC 4306, B.1. Group 1 - 768 Bit MODP + * Generator: 2 + * Prime: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 } + */ +static const u8 dh_group1_generator[1] = { 0x02 }; +static const u8 dh_group1_prime[96] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x20, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* RFC 4306, B.2. Group 2 - 1024 Bit MODP + * Generator: 2 + * Prime: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 } + */ +static const u8 dh_group2_generator[1] = { 0x02 }; +static const u8 dh_group2_prime[128] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +#endif /* ALL_DH_GROUPS */ + +/* RFC 3526, 2. Group 5 - 1536 Bit MODP + * Generator: 2 + * Prime: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 } + */ +static const u8 dh_group5_generator[1] = { 0x02 }; +static const u8 dh_group5_prime[192] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x23, 0x73, 0x27, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +#ifdef ALL_DH_GROUPS + +/* RFC 3526, 3. Group 14 - 2048 Bit MODP + * Generator: 2 + * Prime: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 } + */ +static const u8 dh_group14_generator[1] = { 0x02 }; +static const u8 dh_group14_prime[256] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* RFC 3526, 4. Group 15 - 3072 Bit MODP + * Generator: 2 + * Prime: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 } + */ +static const u8 dh_group15_generator[1] = { 0x02 }; +static const u8 dh_group15_prime[384] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* RFC 3526, 5. Group 16 - 4096 Bit MODP + * Generator: 2 + * Prime: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 } + */ +static const u8 dh_group16_generator[1] = { 0x02 }; +static const u8 dh_group16_prime[512] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, + 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, + 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, + 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, + 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, + 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, + 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, + 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, + 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, + 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, + 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, + 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* RFC 3526, 6. Group 17 - 6144 Bit MODP + * Generator: 2 + * Prime: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 } + */ +static const u8 dh_group17_generator[1] = { 0x02 }; +static const u8 dh_group17_prime[768] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, + 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, + 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, + 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, + 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, + 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, + 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, + 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, + 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, + 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, + 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, + 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92, + 0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26, + 0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE, + 0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD, + 0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E, + 0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE, + 0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31, + 0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18, + 0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED, + 0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B, + 0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B, + 0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42, + 0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF, + 0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC, + 0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03, + 0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6, + 0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82, + 0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E, + 0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3, + 0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE, + 0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5, + 0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA, + 0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8, + 0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0, + 0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28, + 0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76, + 0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0, + 0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C, + 0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32, + 0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68, + 0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE, + 0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6, + 0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xCC, 0x40, 0x24, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* RFC 3526, 7. Group 18 - 8192 Bit MODP + * Generator: 2 + * Prime: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 } + */ +static const u8 dh_group18_generator[1] = { 0x02 }; +static const u8 dh_group18_prime[1024] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, + 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, + 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, + 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, + 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, + 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, + 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, + 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, + 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, + 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, + 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, + 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92, + 0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26, + 0xC1, 0xD4, 0xDC, 0xB2, 0x60, 0x26, 0x46, 0xDE, + 0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD, + 0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E, + 0xE5, 0xDB, 0x38, 0x2F, 0x41, 0x30, 0x01, 0xAE, + 0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31, + 0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18, + 0xDA, 0x3E, 0xDB, 0xEB, 0xCF, 0x9B, 0x14, 0xED, + 0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B, + 0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B, + 0x33, 0x20, 0x51, 0x51, 0x2B, 0xD7, 0xAF, 0x42, + 0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF, + 0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC, + 0xF0, 0x32, 0xEA, 0x15, 0xD1, 0x72, 0x1D, 0x03, + 0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6, + 0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82, + 0xB5, 0xA8, 0x40, 0x31, 0x90, 0x0B, 0x1C, 0x9E, + 0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3, + 0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE, + 0x0F, 0x1D, 0x45, 0xB7, 0xFF, 0x58, 0x5A, 0xC5, + 0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA, + 0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8, + 0x14, 0xCC, 0x5E, 0xD2, 0x0F, 0x80, 0x37, 0xE0, + 0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28, + 0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76, + 0xF5, 0x50, 0xAA, 0x3D, 0x8A, 0x1F, 0xBF, 0xF0, + 0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C, + 0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32, + 0x38, 0x7F, 0xE8, 0xD7, 0x6E, 0x3C, 0x04, 0x68, + 0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE, + 0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6, + 0xE6, 0x94, 0xF9, 0x1E, 0x6D, 0xBE, 0x11, 0x59, + 0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4, + 0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C, + 0xD8, 0xBE, 0xC4, 0xD0, 0x73, 0xB9, 0x31, 0xBA, + 0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00, + 0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED, + 0x25, 0x76, 0xF6, 0x93, 0x6B, 0xA4, 0x24, 0x66, + 0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68, + 0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78, + 0x23, 0x8F, 0x16, 0xCB, 0xE3, 0x9D, 0x65, 0x2D, + 0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9, + 0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07, + 0x13, 0xEB, 0x57, 0xA8, 0x1A, 0x23, 0xF0, 0xC7, + 0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B, + 0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD, + 0xFA, 0x9D, 0x4B, 0x7F, 0xA2, 0xC0, 0x87, 0xE8, + 0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A, + 0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6, + 0x6D, 0x2A, 0x13, 0xF8, 0x3F, 0x44, 0xF8, 0x2D, + 0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36, + 0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1, + 0x64, 0xF3, 0x1C, 0xC5, 0x08, 0x46, 0x85, 0x1D, + 0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1, + 0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73, + 0xFA, 0xF3, 0x6B, 0xC3, 0x1E, 0xCF, 0xA2, 0x68, + 0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92, + 0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7, + 0x88, 0x9A, 0x00, 0x2E, 0xD5, 0xEE, 0x38, 0x2B, + 0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47, + 0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA, + 0x9E, 0x30, 0x50, 0xE2, 0x76, 0x56, 0x94, 0xDF, + 0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71, + 0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +#endif /* ALL_DH_GROUPS */ + + +#define DH_GROUP(id) \ +{ id, dh_group ## id ## _generator, sizeof(dh_group ## id ## _generator), \ +dh_group ## id ## _prime, sizeof(dh_group ## id ## _prime) } + + +static struct dh_group dh_groups[] = { + DH_GROUP(5), +#ifdef ALL_DH_GROUPS + DH_GROUP(1), + DH_GROUP(2), + DH_GROUP(14), + DH_GROUP(15), + DH_GROUP(16), + DH_GROUP(17), + DH_GROUP(18) +#endif /* ALL_DH_GROUPS */ +}; + +#define NUM_DH_GROUPS (sizeof(dh_groups) / sizeof(dh_groups[0])) + + +const struct dh_group * +dh_groups_get(int id) +{ + size_t i; + + for (i = 0; i < NUM_DH_GROUPS; i++) { + if (dh_groups[i].id == id) + return &dh_groups[i]; + } + return NULL; +} + +/** + * dh_init - Initialize Diffie-Hellman handshake + * @dh: Selected Diffie-Hellman group + * @priv: Pointer for returning Diffie-Hellman private key + * Returns: Diffie-Hellman public value + */ +struct wpabuf * +dh_init(const struct dh_group *dh, struct wpabuf **priv) +{ + struct wpabuf *pv; + size_t pv_len; + + if (dh == NULL) + return NULL; + + wpabuf_free(*priv); + *priv = wpabuf_alloc(dh->prime_len); + if (*priv == NULL) + return NULL; + + if (random_get_bytes(wpabuf_put(*priv, dh->prime_len), dh->prime_len)) + { + wpabuf_free(*priv); + *priv = NULL; + return NULL; + } + + if (os_memcmp(wpabuf_head(*priv), dh->prime, dh->prime_len) > 0) { + /* Make sure private value is smaller than prime */ + *(wpabuf_mhead_u8(*priv)) = 0; + } + wpa_hexdump_buf_key(MSG_DEBUG, "DH: private value", *priv); + + pv_len = dh->prime_len; + pv = wpabuf_alloc(pv_len); + if (pv == NULL) + return NULL; + if (crypto_mod_exp(dh->generator, dh->generator_len, + wpabuf_head(*priv), wpabuf_len(*priv), + dh->prime, dh->prime_len, wpabuf_mhead(pv), + &pv_len) < 0) { + wpabuf_free(pv); + wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed"); + return NULL; + } + wpabuf_put(pv, pv_len); + wpa_hexdump_buf(MSG_DEBUG, "DH: public value", pv); + + return pv; +} + + +/** + * dh_derive_shared - Derive shared Diffie-Hellman key + * @peer_public: Diffie-Hellman public value from peer + * @own_private: Diffie-Hellman private key from dh_init() + * @dh: Selected Diffie-Hellman group + * Returns: Diffie-Hellman shared key + */ +struct wpabuf * +dh_derive_shared(const struct wpabuf *peer_public, + const struct wpabuf *own_private, + const struct dh_group *dh) +{ + struct wpabuf *shared; + size_t shared_len; + + if (dh == NULL || peer_public == NULL || own_private == NULL) + return NULL; + + shared_len = dh->prime_len; + shared = wpabuf_alloc(shared_len); + if (shared == NULL) + return NULL; + if (crypto_mod_exp(wpabuf_head(peer_public), wpabuf_len(peer_public), + wpabuf_head(own_private), wpabuf_len(own_private), + dh->prime, dh->prime_len, + wpabuf_mhead(shared), &shared_len) < 0) { + wpabuf_free(shared); + wpa_printf(MSG_INFO, "DH: crypto_mod_exp failed"); + return NULL; + } + wpabuf_put(shared, shared_len); + wpa_hexdump_buf_key(MSG_DEBUG, "DH: shared key", shared); + + return shared; +} diff --git a/components/wpa_supplicant/src/crypto/libtommath.h b/components/wpa_supplicant/src/crypto/libtommath.h new file mode 100644 index 000000000..1010f9f63 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/libtommath.h @@ -0,0 +1,3441 @@ +/* + * Minimal code for RSA support from LibTomMath 0.41 + * http://libtom.org/ + * http://libtom.org/files/ltm-0.41.tar.bz2 + * This library was released in public domain by Tom St Denis. + * + * The combination in this file may not use all of the optimized algorithms + * from LibTomMath and may be considerable slower than the LibTomMath with its + * default settings. The main purpose of having this version here is to make it + * easier to build bignum.c wrapper without having to install and build an + * external library. + * + * If CONFIG_INTERNAL_LIBTOMMATH is defined, bignum.c includes this + * libtommath.c file instead of using the external LibTomMath library. + */ +//#include "c_types.h" +#include "os.h" +#include "stdarg.h" + + +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + +#define BN_MP_INVMOD_C +#define BN_S_MP_EXPTMOD_C /* Note: #undef in tommath_superclass.h; this would + * require BN_MP_EXPTMOD_FAST_C instead */ +#define BN_S_MP_MUL_DIGS_C +#define BN_MP_INVMOD_SLOW_C +#define BN_S_MP_SQR_C +#define BN_S_MP_MUL_HIGH_DIGS_C /* Note: #undef in tommath_superclass.h; this + * would require other than mp_reduce */ + +#ifdef LTM_FAST + +/* Use faster div at the cost of about 1 kB */ +#define BN_MP_MUL_D_C + +/* Include faster exptmod (Montgomery) at the cost of about 2.5 kB in code */ +#define BN_MP_EXPTMOD_FAST_C +#define BN_MP_MONTGOMERY_SETUP_C +#define BN_FAST_MP_MONTGOMERY_REDUCE_C +#define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +#define BN_MP_MUL_2_C + +/* Include faster sqr at the cost of about 0.5 kB in code */ +#define BN_FAST_S_MP_SQR_C + +#else /* LTM_FAST */ + +#define BN_MP_DIV_SMALL +#define BN_MP_INIT_MULTI_C +#define BN_MP_CLEAR_MULTI_C +#define BN_MP_ABS_C +#endif /* LTM_FAST */ + +/* Current uses do not require support for negative exponent in exptmod, so we + * can save about 1.5 kB in leaving out invmod. */ +#define LTM_NO_NEG_EXP + +/* from tommath.h */ + +#ifndef MIN + #define MIN(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef MAX + #define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +#define OPT_CAST(x) (x *) + +typedef unsigned long mp_digit; +typedef u64 mp_word; + +#define DIGIT_BIT 28 +#define MP_28BIT + + +#define XMALLOC os_malloc +#define XFREE os_free +#define XREALLOC os_realloc + + +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) + +#define MP_LT -1 /* less than */ +#define MP_EQ 0 /* equal to */ +#define MP_GT 1 /* greater than */ + +#define MP_ZPOS 0 /* positive integer */ +#define MP_NEG 1 /* negative */ + +#define MP_OKAY 0 /* ok result */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ + +#define MP_YES 1 /* yes response */ +#define MP_NO 0 /* no response */ + +typedef int mp_err; + +/* define this to use lower memory usage routines (exptmods mostly) */ +#define MP_LOW_MEM + +/* default precision */ +#ifndef MP_PREC + #ifndef MP_LOW_MEM + #define MP_PREC 32 /* default digits of precision */ + #else + #define MP_PREC 8 /* default digits of precision */ + #endif +#endif + +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ +#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) + +/* the infamous mp_int structure */ +typedef struct { + int used, alloc, sign; + mp_digit *dp; +} mp_int; + + +/* ---> Basic Manipulations <--- */ +#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) +#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) +#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) + + +/* prototypes for copied functions */ +#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) +static int s_mp_exptmod(mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); +static int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +static int s_mp_sqr(mp_int * a, mp_int * b); +static int s_mp_mul_high_digs(mp_int * a, mp_int * b, mp_int * c, int digs); + +static int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); + +#ifdef BN_MP_INIT_MULTI_C +static int mp_init_multi(mp_int *mp, ...); +#endif +#ifdef BN_MP_CLEAR_MULTI_C +static void mp_clear_multi(mp_int *mp, ...); +#endif +static int mp_lshd(mp_int * a, int b); +static void mp_set(mp_int * a, mp_digit b); +static void mp_clamp(mp_int * a); +static void mp_exch(mp_int * a, mp_int * b); +static void mp_rshd(mp_int * a, int b); +static void mp_zero(mp_int * a); +static int mp_mod_2d(mp_int * a, int b, mp_int * c); +static int mp_div_2d(mp_int * a, int b, mp_int * c, mp_int * d); +static int mp_init_copy(mp_int * a, mp_int * b); +static int mp_mul_2d(mp_int * a, int b, mp_int * c); +#ifndef LTM_NO_NEG_EXP +static int mp_div_2(mp_int * a, mp_int * b); +static int mp_invmod(mp_int * a, mp_int * b, mp_int * c); +static int mp_invmod_slow(mp_int * a, mp_int * b, mp_int * c); +#endif /* LTM_NO_NEG_EXP */ +static int mp_copy(mp_int * a, mp_int * b); +static int mp_count_bits(mp_int * a); +static int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d); +static int mp_mod(mp_int * a, mp_int * b, mp_int * c); +static int mp_grow(mp_int * a, int size); +static int mp_cmp_mag(mp_int * a, mp_int * b); +#ifdef BN_MP_ABS_C +static int mp_abs(mp_int * a, mp_int * b); +#endif +static int mp_sqr(mp_int * a, mp_int * b); +static int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); +static int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); +static int mp_2expt(mp_int * a, int b); +static int mp_reduce_setup(mp_int * a, mp_int * b); +static int mp_reduce(mp_int * x, mp_int * m, mp_int * mu); +static int mp_init_size(mp_int * a, int size); +#ifdef BN_MP_EXPTMOD_FAST_C +static int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); +#endif /* BN_MP_EXPTMOD_FAST_C */ +#ifdef BN_FAST_S_MP_SQR_C +static int fast_s_mp_sqr (mp_int * a, mp_int * b); +#endif /* BN_FAST_S_MP_SQR_C */ +#ifdef BN_MP_MUL_D_C +static int mp_mul_d (mp_int * a, mp_digit b, mp_int * c); +#endif /* BN_MP_MUL_D_C */ + + + +/* functions from bn_.c */ + + +/* reverse an array, used for radix code */ +static void +bn_reverse (unsigned char *s, int len) +{ + int ix, iy; + unsigned char t; + + ix = 0; + iy = len - 1; + while (ix < iy) { + t = s[ix]; + s[ix] = s[iy]; + s[iy] = t; + ++ix; + --iy; + } +} + + +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ +static int +s_mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int *x; + int olduse, res, min, max; + + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else { + min = a->used; + max = b->used; + x = b; + } + + /* init result */ + if (c->alloc < max + 1) { + if ((res = mp_grow (c, max + 1)) != MP_OKAY) { + return res; + } + } + + /* get old used digit count and set new one */ + olduse = c->used; + c->used = max + 1; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + + /* first input */ + tmpa = a->dp; + + /* second input */ + tmpb = b->dp; + + /* destination */ + tmpc = c->dp; + + /* zero the carry */ + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in + */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + } + + /* add carry */ + *tmpc++ = u; + + /* clear digits above oldused */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + + +/* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ +static int +s_mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int olduse, res, min, max; + + /* find sizes */ + min = b->used; + max = a->used; + + /* init result */ + if (c->alloc < max) { + if ((res = mp_grow (c, max)) != MP_OKAY) { + return res; + } + } + olduse = c->used; + c->used = max; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + tmpa = a->dp; + tmpb = b->dp; + tmpc = c->dp; + + /* set carry to zero */ + u = 0; + for (i = 0; i < min; i++) { + /* T[i] = A[i] - B[i] - U */ + *tmpc = *tmpa++ - *tmpb++ - u; + + /* U = carry bit of T[i] + * Note this saves performing an AND operation since + * if a carry does occur it will propagate all the way to the + * MSB. As a result a single shift is enough to get the carry + */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, e.g. if A has more digits than B */ + for (; i < max; i++) { + /* T[i] = A[i] - U */ + *tmpc = *tmpa++ - u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + + +/* init a new mp_int */ +static int +mp_init (mp_int * a) +{ + int i; + + /* allocate memory required and clear it */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the digits to zero */ + for (i = 0; i < MP_PREC; i++) { + a->dp[i] = 0; + } + + /* set the used to zero, allocated digits to the default precision + * and sign to positive */ + a->used = 0; + a->alloc = MP_PREC; + a->sign = MP_ZPOS; + + return MP_OKAY; +} + + +/* clear one (frees) */ +static void +mp_clear (mp_int * a) +{ + int i; + + /* only do anything if a hasn't been freed previously */ + if (a->dp != NULL) { + /* first zero the digits */ + for (i = 0; i < a->used; i++) { + a->dp[i] = 0; + } + + /* free ram */ + XFREE(a->dp); + + /* reset members to make debugging easier */ + a->dp = NULL; + a->alloc = a->used = 0; + a->sign = MP_ZPOS; + } +} + + +/* high level addition (handles signs) */ +static int +mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + /* get sign of both inputs */ + sa = a->sign; + sb = b->sign; + + /* handle two cases, not four */ + if (sa == sb) { + /* both positive or both negative */ + /* add their magnitudes, copy the sign */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* one positive, the other negative */ + /* subtract the one with the greater magnitude from */ + /* the one of the lesser magnitude. The result gets */ + /* the sign of the one with the greater magnitude. */ + if (mp_cmp_mag (a, b) == MP_LT) { + c->sign = sb; + res = s_mp_sub (b, a, c); + } else { + c->sign = sa; + res = s_mp_sub (a, b, c); + } + } + return res; +} + + +/* high level subtraction (handles signs) */ +static int +mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + sa = a->sign; + sb = b->sign; + + if (sa != sb) { + /* subtract a negative from a positive, OR */ + /* subtract a positive from a negative. */ + /* In either case, ADD their magnitudes, */ + /* and use the sign of the first number. */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* subtract a positive from a positive, OR */ + /* subtract a negative from a negative. */ + /* First, take the difference between their */ + /* magnitudes, then... */ + if (mp_cmp_mag (a, b) != MP_LT) { + /* Copy the sign from the first */ + c->sign = sa; + /* The first has a larger or equal magnitude */ + res = s_mp_sub (a, b, c); + } else { + /* The result has the *opposite* sign from */ + /* the first number. */ + c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; + /* The second has a larger magnitude */ + res = s_mp_sub (b, a, c); + } + } + return res; +} + + +/* high level multiplication (handles sign) */ +static int +mp_mul (mp_int * a, mp_int * b, mp_int * c) +{ + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + + /* use Toom-Cook? */ +#ifdef BN_MP_TOOM_MUL_C + if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { + res = mp_toom_mul(a, b, c); + } else +#endif +#ifdef BN_MP_KARATSUBA_MUL_C + /* use Karatsuba? */ + if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { + res = mp_karatsuba_mul (a, b, c); + } else +#endif + { + /* can we use the fast multiplier? + * + * The fast multiplier can be used if the output will + * have less than MP_WARRAY digits and the number of + * digits won't affect carry propagation + */ +#ifdef BN_FAST_S_MP_MUL_DIGS_C + int digs = a->used + b->used + 1; + + if ((digs < MP_WARRAY) && + MIN(a->used, b->used) <= + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + res = fast_s_mp_mul_digs (a, b, c, digs); + } else +#endif +#ifdef BN_S_MP_MUL_DIGS_C + res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ +#else +#error mp_mul could fail + res = MP_VAL; +#endif + + } + c->sign = (c->used > 0) ? neg : MP_ZPOS; + return res; +} + + +/* d = a * b (mod c) */ +static int +mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} + + +/* c = a mod b, 0 <= c < b */ +static int +mp_mod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int t; + int res; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if (t.sign != b->sign) { + res = mp_add (b, &t, c); + } else { + res = MP_OKAY; + mp_exch (&t, c); + } + + mp_clear (&t); + return res; +} + + +/* this is a shell function that calls either the normal or Montgomery + * exptmod functions. Originally the call to the montgomery code was + * embedded in the normal function but that wasted a lot of stack space + * for nothing (since 99% of the time the Montgomery code would be called) + */ +static int +mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + int dr; + + /* modulus P must be positive */ + if (P->sign == MP_NEG) { + return MP_VAL; + } + + /* if exponent X is negative we have to recurse */ + if (X->sign == MP_NEG) { +#ifdef LTM_NO_NEG_EXP + return MP_VAL; +#else /* LTM_NO_NEG_EXP */ +#ifdef BN_MP_INVMOD_C + mp_int tmpG, tmpX; + int err; + + /* first compute 1/G mod P */ + if ((err = mp_init(&tmpG)) != MP_OKAY) { + return err; + } + if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + + /* now get |X| */ + if ((err = mp_init(&tmpX)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; + } + + /* and now compute (1/G)**|X| instead of G**X [X < 0] */ + err = mp_exptmod(&tmpG, &tmpX, P, Y); + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; +#else +#error mp_exptmod would always fail + /* no invmod */ + return MP_VAL; +#endif +#endif /* LTM_NO_NEG_EXP */ + } + +/* modified diminished radix reduction */ +#if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C) + if (mp_reduce_is_2k_l(P) == MP_YES) { + return s_mp_exptmod(G, X, P, Y, 1); + } +#endif + +#ifdef BN_MP_DR_IS_MODULUS_C + /* is it a DR modulus? */ + dr = mp_dr_is_modulus(P); +#else + /* default to no */ + dr = 0; +#endif + +#ifdef BN_MP_REDUCE_IS_2K_C + /* if not, is it a unrestricted DR modulus? */ + if (dr == 0) { + dr = mp_reduce_is_2k(P) << 1; + } +#endif + + /* if the modulus is odd or dr != 0 use the montgomery method */ +#ifdef BN_MP_EXPTMOD_FAST_C + if (mp_isodd (P) == 1 || dr != 0) { + return mp_exptmod_fast (G, X, P, Y, dr); + } else { +#endif +#ifdef BN_S_MP_EXPTMOD_C + (void) dr; + /* otherwise use the generic Barrett reduction technique */ + return s_mp_exptmod (G, X, P, Y, 0); +#else +#error mp_exptmod could fail + /* no exptmod for evens */ + return MP_VAL; +#endif +#ifdef BN_MP_EXPTMOD_FAST_C + } +#endif +} + + +/* compare two ints (signed)*/ +static int +mp_cmp (mp_int * a, mp_int * b) +{ + /* compare based on sign */ + if (a->sign != b->sign) { + if (a->sign == MP_NEG) { + return MP_LT; + } else { + return MP_GT; + } + } + + /* compare digits */ + if (a->sign == MP_NEG) { + /* if negative compare opposite direction */ + return mp_cmp_mag(b, a); + } else { + return mp_cmp_mag(a, b); + } +} + + +/* compare a digit */ +static int +mp_cmp_d(mp_int * a, mp_digit b) +{ + /* compare based on sign */ + if (a->sign == MP_NEG) { + return MP_LT; + } + + /* compare based on magnitude */ + if (a->used > 1) { + return MP_GT; + } + + /* compare the only digit of a to b */ + if (a->dp[0] > b) { + return MP_GT; + } else if (a->dp[0] < b) { + return MP_LT; + } else { + return MP_EQ; + } +} + + +#ifndef LTM_NO_NEG_EXP +/* hac 14.61, pp608 */ +static int +mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + +#ifdef BN_FAST_MP_INVMOD_C + /* if the modulus is odd we can use a faster routine instead */ + if (mp_isodd (b) == 1) { + return fast_mp_invmod (a, b, c); + } +#endif + +#ifdef BN_MP_INVMOD_SLOW_C + return mp_invmod_slow(a, b, c); +#endif + +#ifndef BN_FAST_MP_INVMOD_C +#ifndef BN_MP_INVMOD_SLOW_C +#error mp_invmod would always fail +#endif +#endif + return MP_VAL; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* get the size for an unsigned equivalent */ +static int +mp_unsigned_bin_size (mp_int * a) +{ + int size = mp_count_bits (a); + return (size / 8 + ((size & 7) != 0 ? 1 : 0)); +} + + +#ifndef LTM_NO_NEG_EXP +/* hac 14.61, pp608 */ +static int +mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + + /* init temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, + &A, &B, &C, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x = a, y = b */ + if ((res = mp_mod(a, b, &x)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (b, &y)) != MP_OKAY) { + goto LBL_ERR; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto LBL_ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto LBL_ERR; + } + mp_set (&A, 1); + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto LBL_ERR; + } + /* 4.2 if A or B is odd then */ + if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto LBL_ERR; + } + /* 5.2 if C or D is odd then */ + if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto LBL_ERR; + } + + /* if its too low */ + while (mp_cmp_d(&C, 0) == MP_LT) { + if ((res = mp_add(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* too big */ + while (mp_cmp_mag(&C, b) != MP_LT) { + if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* C is now the inverse */ + mp_exch (&C, c); + res = MP_OKAY; +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); + return res; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* compare maginitude of two ints (unsigned) */ +static int +mp_cmp_mag (mp_int * a, mp_int * b) +{ + int n; + mp_digit *tmpa, *tmpb; + + /* compare based on # of non-zero digits */ + if (a->used > b->used) { + return MP_GT; + } + + if (a->used < b->used) { + return MP_LT; + } + + /* alias for a */ + tmpa = a->dp + (a->used - 1); + + /* alias for b */ + tmpb = b->dp + (a->used - 1); + + /* compare based on digits */ + for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { + if (*tmpa > *tmpb) { + return MP_GT; + } + + if (*tmpa < *tmpb) { + return MP_LT; + } + } + return MP_EQ; +} + + +/* reads a unsigned char array, assumes the msb is stored first [big endian] */ +static int +mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c) +{ + int res; + + /* make sure there are at least two digits */ + if (a->alloc < 2) { + if ((res = mp_grow(a, 2)) != MP_OKAY) { + return res; + } + } + + /* zero the int */ + mp_zero (a); + + /* read the bytes in */ + while (c-- > 0) { + if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { + return res; + } + +#ifndef MP_8BIT + a->dp[0] |= *b++; + a->used += 1; +#else + a->dp[0] = (*b & MP_MASK); + a->dp[1] |= ((*b++ >> 7U) & 1); + a->used += 2; +#endif + } + mp_clamp (a); + return MP_OKAY; +} + + +/* store in unsigned [big endian] format */ +static int +mp_to_unsigned_bin (mp_int * a, unsigned char *b) +{ + int x, res; + mp_int t; + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + x = 0; + while (mp_iszero (&t) == 0) { +#ifndef MP_8BIT + b[x++] = (unsigned char) (t.dp[0] & 255); +#else + b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); +#endif + if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + bn_reverse (b, x); + mp_clear (&t); + return MP_OKAY; +} + + +/* shift right by a certain bit count (store quotient in c, optional remainder in d) */ +static int +mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) +{ + mp_digit D, r, rr; + int x, res; + mp_int t; + + + /* if the shift count is <= 0 then we do no work */ + if (b <= 0) { + res = mp_copy (a, c); + if (d != NULL) { + mp_zero (d); + } + return res; + } + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + /* get the remainder */ + if (d != NULL) { + if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + mp_rshd (c, b / DIGIT_BIT); + } + + /* shift any bit count < DIGIT_BIT */ + D = (mp_digit) (b % DIGIT_BIT); + if (D != 0) { + register mp_digit *tmpc, mask, shift; + + /* mask */ + mask = (((mp_digit)1) << D) - 1; + + /* shift for lsb */ + shift = DIGIT_BIT - D; + + /* alias */ + tmpc = c->dp + (c->used - 1); + + /* carry */ + r = 0; + for (x = c->used - 1; x >= 0; x--) { + /* get the lower bits of this word in a temp */ + rr = *tmpc & mask; + + /* shift the current word and mix in the carry bits from the previous word */ + *tmpc = (*tmpc >> D) | (r << shift); + --tmpc; + + /* set the carry to the carry bits of the current word found above */ + r = rr; + } + } + mp_clamp (c); + if (d != NULL) { + mp_exch (&t, d); + } + mp_clear (&t); + return MP_OKAY; +} + + +static int +mp_init_copy (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_init (a)) != MP_OKAY) { + return res; + } + return mp_copy (b, a); +} + + +/* set to zero */ +static void +mp_zero (mp_int * a) +{ + int n; + mp_digit *tmp; + + a->sign = MP_ZPOS; + a->used = 0; + + tmp = a->dp; + for (n = 0; n < a->alloc; n++) { + *tmp++ = 0; + } +} + + +/* copy, b = a */ +static int +mp_copy (mp_int * a, mp_int * b) +{ + int res, n; + + /* if dst == src do nothing */ + if (a == b) { + return MP_OKAY; + } + + /* grow dest */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + /* zero b and copy the parameters over */ + { + register mp_digit *tmpa, *tmpb; + + /* pointer aliases */ + + /* source */ + tmpa = a->dp; + + /* destination */ + tmpb = b->dp; + + /* copy all the digits */ + for (n = 0; n < a->used; n++) { + *tmpb++ = *tmpa++; + } + + /* clear high digits */ + for (; n < b->used; n++) { + *tmpb++ = 0; + } + } + + /* copy used count and sign */ + b->used = a->used; + b->sign = a->sign; + return MP_OKAY; +} + + +/* shift right a certain amount of digits */ +static void +mp_rshd (mp_int * a, int b) +{ + int x; + + /* if b <= 0 then ignore it */ + if (b <= 0) { + return; + } + + /* if b > used then simply zero it and return */ + if (a->used <= b) { + mp_zero (a); + return; + } + + { + register mp_digit *bottom, *top; + + /* shift the digits down */ + + /* bottom */ + bottom = a->dp; + + /* top [offset into digits] */ + top = a->dp + b; + + /* this is implemented as a sliding window where + * the window is b-digits long and digits from + * the top of the window are copied to the bottom + * + * e.g. + + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> + /\ | ----> + \-------------------/ ----> + */ + for (x = 0; x < (a->used - b); x++) { + *bottom++ = *top++; + } + + /* zero the top digits */ + for (; x < a->used; x++) { + *bottom++ = 0; + } + } + + /* remove excess digits */ + a->used -= b; +} + + +/* swap the elements of two integers, for cases where you can't simply swap the + * mp_int pointers around + */ +static void +mp_exch (mp_int * a, mp_int * b) +{ + mp_int t; + + t = *a; + *a = *b; + *b = t; +} + + +/* trim unused digits + * + * This is used to ensure that leading zero digits are + * trimed and the leading "used" digit will be non-zero + * Typically very fast. Also fixes the sign if there + * are no more leading digits + */ +static void +mp_clamp (mp_int * a) +{ + /* decrease used while the most significant digit is + * zero. + */ + while (a->used > 0 && a->dp[a->used - 1] == 0) { + --(a->used); + } + + /* reset the sign flag if used == 0 */ + if (a->used == 0) { + a->sign = MP_ZPOS; + } +} + + +/* grow as required */ +static int +mp_grow (mp_int * a, int size) +{ + int i; + mp_digit *tmp; + + /* if the alloc size is smaller alloc more ram */ + if (a->alloc < size) { + /* ensure there are always at least MP_PREC digits extra on top */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* reallocate the array a->dp + * + * We store the return in a temporary variable + * in case the operation failed we don't want + * to overwrite the dp member of a. + */ + tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); + if (tmp == NULL) { + /* reallocation failed but "a" is still valid [can be freed] */ + return MP_MEM; + } + + /* reallocation succeeded so set a->dp */ + a->dp = tmp; + + /* zero excess digits */ + i = a->alloc; + a->alloc = size; + for (; i < a->alloc; i++) { + a->dp[i] = 0; + } + } + return MP_OKAY; +} + + +#ifdef BN_MP_ABS_C +/* b = |a| + * + * Simple function copies the input and fixes the sign to positive + */ +static int +mp_abs (mp_int * a, mp_int * b) +{ + int res; + + /* copy a to b */ + if (a != b) { + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + } + + /* force the sign of b to positive */ + b->sign = MP_ZPOS; + + return MP_OKAY; +} +#endif + + +/* set to a digit */ +static void +mp_set (mp_int * a, mp_digit b) +{ + mp_zero (a); + a->dp[0] = b & MP_MASK; + a->used = (a->dp[0] != 0) ? 1 : 0; +} + + +#ifndef LTM_NO_NEG_EXP +/* b = a/2 */ +static int +mp_div_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* copy */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* source alias */ + tmpa = a->dp + b->used - 1; + + /* dest alias */ + tmpb = b->dp + b->used - 1; + + /* carry */ + r = 0; + for (x = b->used - 1; x >= 0; x--) { + /* get the carry for the next iteration */ + rr = *tmpa & 1; + + /* shift the current digit, add in carry and store */ + *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); + + /* forward carry to next iteration */ + r = rr; + } + + /* zero excess digits */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + mp_clamp (b); + return MP_OKAY; +} +#endif /* LTM_NO_NEG_EXP */ + + +/* shift left by a certain bit count */ +static int +mp_mul_2d (mp_int * a, int b, mp_int * c) +{ + mp_digit d; + int res; + + /* copy */ + if (a != c) { + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + } + + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } + + /* shift any bit count < DIGIT_BIT */ + d = (mp_digit) (b % DIGIT_BIT); + if (d != 0) { + register mp_digit *tmpc, shift, mask, r, rr; + register int x; + + /* bitmask for carries */ + mask = (((mp_digit)1) << d) - 1; + + /* shift for msbs */ + shift = DIGIT_BIT - d; + + /* alias */ + tmpc = c->dp; + + /* carry */ + r = 0; + for (x = 0; x < c->used; x++) { + /* get the higher bits of the current word */ + rr = (*tmpc >> shift) & mask; + + /* shift the current word and OR in the carry */ + *tmpc = ((*tmpc << d) | r) & MP_MASK; + ++tmpc; + + /* set the carry to the carry bits of the current word */ + r = rr; + } + + /* set final carry */ + if (r != 0) { + c->dp[(c->used)++] = r; + } + } + mp_clamp (c); + return MP_OKAY; +} + + +#ifdef BN_MP_INIT_MULTI_C +static int +mp_init_multi(mp_int *mp, ...) +{ + mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ + int n = 0; /* Number of ok inits */ + mp_int* cur_arg = mp; + va_list args; + + va_start(args, mp); /* init args to next argument from caller */ + while (cur_arg != NULL) { + if (mp_init(cur_arg) != MP_OKAY) { + /* Oops - error! Back-track and mp_clear what we already + succeeded in init-ing, then return error. + */ + va_list clean_args; + + /* end the current list */ + va_end(args); + + /* now start cleaning up */ + cur_arg = mp; + va_start(clean_args, mp); + while (n--) { + mp_clear(cur_arg); + cur_arg = va_arg(clean_args, mp_int*); + } + va_end(clean_args); + res = MP_MEM; + break; + } + n++; + cur_arg = va_arg(args, mp_int*); + } + va_end(args); + return res; /* Assumed ok, if error flagged above. */ +} +#endif + + +#ifdef BN_MP_CLEAR_MULTI_C +static void +mp_clear_multi(mp_int *mp, ...) +{ + mp_int* next_mp = mp; + va_list args; + va_start(args, mp); + while (next_mp != NULL) { + mp_clear(next_mp); + next_mp = va_arg(args, mp_int*); + } + va_end(args); +} +#endif + + +/* shift left a certain amount of digits */ +static int +mp_lshd (mp_int * a, int b) +{ + int x, res; + + /* if its less than zero return */ + if (b <= 0) { + return MP_OKAY; + } + + /* grow to fit the new digits */ + if (a->alloc < a->used + b) { + if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { + return res; + } + } + + { + register mp_digit *top, *bottom; + + /* increment the used by the shift amount then copy upwards */ + a->used += b; + + /* top */ + top = a->dp + a->used - 1; + + /* base */ + bottom = a->dp + a->used - 1 - b; + + /* much like mp_rshd this is implemented using a sliding window + * except the window goes the otherway around. Copying from + * the bottom to the top. see bn_mp_rshd.c for more info. + */ + for (x = a->used - 1; x >= b; x--) { + *top-- = *bottom--; + } + + /* zero the lower digits */ + top = a->dp; + for (x = 0; x < b; x++) { + *top++ = 0; + } + } + return MP_OKAY; +} + + +/* returns the number of bits in an int */ +static int +mp_count_bits (mp_int * a) +{ + int r; + mp_digit q; + + /* shortcut */ + if (a->used == 0) { + return 0; + } + + /* get number of digits and add that */ + r = (a->used - 1) * DIGIT_BIT; + + /* take the last digit and count the bits in it */ + q = a->dp[a->used - 1]; + while (q > ((mp_digit) 0)) { + ++r; + q >>= ((mp_digit) 1); + } + return r; +} + + +/* calc a value mod 2**b */ +static int +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b >= (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} + + +#ifdef BN_MP_DIV_SMALL + +/* slower bit-bang division... also smaller */ +static int +mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int ta, tb, tq, q; + int res, n, n2; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + /* init our temps */ + if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) { + return res; + } + + + mp_set(&tq, 1); + n = mp_count_bits(a) - mp_count_bits(b); + if (((res = mp_abs(a, &ta)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { + goto LBL_ERR; + } + + while (n-- >= 0) { + if (mp_cmp(&tb, &ta) != MP_GT) { + if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || + ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { + goto LBL_ERR; + } + } + if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || + ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { + goto LBL_ERR; + } + } + + /* now q == quotient and ta == remainder */ + n = a->sign; + n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); + if (c != NULL) { + mp_exch(c, &q); + c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; + } + if (d != NULL) { + mp_exch(d, &ta); + d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; + } +LBL_ERR: + mp_clear_multi(&ta, &tb, &tq, &q, NULL); + return res; +} + +#else + +/* integer signed division. + * c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly + * incomplete. For example, it doesn't consider + * the case where digits are removed from 'x' in + * the inner loop. It also doesn't consider the + * case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as + * 14.20 from HAC but fixed to treat these cases. +*/ +static int +mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int q, x, y, t1, t2; + int res, n, t, i, norm, neg; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { + return res; + } + q.used = a->used + 2; + + if ((res = mp_init (&t1)) != MP_OKAY) { + goto LBL_Q; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto LBL_T1; + } + + if ((res = mp_init_copy (&x, a)) != MP_OKAY) { + goto LBL_T2; + } + + if ((res = mp_init_copy (&y, b)) != MP_OKAY) { + goto LBL_X; + } + + /* fix the sign */ + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + x.sign = y.sign = MP_ZPOS; + + /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ + norm = mp_count_bits(&y) % DIGIT_BIT; + if (norm < (int)(DIGIT_BIT-1)) { + norm = (DIGIT_BIT-1) - norm; + if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { + goto LBL_Y; + } + } else { + norm = 0; + } + + /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ + n = x.used - 1; + t = y.used - 1; + + /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ + if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ + goto LBL_Y; + } + + while (mp_cmp (&x, &y) != MP_LT) { + ++(q.dp[n - t]); + if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { + goto LBL_Y; + } + } + + /* reset y by shifting it back down */ + mp_rshd (&y, n - t); + + /* step 3. for i from n down to (t + 1) */ + for (i = n; i >= (t + 1); i--) { + if (i > x.used) { + continue; + } + + /* step 3.1 if xi == yt then set q{i-t-1} to b-1, + * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ + if (x.dp[i] == y.dp[t]) { + q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); + } else { + mp_word tmp; + tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); + tmp |= ((mp_word) x.dp[i - 1]); + tmp /= ((mp_word) y.dp[t]); + if (tmp > (mp_word) MP_MASK) + tmp = MP_MASK; + q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); + } + + /* while (q{i-t-1} * (yt * b + y{t-1})) > + xi * b**2 + xi-1 * b + xi-2 + + do q{i-t-1} -= 1; + */ + q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; + do { + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; + + /* find left hand */ + mp_zero (&t1); + t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; + t1.dp[1] = y.dp[t]; + t1.used = 2; + if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + /* find right hand */ + t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; + t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; + t2.dp[2] = x.dp[i]; + t2.used = 3; + } while (mp_cmp_mag(&t1, &t2) == MP_GT); + + /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ + if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ + if (x.sign == MP_NEG) { + if ((res = mp_copy (&y, &t1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; + } + } + + /* now q is the quotient and x is the remainder + * [which we have to normalize] + */ + + /* get sign before writing to c */ + x.sign = x.used == 0 ? MP_ZPOS : a->sign; + + if (c != NULL) { + mp_clamp (&q); + mp_exch (&q, c); + c->sign = neg; + } + + if (d != NULL) { + mp_div_2d (&x, norm, &x, NULL); + mp_exch (&x, d); + } + + res = MP_OKAY; + +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); +LBL_Q:mp_clear (&q); + return res; +} + +#endif + + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +static int +s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + int (*redux)(mp_int*,mp_int*,mp_int*); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto LBL_M; + } + + if (redmode == 0) { + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce; + } else { + if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce_2k_l; + } + + /* create M table + * + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P + * + * The first half of the table is not + * computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto LBL_MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + for (x = 0; x < (winsize - 1); x++) { + /* square it */ + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + /* reduce modulo P */ + if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) + * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) + */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_MU; + } + if ((err = redux (&M[x], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits */ + if (digidx == -1) { + break; + } + /* read next digit and reset the bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_MU:mp_clear (&mu); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} + + +/* computes b = a*a */ +static int +mp_sqr (mp_int * a, mp_int * b) +{ + int res; + +#ifdef BN_MP_TOOM_SQR_C + /* use Toom-Cook? */ + if (a->used >= TOOM_SQR_CUTOFF) { + res = mp_toom_sqr(a, b); + /* Karatsuba? */ + } else +#endif +#ifdef BN_MP_KARATSUBA_SQR_C +if (a->used >= KARATSUBA_SQR_CUTOFF) { + res = mp_karatsuba_sqr (a, b); + } else +#endif + { +#ifdef BN_FAST_S_MP_SQR_C + /* can we use the fast comba multiplier? */ + if ((a->used * 2 + 1) < MP_WARRAY && + a->used < + (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { + res = fast_s_mp_sqr (a, b); + } else +#endif +#ifdef BN_S_MP_SQR_C + res = s_mp_sqr (a, b); +#else +#error mp_sqr could fail + res = MP_VAL; +#endif + } + b->sign = MP_ZPOS; + return res; +} + + +/* reduces a modulo n where n is of the form 2**p - d + This differs from reduce_2k since "d" can be larger + than a single digit. +*/ +static int +mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) +{ + mp_int q; + int p, res; + + if ((res = mp_init(&q)) != MP_OKAY) { + return res; + } + + p = mp_count_bits(n); +top: + /* q = a/2**p, a = a mod 2**p */ + if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { + goto ERR; + } + + /* q = q * d */ + if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { + goto ERR; + } + + /* a = a + q */ + if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { + goto ERR; + } + + if (mp_cmp_mag(a, n) != MP_LT) { + s_mp_sub(a, n, a); + goto top; + } + +ERR: + mp_clear(&q); + return res; +} + + +/* determines the setup value */ +static int +mp_reduce_2k_setup_l(mp_int *a, mp_int *d) +{ + int res; + mp_int tmp; + + if ((res = mp_init(&tmp)) != MP_OKAY) { + return res; + } + + if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { + goto ERR; + } + + if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { + goto ERR; + } + +ERR: + mp_clear(&tmp); + return res; +} + + +/* computes a = 2**b + * + * Simple algorithm which zeroes the int, grows it then just sets one bit + * as required. + */ +static int +mp_2expt (mp_int * a, int b) +{ + int res; + + /* zero a as per default */ + mp_zero (a); + + /* grow a to accommodate the single bit */ + if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + + /* set the used count of where the bit will go */ + a->used = b / DIGIT_BIT + 1; + + /* put the single bit in its place */ + a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); + + return MP_OKAY; +} + + +/* pre-calculate the value required for Barrett reduction + * For a given modulus "b" it calulates the value required in "a" + */ +static int +mp_reduce_setup (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { + return res; + } + return mp_div (a, b, a, NULL); +} + + +/* reduces x mod m, assumes 0 < x < m**2, mu is + * precomputed via mp_reduce_setup. + * From HAC pp.604 Algorithm 14.42 + */ +static int +mp_reduce (mp_int * x, mp_int * m, mp_int * mu) +{ + mp_int q; + int res, um = m->used; + + /* q = x */ + if ((res = mp_init_copy (&q, x)) != MP_OKAY) { + return res; + } + + /* q1 = x / b**(k-1) */ + mp_rshd (&q, um - 1); + + /* according to HAC this optimization is ok */ + if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { + if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { + goto CLEANUP; + } + } else { +#ifdef BN_S_MP_MUL_HIGH_DIGS_C + if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) + if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#else + { +#error mp_reduce would always fail + res = MP_VAL; + goto CLEANUP; + } +#endif + } + + /* q3 = q2 / b**(k+1) */ + mp_rshd (&q, um + 1); + + /* x = x mod b**(k+1), quick (no division) */ + if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } + + /* q = q * m mod b**(k+1), quick (no division) */ + if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + + /* x = x - q */ + if ((res = mp_sub (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + + /* If x < 0, add b**(k+1) to it */ + if (mp_cmp_d (x, 0) == MP_LT) { + mp_set (&q, 1); + if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + if ((res = mp_add (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + } + + /* Back off if it's too big */ + while (mp_cmp (x, m) != MP_LT) { + if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { + goto CLEANUP; + } + } + +CLEANUP: + mp_clear (&q); + + return res; +} + + +/* multiplies |a| * |b| and only computes up to digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how + * many digits of output are created. + */ +static int +s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ + if (((digs) < MP_WARRAY) && + MIN (a->used, b->used) < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, digs)) != MP_OKAY) { + return res; + } + t.used = digs; + + /* compute the digits of the product directly */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* set the carry to zero */ + u = 0; + + /* limit ourselves to making digs digits of output */ + pb = MIN (b->used, digs - ix); + + /* setup some aliases */ + /* copy of the digit from a used within the nested loop */ + tmpx = a->dp[ix]; + + /* an alias for the destination shifted ix places */ + tmpt = t.dp + ix; + + /* an alias for the digits of b */ + tmpy = b->dp; + + /* compute the columns of the output and propagate the carry */ + for (iy = 0; iy < pb; iy++) { + /* compute the column as a mp_word */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* the new column is the lower part of the result */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry word from the result */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + /* set carry if it is placed below digs */ + if (ix + iy < digs) { + *tmpt = u; + } + } + + mp_clamp (&t); + mp_exch (&t, c); + + mp_clear (&t); + return MP_OKAY; +} + + +/* Fast (comba) multiplier + * + * This is the fast column-array [comba] multiplier. It is + * designed to compute the columns of the product first + * then handle the carries afterwards. This has the effect + * of making the nested loops that compute the columns very + * simple and schedulable on super-scalar processors. + * + * This has been modified to produce a variable number of + * digits of output so if say only a half-product is required + * you don't have to compute the upper half (a feature + * required for fast Barrett reduction). + * + * Based on Algorithm 14.12 on pp.595 of HAC. + * + */ +static int +fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY]; + register mp_word _W; + + /* grow the destination as required */ + if (c->alloc < digs) { + if ((res = mp_grow (c, digs)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + pa = MIN(digs, a->used + b->used); + + /* clear the carry */ + _W = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty; + int iy; + mp_digit *tmpx, *tmpy; + + /* get offsets into the two bignums */ + ty = MIN(b->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = b->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* execute loop */ + for (iz = 0; iz < iy; ++iz) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + + } + + /* store term */ + W[ix] = ((mp_digit)_W) & MP_MASK; + + /* make next carry */ + _W = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = c->used; + c->used = pa; + + { + register mp_digit *tmpc; + tmpc = c->dp; + for (ix = 0; ix < pa+1; ix++) { + /* now extract the previous digit [below the carry] */ + *tmpc++ = W[ix]; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + mp_clamp (c); + return MP_OKAY; +} + + +/* init an mp_init for a given size */ +static int +mp_init_size (mp_int * a, int size) +{ + int x; + + /* pad size so there are always extra digits */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* alloc mem */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the members */ + a->used = 0; + a->alloc = size; + a->sign = MP_ZPOS; + + /* zero the digits */ + for (x = 0; x < size; x++) { + a->dp[x] = 0; + } + + return MP_OKAY; +} + + +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ +static int +s_mp_sqr (mp_int * a, mp_int * b) +{ + mp_int t; + int res, ix, iy, pa; + mp_word r; + mp_digit u, tmpx, *tmpt; + + pa = a->used; + if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { + return res; + } + + /* default used is maximum possible size */ + t.used = 2*pa + 1; + + for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ + r = ((mp_word) t.dp[2*ix]) + + ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); + + /* store lower part in result */ + t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for where to store the results */ + tmpt = t.dp + (2*ix + 1); + + for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ + r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since it's easier to optimize + */ + r = ((mp_word) *tmpt) + r + r + ((mp_word) u); + + /* store lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + /* propagate upwards */ + while (u != ((mp_digit) 0)) { + r = ((mp_word) *tmpt) + ((mp_word) u); + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + } + + mp_clamp (&t); + mp_exch (&t, b); + mp_clear (&t); + return MP_OKAY; +} + + +/* multiplies |a| * |b| and does not compute the lower digs digits + * [meant to get the higher part of the product] + */ +static int +s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ +#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C + if (((a->used + b->used + 1) < MP_WARRAY) + && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_high_digs (a, b, c, digs); + } +#endif + + if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { + return res; + } + t.used = a->used + b->used + 1; + + pa = a->used; + pb = b->used; + for (ix = 0; ix < pa; ix++) { + /* clear the carry */ + u = 0; + + /* left hand side of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ + tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ + tmpy = b->dp + (digs - ix); + + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* get the lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* carry the carry */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpt = u; + } + mp_clamp (&t); + mp_exch (&t, c); + mp_clear (&t); + return MP_OKAY; +} + + +#ifdef BN_MP_MONTGOMERY_SETUP_C +/* setups the montgomery reduction stuff */ +static int +mp_montgomery_setup (mp_int * n, mp_digit * rho) +{ + mp_digit x, b; + +/* fast inversion mod 2**k + * + * Based on the fact that + * + * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) + * => 2*X*A - X*X*A*A = 1 + * => 2*(1) - (1) = 1 + */ + b = n->dp[0]; + + if ((b & 1) == 0) { + return MP_VAL; + } + + x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ + x *= 2 - b * x; /* here x*a==1 mod 2**8 */ +#if !defined(MP_8BIT) + x *= 2 - b * x; /* here x*a==1 mod 2**16 */ +#endif +#if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) + x *= 2 - b * x; /* here x*a==1 mod 2**32 */ +#endif +#ifdef MP_64BIT + x *= 2 - b * x; /* here x*a==1 mod 2**64 */ +#endif + + /* rho = -1/m mod b */ + *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; + + return MP_OKAY; +} +#endif + + +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C +/* computes xR**-1 == x (mod N) via Montgomery Reduction + * + * This is an optimized implementation of montgomery_reduce + * which uses the comba method to quickly calculate the columns of the + * reduction. + * + * Based on Algorithm 14.32 on pp.601 of HAC. +*/ +int +fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, olduse; + mp_word W[MP_WARRAY]; + + /* get old used count */ + olduse = x->used; + + /* grow a as required */ + if (x->alloc < n->used + 1) { + if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { + return res; + } + } + + /* first we have to get the digits of the input into + * an array of double precision words W[...] + */ + { + register mp_word *_W; + register mp_digit *tmpx; + + /* alias for the W[] array */ + _W = W; + + /* alias for the digits of x*/ + tmpx = x->dp; + + /* copy the digits of a into W[0..a->used-1] */ + for (ix = 0; ix < x->used; ix++) { + *_W++ = *tmpx++; + } + + /* zero the high words of W[a->used..m->used*2] */ + for (; ix < n->used * 2 + 1; ix++) { + *_W++ = 0; + } + } + + /* now we proceed to zero successive digits + * from the least significant upwards + */ + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * m' mod b + * + * We avoid a double precision multiplication (which isn't required) + * by casting the value down to a mp_digit. Note this requires + * that W[ix-1] have the carry cleared (see after the inner loop) + */ + register mp_digit mu; + mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); + + /* a = a + mu * m * b**i + * + * This is computed in place and on the fly. The multiplication + * by b**i is handled by offseting which columns the results + * are added to. + * + * Note the comba method normally doesn't handle carries in the + * inner loop In this case we fix the carry from the previous + * column since the Montgomery reduction requires digits of the + * result (so far) [see above] to work. This is + * handled by fixing up one carry after the inner loop. The + * carry fixups are done in order so after these loops the + * first m->used words of W[] have the carries fixed + */ + { + register int iy; + register mp_digit *tmpn; + register mp_word *_W; + + /* alias for the digits of the modulus */ + tmpn = n->dp; + + /* Alias for the columns set by an offset of ix */ + _W = W + ix; + + /* inner loop */ + for (iy = 0; iy < n->used; iy++) { + *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); + } + } + + /* now fix carry for next digit, W[ix+1] */ + W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); + } + + /* now we have to propagate the carries and + * shift the words downward [all those least + * significant digits we zeroed]. + */ + { + register mp_digit *tmpx; + register mp_word *_W, *_W1; + + /* nox fix rest of carries */ + + /* alias for current word */ + _W1 = W + ix; + + /* alias for next word, where the carry goes */ + _W = W + ++ix; + + for (; ix <= n->used * 2 + 1; ix++) { + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); + } + + /* copy out, A = A/b**n + * + * The result is A/b**n but instead of converting from an + * array of mp_word to mp_digit than calling mp_rshd + * we just copy them in the right order + */ + + /* alias for destination word */ + tmpx = x->dp; + + /* alias for shifted double precision result */ + _W = W + n->used; + + for (ix = 0; ix < n->used + 1; ix++) { + *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); + } + + /* zero oldused digits, if the input a was larger than + * m->used+1 we'll have to clear the digits + */ + for (; ix < olduse; ix++) { + *tmpx++ = 0; + } + } + + /* set the max used and clamp */ + x->used = n->used + 1; + mp_clamp (x); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MUL_2_C +/* b = a*2 */ +static int +mp_mul_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* grow to accommodate result */ + if (b->alloc < a->used + 1) { + if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* alias for source */ + tmpa = a->dp; + + /* alias for dest */ + tmpb = b->dp; + + /* carry */ + r = 0; + for (x = 0; x < a->used; x++) { + + /* get what will be the *next* carry bit from the + * MSB of the current digit + */ + rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); + + /* now shift up this digit, add in the carry [from the previous] */ + *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; + + /* copy the carry that would be from the source + * digit into the next iteration + */ + r = rr; + } + + /* new leading digit? */ + if (r != 0) { + /* add a MSB which is always 1 at this point */ + *tmpb = 1; + ++(b->used); + } + + /* now zero any excess digits on the destination + * that we didn't write to + */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +/* + * shifts with subtractions when the result is greater than b. + * + * The method is slightly modified to shift B unconditionally up to just under + * the leading bit of b. This saves a lot of multiple precision shifting. + */ +static int +mp_montgomery_calc_normalization (mp_int * a, mp_int * b) +{ + int x, bits, res; + + /* how many bits of last digit does b use */ + bits = mp_count_bits (b) % DIGIT_BIT; + + if (b->used > 1) { + if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { + return res; + } + } else { + mp_set(a, 1); + bits = 1; + } + + + /* now compute C = A * B mod b */ + for (x = bits - 1; x < (int)DIGIT_BIT; x++) { + if ((res = mp_mul_2 (a, a)) != MP_OKAY) { + return res; + } + if (mp_cmp_mag (a, b) != MP_LT) { + if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { + return res; + } + } + } + + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_EXPTMOD_FAST_C +/* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + * + * Uses Montgomery or Diminished Radix reduction [whichever appropriate] + */ + +static int +mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res; + mp_digit buf, mp; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* use a pointer to the reduction algorithm. This allows us to use + * one of many reduction algorithms without modding the guts of + * the code with if statements everywhere. + */ + int (*redux)(mp_int*,mp_int*,mp_digit); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* determine and setup reduction code */ + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_SETUP_C + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto LBL_M; + } +#else + err = MP_VAL; + goto LBL_M; +#endif + + /* automatically pick the comba one if available (saves quite a few calls/ifs) */ +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C + if (((P->used * 2 + 1) < MP_WARRAY) && + P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + redux = fast_mp_montgomery_reduce; + } else +#endif + { +#ifdef BN_MP_MONTGOMERY_REDUCE_C + /* use slower baseline Montgomery method */ + redux = mp_montgomery_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + } else if (redmode == 1) { +#if defined(BN_MP_DR_SETUP_C) && defined(BN_MP_DR_REDUCE_C) + /* setup DR reduction for moduli of the form B**k - b */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } else { +#if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) + /* setup DR reduction for moduli of the form 2**k - b */ + if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { + goto LBL_M; + } + redux = mp_reduce_2k; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_M; + } + + /* create M table + * + + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto LBL_RES; + } +#else + err = MP_VAL; + goto LBL_RES; +#endif + + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } + + /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits so break */ + if (digidx == -1) { + break; + } + /* read next digit and reset bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int)DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* get next bit of the window */ + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + if (redmode == 0) { + /* fixup result if Montgomery reduction is used + * recall that any value in a Montgomery system is + * actually multiplied by R mod n. So we have + * to reduce one more time to cancel out the factor + * of R. + */ + if ((err = redux(&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* swap res with Y */ + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} +#endif + + +#ifdef BN_FAST_S_MP_SQR_C +/* the jist of squaring... + * you do like mult except the offset of the tmpx [one that + * starts closer to zero] can't equal the offset of tmpy. + * So basically you set up iy like before then you min it with + * (ty-tx) so that it never happens. You double all those + * you add in the inner loop + +After that loop you do the squares and add them in. +*/ + +static int +fast_s_mp_sqr (mp_int * a, mp_int * b) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY], *tmpx; + mp_word W1; + + /* grow the destination as required */ + pa = a->used + a->used; + if (b->alloc < pa) { + if ((res = mp_grow (b, pa)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + W1 = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty, iy; + mp_word _W; + mp_digit *tmpy; + + /* clear counter */ + _W = 0; + + /* get offsets into the two bignums */ + ty = MIN(a->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = a->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* now for squaring tx can never equal ty + * we halve the distance since they approach at a rate of 2x + * and we have to round because odd cases need to be executed + */ + iy = MIN(iy, (ty-tx+1)>>1); + + /* execute loop */ + for (iz = 0; iz < iy; iz++) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + } + + /* double the inner product and add carry */ + _W = _W + _W + W1; + + /* even columns have the square term in them */ + if ((ix&1) == 0) { + _W += ((mp_word)a->dp[ix>>1])*((mp_word)a->dp[ix>>1]); + } + + /* store it */ + W[ix] = (mp_digit)(_W & MP_MASK); + + /* make next carry */ + W1 = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = b->used; + b->used = a->used+a->used; + + { + mp_digit *tmpb; + tmpb = b->dp; + for (ix = 0; ix < pa; ix++) { + *tmpb++ = W[ix] & MP_MASK; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpb++ = 0; + } + } + mp_clamp (b); + return MP_OKAY; +} +#endif + + +#ifdef BN_MP_MUL_D_C +/* multiply by a digit */ +static int +mp_mul_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_digit u, *tmpa, *tmpc; + mp_word r; + int ix, res, olduse; + + /* make sure c is big enough to hold a*b */ + if (c->alloc < a->used + 1) { + if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { + return res; + } + } + + /* get the original destinations used count */ + olduse = c->used; + + /* set the sign */ + c->sign = a->sign; + + /* alias for a->dp [source] */ + tmpa = a->dp; + + /* alias for c->dp [dest] */ + tmpc = c->dp; + + /* zero carry */ + u = 0; + + /* compute columns */ + for (ix = 0; ix < a->used; ix++) { + /* compute product and carry sum for this term */ + r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b); + + /* mask off higher bits to get a single digit */ + *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* send carry into next iteration */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + + /* store final carry [if any] and increment ix offset */ + *tmpc++ = u; + ++ix; + + /* now zero digits above the top */ + while (ix++ < olduse) { + *tmpc++ = 0; + } + + /* set used count */ + c->used = a->used + 1; + mp_clamp(c); + + return MP_OKAY; +} +#endif diff --git a/components/wpa_supplicant/src/crypto/md5-internal.c b/components/wpa_supplicant/src/crypto/md5-internal.c new file mode 100644 index 000000000..a430e297a --- /dev/null +++ b/components/wpa_supplicant/src/crypto/md5-internal.c @@ -0,0 +1,298 @@ +/* + * MD5 hash implementation and interface functions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/md5.h" +#include "crypto/md5_i.h" +#include "crypto/crypto.h" + + +static void MD5Transform(u32 buf[4], u32 const in[16]); + + +typedef struct MD5Context MD5_CTX; + + +/** + * md5_vector - MD5 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 of failure + */ +int +md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) +{ + MD5_CTX ctx; + size_t i; + + MD5Init(&ctx); + for (i = 0; i < num_elem; i++) + MD5Update(&ctx, addr[i], len[i]); + MD5Final(mac, &ctx); + return 0; +} + + +/* ===== start - public domain MD5 implementation ===== */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +#ifndef WORDS_BIGENDIAN +#define byteReverse(buf, len) /* Nothing */ +#else +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + u32 t; + do { + t = (u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(u32 *) buf = t; + buf += 4; + } while (--longs); +} +#endif + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void +MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void +MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) +{ + u32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((u32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + os_memcpy(p, buf, len); + return; + } + os_memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + os_memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + os_memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void +MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + os_memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + os_memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + os_memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((u32 *) ctx->in)[14] = ctx->bits[0]; + ((u32 *) ctx->in)[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (u32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + os_memcpy(digest, ctx->buf, 16); + os_memset(ctx, 0, sizeof(struct MD5Context)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void +MD5Transform(u32 buf[4], u32 const in[16]) +{ + register u32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} +/* ===== end - public domain MD5 implementation ===== */ diff --git a/components/wpa_supplicant/src/crypto/md5.c b/components/wpa_supplicant/src/crypto/md5.c new file mode 100644 index 000000000..3125c9831 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/md5.c @@ -0,0 +1,113 @@ +/* + * MD5 hash implementation and interface functions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/md5.h" +#include "crypto/crypto.h" + + +/** + * hmac_md5_vector - HMAC-MD5 over data vector (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (16 bytes) + * Returns: 0 on success, -1 on failure + */ +int +hmac_md5_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac) +{ + u8 k_pad[64]; /* padding - key XORd with ipad/opad */ + u8 tk[16]; + const u8 *_addr[6]; + size_t i, _len[6]; + + if (num_elem > 5) { + /* + * Fixed limit on the number of fragments to avoid having to + * allocate memory (which could fail). + */ + return -1; + } + + /* if key is longer than 64 bytes reset it to key = MD5(key) */ + if (key_len > 64) { + if (md5_vector(1, &key, &key_len, tk)) + return -1; + key = tk; + key_len = 16; + } + + /* the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in ipad */ + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + + /* XOR key with ipad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x36; + + /* perform inner MD5 */ + _addr[0] = k_pad; + _len[0] = 64; + for (i = 0; i < num_elem; i++) { + _addr[i + 1] = addr[i]; + _len[i + 1] = len[i]; + } + if (md5_vector(1 + num_elem, _addr, _len, mac)) + return -1; + + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + /* XOR key with opad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x5c; + + /* perform outer MD5 */ + _addr[0] = k_pad; + _len[0] = 64; + _addr[1] = mac; + _len[1] = MD5_MAC_LEN; + return md5_vector(2, _addr, _len, mac); +} + + +/** + * hmac_md5 - HMAC-MD5 over data buffer (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @data: Pointers to the data area + * @data_len: Length of the data area + * @mac: Buffer for the hash (16 bytes) + * Returns: 0 on success, -1 on failure + */ +int +hmac_md5(const u8 *key, size_t key_len, const u8 *data, size_t data_len, + u8 *mac) +{ + return hmac_md5_vector(key, key_len, 1, &data, &data_len, mac); +} diff --git a/components/wpa_supplicant/src/crypto/rc4.c b/components/wpa_supplicant/src/crypto/rc4.c new file mode 100644 index 000000000..678632297 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/rc4.c @@ -0,0 +1,61 @@ +/* + * RC4 stream cipher + * Copyright (c) 2002-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/crypto.h" + +#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) + +int +rc4_skip(const u8 *key, size_t keylen, size_t skip, + u8 *data, size_t data_len) +{ + u32 i, j, k; + u8 S[256], *pos; + size_t kpos; + + /* Setup RC4 state */ + for (i = 0; i < 256; i++) + S[i] = i; + j = 0; + kpos = 0; + for (i = 0; i < 256; i++) { + j = (j + S[i] + key[kpos]) & 0xff; + kpos++; + if (kpos >= keylen) + kpos = 0; + S_SWAP(i, j); + } + + /* Skip the start of the stream */ + i = j = 0; + for (k = 0; k < skip; k++) { + i = (i + 1) & 0xff; + j = (j + S[i]) & 0xff; + S_SWAP(i, j); + } + + /* Apply RC4 to data */ + pos = data; + for (k = 0; k < data_len; k++) { + i = (i + 1) & 0xff; + j = (j + S[i]) & 0xff; + S_SWAP(i, j); + *pos++ ^= S[(S[i] + S[j]) & 0xff]; + } + + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/sha1-internal.c b/components/wpa_supplicant/src/crypto/sha1-internal.c new file mode 100644 index 000000000..a1c255e41 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/sha1-internal.c @@ -0,0 +1,313 @@ +/* + * SHA1 hash implementation and interface functions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/sha1.h" +#include "crypto/sha1_i.h" +#include "crypto/md5.h" +#include "crypto/crypto.h" + +typedef struct SHA1Context SHA1_CTX; + +void SHA1Transform(u32 state[5], const unsigned char buffer[64]); + + +/** + * sha1_vector - SHA-1 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 of failure + */ +int +sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) +{ + SHA1_CTX ctx; + size_t i; + + SHA1Init(&ctx); + for (i = 0; i < num_elem; i++) + SHA1Update(&ctx, addr[i], len[i]); + SHA1Final(mac, &ctx); + return 0; +} + + +/* ===== start - public domain SHA1 implementation ===== */ + +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +----------------- +Modified 7/98 +By James H. Brown +Still 100% Public Domain + +Corrected a problem which generated improper hash values on 16 bit machines +Routine SHA1Update changed from + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int +len) +to + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned +long len) + +The 'len' parameter was declared an int which works fine on 32 bit machines. +However, on 16 bit machines an int is too small for the shifts being done +against +it. This caused the hash function to generate incorrect values if len was +greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). + +Since the file IO in main() reads 16K at a time, any file 8K or larger would +be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million +"a"s). + +I also changed the declaration of variables i & j in SHA1Update to +unsigned long from unsigned int for the same reason. + +These changes should make no difference to any 32 bit implementations since +an +int and a long are the same size in those environments. + +-- +I also corrected a few compiler warnings generated by Borland C. +1. Added #include for exit() prototype +2. Removed unused variable 'j' in SHA1Final +3. Changed exit(0) to return(0) at end of main. + +ALL changes I made can be located by searching for comments containing 'JHB' +----------------- +Modified 8/98 +By Steve Reid +Still 100% public domain + +1- Removed #include and used return() instead of exit() +2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) +3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net + +----------------- +Modified 4/01 +By Saul Kravitz +Still 100% PD +Modified to run on Compaq Alpha hardware. + +----------------- +Modified 4/01 +By Jouni Malinen +Minor changes to match the coding style used in Dynamics. + +Modified September 24, 2004 +By Jouni Malinen +Fixed alignment issue in SHA1Transform when SHA1HANDSOFF is defined. + +*/ + +/* +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +#define SHA1HANDSOFF + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifndef WORDS_BIGENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \ + (rol(block->l[i], 8) & 0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \ + block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) \ + z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \ + w = rol(w, 30); +#define R1(v,w,x,y,z,i) \ + z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \ + w = rol(w, 30); +#define R2(v,w,x,y,z,i) \ + z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30); +#define R3(v,w,x,y,z,i) \ + z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \ + w = rol(w, 30); +#define R4(v,w,x,y,z,i) \ + z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \ + w=rol(w, 30); + + +#ifdef VERBOSE /* SAK */ +void SHAPrintContext(SHA1_CTX *context, char *msg) +{ + printf("%s (%d,%d) %x %x %x %x %x\n", + msg, + context->count[0], context->count[1], + context->state[0], + context->state[1], + context->state[2], + context->state[3], + context->state[4]); +} +#endif + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void +SHA1Transform(u32 state[5], const unsigned char buffer[64]) +{ + u32 a, b, c, d, e; + typedef union { + unsigned char c[64]; + u32 l[16]; + } CHAR64LONG16; + CHAR64LONG16* block; +#ifdef SHA1HANDSOFF + CHAR64LONG16 workspace; + block = &workspace; + os_memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16 *) buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +#ifdef SHA1HANDSOFF + os_memset(block, 0, 64); +#endif +} + + +/* SHA1Init - Initialize new context */ + +void +SHA1Init(SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void +SHA1Update(SHA1_CTX* context, const void *_data, u32 len) +{ + u32 i, j; + const unsigned char *data = _data; + +#ifdef VERBOSE + SHAPrintContext(context, "before"); +#endif + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) + context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + os_memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else i = 0; + os_memcpy(&context->buffer[j], &data[i], len - i); +#ifdef VERBOSE + SHAPrintContext(context, "after "); +#endif +} + + +/* Add padding and return the message digest. */ + +void +SHA1Final(unsigned char digest[20], SHA1_CTX* context) +{ + u32 i; + unsigned char finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char) + ((context->count[(i >= 4 ? 0 : 1)] >> + ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } + SHA1Update(context, (unsigned char *) "\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update(context, (unsigned char *) "\0", 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() + */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & + 255); + } + /* Wipe variables */ + i = 0; + os_memset(context->buffer, 0, 64); + os_memset(context->state, 0, 20); + os_memset(context->count, 0, 8); + os_memset(finalcount, 0, 8); +} + +/* ===== end - public domain SHA1 implementation ===== */ diff --git a/components/wpa_supplicant/src/crypto/sha1-pbkdf2.c b/components/wpa_supplicant/src/crypto/sha1-pbkdf2.c new file mode 100644 index 000000000..915a23aa7 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/sha1-pbkdf2.c @@ -0,0 +1,101 @@ +/* + * SHA1-based key derivation function (PBKDF2) for IEEE 802.11i + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" +#include "crypto/common.h" +#include "crypto/sha1.h" +#include "crypto/md5.h" +#include "crypto/crypto.h" + +static int +pbkdf2_sha1_f(const char *passphrase, const char *ssid, + size_t ssid_len, int iterations, unsigned int count, + u8 *digest) +{ + unsigned char tmp[SHA1_MAC_LEN], tmp2[SHA1_MAC_LEN]; + int i, j; + unsigned char count_buf[4]; + const u8 *addr[2]; + size_t len[2]; + size_t passphrase_len = os_strlen(passphrase); + + addr[0] = (u8 *) ssid; + len[0] = ssid_len; + addr[1] = count_buf; + len[1] = 4; + + /* F(P, S, c, i) = U1 xor U2 xor ... Uc + * U1 = PRF(P, S || i) + * U2 = PRF(P, U1) + * Uc = PRF(P, Uc-1) + */ + + count_buf[0] = (count >> 24) & 0xff; + count_buf[1] = (count >> 16) & 0xff; + count_buf[2] = (count >> 8) & 0xff; + count_buf[3] = count & 0xff; + if (hmac_sha1_vector((u8 *) passphrase, passphrase_len, 2, addr, len, + tmp)) + return -1; + os_memcpy(digest, tmp, SHA1_MAC_LEN); + + for (i = 1; i < iterations; i++) { + if (hmac_sha1((u8 *) passphrase, passphrase_len, tmp, + SHA1_MAC_LEN, tmp2)) + return -1; + os_memcpy(tmp, tmp2, SHA1_MAC_LEN); + for (j = 0; j < SHA1_MAC_LEN; j++) + digest[j] ^= tmp2[j]; + } + + return 0; +} + + +/** + * pbkdf2_sha1 - SHA1-based key derivation function (PBKDF2) for IEEE 802.11i + * @passphrase: ASCII passphrase + * @ssid: SSID + * @ssid_len: SSID length in bytes + * @iterations: Number of iterations to run + * @buf: Buffer for the generated key + * @buflen: Length of the buffer in bytes + * Returns: 0 on success, -1 of failure + * + * This function is used to derive PSK for WPA-PSK. For this protocol, + * iterations is set to 4096 and buflen to 32. This function is described in + * IEEE Std 802.11-2004, Clause H.4. The main construction is from PKCS#5 v2.0. + */ +int +pbkdf2_sha1(const char *passphrase, const char *ssid, size_t ssid_len, + int iterations, u8 *buf, size_t buflen) +{ + unsigned int count = 0; + unsigned char *pos = buf; + size_t left = buflen, plen; + unsigned char digest[SHA1_MAC_LEN]; + + while (left > 0) { + count++; + if (pbkdf2_sha1_f(passphrase, ssid, ssid_len, iterations, + count, digest)) + return -1; + plen = left > SHA1_MAC_LEN ? SHA1_MAC_LEN : left; + os_memcpy(pos, digest, plen); + pos += plen; + left -= plen; + } + + return 0; +} diff --git a/components/wpa_supplicant/src/crypto/sha1.c b/components/wpa_supplicant/src/crypto/sha1.c new file mode 100644 index 000000000..3d6da417a --- /dev/null +++ b/components/wpa_supplicant/src/crypto/sha1.c @@ -0,0 +1,166 @@ +/* + * SHA1 hash implementation and interface functions + * Copyright (c) 2003-2005, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/sha1.h" +#include "crypto/crypto.h" + + +/** + * hmac_sha1_vector - HMAC-SHA1 over data vector (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (20 bytes) + * Returns: 0 on success, -1 on failure + */ +int +hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac) +{ + unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ + unsigned char tk[20]; + const u8 *_addr[6]; + size_t _len[6], i; + + if (num_elem > 5) { + /* + * Fixed limit on the number of fragments to avoid having to + * allocate memory (which could fail). + */ + return -1; + } + + /* if key is longer than 64 bytes reset it to key = SHA1(key) */ + if (key_len > 64) { + if (sha1_vector(1, &key, &key_len, tk)) + return -1; + key = tk; + key_len = 20; + } + + /* the HMAC_SHA1 transform looks like: + * + * SHA1(K XOR opad, SHA1(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in ipad */ + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + /* XOR key with ipad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x36; + + /* perform inner SHA1 */ + _addr[0] = k_pad; + _len[0] = 64; + for (i = 0; i < num_elem; i++) { + _addr[i + 1] = addr[i]; + _len[i + 1] = len[i]; + } + if (sha1_vector(1 + num_elem, _addr, _len, mac)) + return -1; + + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + /* XOR key with opad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x5c; + + /* perform outer SHA1 */ + _addr[0] = k_pad; + _len[0] = 64; + _addr[1] = mac; + _len[1] = SHA1_MAC_LEN; + return sha1_vector(2, _addr, _len, mac); +} + + +/** + * hmac_sha1 - HMAC-SHA1 over data buffer (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @data: Pointers to the data area + * @data_len: Length of the data area + * @mac: Buffer for the hash (20 bytes) + * Returns: 0 on success, -1 of failure + */ +int +hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len, + u8 *mac) +{ + return hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac); +} + +/** + * sha1_prf - SHA1-based Pseudo-Random Function (PRF) (IEEE 802.11i, 8.5.1.1) + * @key: Key for PRF + * @key_len: Length of the key in bytes + * @label: A unique label for each purpose of the PRF + * @data: Extra data to bind into the key + * @data_len: Length of the data + * @buf: Buffer for the generated pseudo-random key + * @buf_len: Number of bytes of key to generate + * Returns: 0 on success, -1 of failure + * + * This function is used to derive new, cryptographically separate keys from a + * given key (e.g., PMK in IEEE 802.11i). + */ +int +sha1_prf(const u8 *key, size_t key_len, const char *label, + const u8 *data, size_t data_len, u8 *buf, size_t buf_len) +{ + u8 counter = 0; + size_t pos, plen; + u8 hash[SHA1_MAC_LEN]; + size_t label_len = os_strlen(label) + 1; + const unsigned char *addr[3]; + size_t len[3]; + + addr[0] = (u8 *) label; + len[0] = label_len; + addr[1] = data; + len[1] = data_len; + addr[2] = &counter; + len[2] = 1; + + pos = 0; + while (pos < buf_len) { + plen = buf_len - pos; + if (plen >= SHA1_MAC_LEN) { + if (hmac_sha1_vector(key, key_len, 3, addr, len, + &buf[pos])) + return -1; + pos += SHA1_MAC_LEN; + } else { + if (hmac_sha1_vector(key, key_len, 3, addr, len, + hash)) + return -1; + os_memcpy(&buf[pos], hash, plen); + break; + } + counter++; + } + + return 0; +} + diff --git a/components/wpa_supplicant/src/crypto/sha256-internal.c b/components/wpa_supplicant/src/crypto/sha256-internal.c new file mode 100644 index 000000000..9a1fca1c1 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/sha256-internal.c @@ -0,0 +1,249 @@ +/* + * SHA-256 hash implementation and interface functions + * Copyright (c) 2003-2011, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/sha256.h" +#include "crypto/crypto.h" + +#define SHA256_BLOCK_SIZE 64 + +struct sha256_state { + u64 length; + u32 state[8], curlen; + u8 buf[SHA256_BLOCK_SIZE]; +}; + +static void sha256_init(struct sha256_state *md); +static int sha256_process(struct sha256_state *md, const unsigned char *in, + unsigned long inlen); +static int sha256_done(struct sha256_state *md, unsigned char *out); + + +/** + * sha256_vector - SHA256 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 of failure + */ +int +sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, + u8 *mac) +{ + struct sha256_state ctx; + size_t i; + + sha256_init(&ctx); + for (i = 0; i < num_elem; i++) + if (sha256_process(&ctx, addr[i], len[i])) + return -1; + if (sha256_done(&ctx, mac)) + return -1; + return 0; +} + + +/* ===== start - public domain SHA256 implementation ===== */ + +/* This is based on SHA256 implementation in LibTomCrypt that was released into + * public domain by Tom St Denis. */ + +/* the K array */ +static const unsigned long K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + + +/* Various logical functions */ +#define RORc(x, y) \ +( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \ + ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x), (n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) +#ifndef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +/* compress 512-bits */ +static int +sha256_compress(struct sha256_state *md, unsigned char *buf) +{ + u32 S[8], W[64], t0, t1; + u32 t; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) + W[i] = WPA_GET_BE32(buf + (4 * i)); + + /* fill W[16..63] */ + for (i = 16; i < 64; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + + W[i - 16]; + } + + /* Compress */ +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 64; ++i) { + RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + } + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + return 0; +} + + +/* Initialize the hash state */ +static void +sha256_init(struct sha256_state *md) +{ + md->curlen = 0; + md->length = 0; + md->state[0] = 0x6A09E667UL; + md->state[1] = 0xBB67AE85UL; + md->state[2] = 0x3C6EF372UL; + md->state[3] = 0xA54FF53AUL; + md->state[4] = 0x510E527FUL; + md->state[5] = 0x9B05688CUL; + md->state[6] = 0x1F83D9ABUL; + md->state[7] = 0x5BE0CD19UL; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return CRYPT_OK if successful +*/ +static int +sha256_process(struct sha256_state *md, const unsigned char *in, + unsigned long inlen) +{ + unsigned long n; + + if (md->curlen >= sizeof(md->buf)) + return -1; + + while (inlen > 0) { + if (md->curlen == 0 && inlen >= SHA256_BLOCK_SIZE) { + if (sha256_compress(md, (unsigned char *) in) < 0) + return -1; + md->length += SHA256_BLOCK_SIZE * 8; + in += SHA256_BLOCK_SIZE; + inlen -= SHA256_BLOCK_SIZE; + } else { + n = MIN(inlen, (SHA256_BLOCK_SIZE - md->curlen)); + os_memcpy(md->buf + md->curlen, in, n); + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == SHA256_BLOCK_SIZE) { + if (sha256_compress(md, md->buf) < 0) + return -1; + md->length += 8 * SHA256_BLOCK_SIZE; + md->curlen = 0; + } + } + } + + return 0; +} + + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (32 bytes) + @return CRYPT_OK if successful +*/ +static int +sha256_done(struct sha256_state *md, unsigned char *out) +{ + int i; + + if (md->curlen >= sizeof(md->buf)) + return -1; + + /* increase the length of the message */ + md->length += md->curlen * 8; + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char) 0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 56) { + while (md->curlen < SHA256_BLOCK_SIZE) { + md->buf[md->curlen++] = (unsigned char) 0; + } + sha256_compress(md, md->buf); + md->curlen = 0; + } + + /* pad up to 56 bytes of zeroes */ + while (md->curlen < 56) { + md->buf[md->curlen++] = (unsigned char) 0; + } + + /* store length */ + WPA_PUT_BE64(md->buf + 56, md->length); + sha256_compress(md, md->buf); + + /* copy output */ + for (i = 0; i < 8; i++) + WPA_PUT_BE32(out + (4 * i), md->state[i]); + + return 0; +} + +/* ===== end - public domain SHA256 implementation ===== */ diff --git a/components/wpa_supplicant/src/crypto/sha256.c b/components/wpa_supplicant/src/crypto/sha256.c new file mode 100644 index 000000000..f62cc1182 --- /dev/null +++ b/components/wpa_supplicant/src/crypto/sha256.c @@ -0,0 +1,160 @@ +/* + * SHA-256 hash implementation and interface functions + * Copyright (c) 2003-2007, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include "crypto/includes.h" + +#include "crypto/common.h" +#include "crypto/sha256.h" +#include "crypto/crypto.h" + + +/** + * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (32 bytes) + */ +void +hmac_sha256_vector(const u8 *key, size_t key_len, size_t num_elem, + const u8 *addr[], const size_t *len, u8 *mac) +{ + unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ + unsigned char tk[32]; + const u8 *_addr[6]; + size_t _len[6], i; + + if (num_elem > 5) { + /* + * Fixed limit on the number of fragments to avoid having to + * allocate memory (which could fail). + */ + return; + } + + /* if key is longer than 64 bytes reset it to key = SHA256(key) */ + if (key_len > 64) { + sha256_vector(1, &key, &key_len, tk); + key = tk; + key_len = 32; + } + + /* the HMAC_SHA256 transform looks like: + * + * SHA256(K XOR opad, SHA256(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in ipad */ + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + /* XOR key with ipad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x36; + + /* perform inner SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + for (i = 0; i < num_elem; i++) { + _addr[i + 1] = addr[i]; + _len[i + 1] = len[i]; + } + sha256_vector(1 + num_elem, _addr, _len, mac); + + os_memset(k_pad, 0, sizeof(k_pad)); + os_memcpy(k_pad, key, key_len); + /* XOR key with opad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x5c; + + /* perform outer SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + _addr[1] = mac; + _len[1] = SHA256_MAC_LEN; + sha256_vector(2, _addr, _len, mac); +} + + +/** + * hmac_sha256 - HMAC-SHA256 over data buffer (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @data: Pointers to the data area + * @data_len: Length of the data area + * @mac: Buffer for the hash (20 bytes) + */ +void +hmac_sha256(const u8 *key, size_t key_len, const u8 *data, + size_t data_len, u8 *mac) +{ + hmac_sha256_vector(key, key_len, 1, &data, &data_len, mac); +} + + +/** + * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2) + * @key: Key for PRF + * @key_len: Length of the key in bytes + * @label: A unique label for each purpose of the PRF + * @data: Extra data to bind into the key + * @data_len: Length of the data + * @buf: Buffer for the generated pseudo-random key + * @buf_len: Number of bytes of key to generate + * + * This function is used to derive new, cryptographically separate keys from a + * given key. + */ +void +sha256_prf(const u8 *key, size_t key_len, const char *label, + const u8 *data, size_t data_len, u8 *buf, size_t buf_len) +{ + u16 counter = 1; + size_t pos, plen; + u8 hash[SHA256_MAC_LEN]; + const u8 *addr[4]; + size_t len[4]; + u8 counter_le[2], length_le[2]; + + addr[0] = counter_le; + len[0] = 2; + addr[1] = (u8 *) label; + len[1] = os_strlen(label); + addr[2] = data; + len[2] = data_len; + addr[3] = length_le; + len[3] = sizeof(length_le); + + WPA_PUT_LE16(length_le, buf_len * 8); + pos = 0; + while (pos < buf_len) { + plen = buf_len - pos; + WPA_PUT_LE16(counter_le, counter); + if (plen >= SHA256_MAC_LEN) { + hmac_sha256_vector(key, key_len, 4, addr, len, + &buf[pos]); + pos += SHA256_MAC_LEN; + } else { + hmac_sha256_vector(key, key_len, 4, addr, len, hash); + os_memcpy(&buf[pos], hash, plen); + break; + } + counter++; + } +} diff --git a/components/xtensa-debug-module/component.mk b/components/xtensa-debug-module/component.mk index a57ae0b12..308f64f0e 100755 --- a/components/xtensa-debug-module/component.mk +++ b/components/xtensa-debug-module/component.mk @@ -1,5 +1,4 @@ # # Component Makefile # - -include $(IDF_PATH)/make/component_common.mk +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/docs/COPYRIGHT.rst b/docs/COPYRIGHT.rst index da5f5b204..67b3d9bf1 100644 --- a/docs/COPYRIGHT.rst +++ b/docs/COPYRIGHT.rst @@ -1,3 +1,6 @@ +Copyrights and Licenses +*********************** + Software Copyrights =================== @@ -87,8 +90,7 @@ developments under license policy of following terms. Copyright (C) 2011, ChaN, all right reserved. * The TJpgDec module is a free software and there is NO WARRANTY. -* No restriction on use. You can use, modify and redistribute it for -personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +* No restriction on use. You can use, modify and redistribute it for personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. * Redistributions of source code must retain the above copyright notice. diff --git a/docs/Doxyfile b/docs/Doxyfile new file mode 100644 index 000000000..eeb4fe740 --- /dev/null +++ b/docs/Doxyfile @@ -0,0 +1,52 @@ +# This is Doxygen configuration file +# +# Doxygen provides over 260 configuration statements +# To make this file easier to follow, +# it contains only statements that are non-default +# +# NOTE: +# It is recommended not to change defaults unless specifically required +# Test any changes how they affect generated documentation +# Make sure that correct warnings are generated to flag issues with documented code +# +# For the complete list of configuration statements see: +# http://www.stack.nl/~dimitri/doxygen/manual/config.html + + +PROJECT_NAME = "ESP32 Programming Guide" + +INPUT = ../components/esp32/include/esp_wifi.h \ + ../components/driver/include/driver \ + ../components/bt/include \ + ../components/nvs_flash/include \ + ../components/log/include \ + ../components/vfs/include \ + ../components/spi_flash/include \ + ../components/esp32/include/esp_int_wdt.h \ + ../components/esp32/include/esp_task_wdt.h + +## Get warnings for functions that have no documentation for their parameters or return value +## +WARN_NO_PARAMDOC = YES + +## Do not complain about not having dot +## +HAVE_DOT = NO + +## Generate XML that is required for Breathe +## +GENERATE_XML = YES +XML_OUTPUT = xml + +GENERATE_HTML = NO +HAVE_DOT = NO +GENERATE_LATEX = NO +GENERATE_MAN = YES +GENERATE_RTF = NO + +## Skip distracting progress messages +## +QUIET = YES +## Log warnings in a file for further review +## +WARN_LOGFILE = "doxygen-warning-log.txt" diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..c04268ff1 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/ReadtheDocsTemplate" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ReadtheDocsTemplate" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/_static/doc-code-documentation-inline.png b/docs/_static/doc-code-documentation-inline.png new file mode 100644 index 000000000..9de5d51a2 Binary files /dev/null and b/docs/_static/doc-code-documentation-inline.png differ diff --git a/docs/_static/doc-code-documentation-rendered.png b/docs/_static/doc-code-documentation-rendered.png new file mode 100644 index 000000000..d287d3c2e Binary files /dev/null and b/docs/_static/doc-code-documentation-rendered.png differ diff --git a/docs/_static/doc-code-function.png b/docs/_static/doc-code-function.png new file mode 100644 index 000000000..758971ce7 Binary files /dev/null and b/docs/_static/doc-code-function.png differ diff --git a/docs/_static/doc-code-member.png b/docs/_static/doc-code-member.png new file mode 100644 index 000000000..eee897a49 Binary files /dev/null and b/docs/_static/doc-code-member.png differ diff --git a/docs/_static/doc-code-void-function.png b/docs/_static/doc-code-void-function.png new file mode 100644 index 000000000..36eeced6b Binary files /dev/null and b/docs/_static/doc-code-void-function.png differ diff --git a/docs/api/bt.rst b/docs/api/bt.rst new file mode 100644 index 000000000..1824bc454 --- /dev/null +++ b/docs/api/bt.rst @@ -0,0 +1,41 @@ +Bluetooth +========= + +Overview +-------- + +`Instructions`_ + +Application Example +------------------- + +Check `/examples `_ folder of `espressif/esp-idf `_ repository, that contains the following example: + +`05_ble_adv `_ + + This is a BLE advertising demo with virtual HCI interface. Send Reset/ADV_PARAM/ADV_DATA/ADV_ENABLE HCI command for BLE advertising. + +`Instructions`_ + +.. _Instructions: template.html + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `bt/include/bt.h `_ + +Type Definitions +^^^^^^^^^^^^^^^^ + +.. doxygenstruct:: vhci_host_callback + +Functions +^^^^^^^^^ + +.. doxygenfunction:: API_vhci_host_check_send_available +.. doxygenfunction:: API_vhci_host_register_callback +.. doxygenfunction:: API_vhci_host_send_packet +.. doxygenfunction:: bt_controller_init diff --git a/docs/api/esp_wifi.rst b/docs/api/esp_wifi.rst new file mode 100644 index 000000000..c13d3d751 --- /dev/null +++ b/docs/api/esp_wifi.rst @@ -0,0 +1,80 @@ +Wi-Fi +===== + +Overview +-------- + +`Instructions`_ + +Application Example +------------------- + +`Instructions`_ + +API Reference +------------- + +`Instructions`_ + +.. _Instructions: template.html + +Header Files +^^^^^^^^^^^^ + + * `esp32/include/esp_wifi.h `_ + +Macros +------ + +.. doxygendefine:: WIFI_INIT_CONFIG_DEFAULT + + +Type Definitions +---------------- + +.. doxygentypedef:: wifi_promiscuous_cb_t +.. doxygentypedef:: esp_vendor_ie_cb_t + +Functions +--------- + +.. doxygenfunction:: esp_wifi_init +.. doxygenfunction:: esp_wifi_deinit +.. doxygenfunction:: esp_wifi_set_mode +.. doxygenfunction:: esp_wifi_get_mode +.. doxygenfunction:: esp_wifi_start +.. doxygenfunction:: esp_wifi_stop +.. doxygenfunction:: esp_wifi_connect +.. doxygenfunction:: esp_wifi_disconnect +.. doxygenfunction:: esp_wifi_clear_fast_connect +.. doxygenfunction:: esp_wifi_deauth_sta +.. doxygenfunction:: esp_wifi_scan_start +.. doxygenfunction:: esp_wifi_scan_stop +.. doxygenfunction:: esp_wifi_scan_get_ap_num +.. doxygenfunction:: esp_wifi_scan_get_ap_records +.. doxygenfunction:: esp_wifi_sta_get_ap_info +.. doxygenfunction:: esp_wifi_set_ps +.. doxygenfunction:: esp_wifi_get_ps +.. doxygenfunction:: esp_wifi_set_protocol +.. doxygenfunction:: esp_wifi_get_protocol +.. doxygenfunction:: esp_wifi_set_bandwidth +.. doxygenfunction:: esp_wifi_get_bandwidth +.. doxygenfunction:: esp_wifi_set_channel +.. doxygenfunction:: esp_wifi_get_channel +.. doxygenfunction:: esp_wifi_set_country +.. doxygenfunction:: esp_wifi_get_country +.. doxygenfunction:: esp_wifi_set_mac +.. doxygenfunction:: esp_wifi_get_mac +.. doxygenfunction:: esp_wifi_set_promiscuous_rx_cb +.. doxygenfunction:: esp_wifi_set_promiscuous +.. doxygenfunction:: esp_wifi_get_promiscuous +.. doxygenfunction:: esp_wifi_set_config +.. doxygenfunction:: esp_wifi_get_config +.. doxygenfunction:: esp_wifi_ap_get_sta_list +.. doxygenfunction:: esp_wifi_set_storage +.. doxygenfunction:: esp_wifi_set_auto_connect +.. doxygenfunction:: esp_wifi_get_auto_connect +.. doxygenfunction:: esp_wifi_set_vendor_ie +.. doxygenfunction:: esp_wifi_set_vendor_ie_cb + + diff --git a/docs/api/gpio.rst b/docs/api/gpio.rst new file mode 100644 index 000000000..0cd4eca36 --- /dev/null +++ b/docs/api/gpio.rst @@ -0,0 +1,138 @@ +GPIO +==== + +Overview +-------- + +`Instructions`_ + +Application Example +------------------- + +`Instructions`_ + +API Reference +------------- + +`Instructions`_ + +.. _Instructions: template.html + +Header Files +^^^^^^^^^^^^ + + * `driver/include/driver/driver/gpio.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: GPIO_SEL_0 +.. doxygendefine:: GPIO_SEL_1 +.. doxygendefine:: GPIO_SEL_2 +.. doxygendefine:: GPIO_SEL_3 +.. doxygendefine:: GPIO_SEL_4 +.. doxygendefine:: GPIO_SEL_5 +.. doxygendefine:: GPIO_SEL_6 +.. doxygendefine:: GPIO_SEL_7 +.. doxygendefine:: GPIO_SEL_8 +.. doxygendefine:: GPIO_SEL_9 +.. doxygendefine:: GPIO_SEL_10 +.. doxygendefine:: GPIO_SEL_11 +.. doxygendefine:: GPIO_SEL_12 +.. doxygendefine:: GPIO_SEL_13 +.. doxygendefine:: GPIO_SEL_14 +.. doxygendefine:: GPIO_SEL_15 +.. doxygendefine:: GPIO_SEL_16 +.. doxygendefine:: GPIO_SEL_17 +.. doxygendefine:: GPIO_SEL_18 +.. doxygendefine:: GPIO_SEL_19 +.. doxygendefine:: GPIO_SEL_21 +.. doxygendefine:: GPIO_SEL_22 +.. doxygendefine:: GPIO_SEL_23 +.. doxygendefine:: GPIO_SEL_25 +.. doxygendefine:: GPIO_SEL_26 +.. doxygendefine:: GPIO_SEL_27 +.. doxygendefine:: GPIO_SEL_32 +.. doxygendefine:: GPIO_SEL_33 +.. doxygendefine:: GPIO_SEL_34 +.. doxygendefine:: GPIO_SEL_35 +.. doxygendefine:: GPIO_SEL_36 +.. doxygendefine:: GPIO_SEL_37 +.. doxygendefine:: GPIO_SEL_38 +.. doxygendefine:: GPIO_SEL_39 +.. doxygendefine:: GPIO_PIN_REG_0 +.. doxygendefine:: GPIO_PIN_REG_1 +.. doxygendefine:: GPIO_PIN_REG_2 +.. doxygendefine:: GPIO_PIN_REG_3 +.. doxygendefine:: GPIO_PIN_REG_4 +.. doxygendefine:: GPIO_PIN_REG_5 +.. doxygendefine:: GPIO_PIN_REG_6 +.. doxygendefine:: GPIO_PIN_REG_7 +.. doxygendefine:: GPIO_PIN_REG_8 +.. doxygendefine:: GPIO_PIN_REG_9 +.. doxygendefine:: GPIO_PIN_REG_10 +.. doxygendefine:: GPIO_PIN_REG_11 +.. doxygendefine:: GPIO_PIN_REG_12 +.. doxygendefine:: GPIO_PIN_REG_13 +.. doxygendefine:: GPIO_PIN_REG_14 +.. doxygendefine:: GPIO_PIN_REG_15 +.. doxygendefine:: GPIO_PIN_REG_16 +.. doxygendefine:: GPIO_PIN_REG_17 +.. doxygendefine:: GPIO_PIN_REG_18 +.. doxygendefine:: GPIO_PIN_REG_19 +.. doxygendefine:: GPIO_PIN_REG_20 +.. doxygendefine:: GPIO_PIN_REG_21 +.. doxygendefine:: GPIO_PIN_REG_22 +.. doxygendefine:: GPIO_PIN_REG_23 +.. doxygendefine:: GPIO_PIN_REG_25 +.. doxygendefine:: GPIO_PIN_REG_26 +.. doxygendefine:: GPIO_PIN_REG_27 +.. doxygendefine:: GPIO_PIN_REG_32 +.. doxygendefine:: GPIO_PIN_REG_33 +.. doxygendefine:: GPIO_PIN_REG_34 +.. doxygendefine:: GPIO_PIN_REG_35 +.. doxygendefine:: GPIO_PIN_REG_36 +.. doxygendefine:: GPIO_PIN_REG_37 +.. doxygendefine:: GPIO_PIN_REG_38 +.. doxygendefine:: GPIO_PIN_REG_39 +.. doxygendefine:: GPIO_APP_CPU_INTR_ENA +.. doxygendefine:: GPIO_APP_CPU_NMI_INTR_ENA +.. doxygendefine:: GPIO_PRO_CPU_INTR_ENA +.. doxygendefine:: GPIO_PRO_CPU_NMI_INTR_ENA +.. doxygendefine:: GPIO_SDIO_EXT_INTR_ENA +.. doxygendefine:: GPIO_MODE_DEF_INPUT +.. doxygendefine:: GPIO_MODE_DEF_OUTPUT +.. doxygendefine:: GPIO_MODE_DEF_OD +.. doxygendefine:: GPIO_PIN_COUNT +.. doxygendefine:: GPIO_IS_VALID_GPIO +.. doxygendefine:: GPIO_IS_VALID_OUTPUT_GPIO + +Type Definitions +^^^^^^^^^^^^^^^^ + +.. doxygentypedef:: gpio_event_callback + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: gpio_num_t +.. doxygenenum:: gpio_int_type_t +.. doxygenenum:: gpio_mode_t +.. doxygenenum:: gpio_pullup_t +.. doxygenenum:: gpio_pulldown_t +.. doxygenenum:: gpio_pull_mode_t + +Functions +^^^^^^^^^ + +.. doxygenfunction:: gpio_config +.. doxygenfunction:: gpio_set_intr_type +.. doxygenfunction:: gpio_intr_enable +.. doxygenfunction:: gpio_intr_disable +.. doxygenfunction:: gpio_set_level +.. doxygenfunction:: gpio_get_level +.. doxygenfunction:: gpio_set_direction +.. doxygenfunction:: gpio_set_pull_mode +.. doxygenfunction:: gpio_wakeup_enable +.. doxygenfunction:: gpio_wakeup_disable +.. doxygenfunction:: gpio_isr_register diff --git a/docs/api/ledc.rst b/docs/api/ledc.rst new file mode 100644 index 000000000..855f82216 --- /dev/null +++ b/docs/api/ledc.rst @@ -0,0 +1,69 @@ +LED Control +=========== + +Overview +-------- + +`Instructions`_ + +Application Example +------------------- + +`Instructions`_ + +API Reference +------------- + +`Instructions`_ + +.. _Instructions: template.html + +Header Files +^^^^^^^^^^^^ + + * `driver/include/driver/ledc.h `_ + +Data Structures +^^^^^^^^^^^^^^^ + +.. doxygenstruct:: ledc_channel_config_t + :members: + +.. doxygenstruct:: ledc_timer_config_t + :members: + +Macros +^^^^^^ + +.. doxygendefine:: LEDC_APB_CLK_HZ +.. doxygendefine:: LEDC_REF_CLK_HZ + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: ledc_mode_t +.. doxygenenum:: ledc_intr_type_t +.. doxygenenum:: ledc_duty_direction_t +.. doxygenenum:: ledc_clk_src_t +.. doxygenenum:: ledc_timer_t +.. doxygenenum:: ledc_channel_t +.. doxygenenum:: ledc_timer_bit_t + +Functions +^^^^^^^^^ + +.. doxygenfunction:: ledc_channel_config +.. doxygenfunction:: ledc_timer_config +.. doxygenfunction:: ledc_update_duty +.. doxygenfunction:: ledc_stop +.. doxygenfunction:: ledc_set_freq +.. doxygenfunction:: ledc_get_freq +.. doxygenfunction:: ledc_set_duty +.. doxygenfunction:: ledc_get_duty +.. doxygenfunction:: ledc_set_fade +.. doxygenfunction:: ledc_isr_register +.. doxygenfunction:: ledc_timer_set +.. doxygenfunction:: ledc_timer_rst +.. doxygenfunction:: ledc_timer_pause +.. doxygenfunction:: ledc_timer_resume +.. doxygenfunction:: ledc_bind_channel_timer diff --git a/docs/api/log.rst b/docs/api/log.rst new file mode 100644 index 000000000..d2f2fcd07 --- /dev/null +++ b/docs/api/log.rst @@ -0,0 +1,68 @@ +.. include:: ../../components/log/README.rst + +Application Example +------------------- + +`Instructions`_ + +API Reference +------------- + +`Instructions`_ + +.. _Instructions: template.html + +Header Files +^^^^^^^^^^^^ + + * `log/include/esp_log.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: LOG_COLOR_E +.. doxygendefine:: LOG_COLOR_W +.. doxygendefine:: LOG_COLOR_I +.. doxygendefine:: LOG_COLOR_D +.. doxygendefine:: LOG_COLOR_V +.. doxygendefine:: LOG_RESET_COLOR +.. doxygendefine:: LOG_FORMAT +.. doxygendefine:: LOG_LOCAL_LEVEL +.. doxygendefine:: ESP_EARLY_LOGE +.. doxygendefine:: ESP_EARLY_LOGW +.. doxygendefine:: ESP_EARLY_LOGI +.. doxygendefine:: ESP_EARLY_LOGD +.. doxygendefine:: ESP_EARLY_LOGV +.. doxygendefine:: ESP_LOGE +.. doxygendefine:: ESP_LOGW +.. doxygendefine:: ESP_LOGI +.. doxygendefine:: ESP_LOGD +.. doxygendefine:: ESP_LOGV + +Type Definitions +^^^^^^^^^^^^^^^^ + +.. doxygentypedef:: vprintf_like_t + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: esp_log_level_t + +Functions +^^^^^^^^^ + +.. doxygenfunction:: esp_log_level_set +.. doxygenfunction:: esp_log_set_vprintf +.. doxygenfunction:: esp_log_timestamp +.. doxygenfunction:: esp_log_write + + + + + + + + + + diff --git a/docs/api/nvs_flash.rst b/docs/api/nvs_flash.rst new file mode 100644 index 000000000..a765f7608 --- /dev/null +++ b/docs/api/nvs_flash.rst @@ -0,0 +1,91 @@ +.. include:: ../../components/nvs_flash/README.rst + +Application Example +------------------- + +Two examples are provided in ESP-IDF examples directory: + +`07_nvs_rw_value `_ + + Demonstrates how to read and write a single integer value using NVS. + + The value holds the number of ESP32 module restarts. Since it is written to NVS, the value is preserved between restarts. + + Example also shows how to check if read / write operation was successful, or certain value is not initialized in NVS. Diagnostic is provided in plain text to help track program flow and capture any issues on the way. + +`08_nvs_rw_blob `_ + + Demonstrates how to read and write a single integer value and a blob (binary large object) using NVS to preserve them between ESP32 module restarts. + + * value - tracks number of ESP32 module soft and hard restarts. + * blob - contains a table with module run times. The table is read from NVS to dynamically allocated RAM. New run time is added to the table on each manually triggered soft restart and written back to NVS. Triggering is done by pulling down GPIO0. + + Example also shows how to implement diagnostics if read / write operation was successful. + + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `nvs_flash/include/nvs_flash.h `_ + * `nvs_flash/include/nvs.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: ESP_ERR_NVS_BASE +.. doxygendefine:: ESP_ERR_NVS_NOT_INITIALIZED +.. doxygendefine:: ESP_ERR_NVS_NOT_FOUND +.. doxygendefine:: ESP_ERR_NVS_TYPE_MISMATCH +.. doxygendefine:: ESP_ERR_NVS_READ_ONLY +.. doxygendefine:: ESP_ERR_NVS_NOT_ENOUGH_SPACE +.. doxygendefine:: ESP_ERR_NVS_INVALID_NAME +.. doxygendefine:: ESP_ERR_NVS_INVALID_HANDLE +.. doxygendefine:: ESP_ERR_NVS_REMOVE_FAILED +.. doxygendefine:: ESP_ERR_NVS_KEY_TOO_LONG +.. doxygendefine:: ESP_ERR_NVS_PAGE_FULL +.. doxygendefine:: ESP_ERR_NVS_INVALID_STATE +.. doxygendefine:: ESP_ERR_NVS_INVALID_LENGTH + +Type Definitions +^^^^^^^^^^^^^^^^ + +.. doxygentypedef:: nvs_handle + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: nvs_open_mode + +Functions +^^^^^^^^^ +.. doxygenfunction:: nvs_open +.. doxygenfunction:: nvs_set_i8 +.. doxygenfunction:: nvs_set_u8 +.. doxygenfunction:: nvs_set_i16 +.. doxygenfunction:: nvs_set_u16 +.. doxygenfunction:: nvs_set_i32 +.. doxygenfunction:: nvs_set_u32 +.. doxygenfunction:: nvs_set_i64 +.. doxygenfunction:: nvs_set_u64 +.. doxygenfunction:: nvs_set_str +.. doxygenfunction:: nvs_set_blob +.. doxygenfunction:: nvs_get_i8 +.. doxygenfunction:: nvs_get_u8 +.. doxygenfunction:: nvs_get_i16 +.. doxygenfunction:: nvs_get_u16 +.. doxygenfunction:: nvs_get_i32 +.. doxygenfunction:: nvs_get_u32 +.. doxygenfunction:: nvs_get_i64 +.. doxygenfunction:: nvs_get_u64 +.. doxygenfunction:: nvs_get_str +.. doxygenfunction:: nvs_get_blob +.. doxygenfunction:: nvs_erase_key +.. doxygenfunction:: nvs_erase_all +.. doxygenfunction:: nvs_commit +.. doxygenfunction:: nvs_close +.. doxygenfunction:: nvs_flash_init +.. doxygenfunction:: nvs_flash_init_custom + diff --git a/docs/api/rmt.rst b/docs/api/rmt.rst new file mode 100644 index 000000000..9d834b1e2 --- /dev/null +++ b/docs/api/rmt.rst @@ -0,0 +1,93 @@ +RMT +======== + +Overview +-------- + +The RMT (Remote Control) module driver can be used to send and receive infrared remote control signals. Due to flexibility of RMT module, the driver can also be used to generate many other types of signals. + +Application Example +------------------- + +NEC remote control TX and RX example: `examples/11_rmt_nec_tx_rx `_. + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `driver/rmt.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: RMT_MEM_BLOCK_BYTE_NUM +.. doxygendefine:: RMT_MEM_ITEM_NUM + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: rmt_channel_t +.. doxygenenum:: rmt_mem_owner_t +.. doxygenenum:: rmt_source_clk_t +.. doxygenenum:: rmt_data_mode_t +.. doxygenenum:: rmt_mode_t +.. doxygenenum:: rmt_idle_level_t +.. doxygenenum:: rmt_carrier_level_t + +Structures +^^^^^^^^^^ + +.. doxygenstruct:: rmt_tx_config_t + :members: + +.. doxygenstruct:: rmt_rx_config_t + :members: + +.. doxygenstruct:: rmt_config_t + :members: + + +Functions +^^^^^^^^^ + +.. doxygenfunction:: rmt_set_clk_div +.. doxygenfunction:: rmt_get_clk_div +.. doxygenfunction:: rmt_set_rx_idle_thresh +.. doxygenfunction:: rmt_get_rx_idle_thresh +.. doxygenfunction:: rmt_set_mem_block_num +.. doxygenfunction:: rmt_get_mem_block_num +.. doxygenfunction:: rmt_set_tx_carrier +.. doxygenfunction:: rmt_set_mem_pd +.. doxygenfunction:: rmt_get_mem_pd +.. doxygenfunction:: rmt_tx_start +.. doxygenfunction:: rmt_tx_stop +.. doxygenfunction:: rmt_rx_start +.. doxygenfunction:: rmt_rx_stop +.. doxygenfunction:: rmt_memory_rw_rst +.. doxygenfunction:: rmt_set_memory_owner +.. doxygenfunction:: rmt_get_memory_owner +.. doxygenfunction:: rmt_set_tx_loop_mode +.. doxygenfunction:: rmt_get_tx_loop_mode +.. doxygenfunction:: rmt_set_rx_filter +.. doxygenfunction:: rmt_set_source_clk +.. doxygenfunction:: rmt_get_source_clk +.. doxygenfunction:: rmt_set_idle_level +.. doxygenfunction:: rmt_get_status +.. doxygenfunction:: rmt_set_intr_enable_mask +.. doxygenfunction:: rmt_clr_intr_enable_mask +.. doxygenfunction:: rmt_set_rx_intr_en +.. doxygenfunction:: rmt_set_err_intr_en +.. doxygenfunction:: rmt_set_tx_intr_en +.. doxygenfunction:: rmt_set_evt_intr_en +.. doxygenfunction:: rmt_set_pin +.. doxygenfunction:: rmt_config +.. doxygenfunction:: rmt_isr_register +.. doxygenfunction:: rmt_fill_tx_items +.. doxygenfunction:: rmt_driver_install +.. doxygenfunction:: rmt_driver_uninstall +.. doxygenfunction:: rmt_write_items +.. doxygenfunction:: rmt_wait_tx_done +.. doxygenfunction:: rmt_get_ringbuf_handler + diff --git a/docs/api/spi_flash.rst b/docs/api/spi_flash.rst new file mode 100644 index 000000000..5903c0902 --- /dev/null +++ b/docs/api/spi_flash.rst @@ -0,0 +1,67 @@ +.. include:: ../../components/spi_flash/README.rst + +Application Example +------------------- + +`Instructions`_ + +.. _Instructions: template.html + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `spi_flash/include/esp_spi_flash.h `_ + * `spi_flash/include/esp_partition.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: ESP_ERR_FLASH_BASE +.. doxygendefine:: ESP_ERR_FLASH_OP_FAIL +.. doxygendefine:: ESP_ERR_FLASH_OP_TIMEOUT +.. doxygendefine:: SPI_FLASH_SEC_SIZE +.. doxygendefine:: ESP_PARTITION_SUBTYPE_OTA + +Type Definitions +^^^^^^^^^^^^^^^^ + +.. doxygentypedef:: spi_flash_mmap_handle_t +.. doxygentypedef:: esp_partition_iterator_t + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: spi_flash_mmap_memory_t +.. doxygenenum:: esp_partition_type_t +.. doxygenenum:: esp_partition_subtype_t + +Structures +^^^^^^^^^^ + +.. doxygenstruct:: esp_partition_t + +Functions +^^^^^^^^^ + +.. doxygenfunction:: spi_flash_init +.. doxygenfunction:: spi_flash_get_chip_size +.. doxygenfunction:: spi_flash_erase_sector +.. doxygenfunction:: spi_flash_erase_range +.. doxygenfunction:: spi_flash_write +.. doxygenfunction:: spi_flash_read +.. doxygenfunction:: spi_flash_mmap +.. doxygenfunction:: spi_flash_munmap +.. doxygenfunction:: spi_flash_mmap_dump +.. doxygenfunction:: esp_partition_find +.. doxygenfunction:: esp_partition_find_first +.. doxygenfunction:: esp_partition_get +.. doxygenfunction:: esp_partition_next +.. doxygenfunction:: esp_partition_iterator_release +.. doxygenfunction:: esp_partition_read +.. doxygenfunction:: esp_partition_write +.. doxygenfunction:: esp_partition_erase_range +.. doxygenfunction:: esp_partition_mmap + diff --git a/docs/api/template.rst b/docs/api/template.rst new file mode 100644 index 000000000..6feb7ba27 --- /dev/null +++ b/docs/api/template.rst @@ -0,0 +1,110 @@ +Template +======== + +.. note:: + + *INSTRUCTIONS* + + 1. Use this file as a template to document API. + 2. Change the file name to the name of the header file that represents documented API. + 3. Include respective files with descriptions from the API folder using ``..include::`` + + * README.rst + * example.rst + + 4. Optionally provide description right in this file. + 5. Once done, remove all instructions like this one and any superfluous headers. + +Overview +-------- + +.. note:: + + *INSTRUCTIONS* + + 1. Provide overview where and how this API may be used. + 2. Where applicable include code snippets to illustrate functionality of particular functions. + 3. To distinguish between sections, use the following `heading levels `_: + + * ``#`` with overline, for parts + * ``*`` with overline, for chapters + * ``=``, for sections + * ``-``, for subsections + * ``^``, for subsubsections + * ``"``, for paragraphs + +Application Example +------------------- + +.. note:: + + *INSTRUCTIONS* + + 1. Provide one or more practical examples to demonstrate functionality of this API. + 2. Break down the code into parts and describe functionality of each part. + 3. Provide screenshots if applicable. + +API Reference +------------- + +.. note:: + + *INSTRUCTIONS* + + 1. Specify the names of header files used to generate this reference. Each name should be linked to the source on `espressif/esp-idf `_ repository. + 2. Provide list of API members divided into sections. + 3. Use corresponding ``.. doxygen..`` directives, so member documentation is auto updated. + + * Data Structures -``.. doxygenstruct::`` together with ``:members:`` + * Macros - ``.. doxygendefine::`` + * Type Definitions - ``.. doxygentypedef::`` + * Enumerations - ``.. doxygenenum::`` + * Functions - ``.. doxygenfunction::`` + + See `Breathe documentation `_ for additional information. + + 4. Once done remove superfluous headers. + 5. When changes are committed and documentation is build, check how this section rendered. :doc:`Correct annotations <../documenting-code>` in respective header files, if required. + +Header Files +^^^^^^^^^^^^ + + * `path/header-file.h` + +Data Structures +^^^^^^^^^^^^^^^ + +:: + + .. doxygenstruct:: name_of_structure + :members: + +Macros +^^^^^^ + +:: + + .. doxygendefine:: name_of_macro + +Type Definitions +^^^^^^^^^^^^^^^^ + +:: + + .. doxygentypedef:: name_of_type + +Enumerations +^^^^^^^^^^^^ + +:: + + .. doxygenenum:: name_of_enumeration + +Functions +^^^^^^^^^ + +:: + + .. doxygenfunction:: name_of_function + + diff --git a/docs/api/uart.rst b/docs/api/uart.rst new file mode 100644 index 000000000..609816fd4 --- /dev/null +++ b/docs/api/uart.rst @@ -0,0 +1,98 @@ +UART +==== + +Overview +-------- + +`Instructions`_ + +Application Example +------------------- + +`Instructions`_ + +API Reference +------------- + +`Instructions`_ + +.. _Instructions: template.html + +Header Files +^^^^^^^^^^^^ + + * `driver/include/driver/uart.h `_ + +Data Structures +^^^^^^^^^^^^^^^ + +.. doxygenstruct:: uart_config_t + :members: + +.. doxygenstruct:: uart_intr_config_t + :members: + +.. doxygenstruct:: uart_event_t + :members: + +Macros +^^^^^^ + +.. doxygendefine:: UART_FIFO_LEN +.. doxygendefine:: UART_INTR_MASK +.. doxygendefine:: UART_LINE_INV_MASK +.. doxygendefine:: UART_BITRATE_MAX +.. doxygendefine:: UART_PIN_NO_CHANGE +.. doxygendefine:: UART_INVERSE_DISABLE +.. doxygendefine:: UART_INVERSE_RXD +.. doxygendefine:: UART_INVERSE_CTS +.. doxygendefine:: UART_INVERSE_TXD +.. doxygendefine:: UART_INVERSE_RTS + +Enumerations +^^^^^^^^^^^^ + +.. doxygenenum:: uart_word_length_t +.. doxygenenum:: uart_stop_bits_t +.. doxygenenum:: uart_port_t +.. doxygenenum:: uart_parity_t +.. doxygenenum:: uart_hw_flowcontrol_t +.. doxygenenum:: uart_event_type_t + +Functions +^^^^^^^^^ + +.. doxygenfunction:: uart_set_word_length +.. doxygenfunction:: uart_get_word_length +.. doxygenfunction:: uart_set_stop_bits +.. doxygenfunction:: uart_get_stop_bits +.. doxygenfunction:: uart_set_parity +.. doxygenfunction:: uart_get_parity +.. doxygenfunction:: uart_set_baudrate +.. doxygenfunction:: uart_get_baudrate +.. doxygenfunction:: uart_set_line_inverse +.. doxygenfunction:: uart_set_hw_flow_ctrl +.. doxygenfunction:: uart_get_hw_flow_ctrl +.. doxygenfunction:: uart_clear_intr_status +.. doxygenfunction:: uart_enable_intr_mask +.. doxygenfunction:: uart_disable_intr_mask +.. doxygenfunction:: uart_enable_rx_intr +.. doxygenfunction:: uart_disable_rx_intr +.. doxygenfunction:: uart_disable_tx_intr +.. doxygenfunction:: uart_enable_tx_intr +.. doxygenfunction:: uart_isr_register +.. doxygenfunction:: uart_set_pin +.. doxygenfunction:: uart_set_rts +.. doxygenfunction:: uart_set_dtr +.. doxygenfunction:: uart_param_config +.. doxygenfunction:: uart_intr_config +.. doxygenfunction:: uart_driver_install +.. doxygenfunction:: uart_driver_delete +.. doxygenfunction:: uart_wait_tx_done +.. doxygenfunction:: uart_tx_chars +.. doxygenfunction:: uart_write_bytes +.. doxygenfunction:: uart_write_bytes_with_break +.. doxygenfunction:: uart_read_bytes +.. doxygenfunction:: uart_flush + + diff --git a/docs/api/vfs.rst b/docs/api/vfs.rst new file mode 100644 index 000000000..798aac549 --- /dev/null +++ b/docs/api/vfs.rst @@ -0,0 +1,44 @@ +.. include:: ../../components/vfs/README.rst + +Application Example +------------------- + +`Instructions `_ + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `vfs/include/esp_vfs.h `_ + * `vfs/include/esp_vfs_dev.h `_ + +Macros +^^^^^^ + +.. doxygendefine:: ESP_VFS_PATH_MAX +.. doxygendefine:: ESP_VFS_FLAG_DEFAULT +.. doxygendefine:: ESP_VFS_FLAG_CONTEXT_PTR + +Structures +^^^^^^^^^^ + +.. doxygenstruct:: esp_vfs_t + :members: + +Functions +^^^^^^^^^ + +.. doxygenfunction:: esp_vfs_register +.. doxygenfunction:: esp_vfs_write +.. doxygenfunction:: esp_vfs_lseek +.. doxygenfunction:: esp_vfs_read +.. doxygenfunction:: esp_vfs_open +.. doxygenfunction:: esp_vfs_close +.. doxygenfunction:: esp_vfs_fstat +.. doxygenfunction:: esp_vfs_stat +.. doxygenfunction:: esp_vfs_link +.. doxygenfunction:: esp_vfs_unlink +.. doxygenfunction:: esp_vfs_rename +.. doxygenfunction:: esp_vfs_dev_uart_register diff --git a/docs/api/wdts.rst b/docs/api/wdts.rst new file mode 100644 index 000000000..1b476f2f7 --- /dev/null +++ b/docs/api/wdts.rst @@ -0,0 +1,72 @@ +Watchdogs +========= + +Overview +-------- + +Esp-idf has support for two types of watchdogs: a task watchdog as well as an interrupt watchdog. Both can be +enabled using ``make menuconfig`` and selecting the appropriate options. + +Interrupt watchdog +^^^^^^^^^^^^^^^^^^ + +The interrupt watchdog makes sure the FreeRTOS task switching interrupt isn't blocked for a long time. This +is bad because no other tasks, including potentially important ones like the WiFi task and the idle task, +can't get any CPU runtime. A blocked task switching interrupt can happen because a program runs into an +infinite loop with interrupts disabled or hangs in an interrupt. + +The default action of the interrupt watchdog is to invoke the panic handler. causing a register dump and an opportunity +for the programmer to find out, using either OpenOCD or gdbstub, what bit of code is stuck with interrupts +disabled. Depending on the configuration of the panic handler, it can also blindly reset the CPU, which may be +preferred in a production environment. + +The interrupt watchdog is built around the hardware watchdog in timer group 1. If this watchdog for some reason +cannot execute the NMI handler that invokes the panic handler (e.g. because IRAM is overwritten by garbage), +it will hard-reset the SOC. + +Task watchdog +^^^^^^^^^^^^^ + +Any tasks can elect to be watched by the task watchdog. If such a task does not feed the watchdog within the time +specified by the task watchdog timeout (which is configurable using ``make menuconfig``), the watchdog will +print out a warning with information about which processes are running on the ESP32 CPUs and which processes +failed to feed the watchdog. + +By default, the task watchdog watches the idle tasks. The usual cause of idle tasks not feeding the watchdog +is a higher-priority process looping without yielding to the lower-priority processes, and can be an indicator +of badly-written code that spinloops on a peripheral or a task that is stuck in an infinite loop. + +Other task can elect to be watched by the task watchdog by calling ``esp_task_wdt_feed()``. Calling this routine +for the first time will register the task to the task watchdog; calling it subsequent times will feed +the watchdog. If a task does not want to be watched anymore (e.g. because it is finished and will call +``vTaskDelete()`` on itself), it needs to call ``esp_task_wdt_delete()``. + +The task watchdog is built around the hardware watchdog in timer group 0. If this watchdog for some reason +cannot execute the interrupt handler that prints the task data (e.g. because IRAM is overwritten by garbage +or interrupts are disabled entirely) it will hard-reset the SOC. + +JTAG and watchdogs +^^^^^^^^^^^^^^^^^^ + +While debugging using OpenOCD, if the CPUs are halted the watchdogs will keep running, eventually resetting the +CPU. This makes it very hard to debug code; that is why the OpenOCD config will disable both watchdogs on startup. +This does mean that you will not get any warnings or panics from either the task or interrupt watchdog when the ESP32 +is connected to OpenOCD via JTAG. + +API Reference +------------- + +Header Files +^^^^^^^^^^^^ + + * `esp32/include/esp_int_wdt.h `_ + * `esp32/include/esp_task_wdt.h `_ + + +Functions +--------- + +.. doxygenfunction:: esp_int_wdt_init +.. doxygenfunction:: esp_task_wdt_init +.. doxygenfunction:: esp_task_wdt_feed +.. doxygenfunction:: esp_task_wdt_delete diff --git a/docs/build_system.rst b/docs/build_system.rst index 4df65b1b5..4ba89f865 100644 --- a/docs/build_system.rst +++ b/docs/build_system.rst @@ -1,5 +1,5 @@ Build System ------------- +************ This document explains the Espressif IoT Development Framework build system and the concept of "components" @@ -8,262 +8,393 @@ Read this document if you want to know how to organise a new ESP-IDF project. We recommend using the esp-idf-template_ project as a starting point for your project. +Using the Build System +====================== + +The esp-idf README file contains a description of how to use the build system to build your project. + Overview ======== -An ESP-IDF project can be seen as an almagation of a number of components. -For example, for a webserver that shows the current humidity, we would -have: +An ESP-IDF project can be seen as an amalgamation of a number of components. +For example, for a webserver that shows the current humidity, there could be: - The ESP32 base libraries (libc, rom bindings etc) - The WiFi drivers - A TCP/IP stack - The FreeRTOS operating system - A webserver -- A driver for an humidity sensor +- A driver for the humidity sensor - Main code tying it all together -ESP-IDF makes these components explicit and configurable. To do that, when a project -is compiled, the build environment will look up all the components in the -ESP-IDF directories, the project directories and optionally custom other component -directories. It then allows the user to configure compile-time options using -a friendly text-based menu system to customize the ESP-IDF as well as other components -to the requirements of the project. After the components are customized, the -build process will compile everything into an output file, which can then be uploaded -into a board in a way that can also be defined by components. +ESP-IDF makes these components explicit and configurable. To do that, +when a project is compiled, the build environment will look up all the +components in the ESP-IDF directories, the project directories and +(optionally) in additional custom component directories. It then +allows the user to configure the ESP-IDF project using a a text-based +menu system to customize each component. After the components in the +project are configured, the build process will compile the project. -A project in this sense is defined as a directory under which all the files required -to build it live, excluding the ESP-IDF files and the toolchain. A simple project -tree might look like this:: +Concepts +-------- - - myProject/ - build/ +- A "project" is a directory that contains all the files and configuration to build a single "app" (executable), as well as additional supporting output such as a partition table, data/filesystem partitions, and a bootloader. + +- "Project configuration" is held in a single file called sdkconfig in the root directory of the project. This configuration file is modified via ``make menuconfig`` to customise the configuration of the project. A single project contains exactly one project configuration. + +- An "app" is an executable which is built by esp-idf. A single project will usually build two apps - a "project app" (the main executable, ie your custom firmware) and a "bootloader app" (the initial bootloader program which launches the project app). + +- "components" are modular pieces of standalone code which are compiled into static libraries (.a files) and linked into an app. Some are provided by esp-idf itself, others may be sourced from other places. + +Some things are not part of the project: + +- "ESP-IDF" is not part of the project. Instead it is standalone, and linked to the project via the ``IDF_PATH`` environment variable which holds the path of the ``esp-idf`` directory. This allows the IDF framework to be decoupled from your project. + +- The toolchain for compilation is not part of the project. The toolchain should be installed in the system command line PATH, or the path to the toolchain can be set as part of the compiler prefix in the project configuration. + + +Example Project +--------------- + +An example project directory tree might look like this:: + + - myProject/ + - Makefile + - sdkconfig - components/ - component1/ - component.mk - Kconfig - src1.c - component2/ - component.mk - Kconfig - src1.c + - include/ - component2.h - main/ - src1.c - src2.c - - Makefile + - component.mk -As we can see, a project consists of a components/ subdirectory containing its -components as well as one or more directories containing the project-specific -sources; by default a single directory called 'main' is assumed. The project -directory will also have a Makefile where the projects name as well as optionally -other options are defined. After compilation, the project directory will contain -a 'build'-directory containing all of the objects, libraries and other generated -files as well as the final binary. + - build/ -Components also have a custom makefile - ``component.mk``. This contains various definititions -influencing the build process of the component as well as the project it's used -in. Components may also include a Kconfig file defining the compile-time options that are -settable by means of the menu system. +This example "myProject" contains the following elements: -Project Makefile variables that can be set by the programmer:: +- A top-level project Makefile. This Makefile set the ``PROJECT_NAME`` variable and (optionally) defines + other project-wide make variables. It includes the core ``$(IDF_PATH)/make/project.mk`` makefile which + implements the rest of the ESP-IDF build system. - PROJECT_NAME: Mandatory. Name for the project - BUILD_DIR_BASE: Set the directory where all objects/libraries/binaries end up in. - Defaults to $(PROJECT_PATH)/build - COMPONENT_DIRS: Search path for components. Defaults to the component/ directories - in the ESP-IDF path and the project path. - COMPONENTS: A list of component names. Defaults to all the component found in the - COMPONENT_DIRS directory - EXTRA_COMPONENT_DIRS: Defaults to unset. Use this to add directories to the default - COMPONENT_DIRS. - SRCDIRS: Directories under the project dir containing project-specific sources. - Defaults to 'main'. These are treated as 'lite' components: they do not have - include directories that are passed to the compilation pass of all components and - they do not have a Kconfig option. +- "sdkconfig" project configuration file. This file is created/updated when "make menuconfig" runs, and holds configuration for all of the components in the project (including esp-idf itself). The "sdkconfig" file may or may not be added to the source control system of the project. -Component-specific component.mk variables that can be set by the programmer:: +- Optional "components" directory contains components that are part of the project. A project does not have to contain custom components of this kind, but it can be useful for structuring reusable code or including third party components that aren't part of ESP-IDF. - COMPONENT_ADD_INCLUDEDIRS: Relative path to include directories to be added to - the entire project. If an include directory is only needed to compile this - specific component, don't add it here. - COMPONENT_PRIV_INCLUDEDIRS: Relative path to include directories that are only used - when compiling this specific component. - COMPONENT_DEPENDS: Names of any components that need to be compiled before this component. - COMPONENT_ADD_LDFLAGS: LD flags to add for the entire project. Defaults to -l$(COMPONENT_NAME). - Add libraries etc in the current directory as $(abspath libwhatever.a) - COMPONENT_EXTRA_INCLUDES: Any extra include paths used when compiling the component's - source files. These will be prefixed with '-I' and passed to the compiler. - Similar to COMPONENT_PRIV_INCLUDEDIRS, but these paths are passed as-is instead of - expanded relative to the component directory. - COMPONENT_SRCDIRS: Relative directories to look in for sources. Defaults to '.', the current - directory (the root of the component) only. Use this to specify any subdirectories. Note - that specifying this overwrites the default action of compiling everything in the - components root dir; to keep this behaviour please also add '.' as a directory in this - list. - COMPONENT_OBJS: Object files to compile. Defaults to the .o variants of all .c and .S files - that are found in COMPONENT_SRCDIRS. - COMPONENT_EXTRA_CLEAN: Files that are generated using rules in the components Makefile - that also need to be cleaned - COMPONENT_BUILDRECIPE: Recipe to build the component. Optional. Defaults to building all - COMPONENT_OBJS and linking them into lib(componentname).a - COMPONENT_CLEANRECIPE: Recipe to clean the component. Optional. Defaults to removing - all built objects and libraries. - COMPONENT_BUILD_DIR: Equals the cwd of the component build, which is the build dir - of the component (where all the .o etc files should be created). +- "main" directory is a special "pseudo-component" that contains source code for the project itself. "main" is a default name, the Makefile variable ``SRCDIRS`` defaults to this but can be set to look for pseudo-components in other directories. -These variables are already set early on in the Makefile and the values in it will -be usable in component or project Makefiles:: +- "build" directory is where build output is created. After the make process is run, this directory will contain interim object files and libraries as well as final binary output files. This directory is usually not added to source control or distributed with the project source code. - CC, LD, AR, OBJCOPY: Xtensa gcc tools - HOSTCC, HOSTLD etc: Host gcc tools - LDFLAGS, CFLAGS: Set to usable values as defined in ESP-IDF Makefile - PROJECT_NAME: Name of the project, as set in project makefile - PROJECT_PATH: Path to the root of the project folder - COMPONENTS: Name of the components to be included - CONFIG_*: All values set by 'make menuconfig' have corresponding Makefile variables. +Component directories contain a component makefile - ``component.mk``. This may contain variable definitions +to control the build process of the component, and its integration into the overall project. See `Component Makefiles` for more details. -Inside your component's component.mk makefile, you can override or add to these variables -as necessary. The changes are isolated from other components (see Makefile.projbuild below -if you want to share these changes with all other components.) +Each component may also include a ``Kconfig`` file defining the `component configuration` options that can be set via the project configuration. Some components may also include ``Kconfig.projbuild`` and ``Makefile.projbuild`` files, which are special files for `overriding parts of the project`. -For components, there also are these defines:: +Project Makefiles +----------------- - COMPONENT_PATH: Absolute path to the root of the source tree of the component we're - compiling - COMPONENT_LIBRARY: The full path to the static library the components compilation pass - is supposed to generate +Each project has a single Makefile that contains build settings for the entire project. By default, the project Makefile can be quite minimal. -Make Process ------------- +Minimal Example Makefile +^^^^^^^^^^^^^^^^^^^^^^^^ -The Make process is always invoked from the project directory by the -user; invoking it anywhere else gives an error. This is what happens if -we build a binary: +:: -The Makefile first determines how it was included. It figures out -various paths as well as the components available to it. It will also -collect the ldflags and includes that the components specify they need. -It does this by running a dummy make on the components with a "get_variable" -target that will output these values. + PROJECT_NAME := myProject + + include $(IDF_PATH)/make/project.mk -The Makefile will then create targets to build the lib*.a libraries of -all components and make the elf target depend on this. The main Makefile -invokes Make on the componen.mk of each components inside a sub-mke: this way -the components have full freedom to do whatever is necessary to build -the library without influencing other components. By default, the -component.mk includes the utility makefile $(IDF_PATH)/make/component_common.mk. -This provides default targets and configurations that will work -out-of-the-box for most projects. -KConfig -------- +Mandatory Project Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Each component can also have a Kconfig file, alongside the component.mk, that contains -details to add to "menuconfig" for this component. +- ``PROJECT_NAME``: Name of the project. Binary output files will use this name - ie myProject.bin, myProject.elf. + +Optional Project Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These variables all have default values that can be overridden for custom behaviour. Look in ``make/project.mk`` for all of the implementation details. + +- ``PROJECT_PATH``: Top-level project directory. Defaults to the directory containing the Makefile. Many other project variables are based on this variable. The project path cannot contain spaces. +- ``BUILD_DIR_BASE``: The build directory for all objects/libraries/binaries. Defaults to ``$(PROJECT_PATH)/build``. +- ``COMPONENT_DIRS``: Directories to search for components. Defaults to `$(IDF_PATH)/components`, `$(PROJECT_PATH)/components` and ``EXTRA_COMPONENT_DIRS``. Override this variable if you don't want to search for components in the esp-idf & project ``components`` directories. +- ``EXTRA_COMPONENT_DIRS``: Optional list of additional directories to search for components. Components themselves are in sub-directories of these directories, this is a top-level directory containing the component directories. +- ``COMPONENTS``: A list of component names to build into the project. Defaults to all components found in the COMPONENT_DIRS directories. +- ``SRCDIRS``: Directories under the main project directory which contain project-specific "pseudo-components". Defaults to 'main'. The difference between specifying a directory here and specifying it under ``EXTRA_COMPONENT_DIRS`` is that a directory in ``SRCDIRS`` is a component itself (contains a file "component.mk"), whereas a directory in ``EXTRA_COMPONENT_DIRS`` contains component directories which contain a file "component.mk". See the `Example Project` for a concrete case of this. + + +Component Makefiles +------------------- + +Each project contains one or more components, which can either be part of esp-idf or added from other component directories. + +A component is any sub-directory that contains a `component.mk` file.[#f1]_. + +Minimal Component Makefile +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The minimal ``component.mk`` file is an empty file(!). If the file is empty, the default component behaviour is set: + +- All source files in the same directory as the makefile (``*.c``, ``*.cpp``, ``*.S``) will be compiled into the component library +- A sub-directory "include" will be added to the global include search path for all other components. +- The component library will be linked into the project app. + +See `example component makefiles` for more complete component makefile examples. + +Note that there is a different between an empty ``component.mk`` file (which invokes default component build behaviour) and no ``component.mk`` file (which means no default component build behaviour will occur.) It is possible for a component to have no `component.mk` file, if it only contains other files which influence the project configuration or build process. + +.. component variables: + +Preset Component Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following component-specific variables are available for use inside ``component.mk``, but should not be modified: + +- ``COMPONENT_PATH``: The component directory. Evaluates to the absolute path of the directory containing ``component.mk``. The component path cannot contain spaces. +- ``COMPONENT_NAME``: Name of the component. Defaults to the name of the component directory. +- ``COMPONENT_BUILD_DIR``: The component build directory. Evaluates to the absolute path of a directory inside `$(BUILD_DIR_BASE)` where this component's source files are to be built. This is also the Current Working Directory any time the component is being built, so relative paths in make targets, etc. will be relative to this directory. +- ``COMPONENT_LIBRARY``: Name of the static library file (relative to the component build directory) that will be built for this component. Defaults to ``$(COMPONENT_NAME).a``. + +The following variables are set at the project level, but exported for use in the component build: + +- ``PROJECT_NAME``: Name of the project, as set in project Makefile +- ``PROJECT_PATH``: Absolute path of the project directory containing the project Makefile. +- ``COMPONENTS``: Name of all components that are included in this build. +- ``CONFIG_*``: Each value in the project configuration has a corresponding variable available in make. All names begin with ``CONFIG_``. +- ``CC``, ``LD``, ``AR``, ``OBJCOPY``: Full paths to each tool from the gcc xtensa cross-toolchain. +- ``HOSTCC``, ``HOSTLD``, ``HOSTAR``: Full names of each tool from the host native toolchain. + +If you modify any of these variables inside ``component.mk`` then this will not prevent other components from building but it may make your component hard to build and/or debug. + +Optional Project-Wide Component Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following variables can be set inside ``component.mk`` to control build settings across the entire project: + +- ``COMPONENT_ADD_INCLUDEDIRS``: Paths, relative to the component + directory, which will be added to the include search path for + all components in the project. Defaults to ``include`` if not overridden. If an include directory is only needed to compile + this specific component, add it to ``COMPONENT_PRIV_INCLUDEDIRS`` instead. +- ``COMPONENT_ADD_LDFLAGS``: Add linker arguments to the LDFLAGS for + the app executable. Defaults to ``-l$(COMPONENT_NAME)``. If + adding pre-compiled libraries to this directory, add them as + absolute paths - ie $(COMPONENT_PATH)/libwhatever.a +- ``COMPONENT_DEPENDS``: Optional list of component names that should + be compiled before this component. This is not necessary for + link-time dependencies, because all component include directories + are available at all times. It is necessary if one component + generates an include file which you then want to include in another + component. Most components do not need to set this variable. + +The following variable only works for components that are part of esp-idf itself: + +- ``COMPONENT_SUBMODULES``: Optional list of git submodule paths + (relative to COMPONENT_PATH) used by the component. These will be + checked (and initialised if necessary) by the build process. This + variable is ignored if the component is outside the IDF_PATH + directory. + + +Optional Component-Specific Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following variables can be set inside ``component.mk`` to control the build of that component: + +- ``COMPONENT_PRIV_INCLUDEDIRS``: Directory paths, must be relative to + the component directory, which will be added to the include search + path for this component's source files only. +- ``COMPONENT_EXTRA_INCLUDES``: Any extra include paths used when + compiling the component's source files. These will be prefixed with + '-I' and passed as-is to the compiler. Similar to the + ``COMPONENT_PRIV_INCLUDEDIRS`` variable, except these paths are not + expanded relative to the component directory. +- ``COMPONENT_SRCDIRS``: Directory paths, must be relative to the + component directory, which will be searched for source files (``*.cpp``, + ``*.c``, ``*.S``). Defaults to '.', ie the component directory + itself. Override this to specify a different list of directories + which contain source files. +- ``COMPONENT_OBJS``: Object files to compile. Default value is a .o + file for each source file that is found in ``COMPONENT_SRCDIRS``. + Overriding this list allows you to exclude source files in + ``COMPONENT_SRCDIRS`` that would otherwise be compiled. See + `Specifying source files` +- ``COMPONENT_EXTRA_CLEAN``: Paths, relative to the component build + directory, of any files that are generated using custom make rules + in the component.mk file and which need to be removed as part of + ``make clean``. See `Source Code Generation` for an example. +- ``COMPONENT_OWNBUILDTARGET`` & `COMPONENT_OWNCLEANTARGET`: These + targets allow you to fully override the default build behaviour for + the component. See `Fully Overriding The Component Makefile` for + more details. +- ``CFLAGS``: Flags passed to the C compiler. A default set of + ``CFLAGS`` is defined based on project settings. Component-specific + additions can be made via ``CFLAGS +=``. It is also possible + (although not recommended) to override this variable completely for + a component. +- ``CPPFLAGS``: Flags passed to the C preprocessor (used for .c, .cpp + and .S files). A default set of ``CPPFLAGS`` is defined based on + project settings. Component-specific additions can be made via + ``CPPFLAGS +=``. It is also possible (although not recommended) to + override this variable completely for a component. +- ``CXXFLAGS``: Flags passed to the C++ compiler. A default set of + ``CXXFLAGS`` is defined based on project + settings. Component-specific additions can be made via ``CXXFLAGS + +=``. It is also possible (although not recommended) to override + this variable completely for a component. + +Component Configuration +----------------------- + +Each component can also have a Kconfig file, alongside ``component.mk``. This contains contains +configuration settings to add to the "make menuconfig" for this component. + +These settings are found under the "Component Settings" menu when menuconfig is run. + +To create a component KConfig file, it is easiest to start with one of the KConfig files distributed with esp-idf. + +For an example, see `Adding conditional configuration`. + +Build Process Internals +----------------------- + +Top Level: Project Makefile +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- "make" is always run from the project directory and the project makefile, typically named Makefile. +- The project makefile sets ``PROJECT_NAME`` and optionally customises other `optional project variables` +- The project makefile includes ``$(IDF_PATH)/make/project.mk`` which contains the project-level Make logic. +- ``project.mk`` fills in default project-level make variables and includes make variables from the project configuration. If the generated makefile containing project configuration is out of date, then it is regenerated (via targets in ``project_config.mk``) and then the make process restarts from the top. +- ``project.mk`` builds a list of components to build, based on the default component directories or a custom list of components set in `optional project variables`. +- Each component can set some `optional project-wide component variables`. These are included via generated makefiles named ``component_project_vars.mk`` - there is one per component. These generated makefiles are included into ``project.mk``. If any are missing or out of date, they are regenerated (via a recursive make call to the component makefile) and then the make process restarts from the top. +- `Makefile.projbuild` files from components are included into the make process, to add extra targets or configuration. +- By default, the project makefile also generates top-level build & clean targets for each component and sets up `app` and `clean` targets to invoke all of these sub-targets. +- In order to compile each component, a recursive make is performed for the component makefile. + +To better understand the project make process, have a read through the ``project.mk`` file itself. + +Second Level: Component Makefiles +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Each call to a component makefile goes via the ``$(IDF_PATH)/make/component_wrapper.mk`` wrapper makefile. +- The ``component_wrapper.mk`` is called with the current directory set to the component build directory, and the ``COMPONENT_MAKEFILE`` variable is set to the absolute path to ``component.mk``. +- ``component_wrapper.mk`` sets default values for all `component variables`, then includes the `component.mk` file which can override or modify these. +- If ``COMPONENT_OWNBUILDTARGET`` and ``COMPONENT_OWNCLEANTARGET`` are not defined, default build and clean targets are created for the component's source files and the prerequisite ``COMPONENT_LIBRARY`` static library file. +- The ``component_project_vars.mk`` file has its own target in ``component_wrapper.mk``, which is evaluated from ``project.mk`` if this file needs to be rebuilt due to changes in the component makefile or the project configuration. + +To better understand the component make process, have a read through the ``component_wrapper.mk`` file and some of the ``component.mk`` files included with esp-idf. + +Debugging The Make Process +-------------------------- + +Some tips for debugging the esp-idf build system: + +- Appending ``V=1`` to the make arguments (or setting it as an environment variable) will cause make to echo all commands executed, and also each directory as it is entered for a sub-make. +- Running ``make -w`` will cause make to echo each directory as it is entered for a sub-make - same as ``V=1`` but without also echoing all commands. +- Running ``make --trace`` (possibly in addition to one of the above arguments) will print out every target as it is built, and the dependency which caused it to be built. +- Running ``make -p`` prints a (very verbose) summary of every generated target in each makefile. + +For more debugging tips and general make information, see the `GNU Make Manual`. + +Overriding Parts of the Project +------------------------------- Makefile.projbuild ------------------- +^^^^^^^^^^^^^^^^^^ -For components that have parts that need to be evaluated in the top-level -project context, you can create a file called Makefile.projbuild in the -component root directory. These files is included into the project's -top-level Makefile. +For components that have build requirements that must be evaluated in the top-level +project make pass, you can create a file called ``Makefile.projbuild`` in the +component directory. This makefile is included when ``project.mk`` is evaluated. For example, if your component needs to add to CFLAGS for the entire project (not just for its own source files) then you can set -``CFLAGS +=`` in Makefile.projbuild. Note that this isn't necessary for -adding include directories to the project, you can set -``COMPONENT_ADD_INCLUDEDIRS`` (see above) in the component.mk. +``CFLAGS +=`` in Makefile.projbuild. +``Makefile.projbuild`` files are used heavily inside esp-idf, for defining project-wide build features such as ``esptool.py`` command line arguments and the ``bootloader`` "special app". + +Note that ``Makefile.projbuild`` isn't necessary for the most common component uses - such as adding include directories to the project, or LDFLAGS to the final linking step. These values can be customised via the ``component.mk`` file itself. See `Optional Project-Wide Component Variables` for details. + +Take care when setting variables or targets in this file. As the values are included into the top-level project makefile pass, they can influence or break functionality across all components! KConfig.projbuild ------------------ +^^^^^^^^^^^^^^^^^ -There's an equivalent to Makefile.projbuild for KConfig: if you want to include -options at the top-level, not inside the 'components' submenu then create a Kconfig.projbuild and -it will be included in the main menu of menuconfig. +This is an equivalent to `Makefile.projbuild` for `component configuration` KConfig files. If you want to include +configuration options at the top-level of menuconfig, rather than inside the "Component Configuration" sub-menu, then these can be defined in the KConfig.projbuild file alongside the ``component.mk`` file. -Take good care when (re)defining stuff here: because it's included with all the other -.projbuild files, it's possible to overwrite variables or re-declare targets defined in -the ESP-IDF makefile/Kconfig and other .projbuild files. It's generally better to just -create a KConfig file, if you can. +Take care when adding configuration values in this file, as they will be included across the entire project configuration. Where possible, it's generally better to create a KConfig file for `component configuration`. -Writing Component Makefiles +Example Component Makefiles --------------------------- -A component consists of a directory which doubles as the name for the -component: a component named 'httpd' lives in a directory called 'httpd' -Because components usually live under the project directory (although -they can also reside in an other folder), the path to this may be -something like /home/myuser/projects/myprojects/components/httpd . +Because the build environment tries to set reasonable defaults that will work most +of the time, component.mk can be very small or even empty (see `Minimal Component Makefile`). However, overriding `component variables` is usually required for some functionality. -Components can have any name (unique to the project) but the name -cannot contain spaces (esp-idf does not support spaces in paths). - -One of the things that most components will have is a component.mk makefile, -containing instructions on how to build the component. Because the -build environment tries to set reasonable defaults that will work most -of the time, component.mk can be very small. - -Simplest component.mk -===================== - -At the minimum, component.mk will just include the ESP-IDF component "common" makefile, -which adds common component functionality:: - - include $(IDF_PATH)/make/component_common.mk - -This will take all the .c and .S files in the component root and compile -them into object files, finally linking them into a library. +Here are some more advanced examples of ``component.mk`` makefiles: Adding source directories -========================= +^^^^^^^^^^^^^^^^^^^^^^^^^ -By default, subdirectories are ignored. If your project has sources in subdirectories +By default, sub-directories are ignored. If your project has sources in sub-directories instead of in the root of the component then you can tell that to the build -system by setting COMPONENT_SRCDIRS:: +system by setting ``COMPONENT_SRCDIRS``:: COMPONENT_SRCDIRS := src1 src2 - include $(IDF_PATH)/make/component_common.mk -This will compile all source files in the src1/ and src2/ subdirectories +This will compile all source files in the src1/ and src2/ sub-directories instead. Specifying source files -======================= +^^^^^^^^^^^^^^^^^^^^^^^ The standard component.mk logic adds all .S and .c files in the source directories as sources to be compiled unconditionally. It is possible -to circumvent that logic and hardcode the objects to be compiled by -manually setting the COMPONENT_OBJS variable to the name of the +to circumvent that logic and hard-code the objects to be compiled by +manually setting the ``COMPONENT_OBJS`` variable to the name of the objects that need to be generated:: COMPONENT_OBJS := file1.o file2.o thing/filea.o thing/fileb.o anotherthing/main.o - include $(IDF_PATH)/make/component_common.mk + COMPONENT_SRCDIRS := . thing anotherthing +Note that ``COMPONENT_SRCDIRS`` must be set as well. Adding conditional configuration -================================ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The configuration system can be used to conditionally compile some files -dependending on the options selected in ``make menuconfig``: +depending on the options selected in ``make menuconfig``: + +``Kconfig``:: -Kconfig:: config FOO_ENABLE_BAR - bool "Enable the BAR feature." - help - This enables the BAR feature of the FOO component. + bool "Enable the BAR feature." + help + This enables the BAR feature of the FOO component. -Makefile:: - COMPONENT_OBJS := foo_a.o foo_b.o $(if $(CONFIG_FOO_ENABLE_BAR),foo_bar.o foo_bar_interface.o) - include $(IDF_PATH)/make/component_common.mk +``component.mk``:: + + COMPONENT_OBJS := foo_a.o foo_b.o + + ifdef CONFIG_FOO_BAR + COMPONENT_OBJS += foo_bar.o foo_bar_interface.o + endif + +See the `GNU Make Manual` for conditional syntax that can be used use in makefiles. Source Code Generation -====================== +^^^^^^^^^^^^^^^^^^^^^^ -Some components will have a situation where a source file isn't supplied -with the component itself but has to be generated from another file. Say -our component has a header file that consists of the converted binary -data of a BMP file, converted using a hypothetical tool called bmp2h. The -header file is then included in as C source file called graphics_lib.c:: +Some components will have a situation where a source file isn't +supplied with the component itself but has to be generated from +another file. Say our component has a header file that consists of the +converted binary data of a BMP file, converted using a hypothetical +tool called bmp2h. The header file is then included in as C source +file called graphics_lib.c:: COMPONENT_EXTRA_CLEAN := logo.h @@ -272,7 +403,6 @@ header file is then included in as C source file called graphics_lib.c:: logo.h: $(COMPONENT_PATH)/logo.bmp bmp2h -i $^ -o $@ - include $(IDF_PATH)/make/component_common.mk In this example, graphics_lib.o and logo.h will be generated in the current directory (the build directory) while logo.bmp comes with the @@ -281,24 +411,42 @@ generated file, it needs to be cleaned when make clean is called which why it is added to the COMPONENT_EXTRA_CLEAN variable. Cosmetic Improvements -===================== +^^^^^^^^^^^^^^^^^^^^^ -The above example will work just fine, but there's one last cosmetic -improvement that can be done. The make system tries to make the make -process somewhat easier on the eyes by hiding the commands (unless you -run make with the V=1 switch) and this does not do that yet. Here's an -improved version that will output in the same style as the rest of the -make process:: +Because logo.h is a generated file, it needs to be cleaned when make +clean is called which why it is added to the COMPONENT_EXTRA_CLEAN +variable. - COMPONENT_EXTRA_CLEAN := test_tjpgd_logo.h +Adding logo.h to the ``graphics_lib.o`` dependencies causes it to be +generated before ``graphics_lib.c`` is compiled. - graphics_lib.o: logo.h +If a a source file in another component included ``logo.h``, then this +component's name would have to be added to the other component's +``COMPONENT_DEPENDS`` list to ensure that the components were built +in-order. - logo.h: $(COMPONENT_PATH)/logo.bmp - $(summary) BMP2H $@ - $(Q) bmp2h -i $^ -o $@ +Embedding Binary Data +^^^^^^^^^^^^^^^^^^^^^ + +Sometimes you have a file with some binary or text data that you'd like to make available to your component - but you don't want to reformat the file as C source. + +You can set a variable COMPONENT_EMBED_FILES in component.mk, giving the names of the files to embed in this way:: + + COMPONENT_EMBED_FILES := server_root_cert.der + +Or if the file is a string, you can use the variable COMPONENT_EMBED_TXTFILES. This will embed the contents of the text file as a null-terminated string:: + + COMPONENT_EMBED_TXTFILES := server_root_cert.pem + +The file's contents will be added to the .rodata section in flash, and are available via symbol names as follows:: + + extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start"); + extern const uint8_t server_root_cert_pem_end[] asm("_binary_server_root_cert_pem_end"); + +The names are generated from the full name of the file, as given in COMPONENT_EMBED_FILES. Characters /, ., etc. are replaced with underscores. The _binary prefix in the symbol name is added by objcopy and is the same for both text and binary files. + +For an example of using this technique, see examples/04_https_request - the certificate file contents are loaded from the text .pem file at compile time. - include $(IDF_PATH)/make/component_common.mk Fully Overriding The Component Makefile --------------------------------------- @@ -307,12 +455,15 @@ Obviously, there are cases where all these recipes are insufficient for a certain component, for example when the component is basically a wrapper around another third-party component not originally intended to be compiled under this build system. In that case, it's possible to forego -the build system entirely by setting COMPONENT_OWNBUILDTARGET and -possibly COMPONENT_OWNCLEANTARGET and defining your own build- and clean +the esp-idf build system entirely by setting COMPONENT_OWNBUILDTARGET and +possibly COMPONENT_OWNCLEANTARGET and defining your own targets named ``build`` and ``clean`` in ``component.mk`` target. The build target can do anything as long as it creates -$(COMPONENT_LIBRARY) for the main file to link into the project binary, -and even that is not necessary: if the COMPONENT_ADD_LDFLAGS variable -is set, the component can instruct the linker to do anything else as well. +$(COMPONENT_LIBRARY) for the project make process to link into the app binary. + +(Actually, even this is not strictly necessary - if the COMPONENT_ADD_LDFLAGS variable +is set then the component can instruct the linker to link other binaries instead.) .. _esp-idf-template: https://github.com/espressif/esp-idf-template +.. _GNU Make Manual: https://www.gnu.org/software/make/manual/make.html +.. _[_f1]: Actually, some components in esp-idf are "pure configuration" components that don't have a component.mk file, only a Makefile.projbuild and/or Kconfig.projbuild file. However, these components are unusual and most components have a component.mk file. diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..551cd86dd --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- +# +# Read the Docs Template documentation build configuration file, created by +# sphinx-quickstart on Tue Aug 26 14:19:49 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- Run DoxyGen to prepare XML for Sphinx--------------------------------- +# ref. https://github.com/rtfd/readthedocs.org/issues/388 + +from subprocess import call, Popen, PIPE +import shlex + +call('doxygen') + +# -- Function to get output of a command ---------------------------------- +def run_cmd_get_output(cmd): + process = Popen(shlex.split(cmd), stdout=PIPE) + (output, err) = process.communicate() + exit_code = process.wait() + if exit_code != 0: + raise RuntimeError('command line program has failed') + return output + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['breathe'] + +# Breathe extension variables +breathe_projects = { "esp32-idf": "xml/" } +breathe_default_project = "esp32-idf" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'ESP32 Programming Guide' +copyright = u'2016, Espressif' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# + +# Different setup depending if script is running on ReadTheDocs or elsewhere +on_rtd = os.environ.get('READTHEDOCS') == 'True' +if on_rtd: + # The short X.Y version. + # Apparently ReadTheDocs is getting confused by other version / release + # ReadTheDocs is building specific or the latest release from GitHub. + version = '1.0' + release = '1.0' +else: + # This is supposed to be "the short X.Y version", but it's the only version + # visible when you open index.html. + # Display full version to make things less confusing. + # If needed, nearest tag is returned by 'git describe --abbrev=0'. + version = run_cmd_get_output('git describe') + # The full version, including alpha/beta/rc tags. + release = run_cmd_get_output('git describe') + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'ReadtheDocsTemplatedoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'ReadtheDocsTemplate.tex', u'Read the Docs Template Documentation', + u'Read the Docs', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'readthedocstemplate', u'Read the Docs Template Documentation', + [u'Read the Docs'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'ReadtheDocsTemplate', u'Read the Docs Template Documentation', + u'Read the Docs', 'ReadtheDocsTemplate', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +# -- Use sphinx_rtd_theme for local builds -------------------------------- +# ref. https://github.com/snide/sphinx_rtd_theme#using-this-theme-locally-then-building-on-read-the-docs +# +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +if not on_rtd: # only import and set the theme if we're building docs locally + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# otherwise, readthedocs.org uses their theme by default, so no need to specify it diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 000000000..3bdd7dc21 --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1 @@ +.. include:: ../CONTRIBUTING.rst \ No newline at end of file diff --git a/docs/contributor-agreement.rst b/docs/contributor-agreement.rst index 7c194e772..a7919da8f 100644 --- a/docs/contributor-agreement.rst +++ b/docs/contributor-agreement.rst @@ -1,5 +1,5 @@ Contributor Agreement ---------------------- +===================== Individual Contributor Non-Exclusive License Agreement ------------------------------------------------------ @@ -13,7 +13,7 @@ Framework (esp-idf) ("We" or "Us"). The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. To make this document effective, please follow the instructions at -https://github.com/espressif/esp-idf/blob/master/CONTRIBUTING.md. +https://github.com/espressif/esp-idf/blob/master/CONTRIBUTING.rst. 1. DEFINITIONS ~~~~~~~~~~~~~~ diff --git a/docs/deep-sleep-stub.rst b/docs/deep-sleep-stub.rst new file mode 100644 index 000000000..7711b1ce2 --- /dev/null +++ b/docs/deep-sleep-stub.rst @@ -0,0 +1,87 @@ +Deep Sleep Wake Stubs +===================== + +ESP32 supports running a "deep sleep wake stub" when coming out of deep sleep. This function runs immediately as soon as the chip wakes up - before any normal initialisation, bootloader, or ESP-IDF code has run. After the wake stub runs, the SoC can go back to sleep or continue to start ESP-IDF normally. + +Deep sleep wake stub code is loaded into "RTC Fast Memory" and any data which it uses must also be loaded into RTC memory. RTC memory regions hold their contents during deep sleep. + +Rules for Wake Stubs +-------------------- + +Wake stub code must be carefully written: + +* As the SoC has freshly woken from sleep, most of the peripherals are in reset states. The SPI flash is unmapped. + +* The wake stub code can only call functions implemented in ROM or loaded into RTC Fast Memory (see below.) + +* The wake stub code can only access data loaded in RTC memory. All other RAM will be unintiailised and have random contents. The wake stub can use other RAM for temporary storage, but the contents will be overwritten when the SoC goes back to sleep or starts ESP-IDF. + +* RTC memory must include any read-only data (.rodata) used by the stub. + +* Data in RTC memory is initialised whenever the SoC restarts, except when waking from deep sleep. When waking from deep sleep, the values which were present before going to sleep are kept. + +* Wake stub code is a part of the main esp-idf app. During normal running of esp-idf, functions can call the wake stub functions or access RTC memory. It is as if these were regular parts of the app. + +Implementing A Stub +------------------- + +The wake stub in esp-idf is called ``esp_wake_deep_sleep()``. This function runs whenever the SoC wakes from deep sleep. There is a default version of this function provided in esp-idf, but the default function is weak-linked so if your app contains a function named ``esp_wake_deep_sleep()`` then this will override the default. + +If supplying a custom wake stub, the first thing it does should be to call ``esp_default_wake_deep_sleep()``. + +It is not necessary to implement ``esp_wake_deep_sleep()`` in your app in order to use deep sleep. It is only necessary if you want to have special behaviour immediately on wake. + +If you want to swap between different deep sleep stubs at runtime, it is also possible to do this by calling the ``esp_set_deep_sleep_wake_stub()`` function. This is not necessary if you only use the default ``esp_wake_deep_sleep()`` function. + +All of these functions are declared in the ``esp_deepsleep.h`` header under components/esp32. + +Loading Code Into RTC Memory +---------------------------- + +Wake stub code must be resident in RTC Fast Memory. This can be done in one of two ways. + +The first way is to use the ``RTC_IRAM_ATTR`` attribute to place a function into RTC memory:: + + void RTC_IRAM_ATTR esp_wake_deep_sleep(void) { + esp_default_wake_deep_sleep(); + // Add additional functionality here + } + +The second way is to place the function into any source file whose name starts with ``rtc_wake_stub``. Files names ``rtc_wake_stub*`` have their contents automatically put into RTC memory by the linker. + +The first way is simpler for very short and simple code, or for source files where you want to mix "normal" and "RTC" code. The second way is simpler when you want to write longer pieces of code for RTC memory. + + +Loading Data Into RTC Memory +---------------------------- + +Data used by stub code must be resident in RTC Slow Memory. This memory is also used by the ULP. + +Specifying this data can be done in one of two ways: + +The first way is to use the ``RTC_DATA_ATTR`` and ``RTC_RODATA_ATTR`` to specify any data (writeable or read-only, respectivley) which should be loaded into RTC slow memory:: + + RTC_DATA_ATTR int wake_count; + + void RTC_IRAM_ATTR esp_wake_deep_sleep(void) { + esp_default_wake_deep_sleep(); + static RTC_RODATA_ATTR const char fmt_str[] = "Wake count %d\n"; + ets_printf(fmt_str, wake_count++); + } + +Unfortunately, any string constants used in this way must be declared as arrays and marked with RTC_RODATA_ATTR, as shown in the example above. + +The second way is to place the data into any source file whose name starts with ``rtc_wake_stub``. + +For example, the equivalent example in ``rtc_wake_stub_counter.c``:: + + int wake_count; + + void RTC_IRAM_ATTR esp_wake_deep_sleep(void) { + esp_default_wake_deep_sleep(); + ets_printf("Wake count %d\n", wake_count++); + } + +The second way is a better option if you need to use strings, or write other more complex code. + + diff --git a/docs/documenting-code.rst b/docs/documenting-code.rst new file mode 100644 index 000000000..a73e26de4 --- /dev/null +++ b/docs/documenting-code.rst @@ -0,0 +1,152 @@ +Documenting Code +================ + +The purpose of this description is to provide quick summary on documentation style used in `espressif/esp-idf`_ repository and how to add new documentation. + +Introduction +------------ + +When documenting code for this repository, please follow `Doxygen style `_. You are doing it by inserting special commands, for instance ``@param``, into standard comments blocks, for example: + +:: + + /** + * @param ratio this is oxygen to air ratio + */ + +Doxygen is phrasing the code, extracting the commands together with subsequent text, and building documentation out of it. + +Typical comment block, that contains documentation of a function, looks like below. + +.. image:: _static/doc-code-documentation-inline.png + :align: center + :alt: Sample inline code documentation + +Doxygen supports couple of formatting styles. It also gives you great flexibility on level of details to include in documentation. To get familiar with available features, please check data reach and very well organized `Doxygen Manual `_. + +Why we need it? +--------------- + +The ultimate goal is to ensure that all the code is consistently documented, so we can use tools like `Sphinx `_ and `Breathe `_ to aid preparation and automatic updates of API documentation when the code changes. + +With these tools the above piece of code renders like below: + +.. image:: _static/doc-code-documentation-rendered.png + :align: center + :alt: Sample inline code after rendering + +Go for it! +---------- + +When writing code for this repository, please follow guidelines below. + +1. Document all building blocks of code: functions, structs, typedefs, enums, macros, etc. Provide enough information on purpose, functionality and limitations of documented items, as you would like to see them documented when reading the code by others. + +2. Documentation of function should describe what this function does. If it accepts input parameters and returns some value, all of them should be explained. + +3. Do not add a data type before parameter or any other characters besides spaces. All spaces and line breaks are compressed into a single space. If you like to break a line, then break it twice. + + .. image:: _static/doc-code-function.png + :align: center + :alt: Sample function documented inline and after rendering + +4. If function has void input or does not return any value, then skip ``@param`` or ``@return`` + + .. image:: _static/doc-code-void-function.png + :align: center + :alt: Sample void function documented inline and after rendering + +5. When documenting a ``define`` as well as members of a ``struct`` or ``enum``, place specific comment like below after each member. + + .. image:: _static/doc-code-member.png + :align: center + :alt: Sample of member documentation inline and after rendering + + +6. To provide well formatted lists, break the line after command (like ``@return`` in example below). + + :: + + * + * @return + * - ESP_OK if erase operation was successful + * - ESP_ERR_NVS_INVALID_HANDLE if handle has been closed or is NULL + * - ESP_ERR_NVS_READ_ONLY if handle was opened as read only + * - ESP_ERR_NVS_NOT_FOUND if the requested key doesn't exist + * - other error codes from the underlying storage driver + * + +7. Overview of functionality of documented header file, or group of files that make a library, should be placed in the same directory in a separate ``README.rst`` file. If directory contains header files for different APIs, then the file name should be ``apiname-readme.rst``. + +Go one extra mile +----------------- + +There is couple of tips, how you can make your documentation even better and more useful to the reader. + +1. Add code snippets to illustrate implementation. To do so, enclose snippet using ``@code{c}`` and ``@endcode`` commands. + + :: + + * + * @code{c} + * // Example of using nvs_get_i32: + * int32_t max_buffer_size = 4096; // default value + * esp_err_t err = nvs_get_i32(my_handle, "max_buffer_size", &max_buffer_size); + * assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND); + * // if ESP_ERR_NVS_NOT_FOUND was returned, max_buffer_size will still + * // have its default value. + * @endcode + * + + The code snippet should be enclosed in a comment block of the function that it illustrates. + +2. To highlight some important information use command ``@attention`` or ``@note``. + + :: + + * + * @attention + * 1. This API only impact WIFI_MODE_STA or WIFI_MODE_APSTA mode + * 2. If the ESP32 is connected to an AP, call esp_wifi_disconnect to disconnect. + * + + Above example also shows how to use a numbered list. + +3. Use markdown to make your documentation even more readable. You will add headers, links, tables and more. + + :: + + * + * [ESP32 Technical Reference](http://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf) + * + +.. note:: + + Code snippets, notes, links, etc. will not make it to the documentation, if not enclosed in a comment block associated with one of documented objects. + +5. Prepare one or more complete code examples together with description. Place them in a separate file ``example.rst`` in the same directory as the API header files. If directory contains header files for different APIs, then the file name should be ``apiname-example.rst``. + +Put it all together +------------------- + +Once all the above steps are complete, follow instruction in :doc:`api/template` and create a single file, that will merge all individual pieces of prepared documentation. Finally add a link to this file to respective ``.. toctree::`` in ``index.rst`` file located in ``/docs`` folder. + +OK, but I am new to Sphinx! +--------------------------- + +1. No worries. All the software you need is well documented. It is also open source and free. Start by checking `Sphinx `_ documentation. If you are not clear how to write using rst markup language, see `reStructuredText Primer `_. +2. Check the source files of this documentation to understand what is behind of what you see now on the screen. Sources are maintained on GitHub in `espressif/esp-idf`_ repository in `/docs `_ folder. You can go directly to the source file of this page by scrolling up and clicking the link in the top right corner. When on GitHub, see what's really inside, open source files by clicking ``Raw`` button. +3. You will likely want to see how documentation builds and looks like before posting it on the GitHub. There are two options to do so: + + * Install `Sphinx `_, `Breathe `_ and `Doxygen `_ to build it locally. You would need a Linux machine for that. + * Set up an account on `Read the Docs `_ and build documentation in the cloud. Read the Docs provides document building and hosting for free and their service works really quick and great. + +Wrap up +------- + +We love good code that is doing cool things. +We love it even better, if it is well documented, so we can quickly make it run and also do the cool things. + +Go ahead, contribute your code and documentation! + +.. _espressif/esp-idf: https://github.com/espressif/esp-idf/ diff --git a/docs/doxygen_xml_to_rst.xslt b/docs/doxygen_xml_to_rst.xslt new file mode 100644 index 000000000..0212457e5 --- /dev/null +++ b/docs/doxygen_xml_to_rst.xslt @@ -0,0 +1,58 @@ + + + + + + + + + Macros + ^^^^^^ + + .. doxygendefine:: + + + + + + Type Definitions + ^^^^^^^^^^^^^^^^ + + .. doxygentypedef:: + + + + + + Enumerations + ^^^^^^^^^^^^ + + .. doxygenenum:: + + + + + + + Structures + ^^^^^^^^^^ + + .. doxygenstruct:: + + + :members: + + + + + Functions + ^^^^^^^^^ + + .. doxygenfunction:: + + + + + + + diff --git a/docs/eclipse-setup.rst b/docs/eclipse-setup.rst index 21d83a7f0..fbad93be6 100644 --- a/docs/eclipse-setup.rst +++ b/docs/eclipse-setup.rst @@ -1,3 +1,6 @@ +Build and Flash with Eclipse IDE +******************************** + Installing Eclipse IDE ====================== diff --git a/docs/general-notes.rst b/docs/general-notes.rst new file mode 100644 index 000000000..a68346700 --- /dev/null +++ b/docs/general-notes.rst @@ -0,0 +1,125 @@ +General Notes About ESP-IDF Programming +======================================= + +Application startup flow +------------------------ + +This note explains various steps which happen before ``app_main`` function of an ESP-IDF application is called. + +The high level view of startup process is as follows: + +1. First-stage bootloader in ROM loads second-stage bootloader image to RAM (IRAM & DRAM) from flash offset 0x1000. +2. Second-stage bootloader loads partition table and main app image from flash. Main app incorporates both RAM segments and read-only segments mapped via flash cache. +3. Main app image executes. At this point the second CPU and RTOS scheduler can be started. + +This process is explained in detail in the following sections. + +First stage bootloader +^^^^^^^^^^^^^^^^^^^^^^ + +After SoC reset, PRO CPU will start running immediately, executing reset vector code, while APP CPU will be held in reset. During startup process, PRO CPU does all the initialization. APP CPU reset is de-asserted in the ``call_start_cpu0`` function of application startup code. Reset vector code is located at address 0x40000400 in the mask ROM of the ESP32 chip and can not be modified. + +Startup code called from the reset vector determines the boot mode by checking ``GPIO_STRAP_REG`` register for bootstrap pin states. Depending on the reset reason, the following takes place: + +1. Reset from deep sleep: if the value in ``RTC_CNTL_STORE6_REG`` is non-zero, and CRC value of RTC memory in ``RTC_CNTL_STORE7_REG`` is valid, use ``RTC_CNTL_STORE6_REG`` as an entry point address and jump immediately to it. If ``RTC_CNTL_STORE6_REG`` is zero, or ``RTC_CNTL_STORE7_REG`` contains invalid CRC, or once the code called via ``RTC_CNTL_STORE6_REG`` returns, proceed with boot as if it was a power-on reset. **Note**: to run customized code at this point, a deep sleep stub mechanism is provided. Please see :doc:`deep sleep ` documentation for this. + +2. For power-on reset, software SOC reset, and watchdog SOC reset: check the ``GPIO_STRAP_REG`` register if UART or SDIO download mode is requested. If this is the case, configure UART or SDIO, and wait for code to be downloaded. Otherwise, proceed with boot as if it was due to software CPU reset. + +3. For software CPU reset and watchdog CPU reset: configure SPI flash based on EFUSE values, and attempt to load the code from flash. This step is described in more detail in the next paragraphs. If loading code from flash fails, unpack BASIC interpreter into the RAM and start it. Note that RTC watchdog is still enabled when this happens, so unless any input is received by the interpreter, watchdog will reset the SOC in a few hundred milliseconds, repeating the whole process. If the interpreter receives any input from the UART, it disables the watchdog. + +Application binary image is loaded from flash starting at address 0x1000. First 4kB sector of flash is used to store secure boot IV and signature of the application image. Please check secure boot documentation for details about this. + +.. TODO: describe application binary image format, describe optional flash configuration commands. + +Second stage bootloader +^^^^^^^^^^^^^^^^^^^^^^^ + +In ESP-IDF, the binary image which resides at offset 0x1000 in flash is the second stage bootloader. Second stage bootloader source code is available in components/bootloader directory of ESP-IDF. Note that this arrangement is not the only one possible with the ESP32 chip. It is possible to write a fully featured application which would work when flashed to offset 0x1000, but this is out of scope of this document. Second stage bootloader is used in ESP-IDF to add flexibility to flash layout (using partition tables), and allow for various flows associated with flash encryption, secure boot, and over-the-air updates (OTA) to take place. + +When the first stage bootloader is finished checking and loading the second stage bootloader, it jumps to the second stage bootloader entry point found in the binary image header. + +Second stage bootloader reads the partition table found at offset 0x8000. See :doc:`partition tables ` documentation for more information. The bootloader finds factory and OTA partitions, and decides which one to boot based on data found in *OTA info* partition. + +For the selected partition, second stage bootloader copies data and code sections which are mapped into IRAM and DRAM to their load addresses. For sections which have load addresses in DROM and IROM regions, flash MMU is configured to provide the correct mapping. Note that the second stage bootloader configures flash MMU for both PRO and APP CPUs, but it only enables flash MMU for PRO CPU. Reason for this is that second stage bootloader code is loaded into the memory region used by APP CPU cache. The duty of enabling cache for APP CPU is passed on to the application. Once code is loaded and flash MMU is set up, second stage bootloader jumps to the application entry point found in the binary image header. + +Currently it is not possible to add application-defined hooks to the bootloader to customize application partition selection logic. This may be required to load different application image depending on a state of a GPIO, for example. Such customization features will be added to ESP-IDF in the future. For now, bootloader can be customized by copying bootloader component into application directory and making necessary changes there. ESP-IDF build system will compile the component in application directory instead of ESP-IDF components directory in this case. + +Application startup +^^^^^^^^^^^^^^^^^^^ + +ESP-IDF application entry point is ``call_start_cpu0`` function found in ``components/esp32/cpu_start.c``. Two main things this function does are to enable heap allocator and to make APP CPU jump to its entry point, ``call_start_cpu1``. The code on PRO CPU sets the entry point for APP CPU, de-asserts APP CPU reset, and waits for a global flag to be set by the code running on APP CPU, indicating that it has started. Once this is done, PRO CPU jumps to ``start_cpu0`` function, and APP CPU jumps to ``start_cpu1`` function. + +Both ``start_cpu0`` and ``start_cpu1`` are weak functions, meaning that they can be overridden in the application, if some application-specific change to initialization sequence is needed. Default implementation of ``start_cpu0`` enables or initializes components depending on choices made in ``menuconfig``. Please see source code of this function in ``components/esp32/cpu_start.c`` for an up to date list of steps performed. Note that any C++ global constructors present in the application will be called at this stage. Once all essential components are initialized, *main task* is created and FreeRTOS scheduler is started. + +While PRO CPU does initialization in ``start_cpu0`` function, APP CPU spins in ``start_cpu1`` function, waiting for the scheduler to be started on the PRO CPU. Once the scheduler is started on the PRO CPU, code on the APP CPU starts the scheduler as well. + +Main task is the task which runs ``app_main`` function. Main task stack size and priority can be configured in ``menuconfig``. Application can use this task for initial application-specific setup, for example to launch other tasks. Application can also use main task for event loops and other general purpose activities. If ``app_main`` function returns, main task is deleted. + + +Application memory layout +------------------------- + +ESP32 chip has flexible memory mapping features. This section describes how ESP-IDF uses these features by default. + +Application code in ESP-IDF can be placed into one of the following memory regions. + +IRAM (instruction RAM) +^^^^^^^^^^^^^^^^^^^^^^ + +ESP-IDF allocates part of `Internal SRAM0` region (defined in the Technical Reference Manual) for instruction RAM. Except for the first 64 kB block which is used for PRO and APP CPU caches, the rest of this memory range (i.e. from ``0x40080000`` to ``0x400A0000``) is used to store parts of application which need to run from RAM. + +A few components of ESP-IDF and parts of WiFi stack are placed into this region using the linker script. + +If some application code needs to be placed into IRAM, it can be done using ``IRAM_ATTR`` define:: + + #include "esp_attr.h" + + void IRAM_ATTR gpio_isr_handler(void* arg) + { + // ... + } + +Here are the cases when parts of application may or should be placed into IRAM. + +- ISR handlers must always be placed into IRAM. Furthermore, ISR handlers may only call functions placed into IRAM or functions present in ROM. *Note 1:* all FreeRTOS APIs are currently placed into IRAM, so are safe to call from ISR handlers. *Note 1:* all constant data used by ISR handlers and functions called from ISR handlers (including, but not limited to, ``const char`` arrays), must be placed into DRAM using ``DRAM_ATTR``. + +- Some timing critical code may be placed into IRAM to reduce the penalty associated with loading the code from flash. ESP32 reads code and data from flash via a 32 kB cache. In some cases, placing a function into IRAM may reduce delays caused by a cache miss. + +IROM (code executed from Flash) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If a function is not explicitly placed into IRAM or RTC memory, it is placed into flash. The mechanism by which Flash MMU is used to allow code execution from flash is described in the Technical Reference Manual. ESP-IDF places the code which should be executed from flash starting from the beginning of ``0x400D0000 — 0x40400000`` region. Upon startup, second stage bootloader initializes Flash MMU to map the location in flash where code is located into the beginning of this region. Access to this region is transparently cached using two 32kB blocks in ``0x40070000`` — ``0x40080000`` range. + +Note that the code outside ``0x40000000 — 0x40400000`` region may not be reachable with Window ABI ``CALLx`` instructions, so special care is required if ``0x40400000 — 0x40800000`` or ``0x40800000 — 0x40C00000`` regions are used by the application. ESP-IDF doesn't use these regions by default. + +RTC fast memory +^^^^^^^^^^^^^^^ + +The code which has to run after wake-up from deep sleep mode has to be placed into RTC memory. Please check detailed description in :doc:`deep sleep ` documentation. + +DRAM (data RAM) +^^^^^^^^^^^^^^^ + +Non-constant static data and zero-initialized data is placed by the linker into 200 kB ``0x3FFB0000 — 0x3FFF0000`` region. Note that this region is reduced by 64kB (by shifting start address to ``0x3FFC0000``) if Bluetooth stack is used. Length of this region is also reduced by 16 kB or 32kB if trace memory is used. All space which is left in this region after placing static data there is used for the runtime heap. + +Constant data may also be placed into DRAM, for example if it is used in an ISR handler (see notes in IRAM section above). To do that, ``DRAM_ATTR`` define can be used:: + + DRAM_ATTR const char[] format_string = "%p %x"; + char buffer[64]; + sprintf(buffer, format_string, ptr, val); + +Needless to say, it is not advised to use ``printf`` and other output functions in ISR handlers. For debugging purposes, use ``ESP_EARLY_LOGx`` macros when logging from ISR handlers. Make sure that both ``TAG`` and format string are placed into ``DRAM`` in that case. + +DROM (data stored in Flash) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, constant data is placed by the linker into a 4 MB region (``0x3F400000 — 0x3F800000``) which is used to access external flash memory via Flash MMU and cache. Exceptions to this are literal constants which are embedded by the compiler into application code. + +RTC slow memory +^^^^^^^^^^^^^^^ + +Global and static variables used by code which runs from RTC memory (i.e. deep sleep stub code) must be placed into RTC slow memory. Please check detailed description in :doc:`deep sleep ` documentation. + + + + diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..829ce0334 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,141 @@ +ESP32 Programming Guide +======================= + +.. caution:: + + Until ESP-IDF release 1.0, this documentation is a draft. It is incomplete and may have mistakes. Please mind your step! + +Documentation adressed to developers of applications for `ESP32 `_ by `Espressif `_ using `esp-idf `_. + + +Contents: + +.. toctree:: + :caption: Setup Toolchain + :maxdepth: 1 + + Windows + Linux + Mac OS + +.. Connect - TBA + +.. toctree:: + :caption: Build and Flash + :maxdepth: 1 + + Make + Eclipse IDE + +.. toctree:: + :caption: What Else? + :maxdepth: 1 + + General Notes + partition-tables + build_system + openocd + Secure Boot + +.. API Reference + .. + Table of Contents Outline + .. + 1. System - TBA + 1.1. Fundamentals of multiprocessor programming with FreeRTOS - TBA + 1.2. Application startup flow - TBA + 1.3. Flash encryption and secure boot: how they work and APIs + 1.4. Lower Power Coprocessor - TBA + 1.5. Watchdogs + 1.6. ... + 2. Memory - TBA + 2.1. Memory layout of the application (IRAM/IROM, limitations of each) - TBA + 2.2. Flash layout and partitions - TBA + 2.3. Flash access APIs - TBA + 2.4. Partition APIs - TBA + 2.5. OTA mechanism (app partitions, OTA partition) and APIs - TBA + 2.6. ... + 3. Wi-Fi + 4. Bluetooth + 4.1. BT Classic - TBA + 4.2. BLE + 5. Ethernet - TBA + 6. Interfaces + 6.1. GPIO + 6.2. ADC - TBA + 6.3. DAC - TBA + 6.4. UART + 6.5. I2C - TBA + 6.6. I2S - TBA + 6.7. SPI - TBA + 6.8. CAN - TBA + 6.9. SD Controller - TBA + 6.10. Infrared - TBA + 6.11. Pulse Counter - TBA + 6.12. PWM - TBA + 6.13. LED PWM + 6.14. ... + 7. Sensors - TBA + 7.1. Hall Sensor - TBA + 7.2. Temperature Sensor - TBA + 7.3. Touch Sensor - TBA + 8. Protocols - TBA + 9. Components + 9.1. Logging + 9.2 Non-Volatile Storage + 9.3 Virtual Filesystem + 9.3. Http sever - TBA + 10. Applications - TBA + .. + API Dcoumentation Teamplate + .. + +.. toctree:: + :caption: API Reference + :maxdepth: 1 + + Wi-Fi + Bluetooth + Watchdogs + + api/gpio + api/uart + api/ledc + api/rmt + SPI Flash and Partition APIs + Logging + Non-Volatile Storage + Virtual Filesystem + deep-sleep-stub + + Template + +.. toctree:: + :caption: Technical Reference + + Technical Reference + +.. Resources - TBA + +.. toctree:: + :caption: Contribute + :maxdepth: 1 + + contributing + Style Guide + documenting-code + contributor-agreement + +.. toctree:: + :caption: Legal + :maxdepth: 1 + + COPYRIGHT + + +Indices +------- + +* :ref:`genindex` +* :ref:`search` + diff --git a/docs/linux-setup.rst b/docs/linux-setup.rst index 13e1b3a9c..cf5e78b63 100644 --- a/docs/linux-setup.rst +++ b/docs/linux-setup.rst @@ -1,3 +1,6 @@ +Set up of Toolchain for Linux +***************************** + Step 0: Prerequisites ===================== diff --git a/docs/macos-setup.rst b/docs/macos-setup.rst index 8178a17ad..53c6fe54c 100644 --- a/docs/macos-setup.rst +++ b/docs/macos-setup.rst @@ -1,3 +1,6 @@ +Set up of Toolchain for Mac OS +****************************** + Step 0: Prerequisites ===================== diff --git a/docs/make-project.rst b/docs/make-project.rst new file mode 100644 index 000000000..e72bb81dd --- /dev/null +++ b/docs/make-project.rst @@ -0,0 +1,63 @@ +Build and Flash with Make +========================= + +Finding a project +----------------- + +As well as the `esp-idf-template `_ project mentioned in the setup guide, esp-idf comes with some example projects on github in the `examples `_ directory. + +Once you've found the project you want to work with, change to its directory and you can configure and build it: + +Configuring your project +------------------------ + +`make menuconfig` + +Compiling your project +---------------------- + +`make all` + +... will compile app, bootloader and generate a partition table based on the config. + +Flashing your project +--------------------- + +When `make all` finishes, it will print a command line to use esptool.py to flash the chip. However you can also do this from make by running: + +`make flash` + +This will flash the entire project (app, bootloader and partition table) to a new chip. The settings for serial port flashing can be configured with `make menuconfig`. + +You don't need to run `make all` before running `make flash`, `make flash` will automatically rebuild anything which needs it. + +Compiling & Flashing Just the App +--------------------------------- + +After the initial flash, you may just want to build and flash just your app, not the bootloader and partition table: + +* `make app` - build just the app. +* `make app-flash` - flash just the app. + +`make app-flash` will automatically rebuild the app if it needs it. + +(There's no downside to reflashing the bootloader and partition table each time, if they haven't changed.) + +The Partition Table +------------------- + +Once you've compiled your project, the "build" directory will contain a binary file with a name like "my_app.bin". This is an ESP32 image binary that can be loaded by the bootloader. + +A single ESP32's flash can contain multiple apps, as well as many different kinds of data (calibration data, filesystems, parameter storage, etc). For this reason a partition table is flashed to offset 0x4000 in the flash. + +Each entry in the partition table has a name (label), type (app, data, or something else), subtype and the offset in flash where the partition is loaded. + +The simplest way to use the partition table is to `make menuconfig` and choose one of the simple predefined partition tables: + +* "Single factory app, no OTA" +* "Factory app, two OTA definitions" + +In both cases the factory app is flashed at offset 0x10000. If you `make partition_table` then it will print a summary of the partition table. + +For more details about :doc:`partition tables ` and how to create custom variations, view the :doc:`documentation `. + diff --git a/docs/openocd.rst b/docs/openocd.rst index 57ee93db4..642e3067e 100644 --- a/docs/openocd.rst +++ b/docs/openocd.rst @@ -1,11 +1,14 @@ +Debugging +========= + OpenOCD setup for ESP32 ----------------------- -The ESP31 and ESP32 have two powerful Xtensa cores, allowing for a great deal of variety of program architectures. The FreeRTOS -OS that comes with ESP-IDF is capable multi-core pre-emptive multithreading, allowing for an intuitive way of writing software. +The ESP31 and ESP32 have two powerful Xtensa cores, allowing for a great variety of program architectures. The FreeRTOS +OS that comes with ESP-IDF is capable of multi-core pre-emptive multithreading, allowing for an intuitive way of writing software. The downside of the ease of programming is that debugging without the right tools is harder: figuring out a bug that is caused -by two threads, maybe even running simultaneously on two different CPU cures, can take a long time when all you have are printf +by two threads, maybe even running simultaneously on two different CPU cores, can take a long time when all you have are printf statements. A better and in many cases quicker way to debug such problems is by using a debugger, connected to the processors over a debug port. @@ -37,10 +40,8 @@ Installing OpenOCD The sources for the ESP32-enabled variant of OpenOCD are available from `Espressifs Github `_. To download the source, use the following commands:: - git clone https://github.com/espressif/openocd-esp32.git + git clone --recursive https://github.com/espressif/openocd-esp32.git cd openocd-esp32 - git submodule init - git submodule update For compilation of OpenOCD, please refer to the README, README.OSX and README.Windows file in the openocd-esp32 directory. You can skip the ``make install`` step if you want. @@ -84,7 +85,7 @@ Connecting a debugger to OpenOCD OpenOCD should now be ready to accept gdb connections. If you have compiled the ESP32 toolchain using Crosstool-NG, or if you have downloaded a precompiled toolchain from the Espressif website, you should already have xtensa-esp32-elf-gdb, a version of gdb that can be used for this. First, make sure the project you want to debug is compiled and flashed -into the ESP32s SPI flash. Then, in a different console than OpenOCD is running in, invoke gdb. For example, for the +into the ESP32's SPI flash. Then, in a different console than OpenOCD is running in, invoke gdb. For example, for the template app, you would do this like such:: cd esp-idf-template diff --git a/docs/partition-tables.rst b/docs/partition-tables.rst index e0a39126b..c9709029d 100644 --- a/docs/partition-tables.rst +++ b/docs/partition-tables.rst @@ -1,8 +1,13 @@ Partition Tables ----------------- +================ + +Overview +-------- A single ESP32's flash can contain multiple apps, as well as many different kinds of data (calibration data, filesystems, parameter storage, etc). For this reason a partition table is flashed to offset 0x4000 in the flash. +Partition table length is 0xC00 bytes (maximum 95 partition table entries). If the partition table is signed due to `secure boot`, the signature is appended after the table data. + Each entry in the partition table has a name (label), type (app, data, or something else), subtype and the offset in flash where the partition is loaded. The simplest way to use the partition table is to `make menuconfig` and choose one of the simple predefined partition tables: @@ -12,40 +17,30 @@ The simplest way to use the partition table is to `make menuconfig` and choose o In both cases the factory app is flashed at offset 0x10000. If you `make partition_table` then it will print a summary of the partition table. -Known Issues ------------- - -The below design document outlines the goals for the partition table system. At the moment, only some features are used: - -- data partition types "rf" & "wifi" are unused and can be entirely omitted to save space. -- NVS (non-volatile-storage) uses a hardcoded 12KB (0x3000 byte) region at offset 0x6000. - -Once a full user API is in place for partition access, these limitations will be resolved and you'll be able to use the partition mechanism fully for storing data in flash. - Built-in Partition Tables ------------------------- Here is the summary printed for the "Single factory app, no OTA" configuration:: # Espressif ESP32 Partition Table - # Name, Type, SubType, Offset, Size - factory, app, factory, 0x10000, 1M - rfdata, data, rf, 0x110000, 256K - wifidata,data, wifi, 0x150000, 256K + # Name, Type, SubType, Offset, Size + nvs, data, nvs, 0x9000, 0x6000 + phy_init, data, phy, 0xf000, 0x1000 + factory, app, factory, 0x10000, 1M * At a 0x10000 (64KB) offset in the flash is the app labelled "factory". The bootloader will run this app by default. -* There are also two data regions defined in the partition table for storing RF & Wifi calibration data. +* There are also two data regions defined in the partition table for storing NVS library partition and PHY init data. Here is the summary printed for the "Factory app, two OTA definitions" configuration:: # Espressif ESP32 Partition Table - # Name, Type, SubType, Offset, Size - factory, app, factory, 0x10000, 1M - ota_0, app, ota_0, 0x110000, 1M - ota_1, app, ota_1, 0x210000, 1M - rfdata, data, rf, 0x310000, 256K - wifidata,data, wifi, 0x350000, 256K - otadata, data, ota, 0x390000, 256K + # Name, Type, SubType, Offset, Size + nvs, data, nvs, 0x9000, 0x4000 + otadata, data, ota, 0xd000, 0x2000 + phy_init, data, phy, 0xf000, 0x1000 + factory, 0, 0, 0x10000, 1M + ota_0, 0, ota_0, , 1M + ota_1, 0, ota_1, , 1M * There are now three app partition definitions. * The type of all three are set as "app", but the subtype varies between the factory app at 0x10000 and the next two "OTA" apps. @@ -60,13 +55,13 @@ If you choose "Custom partition table CSV" in menuconfig then you can also enter The CSV format is the same format as printed in the summaries shown above. However, not all fields are required in the CSV. For example, here is the "input" CSV for the OTA partition table:: # Name, Type, SubType, Offset, Size + nvs, data, nvs, 0x9000, 0x4000 + otadata, data, ota, 0xd000, 0x2000 + phy_init, data, phy, 0xf000, 0x1000 factory, app, factory, 0x10000, 1M ota_0, app, ota_0, , 1M ota_1, app, ota_1, , 1M - rfdata, data, rf, , 256K - wifidata, data, wifi, , 256K - otadata, data, ota, , 256K - + * Whitespace between fields is ignored, and so is any line starting with # (comments). * Each non-comment line in the CSV file is a partition definition. * Only the offset for the first partition is supplied. The gen_esp32part.py tool fills in each remaining offset to start after the preceding partition. @@ -88,7 +83,7 @@ Subtype When type is "app", the subtype field can be specified as factory (0), ota_0 (0x10) ... ota_15 (0x1F) and test (0x20). Or it can be any number 0-255 (0x00-0xFF). The bootloader will execute the factory app unless there it sees a partition of type data/ota, in which case it reads this partition to determine which OTA image to boot -When type is "data", the subtype field can be specified as ota (0), rf (1), wifi (2). Or it can be a number 0x00-0xFF. The bootloader ignores all data subtypes except for ota. Other "data" subtypes are reserved for Espressif use. To create custom data partition subtypes then use a custom type value, and choose any subtype 0x00-0xFF. +When type is "data", the subtype field can be specified as ota (0), phy (1), nvs (2). Or it can be a number 0x00-0xFF. The bootloader ignores all data subtypes except for ota. Subtypes 0-0x7f are reserved for Espressif use. To create custom data partition subtypes use "data" type, and choose any unused subtype in 0x80-0xFF range. If you are porting a filesystem to the ESP-IDF, consider opening a PR to add the new subtype to esp_partition.h file. Offset & Size ~~~~~~~~~~~~~ @@ -99,6 +94,8 @@ App partitions have to be at offsets aligned to 0x10000 (64K). If you leave the Sizes and offsets can be specified as decimal numbers, hex numbers with the prefix 0x, or size multipliers M or K (1024 and 1024*1024 bytes). +NVS data partition has to be at least 0x3000 bytes long, and OTA data parition has to be 0x2000 bytes long. If you are using NVS in your application to store a lot of data, consider using a custom partition table with larger NVS partition. + Generating Binary Partition Table --------------------------------- @@ -127,3 +124,6 @@ Flashing the partition table * ``make flash``: Will flash everything including the partition table. A manual flashing command is also printed as part of ``make partition_table``. + + +.. _secure boot: security/secure-boot.rst diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..debed2867 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,6 @@ +# This is a list of python packages used to generate documentation. This file is used with pip: +# pip install requirements.txt +# +sphinx +sphinx-rtd-theme +breathe diff --git a/docs/security/secure-boot.rst b/docs/security/secure-boot.rst new file mode 100644 index 000000000..113d25090 --- /dev/null +++ b/docs/security/secure-boot.rst @@ -0,0 +1,179 @@ +Secure Boot +=========== + +Secure Boot is a feature for ensuring only your code can run on the chip. Data loaded from flash is verified on each reset. + +Secure Boot is separate from the Encrypted Flash feature, and you can use secure boot without encrypting the flash contents. However we recommend using both features together for a secure environment. + +**IMPORTANT: As Encrypted Flash feature and related security features are not yet released, Secure Boot should not be considered sufficient for a secure device and we strongly recommend not enabling the one-time secure bootloader feature until it is mature.** + +Background +---------- + +- Most data is stored in flash. Flash access does not need to be protected from physical access in order for secure boot to function, because critical data is stored (non-software-accessible) in Efuses internal to the chip. + +- Efuses are used to store the secure bootloader key (in efuse block 2), and also a single Efuse bit (ABS_DONE_0) is burned (written to 1) to permanently enable secure boot on the chip. For more details about efuse, see the (forthcoming) chapter in the Technical Reference Manual. + +- To understand the secure boot process, first familiarise yourself with the standard :doc:`ESP-IDF boot process <../general-notes>`. + +- Both stages of the boot process (initial software bootloader load, and subsequent partition & app loading) are verified by the secure boot process, in a "chain of trust" relationship. + +Secure Boot Process Overview +---------------------------- + +This is a high level overview of the secure boot process. Step by step instructions are supplied under `How To Enable Secure Boot`. Further in-depth details are supplied under `Technical Details`: + +1. The options to enable secure boot are provided in the ``make menuconfig`` hierarchy, under "Secure Boot Configuration". + +2. Secure Boot Configuration includes "Secure boot signing key", which is a file path. This file is a ECDSA public/private key pair in a PEM format file. + +3. The software bootloader image is built by esp-idf with secure boot support enabled and the public key (signature verification) portion of the secure boot signing key compiled in. This software bootloader image is flashed at offset 0x1000. + +4. On first boot, the software bootloader follows the following process to enable secure boot: + + - Hardware secure boot support generates a device secure bootloader key (generated via hardware RNG, then stored read/write protected in efuse), and a secure digest. The digest is derived from the key, an IV, and the bootloader image contents. + - The secure digest is flashed at offset 0x0 in the flash. + - Depending on Secure Boot Configuration, efuses are burned to disable JTAG and the ROM BASIC interpreter (it is strongly recommended these options are turned on.) + - Bootloader permanently enables secure boot by burning the ABS_DONE_0 efuse. The software bootloader then becomes protected (the chip will only boot a bootloader image if the digest matches.) + +5. On subsequent boots the ROM bootloader sees that the secure boot efuse is burned, reads the saved digest at 0x0 and uses hardware secure boot support to compare it with a newly calculated digest. If the digest does not match then booting will not continue. The digest and comparison are performed entirely by hardware, and the calculated digest is not readable by software. For technical details see `Hardware Secure Boot Support`. + +6. When running in secure boot mode, the software bootloader uses the secure boot signing key (the public key of which is embedded in the bootloader itself, and therefore validated as part of the bootloader) to verify the signature appended to all subsequent partition tables and app images before they are booted. + +Keys +---- + +The following keys are used by the secure boot process: + +- "secure bootloader key" is a 256-bit AES key that is stored in Efuse block 2. The bootloader can generate this key itself from the internal hardware random number generator, the user does not need to supply it (it is optionally possible to supply this key, see `Re-Flashable Software Bootloader`). The Efuse holding this key is read & write protected (preventing software access) before secure boot is enabled. + +- "secure boot signing key" is a standard ECDSA public/private key pair (see `Image Signing Algorithm`) in PEM format. + + - The public key from this key pair (for signature verificaton but not signature creation) is compiled into the software bootloader and used to verify the second stage of booting (partition table, app image) before booting continues. The public key can be freely distributed, it does not need to be kept secret. + + - The private key from this key pair *must be securely kept private*, as anyone who has this key can authenticate to any bootloader that is configured with secure boot and the matching public key. + + +How To Enable Secure Boot +------------------------- + +1. Run ``make menuconfig``, navigate to "Secure Boot Configuration" and select the option "One-time Flash". (To understand the alternative "Reflashable" choice, see `Re-Flashable Software Bootloader`.) + +2. Select a name for the secure boot signing key. This option will appear after secure boot is enabled. The file can be anywhere on your system. A relative path will be evaluated from the project directory. The file does not need to exist yet. + +3. Set other menuconfig options (as desired). Pay particular attention to the "Bootloader Config" options, as you can only flash the bootloader once. Then exit menuconfig and save your configuration + +4. The first time you run ``make``, if the signing key is not found then an error message will be printed with a command to generate a signing key via ``espsecure.py generate_signing_key``. + + **IMPORTANT** A signing key generated this way will use the best random number source available to the OS and its Python installation (`/dev/urandom` on OSX/Linux and `CryptGenRandom()` on Windows). If this random number source is weak, then the private key will be weak. + + **IMPORTANT** For production environments, we recommend generating the keypair using openssl or another industry standard encryption program. See `Generating Secure Boot Signing Key` for more details. + +5. Run ``make bootloader`` to build a secure boot enabled bootloader. The output of `make` will include a prompt for a flashing command, using `esptool.py write_flash`. + +6. When you're ready to flash the bootloader, run the specified command (you have to enter it yourself, this step is not performed by make) and then wait for flashing to complete. **Remember this is a one time flash, you can't change the bootloader after this!**. + +7. Run `make flash` to build and flash the partition table and the just-built app image. The app image will be signed using the signing key you generated in step 4. + + *NOTE*: `make flash` doesn't flash the bootloader if secure boot is enabled. + +8. Reset the ESP32 and it will boot the software bootloader you flashed. The software bootloader will enable secure boot on the chip, and then it verifies the app image signature and boots the app. You should watch the serial console output from the ESP32 to verify that secure boot is enabled and no errors have occured due to the build configuration. + +*NOTE* Secure boot won't be enabled until after a valid partition table and app image have been flashed. This is to prevent accidents before the system is fully configured. + +9. On subsequent boots, the secure boot hardware will verify the software bootloader has not changed (using the secure bootloader key) and then the software bootloader will verify the signed partition table and app image (using the public key portion of the secure boot signing key). + +Re-Flashable Software Bootloader +-------------------------------- + +Configuration "Secure Boot: One-Time Flash" is the recommended configuration for production devices. In this mode, each device gets a unique key that is never stored outside the device. + +However, an alternative mode "Secure Boot: Reflashable" is also available. This mode allows you to supply a 256-bit key file that is used for the secure bootloader key. As you have the key file, you can generate new bootloader images and secure boot digests for them. + +In the esp-idf build process, this 256-bit key file is derived from the app signing key generated during the generate_signing_key step above. The private key's SHA-256 digest is used as the 256-bit secure bootloader key. This is a convenience so you only need to generate/protect a single private key. + +*NOTE*: Although it's possible, we strongly recommend not generating one secure boot key and flashing it to every device in a production environment. The "One-Time Flash" option is recommended for production environments. + +To enable a reflashable bootloader: + +1. In the ``make menuconfig`` step, select "Bootloader Config" -> "Secure Boot" -> "Reflashable". + +2. Follow the steps shown above to choose a signing key file, and generate the key file. + +3. Run ``make bootloader``. A 256-bit key file will be created, derived from the private key that is used for signing. Two sets of flashing steps will be printed - the first set of steps includes an ``espefuse.py burn_key`` command which is used to write the bootloader key to efuse. (Flashing this key is a one-time-only process.) The second set of steps can be used to reflash the bootloader with a pre-calculated digest (generated during the build process). + +4. Resume from `Step 6` of the one-time process, to flash the bootloader and enable secure boot. Watch the console log output closely to ensure there were no errors in the secure boot configuration. + +Generating Secure Boot Signing Key +---------------------------------- + +The build system will prompt you with a command to generate a new signing key via ``espsecure.py generate_signing_key``. This uses the python-ecdsa library, which in turn uses Python's os.urandom() as a random number source. + +The strength of the signing key is proportional to (a) the random number source of the system, and (b) the correctness of the algorithm used. For production devices, we recommend generating signing keys from a system with a quality entropy source, and using the best available EC key generation utilities. + +For example, to generate a signing key using the openssl command line: + +``` +openssl ecparam -name prime256v1 -genkey -noout -out my_secure_boot_signing_key.pem +``` + +Remember that the strength of the secure boot system depends on keeping the signing key private. + +Secure Boot Best Practices +-------------------------- + +* Generate the signing key on a system with a quality source of entropy. +* Keep the signing key private at all times. A leak of this key will compromise the secure boot system. +* Do not allow any third party to observe any aspects of the key generation or signing process using espsecure.py. Both processes are vulnerable to timing or other side-channel attacks. +* Enable all secure boot options in the Secure Boot Configuration. These include flash encryption, disabling of JTAG, disabling BASIC ROM interpeter, and disabling the UART bootloader encrypted flash access. + +Technical Details +----------------- + +The following sections contain low-level descriptions of various technical functions: + +Hardware Secure Boot Support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Secure Boot support hardware can perform three basic operations: + +1. Generate a random sequence of bytes from a hardware random number generator. + +2. Generate a digest from data (usually the bootloader image from flash) using a key stored in Efuse block 2. The key in Efuse can (& should) be read/write protected, which prevents software access. For full details of this algorithm see `Secure Bootloader Digest Algorithm`. The digest can only be read back by software if Efuse ABS_DONE_0 is *not* burned (ie still 0). + +3. Generate a digest from data (usually the bootloader image from flash) using the same algorithm as step 2 and compare it to a pre-calculated digest supplied in a buffer (usually read from flash offset 0x0). The hardware returns a true/false comparison without making the digest available to software. This function is available even when Efuse ABS_DONE_0 is burned. + +Secure Bootloader Digest Algorithm +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Starting with an "image" of binary data as input, this algorithm generates a digest as output. The digest is sometimes referred to as an "abstract" in hardware documentation. + +For a Python version of this algorithm, see the `espsecure.py` tool in the components/esptool_py directory. + +Items marked with (^) are to fulfill hardware restrictions, as opposed to cryptographic restrictions. + +1. Prefix the image with a 128 byte randomly generated IV. +2. If the image length is not modulo 128, pad the image to a 128 byte boundary with 0xFF. (^) +3. For each 16 byte plaintext block of the input image: + - Reverse the byte order of the plaintext input block (^) + - Apply AES256 in ECB mode to the plaintext block. + - Reverse the byte order of the ciphertext output block. (^) + - Append to the overall ciphertext output. +4. Byte-swap each 4 byte word of the ciphertext (^) +5. Calculate SHA-512 of the ciphertext. + +Output digest is 192 bytes of data: The 128 byte IV, followed by the 64 byte SHA-512 digest. + +Image Signing Algorithm +~~~~~~~~~~~~~~~~~~~~~~~ + +Deterministic ECDSA as specified by `RFC6979`. + +- Curve is NIST256p (openssl calls this curve "prime256v1", it is also sometimes called secp256r1). +- Hash function is SHA256. +- Key format used for storage is PEM. + - In the bootloader, the public key (for signature verification) is flashed as 64 raw bytes. +- Image signature is 68 bytes - a 4 byte version word (currently zero), followed by a 64 bytes of signature data. These 68 bytes are appended to an app image or partition table data. + + +.. _RFC6979: https://tools.ietf.org/html/rfc6979 diff --git a/docs/style-guide.rst b/docs/style-guide.rst new file mode 100644 index 000000000..9bf00f1f7 --- /dev/null +++ b/docs/style-guide.rst @@ -0,0 +1,186 @@ +Espressif IoT Development Framework Style Guide +=============================================== + + +About this guide +---------------- + +Purpose of this style guide is to encourage use of common coding practices within the ESP-IDF. + +Style guide is a set of rules which are aimed to help create readable, maintainable, and robust code. By writing code which looks the same way across the code base we help others read and comprehend the code. By using same conventions for spaces and newlines we reduce chances that future changes will produce huge unreadable diffs. By following common patterns for module structure and by using language features consistently we help others understand code behavior. + +We try to keep rules simple enough, which means that they can not cover all potential cases. In some cases one has to bend these simple rules to achieve readability, maintainability, or robustness. + +When doing modifications to third-party code used in ESP-IDF, follow the way that particular project is written. That will help propose useful changes for merging into upstream project. + +C code formatting +----------------- + +Indentation +^^^^^^^^^^^ + +Use 4 spaces for each indentation level. Don't use tabs for indentation. Configure the editor to emit 4 spaces each time you press tab key. + +Vertical space +^^^^^^^^^^^^^^ + +Place one empty line between functions. Don't begin or end a function with an empty line. +:: + + void function1() + { + do_one_thing(); + do_another_thing(); + // INCORRECT, don't place empty line here + } + // place empty line here + void function2() + { + // INCORRECT, don't use an empty line here + int var = 0; + while (var < SOME_CONSTANT) { + do_stuff(&var); + } + } + +Horizontal space +^^^^^^^^^^^^^^^^ + +Always add single space after conditional and loop keywords:: + + if (condition) { // correct + // ... + } + + switch (n) { // correct + case 0: + // ... + } + + for(int i = 0; i < CONST; ++i) { // INCORRECT + // ... + } + +Add single space around binary operators. No space is necessary for unary operators. It is okay to drop space around multiply and divide operators:: + + const int y = y0 + (x - x0) * (y1 - y0) / (x1 - x0); // correct + + const int y = y0 + (x - x0)*(y1 - y0)/(x1 - x0); // also okay + + int y_cur = -y; // correct + ++y_cur; + + const int y = y0+(x-x0)*(y1-y0)/(x1-x0); // INCORRECT + + +No space is necessary around ``.`` and ``->`` operators. + + +Sometimes adding horizontal space within a line can help make code more readable. For example, you can add space to align function arguments:: + + gpio_matrix_in(PIN_CAM_D6, I2S0I_DATA_IN14_IDX, false); + gpio_matrix_in(PIN_CAM_D7, I2S0I_DATA_IN15_IDX, false); + gpio_matrix_in(PIN_CAM_HREF, I2S0I_H_ENABLE_IDX, false); + gpio_matrix_in(PIN_CAM_PCLK, I2S0I_DATA_IN15_IDX, false); + +Note however that if someone goes to add new line with a longer identifier as first argument (e.g. ``PIN_CAM_VSYNC``), it will not fit. So other lines would have to be realigned, adding meaningless changes to the commit. + +Therefore, use horizontal alignment sparingly, especially if you expect new lines to be added to the list later. + +Never use TAB characters for horizontal alignment. + +Never add trailing whitespace at the end of the line. + + +Braces +^^^^^^ + +- Function definition should have a brace on a separate line:: + + // This is correct: + void function(int arg) + { + + } + + // NOT like this: + void function(int arg) { + + } + +- Within a function, place opening brace on the same line with conditional and loop statements:: + + if (condition) { + do_one(); + } else if (other_condition) { + do_two(); + } + + +Comments +^^^^^^^^ + +Use ``//`` for single line comments. For multi-line comments it is okay to use either ``//`` on each line or a ``/* */`` block. + +Although not directly related to formatting, here are a few notes about using comments effectively. + +- Don't use single comments to disable some functionality:: + + void init_something() + { + setup_dma(); + // load_resources(); // WHY is this thing commented, asks the reader? + start_timer(); + } + +- If some code is no longer required, remove it completely. If you need it you can always look it up in git history of this file. If you disable some call because of temporary reasons, with an intention to restore it in the future, add explanation on the adjacent line:: + + void init_something() + { + setup_dma(); + // TODO: we should load resources here, but loader is not fully integrated yet. + // load_resources(); + start_timer(); + } + +- Same goes for ``#if 0 ... #endif`` blocks. Remove code block completely if it is not used. Otherwise, add comment explaining why the block is disabled. Don't use ``#if 0 ... #endif`` or comments to store code snippets which you may need in the future. + +- Don't add trivial comments about authorship and change date. You can always look up who modified any given line using git. E.g. this comment adds clutter to the code without adding any useful information:: + + void init_something() + { + setup_dma(); + // XXX add 2016-09-01 + init_dma_list(); + fill_dma_item(0); + // end XXX add + start_timer(); + } + + +Formatting your code +^^^^^^^^^^^^^^^^^^^^ + +You can use ``astyle`` program to format your code according to the above recommendations. + +If you are writing a file from scratch, or doing a complete rewrite, feel free to re-format the entire file. If you are changing a small portion of file, don't re-format the code you didn't change. This will help others when they review your changes. + +To re-format a file, run:: + + tools/format.sh components/my_component/file.c + +Documenting code +---------------- + +Please see the guide here: :doc:`documenting-code`. + +Structure and naming +-------------------- + + + +Language features +----------------- + +To be written. + diff --git a/docs/windows-setup.rst b/docs/windows-setup.rst index baea1ac40..a425f5b3a 100644 --- a/docs/windows-setup.rst +++ b/docs/windows-setup.rst @@ -1,5 +1,8 @@ -Step 1: Toolchain for Windows: Quick Steps -================================== +Set up of Toolchain for Windows +******************************* + +Step 1: Quick Steps +=================== Windows doesn't have a built-in "make" environment, so as well as installing the toolchain you will need a GNU-compatible environment. We use the MSYS2_ environment to provide. You don't need to use this environment all the time (you can use Eclipse_ or some other front-end), but it runs behind the scenes. diff --git a/examples/01_hello_world/main/component.mk b/examples/01_hello_world/main/component.mk index 24356f23e..0b9d7585e 100644 --- a/examples/01_hello_world/main/component.mk +++ b/examples/01_hello_world/main/component.mk @@ -1,10 +1,5 @@ # -# Main Makefile. This is basically the same as a component makefile. -# -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the ESP-IDF documents if you need to do this. +# "main" pseudo-component makefile. # +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) -include $(IDF_PATH)/make/component_common.mk diff --git a/examples/01_hello_world/main/hello_world_main.c b/examples/01_hello_world/main/hello_world_main.c index ad2c0acbb..1ff190ace 100644 --- a/examples/01_hello_world/main/hello_world_main.c +++ b/examples/01_hello_world/main/hello_world_main.c @@ -27,6 +27,5 @@ void hello_task(void *pvParameter) void app_main() { nvs_flash_init(); - system_init(); xTaskCreate(&hello_task, "hello_task", 2048, NULL, 5, NULL); } diff --git a/examples/02_blink/main/blink.c b/examples/02_blink/main/blink.c index 6de0e1fa3..1e49e51b2 100644 --- a/examples/02_blink/main/blink.c +++ b/examples/02_blink/main/blink.c @@ -43,6 +43,5 @@ void blink_task(void *pvParameter) void app_main() { nvs_flash_init(); - system_init(); xTaskCreate(&blink_task, "blink_task", 512, NULL, 5, NULL); } diff --git a/examples/02_blink/main/component.mk b/examples/02_blink/main/component.mk index 24356f23e..a98f634ea 100644 --- a/examples/02_blink/main/component.mk +++ b/examples/02_blink/main/component.mk @@ -1,10 +1,4 @@ # -# Main Makefile. This is basically the same as a component makefile. +# "main" pseudo-component makefile. # -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the ESP-IDF documents if you need to do this. -# - -include $(IDF_PATH)/make/component_common.mk +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/03_http_request/main/component.mk b/examples/03_http_request/main/component.mk index 24356f23e..a98f634ea 100644 --- a/examples/03_http_request/main/component.mk +++ b/examples/03_http_request/main/component.mk @@ -1,10 +1,4 @@ # -# Main Makefile. This is basically the same as a component makefile. +# "main" pseudo-component makefile. # -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the ESP-IDF documents if you need to do this. -# - -include $(IDF_PATH)/make/component_common.mk +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/03_http_request/main/http_request_main.c b/examples/03_http_request/main/http_request_main.c index 32f75c0da..2c203f839 100644 --- a/examples/03_http_request/main/http_request_main.c +++ b/examples/03_http_request/main/http_request_main.c @@ -175,7 +175,6 @@ static void http_get_task(void *pvParameters) void app_main() { nvs_flash_init(); - system_init(); initialise_wifi(); xTaskCreate(&http_get_task, "http_get_task", 2048, NULL, 5, NULL); } diff --git a/examples/04_https_request/main/cert.c b/examples/04_https_request/main/cert.c deleted file mode 100644 index 7acc438ef..000000000 --- a/examples/04_https_request/main/cert.c +++ /dev/null @@ -1,44 +0,0 @@ -/* This is the CA certificate for the CA trust chain of - www.howsmyssl.com in PEM format, as dumped via: - - openssl s_client -showcerts -connect www.howsmyssl.com:443 -#include -#include - -/* - 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 - i:/O=Digital Signature Trust Co./CN=DST Root CA X3 - */ -const char *server_root_cert = "-----BEGIN CERTIFICATE-----\r\n" -"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\r\n" -"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\r\n" -"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\r\n" -"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\r\n" -"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\r\n" -"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\r\n" -"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\r\n" -"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\r\n" -"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\r\n" -"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\r\n" -"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\r\n" -"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\r\n" -"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\r\n" -"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\r\n" -"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\r\n" -"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\r\n" -"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\r\n" -"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\r\n" -"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\r\n" -"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\r\n" -"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\r\n" -"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\r\n" -"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\r\n" -"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\r\n" -"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\r\n" -"-----END CERTIFICATE-----\r\n"; - - diff --git a/examples/04_https_request/main/component.mk b/examples/04_https_request/main/component.mk index 24356f23e..818e2a182 100644 --- a/examples/04_https_request/main/component.mk +++ b/examples/04_https_request/main/component.mk @@ -1,10 +1,10 @@ # -# Main Makefile. This is basically the same as a component makefile. -# -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component_common.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the ESP-IDF documents if you need to do this. +# "main" pseudo-component makefile. # +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + +# embed files from the "certs" directory as binary data symbols +# in the app +COMPONENT_EMBED_TXTFILES := server_root_cert.pem + -include $(IDF_PATH)/make/component_common.mk diff --git a/examples/04_https_request/main/https_request_main.c b/examples/04_https_request/main/https_request_main.c index 0c8b2463f..1f7112bc8 100644 --- a/examples/04_https_request/main/https_request_main.c +++ b/examples/04_https_request/main/https_request_main.c @@ -22,6 +22,7 @@ * limitations under the License. */ #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" @@ -74,8 +75,18 @@ static const char *REQUEST = "GET " WEB_URL " HTTP/1.1\n" "User-Agent: esp-idf/1.0 esp32\n" "\n"; -/* Root cert for howsmyssl.com, found in cert.c */ -extern const char *server_root_cert; +/* Root cert for howsmyssl.com, taken from server_root_cert.pem + + The PEM file was extracted from the output of this command: + openssl s_client -showcerts -connect www.howsmyssl.com:443 -#include -#include -#include - -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "controller.h" - -#include "gatt_int.h" -#include "bt_trace.h" -#include "btm_api.h" -#include "bt_types.h" -#include "gattc_profile.h" -#include "esp_gatt_api.h" - -#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] -esp_gattc_if_t client_if; - -esp_bt_uuid_t bas_uuid = {LEN_UUID_16, {UUID_SERVCLASS_BATTERY}}; - -uint16_t get_uuid16(esp_bt_uuid_t* p_uuid) -{ - if(p_uuid->len == LEN_UUID_16) - { - return p_uuid->uu.uuid16; - } - else if(p_uuid->len == LEN_UUID_128) - { - UINT16 u16; - UINT8 *p = &p_uuid->uu.uuid128[LEN_UUID_128 - 4]; - STREAM_TO_UINT16(u16, p); - return u16; - } - else - { - return (UINT16)p_uuid->uu.uuid32; - } -} - -/*fill a GATT ID structure*/ -void bta_le_fill_16bits_gatt_id(UINT8 inst_id, UINT16 uuid, tBTA_GATT_ID* p_output) -{ - p_output->inst_id = inst_id; - p_output->uuid.len = LEN_UUID_16; - p_output->uuid.uu.uuid16 = uuid; -} - -/*fill a service ID structure with a 16 bits service UUID*/ -void bta_le_fill_16bits_srvc_id(bool is_pri, UINT8 inst_id, UINT16 srvc_uuid, esp_gatt_srvc_id_t* p_output) -{ - memset((void *)p_output, 0, sizeof(esp_gatt_srvc_id_t)); - p_output->is_primary = is_pri; - bta_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id); -} - -/*fill a char ID structure with a 16 bits char UUID*/ -void bta_le_fill_16bits_char_id(UINT8 inst_id, UINT16 char_uuid, esp_gatt_id_t* p_output) -{ - memset((void *)p_output, 0, sizeof(esp_gatt_id_t)); - bta_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output); -} - -/****************************************************************************** -** Function bas_gattc_callback -** -** Description battery service register callback function -*******************************************************************************/ -static void bas_gattc_callback(esp_gattc_evt_t event, esp_gattc_t* p_data) -{ - switch (event) - { - case ESP_GATTC_REG_EVT: - { - esp_gatt_status_t status = p_data->reg_oper.status; - client_if = p_data->reg_oper.client_if; - LOG_ERROR("BAS register completed: event=%d, status=%d, client_if=%d\n", - event, status, client_if); - - } - break; - - /*connect callback*/ - case ESP_GATTC_OPEN_EVT: - { - - LOG_ERROR("\n%s:device is connected "BT_BD_ADDR_STR", client_if=%d, status=%d, connect_id=%d\n", - __FUNCTION__, BT_BD_ADDR_HEX(p_data->open.remote_bda), p_data->open.client_if, - p_data->open.status, p_data->open.conn_id); - /*return whether the remote device is currently connected*/ - int is_connected = BTA_DmGetConnectionState(p_data->open.remote_bda); - LOG_ERROR("is_connected=%d\n",is_connected); - /*get the energy info of the controller*/ - - /*read battery level*/ - int conn_id = p_data->open.conn_id; - - /*discover service*/ - esp_ble_gattc_svc_search_req(conn_id, NULL); - - } - break; - - case ESP_GATTC_SEARCH_RES_EVT: - { - // tBTA_GATTC_SRVC_RES service_result; - LOG_ERROR("find the service,uuid=0x%x, is_primary=%d\n", - get_uuid16(&p_data->srvc_res.service_uuid.id.uuid), - p_data->srvc_res.service_uuid.is_primary); - } - break; - - case ESP_GATTC_SEARCH_CMPL_EVT: - { - LOG_ERROR("search service complete, conn_id=%d,status=%d\n", p_data->search_cmpl.conn_id, - p_data->search_cmpl.status); - - /*get first characteristic of battey service*/ - LOG_ERROR("get first characteristic of battery service\n"); - tBTA_GATT_STATUS status; - tBTA_GATT_SRVC_ID battery_srvc_id; - tBTA_GATTC_CHAR_ID out_char_id; - tGATT_CHAR_PROP out_char_prop; - bta_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_BATTERY, &battery_srvc_id); - status = esp_ble_gattc_get_first_char(p_data->search_cmpl.conn_id, &battery_srvc_id, NULL, - &out_char_id, &out_char_prop); - if(status == 0) - { - LOG_ERROR("the first char:srvc_id=0x%x,char_id=0x%x, property = %d\n", - get_uuid16(&out_char_id.srvc_id.id.uuid), get_uuid16(&out_char_id.char_id.uuid), - out_char_prop); - /*read battery level*/ - tBTA_GATTC_CHAR_ID battery_char_id; - bta_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_BATTERY, &battery_char_id.srvc_id); - bta_le_fill_16bits_char_id(0, GATT_UUID_BATTERY_LEVEL, &battery_char_id.char_id); - - esp_ble_gattc_read_char(p_data->search_cmpl.conn_id, &battery_char_id, - BTA_GATT_AUTH_REQ_NONE); - } - } - break; - - case ESP_GATTC_READ_CHAR_EVT: - { - - LOG_ERROR("\nread characteristic:connect_id=%d, status=%d\n", - p_data->read.conn_id, p_data->read.status); - LOG_ERROR("srvc_id=0x%x,char_id=0x%x,descr_type=0x%x\n", - get_uuid16(&p_data->read.srvc_id.id.uuid), - get_uuid16(&p_data->read.char_id.uuid), - get_uuid16(&p_data->read.descr_type.uuid)); - if(get_uuid16(&p_data->read.descr_type.uuid) != GATT_UUID_CHAR_AGG_FORMAT - && p_data->read.p_value->unformat.len > 0 - && p_data->read.p_value->unformat.p_value != NULL) - { - LOG_ERROR("read the value: len=%d, value=%d\n", p_data->read.p_value->unformat.len, - *(p_data->read.p_value->unformat.p_value)); - } - } - break; - - default: - LOG_ERROR("unsettled event: %d\n", event); - } - -} - -/*************************************************************** -** -** Function bac_register -** -** Description register app for battery service -** -****************************************************************/ -void bac_register(void) -{ - esp_ble_gattc_app_register(&bas_uuid, bas_gattc_callback); - -} - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_core/bt_app_core.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_core/bt_app_core.c deleted file mode 100644 index e67457098..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_core/bt_app_core.c +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2015-2016 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. - -#include -#include -#include - -#include "fixed_queue.h" -#include "gki.h" -#include "bt_defs.h" -#include "bt_trace.h" -#include "bt_types.h" -#include "allocator.h" - -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "bt_app_common.h" - -#include "controller.h" -//#include "prf_defs.h" -#include "hash_map.h" -#include "hash_functions.h" -#include "alarm.h" -//#include "app_button.h" -#if (BUT_PROFILE_CFG) -#include "button_pro.h" -#endif ///BUT_PROFILE_CFG -#include "thread.h" -#include "bt_app_common.h" -#include "dis_api.h" -#include "gattc_profile.h" -#include "smp_int.h" -#include "smp_api.h" - -static fixed_queue_t *bta_app_msg_queue; -fixed_queue_t *bt_app_general_alarm_queue; -hash_map_t *bt_app_general_alarm_hash_map; -pthread_mutex_t bt_app_general_alarm_lock; -static const size_t BT_APP_GENERAL_ALARM_HASH_MAP_SIZE = 10; - -xQueueHandle xBtaApp1Queue; -xTaskHandle xBtaApp1TaskHandle; - -#define BT_APP_TTYPE_MAIN_ENTRY (1) -static TIMER_LIST_ENT main_boot_tle; - -tSMP_CB smp_cmd; - -static void bt_app_context_switched(void *p_msg); -static void bt_app_send_msg(void *p_msg); -static void bt_app_task_handler(void *arg); -static void bta_app_msg_ready(fixed_queue_t *queue); -static void bt_app_task_shut_down(void); - -static void bt_app_general_alarm_ready(fixed_queue_t *queue); -static void bt_app_general_alarm_process(TIMER_LIST_ENT *p_tle); -void bt_app_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec); - -//extern void ble_test_conn(void); -//extern void bt_test_start_inquiry(void); -extern void ble_server_test(void); - -static void bt_app_task_handler(void *arg) -{ - BtTaskEvt_t e; - UINT8 button_msg[2] = {0x01,0x00}; - for (;;) { - if (pdTRUE == xQueueReceive(xBtaApp1Queue, &e, (portTickType)portMAX_DELAY)) { - if (e.sig == 0xff) { - fixed_queue_process(bta_app_msg_queue); - fixed_queue_process(bt_app_general_alarm_queue); - } -#if (BUT_PROFILE_CFG) - // else if(e.sig == BUTTON_PRESS_EVT){ - // LOG_ERROR("button_press_event come in,button_value=%x\n",e.par); - // button_msg[1] = e.par; - // button_msg_notify(2,button_msg); - - - //} -#endif ///BUT_PROFILE_CFG - - } - } -} - -static void bt_app_task_post(void) -{ - BtTaskEvt_t evt; - - evt.sig = 0xff; - evt.par = 0; - - if (xQueueSend(xBtaApp1Queue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { - ets_printf("btdm_post failed\n"); - } - -} - - -static void bta_app_msg_ready(fixed_queue_t *queue) { - BT_HDR *p_msg; - while (!fixed_queue_is_empty(queue)) { - p_msg = (BT_HDR *)fixed_queue_dequeue(queue); - LOG_ERROR("bta_app_msg_ready, evt: %d\n", p_msg->event); - switch (p_msg->event) { - case BT_EVT_APP_CONTEXT_SWITCH: - bt_app_context_switched(p_msg); - break; - default: - LOG_ERROR("unhandled BT_APP event (%d)\n", p_msg->event & BT_EVT_MASK); - break; - } - GKI_freebuf(p_msg); - } -} - -static void bt_app_context_switched(void *p_msg) -{ - tBTAPP_CONTEXT_SWITCH_CBACK *p = (tBTAPP_CONTEXT_SWITCH_CBACK *) p_msg; - - if (p->p_cb) - p->p_cb(p->event, p->p_param); -} - -static void bt_app_send_msg(void *p_msg) -{ - if (bta_app_msg_queue) { - fixed_queue_enqueue(bta_app_msg_queue, p_msg); - //ke_event_set(KE_EVENT_BT_APP_TASK); - bt_app_task_post(); - } -} - -bt_status_t bt_app_transfer_context (tBTAPP_CBACK *p_cback, UINT16 event, char* p_params, int param_len, tBTAPP_COPY_CBACK *p_copy_cback) -{ - tBTAPP_CONTEXT_SWITCH_CBACK *p_msg; - - LOG_ERROR("btapp_transfer_context evt %d, len %d", event, param_len); - - /* allocate and send message that will be executed in btif context */ - if ((p_msg = (tBTAPP_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTAPP_CONTEXT_SWITCH_CBACK) + param_len)) != NULL) - { - p_msg->hdr.event = BT_EVT_APP_CONTEXT_SWITCH; /* internal event */ - p_msg->p_cb = p_cback; - - p_msg->event = event; /* callback event */ - - /* check if caller has provided a copy callback to do the deep copy */ - if (p_copy_cback) - { - p_copy_cback(event, p_msg->p_param, p_params); - } - else if (p_params) - { - memcpy(p_msg->p_param, p_params, param_len); /* callback parameter data */ - } - - bt_app_send_msg(p_msg); - return BT_STATUS_SUCCESS; - } - else - { - /* let caller deal with a failed allocation */ - return BT_STATUS_NOMEM; - } -} - -void bt_app_task_start_up(void) -{ - bta_app_msg_queue = fixed_queue_new(SIZE_MAX); - if (bta_app_msg_queue == NULL) - goto error_exit; - //ke_event_callback_set(KE_EVENT_BT_APP_TASK, &bt_app_task_handler); - - xBtaApp1Queue = xQueueCreate(3, sizeof(BtTaskEvt_t)); - xTaskCreate(bt_app_task_handler, "BtaApp1T", 8192, NULL, configMAX_PRIORITIES - 3, xBtaApp1TaskHandle); - - fixed_queue_register_dequeue(bta_app_msg_queue, bta_app_msg_ready); - - bt_app_general_alarm_hash_map = hash_map_new(BT_APP_GENERAL_ALARM_HASH_MAP_SIZE, - hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL); - if (bt_app_general_alarm_hash_map == NULL) - goto error_exit; - - pthread_mutex_init(&bt_app_general_alarm_lock, NULL); - - bt_app_general_alarm_queue = fixed_queue_new(SIZE_MAX); - if (bt_app_general_alarm_queue == NULL) - goto error_exit; - fixed_queue_register_dequeue(bt_app_general_alarm_queue, bt_app_general_alarm_ready); - - memset(&main_boot_tle, 0, sizeof(TIMER_LIST_ENT)); - return; - -error_exit: - LOG_ERROR("%s Unable to allocate resources for bt_app\n", __func__); - bt_app_task_shut_down(); -} - -static void bt_app_task_shut_down(void) -{ - fixed_queue_unregister_dequeue(bta_app_msg_queue); - fixed_queue_free(bta_app_msg_queue, NULL); - bta_app_msg_queue = NULL; - - // todo: hash map, pthread_mutex... - fixed_queue_unregister_dequeue(bt_app_general_alarm_queue); - - vTaskDelete(xBtaApp1TaskHandle); - vQueueDelete(xBtaApp1Queue); -} - - -static void bt_app_dm_data_copy(uint16_t event, char *dst, char *src) -{ - tBTA_DM_SEC *dst_dm_sec = (tBTA_DM_SEC*)dst; - tBTA_DM_SEC *src_dm_sec = (tBTA_DM_SEC*)src; - - if (!src_dm_sec) - return; - - assert(dst_dm_sec); - memcpy(dst_dm_sec, src_dm_sec, sizeof(tBTA_DM_SEC)); - - if (event == BTA_DM_BLE_KEY_EVT) - { - dst_dm_sec->ble_key.p_key_value = osi_malloc(sizeof(tBTM_LE_KEY_VALUE)); - assert(src_dm_sec->ble_key.p_key_value); - assert(dst_dm_sec->ble_key.p_key_value); - memcpy(dst_dm_sec->ble_key.p_key_value, src_dm_sec->ble_key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); - } -} - -static void bt_app_dm_data_free(uint16_t event, tBTA_DM_SEC *dm_sec) -{ - if (event == BTA_DM_BLE_KEY_EVT) - osi_free(dm_sec->ble_key.p_key_value); -} - -static void bt_app_dm_upstreams_evt(UINT16 event, char *p_param) -{ - tBTA_DM_SEC *p_data = (tBTA_DM_SEC*)p_param; - switch (event) { - case BTA_DM_ENABLE_EVT: { - -// BTA_DmSetDeviceName("ijiazu"); - - - - - /*set connectable,discoverable, pairable and paired only modes of local device*/ - tBTA_DM_DISC disc_mode = BTA_DM_BLE_GENERAL_DISCOVERABLE; - tBTA_DM_CONN conn_mode = BTA_DM_BLE_CONNECTABLE; - //BTA_DmSetVisibility(disc_mode, conn_mode, (UINT8)BTA_DM_NON_PAIRABLE, (UINT8)BTA_DM_CONN_ALL); - -#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) - /* Enable local privacy */ - //BTA_DmBleConfigLocalPrivacy(BLE_LOCAL_PRIVACY_ENABLED); - do { - const controller_t *controller = controller_get_interface(); - char bdstr[18]; - bdaddr_to_string(controller->get_address(), bdstr, sizeof(bdstr)); - LOG_ERROR("BDA is: %s\n", bdstr); - } while (0); -#endif - } - break; - case BTA_DM_BLE_SEC_REQ_EVT: - - smp_cb.local_io_capability = 0x03; //no input no output - smp_cb.loc_oob_flag = 0x00; //oob data not present - smp_cb.loc_auth_req = 0x01; - smp_cb.loc_enc_size = 0x10; - smp_cb.local_i_key = 0x01; - smp_cb.local_r_key = 0x01; //1101 - - //memcpy(smp_cb.pairing_bda,p_data->ble_req.bd_addr,0x06); - - smp_sm_event(&smp_cb,SMP_PAIRING_REQ_EVT,NULL); - //smp_send_cmd(SMP_OPCODE_PAIRING_RSP,&smp_cb); - //smp_generate_srand_mrand_confirm(&smp_cb,NULL); - //smp_set_state(SMP_STATE_PAIR_REQ_RSP,SMP_BR_PAIRING_REQ_EVT); - //BTA_DmConfirm(p_data->ble_req.bd_addr,true); - break; - case BTA_DM_BLE_KEY_EVT: - if(p_data->ble_key.key_type == BTM_LE_KEY_PENC) - { - smp_set_state(SMP_STATE_IDLE); - } - break; - default: - break; - } - - bt_app_dm_data_free(event, p_data); -} - -static void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) -{ - LOG_ERROR("bte_dm_evt: %d\n", (uint16_t)event); - bt_app_transfer_context(bt_app_dm_upstreams_evt, (uint16_t)event, - (void *)p_data, sizeof(tBTA_DM_SEC), bt_app_dm_data_copy); -} - -void bt_app_init_ok(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param) -{ - BTA_EnableBluetooth(bte_dm_evt); - vTaskDelay(1000 / portTICK_PERIOD_MS); - bt_app_start_timer(&main_boot_tle, BT_APP_TTYPE_MAIN_ENTRY, 8); -} - -/* Alarm timer */ -static void bt_app_general_alarm_cb(void *data) { - assert(data != NULL); - TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data; - - fixed_queue_enqueue(bt_app_general_alarm_queue, p_tle); - //ke_event_set(KE_EVENT_BT_APP_TASK); - bt_app_task_post(); -} - -void bt_app_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) { - osi_alarm_t *alarm = NULL; - - assert(p_tle != NULL); - - // Get the alarm for the timer list entry. - pthread_mutex_lock(&bt_app_general_alarm_lock); - if (!hash_map_has_key(bt_app_general_alarm_hash_map, p_tle)) { - alarm = osi_alarm_new("bt_app", bt_app_general_alarm_cb, (void *)p_tle, 0. false); - hash_map_set(bt_app_general_alarm_hash_map, p_tle, alarm); - } - pthread_mutex_unlock(&bt_app_general_alarm_lock); - - pthread_mutex_lock(&bt_app_general_alarm_lock); - alarm = hash_map_get(bt_app_general_alarm_hash_map, p_tle); - pthread_mutex_unlock(&bt_app_general_alarm_lock); - if (alarm == NULL) { - LOG_ERROR("%s Unable to create alarm\n", __func__); - - return; - } - - osi_alarm_cancel(alarm); - - p_tle->event = type; - // NOTE: This value is in seconds but stored in a ticks field. - p_tle->ticks = timeout_sec; - p_tle->in_use = TRUE; - osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); -} - -void bt_app_stop_timer(TIMER_LIST_ENT *p_tle) -{ - assert(p_tle != NULL); - - if (p_tle->in_use == FALSE) - return; - p_tle->in_use = FALSE; - - // Get the alarm for the timer list entry. - osi_alarm_t *alarm = hash_map_get(bt_app_general_alarm_hash_map, p_tle); - if (alarm == NULL) { - LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); - return; - } - osi_alarm_cancel(alarm); -} - -static void bt_app_general_alarm_process(TIMER_LIST_ENT *p_tle) -{ - assert(p_tle != NULL); - LOG_ERROR("general_alarm_process\n"); - switch (p_tle->event) { - case BT_APP_TTYPE_MAIN_ENTRY: - LOG_ERROR("BT_APP main boot**********\n"); - - // ble_test_conn(); - // ble_server_test(); - - - // bt_test_start_inquiry(); - /*set connectable,discoverable, pairable and paired only modes of local device*/ - // tBTA_DM_DISC disc_mode = BTA_DM_BLE_GENERAL_DISCOVERABLE; - // tBTA_DM_CONN conn_mode = BTA_DM_BLE_CONNECTABLE; - // BTA_DmSetVisibility(disc_mode, conn_mode, (UINT8)BTA_DM_NON_PAIRABLE, (UINT8)BTA_DM_CONN_ALL); - - gatts_server_test(); - //gattc_client_test(); - break; - } - -} - -static void bt_app_general_alarm_ready(fixed_queue_t *queue) -{ - TIMER_LIST_ENT *p_tle; - - while (!fixed_queue_is_empty(queue)) { - p_tle = (TIMER_LIST_ENT *)fixed_queue_dequeue(queue); - bt_app_general_alarm_process(p_tle); - } -} - -void bt_app_core_start(void) { - bt_app_transfer_context(bt_app_init_ok, 0, NULL, 0, NULL); -} - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_md5.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_md5.c deleted file mode 100644 index d8ecda9b3..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_md5.c +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2015-2016 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. - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include -#include -#include -#include "gki.h" -#include "app_airsync_md5.h" - -const uint32_t X[4][2] = {{0, 1}, {1, 5}, {5, 3}, {0, 7}}; -const uint32_t S[4][4] = {{ 7, 12, 17, 22 },{ 5, 9 , 14, 20 },{ 4, 11, 16, 23 },{ 6, 10, 15, 21 }}; -uint32_t F( uint32_t X, uint32_t Y, uint32_t Z ) -{ - return ( X & Y ) | ( ~X & Z ); -} -uint32_t G( uint32_t X, uint32_t Y, uint32_t Z ) - { - return ( X & Z ) | ( Y & ~Z ); - } -uint32_t H( uint32_t X, uint32_t Y, uint32_t Z ) -{ - return X ^ Y ^ Z; -} -uint32_t I( uint32_t X, uint32_t Y, uint32_t Z ) -{ - return Y ^ ( X | ~Z ); -} - // rotates x left s bits. -uint32_t rotate_left( uint32_t x, uint32_t s ) -{ - return ( x << s ) | ( x >> ( 32 - s ) ); -} - - // Pre-processin -uint32_t count_padding_bits ( uint32_t length ) -{ -// uint32_t div = length * BITS / BLOCK_SIZE; - uint32_t mod = length * BITS % BLOCK_SIZE; - uint32_t c_bits; - if ( mod == 0 ) - { - c_bits = MOD_SIZE; - } - else - { - c_bits = ( MOD_SIZE + BLOCK_SIZE - mod ) % BLOCK_SIZE; - } - return c_bits / BITS; -} - -MD5String append_padding_bits ( char * argv ) -{ - uint32_t msg_length = strlen ( argv ); - uint32_t bit_length = count_padding_bits ( msg_length ); - uint64_t app_length = msg_length * BITS; - MD5String string; - string.str = (char *)GKI_getbuf(msg_length + bit_length + APP_SIZE / BITS); - strncpy ( string.str, argv, msg_length ); - memset ( string.str + msg_length, 0, bit_length ); - string.str [ msg_length ] = SINGLE_ONE_BIT; - memmove ( string.str + msg_length + bit_length, (char *)&app_length, sizeof( uint64_t ) ); - string.len = msg_length + bit_length + sizeof( uint64_t ); - return string; -} - -int32_t wechat_md5 (char *argv, uint8_t *md5_32) -{ - MD5String string; - uint32_t w[16]; - uint32_t chain[4]; - uint32_t state[4]; - - uint32_t ( *auxi[ 4 ])( uint32_t, uint32_t, uint32_t ) = { F, G, H, I }; - int sIdx; - int wIdx; - string = append_padding_bits ( argv ); - chain[0] = A; - chain[1] = B; - chain[2] = C; - chain[3] = D; - for (uint32_t j = 0; j < string.len; j += BLOCK_SIZE / BITS) - { - memmove ( (char *)w, string.str + j, BLOCK_SIZE / BITS ); - memmove ( state, chain, sizeof(chain) ); - for ( uint8_t roundIdx = 0; roundIdx < 4; roundIdx++ ) - { - wIdx = X[ roundIdx ][ 0 ]; - sIdx = 0; - for (uint8_t i = 0; i < 16; i++ ) - { - state[sIdx] = state [(sIdx + 1)%4] + rotate_left( state[sIdx] +(*auxi[ roundIdx])( state[(sIdx+1) % 4], - state[(sIdx+2) % 4], - state[(sIdx+3) % 4]) + w[ wIdx ] + (uint32_t)floor((1ULL << 32) * fabs(sin( roundIdx * 16 + i + 1 )) ), - S[ roundIdx ][ i % 4 ]); - sIdx = ( sIdx + 3 ) % 4; - wIdx = ( wIdx + X[ roundIdx ][ 1 ] ) & 0xF; - } - } - chain[ 0 ] += state[ 0 ]; - chain[ 1 ] += state[ 1 ]; - chain[ 2 ] += state[ 2 ]; - chain[ 3 ] += state[ 3 ]; - } - memmove ( md5_32 + 0, (char *)&chain[0], sizeof(uint32_t) ); - memmove ( md5_32 + 4, (char *)&chain[1], sizeof(uint32_t) ); - memmove ( md5_32 + 8, (char *)&chain[2], sizeof(uint32_t) ); - memmove ( md5_32 + 12, (char *)&chain[3], sizeof(uint32_t) ); - free(string.str); - string.str = NULL; - return EXIT_SUCCESS; - -} - - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_prf.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_prf.c deleted file mode 100644 index 893c71dbe..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/app_airsync_prf.c +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2015-2016 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. - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - -#include "app_airsync_prf.h" -#include "wx_airsync_prf.h" -#include "app_wechat_util.h" -#include "gki.h" -#include "mpbledemo2.h" - -/***************************************************************************** -* data handle -*****************************************************************************/ -data_info g_send_data; - -static data_info g_rcv_data; -data_handler *pDataHandler; - - -static void airsync_process_msgreceive_cb(UINT8 app_id, - UINT8 conn_id,uint8_t *pData, uint16_t length); - -///function for register all products -static void register_all_products(void) -{ - REGISTER(mpbledemo2); - // could register more products if defined -} - -void app_wechat_init(void) -{ - register_all_products(); - - data_handler_init(&m_mpbledemo2_handler,PRODUCT_TYPE_MPBLEDEMO2); - m_mpbledemo2_handler->m_data_init_func(); - m_mpbledemo2_handler->m_data_init_peripheral_func(); - - app_wechat_SetDatahandler(m_mpbledemo2_handler); -} - -int ble_wechat_indicate_data_chunk(void) -{ - uint16_t chunk_len = 0; - chunk_len = g_send_data.len - g_send_data.offset; - chunk_len = chunk_len > BLE_WECHAT_MAX_DATA_LEN?BLE_WECHAT_MAX_DATA_LEN:chunk_len; - - if(chunk_len == 0) - { - app_wechat_datahandler()->m_data_free_func(g_send_data.data,g_send_data.len); - g_send_data.data = NULL; - g_send_data.len = 0; - g_send_data.offset = 0; - return 0; - } - - g_send_data.offset += chunk_len; - return 1; -} - - - /******************************************************************************* -** -** Function airsync_msgreceive_cb -** -** Description the callback function after the airsync profile have been -** receive the data from the peer device -** parms appid:the appid have been register to the gatt database -** conn_id:the current connection index -** msg_val:the airsync value receive from peer device -** Returns NULL -** -*******************************************************************************/ -static void airsync_process_msgreceive_cb(UINT8 app_id, - UINT8 conn_id,uint8_t *pData, uint16_t length) -{ - int error_code; - int chunk_size = 0; - if(length <= BLE_WECHAT_MAX_DATA_LEN) - { - if(g_rcv_data.len == 0) - { - BpFixHead *fix_head = (BpFixHead *)pData; - g_rcv_data.len = ntohs(fix_head->nLength); - g_rcv_data.offset = 0; - g_rcv_data.data = (uint8_t *)GKI_getbuf(g_rcv_data.len); - } - - chunk_size = g_rcv_data.len - g_rcv_data.offset; - chunk_size = chunk_size < length ? chunk_size : length; - memcpy(g_rcv_data.data + g_rcv_data.offset, pData, chunk_size); - g_rcv_data.offset += chunk_size; - - if (g_rcv_data.len <= g_rcv_data.offset) - { - error_code = app_wechat_datahandler()->m_data_consume_func(g_rcv_data.data, g_rcv_data.len); - app_wechat_datahandler()->m_data_free_func(g_rcv_data.data,g_rcv_data.len); - wechat_error_chack(app_wechat_datahandler(), error_code); - g_rcv_data.len = 0; - g_rcv_data.offset = 0; - - app_wechat_datahandler()->m_data_main_process_func(); - } - - - } - - -} - - void app_wechat_SetDatahandler(data_handler* pHandler) -{ - pDataHandler = pHandler; -} - -bool ble_wechat_is_last_data_sent_out(void) -{ - return (g_send_data.len == 0 && g_send_data.offset == 0 ) || \ - (g_send_data.len != 0 && g_send_data.len == g_send_data.offset); -} - -//device sent data on the indicate characteristic -int ble_wechat_indicate_data(uint8_t *data, int len) -{ - if(data == NULL || len == 0) - { - return 0; - } - - if(!ble_wechat_is_last_data_sent_out()) - { - return 0; - } - - g_send_data.data = data; - g_send_data.len = len; - g_send_data.offset = 0; - - return (ble_wechat_indicate_data_chunk()); -} - -data_handler *app_wechat_datahandler(void) -{ - return pDataHandler; -} - - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb.c deleted file mode 100644 index 3a830b064..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb.c +++ /dev/null @@ -1,414 +0,0 @@ -// epb.c -// WeChat Embedded Proto Buffer -// -// Created by harlliu@tencent.com on 14-02-15. -// Copyright 2014 Tencent. All rights reserved. -// - -// Version : 1.0.2 - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include -#include "epb.h" - - -#define __LITTLE_ENDIAN__ 1 //Need Test - -typedef enum { - WIRETYPE_VARINT = 0, - WIRETYPE_FIXED64 = 1, - WIRETYPE_LENGTH_DELIMITED = 2, - WIRETYPE_FIXED32 = 5 -} WireType; - -#define CONTINUOUS_MASK 0x80 -#define WIRETYPE_MASK 0x07 - -static int epb_get_varint32_bits(const uint8_t *data, int len, uint32_t *value); - -inline static int sizeof_tag(uint16_t tag) -{ - return ((tag&0xff00) == 0) ? 1 : 2; //TODO:Tag more then two bytes -} - -static uint16_t epb_get_wire_type(uint16_t tag) { - uint16_t wire_type = tag & WIRETYPE_MASK; - if ((tag>>8) != 0) - wire_type = (tag>>8) & WIRETYPE_MASK; - - return wire_type; -} - -static int epb_get_value_length(const uint8_t *data, int len, uint32_t wire_type) -{ - int offset = 0; - switch(wire_type) { - case WIRETYPE_VARINT: - while ((data[offset++]&CONTINUOUS_MASK)!=0 && offset= len) - return -1; - - if (offset >= 5) - break; - - p_value |= ((uint32_t)data[offset]&0x7F) << (offset*7); - ++offset; - } - *value = p_value; - return offset; -} - -static uint32_t epb_get_fixed32_bits(const uint8_t *data, int len) -{ - if(len < 4) - return 0; - - uint32_t value = 0; -#ifdef __LITTLE_ENDIAN__ - memcpy(&value, data, sizeof(uint32_t)); -#else - value = (data[3]<<24)|(data[2]<<16)|(data[1]<<8)|data[0]; -#endif - return value; -} - -void epb_unpack_init(Epb *e, const uint8_t *buf, int len) -{ - e->unpack_buf = buf; - e->buf_len = len; -} - -bool epb_has_tag(Epb *e, uint16_t tag) -{ - int offset = epb_get_tag_value_offset(e->unpack_buf, e->buf_len, tag); - if (offset < 0) - return false; - else - return true; -} - -uint32_t epb_get_uint32(Epb *e, uint16_t tag) -{ - int offset = epb_get_tag_value_offset(e->unpack_buf, e->buf_len, tag); - if (offset < 0) - return 0; - - uint32_t value = 0; - epb_get_varint32_bits(e->unpack_buf+offset, e->buf_len-offset, &value); - return value; -} - -int32_t epb_get_int32(Epb *e, uint16_t tag) -{ - return epb_get_uint32(e, tag); -} - -int32_t epb_get_sint32(Epb *e, uint16_t tag) -{ - uint32_t value = epb_get_uint32(e, tag); - if (value&1) - return -(value>>1) - 1; - else - return value>>1; -} - -bool epb_get_bool(Epb *e, uint16_t tag) -{ - return epb_get_uint32(e, tag); -} - -int epb_get_enum(Epb *e, uint16_t tag) -{ - return epb_get_uint32(e, tag); -} - -const uint8_t *epb_get_bytes(Epb *e, uint16_t tag, int *len) -{ - int offset = epb_get_tag_value_offset(e->unpack_buf, e->buf_len, tag); - if (offset < 0) - return NULL; - - uint32_t l; - offset += epb_get_varint32_bits(e->unpack_buf+offset, e->buf_len-offset, &l); - *len = (int)l; - - return e->unpack_buf+offset; -} - -const char *epb_get_string(Epb *e, uint16_t tag, int *len) -{ - return (char *)epb_get_bytes(e, tag, len); -} - -const Message *epb_get_message(Epb *e, uint16_t tag, int *len) -{ - return (Message *)epb_get_bytes(e, tag, len); -} - -uint32_t epb_get_fixed32(Epb *e, uint16_t tag) -{ - int offset = epb_get_tag_value_offset(e->unpack_buf, e->buf_len, tag); - if (offset < 0) - return 0; - - return epb_get_fixed32_bits(e->unpack_buf+offset, e->buf_len-offset); -} - -int32_t epb_get_sfixed32(Epb *e, uint16_t tag) -{ - return epb_get_fixed32(e, tag); -} - -float epb_get_float(Epb *e, uint16_t tag) -{ - uint32_t bits = epb_get_fixed32(e, tag); - return *(float *)&bits; -} - -/* - epb pack functions -*/ - -inline static int epb_pack_buf_remain(Epb *e) -{ - return e->buf_len - e->buf_offset; -} - -static int epb_pack_tag(Epb *e, uint16_t tag) -{ - int tag_len = sizeof_tag(tag); - if (epb_pack_buf_remain(e) >= tag_len) { - uint8_t *buf = e->pack_buf + e->buf_offset; - if (tag_len == 2) //TODO - *(buf++) = 0xff&(tag>>8); - *buf = 0xff&tag; - e->buf_offset += tag_len; - return tag_len; - } - return -1; -} - -static int epb_pack_varint32_bits(Epb *e, uint32_t value) -{ - uint8_t buf[5] = {0}; - int i = 0; - do { - buf[i] = value&0x7f; - if (i-1 >= 0) - buf[i-1] |= 0x80; - value = value >> 7; - ++i; - } while (value!=0 && i<5); - if (epb_pack_buf_remain(e) >= i) { - memcpy(e->pack_buf+e->buf_offset, buf, i); - e->buf_offset += i; - return i; - } - return -1; -} - -void epb_pack_init(Epb *e, uint8_t *buf, int len) -{ - e->pack_buf = buf; - e->buf_len = len; - e->buf_offset = 0; -} - -int epb_get_packed_size(Epb *e) -{ - return e->buf_offset; -} - -int epb_set_uint32(Epb *e, uint16_t tag, uint32_t value) -{ - int len = 0; - int ret = epb_pack_tag(e, tag); - if (ret < 0) return ret; - len += ret; - - ret = epb_pack_varint32_bits(e, value); - if (ret < 0) return ret; - len += ret; - - return len; -} - -int epb_set_int32(Epb *e, uint16_t tag, int32_t value) -{ - return epb_set_uint32(e, tag, value); -} - -int epb_set_sint32(Epb *e, uint16_t tag, int32_t value) -{ - uint32_t v = (value << 1) ^ (value >> 31); - return epb_set_uint32(e, tag, v); -} - -int epb_set_bool(Epb *e, uint16_t tag, bool value) -{ - return epb_set_uint32(e, tag, value); -} - -int epb_set_enum(Epb *e, uint16_t tag, int value) -{ - return epb_set_uint32(e, tag, value); -} - -static int epb_set_fixed32_bits(Epb *e, uint32_t value) -{ - if (epb_pack_buf_remain(e) >= 4) { -#ifdef __LITTLE_ENDIAN__ - memcpy(e->pack_buf+e->buf_offset, &value, 4); -#else - uint8_t *data = (uint8_t *)&value; - for (int i=0; i<4; i++) { - *(e->pack_buf+e->buf_offset+i) = data[4-i]; - } -#endif - e->buf_offset += 4; - return 4; - } - return -1; -} - -static int epb_pack_length_delimited(Epb *e, const uint8_t *data, int len) -{ - if (epb_pack_buf_remain(e) >= len) { - memcpy(e->pack_buf + e->buf_offset, data, len); - e->buf_offset += len; - return len; - } - return -1; -} - -int epb_set_bytes(Epb *e, uint16_t tag, const uint8_t *data, int length) -{ - int len = 0; - int ret = epb_pack_tag(e, tag); - if (ret < 0) return ret; - len += ret; - - ret = epb_pack_varint32_bits(e, length); - if (ret < 0) return ret; - len += ret; - - ret = epb_pack_length_delimited(e, data, length); - if (ret < 0) return ret; - len += ret; - - return len; -} - -int epb_set_string(Epb *e, uint16_t tag, const char *data, int len) -{ - return epb_set_bytes(e, tag, (const uint8_t *)data, len); -} - -int epb_set_message(Epb *e, uint16_t tag, const Message *data, int len) -{ - return epb_set_bytes(e, tag, data, len); -} - -int epb_set_fixed32(Epb *e, uint16_t tag, uint32_t value) -{ - int len = 0; - int ret = epb_pack_tag(e, tag); - if (ret < 0) return ret; - len += ret; - - ret = epb_set_fixed32_bits(e, value); - if (ret < 0) return ret; - len += ret; - - return len; -} - -int epb_set_sfixed32(Epb *e, uint16_t tag, int32_t value) -{ - return epb_set_fixed32(e, tag, value); -} - -int epb_set_float(Epb *e, uint16_t tag, float value) -{ - uint32_t v = *(uint32_t *)&value; - return epb_set_fixed32(e, tag, v); -} - -int epb_varint32_pack_size(uint16_t tag, uint32_t value, bool is_signed) -{ - if (is_signed) - value = (value << 1) ^ (value >> 31); - - int i = 0; - do { - value = value >> 7; - ++i; - } while (value!=0 && i<5); - - return sizeof_tag(tag) + i; -} - -int epb_fixed32_pack_size(uint16_t tag) -{ - return sizeof_tag(tag) + 4; -} - -int epb_length_delimited_pack_size(uint16_t tag, int len) -{ - return epb_varint32_pack_size(tag, len, false) + len; -} - - -#endif ///WX_AIRSYNC_CFG \ No newline at end of file diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb_mmbp.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb_mmbp.c deleted file mode 100644 index 48f9f7b93..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/epb_mmbp.c +++ /dev/null @@ -1,565 +0,0 @@ -// epb_MmBp.c -// WeChat Embedded Proto Buffer -// -// Generated by harlliu@tencent.com on 14-11-26. -// Copyright 2014 Tencent. All rights reserved. -// - -// Version : 1.0.4 - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include -#include -#include -#include "epb_MmBp.h" -#include "gki.h" - -#define TAG_BaseResponse_ErrCode 0x08 -#define TAG_BaseResponse_ErrMsg 0x12 - -#define TAG_AuthRequest_BaseRequest 0x0a -#define TAG_AuthRequest_Md5DeviceTypeAndDeviceId 0x12 -#define TAG_AuthRequest_ProtoVersion 0x18 -#define TAG_AuthRequest_AuthProto 0x20 -#define TAG_AuthRequest_AuthMethod 0x28 -#define TAG_AuthRequest_AesSign 0x32 -#define TAG_AuthRequest_MacAddress 0x3a -#define TAG_AuthRequest_TimeZone 0x52 -#define TAG_AuthRequest_Language 0x5a -#define TAG_AuthRequest_DeviceName 0x62 - -#define TAG_AuthResponse_BaseResponse 0x0a -#define TAG_AuthResponse_AesSessionKey 0x12 - -#define TAG_InitRequest_BaseRequest 0x0a -#define TAG_InitRequest_RespFieldFilter 0x12 -#define TAG_InitRequest_Challenge 0x1a - -#define TAG_InitResponse_BaseResponse 0x0a -#define TAG_InitResponse_UserIdHigh 0x10 -#define TAG_InitResponse_UserIdLow 0x18 -#define TAG_InitResponse_ChalleangeAnswer 0x20 -#define TAG_InitResponse_InitScence 0x28 -#define TAG_InitResponse_AutoSyncMaxDurationSecond 0x30 -#define TAG_InitResponse_UserNickName 0x5a -#define TAG_InitResponse_PlatformType 0x60 -#define TAG_InitResponse_Model 0x6a -#define TAG_InitResponse_Os 0x72 -#define TAG_InitResponse_Time 0x78 -#define TAG_InitResponse_TimeZone 0x8001 -#define TAG_InitResponse_TimeString 0x8a01 - -#define TAG_SendDataRequest_BaseRequest 0x0a -#define TAG_SendDataRequest_Data 0x12 -#define TAG_SendDataRequest_Type 0x18 - -#define TAG_SendDataResponse_BaseResponse 0x0a -#define TAG_SendDataResponse_Data 0x12 - -#define TAG_RecvDataPush_BasePush 0x0a -#define TAG_RecvDataPush_Data 0x12 -#define TAG_RecvDataPush_Type 0x18 - -#define TAG_SwitchViewPush_BasePush 0x0a -#define TAG_SwitchViewPush_SwitchViewOp 0x10 -#define TAG_SwitchViewPush_ViewId 0x18 - -#define TAG_SwitchBackgroudPush_BasePush 0x0a -#define TAG_SwitchBackgroudPush_SwitchBackgroundOp 0x10 - - -int epb_base_request_pack_size(BaseRequest *request) -{ - int pack_size = 0; - - return pack_size; -} - -int epb_pack_base_request(BaseRequest *request, uint8_t *buf, int buf_len) -{ - Epb epb; - epb_pack_init(&epb, buf, buf_len); - - return epb_get_packed_size(&epb); -} - -BaseResponse *epb_unpack_base_response(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - if (!epb_has_tag(&epb, TAG_BaseResponse_ErrCode)) { - return NULL; - } - - BaseResponse *response = (BaseResponse *)GKI_getbuf(sizeof(BaseResponse)); - memset(response, 0, sizeof(BaseResponse)); - response->err_code = epb_get_int32(&epb, TAG_BaseResponse_ErrCode); - if (epb_has_tag(&epb, TAG_BaseResponse_ErrMsg)) { - response->err_msg.str = epb_get_string(&epb, TAG_BaseResponse_ErrMsg, &response->err_msg.len); - response->has_err_msg = true; - } - - return response; -} - -void epb_unpack_base_response_free(BaseResponse *response) -{ - GKI_freebuf(response); -} - -BasePush *epb_unpack_base_push(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - BasePush *push = (BasePush *)GKI_getbuf(sizeof(BasePush)); - memset(push, 0, sizeof(BasePush)); - - return push; -} - -void epb_unpack_base_push_free(BasePush *push) -{ - GKI_freebuf(push); -} - -int epb_auth_request_pack_size(AuthRequest *request) -{ - int pack_size = 0; - int len = 0; - - len = epb_base_request_pack_size(request->base_request); - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_BaseRequest, len); - if (request->has_md5_device_type_and_device_id) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_Md5DeviceTypeAndDeviceId, request->md5_device_type_and_device_id.len); - } - pack_size += epb_varint32_pack_size(TAG_AuthRequest_ProtoVersion, request->proto_version, false); - pack_size += epb_varint32_pack_size(TAG_AuthRequest_AuthProto, request->auth_proto, false); - pack_size += epb_varint32_pack_size(TAG_AuthRequest_AuthMethod, request->auth_method, false); - if (request->has_aes_sign) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_AesSign, request->aes_sign.len); - } - if (request->has_mac_address) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_MacAddress, request->mac_address.len); - } - if (request->has_time_zone) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_TimeZone, request->time_zone.len); - } - if (request->has_language) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_Language, request->language.len); - } - if (request->has_device_name) { - pack_size += epb_length_delimited_pack_size(TAG_AuthRequest_DeviceName, request->device_name.len); - } - - return pack_size; -} - -int epb_pack_auth_request(AuthRequest *request, uint8_t *buf, int buf_len) -{ - Epb epb; - epb_pack_init(&epb, buf, buf_len); - - int ret; - int tmp_len; - uint8_t *tmp; - - tmp_len = epb_base_request_pack_size(request->base_request); - tmp = (uint8_t *)GKI_getbuf(tmp_len); - ret = epb_pack_base_request(request->base_request, tmp, tmp_len); - if (ret < 0) { - GKI_freebuf(tmp); - return ret; - } - ret = epb_set_message(&epb, TAG_AuthRequest_BaseRequest, tmp, tmp_len); - GKI_freebuf(tmp); - if (ret < 0) return ret; - if (request->has_md5_device_type_and_device_id) { - ret = epb_set_bytes(&epb, TAG_AuthRequest_Md5DeviceTypeAndDeviceId, request->md5_device_type_and_device_id.data, request->md5_device_type_and_device_id.len); - if (ret < 0) return ret; - } - ret = epb_set_int32(&epb, TAG_AuthRequest_ProtoVersion, request->proto_version); - if (ret < 0) return ret; - ret = epb_set_int32(&epb, TAG_AuthRequest_AuthProto, request->auth_proto); - if (ret < 0) return ret; - ret = epb_set_enum(&epb, TAG_AuthRequest_AuthMethod, request->auth_method); - if (ret < 0) return ret; - if (request->has_aes_sign) { - ret = epb_set_bytes(&epb, TAG_AuthRequest_AesSign, request->aes_sign.data, request->aes_sign.len); - if (ret < 0) return ret; - } - if (request->has_mac_address) { - ret = epb_set_bytes(&epb, TAG_AuthRequest_MacAddress, request->mac_address.data, request->mac_address.len); - if (ret < 0) return ret; - } - if (request->has_time_zone) { - ret = epb_set_string(&epb, TAG_AuthRequest_TimeZone, request->time_zone.str, request->time_zone.len); - if (ret < 0) return ret; - } - if (request->has_language) { - ret = epb_set_string(&epb, TAG_AuthRequest_Language, request->language.str, request->language.len); - if (ret < 0) return ret; - } - if (request->has_device_name) { - ret = epb_set_string(&epb, TAG_AuthRequest_DeviceName, request->device_name.str, request->device_name.len); - if (ret < 0) return ret; - } - - return epb_get_packed_size(&epb); -} - -AuthResponse *epb_unpack_auth_response(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_AuthResponse_BaseResponse)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_AuthResponse_AesSessionKey)) { - return NULL; - } - - AuthResponse *response = (AuthResponse *)GKI_getbuf(sizeof(AuthResponse)); - memset(response, 0, sizeof(AuthResponse)); - tmp = epb_get_message(&epb, TAG_AuthResponse_BaseResponse, &tmp_len); - response->base_response = epb_unpack_base_response(tmp, tmp_len); - if (response->base_response == NULL) { - GKI_freebuf(response); - return NULL; - } - response->aes_session_key.data = epb_get_bytes(&epb, TAG_AuthResponse_AesSessionKey, &response->aes_session_key.len); - - return response; -} - -void epb_unpack_auth_response_free(AuthResponse *response) -{ - epb_unpack_base_response_free(response->base_response); - GKI_freebuf(response); -} - -int epb_init_request_pack_size(InitRequest *request) -{ - int pack_size = 0; - int len = 0; - - len = epb_base_request_pack_size(request->base_request); - pack_size += epb_length_delimited_pack_size(TAG_InitRequest_BaseRequest, len); - if (request->has_resp_field_filter) { - pack_size += epb_length_delimited_pack_size(TAG_InitRequest_RespFieldFilter, request->resp_field_filter.len); - } - if (request->has_challenge) { - pack_size += epb_length_delimited_pack_size(TAG_InitRequest_Challenge, request->challenge.len); - } - - return pack_size; -} - -int epb_pack_init_request(InitRequest *request, uint8_t *buf, int buf_len) -{ - Epb epb; - epb_pack_init(&epb, buf, buf_len); - - int ret; - int tmp_len; - uint8_t *tmp; - - tmp_len = epb_base_request_pack_size(request->base_request); - tmp = (uint8_t *)GKI_getbuf(tmp_len); - ret = epb_pack_base_request(request->base_request, tmp, tmp_len); - if (ret < 0) { - GKI_freebuf(tmp); - return ret; - } - ret = epb_set_message(&epb, TAG_InitRequest_BaseRequest, tmp, tmp_len); - GKI_freebuf(tmp); - if (ret < 0) return ret; - if (request->has_resp_field_filter) { - ret = epb_set_bytes(&epb, TAG_InitRequest_RespFieldFilter, request->resp_field_filter.data, request->resp_field_filter.len); - if (ret < 0) return ret; - } - if (request->has_challenge) { - ret = epb_set_bytes(&epb, TAG_InitRequest_Challenge, request->challenge.data, request->challenge.len); - if (ret < 0) return ret; - } - - return epb_get_packed_size(&epb); -} - -InitResponse *epb_unpack_init_response(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_InitResponse_BaseResponse)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_InitResponse_UserIdHigh)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_InitResponse_UserIdLow)) { - return NULL; - } - - InitResponse *response = (InitResponse *)GKI_getbuf(sizeof(InitResponse)); - memset(response, 0, sizeof(InitResponse)); - tmp = epb_get_message(&epb, TAG_InitResponse_BaseResponse, &tmp_len); - response->base_response = epb_unpack_base_response(tmp, tmp_len); - if (response->base_response == NULL) { - GKI_freebuf(response); - return NULL; - } - response->user_id_high = epb_get_uint32(&epb, TAG_InitResponse_UserIdHigh); - response->user_id_low = epb_get_uint32(&epb, TAG_InitResponse_UserIdLow); - if (epb_has_tag(&epb, TAG_InitResponse_ChalleangeAnswer)) { - response->challeange_answer = epb_get_uint32(&epb, TAG_InitResponse_ChalleangeAnswer); - response->has_challeange_answer = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_InitScence)) { - response->init_scence = (EmInitScence)epb_get_enum(&epb, TAG_InitResponse_InitScence); - response->has_init_scence = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_AutoSyncMaxDurationSecond)) { - response->auto_sync_max_duration_second = epb_get_uint32(&epb, TAG_InitResponse_AutoSyncMaxDurationSecond); - response->has_auto_sync_max_duration_second = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_UserNickName)) { - response->user_nick_name.str = epb_get_string(&epb, TAG_InitResponse_UserNickName, &response->user_nick_name.len); - response->has_user_nick_name = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_PlatformType)) { - response->platform_type = (EmPlatformType)epb_get_enum(&epb, TAG_InitResponse_PlatformType); - response->has_platform_type = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_Model)) { - response->model.str = epb_get_string(&epb, TAG_InitResponse_Model, &response->model.len); - response->has_model = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_Os)) { - response->os.str = epb_get_string(&epb, TAG_InitResponse_Os, &response->os.len); - response->has_os = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_Time)) { - response->time = epb_get_int32(&epb, TAG_InitResponse_Time); - response->has_time = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_TimeZone)) { - response->time_zone = epb_get_int32(&epb, TAG_InitResponse_TimeZone); - response->has_time_zone = true; - } - if (epb_has_tag(&epb, TAG_InitResponse_TimeString)) { - response->time_string.str = epb_get_string(&epb, TAG_InitResponse_TimeString, &response->time_string.len); - response->has_time_string = true; - } - - return response; -} - -void epb_unpack_init_response_free(InitResponse *response) -{ - epb_unpack_base_response_free(response->base_response); - GKI_freebuf((void *)response); -} - -int epb_send_data_request_pack_size(SendDataRequest *request) -{ - int pack_size = 0; - int len = 0; - - len = epb_base_request_pack_size(request->base_request); - pack_size += epb_length_delimited_pack_size(TAG_SendDataRequest_BaseRequest, len); - pack_size += epb_length_delimited_pack_size(TAG_SendDataRequest_Data, request->data.len); - if (request->has_type) { - pack_size += epb_varint32_pack_size(TAG_SendDataRequest_Type, request->type, false); - } - - return pack_size; -} - -int epb_pack_send_data_request(SendDataRequest *request, uint8_t *buf, int buf_len) -{ - Epb epb; - epb_pack_init(&epb, buf, buf_len); - - int ret; - int tmp_len; - uint8_t *tmp; - - tmp_len = epb_base_request_pack_size(request->base_request); - tmp = (uint8_t *)GKI_getbuf(tmp_len); - ret = epb_pack_base_request(request->base_request, tmp, tmp_len); - if (ret < 0) { - GKI_freebuf(tmp); - return ret; - } - ret = epb_set_message(&epb, TAG_SendDataRequest_BaseRequest, tmp, tmp_len); - GKI_freebuf(tmp); - if (ret < 0) return ret; - ret = epb_set_bytes(&epb, TAG_SendDataRequest_Data, request->data.data, request->data.len); - if (ret < 0) return ret; - if (request->has_type) { - ret = epb_set_enum(&epb, TAG_SendDataRequest_Type, request->type); - if (ret < 0) return ret; - } - - return epb_get_packed_size(&epb); -} - -SendDataResponse *epb_unpack_send_data_response(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_SendDataResponse_BaseResponse)) { - return NULL; - } - - SendDataResponse *response = (SendDataResponse *)GKI_getbuf(sizeof(SendDataResponse)); - memset(response, 0, sizeof(SendDataResponse)); - tmp = epb_get_message(&epb, TAG_SendDataResponse_BaseResponse, &tmp_len); - response->base_response = epb_unpack_base_response(tmp, tmp_len); - if (response->base_response == NULL) { - GKI_freebuf(response); - return NULL; - } - if (epb_has_tag(&epb, TAG_SendDataResponse_Data)) { - response->data.data = epb_get_bytes(&epb, TAG_SendDataResponse_Data, &response->data.len); - response->has_data = true; - } - - return response; -} - -void epb_unpack_send_data_response_free(SendDataResponse *response) -{ - epb_unpack_base_response_free(response->base_response); - GKI_freebuf(response); -} - -RecvDataPush *epb_unpack_recv_data_push(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_RecvDataPush_BasePush)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_RecvDataPush_Data)) { - return NULL; - } - - RecvDataPush *push = (RecvDataPush *)GKI_getbuf(sizeof(RecvDataPush)); - memset(push, 0, sizeof(RecvDataPush)); - tmp = epb_get_message(&epb, TAG_RecvDataPush_BasePush, &tmp_len); - push->base_push = epb_unpack_base_push(tmp, tmp_len); - if (push->base_push == NULL) { - GKI_freebuf(push); - return NULL; - } - push->data.data = epb_get_bytes(&epb, TAG_RecvDataPush_Data, &push->data.len); - if (epb_has_tag(&epb, TAG_RecvDataPush_Type)) { - push->type = (EmDeviceDataType)epb_get_enum(&epb, TAG_RecvDataPush_Type); - push->has_type = true; - } - - return push; -} - -void epb_unpack_recv_data_push_free(RecvDataPush *push) -{ - epb_unpack_base_push_free(push->base_push); - push->base_push = NULL; - GKI_freebuf(push); -} - -SwitchViewPush *epb_unpack_switch_view_push(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_SwitchViewPush_BasePush)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_SwitchViewPush_SwitchViewOp)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_SwitchViewPush_ViewId)) { - return NULL; - } - - SwitchViewPush *push = (SwitchViewPush *)GKI_getbuf(sizeof(SwitchViewPush)); - memset(push, 0, sizeof(SwitchViewPush)); - tmp = epb_get_message(&epb, TAG_SwitchViewPush_BasePush, &tmp_len); - push->base_push = epb_unpack_base_push(tmp, tmp_len); - if (push->base_push == NULL) { - GKI_freebuf(push); - return NULL; - } - push->switch_view_op = (EmSwitchViewOp)epb_get_enum(&epb, TAG_SwitchViewPush_SwitchViewOp); - push->view_id = (EmViewId)epb_get_enum(&epb, TAG_SwitchViewPush_ViewId); - - return push; -} - -void epb_unpack_switch_view_push_free(SwitchViewPush *push) -{ - epb_unpack_base_push_free(push->base_push); - GKI_freebuf(push); -} - -SwitchBackgroudPush *epb_unpack_switch_backgroud_push(const uint8_t *buf, int buf_len) -{ - Epb epb; - epb_unpack_init(&epb, buf, buf_len); - - const uint8_t *tmp; - int tmp_len; - - if (!epb_has_tag(&epb, TAG_SwitchBackgroudPush_BasePush)) { - return NULL; - } - if (!epb_has_tag(&epb, TAG_SwitchBackgroudPush_SwitchBackgroundOp)) { - return NULL; - } - - SwitchBackgroudPush *push = (SwitchBackgroudPush *)GKI_getbuf(sizeof(SwitchBackgroudPush)); - memset(push, 0, sizeof(SwitchBackgroudPush)); - tmp = epb_get_message(&epb, TAG_SwitchBackgroudPush_BasePush, &tmp_len); - push->base_push = epb_unpack_base_push(tmp, tmp_len); - if (push->base_push == NULL) { - GKI_freebuf(push); - return NULL; - } - push->switch_background_op = (EmSwitchBackgroundOp)epb_get_enum(&epb, TAG_SwitchBackgroudPush_SwitchBackgroundOp); - - return push; -} - -void epb_unpack_switch_backgroud_push_free(SwitchBackgroudPush *push) -{ - epb_unpack_base_push_free(push->base_push); - GKI_freebuf(push); -} - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/mpbledemo2.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/mpbledemo2.c deleted file mode 100644 index 68fd24d79..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/mpbledemo2.c +++ /dev/null @@ -1,586 +0,0 @@ -/* -* WeChat mpbledemo2 -* -* author by anqiren 2014/12/02 V1.0bat -* -**/ - -#include "prf_defs.h" - -#if (WX_AIRSYNC_CFG) - -#include -#include -#include -#include -#include "app_airsync_prf.h" -#include "wechat_aes.h" -#include "epb_MmBp.h" -#include "wechar_crc.h" -#include "app_wechat_util.h" -#include "app_airsync_md5.h" -#include "mpbledemo2.h" -#include "gki.h" - - -mpbledemo2_info m_info = {CMD_NULL, {NULL, 0}}; - -#if defined EAM_md5AndNoEnrypt || EAM_md5AndAesEnrypt - uint8_t md5_type_and_id[16]; -#endif - -uint8_t challeange[CHALLENAGE_LENGTH] = {0x11,0x22,0x33,0x44}; //Ϊ˷һȷ飬ʹù - -mpbledemo2_state mpbledemo2Sta = {false, false, false, false, false, false,0,0,0}; -const uint8_t key[16] = DEVICE_KEY; -uint8_t session_key[32] = {0}; -data_handler *m_mpbledemo2_handler = NULL; -uint8_t isLightOn; -/**** NOTIFICATION BITS ***********/ -uint8_t FirstNotificationBit ; -uint8_t SecondNotificationBit; - - -//static void mpbledemo2_handleCmdFromServer(BleDemo2CmdID cmd, uint8_t *ptrData, uint32_t lengthInByte); - -/**@brief Function for the light initialization. - * - * @details Initializes all lights used by this application. - */ - -int32_t mpbledemo2_get_md5(void) -{ - int32_t error_code = 0; -#if defined EAM_md5AndNoEnrypt || EAM_md5AndAesEnrypt - char device_type[] = DEVICE_TYPE; - char device_id[] = DEVICE_ID; - char argv[sizeof(DEVICE_TYPE) + sizeof(DEVICE_ID) - 1]; - memcpy(argv,device_type,sizeof(DEVICE_TYPE)); -/*when add the DEVICE_ID to DEVICE_TYPE, the offset shuld -1 to overwrite '\0' at the end of DEVICE_TYPE */ - memcpy(argv + sizeof(DEVICE_TYPE)-1,device_id,sizeof(DEVICE_ID)); - - error_code = wechat_md5(argv, md5_type_and_id); - -#endif - return error_code; -} - -void mpbledemo2_reset() -{ - mpbledemo2Sta.auth_send = false; - mpbledemo2Sta.auth_state = false; - mpbledemo2Sta.indication_state = false; - mpbledemo2Sta.init_send = false; - mpbledemo2Sta.init_state = false; - mpbledemo2Sta.send_data_seq = 0; - mpbledemo2Sta.push_data_seq = 0; - mpbledemo2Sta.seq = 0; -} - -int32_t mpbledemo2_init(void) -{ - mpbledemo2_reset(); - return (mpbledemo2_get_md5()); -} - - -void mpbledemo2_indication_state(bool isEnable) -{ - mpbledemo2Sta.indication_state = isEnable; - if (false == isEnable) - { - mpbledemo2Sta.auth_send = false; - } -} - -int32_t device_auth() -{ - if (m_mpbledemo2_handler == NULL) { - m_mpbledemo2_handler = get_handler_by_type(PRODUCT_TYPE_MPBLEDEMO2); - } - uint8_t *data = NULL; - uint32_t len = 0; - - ARGS_ITEM_SET(mpbledemo2_info, m_mpbledemo2_handler->m_data_produce_args, cmd, CMD_AUTH); - m_mpbledemo2_handler->m_data_produce_func(m_mpbledemo2_handler->m_data_produce_args, &data, &len); - if(data == NULL) - { - return errorCodeProduce; - } - - //sent data - ble_wechat_indicate_data(data, len); - return 0; - } - - -int32_t device_init() - { - uint8_t *data = NULL; - uint32_t len = 0; - ARGS_ITEM_SET(mpbledemo2_info, m_mpbledemo2_handler->m_data_produce_args, cmd, CMD_INIT); - m_mpbledemo2_handler->m_data_produce_func(m_mpbledemo2_handler->m_data_produce_args, &data, &len); - if(data == NULL) - { - return errorCodeProduce; - } - - //sent data - ble_wechat_indicate_data(data, len); - - return 0; -} - -void mpbledemo2_main_process() -{ - int error_code = 0; - if((mpbledemo2Sta.indication_state) && (!mpbledemo2Sta.auth_state) && (!mpbledemo2Sta.auth_send) ) - { - error_code = device_auth(); - if (0 == error_code) - { - mpbledemo2Sta.auth_send = true; - } - } - if((mpbledemo2Sta.auth_state) && (!mpbledemo2Sta.init_state) && (!mpbledemo2Sta.init_send)) - { - error_code = device_init(); - if (0 == error_code) - { - mpbledemo2Sta.init_send = true; - } - } -} - -void mpbledemo2_data_free_func(uint8_t *data, uint32_t len) -{ - if(data) - { - GKI_freebuf(data); - data = NULL; - } -} - -void mpbledemo2_data_produce_func(void *args, uint8_t **r_data, uint32_t *r_len) -{ - static uint16_t bleDemoHeadLen = sizeof(BlueDemoHead); - mpbledemo2_info *info = (mpbledemo2_info *)args; - BaseRequest basReq = {NULL}; - static uint8_t fix_head_len = sizeof(BpFixHead); - BpFixHead fix_head = {0xFE, 1, 0, htons(ECI_req_auth), 0}; - mpbledemo2Sta.seq++; - switch (info->cmd) - { - case CMD_AUTH: - { - #if defined EAM_md5AndAesEnrypt - uint8_t deviceid[] = DEVICE_ID; - static uint32_t seq = 0x00000001; // - uint32_t ran = 0x11223344; //Ϊ˷һ̶ֵΪʹʱ - ran = t_htonl(ran); - seq = t_htonl(seq); - uint8_t id_len = strlen(DEVICE_ID); - uint8_t* data = GKI_getbuf(id_len+8); - if(!data){return;} - memcpy(data,deviceid,id_len); - memcpy(data+id_len,(uint8_t*)&ran,4); - memcpy(data+id_len+4,(uint8_t*)&seq,4); - uint32_t crc = crc32(0, data, id_len+8); - crc = t_htonl(crc); - memset(data,0x00,id_len+8); - memcpy(data,(uint8_t*)&ran,4); - memcpy(data+4,(uint8_t*)&seq,4); - memcpy(data+8,(uint8_t*)&crc,4); - uint8_t CipherText[16]; - AES_Init(key); - AES_Encrypt_PKCS7 (data, CipherText, 12, key); - if(data){GKI_freebuf(data);data = NULL;} - AuthRequest authReq = {&basReq, true,{md5_type_and_id, MD5_TYPE_AND_ID_LENGTH}, - PROTO_VERSION, AUTH_PROTO, (EmAuthMethod)AUTH_METHOD, true , - {CipherText, CIPHER_TEXT_LENGTH}, false, {NULL, 0}, false, {NULL, 0}, false, - {NULL, 0},true,{DEVICE_ID,sizeof(DEVICE_ID)}}; - seq++; - #endif - - #if defined EAM_macNoEncrypt - static uint8_t mac_address[MAC_ADDRESS_LENGTH]; - //get_mac_addr(mac_address); - AuthRequest authReq = {&basReq, false,{NULL, 0}, PROTO_VERSION, AUTH_PROTO, (EmAuthMethod)AUTH_METHOD, false,{NULL, 0}, true, {mac_address, MAC_ADDRESS_LENGTH}, false, {NULL, 0}, false, {NULL, 0},true,{DEVICE_ID,sizeof(DEVICE_ID)}}; - #endif - - #if defined EAM_md5AndNoEnrypt - AuthRequest authReq = {&basReq, true,{md5_type_and_id, MD5_TYPE_AND_ID_LENGTH}, PROTO_VERSION, (EmAuthMethod)AUTH_PROTO, (EmAuthMethod)AUTH_METHOD, false ,{NULL, 0}, false, {NULL, 0}, false, {NULL, 0}, false, {NULL, 0},true,{DEVICE_ID,sizeof(DEVICE_ID)}}; - #endif - *r_len = epb_auth_request_pack_size(&authReq) + fix_head_len; - *r_data = (uint8_t *)GKI_getbuf(*r_len); - if(!(*r_data)){return;} - if(epb_pack_auth_request(&authReq, *r_data+fix_head_len, *r_len-fix_head_len)<0) - { - *r_data = NULL; - return; - } - fix_head.nCmdId = htons(ECI_req_auth); - fix_head.nLength = htons(*r_len); - fix_head.nSeq = htons(mpbledemo2Sta.seq); - memcpy(*r_data, &fix_head, fix_head_len); - return ; - } - case CMD_INIT: - { - //has challeange - InitRequest initReq = {&basReq,false, {NULL, 0},true, {challeange, CHALLENAGE_LENGTH}}; - *r_len = epb_init_request_pack_size(&initReq) + fix_head_len; - #if defined EAM_md5AndAesEnrypt - uint8_t length = *r_len; - uint8_t *p = GKI_getbuf(AES_get_length( *r_len-fix_head_len)); - if(!p){return;} - *r_len = AES_get_length( *r_len-fix_head_len)+fix_head_len; - #endif - //pack data - *r_data = (uint8_t *)GKI_getbuf(*r_len); - if(!(*r_data)){return;} - if(epb_pack_init_request(&initReq, *r_data+fix_head_len, *r_len-fix_head_len)<0) - {*r_data = NULL;return;} - //encrypt body - #if defined EAM_md5AndAesEnrypt - AES_Init(session_key); - AES_Encrypt_PKCS7(*r_data+fix_head_len,p,length-fix_head_len,session_key);//ԭʼݳ - memcpy(*r_data + fix_head_len, p, *r_len-fix_head_len); - if(p)GKI_freebuf(p); - #endif - fix_head.nCmdId = htons(ECI_req_init); - fix_head.nLength = htons(*r_len); - fix_head.nSeq = htons(mpbledemo2Sta.seq); - memcpy(*r_data, &fix_head, fix_head_len); - return ; - } - case CMD_SENDDAT: - { - - BlueDemoHead *bleDemoHead = (BlueDemoHead*)GKI_getbuf(bleDemoHeadLen+info->send_msg.len); - if (!bleDemoHead) - { - return; - } - - // header of sent data - bleDemoHead->m_magicCode[0] = MPBLEDEMO2_MAGICCODE_H; - bleDemoHead->m_magicCode[1] = MPBLEDEMO2_MAGICCODE_L; - bleDemoHead->m_version = htons(MPBLEDEMO2_VERSION); - bleDemoHead->m_totalLength = htons(bleDemoHeadLen + info->send_msg.len); - bleDemoHead->m_cmdid = htons(sendTextReq); - bleDemoHead->m_seq = htons(mpbledemo2Sta.seq); - bleDemoHead->m_errorCode = 0; - - /*connect body and head.*/ - /*turn to uint8_t* befort offset.*/ - memcpy((uint8_t*)bleDemoHead + bleDemoHeadLen, info->send_msg.str, info->send_msg.len); - - SendDataRequest sendDatReq = - { - &basReq, - { (uint8_t*) bleDemoHead, (bleDemoHeadLen + info->send_msg.len)}, // define the data content wrapped in epb - false, // no type, the data is directly sent to vendor server - (EmDeviceDataType)NULL - }; - *r_len = epb_send_data_request_pack_size(&sendDatReq) + fix_head_len; - - #if defined EAM_md5AndAesEnrypt - uint16_t length = *r_len; - uint8_t *p = GKI_getbuf(AES_get_length( *r_len-fix_head_len)); - if(!p){return;} - *r_len = AES_get_length( *r_len-fix_head_len)+fix_head_len; - #endif - - *r_data = (uint8_t *)GKI_getbuf(*r_len); - if(!(*r_data)){return;} - if(epb_pack_send_data_request(&sendDatReq, *r_data+fix_head_len, *r_len-fix_head_len)<0) - { - *r_data = NULL; - #if defined EAM_md5AndAesEnrypt - if(p){GKI_freebuf(p); - p = NULL;} - #endif - return; - } - - #if defined EAM_md5AndAesEnrypt - //encrypt body - AES_Init(session_key); - AES_Encrypt_PKCS7(*r_data+fix_head_len,p,length-fix_head_len,session_key);//ԭʼݳ - memcpy(*r_data + fix_head_len, p, *r_len-fix_head_len); - if(p){GKI_freebuf(p); p = NULL;} - #endif - - // header of epb - fix_head.nCmdId = htons(ECI_req_sendData); - fix_head.nLength = htons(*r_len); - fix_head.nSeq = htons(mpbledemo2Sta.seq); - - memcpy(*r_data, &fix_head, fix_head_len); - if(bleDemoHead){GKI_freebuf(bleDemoHead);bleDemoHead = NULL;} - - // increase sequence by 1 - mpbledemo2Sta.send_data_seq++; - return ; - } - } -} - -int mpbledemo2_data_consume_func(uint8_t *data, uint32_t len) -{ - BpFixHead *fix_head = (BpFixHead *)data; - uint8_t fix_head_len = sizeof(BpFixHead); - switch(ntohs(fix_head->nCmdId)) - { - case ECI_none: - { - - - } - break; - case ECI_resp_auth: - { - AuthResponse* authResp; - authResp = epb_unpack_auth_response(data+fix_head_len,len-fix_head_len); - if(authResp->base_response) - { - if(authResp->base_response->err_code == 0) - { - mpbledemo2Sta.auth_state = true; - } - else - { - int32_t returnedErrCode = authResp->base_response->err_code; - epb_unpack_auth_response_free(authResp); - return returnedErrCode; - } - } - #if defined EAM_md5AndAesEnrypt // get sessionkey - if(authResp->aes_session_key.len) - { - AES_Init(key); - AES_Decrypt(session_key,authResp->aes_session_key.data,authResp->aes_session_key.len,key); - } - #endif - epb_unpack_auth_response_free(authResp); - } - break; - case ECI_resp_sendData: - { - - #if defined EAM_md5AndAesEnrypt - uint32_t length = len- fix_head_len;//ܺݳ - uint8_t *p = GKI_getbuf (length); - if(!p){ if(data)GKI_freebuf(data);data = NULL; return 0;} - AES_Init(session_key); - // - AES_Decrypt(p,data+fix_head_len,len- fix_head_len,session_key); - - uint8_t temp; - temp = p[length - 1];//䳤 - len = len - temp;//ȡǰܳ - memcpy(data + fix_head_len, p ,length -temp);//ķŻ - if(p){GKI_freebuf(p);p = NULL;} - #endif - SendDataResponse *sendDataResp; - sendDataResp = epb_unpack_send_data_response(data+fix_head_len,len-fix_head_len); - if (!sendDataResp) - { - return errorCodeUnpackSendDataResp; - } - - if(sendDataResp->base_response->err_code) - { - epb_unpack_send_data_response_free(sendDataResp); - return sendDataResp->base_response->err_code; - } - epb_unpack_send_data_response_free(sendDataResp); - } - break; - case ECI_resp_init: - { - FirstNotificationBit = 0; - SecondNotificationBit = 0; - - #if defined EAM_md5AndAesEnrypt - uint32_t length = len- fix_head_len; //ܺݳ - uint8_t *p = GKI_getbuf (length); - if(!p){if(data)GKI_freebuf(data);data = NULL; return 0;} - AES_Init(session_key); - // - AES_Decrypt(p,data+fix_head_len,len- fix_head_len,session_key); - - uint8_t temp; - temp = p[length - 1]; //䳤 - len = len - temp; //ȡǰܳ - memcpy(data + fix_head_len, p ,length -temp); //ķŻ - if(p){GKI_freebuf(p);p = NULL;} - #endif - InitResponse *initResp = epb_unpack_init_response(data+fix_head_len, len-fix_head_len); - if(!initResp) - { - return errorCodeUnpackInitResp; - } - - if(initResp->base_response) - { - if(initResp->base_response->err_code == 0) - { - if(initResp->has_challeange_answer) - { - if(crc32(0,challeange,CHALLENAGE_LENGTH) == initResp->challeange_answer) - { - mpbledemo2Sta.init_state = true; - } - } - else mpbledemo2Sta.init_state = true; - mpbledemo2Sta.wechats_switch_state = true; - } - else - { - epb_unpack_init_response_free(initResp); - return initResp->base_response->err_code; - } - } - epb_unpack_init_response_free(initResp); - } - break; - case ECI_push_recvData: - { - #if defined EAM_md5AndAesEnrypt - uint32_t length = len- fix_head_len;//ܺݳ - uint8_t *p = GKI_getbuf (length); - if(!p){if(data)GKI_freebuf(data); data =NULL; return 0;} - AES_Init(session_key); - // - AES_Decrypt(p,data+fix_head_len,len- fix_head_len,session_key); - - uint8_t temp; - temp = p[length - 1];//䳤 - len = len - temp;//ȡǰܳ - memcpy(data + fix_head_len, p ,length -temp);//ķŻ - if(p){GKI_freebuf(p);p = NULL;} - #endif - RecvDataPush *recvDatPush; - recvDatPush = epb_unpack_recv_data_push(data+fix_head_len, len-fix_head_len); - - if(!recvDatPush) - { - return errorCodeUnpackRecvDataPush; - } - - BlueDemoHead *bledemohead = (BlueDemoHead*)recvDatPush->data.data; - - - // ble demo command handle - - epb_unpack_recv_data_push_free(recvDatPush); - mpbledemo2Sta.push_data_seq++; - } - break; - case ECI_push_switchView: - { - - mpbledemo2Sta.wechats_switch_state = !mpbledemo2Sta.wechats_switch_state; - - #if defined EAM_md5AndAesEnrypt - uint32_t length = len- fix_head_len;//ܺݳ - uint8_t *p = GKI_getbuf (length); - if(!p){if(data)GKI_freebuf(data);data = NULL; return 0;} - AES_Init(session_key); - // - AES_Decrypt(p,data+fix_head_len,len- fix_head_len,session_key); - - uint8_t temp; - temp = p[length - 1];//䳤 - len = len - temp;//ȡǰܳ - memcpy(data + fix_head_len, p ,length -temp);//ķŻ - if(p){GKI_freebuf(p);p = NULL;} - #endif - SwitchViewPush *swichViewPush; - swichViewPush = epb_unpack_switch_view_push(data+fix_head_len,len-fix_head_len); - if(!swichViewPush) - { - return errorCodeUnpackSwitchViewPush; - } - epb_unpack_switch_view_push_free(swichViewPush); - } - break; - case ECI_push_switchBackgroud: - { - - #if defined EAM_md5AndAesEnrypt - uint32_t length = len- fix_head_len;//ܺݳ - uint8_t *p = GKI_getbuf (length); - if(!p){if(data)GKI_freebuf(data);data = NULL; return 0;} - AES_Init(session_key); - // - AES_Decrypt(p,data+fix_head_len,len- fix_head_len,session_key); - uint8_t temp; - temp = p[length - 1];//䳤 - len = len - temp;//ȡǰܳ - memcpy(data + fix_head_len, p ,length -temp);//ķŻ - if(data){GKI_freebuf(p);p = NULL;} - #endif - SwitchBackgroudPush *switchBackgroundPush = epb_unpack_switch_backgroud_push(data+fix_head_len,len-fix_head_len); - if(! switchBackgroundPush) - { - return errorCodeUnpackSwitchBackgroundPush; - } - epb_unpack_switch_backgroud_push_free(switchBackgroundPush); - } - break; - case ECI_err_decode: - break; - default: - { - - } - break; - } - return 0; -} -void mpbledemo2_data_error_func(int error_code) -{ - if(error_code) - { - - //NVIC_SystemReset(); - } -} - -data_handler mpbledemo2_data_handler = { - .m_product_type = PRODUCT_TYPE_MPBLEDEMO2, - .m_data_produce_func = &mpbledemo2_data_produce_func, - .m_data_free_func = &mpbledemo2_data_free_func, - .m_data_consume_func = &mpbledemo2_data_consume_func, - .m_data_error_func = &mpbledemo2_data_error_func, - .m_data_init_peripheral_func = NULL, - .m_data_init_func = &mpbledemo2_init, - .m_data_main_process_func = &mpbledemo2_main_process, - .m_data_button_handler_func = NULL, - .m_data_produce_args = &m_info, - .next = NULL -}; - -// send data to wechat server -int32_t mpbledemo2_sendData(uint8_t* ptrData, uint32_t lengthInByte) -{ - uint8_t *data = NULL; - uint32_t len = 0; - ARGS_ITEM_SET(mpbledemo2_info, m_mpbledemo2_handler->m_data_produce_args, cmd, CMD_SENDDAT); - ARGS_ITEM_SET(mpbledemo2_info, m_mpbledemo2_handler->m_data_produce_args, send_msg.len, lengthInByte); - ARGS_ITEM_SET(mpbledemo2_info, m_mpbledemo2_handler->m_data_produce_args, send_msg.str, (const char *)ptrData); - - m_mpbledemo2_handler->m_data_produce_func(m_mpbledemo2_handler->m_data_produce_args, &data, &len); - if(data == NULL) - { - return errorCodeProduce; - } - ble_wechat_indicate_data(data, len); - return 0; -} - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechar_crc.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechar_crc.c deleted file mode 100644 index 2239a75ca..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechar_crc.c +++ /dev/null @@ -1,51 +0,0 @@ -// crc32.c -// WeChat Embedded -// -// Created by harlliu on 14-03-03. -// Copyright 2014 Tencent. All rights reserved. -// - - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - -#include -#include "wechar_crc.h" - -#define DO1(buf) crc = crc_table(((int)crc ^ (*buf++)) & 0xff) ^ (crc >> 8); -#define DO2(buf) DO1(buf); DO1(buf); -#define DO4(buf) DO2(buf); DO2(buf); -#define DO8(buf) DO4(buf); DO4(buf); - - -static uint32_t crc_table(uint32_t index) -{ - uint32_t c = index; - uint32_t poly = 0xedb88320L; - int k; - - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - - return c; -} - -uint32_t crc32(uint32_t crc, const uint8_t *buf, int len) -{ - if (buf == NULL) return 0L; - - crc = crc ^ 0xffffffffL; - while (len >= 8) - { - DO8(buf); - len -= 8; - } - if (len) do { - DO1(buf); - } while (--len); - return crc ^ 0xffffffffL; -} - - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechat_aes.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechat_aes.c deleted file mode 100644 index 9841f4911..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_WX_airsync/wechat_aes.c +++ /dev/null @@ -1,450 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// wechat_aes.c -// AES㷨 -// ˣLiangbofu -// ڣ2009-07-17 -/////////////////////////////////////////////////////////////////////////////// - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - -#include "wechat_aes.h" -#include -#include -#include -#include - -// ΪC51ŻʹARMPCȻ -// ڷC51ûж__C51__ҪC51ضĹؼֶΪ -#ifndef __C51__ - #define code - #define data - #define idata - #define xdata - #define pdata - typedef unsigned char BOOL; -#else - typedef bit BOOL; -#endif - - -#define Nk (AES_KEY_LENGTH / 32) // ԡ֡4ֽڣΪλԿ -#define Nb 4 // ԡ֡4ֽڣΪλļӽݿС̶Ϊ4 - -// Nrܵ -#if AES_KEY_LENGTH == 128 - #define Nr 10 -#elif AES_KEY_LENGTH == 192 - #define Nr 12 -#elif AES_KEY_LENGTH == 256 - #define Nr 14 -#else - #error AES_KEY_LENGTH must be 128, 192 or 256 BOOLs! -#endif - -// GF(28) ʽ -#define BPOLY 0x1B // Lower 8 BOOLs of (x^8 + x^4 + x^3 + x + 1), ie. (x^4 + x^3 + x + 1). - -// AESԿԿΪ128λʱռ176ֽڿռ -static xdata unsigned char g_roundKeyTable[4*Nb*(Nr+1)]; - -// õSBox -static code const unsigned char SBox[256] = -{ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -}; - -// õSBox -static code const unsigned char InvSBox[256] = -{ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -}; - - -/////////////////////////////////////////////////////////////////////////////// -// RotationWord -// һ֡ݽѭơ -// pWord -- ҪƵ4ֽݡ -// pWord -- ƺ4ֽݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void RotationWord(unsigned char *pWord) -{ - unsigned char temp = pWord[0]; - pWord[0] = pWord[1]; - pWord[1] = pWord[2]; - pWord[2] = pWord[3]; - pWord[3] = temp; -} - -/////////////////////////////////////////////////////////////////////////////// -// XorBytes -// ݡ -// pData1 -- Ҫĵһݡ -// pData1 -- Ҫĵڶݡ -// nCount -- Ҫݳȡ -// pData1 -- Ľ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void XorBytes(unsigned char *pData1, const unsigned char *pData2, unsigned char nCount) -{ - unsigned char i; - - for (i = 0; i < nCount; i++) - { - pData1[i] ^= pData2[i]; - } -} - -/////////////////////////////////////////////////////////////////////////////// -// AddRoundKey -// м״̬ ϣԿݳΪ16ֽڡ -// pState -- ״̬ݡ -// pRoundKey -- Կݡ -// pState -- Կ״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -// static void AddRoundKey(unsigned char *pState, const unsigned char *pRoundKey) -// { -// XorBytes(pState, pRoundKey, 4*Nb); -// } - -// AddRoundKeyĺʽȺʽԽʡ4ֽڵdata -#define AddRoundKey(pState, pRoundKey) \ - XorBytes((pState), (pRoundKey), 4*Nb) - - -/////////////////////////////////////////////////////////////////////////////// -// SubBytes -// ͨSû״̬ݡ -// pState -- ״̬ݡ -// nCount -- ״̬ݳȡ -// bInvert -- Ƿʹ÷Sӣʱʹã -// pState -- û״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void SubBytes(unsigned char *pState, unsigned char nCount, BOOL bInvert) -{ - unsigned char i; - const unsigned char code *pSBox = bInvert ? InvSBox : SBox; - - for (i = 0; i < nCount; i++) - { - pState[i] = pSBox[pState[i]]; - } -} - -/////////////////////////////////////////////////////////////////////////////// -// ShiftRows -// ״̬С -// pState -- ״̬ݡ -// bInvert -- ǷУʱʹã -// pState -- к״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void ShiftRows(unsigned char *pState, BOOL bInvert) -{ - // ע⣺״̬ʽţ - - unsigned char r; // row - unsigned char c; // column - unsigned char temp; - unsigned char rowData[4]; - - for (r = 1; r < 4; r++) - { - // һ - for (c = 0; c < 4; c++) - { - rowData[c] = pState[r + 4*c]; - } - - temp = bInvert ? (4 - r) : r; - for (c = 0; c < 4; c++) - { - pState[r + 4*c] = rowData[(c + temp) % 4]; - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -// GfMultBy02 -// GF(28) 2 㡣 -// num -- -// ޡ -// ֵ num2Ľ -/////////////////////////////////////////////////////////////////////////////// -static unsigned char GfMultBy02(unsigned char num) -{ - if ((num & 0x80) == 0) - { - num = num << 1; - } - else - { - num = (num << 1) ^ BPOLY; - } - - return num; -} - -/////////////////////////////////////////////////////////////////////////////// -// MixColumns -// ״̬ݡ -// pState -- ״̬ݡ -// bInvert -- Ƿϣʱʹã -// pState -- к״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void MixColumns(unsigned char *pState, BOOL bInvert) -{ - unsigned char i; - unsigned char temp; - unsigned char a0Pa2_M4; // 4(a0 + a2) - unsigned char a1Pa3_M4; // 4(a1 + a3) - unsigned char result[4]; - - for (i = 0; i < 4; i++, pState += 4) - { - // b0 = 2a0 + 3a1 + a2 + a3 - // = (a0 + a1 + a2 + a3) + 2(a0 + a1) + a0 - - temp = pState[0] ^ pState[1] ^ pState[2] ^ pState[3]; - result[0] = temp ^ pState[0] ^ GfMultBy02((unsigned char) (pState[0] ^ pState[1])); - result[1] = temp ^ pState[1] ^ GfMultBy02((unsigned char) (pState[1] ^ pState[2])); - result[2] = temp ^ pState[2] ^ GfMultBy02((unsigned char) (pState[2] ^ pState[3])); - result[3] = temp ^ pState[3] ^ GfMultBy02((unsigned char) (pState[3] ^ pState[0])); - - if (bInvert) - { - // b0' = 14a0 + 11a1 + 13a2 + 9a3 - // = (a0 + a1 + a2 + a3) + 2(a0 + a1) + a0 ⲿΪb0 - // + 2(4(a0 + a2) + 4(a1 + a3)) - // + 4(a0 + a2) - - a0Pa2_M4 = GfMultBy02(GfMultBy02((unsigned char) (pState[0] ^ pState[2]))); - a1Pa3_M4 = GfMultBy02(GfMultBy02((unsigned char) (pState[1] ^ pState[3]))); - temp = GfMultBy02((unsigned char) (a0Pa2_M4 ^ a1Pa3_M4)); - result[0] ^= temp ^ a0Pa2_M4; - result[1] ^= temp ^ a1Pa3_M4; - result[2] ^= temp ^ a0Pa2_M4; - result[3] ^= temp ^ a1Pa3_M4; - } - - memcpy(pState, result, 4); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// BlockEncrypt -// Եݼܡ -// pState -- ״̬ݡ -// pState -- ܺ״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void BlockEncrypt(unsigned char *pState) -{ - unsigned char i; - - AddRoundKey(pState, g_roundKeyTable); - - for (i = 1; i <= Nr; i++) // i = [1, Nr] - { - SubBytes(pState, 4*Nb, 0); - ShiftRows(pState, 0); - - if (i != Nr) - { - MixColumns(pState, 0); - } - - AddRoundKey(pState, &g_roundKeyTable[4*Nb*i]); - } - -// Ϊ˽ʡ룬ϲѭִ -// SubBytes(pState, 4*Nb); -// ShiftRows(pState, 0); -// AddRoundKey(pState, &g_roundKeyTable[4*Nb*Nr]); -} - -/////////////////////////////////////////////////////////////////////////////// -// BlockDecrypt -// Եݽܡ -// pState -- ״̬ݡ -// pState -- ܺ״̬ݡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -static void BlockDecrypt(unsigned char *pState) -{ - unsigned char i; - - AddRoundKey(pState, &g_roundKeyTable[4*Nb*Nr]); - - for (i = Nr; i > 0; i--) // i = [Nr, 1] - { - ShiftRows(pState, 1); - SubBytes(pState, 4*Nb, 1); - AddRoundKey(pState, &g_roundKeyTable[4*Nb*(i-1)]); - - if (i != 1) - { - MixColumns(pState, 1); - } - } -} - - -/////////////////////////////////////////////////////////////////////////////// -// AES_Init -// ʼڴִչԿ -// pKey -- ԭʼԿ䳤ȱΪ AES_KEY_LENGTH/8 ֽڡ -// ޡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -void AES_Init(const void *pKey) -{ - // չԿ - unsigned char i; - unsigned char *pRoundKey; - unsigned char Rcon[4] = {0x01, 0x00, 0x00, 0x00}; - - memcpy(g_roundKeyTable, pKey, 4*Nk); - - pRoundKey = &g_roundKeyTable[4*Nk]; - - for (i = Nk; i < Nb*(Nr+1); pRoundKey += 4, i++) - { - memcpy(pRoundKey, pRoundKey - 4, 4); - - if (i % Nk == 0) - { - RotationWord(pRoundKey); - SubBytes(pRoundKey, 4, 0); - XorBytes(pRoundKey, Rcon, 4); - - Rcon[0] = GfMultBy02(Rcon[0]); - } - else if (Nk > 6 && i % Nk == Nb) - { - SubBytes(pRoundKey, 4, 0); - } - - XorBytes(pRoundKey, pRoundKey - 4*Nk, 4); - } -} - -unsigned int AES_get_length(unsigned int length) -{ - return ((length>>4) + 1)<<4; -} -////////////////////////////////////////////////////////////////////////// -// AES_Encrypt -// -// pPlainText -- ģܵݣ䳤ΪnDataLenֽڡ -// nDataLen -- ݳȣֽΪλ -// pIV -- ʼʹECBģʽΪNULL -// pCipherText -- ģļܺݣpPlainTextͬ -// ֵ ޡ -////////////////////////////////////////////////////////////////////////// -unsigned int AES_Encrypt_PKCS7(const unsigned char *pPlainText, unsigned char *pCipherText, - unsigned int nDataLen, const unsigned char *pIV) -{ - unsigned int i; - //ȵ - unsigned int length = nDataLen; - nDataLen = ((nDataLen>>4) + 1)<<4; - uint8_t p=(Nb<<2)-(length%(Nb<<2)); - if (pPlainText != pCipherText){memcpy(pCipherText,pPlainText,length);} - // - unsigned char temp[16]; - memset(temp,p,16); - if(length 0 ; i--, pCipherText += 4*Nb) - { - #if AES_MODE == AES_MODE_CBC - XorBytes(pCipherText, pIV, 4*Nb); - #endif - BlockEncrypt(pCipherText); - pIV = pCipherText; - } - return(nDataLen); -} -////////////////////////////////////////////////////////////////////////// -// AES_Decrypt -// -// pCipherText -- ģܵݣ䳤ΪnDataLenֽڡ -// nDataLen -- ݳȣֽΪλΪAES_KEY_LENGTH/8 -// pIV -- ʼʹECBģʽΪNULL -// pPlainText -- ģĽܺݣpCipherTextͬ -// ֵ ޡ -////////////////////////////////////////////////////////////////////////// -void AES_Decrypt(unsigned char *pPlainText, const unsigned char *pCipherText, - unsigned int nDataLen, const unsigned char *pIV) -{ - unsigned int i; - - if (pPlainText != pCipherText) - { - memcpy(pPlainText, pCipherText, nDataLen); - } - - // һݿʼܣÿٿռIV - pPlainText += nDataLen - 4*Nb; - for (i = nDataLen/(4*Nb); i > 0 ; i--, pPlainText -= 4*Nb) - { - BlockDecrypt(pPlainText); - - #if AES_MODE == AES_MODE_CBC - if (i == 1) - {// һ - XorBytes(pPlainText, pIV, 4*Nb); - } - else - { - XorBytes(pPlainText, pPlainText - 4*Nb, 4*Nb); - } - #endif - } -} - - -#endif ///WX_AIRSYNC_CFG - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_sample_button/app_button.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_sample_button/app_button.c deleted file mode 100644 index fc6735179..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_profiles/app_sample_button/app_button.c +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright 2015-2016 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. - - -#include "prf_defs.h" - -#if (BUT_PROFILE_CFG) - - -#include -#include -#include -#include - - -#include "rom/gpio.h" -#include "app_button.h" -#include "bt_trace.h" -#include "freertos/FreeRTOS.h" -#include "freertos/timers.h" -#include "freertos/task.h" -#include "freertos/xtensa_api.h" -#include "thread.h" - -#include "allocator.h" -#include "button_pro.h" -#include "app_button_int.h" - -static const tBT_PRF_SYS_REG but_prf_reg = -{ - ble_but_prf_hdl_event, - ble_but_prf_disable -}; - - - -/******************************************************************************* -** -** Function ble_but_prf_hdl_event -** -** Description button profile main event handling function. -** -** -** Returns BOOLEAN -** -*******************************************************************************/ -BOOLEAN ble_but_prf_hdl_event(prf_hdr_evt_t *msg_data) -{ - LOG_ERROR("###################ble_but_prf_hdl_event#####################################\n"); - - UINT16 connid = 0; - switch(msg_data->event) - { - case BLE_BUT_CREATE_DB_REQ_EVT: - Button_CreateService(); - break; - case BLE_BUT_VAL_SEND_CFM_EVT: - break; - case BLE_BUT_SET_CHAR_VAL_REQ_EVT: - button_msg_notify(msg_data->len,msg_data->data); - break; - case BLE_BUT_ENABLE_REQ_EVT: - button_init(NULL); - break; - case BLE_BUT_DISABLE_IND_EVT: - button_disable(connid); - break; - case BLE_BUT_CHAR_WRITE_IND_EVT: - - break; - case BLE_BUT_ERROR_IND_EVT: - break; - default: - break; - } -} - - -/******************************************************************************* -** -** Function ble_but_prf_disable -** -** Description This function is called to disable the button profile modlue -** -** Parameters None. -** -** Returns None -** -*******************************************************************************/ -void ble_but_prf_disable(void) -{ - prf_hdr_evt_t *p_buf; - LOG_ERROR("ble_but_prf_disable\n"); - - if (bt_prf_sys_is_register(PRF_ID_BUT_LE) == FALSE) - { - APPL_TRACE_WARNING("button profile Module not enabled/already disabled\n"); - return; - } - - if ((p_buf = (prf_hdr_evt_t *) GKI_getbuf(sizeof(prf_hdr_evt_t))) != NULL) - { - p_buf->event = BLE_BUT_DISABLE_IND_EVT; - bta_sys_sendmsg(p_buf); - } - bta_sys_deregister(PRF_ID_BUT_LE); - -} - -void ble_but_prf_enable(void) -{ - bt_prf_sys_register(PRF_ID_BUT_LE,&but_prf_reg); -} - -void ble_but_create_svc(void) -{ - prf_hdr_evt_t *p_msg; - - LOG_ERROR("ble_but_create_svc\n"); //todo - if ((p_msg = (prf_hdr_evt_t *) GKI_getbuf(sizeof(prf_hdr_evt_t))) != NULL) - { - memset(p_msg, 0, sizeof(prf_hdr_evt_t)); - - p_msg->event = BLE_BUT_ENABLE_REQ_EVT; - - bt_prf_sys_sendmsg(p_msg); - } -} - - - - - - -#endif ///BUT_PROFILE_CFG - -#if 0 - -#define GPIO_INUM 8 -#define TABLE_ELEMENT_CNT(table) ((sizeof(table))/(sizeof(table[0]))); -app_key_env key_press; - -uint8_t gpio_test_table[]={0,2,4,5,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,33,34,35,36,37,38,39}; - -struct gpio_test_info{ - uint8_t *gpio_test_table; - uint8_t gpio_test_num; - void *time_s; -}; - -static void gpio_irq_init(uint64_t gpio_num); - -void gpio_check_register(enum_gpio_num_t gpio_num) -{ - if(gpio_num>=GPIO_PIN_COUNT||0==GPIO_PIN_MUX_REG[gpio_num]){ - ets_printf("io_num=%d not exits\n",gpio_num); - return; - } - LOG_ERROR("---------gpio_num %d reg----------\n",gpio_num); -LOG_ERROR("GPIO_IOMUX_%d=0x%08x\n",gpio_num,READ_PERI_REG(GPIO_PIN_MUX_REG[gpio_num])); - LOG_ERROR("GPIO_PIN%d_ADDR=0x%08x\n",gpio_num,READ_PERI_REG(GPIO_PIN_ADDR(gpio_num))); - LOG_ERROR("GPIO_OUT_REG=0x%08x\n",READ_PERI_REG(GPIO_OUT_REG)); - LOG_ERROR("GPIO_OUT1_REG=0x%08x\n",READ_PERI_REG(GPIO_OUT1_REG)); - LOG_ERROR("GPIO_ENABLE_REG=0x%08x\n",READ_PERI_REG(GPIO_ENABLE_REG)); - LOG_ERROR("GPIO_ENABLE1_REG=0x%08x\n",READ_PERI_REG(GPIO_ENABLE1_REG)); - LOG_ERROR("GPIO_IN_REG=0x%08x\n",READ_PERI_REG(GPIO_IN_REG)); - LOG_ERROR("GPIO_IN1_REG=0x%08x\n",READ_PERI_REG(GPIO_IN1_REG)); - LOG_ERROR("GPIO_STATUS_REG=0x%08x\n",READ_PERI_REG(GPIO_STATUS_REG)); - LOG_ERROR("GPIO_STATUS1_REG=0x%08x\n",READ_PERI_REG(GPIO_STATUS1_REG)); -} - -void t1_callback(void *arg) -{ - static uint8_t level=0; - static uint8_t cnt=0; - uint8_t err_flag=0; - struct gpio_test_info *gpio_test=(struct gpio_test_info*)(arg); - uint8_t i=0; - while(1){ - gpio_check_register(35); - vTaskDelay(2*1000); - /* - level=~level; - LOG_ERROR("Test cnt %u, level %u\n",cnt+1,level&0x01); - for(i=0;igpio_test_num;i++){ - gpio_set_output_level(gpio_test->gpio_test_table[i],level&0x01); - if(gpio_get_input_level(gpio_test->gpio_test_table[i])!=(level&0x01)) - { - err_flag=1; - LOG_ERROR("[ERR] GPIO%u set_level %u get_level %u\n",gpio_test->gpio_test_table[i],level&0x01,gpio_get_input_level(gpio_test->gpio_test_table[i])); - } - else{ - LOG_ERROR("GPIO%u OK\n",gpio_test->gpio_test_table[i]); - } - } - cnt++; - if(err_flag==0){ - LOG_ERROR("cnt %u test ok\n",cnt); - } - err_flag=0; - if(cnt>=10){ - LOG_ERROR("Gpio input and output test end\n"); - vTaskDelete(NULL);*/ - // } - - //vTaskDelay(2*1000); - - } -} - - void app_button_init(void) -{ - uint64_t gpio_num = GPIO_Pin_27|GPIO_Pin_35|GPIO_Pin_34|GPIO_Pin_36|GPIO_Pin_39; - // Reset environment - memset(&key_press, 0, sizeof(key_press)); - gpio_irq_init(gpio_num); - static struct gpio_test_info gpio_test_infor; - LOG_ERROR("app_button_init."); -/* TimerHandle_t t1=NULL; - t1=xTimerCreate("t1_time",(1000/portTICK_PERIOD_MS),pdTRUE,&gpio_test_infor,t1_callback); - do{ - gpio_test_infor.gpio_test_table=gpio_test_table; - gpio_test_infor.gpio_test_num=TABLE_ELEMENT_CNT(gpio_test_table); - gpio_test_infor.time_s=t1; - }while(0);*/ - - // xTaskCreate(t1_callback,"t1_callback",1024,&gpio_test_infor,30,NULL); - LOG_ERROR("gpio_input_output_demo\n"); - return; -} - -static void gpio_irq_init(uint64_t gpio_num) -{ - gpio_config_t gpio_config_prot; - memset(&gpio_config_prot,0,sizeof(gpio_config_prot)); - gpio_config_prot.GPIO_Pin= gpio_num; - - gpio_config_prot.GPIO_Mode=GPIO_Mode_Input; - gpio_config_prot.GPIO_IntrType=GPIO_PIN_INTR_NEGEDGE; - gpio_config_prot.GPIO_Pullup=GPIO_PullUp_EN; - gpio_config_prot.GPIO_Pulldown=GPIO_PullDown_DIS; - gpio_config(&gpio_config_prot); - //Register gpio handler - gpio_intr_handler_register(GPIO_isr_callback,NULL); - //Enable gpio intr - xt_ints_on(1<par = Button_Voice; - break; - case GPIO_NUM_34: - evt->par = Button_OK; - break; - case GPIO_NUM_39: - evt->par = Button_Down; - break; - case GPIO_NUM_36: - evt->par = Button_Up; - break; - default: - evt->par = Button_Back; - break; - } - evt->sig = BUTTON_PRESS_EVT; - if(xQueueSend(xBtaApp1Queue,&evt,10/portTICK_RATE_MS)!=pdTRUE){ - LOG_ERROR("btdm_post_failed\n"); - } - //enable the interrupt - xt_ints_on(1< -#include -#include -#include - -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "controller.h" - -#include "bt_trace.h" -#include "btm_api.h" -#include "bt_types.h" -#include "gattc_profile.h" - -#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] - -tBTA_GATTC_IF client_if; -BD_ADDR obj_addr; -static unsigned char BASE_UUID[16] = { - 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - -int uuidType(unsigned char* p_uuid) -{ - int i = 0; - int match = 0; - int all_zero = 1; - - for(i = 0; i != 16; ++i) - { - if (i == 12 || i == 13) - continue; - - if (p_uuid[i] == BASE_UUID[i]) - ++match; - - if (p_uuid[i] != 0) - all_zero = 0; - } - if (all_zero) - return 0; - if (match == 12) - return LEN_UUID_32; - if (match == 14) - return LEN_UUID_16; - return LEN_UUID_128; -} - -static void btif_to_bta_uuid(tBT_UUID *p_dest, bt_uuid_t *p_src) -{ - char *p_byte = (char*)p_src; - - int i = 0; - - p_dest->len = uuidType(p_src->uu); - - switch (p_dest->len) - { - case LEN_UUID_16: - p_dest->uu.uuid16 = (p_src->uu[13] << 8) + p_src->uu[12]; - break; - - case LEN_UUID_32: - p_dest->uu.uuid32 = (p_src->uu[13] << 8) + p_src->uu[12]; - p_dest->uu.uuid32 += (p_src->uu[15] << 24) + (p_src->uu[14] << 16); - break; - - case LEN_UUID_128: - for(i = 0; i != 16; ++i) - p_dest->uu.uuid128[i] = p_byte[i]; - break; - - default: - LOG_ERROR("%s: Unknown UUID length %d!", __FUNCTION__, p_dest->len); - break; - } -} -/* -uint16_t get_uuid16(tBT_UUID* p_uuid) -{ - if(p_uuid->len == LEN_UUID_16) - { - return p_uuid->uu.uuid16; - } - else if(p_uuid->len == LEN_UUID_128) - { - UINT16 u16; - UINT8 *p = &p_uuid->uu.uuid128[LEN_UUID_128 - 4]; - STREAM_TO_UINT16(u16, p); - return u16; - } - else - { - return (UINT16)p_uuid->uu.uuid32; - } -} - -//fill a GATT ID structure -void bta_le_fill_16bits_gatt_id(UINT8 inst_id, UINT16 uuid, tBTA_GATT_ID* p_output) -{ - p_output->inst_id = inst_id; - p_output->uuid.len = LEN_UUID_16; - p_output->uuid.uu.uuid16 = uuid; -} - -//fill a service ID structure with a 16 bits service UUID -void bta_le_fill_16bits_srvc_id(bool is_pri, UINT8 inst_id, UINT16 srvc_uuid, tBTA_GATT_SRVC_ID* p_output) -{ - memset((void *)p_output, 0, sizeof(tBTA_GATT_SRVC_ID)); - p_output->is_primary = is_pri; - bta_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id); -} - -//fill a char ID structure with a 16 bits char UUID -void bta_le_fill_16bits_char_id(UINT8 inst_id, UINT16 char_uuid, tBTA_GATT_ID* p_output) -{ - memset((void *)p_output, 0, sizeof(tBTA_GATT_ID)); - bta_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output); -} -*/ -/*get remote name*/ -static bool check_remote_name(tBTA_DM_INQ_RES* result, uint8_t* rmt_name, uint8_t* rmt_name_len) -{ - uint8_t *p_rmt_name = NULL; - uint8_t remote_name_len = 0; - - if (result->p_eir) { - p_rmt_name = BTM_CheckEirData(result->p_eir, - BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, - &remote_name_len); - if (!p_rmt_name) - p_rmt_name = BTM_CheckEirData(result->p_eir, - BTM_EIR_SHORTENED_LOCAL_NAME_TYPE, - &remote_name_len); - if (p_rmt_name) { - if (remote_name_len > BD_NAME_LEN) - remote_name_len = BD_NAME_LEN; - if (rmt_name && rmt_name_len) { - memcpy(rmt_name, p_rmt_name, remote_name_len); - *(rmt_name + remote_name_len) = 0; - *rmt_name_len = remote_name_len; - } - return true; - } - } - return false; -} - -/************************************************************************************ -* * Function bta_scan_recult_callback -* * -* * Description scan result.it will be called when device scaned a peer device -* * -* * Return NULL -**************************************************************************************/ -static void bta_scan_result_callback(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) -{ - uint8_t len; - BD_ADDR bd_addr; - char dev_name[32]; - tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; - //char obj_name[] = "Find Me"; - char obj_name[] = "SimpleBLEPeripheral"; - uint8_t dev_name_len; - - switch (event) - { - case BTA_DM_INQ_RES_EVT: - { - LOG_ERROR("scan result: event=%d, "BT_BD_ADDR_STR", device_type=%d\n", - event, BT_BD_ADDR_HEX(p_data->inq_res.bd_addr), p_data->inq_res.device_type); - - bdcpy(bd_addr, p_data->inq_res.bd_addr); - if (p_data->inq_res.p_eir) - { - if (BTM_CheckEirData(p_data->inq_res.p_eir, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &len)) - { - p_data->inq_res.remt_name_not_required = TRUE; - } - } - - if(check_remote_name(&(p_data->inq_res), dev_name, &dev_name_len)) - { - LOG_ERROR("scan device name len=%d, name = %s\n", dev_name_len, dev_name); - } - - if(strcmp(dev_name, obj_name) == 0) - { - bdcpy(obj_addr, bd_addr); - LOG_ERROR("find the device, obj_addr="BT_BD_ADDR_STR"\n", BT_BD_ADDR_HEX(obj_addr)); -// BTA_GATTC_Open(client_if, obj_addr, true, transport); - } - } - break; - - case BTA_DM_INQ_CMPL_EVT: - { - LOG_ERROR("%s-BLE observe complete. Num Resp %d\n", __FUNCTION__, p_data->inq_cmpl.num_resps); - - LOG_ERROR("connect the device "BT_BD_ADDR_STR", client_if=%d\n", - BT_BD_ADDR_HEX(obj_addr), client_if); - -/* scan complete, start connect*/ - BTA_GATTC_Open(client_if, obj_addr, true, transport); - } - break; - - default: - LOG_ERROR("%s : unknown event 0x%x", __FUNCTION__, event); - } -} - -/************************************************************************************ -* * Function bta_scan_param_setup_cback -* * -* * Description set scan param callback.it will be called after setting scan parameter -* * -* * Return NULL -**************************************************************************************/ -static void bta_scan_param_setup_cback(tGATT_IF c_client_if, tBTM_STATUS status) -{ - client_if = c_client_if; - LOG_ERROR("\nset scan params complete: status=%d, client_if=%d\n", status, client_if); - /*start scan*/ - BTA_DmBleObserve(true, 8, bta_scan_result_callback); -} - -/************************************************************************************ -* * Function bta_gattc_callback -* * -* * Description app register callback -* * -* * Return NULL -**************************************************************************************/ -static void bta_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data) -{ - switch (event) - { - case BTA_GATTC_REG_EVT: - { - tBTA_GATT_STATUS status = p_data->reg_oper.status; - client_if = p_data->reg_oper.client_if; - LOG_ERROR("%s:register complete: event=%d, status=%d, client_if=%d\n", __FUNCTION__, event, status, client_if); - UINT8 scan_interval = 0x50; - UINT8 scan_window = 0x30; - tBLE_SCAN_MODE scan_mode = BTM_BLE_SCAN_MODE_ACTI; - - bac_register(); - /*register complete,set scan parameter*/ - BTA_DmSetBleScanParams(client_if, scan_interval, scan_window, scan_mode, - bta_scan_param_setup_cback); - - } - break; - - /*connect callback*/ - case BTA_GATTC_OPEN_EVT: - { - - LOG_ERROR("\n%s:device is connected "BT_BD_ADDR_STR", client_if=%d, status=%d, connect_id=%d\n", - __FUNCTION__, BT_BD_ADDR_HEX(p_data->open.remote_bda), p_data->open.client_if, - p_data->open.status, p_data->open.conn_id); - /*return whether the remote device is currently connected*/ - int is_connected = BTA_DmGetConnectionState(p_data->open.remote_bda); - LOG_ERROR("is_connected=%d\n",is_connected); - /*get the energy info of the controller*/ - - /*read battery level*/ - int conn_id = p_data->open.conn_id; - - /*discover service*/ - // BTA_GATTC_ServiceSearchRequest(conn_id, NULL); - - } - break; -/* - case BTA_GATTC_SEARCH_RES_EVT: - { - // tBTA_GATTC_SRVC_RES service_result; - LOG_ERROR("find the service,uuid=0x%x, is_primary=%d\n", - get_uuid16(&p_data->srvc_res.service_uuid.id.uuid), - p_data->srvc_res.service_uuid.is_primary); - } - break; - - case BTA_GATTC_SEARCH_CMPL_EVT: - { - LOG_ERROR("search service complete, conn_id=%d,status=%d\n", p_data->search_cmpl.conn_id, - p_data->search_cmpl.status); - - //get first characteristic of battey service - LOG_ERROR("get first characteristic of battery service\n"); - tBTA_GATT_STATUS status; - tBTA_GATT_SRVC_ID battery_srvc_id; - tBTA_GATTC_CHAR_ID out_char_id; - tGATT_CHAR_PROP out_char_prop; - bta_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_BATTERY, &battery_srvc_id); - status = BTA_GATTC_GetFirstChar(p_data->search_cmpl.conn_id, &battery_srvc_id, NULL, - &out_char_id, &out_char_prop); - if(status == 0) - { - LOG_ERROR("the first char:srvc_id=0x%x,char_id=0x%x, property = %d\n", - get_uuid16(&out_char_id.srvc_id.id.uuid), get_uuid16(&out_char_id.char_id.uuid), - out_char_prop); - //read battery level - tBTA_GATTC_CHAR_ID battery_char_id; - bta_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_BATTERY, &battery_char_id.srvc_id); - bta_le_fill_16bits_char_id(0, GATT_UUID_BATTERY_LEVEL, &battery_char_id.char_id); - - BTA_GATTC_ReadCharacteristic(p_data->search_cmpl.conn_id, &battery_char_id, - BTA_GATT_AUTH_REQ_NONE); - } - } - break; - - case BTA_GATTC_READ_CHAR_EVT: - { - - LOG_ERROR("\nread characteristic:connect_id=%d, status=%d\n", - p_data->read.conn_id, p_data->read.status); - LOG_ERROR("srvc_id=0x%x,char_id=0x%x,descr_type=0x%x\n", - get_uuid16(&p_data->read.srvc_id.id.uuid), - get_uuid16(&p_data->read.char_id.uuid), - get_uuid16(&p_data->read.descr_type.uuid)); - if(get_uuid16(&p_data->read.descr_type.uuid) != GATT_UUID_CHAR_AGG_FORMAT - && p_data->read.p_value->unformat.len > 0 - && p_data->read.p_value->unformat.p_value != NULL) - { - LOG_ERROR("read the value: len=%d, value=%d\n", p_data->read.p_value->unformat.len, - *(p_data->read.p_value->unformat.p_value)); - } - } - break; -*/ - default: - LOG_ERROR("%s:unknown event: %d\n", __FUNCTION__, event); - } - -} - -/************************************************************************************ -* * Function ble_client_appRegister -* * -* * Description app register function -* * -* * Return NULL -**************************************************************************************/ -void ble_client_appRegister(void) -{ - - bt_uuid_t uuid; - tBT_UUID t_uuid; - memcpy(&uuid, BASE_UUID, sizeof(bt_uuid_t)); - btif_to_bta_uuid(&t_uuid, &uuid); - - LOG_ERROR("register application\n"); - BTA_GATTC_AppRegister(&t_uuid, bta_gattc_callback); - - /*battery service register*/ -// bac_register(); - -} - -void gattc_client_test(void) -{ - BTM_SetTraceLevel(BT_TRACE_LEVEL_DEBUG); - - ble_client_appRegister(); -} diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/app_project/SampleServerProject.c b/examples/06_bluedroid_demos/components/bluedroid_demos/app_project/SampleServerProject.c deleted file mode 100644 index e87f33783..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/app_project/SampleServerProject.c +++ /dev/null @@ -1,381 +0,0 @@ -// Copyright 2015-2016 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. - -/*************************************************************** -* -* This file is for gatt server device. It instantiates BATTERY -* sevice. It can be scanned and connected by central device, -* and the client will get the BAS value. It calls the API bta -* layer provides. -* -****************************************************************/ - -#include -#include -#include -#include - -#include "prf_defs.h" - -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "controller.h" - -#include "gatt_int.h" -#include "bt_trace.h" -#include "btm_api.h" -#include "bt_types.h" -#include "dis_api.h" -#include "bt_app_common.h" - -//#include "prf_defs.h" - -#include "wx_airsync_prf.h" - -#include "button_pro.h" -#include "app_button.h" -#include "hid_le_prf.h" - -#include "esp_gatt_api.h" - -// - -#include "hcimsgs.h" -#include "esp_bt_defs.h" - - -#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] -tBTA_GATTS_IF server_if; - -static unsigned char DIS_UUID[16] = { - 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x0a, 0x18, 0x00, 0x00 - }; -static unsigned char BASE_UUID[16] = { - 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - -UINT16 ijiazu_uuid = 0xffff; -UINT16 wechat_uuid = 0xfee7; -tBTA_BLE_SERVICE ijiazu_service = { - 0x01, //only one service in the ijiazu button profile - false, - &ijiazu_uuid - }; /* 16 bits services */ - -tBTA_BLE_SERVICE wechat_service = { - 0x01, //only one service in the ijiazu button profile - false, - &wechat_uuid - }; /* 16 bits services */ - - - -UINT8 beacon_manu[25] = {0x4c, 0x00,0x02, 0x15, 0xfd, 0xa5, 0x06, 0x93, 0xa4, 0xe2, - 0x4f, 0xb1, 0xaf, 0xcf, 0xc6, 0xeb, 0x07, 0x64, 0x78, 0x25, - 0x27, 0x32, 0xe6, 0x08, 0xc5}; - -//UINT8 ijiazu_manu[17] = {0xff,0x20,0x14,0x07,0x22,0x00,0x02,0x5B,0x00,0x33,0x49,0x31,0x30,0x4a,0x30,0x30,0x31}; -UINT8 ijiazu_manu[17] = {0xff,0x20,0x14,0x07,0x22,0x00,0x02,0x5B,0x00,0x33,0x49,0x31,0x30,0x4a,0x30,0x30,0x31}; -UINT8 wechat_manu[] = {0x00,0x00,0x18,0xfe,0x34,0x6a,0x86,0x2e}; -tBTA_BLE_MANU p_ijiazu_manu = {sizeof(ijiazu_manu),ijiazu_manu}; /* manufacturer data */ -tBTA_BLE_MANU p_wechat_manu = {sizeof(wechat_manu),wechat_manu}; - - -tBLE_BD_ADDR p_peer_bda = { - .type = API_PUBLIC_ADDR, - .bda = {0} -}; - -esp_ble_adv_params_all_t adv_params = -{ - .adv_int_min = BTM_BLE_ADV_INT_MIN + 0x100, - .adv_int_max = BTM_BLE_ADV_INT_MIN + 0x100, - .adv_type = API_NON_DISCOVERABLE, - .addr_type_own = API_PUBLIC_ADDR, - .channel_map = ESP_BLE_ADV_CHNL_MAP, - .adv_filter_policy = ADV_ALLOW_SCAN_ANY_CON_ANY, - .p_dir_bda = &p_peer_bda -}; - - - - - -BD_ADDR rand_ijiazu_addr = {0x00,0x02,0x5B,0x00,0x32,0x55}; - -esp_ble_adv_data_cfg_t ijiazu_adv_data[ADV_SCAN_IDX_MAX] = -{ - [BLE_ADV_DATA_IDX] = { - .adv_name = "Espressif_007", - { - {0,0}, - NULL, //no manufature data to be setting in the ijiazu adervetisiing datas - &ijiazu_service, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0200, //device type : generic display - BTA_DM_GENERAL_DISC, // General discoverable. - 0xFE //the tx power value,defult value is 0 - }, - - }, - [BLE_SCAN_RSP_DATA_IDX] = { - .adv_name = NULL, - { - {0,0}, - &p_ijiazu_manu, - NULL, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0000, //device type : generic display - 0x00, // General discoverable. - 0x00}, //the tx power value,defult value is 0 - - } -}; - -esp_ble_adv_data_cfg_t wechat_adv_data[ADV_SCAN_IDX_MAX] = -{ - [BLE_ADV_DATA_IDX] = { - .adv_name = NULL, - { - {0,0}, - NULL, //no manufature data to be setting in the ijiazu adervetisiing datas - &wechat_service, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0200, //device type : generic display - BTA_DM_GENERAL_DISC, // General discoverable. - 0xFE //the tx power value,defult value is 0 - }, - - }, - [BLE_SCAN_RSP_DATA_IDX] = { - .adv_name = "wechat_demo", - { - {0,0}, - &p_wechat_manu, - NULL, - NULL, //the 128 bits service uuid set to null(not used) - NULL, //the 32 bits Service UUID set to null(not used) - NULL, //16 bits services Solicitation UUIDs set to null(not used) - NULL, //List of 32 bit Service Solicitation UUIDs set to null(not used) - NULL, //List of 128 bit Service Solicitation UUIDs set to null(not used) - NULL, //proprietary data set to null(not used) - NULL, //service data set not null(no service data to be sent) - 0x0000, //device type : generic display - 0x00, // General discoverable. - 0x00}, //the tx power value,defult value is 0 - - } -}; - -#if (BUT_PROFILE_CFG) -static void SimpleDataCallBack(uint8_t app_id, uint8_t event, uint16_t len, uint8_t *p_data); -#endif - -int uuidType(unsigned char* p_uuid) -{ - int i = 0; - int match = 0; - int all_zero = 1; - - for(i = 0; i != 16; ++i) - { - if (i == 12 || i == 13) - continue; - - if (p_uuid[i] == BASE_UUID[i]) - ++match; - - if (p_uuid[i] != 0) - all_zero = 0; - } - if (all_zero) - return 0; - if (match == 12) - return LEN_UUID_32; - if (match == 14) - return LEN_UUID_16; - return LEN_UUID_128; -} - -/*16-bits uuid to the structure of holding any type of UUID*/ -void btif_to_bta_uuid(tBT_UUID *p_dest, bt_uuid_t *p_src) -{ - char *p_byte = (char*)p_src; - - int i = 0; - - p_dest->len = uuidType(p_src->uu); - - switch (p_dest->len) - { - case LEN_UUID_16: - p_dest->uu.uuid16 = (p_src->uu[13] << 8) + p_src->uu[12]; - break; - - case LEN_UUID_32: - p_dest->uu.uuid32 = (p_src->uu[13] << 8) + p_src->uu[12]; - p_dest->uu.uuid32 += (p_src->uu[15] << 24) + (p_src->uu[14] << 16); - break; - - case LEN_UUID_128: - for(i = 0; i != 16; ++i) - p_dest->uu.uuid128[i] = p_byte[i]; - break; - - default: - LOG_ERROR("%s: Unknown UUID length %d!", __FUNCTION__, p_dest->len); - break; - } -} - - -/*set advertising config callback*/ -static void bta_gatts_set_adv_data_cback(tBTA_STATUS call_status) -{ - LOG_ERROR("set advertising config:status=%d\n", call_status); - /*dis init*/ -/* tDIS_ATTR_MASK dis_attr_mask; - dis_attr_mask = DIS_ATTR_SYS_ID_BIT | DIS_ATTR_MODEL_NUM_BIT | DIS_ATTR_SERIAL_NUM_BIT | - DIS_ATTR_FW_NUM_BIT | DIS_ATTR_HW_NUM_BIT | DIS_ATTR_SW_NUM_BIT | DIS_ATTR_MANU_NAME_BIT | - DIS_ATTR_IEEE_DATA_BIT | DIS_ATTR_PNP_ID_BIT; - DIS_SrInit(dis_attr_mask); -*/ - //ble_but_create_svc(); - /*instantiate a battery service*/ - bas_register(); - /*instantiate the driver for button profile*/ - //app_button_init(); -#if (BUT_PROFILE_CFG) - /*instantiate a button service*/ - //button_init(SimpleDataCallBack); -#endif ///BUT_PROFILE_CFG - -#if (HIDD_LE_PROFILE_CFG) - /*instantiate a hid device service*/ - hidd_le_init(); -#endif ///HIDD_LE_PROFILE_CFG - -#if (WX_AIRSYNC_CFG) - AirSync_Init(NULL); -#endif ///WX_AIRSYNC_CFG - esp_ble_start_advertising(&adv_params); - //API_Ble_AppStartAdvertising(&adv_params); - /*start advetising*/ -// BTA_GATTS_Listen(server_if, true, NULL); -} - -/*register callback*/ -void bta_gatts_callback(tBTA_GATTS_EVT event, tBTA_GATTS* p_data) -{ - switch (event) - { - case BTA_GATTS_REG_EVT: - { - tBTA_GATT_STATUS status = p_data->reg_oper.status; - server_if = p_data->reg_oper.server_if; - LOG_ERROR("register complete: event=%d, status=%d, server_if=%d\n", - event, status, server_if); - - LOG_ERROR("set advertising parameters\n"); - //set the advertising data to the btm layer - esp_ble_config_adv_data(&wechat_adv_data[BLE_ADV_DATA_IDX], - bta_gatts_set_adv_data_cback); - - } - break; - /*connect callback*/ - case BTA_GATTS_CONNECT_EVT: - { - ///Stop the advertising when the connection is establish - esp_ble_stop_advertising(); - LOG_ERROR("\ndevice is connected "BT_BD_ADDR_STR", server_if=%d,reason=0x%x,connect_id=%d\n", - BT_BD_ADDR_HEX(p_data->conn.remote_bda), p_data->conn.server_if, - p_data->conn.reason, p_data->conn.conn_id); - /*return whether the remote device is currently connected*/ - int is_connected = BTA_DmGetConnectionState(p_data->conn.remote_bda); - LOG_ERROR("is_connected=%d\n",is_connected); - } - break; - - case BTA_GATTS_DISCONNECT_EVT: - ///start the advertising again when lose the connection - esp_ble_start_advertising(&adv_params); - break; - default: - LOG_ERROR("unsettled event: %d\n", event); - } - -} - -#if (BUT_PROFILE_CFG) -static void SimpleDataCallBack(uint8_t app_id, uint8_t event, uint16_t len, uint8_t *p_data) -{ - LOG_ERROR("the event value is:%x\n",event); - switch(event) - { - case RECEIVE_NET_PASSWD_EVT: - LOG_ERROR("Received the network passwork"); - break; - case RECEIVE_NET_SSD_EVT: - LOG_ERROR("Received the network SSID"); - break; - default: - break; - } -} -#endif ///BUT_PROFILE_CFG - - -static void ble_server_appRegister(void) -{ - bt_uuid_t uuid; - tBT_UUID t_uuid; - memcpy(&uuid, BASE_UUID, sizeof(bt_uuid_t)); - //memcpy(&uuid, DIS_UUID, sizeof(bt_uuid_t)); - btif_to_bta_uuid(&t_uuid, &uuid); - - LOG_ERROR("register gatts application\n"); - esp_ble_gatts_app_register(&t_uuid, bta_gatts_callback); - - bt_prf_sys_init(); - ble_but_prf_enable(); -} - -void gatts_server_test(void) -{ - BTM_SetTraceLevel(BT_TRACE_LEVEL_DEBUG); - - ble_server_appRegister(); -} diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_md5.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_md5.h deleted file mode 100644 index 6a1e70914..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_md5.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __APP_AIRSYNC_MD5__ -#define __APP_AIRSYNC_MD5__ - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include -#include -#include -#include - -#define SINGLE_ONE_BIT 0x80 -#define BLOCK_SIZE 512 -#define MOD_SIZE 448 -#define APP_SIZE 64 -#define BITS 8 - -// MD5 Chaining Variable -#define A 0x67452301UL -#define B 0xEFCDAB89UL -#define C 0x98BADCFEUL -#define D 0x10325476UL - -typedef struct -{ - char *str; - uint32_t len; -}MD5String; - - -int32_t wechat_md5 ( char *argv, uint8_t *md5_32); - - -#endif ///WX_AIRSYNC_CFG - -#endif /// __APP_AIRSYNC_MD5__ - - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_prf.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_prf.h deleted file mode 100644 index 39d1913dd..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_airsync_prf.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _APP_AIRSYNC_PRF_H__ -#define _APP_AIRSYNC_PRF_H__ - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include "app_wechat_util.h" -#include -#include - -#define MAGIC_NUMBER 0xFE - -/** - **************************************************************************************** - * @brief Create Wechat Database - * - **************************************************************************************** - */ -void app_wechat_create_db(void); - -void app_wechat_SetDatahandler(data_handler* pHandler); -int ble_wechat_indicate_data(uint8_t *data, int len); -int ble_wechat_indicate_data_chunk(void); -void ble_wechat_process_received_data(uint8_t* pData, uint32_t length); -data_handler* app_wechat_datahandler(void); -bool ble_wechat_is_last_data_sent_out(void); - - -#endif ///WX_AIRSYNC_CFG - -#endif ///_APP_AIRSYNC_PRF_H__ - - - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button.h deleted file mode 100644 index dfebee0c3..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button.h +++ /dev/null @@ -1,51 +0,0 @@ - /* - * DEFINES - **************************************************************************************** - */ -#define BUTTON_HEAD (0x01) -#define BUTTON_PRESS_EVT (0x10) - -//the key value enum -enum -{ - Button_Up = 0x01, - Button_Voice = 0x02, - Button_OK = 0x04, - Button_Down = 0x08, - Button_Back = 0x10, -}; - - -typedef struct { - uint8_t key_val; //button val - uint8_t head; //the head of the frame -}key_frame; - - -typedef struct -{ - bool button_press; - key_frame key_msg; -}app_key_env; - - - -extern app_key_env key_press; - -/* - * FUNCTIONS DECLARATION - **************************************************************************************** - */ - - void app_button_init(void); - - void GPIO_isr_callback(void* arg); - - uint8_t check_sum(uint8_t *check_array,uint8_t len); - - void ble_but_prf_enable(void); - - void ble_but_create_svc(void); - - - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button_int.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button_int.h deleted file mode 100644 index 616497bd9..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_button_int.h +++ /dev/null @@ -1,116 +0,0 @@ -#include "prf_defs.h" -#include "bt_prf_sys.h" -#include "bt_types.h" - -#if (BUT_PROFILE_CFG) - -/// Messages for Device Information Service Server -enum -{ - ///Add a BUTTON instance into the database - BLE_BUT_CREATE_DB_REQ_EVT = BT_PRF_SYS_EVT_START(PRF_ID_BUT_LE), - ///Send key value confirm to APP so stable values can be erased - ///if correctly sent. - BLE_BUT_VAL_SEND_CFM_EVT, - ///Set the value of an attribute - BLE_BUT_SET_CHAR_VAL_REQ_EVT, - - ///Start the button notify Service Task - at connection - BLE_BUT_ENABLE_REQ_EVT, - - /// Inform the application that the profile service role task has been disabled after a disconnection - BLE_BUT_DISABLE_IND_EVT, - /// Inform the application that the profile service has been reiceivd the charateristic write commamd from Client - BLE_BUT_CHAR_WRITE_IND_EVT, - ///Error indication to Host - BLE_BUT_ERROR_IND_EVT, -}; - -/// Parameters of the @ref KEY_CREATE_DB_REQ message -typedef struct -{ - ///Database configuration - uint16_t features; -}tBUT_CRT_DB_REQ; - -/// Parameters of the @ref KEY_CREATE_DB_CFM message -typedef struct -{ - ///Status - uint8_t status; -}tBUT_CRT_DB_CFM; - -///Parameters of the @ref key_CFG_INDNTF_IND message -typedef struct -{ - ///Connection handle - uint16_t conhdl; - ///Stop/notify/indicate value to configure into the peer characteristic - uint16_t cfg_val; - /// characteristics - uint8_t char_code; -}tBUT_CFG_NTF_IND; - - -/// Parameters of the @ref KEY_SET_CHAR_VAL_REQ message - shall be dynamically allocated -typedef struct -{ - /// Characteristic Code - //uint8_t char_code; - uint8_t conhdl; - uint8_t key_val_len; - uint8_t key_val[2]; -}tBUT_SND_CHAR_VAL_REQ; - -/// Parameters of the @ref KEY_ENABLE_REQ message -typedef struct -{ - ///Connection handle - uint16_t conhdl; - /// security level: b0= nothing, b1=unauthenticated, b2=authenticated, b3=authorized; b1 or b2 and b3 can go together - uint8_t sec_lvl; - ///Type of connection - uint8_t con_type; -}tBUT_ENABLE_REQ; - -///Parameters of the @ref KEY_VAL_SEND_CFM message -typedef struct -{ - ///Connection handle - uint16_t conhdl; - ///Status - uint8_t status; -}tBUT_VAL_SND_CFM; - - -/// Parameters of the @ref KEY_DISABLE_IND message -typedef struct -{ - ///Connection handle - uint16_t conhdl; -}tBUT_DISABLE_IND; - -typedef union -{ - uint16_t conhdl; - tBUT_CRT_DB_REQ but_crt_db_req; - tBUT_CRT_DB_CFM but_crt_db_cfm; - tBUT_CFG_NTF_IND but_cfg_ntf_ind; - tBUT_SND_CHAR_VAL_REQ but_snd_char_val_req; - tBUT_ENABLE_REQ but_enable_req; - tBUT_VAL_SND_CFM but_val_snd_cfm; - tBUT_DISABLE_IND but_disable_ind; -}tBUT_PRF_MSG; - - - -BOOLEAN ble_but_prf_hdl_event(prf_hdr_evt_t *msg_data); - -void ble_but_prf_disable(void); - - - -#endif ///BUT_PROFILE_CFG - - - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_wechat_util.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_wechat_util.h deleted file mode 100644 index 3b048c3f1..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/app_wechat_util.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __APP_WECHAT_UTIL_H__ -#define __APP_WECHAT_UTIL_H__ - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) -#include -#include - -#define PRODUCT_TYPE_UNKNOWN 0 -#define PRODUCT_TYPE_MPBLEDEMO2 1 - -typedef void (*data_produce_func)(void *args, uint8_t **r_data, uint32_t *r_len); -typedef void (*data_free_func)(uint8_t *data, uint32_t len); -typedef int (*data_consume_func)(uint8_t *data, uint32_t len); -typedef void (*data_error_func)(int error_code); - -typedef int32_t (*data_button_handler_func)(uint8_t pin_no); -typedef void (*data_main_process_func)(void); -typedef int32_t (*data_init_func)(void); -typedef int32_t (*data_init_peripheral_func)(void); - -typedef struct data_handler{ - int m_product_type; - data_produce_func m_data_produce_func; - data_free_func m_data_free_func; - data_consume_func m_data_consume_func; - data_error_func m_data_error_func; - data_init_peripheral_func m_data_init_peripheral_func; - data_init_func m_data_init_func; - data_main_process_func m_data_main_process_func; - data_button_handler_func m_data_button_handler_func; - void *m_data_produce_args; - struct data_handler *next; -} data_handler; - -extern data_handler first_handler; - -#define REGISTER(NAME) \ - do { \ - data_handler *tmp = &NAME##_data_handler; \ - tmp->next = first_handler.next; \ - first_handler.next = tmp; \ - } while(0) - -#define ARGS_ITEM_SET(ARGS_TYPE, ARGS_POINTER, ITEM_NAME, ITEM_VALUE) \ - do { \ - ARGS_TYPE *tmp = (ARGS_TYPE *)(ARGS_POINTER); \ - tmp->ITEM_NAME = (ITEM_VALUE); \ - } while(0) - - -typedef struct -{ - unsigned char bMagicNumber; - unsigned char bVer; - unsigned short nLength; - unsigned short nCmdId; - unsigned short nSeq; -} BpFixHead; - -/* - * TYPE DEFINITIONS - **************************************************************************************** - */ - -typedef struct -{ - uint8_t *data; - uint16_t len; - uint16_t offset; -} data_info; - -data_handler* get_handler_by_type(int type); -unsigned short htons(unsigned short val); -unsigned short ntohs(unsigned short val); -unsigned long t_htonl(unsigned long h); -unsigned long t_ntohl(unsigned long n); - -void wechat_error_chack(data_handler *p_data_handler, int error_code); -void data_handler_init(data_handler** p_data_handler, uint8_t product_type); - -#endif ///WX_AIRSYNC_CFG - -#endif ///__APP_WECHAT_UTIL_H__ - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/bt_app_common.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/bt_app_common.h deleted file mode 100644 index d0eb314bb..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/bt_app_common.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __BT_APP_COMMON_H__ -#define __BT_APP_COMMON_H__ - -#include -#include "osi.h" -#include "bt_common_types.h" -#include "bt_defs.h" - -/* BT APP Events */ -#define BT_EVT_APP (0xB000) -#define BT_EVT_APP_CONTEXT_SWITCH (0x0001 | BT_EVT_APP) - -typedef void (tBTAPP_CBACK) (uint16_t event, char *p_param); -typedef void (tBTAPP_COPY_CBACK) (uint16_t event, char *p_dest, char *p_src); - -typedef struct -{ - BT_HDR hdr; - tBTAPP_CBACK* p_cb; /* context switch callback */ - - /* parameters passed to callback */ - UINT16 event; /* message event id */ - char p_param[0]; /* parameter area needs to be last */ -} tBTAPP_CONTEXT_SWITCH_CBACK; - -bt_status_t bt_app_transfer_context (tBTAPP_CBACK *p_cback, UINT16 event, char* p_params, int param_len, tBTAPP_COPY_CBACK *p_copy_cback); - -void bt_app_init_ok(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param); - -void bt_app_task_start_up(void); -#endif /* __BT_APP_COMMON_H__ */ diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb.h deleted file mode 100644 index b9d031d39..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb.h +++ /dev/null @@ -1,117 +0,0 @@ -// epb.h -// MicroMessenger -// -// Created by harlliu@tencent.com on 14-02-15. -// Copyright 2014 Tencent. All rights reserved. -// - -// Version : 1.0.2 - -#ifndef __EPB_H__ -#define __EPB_H__ - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include -#include - -typedef struct -{ - uint8_t *data; - int len; -} Bytes; - -typedef struct -{ - const uint8_t *data; - int len; -} CBytes; - -typedef struct -{ - char *str; - int len; -} String; - -typedef struct -{ - const char *str; - int len; -} CString; - -typedef uint8_t Message; - -typedef struct -{ - const uint8_t *unpack_buf; - uint8_t *pack_buf; - int buf_len; - int buf_offset; -} Epb; - -/* - * embeded protobuf unpack functions - */ - -void epb_unpack_init(Epb *e, const uint8_t *buf, int len); -bool epb_has_tag(Epb *e, uint16_t tag); - -//Varint -int32_t epb_get_int32(Epb *e, uint16_t tag); -uint32_t epb_get_uint32(Epb *e, uint16_t tag); -int32_t epb_get_sint32(Epb *e, uint16_t tag); -bool epb_get_bool(Epb *e, uint16_t tag); -int epb_get_enum(Epb *e, uint16_t tag); - -//Length Delimited -const char *epb_get_string(Epb *e, uint16_t tag, int *len); -const uint8_t *epb_get_bytes(Epb *e, uint16_t tag, int *len); -const Message *epb_get_message(Epb *e, uint16_t tag, int *len); - -//Length Delimited Packed Repeadted Field -//TODO - -//Fixed32 -uint32_t epb_get_fixed32(Epb *e, uint16_t tag); -int32_t epb_get_sfixed32(Epb *e, uint16_t tag); -float epb_get_float(Epb *e, uint16_t tag); - -/* - * embeded protobuf pack functions - */ - -void epb_pack_init(Epb *e, uint8_t *buf, int len); -int epb_get_packed_size(Epb *e); - -//Varint -int epb_set_int32(Epb *e, uint16_t tag, int32_t value); -int epb_set_uint32(Epb *e, uint16_t tag, uint32_t value); -int epb_set_sint32(Epb *e, uint16_t tag, int32_t value); -int epb_set_bool(Epb *e, uint16_t tag, bool value); -int epb_set_enum(Epb *e, uint16_t tag, int value); - -//Length Delimited -int epb_set_string(Epb *e, uint16_t tag, const char *data, int len); -int epb_set_bytes(Epb *e, uint16_t tag, const uint8_t *data, int len); -int epb_set_message(Epb *e, uint16_t tag, const Message *data, int len); - -//Length Delimited Packed Repeadted Field -//TODO - -//Fixed32 -int epb_set_fixed32(Epb *e, uint16_t tag, uint32_t value); -int epb_set_sfixed32(Epb *e, uint16_t tag, int32_t value); -int epb_set_float(Epb *e, uint16_t tag, float value); - -//Pack size -int epb_varint32_pack_size(uint16_t tag, uint32_t value, bool is_signed); -int epb_fixed32_pack_size(uint16_t tag); -int epb_length_delimited_pack_size(uint16_t tag, int len); - - -#endif ///WX_AIRSYNC_CFG - -#endif ///__EPB_H__ - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb_mmbp.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb_mmbp.h deleted file mode 100644 index 293b95183..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/epb_mmbp.h +++ /dev/null @@ -1,248 +0,0 @@ -// epb_MmBp.h -// WeChat Embedded Proto Buffer -// -// Generated by harlliu@tencent.com on 14-11-26. -// Copyright 2014 Tencent. All rights reserved. -// - -// Version : 1.0.4 - -#ifndef __EPB_MMBP_H__ -#define __EPB_MMBP_H__ - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - - -#include "epb.h" - -typedef enum -{ - ECI_none = 0, - ECI_req_auth = 10001, - ECI_req_sendData = 10002, - ECI_req_init = 10003, - ECI_resp_auth = 20001, - ECI_resp_sendData = 20002, - ECI_resp_init = 20003, - ECI_push_recvData = 30001, - ECI_push_switchView = 30002, - ECI_push_switchBackgroud = 30003, - ECI_err_decode = 29999 -} EmCmdId; - -typedef enum -{ - EEC_system = -1, - EEC_needAuth = -2, - EEC_sessionTimeout = -3, - EEC_decode = -4, - EEC_deviceIsBlock = -5, - EEC_serviceUnAvalibleInBackground = -6, - EEC_deviceProtoVersionNeedUpdate = -7, - EEC_phoneProtoVersionNeedUpdate = -8, - EEC_maxReqInQueue = -9, - EEC_userExitWxAccount = -10 -} EmErrorCode; - -typedef enum -{ - EAM_md5 = 1, - EAM_macNoEncrypt = 2 -} EmAuthMethod; - -typedef enum -{ - EIRFF_userNickName = 0x1, - EIRFF_platformType = 0x2, - EIRFF_model = 0x4, - EIRFF_os = 0x8, - EIRFF_time = 0x10, - EIRFF_timeZone = 0x20, - EIRFF_timeString = 0x40 -} EmInitRespFieldFilter; - -typedef enum -{ - EIS_deviceChat = 1, - EIS_autoSync = 2 -} EmInitScence; - -typedef enum -{ - EPT_ios = 1, - EPT_andriod = 2, - EPT_wp = 3, - EPT_s60v3 = 4, - EPT_s60v5 = 5, - EPT_s40 = 6, - EPT_bb = 7 -} EmPlatformType; - -typedef enum -{ - EDDT_manufatureSvr = 0, - EDDT_wxWristBand = 1, - EDDT_wxDeviceHtmlChatView = 10001 -} EmDeviceDataType; - -typedef enum -{ - ESVO_enter = 1, - ESVO_exit = 2 -} EmSwitchViewOp; - -typedef enum -{ - EVI_deviceChatView = 1, - EVI_deviceChatHtmlView = 2 -} EmViewId; - -typedef enum -{ - ESBO_enterBackground = 1, - ESBO_enterForground = 2, - ESBO_sleep = 3 -} EmSwitchBackgroundOp; - -typedef struct -{ - void *none; -} BaseRequest; - -typedef struct -{ - int32_t err_code; - bool has_err_msg; - CString err_msg; -} BaseResponse; - -typedef struct -{ - void *none; -} BasePush; - -typedef struct -{ - BaseRequest *base_request; - bool has_md5_device_type_and_device_id; - Bytes md5_device_type_and_device_id; - int32_t proto_version; - int32_t auth_proto; - EmAuthMethod auth_method; - bool has_aes_sign; - Bytes aes_sign; - bool has_mac_address; - Bytes mac_address; - bool has_time_zone; - String time_zone; - bool has_language; - String language; - bool has_device_name; - String device_name; -} AuthRequest; - -typedef struct -{ - BaseResponse *base_response; - CBytes aes_session_key; -} AuthResponse; - -typedef struct -{ - BaseRequest *base_request; - bool has_resp_field_filter; - Bytes resp_field_filter; - bool has_challenge; - Bytes challenge; -} InitRequest; - -typedef struct -{ - BaseResponse *base_response; - uint32_t user_id_high; - uint32_t user_id_low; - bool has_challeange_answer; - uint32_t challeange_answer; - bool has_init_scence; - EmInitScence init_scence; - bool has_auto_sync_max_duration_second; - uint32_t auto_sync_max_duration_second; - bool has_user_nick_name; - CString user_nick_name; - bool has_platform_type; - EmPlatformType platform_type; - bool has_model; - CString model; - bool has_os; - CString os; - bool has_time; - int32_t time; - bool has_time_zone; - int32_t time_zone; - bool has_time_string; - CString time_string; -} InitResponse; - -typedef struct -{ - BaseRequest *base_request; - Bytes data; - bool has_type; - EmDeviceDataType type; -} SendDataRequest; - -typedef struct -{ - BaseResponse *base_response; - bool has_data; - CBytes data; -} SendDataResponse; - -typedef struct -{ - BasePush *base_push; - CBytes data; - bool has_type; - EmDeviceDataType type; -} RecvDataPush; - -typedef struct -{ - BasePush *base_push; - EmSwitchViewOp switch_view_op; - EmViewId view_id; -} SwitchViewPush; - -typedef struct -{ - BasePush *base_push; - EmSwitchBackgroundOp switch_background_op; -} SwitchBackgroudPush; - -BaseResponse *epb_unpack_base_response(const uint8_t *buf, int buf_len); -void epb_unpack_base_response_free(BaseResponse *response); -int epb_auth_request_pack_size(AuthRequest *request); -int epb_pack_auth_request(AuthRequest *request, uint8_t *buf, int buf_len); -AuthResponse *epb_unpack_auth_response(const uint8_t *buf, int buf_len); -void epb_unpack_auth_response_free(AuthResponse *response); -int epb_init_request_pack_size(InitRequest *request); -int epb_pack_init_request(InitRequest *request, uint8_t *buf, int buf_len); -InitResponse *epb_unpack_init_response(const uint8_t *buf, int buf_len); -void epb_unpack_init_response_free(InitResponse *response); -int epb_send_data_request_pack_size(SendDataRequest *request); -int epb_pack_send_data_request(SendDataRequest *request, uint8_t *buf, int buf_len); -SendDataResponse *epb_unpack_send_data_response(const uint8_t *buf, int buf_len); -void epb_unpack_send_data_response_free(SendDataResponse *response); -RecvDataPush *epb_unpack_recv_data_push(const uint8_t *buf, int buf_len); -void epb_unpack_recv_data_push_free(RecvDataPush *push); -SwitchViewPush *epb_unpack_switch_view_push(const uint8_t *buf, int buf_len); -void epb_unpack_switch_view_push_free(SwitchViewPush *push); -SwitchBackgroudPush *epb_unpack_switch_backgroud_push(const uint8_t *buf, int buf_len); -void epb_unpack_switch_backgroud_push_free(SwitchBackgroudPush *push); - - -#endif ///WX_AIRSYNC_CFG - -#endif ///__EPB_MMBP_H__ - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/gattc_profile.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/gattc_profile.h deleted file mode 100644 index 95b82c909..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/gattc_profile.h +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2013 Broadcom Corporation - * - * 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. - * - ******************************************************************************/ - -/******************************************************************************* -** -** Header file for gatt client. -** -********************************************************************************/ - -#include "bt_target.h" -#include "gatt_api.h" -#include "gattdefs.h" - -/******************************************************************************* -** BATTERY CLIENT API -*******************************************************************************/ -/*************************************************************** -** -** Function bac_register -** -** Description register app for battery service -** -****************************************************************/ -extern void bac_register(void); - -extern void gattc_client_test(void); -#ifdef __cplusplus - -} -#endif - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/mpbledemo2.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/mpbledemo2.h deleted file mode 100644 index 0a48058d4..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/mpbledemo2.h +++ /dev/null @@ -1,140 +0,0 @@ - -#ifndef __MPBLEDEMO2_H__ -#define __MPBLEDEMO2_H__ - -#include "prf_defs.h" - -#if (WX_AIRSYNC_CFG) - - -#include -#include -#include -#include -#include -#include "epb_MmBp.h" -#include "app_airsync_prf.h" - -#define CMD_NULL 0 -#define CMD_AUTH 1 -#define CMD_INIT 2 -#define CMD_SENDDAT 3 - -#define DEVICE_TYPE "gh_b57f1be552dd" -#define DEVICE_ID "gh_b57f1be552dd_8ecc3b117f8c05112638289b0952c797" //"wechat_dialog" -#define PROTO_VERSION 0x010004 -#define AUTH_PROTO 1 - -#define MAC_ADDRESS_LENGTH 6 - -//#define EAM_md5AndNoEnrypt 1 -#define EAM_md5AndAesEnrypt 1 -//#define EAM_macNoEncrypt 2 - -#define DEVICE_KEY {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; - -#ifdef EAM_macNoEncrypt - #define AUTH_METHOD EAM_macNoEncrypt - #define MD5_TYPE_AND_ID_LENGTH 0 - #define CIPHER_TEXT_LENGTH 0 -#endif - -#ifdef EAM_md5AndAesEnrypt - #define AUTH_METHOD EAM_md5AndAesEnrypt - #define MD5_TYPE_AND_ID_LENGTH 16 - #define CIPHER_TEXT_LENGTH 16 -#endif -#ifdef EAM_md5AndNoEnrypt - #define AUTH_METHOD EAM_md5AndNoEnrypt - #define MD5_TYPE_AND_ID_LENGTH 16 - #define CIPHER_TEXT_LENGTH 0 -#endif - -#define CHALLENAGE_LENGTH 4 - -#define MPBLEDEMO2_MAGICCODE_H 0xfe -#define MPBLEDEMO2_MAGICCODE_L 0xcf -#define MPBLEDEMO2_VERSION 0x01 -#define SEND_HELLO_WECHAT "Hello, WeChat!" - -/* Hardware Resources define */ -#define MPBLEDEMO2_LIGHT 19 -#define MPBLEDEMO2_BUTTON_1 17 - -typedef enum -{ - errorCodeUnpackAuthResp = 0x9990, - errorCodeUnpackInitResp = 0x9991, - errorCodeUnpackSendDataResp = 0x9992, - errorCodeUnpackCtlCmdResp = 0x9993, - errorCodeUnpackRecvDataPush = 0x9994, - errorCodeUnpackSwitchViewPush = 0x9995, - errorCodeUnpackSwitchBackgroundPush = 0x9996, - errorCodeUnpackErrorDecode = 0x9997, -} mpbledemo2UnpackErrorCode; - -typedef enum -{ - errorCodeProduce = 0x9980, -} mpbledemo2PackErrorCode; - - -// command ID between device and vendor server -typedef enum -{ - sendTextReq = 0x01, - - sendTextResp = 0x1001, - openLightPush = 0x2001, - closeLightPush = 0x2002, -} BleDemo2CmdID; - -typedef struct -{ - uint8_t m_magicCode[2]; - uint16_t m_version; - uint16_t m_totalLength; - uint16_t m_cmdid; - uint16_t m_seq; - uint16_t m_errorCode; -} BlueDemoHead; - -typedef struct -{ - int cmd; - CString send_msg; -} mpbledemo2_info; - - typedef struct -{ - bool wechats_switch_state; //˺лǰ̨״̬ - bool indication_state; - bool auth_state; - bool init_state; - bool auth_send; - bool init_send; - unsigned short send_data_seq; - unsigned short push_data_seq; - unsigned short seq; -}mpbledemo2_state; - -typedef void (*mpbledemo2_handler_func)(uint8_t *ptrData, uint32_t lengthInByte); - -typedef struct -{ - BleDemo2CmdID commandCode; - mpbledemo2_handler_func handler; -} MPBLEDEMO2_RECEIVED_CMD_HANDLER_T; - -extern data_handler mpbledemo2_data_handler; -extern data_handler *m_mpbledemo2_handler; - -extern void mpbledemo2_reset(void); -extern void mpbledemo2_indication_state(bool isEnable); -extern int32_t mpbledemo2_sendData(uint8_t* ptrData, uint32_t lengthInByte); - - -#endif ///WX_AIRSYNC_CFG - -#endif ///__MPBLEDEMO2_H__ - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechar_crc.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechar_crc.h deleted file mode 100644 index 9dbe22241..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechar_crc.h +++ /dev/null @@ -1,29 +0,0 @@ -// crc32.h -// WeChat Embedded -// -// Created by harlliu on 14-03-03. -// Copyright 2014 Tencent. All rights reserved. -// - -#ifndef __CRC32_H__ -#define __CRC32_H__ - - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - -#include - -#ifdef __cplusplus -extern "C" { -#endif -uint32_t crc32(uint32_t crc, const uint8_t *buf, int len); - -#ifdef __cplusplus -} -#endif ///__cplusplus - -#endif ///WX_AIRSYNC_CFG - -#endif ///__CRC32_H__ - diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechat_aes.h b/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechat_aes.h deleted file mode 100644 index c663b326c..000000000 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/include/wechat_aes.h +++ /dev/null @@ -1,73 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// AES.h -// AES㷨 -// ˣLiangbofu -// ڣ2009-07-17 -/////////////////////////////////////////////////////////////////////////////// -#ifndef __WECHAT_AES_H -#define __WECHAT_AES_H - -#include "prf_defs.h" -#if (WX_AIRSYNC_CFG) - -#ifdef __cplusplus - extern "C" { -#endif - -// bitΪλԿȣֻΪ 128192 256 -#define AES_KEY_LENGTH 128 - -// ӽģʽ -#define AES_MODE_ECB 0 // 뱾ģʽһģʽ -#define AES_MODE_CBC 1 // ģʽ -#define AES_MODE AES_MODE_CBC - - -/////////////////////////////////////////////////////////////////////////////// -// AES_Init -// ʼڴִչԿ -// pKey -- ԭʼԿ䳤ȱΪ AES_KEY_LENGTH/8 ֽڡ -// ޡ -// ֵ ޡ -/////////////////////////////////////////////////////////////////////////////// -void AES_Init(const void *pKey); - -////////////////////////////////////////////////////////////////////////// -// AES_Encrypt -// -// pPlainText -- ģܵݣ䳤ΪnDataLenֽڡ -// nDataLen -- ݳȣֽΪλΪAES_KEY_LENGTH/8 -// pIV -- ʼʹECBģʽΪNULL -// pCipherText -- ģļܺݣpPlainTextͬ -// ֵ ޡ -////////////////////////////////////////////////////////////////////////// -void AES_Encrypt(const unsigned char *pPlainText, unsigned char *pCipherText, - unsigned int nDataLen, const unsigned char *pIV); - -////////////////////////////////////////////////////////////////////////// -// AES_Decrypt -// -// pCipherText -- ģܵݣ䳤ΪnDataLenֽڡ -// nDataLen -- ݳȣֽΪλΪAES_KEY_LENGTH/8 -// pIV -- ʼʹECBģʽΪNULL -// pPlainText -- ģĽܺݣpCipherTextͬ -// ֵ ޡ -////////////////////////////////////////////////////////////////////////// -void AES_Decrypt(unsigned char *pPlainText, const unsigned char *pCipherText, - unsigned int nDataLen, const unsigned char *pIV); - -//ݽнܲɹ1ʧܷ0 -unsigned char app_data_encode_aes(char *input, char *output, unsigned short *slen); -unsigned char app_data_decode_aes(unsigned char *input, char *output, unsigned short *slen); -unsigned int AES_Encrypt_PKCS7(const unsigned char *pPlainText, unsigned char *pCipherText, - unsigned int nDataLen, const unsigned char *pIV); -unsigned int AES_get_length(unsigned int length); -void AES_free(unsigned char* p); -#ifdef __cplusplus - } -#endif ///__cplusplus - -#endif ///WX_AIRSYNC_CFG - -#endif // __WECHAT_AES_H - diff --git a/examples/06_sntp/Makefile b/examples/06_sntp/Makefile new file mode 100644 index 000000000..e6ef17be1 --- /dev/null +++ b/examples/06_sntp/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := sntp + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/06_sntp/README.md b/examples/06_sntp/README.md new file mode 100644 index 000000000..c5a153bbb --- /dev/null +++ b/examples/06_sntp/README.md @@ -0,0 +1,41 @@ +# Example: using LwIP SNTP module and time functions + +This example demonstrates the use of LwIP SNTP module to obtain time from Internet servers. See the README.md file in the upper level 'examples' directory for more information about examples. + +## Obtaining time using LwIP SNTP module + +When this example boots first time after ESP32 is reset, it connects to WiFi and obtains time using SNTP. +See `initialize_sntp` function for details. + +## Timekeeping + +Once time is synchronized, ESP32 will perform timekeeping using built-in timers. + +- RTC clock is used to maintain accurate time when chip is in deep sleep mode + +- FRC1 timer is used to provide time at microsecond accuracy when ESP32 is running. + +Timekeeping using RTC timer is demonstrated in this example by going into deep sleep mode. After wake up, ESP32 will print current time without connecting to WiFi. + +To use this functionality, make sure "Timers used for gettimeofday function" option in "ESP32-specific config" menu of menuconfig is set to "RTC and FRC1" or "RTC". + +## Working with time + +To get current time, [`gettimeofday`](http://man7.org/linux/man-pages/man2/gettimeofday.2.html) function may be used. Additionally the following [standard C library functions](http://en.cppreference.com/w/cpp/header/ctime) can be used to obtain time and manipulate it: + + gettimeofday + time + asctime + clock + ctime + difftime + gmtime + localtime + mktime + strftime + +To set time, [`settimeofday`](http://man7.org/linux/man-pages/man2/settimeofday.2.html) POSIX function can be used. It is used internally in LwIP SNTP library to set current time when response from NTP server is received. + +## Timezones + +To set local timezone, use [`setenv`](http://man7.org/linux/man-pages/man3/setenv.3.html) and [`tzset`](http://man7.org/linux/man-pages/man3/tzset.3.html) POSIX functions. First, call `setenv` to set `TZ` environment variable to the correct value depending on device location. Format of the time string is described in [libc documentation](https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html). Next, call `tzset` to update C library runtime data for the new time zone. Once these steps are done, `localtime` function will return correct local time, taking time zone offset and daylight saving time into account. diff --git a/examples/06_sntp/main/Kconfig.projbuild b/examples/06_sntp/main/Kconfig.projbuild new file mode 100644 index 000000000..c5d5523a9 --- /dev/null +++ b/examples/06_sntp/main/Kconfig.projbuild @@ -0,0 +1,17 @@ +menu "Example Configuration" + +config WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the example to connect to. + +config WIFI_PASSWORD + string "WiFi Password" + default "myssid" + help + WiFi password (WPA or WPA2) for the example to use. + + Can be left blank if the network has no security set. + +endmenu \ No newline at end of file diff --git a/examples/06_sntp/main/component.mk b/examples/06_sntp/main/component.mk new file mode 100644 index 000000000..a98f634ea --- /dev/null +++ b/examples/06_sntp/main/component.mk @@ -0,0 +1,4 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/06_sntp/main/sntp_main.c b/examples/06_sntp/main/sntp_main.c new file mode 100644 index 000000000..83f33b965 --- /dev/null +++ b/examples/06_sntp/main/sntp_main.c @@ -0,0 +1,162 @@ +/* LwIP SNTP example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event_loop.h" +#include "esp_log.h" +#include "esp_attr.h" +#include "esp_deepsleep.h" +#include "nvs_flash.h" + +#include "lwip/err.h" +#include "apps/sntp/sntp.h" + +/* The examples use simple WiFi configuration that you can set via + 'make menuconfig'. + + If you'd rather not, just change the below entries to strings with + the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" +*/ +#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID +#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD + +/* FreeRTOS event group to signal when we are connected & ready to make a request */ +static EventGroupHandle_t wifi_event_group; + +/* The event group allows multiple bits for each event, + but we only care about one event - are we connected + to the AP with an IP? */ +const int CONNECTED_BIT = BIT0; + +static const char *TAG = "example"; + +/* Variable holding number of times ESP32 restarted since first boot. + * It is placed into RTC memory using RTC_DATA_ATTR and + * maintains its value when ESP32 wakes from deep sleep. + */ +RTC_DATA_ATTR static int boot_count = 0; + +static void obtain_time(void); +static void initialize_sntp(void); +static void initialise_wifi(void); +static esp_err_t event_handler(void *ctx, system_event_t *event); + + +void app_main() +{ + ++boot_count; + ESP_LOGI(TAG, "Boot count: %d", boot_count); + + time_t now; + struct tm timeinfo; + time(&now); + localtime_r(&now, &timeinfo); + // Is time set? If not, tm_year will be (1970 - 1900). + if (timeinfo.tm_year < (2016 - 1900)) { + ESP_LOGI(TAG, "Time is not set yet. Connecting to WiFi and getting time over NTP."); + obtain_time(); + // update 'now' variable with current time + time(&now); + } + char strftime_buf[64]; + + // Set timezone to Eastern Standard Time and print local time + setenv("TZ", "EST5EDT,M3.2.0/2,M11.1.0", 1); + tzset(); + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time in New York is: %s", strftime_buf); + + // Set timezone to China Standard Time + setenv("TZ", "CST-8CDT-9,M4.2.0/2,M9.2.0/3", 1); + tzset(); + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf); + + const int deep_sleep_sec = 10; + ESP_LOGI(TAG, "Entering deep sleep for %d seconds", deep_sleep_sec); + system_deep_sleep(1000000LL * deep_sleep_sec); +} + +static void obtain_time(void) +{ + nvs_flash_init(); + initialise_wifi(); + xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, + false, true, portMAX_DELAY); + initialize_sntp(); + + // wait for time to be set + time_t now = 0; + struct tm timeinfo = { 0 }; + int retry = 0; + const int retry_count = 10; + while(timeinfo.tm_year < (2016 - 1900) && ++retry < retry_count) { + ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count); + vTaskDelay(2000 / portTICK_PERIOD_MS); + time(&now); + localtime_r(&now, &timeinfo); + } +} + +static void initialize_sntp(void) +{ + ESP_LOGI(TAG, "Initializing SNTP"); + sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_setservername(0, "pool.ntp.org"); + sntp_init(); +} + +static void initialise_wifi(void) +{ + tcpip_adapter_init(); + wifi_event_group = xEventGroupCreate(); + ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) ); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); + ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_WIFI_SSID, + .password = EXAMPLE_WIFI_PASS, + }, + }; + ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid); + ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + ESP_ERROR_CHECK( esp_wifi_start() ); +} + +static esp_err_t event_handler(void *ctx, system_event_t *event) +{ + switch(event->event_id) { + case SYSTEM_EVENT_STA_START: + esp_wifi_connect(); + break; + case SYSTEM_EVENT_STA_GOT_IP: + xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + /* This is a workaround as ESP32 WiFi libs don't currently + auto-reassociate. */ + esp_wifi_connect(); + xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); + break; + default: + break; + } + return ESP_OK; +} diff --git a/examples/07_blufi/components/blufi/blufi.c b/examples/07_blufi/components/blufi/blufi.c deleted file mode 100644 index 057a5c413..000000000 --- a/examples/07_blufi/components/blufi/blufi.c +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2015-2016 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. - -/*************************************************************** -* -* This file is for gatt server device. It instantiates BATTERY -* sevice. It can be scanned and connected by central device, -* and the client will get the BAS value. It calls the API bta -* layer provides. -* -****************************************************************/ - -#include -#include -#include -#include - -#include "bta_api.h" -#include "bta_gatt_api.h" -#include "controller.h" - -#include "gatt_int.h" -#include "bt_trace.h" -#include "btm_api.h" -#include "bt_types.h" -#include "dis_api.h" - -#include "blufi_prf.h" -#include "hid_le_prf.h" -#include "prf_defs.h" -#include "hcimsgs.h" - -#include "blufi.h" -#include "blufi_adv.h" - -#include "esp_bt_common.h" - -static void BlufiDataCallBack(UINT8 app_id, UINT8 event, UINT8 len, UINT8 *p_data); - -struct dm_evt { - tBTA_DM_SEC_EVT event; - tBTA_DM_SEC* p_data; -}; - -#define HEADER_SSID "ssid" -#define HEADER_PASSWD "passwd" -#define HEADER_CONFIRM "confirm" -extern void wifi_set_blue_config(char *ssid, char *passwd); -static char tmp_ssid[33]; -static char tmp_passwd[33]; - -static void BlufiDataCallBack(UINT8 app_id, UINT8 event, UINT8 len, UINT8 *p_data) -{ - char *p = NULL; - LOG_DEBUG("the data is:%s\n", p_data); -#if 0 - switch(event) - { - case RECEIVE_NET_PASSWD_EVT: - LOG_ERROR("Received the network passwork"); - break; - case RECEIVE_NET_SSD_EVT: - LOG_ERROR("Received the network SSID"); - break; - default: - break; - } -#endif - p = strstr(p_data, HEADER_SSID); - if (p) { - LOG_ERROR("SSID: %s\n", p+strlen(HEADER_SSID)+1); - strcpy(tmp_ssid, p+strlen(HEADER_SSID)+1); - } - p = strstr(p_data, HEADER_PASSWD); - if (p) { - LOG_ERROR("PASSWORD: %s\n", p+strlen(HEADER_PASSWD)+1); - strcpy(tmp_passwd, p+strlen(HEADER_PASSWD)+1); - } - p = strstr(p_data, HEADER_CONFIRM); - if (p) { - LOG_ERROR("CONFIRM\n"); - wifi_set_blue_config(tmp_ssid, tmp_passwd); - } - -} - -static esp_err_t blufi_dm_upstreams_evt(void *arg) -{ - struct dm_evt *evt = (struct dm_evt *)arg; - - tBTA_DM_SEC *p_data = (tBTA_DM_SEC*)evt->p_data; - switch (evt->event) { - case BTA_DM_ENABLE_EVT: { - /*set connectable,discoverable, pairable and paired only modes of local device*/ - tBTA_DM_DISC disc_mode = BTA_DM_BLE_GENERAL_DISCOVERABLE; - tBTA_DM_CONN conn_mode = BTA_DM_BLE_CONNECTABLE; - BTA_DmSetVisibility(disc_mode, conn_mode, (uint8_t)BTA_DM_NON_PAIRABLE, (uint8_t)BTA_DM_CONN_ALL ); - -#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) - /* Enable local privacy */ - //BTA_DmBleConfigLocalPrivacy(BLE_LOCAL_PRIVACY_ENABLED); - do { - const controller_t *controller = controller_get_interface(); - char bdstr[18]; - bdaddr_to_string(controller->get_address(), bdstr, sizeof(bdstr)); - LOG_DEBUG("BDA is: %s\n", bdstr); - } while (0); -#endif - blufi_profile_init(BlufiDataCallBack); - break; - default: - break; - } - } - - GKI_freebuf(evt); - - return ESP_OK; -} - - -void blufi_bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) -{ - struct dm_evt *evt; - - LOG_DEBUG("%s: %d\n", __func__, (uint16_t)event); - - evt = (struct dm_evt *)GKI_getbuf(sizeof(struct dm_evt)); - if (evt == NULL) - return; - - evt->event = event; - evt->p_data = p_data; - - blufi_transfer_context(blufi_dm_upstreams_evt, evt); -} - -esp_err_t blufi_enable(void *arg) -{ - esp_err_t err; - - BTM_SetTraceLevel(BT_TRACE_LEVEL_ERROR); - - err = esp_enable_bluetooth(blufi_bte_dm_evt); - vTaskDelay(1000 / portTICK_PERIOD_MS); - - return err; -} - -esp_err_t blufi_disable(void *arg) -{ - esp_err_t err; - - err = esp_disable_bluetooth(); - - if (arg) { - ((void (*)(void))arg)(); - } - - return err; -} diff --git a/examples/07_blufi/components/blufi/include/blufi.h b/examples/07_blufi/components/blufi/include/blufi.h deleted file mode 100644 index abccc144a..000000000 --- a/examples/07_blufi/components/blufi/include/blufi.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __BT_APP_COMMON_H__ -#define __BT_APP_COMMON_H__ - -#include -#include "osi.h" -#include "bt_common_types.h" -#include "esp_err.h" - -enum BLUFI_SIG { - BLUFI_SIG_SWITCH_CONTEXT = 0, - BLUFI_SIG_ENABLE, - BLUFI_SIG_DISABLE, -}; - -typedef esp_err_t (*blufi_task_cb_t)(void *arg); - -void blufi_init(void); -void blufi_deinit(void); - -esp_err_t blufi_enable(void *arg); -esp_err_t blufi_disable(void *arg); - -esp_err_t blufi_transfer_context(blufi_task_cb_t cb, void *arg); - -#endif /* __BT_APP_COMMON_H__ */ diff --git a/examples/07_nvs_rw_value/Makefile b/examples/07_nvs_rw_value/Makefile new file mode 100644 index 000000000..fdfc09c57 --- /dev/null +++ b/examples/07_nvs_rw_value/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := nvs-rw-value + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/07_nvs_rw_value/README.md b/examples/07_nvs_rw_value/README.md new file mode 100644 index 000000000..09cd364e8 --- /dev/null +++ b/examples/07_nvs_rw_value/README.md @@ -0,0 +1,13 @@ +# Non-Volatile Storage (NVS) Read and Write Example + +Demonstrates how to read and write a single integer value using NVS. + +The value holds the number of ESP32 module restarts. Since it is written to NVS, the value is preserved between restarts. + +Example also shows how to check if read / write operation was successful, or certain value is not initialized in NVS. Diagnostic is provided in plain text to help track program flow and capture any issues on the way. + +Check another example *08_nvs_rw_blob*, that shows how to read and write variable length binary data (blob). + +Detailed functional description of NVS and API is provided in [documentation](http://esp-idf.readthedocs.io/en/latest/api/nvs_flash.html). + +See the README.md file in the upper level 'examples' directory for more information about examples. diff --git a/examples/07_nvs_rw_value/main/component.mk b/examples/07_nvs_rw_value/main/component.mk new file mode 100644 index 000000000..0b9d7585e --- /dev/null +++ b/examples/07_nvs_rw_value/main/component.mk @@ -0,0 +1,5 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + diff --git a/examples/07_nvs_rw_value/main/nvs_rw_value.c b/examples/07_nvs_rw_value/main/nvs_rw_value.c new file mode 100644 index 000000000..978c48edb --- /dev/null +++ b/examples/07_nvs_rw_value/main/nvs_rw_value.c @@ -0,0 +1,80 @@ +/* Non-Volatile Storage (NVS) Read and Write a Value - Example + + For other examples please check: + https://github.com/espressif/esp-idf/tree/master/examples + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" + +void app_main() +{ + nvs_flash_init(); + + nvs_handle my_handle; + esp_err_t err; + + printf("\n"); + + // Open + printf("Opening Non-Volatile Storage (NVS) ... "); + err = nvs_open("storage", NVS_READWRITE, &my_handle); + if (err != ESP_OK) { + printf("Error (%d) opening NVS!\n", err); + } else { + printf("Done\n"); + + // Read + printf("Reading restart counter from NVS ... "); + int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS + err = nvs_get_i32(my_handle, "restart_conter", &restart_counter); + switch (err) { + case ESP_OK: + printf("Done\n"); + printf("Restart counter = %d\n", restart_counter); + break; + case ESP_ERR_NVS_NOT_FOUND: + printf("The value is not initialized yet!\n"); + break; + default : + printf("Error (%d) reading!\n", err); + } + + // Write + printf("Updating restart counter in NVS ... "); + restart_counter++; + err = nvs_set_i32(my_handle, "restart_conter", restart_counter); + printf((err != ESP_OK) ? "Failed!\n" : "Done\n"); + + // Commit written value. + // After setting any values, nvs_commit() must be called to ensure changes are written + // to flash storage. Implementations may write to storage at other times, + // but this is not guaranteed. + printf("Committing updates in NVS ... "); + err = nvs_commit(my_handle); + printf((err != ESP_OK) ? "Failed!\n" : "Done\n"); + + // Close + nvs_close(my_handle); + } + + printf("\n"); + + // Restart module + for (int i = 10; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_RATE_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + system_restart(); +} diff --git a/examples/08_bt_sdp/main/demo_main.c b/examples/08_bt_sdp/main/demo_main.c deleted file mode 100755 index ad8243a1f..000000000 --- a/examples/08_bt_sdp/main/demo_main.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include "bt.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "string.h" - - -extern void bte_main_boot_entry(void *); -extern void bt_app_task_start_up(void); -extern void bt_app_core_start(void); - -void pingTask(void *pvParameters) -{ - while (1) { - vTaskDelay(1000 / portTICK_PERIOD_MS); - printf("ping\n"); - } -} - -void app_main() -{ - bt_controller_init(); - xTaskCreatePinnedToCore(&pingTask, "pingTask", 2048, NULL, 5, NULL, 0); - bt_app_task_start_up(); - // bte_main_boot_entry(bt_app_core_start); -} diff --git a/examples/08_nvs_rw_blob/Makefile b/examples/08_nvs_rw_blob/Makefile new file mode 100644 index 000000000..717744bbe --- /dev/null +++ b/examples/08_nvs_rw_blob/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := nvs-rw-blob + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/08_nvs_rw_blob/README.md b/examples/08_nvs_rw_blob/README.md new file mode 100644 index 000000000..81a0e36c7 --- /dev/null +++ b/examples/08_nvs_rw_blob/README.md @@ -0,0 +1,14 @@ +# Non-Volatile Storage (NVS) Read and Write Example + +Demonstrates how to read and write a single integer value and a blob (binary large object) using NVS to preserve them between ESP32 module restarts. + + * value - tracks number of ESP32 module soft and hard restarts. + * blob - contains a table with module run times. The table is read from NVS to dynamically allocated RAM. New run time is added to the table on each manually triggered soft restart and written back to NVS. Triggering is done by pulling down GPIO0. + +Example also shows how to implement diagnostics if read / write operation was successful. + +If not done already, consider checking simpler example *07_nvs_rw_value*, that has been used as a starting point for preparing this one. + +Detailed functional description of NVS and API is provided in [documentation](http://esp-idf.readthedocs.io/en/latest/api/nvs_flash.html). + +See the README.md file in the upper level 'examples' directory for more information about examples. diff --git a/examples/08_nvs_rw_blob/main/component.mk b/examples/08_nvs_rw_blob/main/component.mk new file mode 100644 index 000000000..0b9d7585e --- /dev/null +++ b/examples/08_nvs_rw_blob/main/component.mk @@ -0,0 +1,5 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) + diff --git a/examples/08_nvs_rw_blob/main/nvs_rw_blob.c b/examples/08_nvs_rw_blob/main/nvs_rw_blob.c new file mode 100644 index 000000000..3fbdfcacd --- /dev/null +++ b/examples/08_nvs_rw_blob/main/nvs_rw_blob.c @@ -0,0 +1,178 @@ +/* Non-Volatile Storage (NVS) Read and Write a Blob - Example + + For other examples please check: + https://github.com/espressif/esp-idf/tree/master/examples + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" +#include "driver/gpio.h" + +#define STORAGE_NAMESPACE "storage" + +/* Save the number of module restarts in NVS + by first reading and then incrementing + the number that has been saved previously. + Return an error if anything goes wrong + during this process. + */ +esp_err_t save_restart_counter(void) +{ + nvs_handle my_handle; + esp_err_t err; + + // Open + err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle); + if (err != ESP_OK) return err; + + // Read + int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS + err = nvs_get_i32(my_handle, "restart_conter", &restart_counter); + if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; + + // Write + restart_counter++; + err = nvs_set_i32(my_handle, "restart_conter", restart_counter); + if (err != ESP_OK) return err; + + // Commit written value. + // After setting any values, nvs_commit() must be called to ensure changes are written + // to flash storage. Implementations may write to storage at other times, + // but this is not guaranteed. + err = nvs_commit(my_handle); + if (err != ESP_OK) return err; + + // Close + nvs_close(my_handle); + return ESP_OK; +} + +/* Save new run time value in NVS + by first reading a table of previously saved values + and then adding the new value at the end of the table. + Return an error if anything goes wrong + during this process. + */ +esp_err_t save_run_time(void) +{ + nvs_handle my_handle; + esp_err_t err; + + // Open + err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle); + if (err != ESP_OK) return err; + + // Read the size of memory space required for blob + size_t required_size = 0; // value will default to 0, if not set yet in NVS + err = nvs_get_blob(my_handle, "run_time", NULL, &required_size); + if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; + + // Read previously saved blob if available + uint32_t* run_time = malloc(required_size + sizeof(uint32_t)); + if (required_size > 0) { + err = nvs_get_blob(my_handle, "run_time", run_time, &required_size); + if (err != ESP_OK) return err; + } + + // Write value including previously saved blob if available + required_size += sizeof(uint32_t); + run_time[required_size / sizeof(uint32_t) - 1] = xTaskGetTickCount() * portTICK_PERIOD_MS; + err = nvs_set_blob(my_handle, "run_time", run_time, required_size); + if (err != ESP_OK) return err; + + free(run_time); + + // Commit + err = nvs_commit(my_handle); + if (err != ESP_OK) return err; + + // Close + nvs_close(my_handle); + return ESP_OK; +} + +/* Read from NVS and print restart counter + and the table with run times. + Return an error if anything goes wrong + during this process. + */ +esp_err_t print_what_saved(void) +{ + nvs_handle my_handle; + esp_err_t err; + + // Open + err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle); + if (err != ESP_OK) return err; + + // Read restart counter + int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS + err = nvs_get_i32(my_handle, "restart_conter", &restart_counter); + if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; + printf("Restart counter = %d\n", restart_counter); + + // Read run time blob + size_t required_size = 0; // value will default to 0, if not set yet in NVS + // obtain required memory space to store blob being read from NVS + err = nvs_get_blob(my_handle, "run_time", NULL, &required_size); + if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; + printf("Run time:\n"); + if (required_size == 0) { + printf("Nothing saved yet!\n"); + } else { + uint32_t* run_time = malloc(required_size); + err = nvs_get_blob(my_handle, "run_time", run_time, &required_size); + if (err != ESP_OK) return err; + for (int i = 0; i < required_size / sizeof(uint32_t); i++) { + printf("%d: %d\n", i + 1, run_time[i]); + } + free(run_time); + } + + // Close + nvs_close(my_handle); + return ESP_OK; +} + + +void app_main() +{ + nvs_flash_init(); + + esp_err_t err; + + err = print_what_saved(); + if (err != ESP_OK) printf("Error (%d) reading data from NVS!\n", err); + + err = save_restart_counter(); + if (err != ESP_OK) printf("Error (%d) saving restart counter to NVS!\n", err); + + gpio_pad_select_gpio(GPIO_NUM_0); + gpio_set_direction(GPIO_NUM_0, GPIO_MODE_DEF_INPUT); + + /* Read the status of GPIO0. If GPIO0 is LOW for longer than 1000 ms, + then save module's run time and restart it + */ + while (1) { + if (gpio_get_level(GPIO_NUM_0) == 0) { + vTaskDelay(1000 / portTICK_RATE_MS); + if(gpio_get_level(GPIO_NUM_0) == 0) { + err = save_run_time(); + if (err != ESP_OK) printf("Error (%d) saving run time blob to NVS!\n", err); + printf("Restarting...\n"); + fflush(stdout); + system_restart(); + } + } + vTaskDelay(200 / portTICK_RATE_MS); + } +} diff --git a/examples/09_openssl_client/Makefile b/examples/09_openssl_client/Makefile new file mode 100644 index 000000000..7e2f4fe7f --- /dev/null +++ b/examples/09_openssl_client/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := openssl_client + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/09_openssl_client/README.md b/examples/09_openssl_client/README.md new file mode 100644 index 000000000..2a6ac1988 --- /dev/null +++ b/examples/09_openssl_client/README.md @@ -0,0 +1,16 @@ +# Openssl Example + +The Example contains of OpenSSL client demo. + +First you should config the project by "make menuconfig": + Example Configuration -> + 1. Target Domain : the domain that you want to connect to, and default is "www.baidu.com". + 2. Target port number : the port number of the target domain, and default is 443. + 3. WIFI SSID : your own WIFI, which is connected to the Internet, and default is "myssid". + 4. WIFI Password : WIFI password, and default is "mypassword" + +If you want to test the OpenSSL client demo: + 1. compile the code and load the firmware + 2. open the UART TTY, then you can see it print the context of target domain + +See the README.md file in the upper level 'examples' directory for more information about examples. diff --git a/examples/09_openssl_client/main/Kconfig.projbuild b/examples/09_openssl_client/main/Kconfig.projbuild new file mode 100644 index 000000000..1767923ad --- /dev/null +++ b/examples/09_openssl_client/main/Kconfig.projbuild @@ -0,0 +1,28 @@ +menu "Example Configuration" + +config TARGET_DOMAIN + string "Target Domain" + default "www.baidu.com" + help + Target domain for the example to connect to. + +config TARGET_PORT_NUMBER + int "Target port number" + range 0 65535 + default 433 + help + Target port number for the example to connect to. + +config WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the example to connect to. + +config WIFI_PASSWORD + string "WiFi Password" + default "mypassword" + help + WiFi password (WPA or WPA2) for the example to use. + +endmenu \ No newline at end of file diff --git a/examples/09_openssl_client/main/component.mk b/examples/09_openssl_client/main/component.mk new file mode 100644 index 000000000..44bd2b527 --- /dev/null +++ b/examples/09_openssl_client/main/component.mk @@ -0,0 +1,3 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# diff --git a/examples/09_openssl_client/main/openssl_client.c b/examples/09_openssl_client/main/openssl_client.c new file mode 100644 index 000000000..c6b0e449a --- /dev/null +++ b/examples/09_openssl_client/main/openssl_client.c @@ -0,0 +1,225 @@ +/* OpenSSL client Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "openssl_client.h" + +#include + +#include "openssl/ssl.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" + +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_event_loop.h" + +#include "nvs_flash.h" + +#include "lwip/sockets.h" +#include "lwip/netdb.h" + +static EventGroupHandle_t wifi_event_group; + +/* The event group allows multiple bits for each event, + but we only care about one event - are we connected + to the AP with an IP? */ +const static int CONNECTED_BIT = BIT0; + +const static char *TAG = "Openssl_demo"; + +void openssl_demo_thread(void *p) +{ + int ret; + SSL_CTX *ctx; + SSL *ssl; + int socket; + struct sockaddr_in sock_addr; + struct hostent *hp; + struct ip4_addr *ip4_addr; + + int recv_bytes = 0; + char recv_buf[OPENSSL_DEMO_RECV_BUF_LEN]; + + const char send_data[] = OPENSSL_DEMO_REQUEST; + const int send_bytes = sizeof(send_data); + + ESP_LOGI(TAG, "OpenSSL demo thread start OK"); + + ESP_LOGI(TAG, "get target IP address"); + hp = gethostbyname(OPENSSL_DEMO_TARGET_NAME); + if (!hp) { + ESP_LOGI(TAG, "failed"); + goto failed1; + } + ESP_LOGI(TAG, "OK"); + + ip4_addr = (struct ip4_addr *)hp->h_addr; + ESP_LOGI(TAG, IPSTR, IP2STR(ip4_addr)); + + ESP_LOGI(TAG, "create SSL context ......"); + ctx = SSL_CTX_new(TLSv1_1_client_method()); + if (!ctx) { + ESP_LOGI(TAG, "failed"); + goto failed1; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "create socket ......"); + socket = socket(AF_INET, SOCK_STREAM, 0); + if (socket < 0) { + ESP_LOGI(TAG, "failed"); + goto failed2; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "bind socket ......"); + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = 0; + sock_addr.sin_port = htons(OPENSSL_DEMO_LOCAL_TCP_PORT); + ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); + if (ret) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "socket connect to remote %s ......", OPENSSL_DEMO_TARGET_NAME); + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = ip4_addr->addr; + sock_addr.sin_port = htons(OPENSSL_DEMO_TARGET_TCP_PORT); + ret = connect(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); + if (ret) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "create SSL ......"); + ssl = SSL_new(ctx); + if (!ssl) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + + SSL_set_fd(ssl, socket); + + ESP_LOGI(TAG, "SSL connected to %s port %d ......", + OPENSSL_DEMO_TARGET_NAME, OPENSSL_DEMO_TARGET_TCP_PORT); + ret = SSL_connect(ssl); + if (!ret) { + ESP_LOGI(TAG, "failed " ); + goto failed4; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "send https request to %s port %d ......", + OPENSSL_DEMO_TARGET_NAME, OPENSSL_DEMO_TARGET_TCP_PORT); + ret = SSL_write(ssl, send_data, send_bytes); + if (ret <= 0) { + ESP_LOGI(TAG, "failed"); + goto failed5; + } + ESP_LOGI(TAG, "OK"); + + do { + ret = SSL_read(ssl, recv_buf, OPENSSL_DEMO_RECV_BUF_LEN - 1); + if (ret <= 0) { + break; + } + recv_bytes += ret; + ESP_LOGI(TAG, "%s", recv_buf); + } while (1); + + ESP_LOGI(TAG, "totaly read %d bytes data from %s ......", recv_bytes, OPENSSL_DEMO_TARGET_NAME); + +failed5: + SSL_shutdown(ssl); +failed4: + SSL_free(ssl); + ssl = NULL; +failed3: + close(socket); + socket = -1; +failed2: + SSL_CTX_free(ctx); + ctx = NULL; +failed1: + vTaskDelete(NULL); + return ; +} + +static void openssl_client_init(void) +{ + int ret; + xTaskHandle openssl_handle; + + ret = xTaskCreate(openssl_demo_thread, + OPENSSL_DEMO_THREAD_NAME, + OPENSSL_DEMO_THREAD_STACK_WORDS, + NULL, + OPENSSL_DEMO_THREAD_PRORIOTY, + &openssl_handle); + + if (ret != pdPASS) { + ESP_LOGI(TAG, "create thread %s failed", OPENSSL_DEMO_THREAD_NAME); + } +} + +static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) +{ + switch(event->event_id) { + case SYSTEM_EVENT_STA_START: + esp_wifi_connect(); + break; + case SYSTEM_EVENT_STA_GOT_IP: + xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); + openssl_client_init(); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + /* This is a workaround as ESP32 WiFi libs don't currently + auto-reassociate. */ + esp_wifi_connect(); + xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); + break; + default: + break; + } + return ESP_OK; +} + +static void wifi_conn_init(void) +{ + tcpip_adapter_init(); + wifi_event_group = xEventGroupCreate(); + ESP_ERROR_CHECK( esp_event_loop_init(wifi_event_handler, NULL) ); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); + ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_WIFI_SSID, + .password = EXAMPLE_WIFI_PASS, + }, + }; + ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + ESP_LOGI(TAG, "start the WIFI SSID:[%s] password:[%s]\n", EXAMPLE_WIFI_SSID, EXAMPLE_WIFI_PASS); + ESP_ERROR_CHECK( esp_wifi_start() ); +} + +void app_main(void) +{ + nvs_flash_init(); + wifi_conn_init(); +} diff --git a/examples/09_openssl_client/main/openssl_client.h b/examples/09_openssl_client/main/openssl_client.h new file mode 100644 index 000000000..f5ab887ad --- /dev/null +++ b/examples/09_openssl_client/main/openssl_client.h @@ -0,0 +1,43 @@ +/* OpenSSL client Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#ifndef _OPENSSL_DEMO_H_ +#define _OPENSSL_DEMO_H_ + +/* The examples use simple WiFi configuration that you can set via + 'make menuconfig'. + + If you'd rather not, just change the below entries to strings with + the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" +*/ +#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID +#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD + +/* The examples use domain of "www.baidu.com" and port number of 433 that + you can set via 'make menuconfig'. + + If you'd rather not, just change the below entries to strings with + the config you want - ie #define OPENSSL_DEMO_TARGET_NAME "www.baidu.com" + and ie #define OPENSSL_DEMO_TARGET_TCP_PORT 433 +*/ +#define OPENSSL_DEMO_TARGET_NAME CONFIG_TARGET_DOMAIN +#define OPENSSL_DEMO_TARGET_TCP_PORT CONFIG_TARGET_PORT_NUMBER + +#define OPENSSL_DEMO_REQUEST "{\"path\": \"/v1/ping/\", \"method\": \"GET\"}\r\n" + +#define OPENSSL_DEMO_THREAD_NAME "OpenSSL_demo" +#define OPENSSL_DEMO_THREAD_STACK_WORDS 10240 +#define OPENSSL_DEMO_THREAD_PRORIOTY 8 + +#define OPENSSL_DEMO_RECV_BUF_LEN 1024 + +#define OPENSSL_DEMO_LOCAL_TCP_PORT 443 + +#endif + diff --git a/examples/10_openssl_server/Makefile b/examples/10_openssl_server/Makefile new file mode 100644 index 000000000..f65f11a56 --- /dev/null +++ b/examples/10_openssl_server/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := openssl_server + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/10_openssl_server/README.md b/examples/10_openssl_server/README.md new file mode 100644 index 000000000..333cb3d6a --- /dev/null +++ b/examples/10_openssl_server/README.md @@ -0,0 +1,21 @@ +# Openssl Example + +The Example contains of OpenSSL server demo. + +First you should configure the project by "make menuconfig": + Example Configuration -> + 1. WIFI SSID: WIFI network to which your PC is also connected to. + 1. WIFI Password: WIFI password + +IF you want to test the OpenSSL server demo: + 1. compile the code and load the firmware + 2. input the context of "https://192.168.17.128" into your web browser, the IP of your module may not be 192.168.17.128, you should input your module's IP + 3. You may see that it shows the website is not able to be trusted, but you should select that "go on to visit it" + 4. You should wait for a moment until your see the "OpenSSL server demo!" in your web browser + +Note: + The private key and certification at the example are not trusted by web browser, because they are not created by CA official, just by ourselves. + You can alse create your own private key and ceritification by "openssl at ubuntu or others". + We have the document of "ESP8266_SDKSSL_User_Manual_EN_v1.4.pdf" at "http://www.espressif.com/en/support/download/documents". By it you can gernerate the private key and certification with the fomate of ".pem" + +See the README.md file in the upper level 'examples' directory for more information about examples. diff --git a/examples/10_openssl_server/main/Kconfig.projbuild b/examples/10_openssl_server/main/Kconfig.projbuild new file mode 100644 index 000000000..7a9cb97a0 --- /dev/null +++ b/examples/10_openssl_server/main/Kconfig.projbuild @@ -0,0 +1,15 @@ +menu "Example Configuration" + +config WIFI_SSID + string "WiFi SSID" + default "myssid" + help + SSID (network name) for the example to connect to. + +config WIFI_PASSWORD + string "WiFi Password" + default "mypassword" + help + WiFi password (WPA or WPA2) for the example to use. + +endmenu \ No newline at end of file diff --git a/examples/10_openssl_server/main/cacert.pem b/examples/10_openssl_server/main/cacert.pem new file mode 100644 index 000000000..e09c3989c --- /dev/null +++ b/examples/10_openssl_server/main/cacert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIJAPMMNobNczaUMA0GCSqGSIb3DQEBBAUAMHQxEzARBgNV +BAMTCk15IFRlc3QgQ0ExCzAJBgNVBAgTAkhaMQswCQYDVQQGEwJDTjEcMBoGCSqG +SIb3DQEJARYNdGVzdEBjZXJ0LmNvbTElMCMGA1UEChMcUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNjExMTUwNTA0MThaFw0xOTExMTUwNTA0MThaMHQx +EzARBgNVBAMTCk15IFRlc3QgQ0ExCzAJBgNVBAgTAkhaMQswCQYDVQQGEwJDTjEc +MBoGCSqGSIb3DQEJARYNdGVzdEBjZXJ0LmNvbTElMCMGA1UEChMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALDjSPDlomepHCzbw4MUrquQAU0xTV4/Npb27k9I5TRVTjIoOs/5hNI2LPFW +e4CREx09ZrT8K3NFOBoSy7bhPAsjGaFxCYYWc9tiX1m5gq3ToVRSmbZ65fE3kvnI +8E/d5VyzA0OMmWbfaolBSTMoWgqRynEaT+z1Eh2yDTzVFy9eov1DdQFUqGDqbH5b +QYvTY5Fyem7UcKWAe2yS0j3H4dVtVBKNY7qV3Px08yGAs5fQFgUwhyB5+qwhvkeL +JdgapGaSTwLgoQKWHbe/lA3NiBIB9hznFUGKo3hmniAvYZbrQcn3tc0l/J4I39v2 +Pm29FAyjWvQyBkGktz2q4elOZYkCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOCAQEAJCJ+97oae/FcOLbPpjCpUQnWqYydgSChgalkZNvr4fVp +TnuNg471l0Y2oTJLoWn2YcbPSFVOEeKkU47mpjMzucHHp0zGaW9SdzhZalWwmbgK +q2ijecIbuFHFNedYTk/03K7eaAcjVhD8e0oOJImeLOL6DAFivA1LUnSgXsdGPDtD +zhISsCPTu+cL1j0yP6HBvLeAyb8kaCWJ05RtiVLRANNHQn/keHajJYpMwnEEbJdG +cqN3whfJoGVbZ6isEf2RQJ0pYRnP7uGLW3wGkLWxfdto8uER8HVDx7fZpevLIqGd +1OoSEi3cIJXWBAjx0TLzzhtb6aeIxBJWQqHThtkKdg== +-----END CERTIFICATE----- diff --git a/examples/10_openssl_server/main/component.mk b/examples/10_openssl_server/main/component.mk new file mode 100644 index 000000000..80af01cb5 --- /dev/null +++ b/examples/10_openssl_server/main/component.mk @@ -0,0 +1,6 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# + +COMPONENT_EMBED_TXTFILES := cacert.pem +COMPONENT_EMBED_TXTFILES += prvtkey.pem diff --git a/examples/10_openssl_server/main/openssl_server.c b/examples/10_openssl_server/main/openssl_server.c new file mode 100644 index 000000000..53b6050d5 --- /dev/null +++ b/examples/10_openssl_server/main/openssl_server.c @@ -0,0 +1,248 @@ +/* OpenSSL server Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "openssl_server.h" + +#include + +#include "openssl/ssl.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" + +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_event_loop.h" + +#include "nvs_flash.h" + +#include "lwip/sockets.h" +#include "lwip/netdb.h" + +static EventGroupHandle_t wifi_event_group; + +/* The event group allows multiple bits for each event, + but we only care about one event - are we connected + to the AP with an IP? */ +const static int CONNECTED_BIT = BIT0; + +const static char *TAG = "Openssl_demo"; + +#define OPENSSL_DEMO_SERVER_ACK "HTTP/1.1 200 OK\r\n" \ + "Content-Type: text/html\r\n" \ + "Content-Length: 98\r\n" \ + "\r\n" \ + "\r\n" \ + "OpenSSL demo\r\n" \ + "OpenSSL server demo!\r\n" \ + "\r\n" \ + "\r\n" + +static void openssl_demo_thread(void *p) +{ + int ret; + + SSL_CTX *ctx; + SSL *ssl; + + int socket, new_socket; + socklen_t addr_len; + struct sockaddr_in sock_addr; + + char recv_buf[OPENSSL_DEMO_RECV_BUF_LEN]; + + const char send_data[] = OPENSSL_DEMO_SERVER_ACK; + const int send_bytes = sizeof(send_data); + + extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start"); + extern const unsigned char cacert_pem_end[] asm("_binary_cacert_pem_end"); + const unsigned int cacert_pem_bytes = cacert_pem_end - cacert_pem_start; + + extern const unsigned char prvtkey_pem_start[] asm("_binary_prvtkey_pem_start"); + extern const unsigned char prvtkey_pem_end[] asm("_binary_prvtkey_pem_end"); + const unsigned int prvtkey_pem_bytes = prvtkey_pem_end - prvtkey_pem_start; + + ESP_LOGI(TAG, "SSL server context create ......"); + ctx = SSL_CTX_new(SSLv3_server_method()); + if (!ctx) { + ESP_LOGI(TAG, "failed"); + goto failed1; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server context set own certification......"); + ret = SSL_CTX_use_certificate_ASN1(ctx, cacert_pem_bytes, cacert_pem_start); + if (!ret) { + ESP_LOGI(TAG, "failed"); + goto failed2; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server context set private key......"); + ret = SSL_CTX_use_PrivateKey_ASN1(0, ctx, prvtkey_pem_start, prvtkey_pem_bytes); + if (!ret) { + ESP_LOGI(TAG, "failed"); + goto failed2; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server create socket ......"); + socket = socket(AF_INET, SOCK_STREAM, 0); + if (socket < 0) { + ESP_LOGI(TAG, "failed"); + goto failed2; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server socket bind ......"); + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = 0; + sock_addr.sin_port = htons(OPENSSL_DEMO_LOCAL_TCP_PORT); + ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); + if (ret) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server socket listen ......"); + ret = listen(socket, 32); + if (ret) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + +reconnect: + ESP_LOGI(TAG, "SSL server create ......"); + ssl = SSL_new(ctx); + if (!ssl) { + ESP_LOGI(TAG, "failed"); + goto failed3; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server socket accept client ......"); + new_socket = accept(socket, (struct sockaddr *)&sock_addr, &addr_len); + if (new_socket < 0) { + ESP_LOGI(TAG, "failed" ); + goto failed4; + } + ESP_LOGI(TAG, "OK"); + + SSL_set_fd(ssl, new_socket); + + ESP_LOGI(TAG, "SSL server accept client ......"); + ret = SSL_accept(ssl); + if (!ret) { + ESP_LOGI(TAG, "failed"); + goto failed5; + } + ESP_LOGI(TAG, "OK"); + + ESP_LOGI(TAG, "SSL server read message ......"); + do { + memset(recv_buf, 0, OPENSSL_DEMO_RECV_BUF_LEN); + ret = SSL_read(ssl, recv_buf, OPENSSL_DEMO_RECV_BUF_LEN - 1); + if (ret <= 0) { + break; + } + if (strstr(recv_buf, "GET / HTTP/1.1")) { + SSL_write(ssl, send_data, send_bytes); + break; + } + } while (1); + + ESP_LOGI(TAG, "result %d", ret); + + SSL_shutdown(ssl); +failed5: + close(new_socket); + new_socket = -1; +failed4: + SSL_free(ssl); + ssl = NULL; + goto reconnect; +failed3: + close(socket); + socket = -1; +failed2: + SSL_CTX_free(ctx); + ctx = NULL; +failed1: + vTaskDelete(NULL); + return ; +} + +static void openssl_client_init(void) +{ + int ret; + xTaskHandle openssl_handle; + + ret = xTaskCreate(openssl_demo_thread, + OPENSSL_DEMO_THREAD_NAME, + OPENSSL_DEMO_THREAD_STACK_WORDS, + NULL, + OPENSSL_DEMO_THREAD_PRORIOTY, + &openssl_handle); + + if (ret != pdPASS) { + ESP_LOGI(TAG, "create thread %s failed", OPENSSL_DEMO_THREAD_NAME); + } +} + +static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) +{ + switch(event->event_id) { + case SYSTEM_EVENT_STA_START: + esp_wifi_connect(); + break; + case SYSTEM_EVENT_STA_GOT_IP: + xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); + openssl_client_init(); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + /* This is a workaround as ESP32 WiFi libs don't currently + auto-reassociate. */ + esp_wifi_connect(); + xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); + break; + default: + break; + } + return ESP_OK; +} + +static void wifi_conn_init(void) +{ + tcpip_adapter_init(); + wifi_event_group = xEventGroupCreate(); + ESP_ERROR_CHECK( esp_event_loop_init(wifi_event_handler, NULL) ); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); + ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_WIFI_SSID, + .password = EXAMPLE_WIFI_PASS, + }, + }; + ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + ESP_LOGI(TAG, "start the WIFI SSID:[%s] password:[%s]\n", EXAMPLE_WIFI_SSID, EXAMPLE_WIFI_PASS); + ESP_ERROR_CHECK( esp_wifi_start() ); +} + +void app_main(void) +{ + nvs_flash_init(); + wifi_conn_init(); +} diff --git a/examples/10_openssl_server/main/openssl_server.h b/examples/10_openssl_server/main/openssl_server.h new file mode 100644 index 000000000..5f49de35f --- /dev/null +++ b/examples/10_openssl_server/main/openssl_server.h @@ -0,0 +1,31 @@ +/* OpenSSL server Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#ifndef _OPENSSL_DEMO_H_ +#define _OPENSSL_DEMO_H_ + +/* The examples use simple WiFi configuration that you can set via + 'make menuconfig'. + + If you'd rather not, just change the below entries to strings with + the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" +*/ +#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID +#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD + +#define OPENSSL_DEMO_THREAD_NAME "OpenSSL_demo" +#define OPENSSL_DEMO_THREAD_STACK_WORDS 10240 +#define OPENSSL_DEMO_THREAD_PRORIOTY 8 + +#define OPENSSL_DEMO_RECV_BUF_LEN 1024 + +#define OPENSSL_DEMO_LOCAL_TCP_PORT 443 + +#endif + diff --git a/examples/10_openssl_server/main/prvtkey.pem b/examples/10_openssl_server/main/prvtkey.pem new file mode 100644 index 000000000..4ead61f6f --- /dev/null +++ b/examples/10_openssl_server/main/prvtkey.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAsONI8OWiZ6kcLNvDgxSuq5ABTTFNXj82lvbuT0jlNFVOMig6 +z/mE0jYs8VZ7gJETHT1mtPwrc0U4GhLLtuE8CyMZoXEJhhZz22JfWbmCrdOhVFKZ +tnrl8TeS+cjwT93lXLMDQ4yZZt9qiUFJMyhaCpHKcRpP7PUSHbINPNUXL16i/UN1 +AVSoYOpsfltBi9NjkXJ6btRwpYB7bJLSPcfh1W1UEo1jupXc/HTzIYCzl9AWBTCH +IHn6rCG+R4sl2BqkZpJPAuChApYdt7+UDc2IEgH2HOcVQYqjeGaeIC9hlutByfe1 +zSX8ngjf2/Y+bb0UDKNa9DIGQaS3Parh6U5liQIDAQABAoIBAB9K9jp3xXVlO3DM +KBhmbkg3n6NSV4eW00d9w8cO9E1/0eeZql3knJS7tNO1IwApqiIAHM1j1yP7WONz +88oUqpSlzwD6iF7KVhC3pHqxEOdDi0Tpn/viXg+Ab2X1IF5guRTfLnKiyviiCazi +edqtBtDb3d6Icx9Oc7gBKcpbQFDGt++wSOb5L+xhRm9B5B4l/6byikiPeKqIK5tC +SoP9Zr1mvpNoGm1P4LvEunFJcRBqVI010VNwfO9P98oVyzJu9/FZZrQxXoY9JdXF +OM6nbl+hMDM3TkEOda9NvBhImozEAvuc97CaaXyR3XivxMqNqNIb4+syUPa2PCS3 +ZztI5qECgYEA1gbVG6ifpvpbBkDPi3Im8fM3F7FLLrQc48FdFjdMvDhHD9lVKucD +Uaa8PF9dbbvlu2cwMyfBOKSuWaXxRxRsiqiPmTunS1MvPzQcSrGwUrL2AogGucn6 ++NrLQf5P4H5IpkDQ9ih3zwjO6xKFK1WeYnYpHM8qUBtl6q0YFyVBPu0CgYEA05Pn +StWA4D7VSbNnVi6lvFyEOUsTrK3v419598TFiq4eXLq6aV8/CQYzKsSzoG+aOZhX +Li+0uyT5cNzUcXYhTsW1hA/pNhMfxMrYiB1x14zlLp2WRGg4vd/+SxX6d9Yd3acX +7QzPKgdDicXs9QN8ozJOICKvNbUI53AJdATVEY0CgYEAwvpGeoQLrdq1weSZLrg3 +soOX1QW3MDz1dKdbXjnStkWut0mOxR7fbysuoPFf8/ARQcCnsHKvHCMqkpESVWbN +2yPkbfxiU8Tcbf/TJljqAOz4ISY6ula/RKZONTixHBrvpEW4GAiV3Q5xMsYUe33s +ZFaw7YXtTj0ng7tdDvjpj6ECgYEApHdUU9ejVq2BHslWiqe4LbO9FMxHfvO2hgix +xugupp6y+2Irhb2EQn+PRq+g8hXOzPaezkhHNTKItDL08T3iplkJwJ6dqmszRsZn +i2dYFzZu8M2PAZ4CfZahFbz/9id7D9HTx3EtmH4NAgvZJpyPRkzUbiaIDDettDpj +Hsyi1AECgYAPLvjBzQj4kPF8Zo9pQEUcz4pmupRVfv3aRfjnahDK4qZHEePDRj+J +W7pzayrs1dyN9QLB8pTc424z7f8MB3llCICN+ohs8CR/eW0NEobE9ldDOeoCr1Vh +NhNSbrN1iZ8U4oLkRTMaDKkVngGffvjGi/q0tOU7hJdZOqNlk2Iahg== +-----END RSA PRIVATE KEY----- diff --git a/examples/11_rmt_nec_tx_rx/Makefile b/examples/11_rmt_nec_tx_rx/Makefile new file mode 100644 index 000000000..df418c6eb --- /dev/null +++ b/examples/11_rmt_nec_tx_rx/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := infrared_nec + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/11_rmt_nec_tx_rx/main/component.mk b/examples/11_rmt_nec_tx_rx/main/component.mk new file mode 100644 index 000000000..b4fa72791 --- /dev/null +++ b/examples/11_rmt_nec_tx_rx/main/component.mk @@ -0,0 +1,4 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/11_rmt_nec_tx_rx/main/infrared_nec.c b/examples/11_rmt_nec_tx_rx/main/infrared_nec.c new file mode 100644 index 000000000..dbd11fbae --- /dev/null +++ b/examples/11_rmt_nec_tx_rx/main/infrared_nec.c @@ -0,0 +1,359 @@ +/* NEC remote infrared RMT example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "esp_err.h" +#include "esp_log.h" +#include "driver/rmt.h" +#include "driver/periph_ctrl.h" +#include "soc/rmt_reg.h" + +static const char* NEC_TAG = "NEC"; + +//CHOOSE SELF TEST OR NORMAL TEST +#define RMT_RX_SELF_TEST 1 + +/******************************************************/ +/***** SELF TEST: *****/ +/*Connect RMT_TX_GPIO_NUM with RMT_RX_GPIO_NUM */ +/*TX task will send NEC data with carrier disabled */ +/*RX task will print NEC data it receives. */ +/******************************************************/ +#if RMT_RX_SELF_TEST +#define RMT_RX_ACTIVE_LEVEL 1 /*!< Data bit is active high for self test mode */ +#define RMT_TX_CARRIER_EN 0 /*!< Disable carrier for self test mode */ +#else +//Test with infrared LED, we have to enable carrier for transmitter +//When testing via IR led, the receiver waveform is usually active-low. +#define RMT_RX_ACTIVE_LEVEL 0 /*!< If we connect with a IR receiver, the data is active low */ +#define RMT_TX_CARRIER_EN 1 /*!< Enable carrier for IR transmitter test with IR led */ +#endif + +#define RMT_TX_CHANNEL 1 /*!< RMT channel for transmitter */ +#define RMT_TX_GPIO_NUM 16 /*!< GPIO number for transmitter signal */ +#define RMT_RX_CHANNEL 0 /*!< RMT channel for receiver */ +#define RMT_RX_GPIO_NUM 19 /*!< GPIO number for receiver */ +#define RMT_INTR_NUM 19 /*!< RMT interrupt number, select from soc.h */ +#define RMT_CLK_DIV 100 /*!< RMT counter clock divider */ +#define RMT_TICK_10_US (80000000/RMT_CLK_DIV/100000) /*!< RMT counter value for 10 us.(Source clock is APB clock) */ + +#define NEC_HEADER_HIGH_US 9000 /*!< NEC protocol header: positive 9ms */ +#define NEC_HEADER_LOW_US 4500 /*!< NEC protocol header: negative 4.5ms*/ +#define NEC_BIT_ONE_HIGH_US 560 /*!< NEC protocol data bit 1: positive 0.56ms */ +#define NEC_BIT_ONE_LOW_US (2250-NEC_BIT_ONE_HIGH_US) /*!< NEC protocol data bit 1: negative 1.69ms */ +#define NEC_BIT_ZERO_HIGH_US 560 /*!< NEC protocol data bit 0: positive 0.56ms */ +#define NEC_BIT_ZERO_LOW_US (1120-NEC_BIT_ZERO_HIGH_US) /*!< NEC protocol data bit 0: negative 0.56ms */ +#define NEC_BIT_END 560 /*!< NEC protocol end: positive 0.56ms */ +#define NEC_BIT_MARGIN 20 /*!< NEC parse margin time */ + +#define NEC_ITEM_DURATION(d) ((d & 0x7fff)*10/RMT_TICK_10_US) /*!< Parse duration time from memory register value */ +#define NEC_DATA_ITEM_NUM 34 /*!< NEC code item number: header + 32bit data + end */ +#define RMT_TX_DATA_NUM 100 /*!< NEC tx test data number */ +#define rmt_item32_tIMEOUT_US 9500 /*!< RMT receiver timeout value(us) */ + +/* + * @brief Build register value of waveform for NEC one data bit + */ +inline void nec_fill_item_level(rmt_item32_t* item, int high_us, int low_us) +{ + item->level0 = 1; + item->duration0 = (high_us) / 10 * RMT_TICK_10_US; + item->level1 = 0; + item->duration1 = (low_us) / 10 * RMT_TICK_10_US; +} + +/* + * @brief Generate NEC header value: active 9ms + negative 4.5ms + */ +static void nec_fill_item_header(rmt_item32_t* item) +{ + nec_fill_item_level(item, NEC_HEADER_HIGH_US, NEC_HEADER_LOW_US); +} + +/* + * @brief Generate NEC data bit 1: positive 0.56ms + negative 1.69ms + */ +static void nec_fill_item_bit_one(rmt_item32_t* item) +{ + nec_fill_item_level(item, NEC_BIT_ONE_HIGH_US, NEC_BIT_ONE_LOW_US); +} + +/* + * @brief Generate NEC data bit 0: positive 0.56ms + negative 0.56ms + */ +static void nec_fill_item_bit_zero(rmt_item32_t* item) +{ + nec_fill_item_level(item, NEC_BIT_ZERO_HIGH_US, NEC_BIT_ZERO_LOW_US); +} + +/* + * @brief Generate NEC end signal: positive 0.56ms + */ +static void nec_fill_item_end(rmt_item32_t* item) +{ + nec_fill_item_level(item, NEC_BIT_END, 0x7fff); +} + +/* + * @brief Check whether duration is around target_us + */ +inline bool nec_check_in_range(int duration_ticks, int target_us, int margin_us) +{ + if(( NEC_ITEM_DURATION(duration_ticks) < (target_us + margin_us)) + && ( NEC_ITEM_DURATION(duration_ticks) > (target_us - margin_us))) { + return true; + } else { + return false; + } +} + +/* + * @brief Check whether this value represents an NEC header + */ +static bool nec_header_if(rmt_item32_t* item) +{ + if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL) + && nec_check_in_range(item->duration0, NEC_HEADER_HIGH_US, NEC_BIT_MARGIN) + && nec_check_in_range(item->duration1, NEC_HEADER_LOW_US, NEC_BIT_MARGIN)) { + return true; + } + return false; +} + +/* + * @brief Check whether this value represents an NEC data bit 1 + */ +static bool nec_bit_one_if(rmt_item32_t* item) +{ + if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL) + && nec_check_in_range(item->duration0, NEC_BIT_ONE_HIGH_US, NEC_BIT_MARGIN) + && nec_check_in_range(item->duration1, NEC_BIT_ONE_LOW_US, NEC_BIT_MARGIN)) { + return true; + } + return false; +} + +/* + * @brief Check whether this value represents an NEC data bit 0 + */ +static bool nec_bit_zero_if(rmt_item32_t* item) +{ + if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL) + && nec_check_in_range(item->duration0, NEC_BIT_ZERO_HIGH_US, NEC_BIT_MARGIN) + && nec_check_in_range(item->duration1, NEC_BIT_ZERO_LOW_US, NEC_BIT_MARGIN)) { + return true; + } + return false; +} + + +/* + * @brief Parse NEC 32 bit waveform to address and command. + */ +static int nec_parse_items(rmt_item32_t* item, int item_num, uint16_t* addr, uint16_t* data) +{ + int w_len = item_num; + if(w_len < NEC_DATA_ITEM_NUM) { + return -1; + } + int i = 0, j = 0; + if(!nec_header_if(item++)) { + return -1; + } + uint16_t addr_t = 0; + for(j = 0; j < 16; j++) { + if(nec_bit_one_if(item)) { + addr_t |= (1 << j); + } else if(nec_bit_zero_if(item)) { + addr_t |= (0 << j); + } else { + return -1; + } + item++; + i++; + } + uint16_t data_t = 0; + for(j = 0; j < 16; j++) { + if(nec_bit_one_if(item)) { + data_t |= (1 << j); + } else if(nec_bit_zero_if(item)) { + data_t |= (0 << j); + } else { + return -1; + } + item++; + i++; + } + *addr = addr_t; + *data = data_t; + return i; +} + +/* + * @brief Build NEC 32bit waveform. + */ +static int nec_build_items(int channel, rmt_item32_t* item, int item_num, uint16_t addr, uint16_t cmd_data) +{ + int i = 0, j = 0; + if(item_num < NEC_DATA_ITEM_NUM) { + return -1; + } + nec_fill_item_header(item++); + i++; + for(j = 0; j < 16; j++) { + if(addr & 0x1) { + nec_fill_item_bit_one(item); + } else { + nec_fill_item_bit_zero(item); + } + item++; + i++; + addr >>= 1; + } + for(j = 0; j < 16; j++) { + if(cmd_data & 0x1) { + nec_fill_item_bit_one(item); + } else { + nec_fill_item_bit_zero(item); + } + item++; + i++; + cmd_data >>= 1; + } + nec_fill_item_end(item); + i++; + return i; +} + +/* + * @brief RMT transmitter initialization + */ +static void rmt_tx_init() +{ + rmt_config_t rmt_tx; + rmt_tx.channel = RMT_TX_CHANNEL; + rmt_tx.gpio_num = RMT_TX_GPIO_NUM; + rmt_tx.mem_block_num = 1; + rmt_tx.clk_div = RMT_CLK_DIV; + rmt_tx.tx_config.loop_en = false; + rmt_tx.tx_config.carrier_duty_percent = 50; + rmt_tx.tx_config.carrier_freq_hz = 38000; + rmt_tx.tx_config.carrier_level = 1; + rmt_tx.tx_config.carrier_en = RMT_TX_CARRIER_EN; + rmt_tx.tx_config.idle_level = 0; + rmt_tx.tx_config.idle_output_en = true; + rmt_tx.rmt_mode = 0; + rmt_config(&rmt_tx); + rmt_driver_install(rmt_tx.channel, 0, RMT_INTR_NUM); +} + +/* + * @brief RMT receiver initialization + */ +void rmt_rx_init() +{ + rmt_config_t rmt_rx; + rmt_rx.channel = RMT_RX_CHANNEL; + rmt_rx.gpio_num = RMT_RX_GPIO_NUM; + rmt_rx.clk_div = RMT_CLK_DIV; + rmt_rx.mem_block_num = 1; + rmt_rx.rmt_mode = RMT_MODE_RX; + rmt_rx.rx_config.filter_en = true; + rmt_rx.rx_config.filter_ticks_thresh = 100; + rmt_rx.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US); + rmt_config(&rmt_rx); + rmt_driver_install(rmt_rx.channel, 1000, RMT_INTR_NUM); +} + +/** + * @brief RMT receiver demo, this task will print each received NEC data. + * + */ +void rmt_nec_rx_task() +{ + int channel = RMT_RX_CHANNEL; + rmt_rx_init(); + RingbufHandle_t rb = NULL; + //get RMT RX ringbuffer + rmt_get_ringbuf_handler(channel, &rb); + rmt_rx_start(channel, 1); + while(rb) { + size_t rx_size = 0; + //try to receive data from ringbuffer. + //RMT driver will push all the data it receives to its ringbuffer. + //We just need to parse the value and return the spaces of ringbuffer. + rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(rb, &rx_size, 1000); + if(item) { + uint16_t rmt_addr; + uint16_t rmt_cmd; + int offset = 0; + while(1) { + //parse data value from ringbuffer. + int res = nec_parse_items(item + offset, rx_size / 4 - offset, &rmt_addr, &rmt_cmd); + if(res > 0) { + offset += res + 1; + ESP_LOGI(NEC_TAG, "RMT RCV --- addr: 0x%04x cmd: 0x%04x", rmt_addr, rmt_cmd); + } else { + break; + } + } + //after parsing the data, return spaces to ringbuffer. + vRingbufferReturnItem(rb, (void*) item); + } else { + break; + } + } + vTaskDelete(NULL); +} + +/** + * @brief RMT transmitter demo, this task will periodically send NEC data. (100 * 32 bits each time.) + * + */ +void rmt_nec_tx_task() +{ + vTaskDelay(10); + rmt_tx_init(); + esp_log_level_set(NEC_TAG, ESP_LOG_INFO); + int channel = RMT_TX_CHANNEL; + uint16_t cmd = 0x0; + uint16_t addr = 0x11; + int nec_tx_num = RMT_TX_DATA_NUM; + for(;;) { + ESP_LOGI(NEC_TAG, "RMT TX DATA"); + size_t size = (sizeof(rmt_item32_t) * NEC_DATA_ITEM_NUM * nec_tx_num); + //each item represent a cycle of waveform. + rmt_item32_t* item = (rmt_item32_t*) malloc(size); + int item_num = NEC_DATA_ITEM_NUM * nec_tx_num; + memset((void*) item, 0, size); + int i, offset = 0; + while(1) { + //To build a series of waveforms. + i = nec_build_items(channel, item + offset, item_num - offset, ((~addr) << 8) | addr, cmd); + if(i < 0) { + break; + } + cmd++; + addr++; + offset += i; + } + //To send data according to the waveform items. + rmt_write_items(channel, item, item_num, true); + //Wait until sending is done. + rmt_wait_tx_done(channel); + //before we free the data, make sure sending is already done. + free(item); + vTaskDelay(2000 / portTICK_RATE_MS); + } + vTaskDelete(NULL); +} diff --git a/examples/11_rmt_nec_tx_rx/main/infrared_nec_main.c b/examples/11_rmt_nec_tx_rx/main/infrared_nec_main.c new file mode 100644 index 000000000..c680f25a5 --- /dev/null +++ b/examples/11_rmt_nec_tx_rx/main/infrared_nec_main.c @@ -0,0 +1,23 @@ +/* NEC remote infrared RMT example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "driver/rmt.h" +#include "driver/periph_ctrl.h" +extern void rmt_nec_tx_task(); +extern void rmt_nec_rx_task(); + +void app_main() +{ + xTaskCreate(rmt_nec_rx_task, "rmt_nec_rx_task", 2048, NULL, 10, NULL); + xTaskCreate(rmt_nec_tx_task, "rmt_nec_tx_task", 2048, NULL, 10, NULL); +} diff --git a/examples/08_bt_sdp/Makefile b/examples/12_blufi/Makefile old mode 100755 new mode 100644 similarity index 86% rename from examples/08_bt_sdp/Makefile rename to examples/12_blufi/Makefile index 1e91bbb89..924da7c33 --- a/examples/08_bt_sdp/Makefile +++ b/examples/12_blufi/Makefile @@ -3,7 +3,7 @@ # project subdirectory. # -PROJECT_NAME := bluedroid_demos +PROJECT_NAME := blufi_demo COMPONENT_ADD_INCLUDEDIRS := components/include diff --git a/examples/07_blufi/README.rst b/examples/12_blufi/README.rst similarity index 100% rename from examples/07_blufi/README.rst rename to examples/12_blufi/README.rst diff --git a/examples/12_blufi/components/blufi/blufi.c b/examples/12_blufi/components/blufi/blufi.c new file mode 100644 index 000000000..34d3857f1 --- /dev/null +++ b/examples/12_blufi/components/blufi/blufi.c @@ -0,0 +1,138 @@ +// Copyright 2015-2016 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. + +/*************************************************************** +* +* This file is for gatt server device. It instantiates BATTERY +* sevice. It can be scanned and connected by central device, +* and the client will get the BAS value. It calls the API bta +* layer provides. +* +****************************************************************/ + +#include +#include +#include +#include + +#include "controller.h" + +#include "bt_trace.h" +#include "bt_types.h" + +#include "blufi.h" + +#include "esp_bt_defs.h" +#include "esp_bt_main.h" +#include "esp_blufi_api.h" + +extern void wifi_set_blue_config(char *ssid, char *passwd); + +#define HEADER_SSID "ssid" +#define HEADER_PASSWD "passwd" +#define HEADER_CONFIRM "confirm" + +static char tmp_ssid[32 + 1]; +static char tmp_passwd[64 + 1]; + +static void blufi_data_recv(uint8_t *data, int len) +{ + char *p = NULL; + LOG_DEBUG("the data is:%s\n", data); + + p = strstr(data, HEADER_SSID); + if (p) { + LOG_ERROR("SSID: %s\n", p + strlen(HEADER_SSID) + 1); + strcpy(tmp_ssid, p + strlen(HEADER_SSID) + 1); + } + p = strstr(data, HEADER_PASSWD); + if (p) { + LOG_ERROR("PASSWORD: %s\n", p + strlen(HEADER_PASSWD) + 1); + strcpy(tmp_passwd, p + strlen(HEADER_PASSWD) + 1); + } + p = strstr(data, HEADER_CONFIRM); + if (p) { + LOG_ERROR("CONFIRM\n"); + wifi_set_blue_config(tmp_ssid, tmp_passwd); + } + +} + +static void blufi_callback(uint32_t event, void *param) +{ + /* actually, should post to blufi_task handle the procedure, + * now, as a demo, we do simplely */ + switch (event) { + case ESP_BLUFI_EVENT_INIT_FINISH: + LOG_ERROR("blufi init finish\n"); + break; + case ESP_BLUFI_EVENT_RECV_DATA: { + LOG_DEBUG("blufi recv data\n"); + esp_blufi_cb_param_t *blufi_param = (esp_blufi_cb_param_t *)param; + blufi_data_recv(blufi_param->recv_data.data, blufi_param->recv_data.data_len); + break; + } + default: + break; + } +} + +static esp_err_t blufi_startup_in_blufi_task(void *arg) +{ + /*set connectable,discoverable, pairable and paired only modes of local device*/ + tBTA_DM_DISC disc_mode = BTA_DM_BLE_GENERAL_DISCOVERABLE; + tBTA_DM_CONN conn_mode = BTA_DM_BLE_CONNECTABLE; + BTA_DmSetVisibility(disc_mode, conn_mode, (uint8_t)BTA_DM_NON_PAIRABLE, (uint8_t)BTA_DM_CONN_ALL); + + esp_blufi_register_callback(blufi_callback); + esp_blufi_profile_init(); + + return ESP_OK; +} + + +static void blufi_startup(void) +{ + blufi_transfer_context(blufi_startup_in_blufi_task, NULL); +} + +esp_err_t blufi_enable(void *arg) +{ + esp_err_t err; + + BTM_SetTraceLevel(BT_TRACE_LEVEL_ERROR); + + err = esp_enable_bluetooth(); + if (err) { + LOG_ERROR("%s failed\n", __func__); + return err; + } + blufi_startup(); + vTaskDelay(1000 / portTICK_PERIOD_MS); + + return err; +} + +esp_err_t blufi_disable(void *arg) +{ + esp_err_t err; + + err = esp_disable_bluetooth(); + + if (arg) { + ((void (*)(void))arg)(); + } + + return err; +} diff --git a/examples/07_blufi/components/blufi/blufi_task.c b/examples/12_blufi/components/blufi/blufi_task.c similarity index 61% rename from examples/07_blufi/components/blufi/blufi_task.c rename to examples/12_blufi/components/blufi/blufi_task.c index f02a8143f..cda66c051 100644 --- a/examples/07_blufi/components/blufi/blufi_task.c +++ b/examples/12_blufi/components/blufi/blufi_task.c @@ -45,41 +45,41 @@ static void blufi_task(void *arg) { BtTaskEvt_t e; - for (;;) { - if (pdTRUE == xQueueReceive(xBlufiTaskQueue, &e, (portTickType)portMAX_DELAY)) { - switch (e.sig) { - case BLUFI_SIG_SWITCH_CONTEXT: - if (e.cb) { - ((BtTaskCb_t)e.cb)(e.arg); - } - break; - default: - break; - } - } + for (;;) { + if (pdTRUE == xQueueReceive(xBlufiTaskQueue, &e, (portTickType)portMAX_DELAY)) { + switch (e.sig) { + case BLUFI_SIG_SWITCH_CONTEXT: + if (e.cb) { + ((BtTaskCb_t)e.cb)(e.arg); + } + break; + default: + break; + } + } } } static esp_err_t blufi_task_post(uint32_t sig, void *par, void *cb, void *arg) { - BtTaskEvt_t evt; + BtTaskEvt_t evt; - evt.sig = sig; - evt.par = par; - evt.cb = cb; - evt.arg = arg; + evt.sig = sig; + evt.par = par; + evt.cb = cb; + evt.arg = arg; - if (xQueueSend(xBlufiTaskQueue, &evt, 10/portTICK_RATE_MS) != pdTRUE) { - LOG_ERROR("Blufi Post failed\n"); - return ESP_FAIL; - } + if (xQueueSend(xBlufiTaskQueue, &evt, 10 / portTICK_RATE_MS) != pdTRUE) { + LOG_ERROR("Blufi Post failed\n"); + return ESP_FAIL; + } - return ESP_OK; + return ESP_OK; } esp_err_t blufi_transfer_context(blufi_task_cb_t cb, void *arg) { - LOG_DEBUG("%s cb %08x, arg %u\n", __func__, cb, arg); + LOG_DEBUG("%s cb %08x, arg %u\n", __func__, (uint32_t)cb, (uint32_t)arg); return blufi_task_post(BLUFI_SIG_SWITCH_CONTEXT, 0, cb, arg); } @@ -93,16 +93,18 @@ static void blufi_task_deinit(void) static void blufi_task_init(void) { - xBlufiTaskQueue = xQueueCreate(10, sizeof(BtTaskEvt_t)); - xTaskCreate(blufi_task, "BlUFI", 8192, NULL, configMAX_PRIORITIES - 3, xBlufiTaskHandle); + xBlufiTaskQueue = xQueueCreate(5, sizeof(BtTaskEvt_t)); + xTaskCreate(blufi_task, "BlUFI", 4096, NULL, configMAX_PRIORITIES - 3, xBlufiTaskHandle); } -void blufi_init(void) { - blufi_task_init(); - blufi_transfer_context(blufi_enable, NULL); +void blufi_init(void) +{ + blufi_task_init(); + blufi_transfer_context(blufi_enable, NULL); } -void blufi_deinit(void) { - blufi_transfer_context(blufi_disable, blufi_task_deinit); +void blufi_deinit(void) +{ + blufi_transfer_context(blufi_disable, blufi_task_deinit); } diff --git a/examples/07_blufi/components/blufi/component.mk b/examples/12_blufi/components/blufi/component.mk similarity index 100% rename from examples/07_blufi/components/blufi/component.mk rename to examples/12_blufi/components/blufi/component.mk diff --git a/components/bt/bluedroid/profiles/core/include/bt_prf_task.h b/examples/12_blufi/components/blufi/include/blufi.h similarity index 53% rename from components/bt/bluedroid/profiles/core/include/bt_prf_task.h rename to examples/12_blufi/components/blufi/include/blufi.h index 5db370ce6..c79695edc 100644 --- a/components/bt/bluedroid/profiles/core/include/bt_prf_task.h +++ b/examples/12_blufi/components/blufi/include/blufi.h @@ -12,39 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include "bt_defs.h" -#include "fixed_queue.h" +#ifndef __BT_APP_COMMON_H__ +#define __BT_APP_COMMON_H__ -#ifndef BT_PRF_TASK_H__ -#define BT_PRF_TASK_H__ +#include +#include "osi.h" +#include "bt_common_types.h" +#include "esp_err.h" -/* Functions provided by bt_prf_task.c -************************************ -*/ +enum BLUFI_SIG { + BLUFI_SIG_SWITCH_CONTEXT = 0, + BLUFI_SIG_ENABLE, + BLUFI_SIG_DISABLE, +}; +typedef esp_err_t (*blufi_task_cb_t)(void *arg); -void bt_prf_task_thread_handler(void *arg); +void blufi_init(void); +void blufi_deinit(void); -void bt_prf_init_core(void); -void bt_prf_free_core(void); +esp_err_t blufi_enable(void *arg); +esp_err_t blufi_disable(void *arg); -void bt_prf_task_post(uint32_t sig); +esp_err_t blufi_transfer_context(blufi_task_cb_t cb, void *arg); - -void bt_prf_StartUp(void); -void bt_prf_ShutDown(void); - -void bt_prf_task_start_up(void); -void bt_prf_task_shut_down(void); - -void bt_profile_msg_ready(fixed_queue_t *queue); - - - - - - - - -#endif /// BT_PRF_TASK_H__ +#endif /* __BT_APP_COMMON_H__ */ diff --git a/examples/06_bluedroid_demos/main/component.mk b/examples/12_blufi/main/component.mk similarity index 100% rename from examples/06_bluedroid_demos/main/component.mk rename to examples/12_blufi/main/component.mk diff --git a/examples/07_blufi/main/demo_main.c b/examples/12_blufi/main/demo_main.c similarity index 67% rename from examples/07_blufi/main/demo_main.c rename to examples/12_blufi/main/demo_main.c index 3aeea617a..31a315d21 100644 --- a/examples/07_blufi/main/demo_main.c +++ b/examples/12_blufi/main/demo_main.c @@ -26,10 +26,12 @@ #include "bt.h" #include "bta_api.h" -#include "esp_bt_common.h" +#include "esp_blufi_api.h" +#include "esp_bt_defs.h" +#include "esp_bt_main.h" #include "blufi.h" -#define WIFI_LIST_NUM 10 +#define WIFI_LIST_NUM 10 /* FreeRTOS event group to signal when we are connected & ready to make a request */ static EventGroupHandle_t wifi_event_group; @@ -41,7 +43,6 @@ const int CONNECTED_BIT = BIT0; -static wifi_scan_config_t scan_config; static wifi_config_t sta_config; static char tmp_ssid[33]; @@ -50,27 +51,25 @@ static bool confirm = false; void wifi_set_blue_config(char *ssid, char *passwd) { - memset(tmp_ssid, 0, 33); - memset(tmp_passwd, 0, 33); - strcpy(tmp_ssid, ssid); - strcpy(tmp_passwd, passwd); - confirm = true; - LOG_DEBUG("confirm true\n"); + memset(tmp_ssid, 0, 33); + memset(tmp_passwd, 0, 33); + strcpy(tmp_ssid, ssid); + strcpy(tmp_passwd, passwd); + confirm = true; + LOG_DEBUG("confirm true\n"); } -extern void blufi_config_failed(void); -extern void blufi_config_success(void); static esp_err_t event_handler(void *ctx, system_event_t *event) { - switch(event->event_id) { + switch (event->event_id) { case SYSTEM_EVENT_STA_START: esp_wifi_connect(); break; case SYSTEM_EVENT_STA_GOT_IP: xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); - blufi_config_success(); - esp_disable_bluetooth(); //close bluetooth function - //esp_deinit_bluetooth(); //free bluetooth resource + esp_blufi_send_config_state(ESP_BLUFI_CONFIG_OK); + esp_disable_bluetooth(); //close bluetooth function + //esp_deinit_bluetooth(); //free bluetooth resource break; case SYSTEM_EVENT_STA_DISCONNECTED: /* This is a workaround as ESP32 WiFi libs don't currently @@ -97,30 +96,29 @@ static void initialise_wifi(void) } -static int loop = 0; void wifiTestTask(void *pvParameters) { esp_err_t ret; while (1) { vTaskDelay(1000 / portTICK_PERIOD_MS); - if (confirm) { - confirm = false; + if (confirm) { + confirm = false; - strcpy(sta_config.sta.ssid, tmp_ssid); - strcpy(sta_config.sta.password, tmp_passwd); - sta_config.sta.bssid_set = 0; + strcpy(sta_config.sta.ssid, tmp_ssid); + strcpy(sta_config.sta.password, tmp_passwd); + sta_config.sta.bssid_set = 0; - ret = esp_wifi_disconnect(); - LOG_INFO("esp_wifi config\n"); - esp_wifi_set_config(WIFI_IF_STA, &sta_config); - LOG_INFO("esp_wifi connect\n"); - ret = esp_wifi_connect(); - if (ret != ESP_OK) { - LOG_ERROR("esp_wifi connect failed\n"); - blufi_config_failed(); - } - } + ret = esp_wifi_disconnect(); + LOG_INFO("esp_wifi config\n"); + esp_wifi_set_config(WIFI_IF_STA, &sta_config); + LOG_INFO("esp_wifi connect\n"); + ret = esp_wifi_connect(); + if (ret != ESP_OK) { + LOG_ERROR("esp_wifi connect failed\n"); + esp_blufi_send_config_state(ESP_BLUFI_CONFIG_FAILED); + } + } } } @@ -132,10 +130,16 @@ void app_main() system_init(); initialise_wifi(); - vTaskDelay(3000 / portTICK_PERIOD_MS); + //vTaskDelay(3000 / portTICK_PERIOD_MS); bt_controller_init(); xTaskCreatePinnedToCore(&wifiTestTask, "wifiTestTask", 2048, NULL, 20, NULL, 0); - esp_init_bluetooth(blufi_init); + LOG_ERROR("%s init bluetooth\n", __func__); + ret = esp_init_bluetooth(); + if (ret) { + LOG_ERROR("%s init bluetooth failed\n", __func__); + return; + } + blufi_init(); } diff --git a/examples/06_bluedroid_demos/Makefile b/examples/13_bt_sdp/Makefile old mode 100644 new mode 100755 similarity index 100% rename from examples/06_bluedroid_demos/Makefile rename to examples/13_bt_sdp/Makefile diff --git a/examples/08_bt_sdp/README.rst b/examples/13_bt_sdp/README.rst similarity index 100% rename from examples/08_bt_sdp/README.rst rename to examples/13_bt_sdp/README.rst diff --git a/examples/08_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c b/examples/13_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c similarity index 88% rename from examples/08_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c rename to examples/13_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c index 220c01d31..b6661067b 100755 --- a/examples/08_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c +++ b/examples/13_bt_sdp/components/bluedroid_demos/app_core/bt_app_core.c @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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. + #include #include #include diff --git a/examples/08_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c b/examples/13_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c similarity index 87% rename from examples/08_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c rename to examples/13_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c index 3587ba6d4..691199c00 100644 --- a/examples/08_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c +++ b/examples/13_bt_sdp/components/bluedroid_demos/app_project/SampleBtSdp.c @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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. + #include #include #include diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/btif_core.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/btif_core.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/btif_core.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/btif_core.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/btif_dm.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/btif_dm.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/btif_dm.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/btif_dm.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/btif_sdp.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/btif_sdp.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/btif_sdp.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/btif_sdp.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/btif_sdp_server.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/btif_sdp_server.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/btif_sdp_server.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/btif_sdp_server.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/btif_util.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/btif_util.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/btif_util.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/btif_util.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/btif/stack_manager.c b/examples/13_bt_sdp/components/bluedroid_demos/btif/stack_manager.c similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/btif/stack_manager.c rename to examples/13_bt_sdp/components/bluedroid_demos/btif/stack_manager.c diff --git a/examples/08_bt_sdp/components/bluedroid_demos/component.mk b/examples/13_bt_sdp/components/bluedroid_demos/component.mk similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/component.mk rename to examples/13_bt_sdp/components/bluedroid_demos/component.mk diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/bt_app_common.h b/examples/13_bt_sdp/components/bluedroid_demos/include/bt_app_common.h similarity index 60% rename from examples/08_bt_sdp/components/bluedroid_demos/include/bt_app_common.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/bt_app_common.h index 501bfccc9..c16ff1906 100755 --- a/examples/08_bt_sdp/components/bluedroid_demos/include/bt_app_common.h +++ b/examples/13_bt_sdp/components/bluedroid_demos/include/bt_app_common.h @@ -1,3 +1,17 @@ +// Copyright 2015-2016 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 __BT_APP_COMMON_H__ #define __BT_APP_COMMON_H__ diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_api.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_api.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_api.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_api.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_common.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_common.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_common.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_common.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_dm.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_dm.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_dm.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_dm.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_sdp.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_sdp.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_sdp.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_sdp.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_stack_manager.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_stack_manager.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_stack_manager.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_stack_manager.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/btif_util.h b/examples/13_bt_sdp/components/bluedroid_demos/include/btif_util.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/btif_util.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/btif_util.h diff --git a/examples/08_bt_sdp/components/bluedroid_demos/include/stack_manager.h b/examples/13_bt_sdp/components/bluedroid_demos/include/stack_manager.h similarity index 100% rename from examples/08_bt_sdp/components/bluedroid_demos/include/stack_manager.h rename to examples/13_bt_sdp/components/bluedroid_demos/include/stack_manager.h diff --git a/examples/07_blufi/main/component.mk b/examples/13_bt_sdp/main/component.mk old mode 100644 new mode 100755 similarity index 100% rename from examples/07_blufi/main/component.mk rename to examples/13_bt_sdp/main/component.mk diff --git a/examples/06_bluedroid_demos/main/demo_main.c b/examples/13_bt_sdp/main/demo_main.c old mode 100644 new mode 100755 similarity index 94% rename from examples/06_bluedroid_demos/main/demo_main.c rename to examples/13_bt_sdp/main/demo_main.c index 7ea523c0e..5489abb4e --- a/examples/06_bluedroid_demos/main/demo_main.c +++ b/examples/13_bt_sdp/main/demo_main.c @@ -29,7 +29,7 @@ void pingTask(void *pvParameters) { while (1) { vTaskDelay(1000 / portTICK_PERIOD_MS); - //printf("ping\n"); + printf("ping\n"); } } @@ -38,5 +38,5 @@ void app_main() bt_controller_init(); xTaskCreatePinnedToCore(&pingTask, "pingTask", 2048, NULL, 5, NULL, 0); bt_app_task_start_up(); - bte_main_boot_entry(bt_app_core_start); + // bte_main_boot_entry(bt_app_core_start); } diff --git a/examples/14_gatt_server/Makefile b/examples/14_gatt_server/Makefile new file mode 100644 index 000000000..fae1ac6f5 --- /dev/null +++ b/examples/14_gatt_server/Makefile @@ -0,0 +1,11 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := gatt_server_demos + +COMPONENT_ADD_INCLUDEDIRS := components/include + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/14_gatt_server/README.rst b/examples/14_gatt_server/README.rst new file mode 100644 index 000000000..85d860f28 --- /dev/null +++ b/examples/14_gatt_server/README.rst @@ -0,0 +1,5 @@ +ESP-IDF GATT SERVER demo +======================== + +This is the demo for user to use ESP_APIs to create a GATT Server. + diff --git a/examples/08_bt_sdp/main/component.mk b/examples/14_gatt_server/main/component.mk old mode 100755 new mode 100644 similarity index 100% rename from examples/08_bt_sdp/main/component.mk rename to examples/14_gatt_server/main/component.mk diff --git a/examples/14_gatt_server/main/gatts_demo.c b/examples/14_gatt_server/main/gatts_demo.c new file mode 100644 index 000000000..615b66af6 --- /dev/null +++ b/examples/14_gatt_server/main/gatts_demo.c @@ -0,0 +1,226 @@ +// Copyright 2015-2016 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. + +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_log.h" +#include "nvs_flash.h" +#include "bt.h" +#include "bta_api.h" + +#include "esp_gap_ble_api.h" +#include "esp_gatts_api.h" +#include "esp_bt_defs.h" +#include "esp_bt_main.h" +#include "esp_bt_main.h" + +#define GATTS_SERVICE_UUID_TEST 0x00FF +#define GATTS_CHAR_UUID_TEST 0xFF01 +#define GATTS_DESCR_UUID_TEST 0x3333 +#define APP_ID_TEST 0x18 +#define GATTS_NUM_HANDLE_TEST 4 +#define TEST_DEVICE_NAME "ESP_GATTS_DEMO" + +#define TEST_MANUFACTURER_DATA_LEN 17 +static uint16_t test_service_uuid = GATTS_SERVICE_UUID_TEST; +static uint8_t test_service_uuid128[32] = { + /* LSB <--------------------------------------------------------------------------------> MSB */ + //first uuid, 16bit, [12],[13] is the value + 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xAB, 0xCD, 0x00, 0x00, + //second uuid, 32bit, [12], [13], [14], [15] is the value + 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xAB, 0xCD, 0xAB, 0xCD, +}; + +static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56}; +static esp_ble_adv_data_t test_adv_data = { + .set_scan_rsp = false, + .include_name = true, + .include_txpower = true, + .min_interval = 0x20, + .max_interval = 0x40, + .appearance = 0x00, + .manufacturer_len = 0, //TEST_MANUFACTURER_DATA_LEN, + .p_manufacturer_data = NULL, //&test_manufacturer[0], + .service_data_len = 0, + .p_service_data = NULL, + .service_uuid_len = 32, + .p_service_uuid = test_service_uuid128, + .flag = 0x2, +}; + +static esp_ble_adv_params_t test_adv_params = { + .adv_int_min = 0x20, + .adv_int_max = 0x40, + .adv_type = ADV_TYPE_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + //.peer_addr = + //.peer_addr_type = + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, +}; + +struct gatts_test_inst { + uint16_t gatt_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_handle; + esp_gatt_srvc_id_t service_id; + uint16_t char_handle; + esp_bt_uuid_t char_uuid; + esp_gatt_perm_t perm; + esp_gatt_char_prop_t property; + uint16_t descr_handle; + esp_bt_uuid_t descr_uuid; +}; +static struct gatts_test_inst gl_test; + +static void gap_event_handler(uint32_t event, void *param) +{ + LOG_ERROR("GAP_EVT, event %d\n", event); + + switch (event) { + case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: + esp_ble_gap_start_advertising(&test_adv_params); + break; + default: + break; + } +} + +static void gatts_event_handler(uint32_t event, void *param) +{ + esp_ble_gatts_cb_param_t *p = (esp_ble_gatts_cb_param_t *)param; + + switch (event) { + case ESP_GATTS_REG_EVT: + LOG_INFO("REGISTER_APP_EVT, status %d, gatt_if %d, app_id %d\n", p->reg.status, p->reg.gatt_if, p->reg.app_id); + gl_test.gatt_if = p->reg.gatt_if; + gl_test.service_id.is_primary = true; + gl_test.service_id.id.inst_id = 0x00; + gl_test.service_id.id.uuid.len = ESP_UUID_LEN_16; + gl_test.service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST; + + esp_ble_gap_set_device_name(TEST_DEVICE_NAME); + esp_ble_gap_config_adv_data(&test_adv_data); + + esp_ble_gatts_create_service(gl_test.gatt_if, &gl_test.service_id, GATTS_NUM_HANDLE_TEST); + break; + case ESP_GATTS_READ_EVT: { + LOG_INFO("GATT_READ_EVT, conn_id %d, trans_id %d, handle %d\n", p->read.conn_id, p->read.trans_id, p->read.handle); + esp_gatt_rsp_t rsp; + memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); + rsp.attr_value.handle = p->read.handle; + rsp.attr_value.len = 4; + rsp.attr_value.value[0] = 0xde; + rsp.attr_value.value[1] = 0xed; + rsp.attr_value.value[2] = 0xbe; + rsp.attr_value.value[3] = 0xef; + esp_ble_gatts_send_response(p->read.conn_id, p->read.trans_id, + ESP_GATT_OK, &rsp); + break; + } + case ESP_GATTS_WRITE_EVT: { + LOG_INFO("GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d\n", p->write.conn_id, p->write.trans_id, p->write.handle); + LOG_INFO("GATT_WRITE_EVT, value len %d, value %08x\n", p->write.len, *(uint32_t *)p->write.value); + esp_ble_gatts_send_response(p->write.conn_id, p->write.trans_id, ESP_GATT_OK, NULL); + break; + } + case ESP_GATTS_EXEC_WRITE_EVT: + case ESP_GATTS_MTU_EVT: + case ESP_GATTS_CONF_EVT: + case ESP_GATTS_UNREG_EVT: + break; + case ESP_GATTS_CREATE_EVT: + LOG_INFO("CREATE_SERVICE_EVT, status %d, gatt_if %d, service_handle %d\n", p->create.status, p->create.gatt_if, p->create.service_handle); + gl_test.service_handle = p->create.service_handle; + gl_test.char_uuid.len = ESP_UUID_LEN_16; + gl_test.char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST; + + esp_ble_gatts_start_service(gl_test.service_handle); + + esp_ble_gatts_add_char(gl_test.service_handle, &gl_test.char_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY); + break; + case ESP_GATTS_ADD_INCL_SRVC_EVT: + break; + case ESP_GATTS_ADD_CHAR_EVT: + LOG_INFO("ADD_CHAR_EVT, status %d, gatt_if %d, attr_handle %d, service_handle %d\n", + p->add_char.status, p->add_char.gatt_if, p->add_char.attr_handle, p->add_char.service_handle); + + gl_test.char_handle = p->add_char.attr_handle; + gl_test.descr_uuid.len = ESP_UUID_LEN_16; + gl_test.descr_uuid.uuid.uuid16 = GATT_UUID_CHAR_CLIENT_CONFIG; + esp_ble_gatts_add_char_descr(gl_test.service_handle, &gl_test.descr_uuid, + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE); + break; + case ESP_GATTS_ADD_CHAR_DESCR_EVT: + LOG_INFO("ADD_DESCR_EVT, status %d, gatt_if %d, attr_handle %d, service_handle %d\n", + p->add_char.status, p->add_char.gatt_if, p->add_char.attr_handle, p->add_char.service_handle); + break; + case ESP_GATTS_DELELTE_EVT: + break; + case ESP_GATTS_START_EVT: + LOG_INFO("SERVICE_START_EVT, status %d, gatt_if %d, service_handle %d\n", + p->start.status, p->start.gatt_if, p->start.service_handle); + break; + case ESP_GATTS_STOP_EVT: + break; + case ESP_GATTS_CONNECT_EVT: + LOG_INFO("SERVICE_START_EVT, conn_id %d, gatt_if %d, remote %02x:%02x:%02x:%02x:%02x:%02x:, is_conn %d\n", + p->connect.conn_id, p->connect.gatt_if, + p->connect.remote_bda[0], p->connect.remote_bda[1], p->connect.remote_bda[2], + p->connect.remote_bda[3], p->connect.remote_bda[4], p->connect.remote_bda[5], + p->connect.is_connected); + gl_test.conn_id = p->connect.conn_id; + break; + case ESP_GATTS_DISCONNECT_EVT: + case ESP_GATTS_OPEN_EVT: + case ESP_GATTS_CANCEL_OPEN_EVT: + case ESP_GATTS_CLOSE_EVT: + case ESP_GATTS_LISTEN_EVT: + case ESP_GATTS_CONGEST_EVT: + default: + break; + } +} + +void app_main() +{ + esp_err_t ret; + + bt_controller_init(); + LOG_INFO("%s init bluetooth\n", __func__); + ret = esp_init_bluetooth(); + if (ret) { + LOG_ERROR("%s init bluetooth failed\n", __func__); + return; + } + ret = esp_enable_bluetooth(); + if (ret) { + LOG_ERROR("%s enable bluetooth failed\n", __func__); + return; + } + + esp_ble_gatts_register_callback(gatts_event_handler); + esp_ble_gap_register_callback(gap_event_handler); + esp_ble_gatts_app_register(GATTS_SERVICE_UUID_TEST); + + return; +} diff --git a/examples/07_blufi/Makefile b/examples/15_gatt_client/Makefile similarity index 86% rename from examples/07_blufi/Makefile rename to examples/15_gatt_client/Makefile index 1e91bbb89..a0428347a 100644 --- a/examples/07_blufi/Makefile +++ b/examples/15_gatt_client/Makefile @@ -3,7 +3,7 @@ # project subdirectory. # -PROJECT_NAME := bluedroid_demos +PROJECT_NAME := gatt_client_demo COMPONENT_ADD_INCLUDEDIRS := components/include diff --git a/examples/15_gatt_client/README.rst b/examples/15_gatt_client/README.rst new file mode 100644 index 000000000..c7c4d490b --- /dev/null +++ b/examples/15_gatt_client/README.rst @@ -0,0 +1,5 @@ +ESP-IDF GATT CLIENT demo +======================== + +This is the demo for user to use ESP_APIs to create a GATT Client. + diff --git a/examples/06_bluedroid_demos/components/bluedroid_demos/component.mk b/examples/15_gatt_client/main/component.mk similarity index 50% rename from examples/06_bluedroid_demos/components/bluedroid_demos/component.mk rename to examples/15_gatt_client/main/component.mk index d8ee3a878..afcb917c6 100644 --- a/examples/06_bluedroid_demos/components/bluedroid_demos/component.mk +++ b/examples/15_gatt_client/main/component.mk @@ -7,16 +7,4 @@ # please read the ESP-IDF documents if you need to do this. # -COMPONENT_SRCDIRS := \ - app_core \ - app_client_profiles/battery_c \ - app_client_profiles \ - app_profiles/app_sample_button \ - app_profiles/app_WX_airsync \ - app_profiles \ - app_project - -CFLAGS += -Wno-error=unused-label -Wno-error=return-type -Wno-error=missing-braces -Wno-error=pointer-sign -Wno-error=parentheses -I./include - - -include $(IDF_PATH)/make/component_common.mk +#include $(IDF_PATH)/make/component_common.mk diff --git a/examples/15_gatt_client/main/gattc_demo.c b/examples/15_gatt_client/main/gattc_demo.c new file mode 100644 index 000000000..0732dc8a4 --- /dev/null +++ b/examples/15_gatt_client/main/gattc_demo.c @@ -0,0 +1,197 @@ +// Copyright 2015-2016 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. + + + +/**************************************************************************** +* +* This file is for gatt client. It can scan ble device, connect one device, +* +****************************************************************************/ + +#include +#include +#include +#include +#include "controller.h" + +#include "bt.h" +#include "bt_trace.h" +#include "bt_types.h" +#include "btm_api.h" +#include "bta_api.h" +#include "bta_gatt_api.h" +#include "esp_gap_ble_api.h" +#include "esp_gattc_api.h" +#include "esp_gatt_defs.h" +#include "esp_bt_main.h" + + +#define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" +#define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] + +esp_gatt_if_t client_if; +esp_gatt_status_t status = ESP_GATT_ERROR; +bool connet = false; +uint16_t simpleClient_id = 0xEE; + +const char device_name[] = "Heart Rate"; + +static esp_ble_scan_params_t ble_scan_params = { + .scan_type = BLE_SCAN_TYPE_ACTIVE, + .own_addr_type = ESP_PUBLIC_ADDR, + .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, + .scan_interval = 0x50, + .scan_window = 0x30 +}; + + +static void esp_gap_cb(uint32_t event, void *param); + +static void esp_gattc_cb(uint32_t event, void *param); + +static void esp_gap_cb(uint32_t event, void *param) +{ + uint8_t *adv_name = NULL; + uint8_t adv_name_len = 0; + switch (event) { + case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: { + //the unit of the duration is second + uint32_t duration = 10; + esp_ble_gap_start_scanning(duration); + break; + } + case ESP_GAP_BLE_SCAN_RESULT_EVT: { + esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param; + switch (scan_result->scan_rst.search_evt) { + case ESP_GAP_SEARCH_INQ_RES_EVT: + for (int i = 0; i < 6; i++) { + LOG_INFO("%x:", scan_result->scan_rst.bda[i]); + } + LOG_INFO("\n"); + adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, + ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len); + LOG_INFO("adv_name_len=%x\n", adv_name_len); + for (int j = 0; j < adv_name_len; j++) { + LOG_INFO("%c", adv_name[j]); + } + LOG_INFO("\n"); + for (int j = 0; j < adv_name_len; j++) { + LOG_INFO("%c", device_name[j]); + } + LOG_INFO("\n"); + + if (adv_name != NULL) { + if (strcmp((char *)adv_name, device_name) == 0) { + LOG_INFO("the name eque to Heart Rate.\n"); + if (status == ESP_GATT_OK && connet == false) { + connet = true; + LOG_INFO("Connet to the remote device.\n"); + esp_ble_gap_stop_scanning(); + esp_ble_gattc_open(client_if, scan_result->scan_rst.bda, true); + } + } + } + break; + case ESP_GAP_SEARCH_INQ_CMPL_EVT: + break; + default: + break; + } + break; + } + default: + break; + } +} + + +static void esp_gattc_cb(uint32_t event, void *param) +{ + uint16_t conn_id = 0; + esp_ble_gattc_cb_param_t *p_data = (esp_ble_gattc_cb_param_t *)param; + + LOG_INFO("esp_gattc_cb, event = %x\n", event); + switch (event) { + case ESP_GATTC_REG_EVT: + status = p_data->reg.status; + client_if = p_data->reg.gatt_if; + LOG_INFO("status = %x, client_if = %x\n", status, client_if); + break; + case ESP_GATTC_OPEN_EVT: + conn_id = p_data->open.conn_id; + LOG_INFO("ESP_GATTC_OPEN_EVT conn_id %d, if %d, status %d\n", conn_id, p_data->open.gatt_if, p_data->open.status); + esp_ble_gattc_search_service(conn_id, NULL); + break; + case ESP_GATTC_SEARCH_RES_EVT: { + esp_gatt_srvc_id_t *srvc_id = &p_data->search_res.service_id; + conn_id = p_data->open.conn_id; + LOG_INFO("SEARCH RES: conn_id = %x\n", conn_id); + if (srvc_id->id.uuid.len == ESP_UUID_LEN_16) { + LOG_INFO("UUID16: %x\n", srvc_id->id.uuid.uuid.uuid16); + } else if (srvc_id->id.uuid.len == ESP_UUID_LEN_32) { + LOG_INFO("UUID32: %x\n", srvc_id->id.uuid.uuid.uuid32); + } else if (srvc_id->id.uuid.len == ESP_UUID_LEN_128) { + LOG_INFO("UUID128: %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n", srvc_id->id.uuid.uuid.uuid128[0], + srvc_id->id.uuid.uuid.uuid128[1], srvc_id->id.uuid.uuid.uuid128[2], srvc_id->id.uuid.uuid.uuid128[3], + srvc_id->id.uuid.uuid.uuid128[4], srvc_id->id.uuid.uuid.uuid128[5], srvc_id->id.uuid.uuid.uuid128[6], + srvc_id->id.uuid.uuid.uuid128[7], srvc_id->id.uuid.uuid.uuid128[8], srvc_id->id.uuid.uuid.uuid128[9], + srvc_id->id.uuid.uuid.uuid128[10], srvc_id->id.uuid.uuid.uuid128[11], srvc_id->id.uuid.uuid.uuid128[12], + srvc_id->id.uuid.uuid.uuid128[13], srvc_id->id.uuid.uuid.uuid128[14], srvc_id->id.uuid.uuid.uuid128[15]); + } else { + LOG_ERROR("UNKNOWN LEN %d\n", srvc_id->id.uuid.len); + } + break; + } + case ESP_GATTC_SEARCH_CMPL_EVT: + conn_id = p_data->search_cmpl.conn_id; + LOG_INFO("SEARCH_CMPL: conn_id = %x, status %d\n", conn_id, p_data->search_cmpl.status); + break; + default: + break; + } +} + +void ble_client_appRegister(void) +{ + LOG_INFO("register callback\n"); + + //register the scan callback function to the gap moudule + if ((status = esp_ble_gap_register_callback(esp_gap_cb)) != ESP_OK) { + LOG_ERROR("gap register error, error code = %x\n", status); + return; + } + + //register the callback function to the gattc module + if ((status = esp_ble_gattc_register_callback(esp_gattc_cb)) != ESP_OK) { + LOG_ERROR("gattc register error, error code = %x\n", status); + return; + } + esp_ble_gattc_app_register(simpleClient_id); + esp_ble_gap_set_scan_params(&ble_scan_params); +} + +void gattc_client_test(void) +{ + esp_init_bluetooth(); + esp_enable_bluetooth(); + ble_client_appRegister(); +} + +void app_main() +{ + bt_controller_init(); + gattc_client_test(); +} + diff --git a/examples/README.md b/examples/README.md index 2cf66b9d0..e4422e91b 100644 --- a/examples/README.md +++ b/examples/README.md @@ -26,7 +26,7 @@ If you're looking for a more bare-bones project to start from, try [esp-idf-temp If you have a new example you think we'd like, please consider sending it to us as a Pull Request. -Please read the esp-idf CONTRIBUTING.md file which lays out general contribution rules. +Please read the esp-idf CONTRIBUTING.rst file which lays out general contribution rules. In addition, here are some tips for creating good examples: diff --git a/make/build_examples.sh b/make/build_examples.sh index d26486287..8345dab50 100755 --- a/make/build_examples.sh +++ b/make/build_examples.sh @@ -15,16 +15,20 @@ RESULT=0 set -e for example in ${IDF_PATH}/examples/*; do - [ -f ${example}/Makefile ] || continue - echo "Building ${example} as ${EXAMPLE_NUM}..." - mkdir ${EXAMPLE_NUM} - cp -r ${example} ${EXAMPLE_NUM} - pushd ${EXAMPLE_NUM}/`basename ${example}` - # can't do "make defconfig all" as this will trip menuconfig - # sometimes - make defconfig && make || RESULT=$? - popd - EXAMPLE_NUM=$(( $EXAMPLE_NUM + 1 )) + [ -f ${example}/Makefile ] || continue + echo "Building ${example} as ${EXAMPLE_NUM}..." + mkdir ${EXAMPLE_NUM} + cp -r ${example} ${EXAMPLE_NUM} + pushd ${EXAMPLE_NUM}/`basename ${example}` + + # be stricter in the CI build than the default IDF settings + export EXTRA_CFLAGS="-Werror -Werror=deprecated-declarations" + export EXTRA_CXXFLAGS=${EXTRA_CFLAGS} + + # build non-verbose first, only build verbose if there's an error + (make clean defconfig && make all ) || (RESULT=$?; make V=1) + popd + EXAMPLE_NUM=$(( $EXAMPLE_NUM + 1 )) done exit $RESULT diff --git a/make/common.mk b/make/common.mk index 2b7376a4d..4d40f7abc 100644 --- a/make/common.mk +++ b/make/common.mk @@ -1,12 +1,14 @@ -# Functionality common to both top-level project makefile -# and component makefiles +# Functionality common to both top-level project makefile (project.mk) +# and component makefiles (component_wrapper.mk) # -# Include project config file, if it exists. +# Include project config makefile, if it exists. # -# (Note that we only rebuild auto.conf automatically for some targets, -# see project_config.mk for details.) --include $(BUILD_DIR_BASE)/include/config/auto.conf +# (Note that we only rebuild this makefile automatically for some +# targets, see project_config.mk for details.) +SDKCONFIG_MAKEFILE ?= $(abspath $(BUILD_DIR_BASE)/include/config/auto.conf) +-include $(SDKCONFIG_MAKEFILE) +export SDKCONFIG_MAKEFILE # sub-makes (like bootloader) will reuse this path #Handling of V=1/VERBOSE=1 flag # @@ -14,47 +16,41 @@ # if V is unset or not 1, $(summary) echoes a summary and $(details) does nothing V ?= $(VERBOSE) ifeq ("$(V)","1") -Q := summary := @true details := @echo else -Q := @ summary := @echo details := @true + +# disable echoing of commands, directory names +MAKEFLAGS += --silent endif -# Pseudo-target to check a git submodule has been properly initialised -# -# $(eval $(call SubmoduleCheck,FILENAMES,SUBMODULE_PATH)) to create a target that -# automatically runs 'git submodule update --init SUBMODULE_PATH' if any of -# the files in FILENAMES are missing, and fails if this is not possible. -# -# Will also print a WARNING if the submodule at SUBMODULE_PATH appears -# to require an update. -define SubmoduleCheck -$(1): - @echo "WARNING: Missing submodule $(2) for $$@..." - $(Q) [ -d ${IDF_PATH}/.git ] || ( echo "ERROR: esp-idf must be cloned from git to work."; exit 1) - $(Q) [ -x $(which git) ] || ( echo "ERROR: Need to run 'git submodule --init' in esp-idf root directory."; exit 1) - @echo "Attempting 'git submodule update --init' in esp-idf root directory..." - cd ${IDF_PATH} && git submodule update --init $(2) - -# Parse 'git submodule status' output for out-of-date submodule. -# Status output prefixes status line with '+' if the submodule commit doesn't match -ifneq ("$(shell cd ${IDF_PATH} && git submodule status $(2) | grep '^+')","") -$$(info WARNING: git submodule $2 may be out of date. Run 'git submodule update' to update.) -endif -endef - - - # General make utilities # convenience variable for printing an 80 asterisk wide separator line SEPARATOR:="*******************************************************************************" -# macro to remove quotes from an argument, ie $(call dequote (CONFIG_BLAH)) +# macro to remove quotes from an argument, ie $(call dequote,$(CONFIG_BLAH)) define dequote $(subst ",,$(1)) endef # " comment kept here to keep syntax highlighting happy + + +# macro to keep an absolute path as-is, but resolve a relative path +# against a particular parent directory +# +# $(1) path to resolve +# $(2) directory to resolve non-absolute path against +# +# Path and directory don't have to exist (definition of a "relative +# path" is one that doesn't start with /) +# +# $(2) can contain a trailing forward slash or not, result will not +# double any path slashes. +# +# example $(call resolvepath,$(CONFIG_PATH),$(CONFIG_DIR)) +define resolvepath +$(if $(filter /%,$(1)),$(1),$(subst //,/,$(2)/$(1))) +endef diff --git a/make/component_common.mk b/make/component_common.mk index bf2eace01..187e1ed63 100644 --- a/make/component_common.mk +++ b/make/component_common.mk @@ -1,110 +1 @@ -# Component common makefile -# -# This Makefile gets included in the Makefile of all the components to set the correct include paths etc. -# PWD is the build directory of the component and the top Makefile is the one in the -# component source dir. -# -# The way the Makefile differentiates between those two is by looking at the environment -# variable PROJECT_PATH. If this is set (to the basepath of the project), we're building a -# component and its Makefile has included this makefile. If not, we're building the entire project. -# - -# -# This Makefile requires the environment variable IDF_PATH to be set -# to the top-level directory where ESP-IDF is located (the directory -# containing this 'make' directory). -# - -ifeq ("$(PROJECT_PATH)","") -$(error Make was invoked from $(CURDIR). However please do not run make from the sdk or a component directory; invoke make from the project directory. See the ESP-IDF README for details.) -endif - -# Find the path to the component -COMPONENT_PATH := $(abspath $(dir $(firstword $(MAKEFILE_LIST)))) -export COMPONENT_PATH - -include $(IDF_PATH)/make/common.mk - -#Some of these options are overridable by the component's component.mk Makefile - -#Name of the component -COMPONENT_NAME ?= $(lastword $(subst /, ,$(realpath $(COMPONENT_PATH)))) - -#Absolute path of the .a file -COMPONENT_LIBRARY := lib$(COMPONENT_NAME).a - -#Source dirs a component has. Default to root directory of component. -COMPONENT_SRCDIRS ?= . - -#Object files which need to be linked into the library -#By default we take all .c/.S files in the component directory. -ifeq ("$(COMPONENT_OBJS)", "") -#Find all source files in all COMPONENT_SRCDIRS -COMPONENT_OBJS := $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.c,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.c))) -COMPONENT_OBJS += $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.cpp,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.cpp))) -COMPONENT_OBJS += $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.S,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.S))) -#Make relative by removing COMPONENT_PATH from all found object paths -COMPONENT_OBJS := $(patsubst $(COMPONENT_PATH)/%,%,$(COMPONENT_OBJS)) -endif - -#By default, include only the include/ dir. -COMPONENT_ADD_INCLUDEDIRS ?= include -COMPONENT_ADD_LDFLAGS ?= -l$(COMPONENT_NAME) - -#If we're called to compile something, we'll get passed the COMPONENT_INCLUDES -#variable with all the include dirs from all the components in random order. This -#means we can accidentally grab a header from another component before grabbing our own. -#To make sure that does not happen, re-order the includes so ours come first. -OWN_INCLUDES:=$(abspath $(addprefix $(COMPONENT_PATH)/,$(COMPONENT_ADD_INCLUDEDIRS) $(COMPONENT_PRIV_INCLUDEDIRS))) -COMPONENT_INCLUDES := $(OWN_INCLUDES) $(filter-out $(OWN_INCLUDES),$(COMPONENT_INCLUDES)) - -#This target is used to collect variable values from inside project.mk -# see project.mk GetVariable macro for details. -get_variable: - @echo "$(GET_VARIABLE)=$(call $(GET_VARIABLE)) " - -#Targets for build/clean. Use builtin recipe if component Makefile -#hasn't defined its own. -ifeq ("$(COMPONENT_OWNBUILDTARGET)", "") -build: $(COMPONENT_LIBRARY) - @mkdir -p $(COMPONENT_SRCDIRS) - -#Build the archive. We remove the archive first, otherwise ar will get confused if we update -#an archive when multiple filenames have the same name (src1/test.o and src2/test.o) -$(COMPONENT_LIBRARY): $(COMPONENT_OBJS) - $(summary) AR $@ - $(Q) rm -f $@ - $(Q) $(AR) cru $@ $(COMPONENT_OBJS) -endif - -ifeq ("$(COMPONENT_OWNCLEANTARGET)", "") -clean: - $(summary) RM $(COMPONENT_LIBRARY) $(COMPONENT_OBJS) $(COMPONENT_OBJS:.o=.d) $(COMPONENT_EXTRA_CLEAN) - $(Q) rm -f $(COMPONENT_LIBRARY) $(COMPONENT_OBJS) $(COMPONENT_OBJS:.o=.d) $(COMPONENT_EXTRA_CLEAN) -endif - -#Include all dependency files already generated --include $(COMPONENT_OBJS:.o=.d) - -#This pattern is generated for each COMPONENT_SRCDIR to compile the files in it. -define GenerateCompileTargets -# $(1) - directory containing source files, relative to $(COMPONENT_PATH) -$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.c | $(1) - $$(summary) CC $$@ - $$(Q) $$(CC) $$(CFLAGS) $(CPPFLAGS) $$(addprefix -I ,$$(COMPONENT_INCLUDES)) $$(addprefix -I ,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ - -$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.cpp | $(1) - $$(summary) CXX $$@ - $$(Q) $$(CXX) $$(CXXFLAGS) $(CPPFLAGS) $$(addprefix -I,$$(COMPONENT_INCLUDES)) $$(addprefix -I,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ - -$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.S | $(1) - $$(summary) AS $$@ - $$(Q) $$(CC) $$(CFLAGS) $(CPPFLAGS) $$(addprefix -I ,$$(COMPONENT_INCLUDES)) $$(addprefix -I ,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ - -# CWD is build dir, create the build subdirectory if it doesn't exist -$(1): - @mkdir -p $(1) -endef - -#Generate all the compile target recipes -$(foreach srcdir,$(COMPONENT_SRCDIRS), $(eval $(call GenerateCompileTargets,$(srcdir)))) +$(warning Deprecated feature: No longer necessary to include component_common.mk from $(COMPONENT_PATH)/component.mk) diff --git a/make/component_wrapper.mk b/make/component_wrapper.mk new file mode 100644 index 000000000..c6ea52a2b --- /dev/null +++ b/make/component_wrapper.mk @@ -0,0 +1,218 @@ +# Component wrapper makefile +# +# This makefile gets called recursively from the project make, once for each component. +# COMPONENT_MAKEFILE is set to point at the component.mk file for the component itself, +# which is included as part of this process (after default variables are defined). +# +# This makefile comprises multiple stages, marked in blocked comments below. +# +# CWD is the build directory of the component. + +ifndef PROJECT_PATH +$(error Make was invoked from $(CURDIR). However please do not run make from the sdk or a component directory; invoke make from the project directory. See the ESP-IDF README for details.) +endif + + +################################################################################ +# 1) Set default variables for the component build (including configuration +# loaded from sdkconfig.) +################################################################################ + +# Find the path to the component +COMPONENT_PATH := $(abspath $(dir $(COMPONENT_MAKEFILE))) +export COMPONENT_PATH + +# COMPONENT_BUILD_DIR is otherwise known as CWD for the build +COMPONENT_BUILD_DIR := $(abspath .) + +# include elements common to both project & component makefiles +# (includes project configuration set via menuconfig) +include $(IDF_PATH)/make/common.mk + +# Some of the following defaults may be overriden by the component's component.mk makefile, +# during the next step: + +# Absolute path of the .a file +COMPONENT_LIBRARY = lib$(COMPONENT_NAME).a + +# Source dirs a component has. Default to root directory of component. +COMPONENT_SRCDIRS = . + +#Names of binary & text files to embed as raw content in the component library +COMPONENT_EMBED_FILES ?= +COMPONENT_EMBED_TXTFILES ?= + +# By default, include only the include/ dir. +COMPONENT_ADD_INCLUDEDIRS = include +COMPONENT_ADD_LDFLAGS = -l$(COMPONENT_NAME) + + +################################################################################ +# 2) Include the component.mk for the specific component (COMPONENT_MAKEFILE) to +# override variables & optionally define custom targets. +################################################################################ + +include $(COMPONENT_MAKEFILE) + + +################################################################################ +# 3) Set variables that depend on values that may changed by component.mk +################################################################################ + +# Object files which need to be linked into the library +# By default we take all .c, .cpp & .S files in COMPONENT_SRCDIRS. +ifndef COMPONENT_OBJS +# Find all source files in all COMPONENT_SRCDIRS +COMPONENT_OBJS := $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.c,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.c))) +COMPONENT_OBJS += $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.cpp,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.cpp))) +COMPONENT_OBJS += $(foreach compsrcdir,$(COMPONENT_SRCDIRS),$(patsubst %.S,%.o,$(wildcard $(COMPONENT_PATH)/$(compsrcdir)/*.S))) +# Make relative by removing COMPONENT_PATH from all found object paths +COMPONENT_OBJS := $(patsubst $(COMPONENT_PATH)/%,%,$(COMPONENT_OBJS)) +endif + +# Object files with embedded binaries to add to the component library +# Correspond to the files named in COMPONENT_EMBED_FILES & COMPONENT_EMBED_TXTFILES +COMPONENT_EMBED_OBJS ?= $(addsuffix .bin.o,$(COMPONENT_EMBED_FILES)) $(addsuffix .txt.o,$(COMPONENT_EMBED_TXTFILES)) + + +# If we're called to compile something, we'll get passed the COMPONENT_INCLUDES +# variable with all the include dirs from all the components in random order. This +# means we can accidentally grab a header from another component before grabbing our own. +# To make sure that does not happen, re-order the includes so ours come first. +OWN_INCLUDES:=$(abspath $(addprefix $(COMPONENT_PATH)/,$(COMPONENT_ADD_INCLUDEDIRS) $(COMPONENT_PRIV_INCLUDEDIRS))) +COMPONENT_INCLUDES := $(OWN_INCLUDES) $(filter-out $(OWN_INCLUDES),$(COMPONENT_INCLUDES)) + + +################################################################################ +# 4) Define a target to generate component_project_vars.mk Makefile which +# contains common per-component settings which are included directly in the +# top-level project make +################################################################################ + +# macro to generate variable-relative paths inside component_project_vars.mk, whenever possible +# ie put literal $(IDF_PATH), $(PROJECT_PATH) and $(BUILD_DIR_BASE) into the generated +# makefiles where possible. +# +# This means if directories move (breaking absolute paths), don't need to 'make clean' +define MakeVariablePath +$(subst $(IDF_PATH),$$(IDF_PATH),$(subst $(PROJECT_PATH),$$(PROJECT_PATH),$(subst $(BUILD_DIR_BASE),\$$(BUILD_DIR_BASE),$(1)))) +endef + +# component_project_vars.mk target for the component. This is used to +# take component.mk variables COMPONENT_ADD_INCLUDEDIRS, +# COMPONENT_ADD_LDFLAGS, COMPONENT_DEPENDS and COMPONENT_SUBMODULES +# and inject those into the project make pass. +# +# The target here has no dependencies, as the parent target in +# project.mk evaluates dependencies before calling down to here. See +# GenerateComponentTargets macro in project.mk. +# +# If you are thinking of editing the output of this target for a +# component-specific feature, please don't! What you want is a +# Makefile.projbuild for your component (see docs/build-system.rst for +# more.) +component_project_vars.mk:: + $(details) "Building component project variables list $(abspath $@)" + @echo '# Automatically generated build file. Do not edit.' > $@ + @echo 'COMPONENT_INCLUDES += $(call MakeVariablePath,$(addprefix $(COMPONENT_PATH)/,$(COMPONENT_ADD_INCLUDEDIRS)))' >> $@ + @echo 'COMPONENT_LDFLAGS += $(call MakeVariablePath,$(COMPONENT_ADD_LDFLAGS))' >> $@ + @echo 'COMPONENT_SUBMODULES += $(call MakeVariablePath,$(addprefix $(COMPONENT_PATH)/,$(COMPONENT_SUBMODULES)))' >> $@ + @echo '$(COMPONENT_NAME)-build: $(addsuffix -build,$(COMPONENT_DEPENDS))' >> $@ + + +################################################################################ +# 5) If COMPONENT_OWNBUILDTARGET / COMPONENT_OWNCLEANTARGET is not set by component.mk, +# define default build, clean, etc. targets +################################################################################ + +# If COMPONENT_OWNBUILDTARGET is not set, define a phony build target and +# a COMPONENT_LIBRARY link target. +ifndef COMPONENT_OWNBUILDTARGET +.PHONY: build +build: $(COMPONENT_LIBRARY) + @mkdir -p $(COMPONENT_SRCDIRS) + +# Build the archive. We remove the archive first, otherwise ar will get confused if we update +# an archive when multiple filenames have the same name (src1/test.o and src2/test.o) +$(COMPONENT_LIBRARY): $(COMPONENT_OBJS) $(COMPONENT_EMBED_OBJS) + $(summary) AR $@ + rm -f $@ + $(AR) cru $@ $^ +endif + +# If COMPONENT_OWNCLEANTARGET is not set, define a phony clean target +ifndef COMPONENT_OWNCLEANTARGET +CLEAN_FILES = $(COMPONENT_LIBRARY) $(COMPONENT_OBJS) $(COMPONENT_OBJS:.o=.d) $(COMPONENT_EMBED_OBJS) $(COMPONENT_EXTRA_CLEAN) component_project_vars.mk +.PHONY: clean +clean: + $(summary) RM $(CLEAN_FILES) + rm -f $(CLEAN_FILES) +endif + +# Include all dependency files already generated +-include $(COMPONENT_OBJS:.o=.d) + +# This pattern is generated for each COMPONENT_SRCDIR to compile the files in it. +define GenerateCompileTargets +# $(1) - directory containing source files, relative to $(COMPONENT_PATH) +$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.c | $(1) + $$(summary) CC $$@ + $$(CC) $$(CFLAGS) $$(CPPFLAGS) $$(addprefix -I ,$$(COMPONENT_INCLUDES)) $$(addprefix -I ,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ + +$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.cpp | $(1) + $$(summary) CXX $$@ + $$(CXX) $$(CXXFLAGS) $$(CPPFLAGS) $$(addprefix -I,$$(COMPONENT_INCLUDES)) $$(addprefix -I,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ + +$(1)/%.o: $$(COMPONENT_PATH)/$(1)/%.S | $(1) + $$(summary) AS $$@ + $$(CC) $$(CPPFLAGS) $$(addprefix -I ,$$(COMPONENT_INCLUDES)) $$(addprefix -I ,$$(COMPONENT_EXTRA_INCLUDES)) -I$(1) -c $$< -o $$@ + +# CWD is build dir, create the build subdirectory if it doesn't exist +$(1): + @mkdir -p $(1) +endef + +# Generate all the compile target patterns +$(foreach srcdir,$(COMPONENT_SRCDIRS), $(eval $(call GenerateCompileTargets,$(srcdir)))) + +## Support for embedding binary files into the ELF as symbols + +OBJCOPY_EMBED_ARGS := --input-target binary --output-target elf32-xtensa-le --binary-architecture xtensa --rename-section .data=.rodata.embedded + +# Generate pattern for embedding text or binary files into the app +# $(1) is name of file (as relative path inside component) +# $(2) is txt or bin depending on file contents +# +# txt files are null-terminated before being embedded (otherwise +# identical behaviour.) +# +define GenerateEmbedTarget + +# copy the input file into the build dir (using a subdirectory +# in case the file already exists elsewhere in the build dir) +embed_bin/$$(notdir $(1)): $(call resolvepath,$(1),$(COMPONENT_PATH)) | embed_bin + cp $$< $$@ + +embed_txt/$$(notdir $(1)): $(call resolvepath,$(1),$(COMPONENT_PATH)) | embed_txt + cp $$< $$@ + printf '\0' >> $$@ # null-terminate text files + +# messing about with the embed_X subdirectory then using 'cd' for objcopy is because the +# full path passed to OBJCOPY makes it into the name of the symbols in the .o file +$(1).$(2).o: embed_$(2)/$$(notdir $(1)) | $$(dir $(1)) + $(summary) EMBED $$@ + cd embed_$(2); $(OBJCOPY) $(OBJCOPY_EMBED_ARGS) $$(notdir $$<) $$(call resolvepath,$$@,../) + +CLEAN_FILES += embed_$(2)/$$(notdir $(1)) +endef + +embed_txt embed_bin: + mkdir -p $@ + +# generate targets to embed binary & text files +$(foreach binfile,$(COMPONENT_EMBED_FILES), $(eval $(call GenerateEmbedTarget,$(binfile),bin))) + +$(foreach txtfile,$(COMPONENT_EMBED_TXTFILES), $(eval $(call GenerateEmbedTarget,$(txtfile),txt))) + +# generate targets to create binary embed directories +$(foreach bindir,$(sort $(dir $(COMPONENT_EMBED_FILES))), $(eval $(call GenerateBuildDirTarget,$(bindir)))) diff --git a/make/project.mk b/make/project.mk index 67e2e92bd..181152f11 100644 --- a/make/project.mk +++ b/make/project.mk @@ -10,14 +10,14 @@ # where this file is located. # -.PHONY: build-components menuconfig defconfig all build clean all_binaries -all: all_binaries # other components will add dependencies to 'all_binaries' - @echo "To flash all build output, run 'make flash' or:" - @echo $(ESPTOOLPY_WRITE_FLASH) $(ESPTOOL_ALL_FLASH_ARGS) - -# (the reason all_binaries is used instead of 'all' is so that the flash target -# can build everything without triggering the per-component "to flash..." -# output targets.) +.PHONY: build-components menuconfig defconfig all build clean all_binaries check-submodules +all: all_binaries +# see below for recipe of 'all' target +# +# # other components will add dependencies to 'all_binaries'. The +# reason all_binaries is used instead of 'all' is so that the flash +# target can build everything without triggering the per-component "to +# flash..." output targets.) help: @echo "Welcome to Espressif IDF build system. Some useful make targets:" @@ -36,112 +36,125 @@ help: @echo "See also 'make bootloader', 'make bootloader-flash', 'make bootloader-clean', " @echo "'make partition_table', etc, etc." +# dependency checks +ifndef MAKE_RESTARTS +ifeq ("$(filter 4.% 3.81 3.82,$(MAKE_VERSION))","") +$(warning "esp-idf build system only supports GNU Make versions 3.81 or newer. You may see unexpected results with other Makes.") +endif +endif + # disable built-in make rules, makes debugging saner MAKEFLAGS_OLD := $(MAKEFLAGS) MAKEFLAGS +=-rR -# Figure out PROJECT_PATH if not set -ifeq ("$(PROJECT_PATH)","") -#The path to the project: we assume the Makefile including this file resides -#in the root of that directory. +# Default path to the project: we assume the Makefile including this file +# is in the project directory +ifndef PROJECT_PATH PROJECT_PATH := $(abspath $(dir $(firstword $(MAKEFILE_LIST)))) export PROJECT_PATH endif -#The directory where we put all objects/libraries/binaries. The project Makefile can -#configure this if needed. +# A list of the "common" makefiles, to use as a target dependency +COMMON_MAKEFILES := $(abspath $(IDF_PATH)/make/project.mk $(IDF_PATH)/make/common.mk $(IDF_PATH)/make/component_wrapper.mk) +export COMMON_MAKEFILES + +# The directory where we put all objects/libraries/binaries. The project Makefile can +# configure this if needed. BUILD_DIR_BASE ?= $(PROJECT_PATH)/build export BUILD_DIR_BASE -#Component directories. These directories are searched for components. -#The project Makefile can override these component dirs, or define extra component directories. +# Component directories. These directories are searched for components. +# The project Makefile can override these component dirs, or define extra component directories. COMPONENT_DIRS ?= $(PROJECT_PATH)/components $(EXTRA_COMPONENT_DIRS) $(IDF_PATH)/components export COMPONENT_DIRS -#The project Makefile can define a list of components, but if it does not do this we just take -#all available components in the component dirs. -ifeq ("$(COMPONENTS)","") -#Find all component names. The component names are the same as the -#directories they're in, so /bla/components/mycomponent/ -> mycomponent. We later use -#the COMPONENT_DIRS bit to find back the component path. +# Source directories of the project itself (a special, project-specific component.) Defaults to only "main". +SRCDIRS ?= main + +# The project Makefile can define a list of components, but if it does not do this we just take +# all available components in the component dirs. +ifndef COMPONENTS +# Find all component names. The component names are the same as the +# directories they're in, so /bla/components/mycomponent/ -> mycomponent. We then use +# COMPONENT_DIRS to build COMPONENT_PATHS with the full path to each component. COMPONENTS := $(foreach dir,$(COMPONENT_DIRS),$(wildcard $(dir)/*)) COMPONENTS := $(sort $(foreach comp,$(COMPONENTS),$(lastword $(subst /, ,$(comp))))) endif export COMPONENTS -#Sources default to only "main" -SRCDIRS ?= main - -#Here, we resolve and add all the components and source paths into absolute paths. -#If a component exists in multiple COMPONENT_DIRS, we take the first match. -#WARNING: These directories paths must be generated WITHOUT a trailing / so we -#can use $(notdir x) to get the component name. +# Resolve all of COMPONENTS into absolute paths in COMPONENT_PATHS. +# +# If a component name exists in multiple COMPONENT_DIRS, we take the first match. +# +# NOTE: These paths must be generated WITHOUT a trailing / so we +# can use $(notdir x) to get the component name. COMPONENT_PATHS := $(foreach comp,$(COMPONENTS),$(firstword $(foreach dir,$(COMPONENT_DIRS),$(wildcard $(dir)/$(comp))))) COMPONENT_PATHS += $(abspath $(SRCDIRS)) -#A component is buildable if it has a component.mk makefile; we assume that a -# 'make -C $(component dir) -f component.mk build' results in a lib$(componentname).a +# A component is buildable if it has a component.mk makefile in it COMPONENT_PATHS_BUILDABLE := $(foreach cp,$(COMPONENT_PATHS),$(if $(wildcard $(cp)/component.mk),$(cp))) -# Assemble global list of include dirs (COMPONENT_INCLUDES), and -# LDFLAGS args (COMPONENT_LDFLAGS) supplied by each component. +# If TESTS_ALL set to 1, set TEST_COMPONENTS to all components +ifeq ($(TESTS_ALL),1) +TEST_COMPONENTS := $(COMPONENTS) +endif + +# If TEST_COMPONENTS is set, create variables for building unit tests +ifdef TEST_COMPONENTS +override TEST_COMPONENTS := $(foreach comp,$(TEST_COMPONENTS),$(wildcard $(IDF_PATH)/components/$(comp)/test)) +TEST_COMPONENT_PATHS := $(TEST_COMPONENTS) +TEST_COMPONENT_NAMES := $(foreach comp,$(TEST_COMPONENTS),$(lastword $(subst /, ,$(dir $(comp))))_test) +endif + +# Initialise project-wide variables which can be added to by +# each component. +# +# These variables are built up via the component_project_vars.mk +# generated makefiles (one per component). +# +# See docs/build-system.rst for more details. COMPONENT_INCLUDES := COMPONENT_LDFLAGS := -# -# Also add any inter-component dependencies for each component. +COMPONENT_SUBMODULES := -# Extract a variable from a child make process +# COMPONENT_PROJECT_VARS is the list of component_project_vars.mk generated makefiles +# for each component. # -# $(1) - path to directory to invoke make in -# $(2) - name of variable to print via the get_variable target (passed in GET_VARIABLE) +# Including $(COMPONENT_PROJECT_VARS) builds the COMPONENT_INCLUDES, +# COMPONENT_LDFLAGS variables and also targets for any inter-component +# dependencies. # -# needs 'sed' processing of stdout because make sometimes echoes other stuff on stdout, -# even if asked not to. -# -# Debugging this? Replace $(shell with $(error and you'll see the full command as-run. -define GetVariable -$(shell "$(MAKE)" -s --no-print-directory -C $(1) -f component.mk get_variable PROJECT_PATH=$(PROJECT_PATH) GET_VARIABLE=$(2) | sed -En "s/^$(2)=(.+)/\1/p" ) -endef +# See the component_project_vars.mk target in component_wrapper.mk +COMPONENT_PROJECT_VARS := $(addsuffix /component_project_vars.mk,$(notdir $(COMPONENT_PATHS_BUILDABLE) ) $(TEST_COMPONENT_NAMES)) +COMPONENT_PROJECT_VARS := $(addprefix $(BUILD_DIR_BASE)/,$(COMPONENT_PROJECT_VARS)) +# this line is -include instead of include to prevent a spurious error message on make 3.81 +-include $(COMPONENT_PROJECT_VARS) -COMPONENT_INCLUDES := $(abspath $(foreach comp,$(COMPONENT_PATHS_BUILDABLE),$(addprefix $(comp)/, \ - $(call GetVariable,$(comp),COMPONENT_ADD_INCLUDEDIRS)))) - -#Also add project include path, for sdk includes +# Also add top-level project include path, for top-level includes COMPONENT_INCLUDES += $(abspath $(BUILD_DIR_BASE)/include/) + export COMPONENT_INCLUDES -#COMPONENT_LDFLAGS has a list of all flags that are needed to link the components together. It's collected -#in the same way as COMPONENT_INCLUDES is. -COMPONENT_LDFLAGS := $(foreach comp,$(COMPONENT_PATHS_BUILDABLE), \ - $(call GetVariable,$(comp),COMPONENT_ADD_LDFLAGS)) -export COMPONENT_LDFLAGS +# Set variables common to both project & component +include $(IDF_PATH)/make/common.mk -# Generate component dependency targets from dependencies lists -# each component gains a target of its own -build with dependencies -# of the names of any other components (-build) that need building first -# -# the actual targets (that invoke submakes) are generated below by -# GenerateComponentTarget macro. -define GenerateComponentDependencies -# $(1) = component path -.PHONY: $$(notdir $(1)) -$$(notdir $(1))-build: $(addsuffix -build,$(call GetVariable,$(1),COMPONENT_DEPENDS)) -endef -$(foreach comp,$(COMPONENT_PATHS_BUILDABLE), $(eval $(call GenerateComponentDependencies,$(comp)))) - -#Make sure submakes can also use this. -export PROJECT_PATH - -#Include functionality common to both project & component --include $(IDF_PATH)/make/common.mk +all: +ifdef CONFIG_SECURE_BOOTLOADER_ENABLED + @echo "(Secure boot enabled, so bootloader not flashed automatically. See 'make bootloader' output)" + @echo "To flash app & partition table, run 'make flash' or:" +else + @echo "To flash all build output, run 'make flash' or:" +endif + @echo $(ESPTOOLPY_WRITE_FLASH) $(ESPTOOL_ALL_FLASH_ARGS) # Set default LDFLAGS LDFLAGS ?= -nostdlib \ -L$(IDF_PATH)/lib \ -L$(IDF_PATH)/ld \ - $(addprefix -L$(BUILD_DIR_BASE)/,$(COMPONENTS) $(SRCDIRS)) \ + $(addprefix -L$(BUILD_DIR_BASE)/,$(COMPONENTS) $(TEST_COMPONENT_NAMES) $(SRCDIRS) ) \ -u call_user_start_cpu0 \ + $(EXTRA_LDFLAGS) \ -Wl,--gc-sections \ -Wl,-static \ -Wl,--start-group \ @@ -160,13 +173,16 @@ LDFLAGS ?= -nostdlib \ # CPPFLAGS used by C preprocessor # If any flags are defined in application Makefile, add them at the end. -CPPFLAGS := -DESP_PLATFORM $(CPPFLAGS) +CPPFLAGS := -DESP_PLATFORM $(CPPFLAGS) $(EXTRA_CPPFLAGS) # Warnings-related flags relevant both for C and C++ -COMMON_WARNING_FLAGS = -Wall -Werror \ +COMMON_WARNING_FLAGS = -Wall -Werror=all \ -Wno-error=unused-function \ -Wno-error=unused-but-set-variable \ - -Wno-error=unused-variable + -Wno-error=unused-variable \ + -Wno-error=deprecated-declarations \ + -Wextra \ + -Wno-unused-parameter -Wno-sign-compare # Flags which control code generation and dependency generation, both for C and C++ COMMON_FLAGS = \ @@ -193,8 +209,9 @@ CFLAGS := $(strip \ -std=gnu99 \ $(OPTIMIZATION_FLAGS) \ $(COMMON_FLAGS) \ - $(COMMON_WARNING_FLAGS) \ - $(CFLAGS)) + $(COMMON_WARNING_FLAGS) -Wno-old-style-declaration \ + $(CFLAGS) \ + $(EXTRA_CFLAGS)) # List of flags to pass to C++ compiler # If any flags are defined in application Makefile, add them at the end. @@ -205,19 +222,20 @@ CXXFLAGS := $(strip \ $(OPTIMIZATION_FLAGS) \ $(COMMON_FLAGS) \ $(COMMON_WARNING_FLAGS) \ - $(CXXFLAGS)) + $(CXXFLAGS) \ + $(EXTRA_CXXFLAGS)) export CFLAGS CPPFLAGS CXXFLAGS -#Set host compiler and binutils +# Set host compiler and binutils HOSTCC := $(CC) HOSTLD := $(LD) HOSTAR := $(AR) HOSTOBJCOPY := $(OBJCOPY) export HOSTCC HOSTLD HOSTAR HOSTOBJCOPY -#Set target compiler. Defaults to whatever the user has -#configured as prefix + yer olde gcc commands +# Set target compiler. Defaults to whatever the user has +# configured as prefix + ye olde gcc commands CC := $(call dequote,$(CONFIG_TOOLPREFIX))gcc CXX := $(call dequote,$(CONFIG_TOOLPREFIX))c++ LD := $(call dequote,$(CONFIG_TOOLPREFIX))ld @@ -241,19 +259,23 @@ COMPONENT_PATH := $(1) endef $(foreach componentpath,$(COMPONENT_PATHS),$(eval $(call includeProjBuildMakefile,$(componentpath)))) -# once we know component paths, we can include the config +# once we know component paths, we can include the config generation targets +# +# (bootloader build doesn't need this, config is exported from top-level) +ifndef IS_BOOTLOADER_BUILD include $(IDF_PATH)/make/project_config.mk +endif # A "component" library is any library in the LDFLAGS where # the name of the library is also a name of the component APP_LIBRARIES = $(patsubst -l%,%,$(filter -l%,$(LDFLAGS))) -COMPONENT_LIBRARIES = $(filter $(notdir $(COMPONENT_PATHS_BUILDABLE)),$(APP_LIBRARIES)) +COMPONENT_LIBRARIES = $(filter $(notdir $(COMPONENT_PATHS_BUILDABLE)) $(TEST_COMPONENT_NAMES),$(APP_LIBRARIES)) # ELF depends on the library archive files for COMPONENT_LIBRARIES # the rules to build these are emitted as part of GenerateComponentTarget below $(APP_ELF): $(foreach libcomp,$(COMPONENT_LIBRARIES),$(BUILD_DIR_BASE)/$(libcomp)/lib$(libcomp).a) $(summary) LD $(notdir $@) - $(Q) $(CC) $(LDFLAGS) -o $@ -Wl,-Map=$(APP_MAP) + $(CC) $(LDFLAGS) -o $@ -Wl,-Map=$(APP_MAP) # Generation of $(APP_BIN) from $(APP_ELF) is added by the esptool # component's Makefile.projbuild @@ -266,36 +288,90 @@ all_binaries: $(APP_BIN) $(BUILD_DIR_BASE): mkdir -p $(BUILD_DIR_BASE) -define GenerateComponentPhonyTarget -# $(1) - path to component dir -# $(2) - target to generate (build, clean) -.PHONY: $(notdir $(1))-$(2) -$(notdir $(1))-$(2): | $(BUILD_DIR_BASE)/$(notdir $(1)) - $(Q) +$(MAKE) -C $(BUILD_DIR_BASE)/$(notdir $(1)) -f $(1)/component.mk COMPONENT_BUILD_DIR=$(BUILD_DIR_BASE)/$(notdir $(1)) $(2) +# Macro for the recursive sub-make for each component +# $(1) - component directory +# $(2) - component name only +# +# Is recursively expanded by the GenerateComponentTargets macro +define ComponentMake ++$(MAKE) -C $(BUILD_DIR_BASE)/$(2) -f $(IDF_PATH)/make/component_wrapper.mk COMPONENT_MAKEFILE=$(1)/component.mk COMPONENT_NAME=$(2) endef -define GenerateComponentTargets +# Generate top-level component-specific targets for each component # $(1) - path to component dir -$(BUILD_DIR_BASE)/$(notdir $(1)): - @mkdir -p $(BUILD_DIR_BASE)/$(notdir $(1)) +# $(2) - name of component +# +define GenerateComponentTargets +.PHONY: $(2)-build $(2)-clean -# tell make it can build any component's library by invoking the recursive -build target +$(2)-build: check-submodules + $(call ComponentMake,$(1),$(2)) build + +$(2)-clean: + $(call ComponentMake,$(1),$(2)) clean + +$(BUILD_DIR_BASE)/$(2): + @mkdir -p $(BUILD_DIR_BASE)/$(2) + +# tell make it can build any component's library by invoking the -build target # (this target exists for all components even ones which don't build libraries, but it's # only invoked for the targets whose libraries appear in COMPONENT_LIBRARIES and hence the # APP_ELF dependencies.) -$(BUILD_DIR_BASE)/$(notdir $(1))/lib$(notdir $(1)).a: $(notdir $(1))-build +$(BUILD_DIR_BASE)/$(2)/lib$(2).a: $(2)-build $(details) "Target '$$^' responsible for '$$@'" # echo which build target built this file + +# add a target to generate the component_project_vars.mk files that +# are used to inject variables into project make pass (see matching +# component_project_vars.mk target in component_wrapper.mk). +# +# If any component_project_vars.mk file is out of date, the make +# process will call this target to rebuild it and then restart. +# +# Note: $(SDKCONFIG) is a normal prereq as we need to rebuild these +# files whenever the config changes. $(SDKCONFIG_MAKEFILE) is an +# order-only prereq because if it hasn't been rebuilt, we need to +# build it first - but including it as a normal prereq can lead to +# infinite restarts as the conf process will keep updating it. +$(BUILD_DIR_BASE)/$(2)/component_project_vars.mk: $(1)/component.mk $(COMMON_MAKEFILES) $(SDKCONFIG) | $(BUILD_DIR_BASE)/$(2) $(SDKCONFIG_MAKEFILE) + $(call ComponentMake,$(1),$(2)) component_project_vars.mk endef -$(foreach component,$(COMPONENT_PATHS_BUILDABLE),$(eval $(call GenerateComponentTargets,$(component)))) - -$(foreach component,$(COMPONENT_PATHS_BUILDABLE),$(eval $(call GenerateComponentPhonyTarget,$(component),build))) -$(foreach component,$(COMPONENT_PATHS_BUILDABLE),$(eval $(call GenerateComponentPhonyTarget,$(component),clean))) +$(foreach component,$(COMPONENT_PATHS_BUILDABLE),$(eval $(call GenerateComponentTargets,$(component),$(notdir $(component))))) +$(foreach component,$(TEST_COMPONENT_PATHS),$(eval $(call GenerateComponentTargets,$(component),$(lastword $(subst /, ,$(dir $(component))))_test))) app-clean: $(addsuffix -clean,$(notdir $(COMPONENT_PATHS_BUILDABLE))) $(summary) RM $(APP_ELF) - $(Q) rm -f $(APP_ELF) $(APP_BIN) $(APP_MAP) + rm -f $(APP_ELF) $(APP_BIN) $(APP_MAP) -clean: app-clean +# NB: this ordering is deliberate (app-clean before config-clean), +# so config remains valid during all component clean targets +config-clean: app-clean +clean: config-clean +# phony target to check if any git submodule listed in COMPONENT_SUBMODULES are missing +# or out of date, and exit if so. Components can add paths to this variable. +# +# This only works for components inside IDF_PATH +check-submodules: +# Generate a target to check this submodule +# $(1) - submodule directory, relative to IDF_PATH +define GenerateSubmoduleCheckTarget +check-submodules: $(IDF_PATH)/$(1)/.git +$(IDF_PATH)/$(1)/.git: + @echo "WARNING: Missing submodule $(1)..." + [ -d ${IDF_PATH}/.git ] || ( echo "ERROR: esp-idf must be cloned from git to work."; exit 1) + [ -x $(which git) ] || ( echo "ERROR: Need to run 'git submodule init $(1)' in esp-idf root directory."; exit 1) + @echo "Attempting 'git submodule update --init $(1)' in esp-idf root directory..." + cd ${IDF_PATH} && git submodule update --init $(1) + +# Parse 'git submodule status' output for out-of-date submodule. +# Status output prefixes status line with '+' if the submodule commit doesn't match +ifneq ("$(shell cd ${IDF_PATH} && git submodule status $(1) | grep '^+')","") +$$(info WARNING: git submodule $(1) may be out of date. Run 'git submodule update' to update.) +endif +endef + +# filter/subst in expression ensures all submodule paths begin with $(IDF_PATH), and then strips that prefix +# so the argument is suitable for use with 'git submodule' commands +$(foreach submodule,$(subst $(IDF_PATH)/,,$(filter $(IDF_PATH)/%,$(COMPONENT_SUBMODULES))),$(eval $(call GenerateSubmoduleCheckTarget,$(submodule)))) diff --git a/make/project_config.mk b/make/project_config.mk index 7ca83ce5a..a32c74a38 100644 --- a/make/project_config.mk +++ b/make/project_config.mk @@ -21,24 +21,28 @@ KCONFIG_TOOL_ENV=KCONFIG_AUTOHEADER=$(abspath $(BUILD_DIR_BASE)/include/sdkconfi COMPONENT_KCONFIGS="$(COMPONENT_KCONFIGS)" KCONFIG_CONFIG=$(SDKCONFIG) \ COMPONENT_KCONFIGS_PROJBUILD="$(COMPONENT_KCONFIGS_PROJBUILD)" -menuconfig: $(KCONFIG_TOOL_DIR)/mconf $(IDF_PATH)/Kconfig $(BUILD_DIR_BASE) +menuconfig: $(KCONFIG_TOOL_DIR)/mconf $(IDF_PATH)/Kconfig $(summary) MENUCONFIG - $(Q) $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/mconf $(IDF_PATH)/Kconfig + $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/mconf $(IDF_PATH)/Kconfig ifeq ("$(wildcard $(SDKCONFIG))","") -#No sdkconfig found. Need to run menuconfig to make this if we need it. +ifeq ("$(filter defconfig,$(MAKECMDGOALS))","") +# if not configuration is present and defconfig is not a target, run makeconfig $(SDKCONFIG): menuconfig +else +$(SDKCONFIG): defconfig +endif endif defconfig: $(KCONFIG_TOOL_DIR)/mconf $(IDF_PATH)/Kconfig $(BUILD_DIR_BASE) $(summary) DEFCONFIG - $(Q) mkdir -p $(BUILD_DIR_BASE)/include/config - $(Q) $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/conf --olddefconfig $(IDF_PATH)/Kconfig + mkdir -p $(BUILD_DIR_BASE)/include/config + $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/conf --olddefconfig $(IDF_PATH)/Kconfig # Work out of whether we have to build the Kconfig makefile # (auto.conf), or if we're in a situation where we don't need it -NON_CONFIG_TARGETS := clean %-clean get_variable help menuconfig defconfig -AUTO_CONF_REGEN_TARGET := $(BUILD_DIR_BASE)/include/config/auto.conf +NON_CONFIG_TARGETS := clean %-clean help menuconfig defconfig +AUTO_CONF_REGEN_TARGET := $(SDKCONFIG_MAKEFILE) # disable AUTO_CONF_REGEN_TARGET if all targets are non-config targets # (and not building default target) @@ -46,22 +50,21 @@ ifneq ("$(MAKECMDGOALS)","") ifeq ($(filter $(NON_CONFIG_TARGETS), $(MAKECMDGOALS)),$(MAKECMDGOALS)) AUTO_CONF_REGEN_TARGET := # dummy target -$(BUILD_DIR_BASE)/include/config/auto.conf: +$(SDKCONFIG_MAKEFILE): endif endif $(AUTO_CONF_REGEN_TARGET) $(BUILD_DIR_BASE)/include/sdkconfig.h: $(SDKCONFIG) $(KCONFIG_TOOL_DIR)/conf $(COMPONENT_KCONFIGS) $(COMPONENT_KCONFIGS_PROJBUILD) $(summary) GENCONFIG - $(Q) mkdir -p $(BUILD_DIR_BASE)/include/config - $(Q) cd $(BUILD_DIR_BASE); $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/conf --silentoldconfig $(IDF_PATH)/Kconfig - $(Q) touch $(AUTO_CONF_REGEN_TARGET) $(BUILD_DIR_BASE)/include/sdkconfig.h + mkdir -p $(BUILD_DIR_BASE)/include/config + cd $(BUILD_DIR_BASE); $(KCONFIG_TOOL_ENV) $(KCONFIG_TOOL_DIR)/conf --silentoldconfig $(IDF_PATH)/Kconfig + touch $(AUTO_CONF_REGEN_TARGET) $(BUILD_DIR_BASE)/include/sdkconfig.h # touch to ensure both output files are newer - as 'conf' can also update sdkconfig (a dependency). Without this, # sometimes you can get an infinite make loop on Windows where sdkconfig always gets regenerated newer # than the target(!) -clean: config-clean .PHONY: config-clean config-clean: $(summary RM CONFIG) $(MAKE) -C $(KCONFIG_TOOL_DIR) clean - $(Q) rm -rf $(BUILD_DIR_BASE)/include/config $(BUILD_DIR_BASE)/include/sdkconfig.h + rm -rf $(BUILD_DIR_BASE)/include/config $(BUILD_DIR_BASE)/include/sdkconfig.h diff --git a/tools/eclipse-code-style.xml b/tools/eclipse-code-style.xml new file mode 100644 index 000000000..f589a0080 --- /dev/null +++ b/tools/eclipse-code-style.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/format-minimal.sh b/tools/format-minimal.sh new file mode 100644 index 000000000..ff829247d --- /dev/null +++ b/tools/format-minimal.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# Runs astyle with parameters which should be checked in a pre-commit hook +astyle \ + --style=otbs \ + --indent=spaces=4 \ + --convert-tabs \ + --keep-one-line-statements \ + --pad-header \ + "$@" diff --git a/tools/format.sh b/tools/format.sh new file mode 100644 index 000000000..aadb337aa --- /dev/null +++ b/tools/format.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# Runs astyle with the full set of formatting options +astyle \ + --style=otbs \ + --indent=spaces=4 \ + --convert-tabs \ + --align-pointer=name \ + --align-reference=name \ + --keep-one-line-statements \ + --pad-header \ + --pad-oper \ + "$@" diff --git a/tools/kconfig/Makefile b/tools/kconfig/Makefile index fee5a6931..9680b7410 100644 --- a/tools/kconfig/Makefile +++ b/tools/kconfig/Makefile @@ -41,13 +41,13 @@ nconfig: nconf $< $(silent) $(Kconfig) silentoldconfig: conf - $(Q)mkdir -p include/config include/generated + mkdir -p include/config include/generated $< $(silent) --$@ $(Kconfig) localyesconfig localmodconfig: streamline_config.pl conf - $(Q)mkdir -p include/config include/generated - $(Q)perl $< --$@ . $(Kconfig) > .tmp.config - $(Q)if [ -f .config ]; then \ + mkdir -p include/config include/generated + perl $< --$@ . $(Kconfig) > .tmp.config + if [ -f .config ]; then \ cmp -s .tmp.config .config || \ (mv -f .config .config.old.1; \ mv -f .tmp.config .config; \ @@ -57,7 +57,7 @@ localyesconfig localmodconfig: streamline_config.pl conf mv -f .tmp.config .config; \ conf $(silent) --silentoldconfig $(Kconfig); \ fi - $(Q)rm -f .tmp.config + rm -f .tmp.config # These targets map 1:1 to the commandline options of 'conf' @@ -84,22 +84,22 @@ ifeq ($(KBUILD_DEFCONFIG),) else ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),) @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'" - $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) + $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) else @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'" - $(Q) $(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG) + $(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG) endif endif %_defconfig: conf - $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) + $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@) %.config: conf $(if $(call configfiles),, $(error No configuration exists for this target on this architecture)) - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) - +$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig + $(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) + +yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig PHONY += kvmconfig kvmconfig: kvm_guest.config @@ -111,7 +111,7 @@ xenconfig: xen.config PHONY += tinyconfig tinyconfig: - $(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config + $(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config # Help text used by make help help: @@ -181,7 +181,7 @@ clean-files += $(conf-objs) $(mconf-objs) conf mconf $(lxdialog) PHONY += dochecklxdialog $(addprefix ,$(lxdialog)): dochecklxdialog dochecklxdialog: - $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(CC) $(CFLAGS) $(LOADLIBES_mconf) + $(CONFIG_SHELL) $(check-lxdialog) -check $(CC) $(CFLAGS) $(LOADLIBES_mconf) always := dochecklxdialog @@ -285,7 +285,7 @@ quiet_cmd_moc = MOC $@ # Extract gconf menu items for i18n support gconf.glade.h: gconf.glade - $(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \ + intltool-extract --type=gettext/glade --srcdir=$(srctree) \ gconf.glade diff --git a/tools/kconfig/lxdialog/check-lxdialog.sh b/tools/kconfig/lxdialog/check-lxdialog.sh index 6964d2b0c..79df5ed4f 100755 --- a/tools/kconfig/lxdialog/check-lxdialog.sh +++ b/tools/kconfig/lxdialog/check-lxdialog.sh @@ -5,8 +5,8 @@ ldflags() { if [ $(uname -s) == "Darwin" ]; then - #OSX seems to need intl too - echo -n "-lintl " + #OSX seems to need ncurses too + echo -n "-lncurses " fi pkg-config --libs ncursesw 2>/dev/null && exit pkg-config --libs ncurses 2>/dev/null && exit @@ -41,6 +41,10 @@ ccflags() else echo '-DCURSES_LOC=""' fi + if [ $(uname -s) == "Darwin" ]; then + #OSX doesn't have libintl + echo -n "-DKBUILD_NO_NLS -Wno-format-security " + fi } # Temp file, try to clean up after us diff --git a/tools/unit-test-app/Makefile b/tools/unit-test-app/Makefile new file mode 100644 index 000000000..128e8a080 --- /dev/null +++ b/tools/unit-test-app/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := unit-test-app + +include $(IDF_PATH)/make/project.mk + diff --git a/tools/unit-test-app/README.md b/tools/unit-test-app/README.md new file mode 100644 index 000000000..eff3e12f4 --- /dev/null +++ b/tools/unit-test-app/README.md @@ -0,0 +1,12 @@ +# Unit Test App + +ESP-IDF unit tests are run using Unit Test App. The app can be built with the unit tests for a specific component. Unit tests are in `test` subdirectories of respective components. + +# Building Unit Test App + +* Follow the setup instructions in the top-level esp-idf README. +* Set IDF_PATH environment variable to point to the path to the esp-idf top-level directory. +* Change into `tools/unit-test-app` directory +* `make menuconfig` to configure the Unit Test App. +* `make TEST_COMPONENTS=` with `TEST_COMPONENTS` set to names of the components to be included in the test app. Or `make TESTS_ALL=1` to build the test app with all the tests for components having `test` subdirectory. +* Follow the printed instructions to flash, or run `make flash`. diff --git a/tools/unit-test-app/components/unity/component.mk b/tools/unit-test-app/components/unity/component.mk new file mode 100644 index 000000000..ebd7a7d59 --- /dev/null +++ b/tools/unit-test-app/components/unity/component.mk @@ -0,0 +1,3 @@ +# +# Component Makefile +# diff --git a/tools/unit-test-app/components/unity/include/unity.h b/tools/unit-test-app/components/unity/include/unity.h new file mode 100644 index 000000000..3ffc14c0b --- /dev/null +++ b/tools/unit-test-app/components/unity/include/unity.h @@ -0,0 +1,292 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FRAMEWORK_H +#define UNITY_FRAMEWORK_H +#define UNITY + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define UNITY_INCLUDE_CONFIG_H +#include "unity_internals.h" + +void setUp(void); +void tearDown(void); + +/*------------------------------------------------------- + * Configuration Options + *------------------------------------------------------- + * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. + + * Integers/longs/pointers + * - Unity attempts to automatically discover your integer sizes + * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in + * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in + * - define UNITY_EXCLUDE_SIZEOF to stop attempting to use sizeof in macros + * - If you cannot use the automatic methods above, you can force Unity by using these options: + * - define UNITY_SUPPORT_64 + * - define UNITY_INT_WIDTH + * - UNITY_LONG_WIDTH + * - UNITY_POINTER_WIDTH + + * Floats + * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons + * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT + * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats + * - define UNITY_FLOAT_VERBOSE to print floating point values in errors (uses sprintf) + * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons + * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) + * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE + * - define UNITY_DOUBLE_TYPE to specify something other than double + * - define UNITY_DOUBLE_VERBOSE to print floating point values in errors (uses sprintf) + * - define UNITY_VERBOSE_NUMBER_MAX_LENGTH to change maximum length of printed numbers (used by sprintf) + + * Output + * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired + * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure + + * Optimization + * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge + * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. + + * Test Cases + * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script + + * Parameterized Tests + * - you'll want to create a define of TEST_CASE(...) which basically evaluates to nothing + + *------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) +#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) +#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) +#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) +#define TEST_ONLY() + +/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. + * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ +#define TEST_PASS() longjmp(Unity.AbortFrame, 1) + +/*------------------------------------------------------- + * Test Asserts (simple) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") +#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") +#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") +#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") +#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") +#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, NULL) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/*------------------------------------------------------- + * Test Asserts (with additional messages) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, (message)) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* end of UNITY_FRAMEWORK_H */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/tools/unit-test-app/components/unity/include/unity_config.h b/tools/unit-test-app/components/unity/include/unity_config.h new file mode 100644 index 000000000..b8e56a79c --- /dev/null +++ b/tools/unit-test-app/components/unity/include/unity_config.h @@ -0,0 +1,75 @@ +#ifndef UNITY_CONFIG_H +#define UNITY_CONFIG_H + +// This file gets included from unity.h via unity_internals.h +// It is inside #ifdef __cplusplus / extern "C" block, so we can +// only use C features here + +// Adapt Unity to our environment, disable FP support + +#include + +#define UNITY_EXCLUDE_FLOAT +#define UNITY_EXCLUDE_DOUBLE + +#define UNITY_OUTPUT_CHAR unity_putc +#define UNITY_OUTPUT_FLUSH unity_flush + +// Define helpers to register test cases from multiple files + +#define UNITY_EXPAND2(a, b) a ## b +#define UNITY_EXPAND(a, b) UNITY_EXPAND2(a, b) +#define UNITY_TEST_UID(what) UNITY_EXPAND(what, __LINE__) + +#define UNITY_TEST_REG_HELPER reg_helper ## UNITY_TEST_UID +#define UNITY_TEST_DESC_UID desc ## UNITY_TEST_UID +struct test_desc_t +{ + const char* name; + const char* desc; + void (*fn)(void); + const char* file; + int line; + struct test_desc_t* next; +}; + +void unity_testcase_register(struct test_desc_t* desc); + +void unity_run_menu(); + +void unity_run_tests_with_filter(const char* filter); + +void unity_run_all_tests(); + +/* Test case macro, a-la CATCH framework. + First argument is a free-form description, + second argument is (by convention) a list of identifiers, each one in square brackets. + Identifiers are used to group related tests, or tests with specific properties. + Use like: + + TEST_CASE("Frobnicator forbnicates", "[frobnicator][rom]") + { + // test goes here + } +*/ +#define TEST_CASE(name_, desc_) \ + static void UNITY_TEST_UID(test_func_) (void); \ + static void __attribute__((constructor)) UNITY_TEST_UID(test_reg_helper_) () \ + { \ + static struct test_desc_t UNITY_TEST_UID(test_desc_) = { \ + .name = name_, \ + .desc = desc_, \ + .fn = &UNITY_TEST_UID(test_func_), \ + .file = __FILE__, \ + .line = __LINE__ \ + }; \ + unity_testcase_register( & UNITY_TEST_UID(test_desc_) ); \ + }\ + static void UNITY_TEST_UID(test_func_) (void) + +// shorthand to check esp_err_t return code +#define TEST_ESP_OK(rc) TEST_ASSERT_EQUAL_INT32(ESP_OK, rc) +#define TEST_ESP_ERR(err, rc) TEST_ASSERT_EQUAL_INT32(err, rc) + + +#endif //UNITY_CONFIG_H diff --git a/tools/unit-test-app/components/unity/include/unity_internals.h b/tools/unit-test-app/components/unity/include/unity_internals.h new file mode 100644 index 000000000..03d196f4f --- /dev/null +++ b/tools/unit-test-app/components/unity/include/unity_internals.h @@ -0,0 +1,772 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_INTERNALS_H +#define UNITY_INTERNALS_H + +#ifdef UNITY_INCLUDE_CONFIG_H +#include "unity_config.h" +#endif + +#include + +/* Unity Attempts to Auto-Detect Integer Types + * Attempt 1: UINT_MAX, ULONG_MAX, etc in + * Attempt 2: UINT_MAX, ULONG_MAX, etc in + * Attempt 3: Deduced from sizeof() macros */ +#ifndef UNITY_EXCLUDE_STDINT_H +#include +#endif + +#ifndef UNITY_EXCLUDE_LIMITS_H +#include +#endif + +#ifndef UNITY_EXCLUDE_SIZEOF +#ifndef UINT_MAX +#define UINT_MAX (sizeof(unsigned int) * 256 - 1) +#endif +#ifndef ULONG_MAX +#define ULONG_MAX (sizeof(unsigned long) * 256 - 1) +#endif +#ifndef UINTPTR_MAX +/* apparently this is not a constant expression: (sizeof(unsigned int *) * 256 - 1) so we have to just let this fall through */ +#endif +#endif + +#ifndef UNITY_EXCLUDE_MATH_H +#include +#endif + +/*------------------------------------------------------- + * Guess Widths If Not Specified + *-------------------------------------------------------*/ + +/* Determine the size of an int, if not already specificied. + * We cannot use sizeof(int), because it is not yet defined + * at this stage in the trnslation of the C program. + * Therefore, infer it from UINT_MAX if possible. */ +#ifndef UNITY_INT_WIDTH + #ifdef UINT_MAX + #if (UINT_MAX == 0xFFFF) + #define UNITY_INT_WIDTH (16) + #elif (UINT_MAX == 0xFFFFFFFF) + #define UNITY_INT_WIDTH (32) + #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_INT_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_INT_WIDTH + #define UNITY_INT_WIDTH (32) +#endif + +/* Determine the size of a long, if not already specified, + * by following the process used above to define + * UNITY_INT_WIDTH. */ +#ifndef UNITY_LONG_WIDTH + #ifdef ULONG_MAX + #if (ULONG_MAX == 0xFFFF) + #define UNITY_LONG_WIDTH (16) + #elif (ULONG_MAX == 0xFFFFFFFF) + #define UNITY_LONG_WIDTH (32) + #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_LONG_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_LONG_WIDTH + #define UNITY_LONG_WIDTH (32) +#endif + +/* Determine the size of a pointer, if not already specified, + * by following the process used above to define + * UNITY_INT_WIDTH. */ +#ifndef UNITY_POINTER_WIDTH + #ifdef UINTPTR_MAX + #if (UINTPTR_MAX+0 <= 0xFFFF) + #define UNITY_POINTER_WIDTH (16) + #elif (UINTPTR_MAX+0 <= 0xFFFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (UINTPTR_MAX+0 <= 0xFFFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_POINTER_WIDTH + #ifdef INTPTR_MAX + #if (INTPTR_MAX+0 <= 0x7FFF) + #define UNITY_POINTER_WIDTH (16) + #elif (INTPTR_MAX+0 <= 0x7FFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (INTPTR_MAX+0 <= 0x7FFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_POINTER_WIDTH + #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH +#endif + +/*------------------------------------------------------- + * Int Support (Define types based on detected sizes) + *-------------------------------------------------------*/ + +#if (UNITY_INT_WIDTH == 32) + typedef unsigned char _UU8; + typedef unsigned short _UU16; + typedef unsigned int _UU32; + typedef signed char _US8; + typedef signed short _US16; + typedef signed int _US32; +#elif (UNITY_INT_WIDTH == 16) + typedef unsigned char _UU8; + typedef unsigned int _UU16; + typedef unsigned long _UU32; + typedef signed char _US8; + typedef signed int _US16; + typedef signed long _US32; +#else + #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) +#endif + +/*------------------------------------------------------- + * 64-bit Support + *-------------------------------------------------------*/ + +#ifndef UNITY_SUPPORT_64 +#if UNITY_LONG_WIDTH > 32 +#define UNITY_SUPPORT_64 +#endif +#endif +#ifndef UNITY_SUPPORT_64 +#if UNITY_POINTER_WIDTH > 32 +#define UNITY_SUPPORT_64 +#endif +#endif + +#ifndef UNITY_SUPPORT_64 + +/* No 64-bit Support */ +typedef _UU32 _U_UINT; +typedef _US32 _U_SINT; + +#else + +/* 64-bit Support */ +#if (UNITY_LONG_WIDTH == 32) + typedef unsigned long long _UU64; + typedef signed long long _US64; +#elif (UNITY_LONG_WIDTH == 64) + typedef unsigned long _UU64; + typedef signed long _US64; +#else + #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) +#endif +typedef _UU64 _U_UINT; +typedef _US64 _U_SINT; + +#endif + +/*------------------------------------------------------- + * Pointer Support + *-------------------------------------------------------*/ + +#if (UNITY_POINTER_WIDTH == 32) + typedef _UU32 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 +#elif (UNITY_POINTER_WIDTH == 64) + typedef _UU64 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 +#elif (UNITY_POINTER_WIDTH == 16) + typedef _UU16 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 +#else + #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) +#endif + +#ifndef UNITY_PTR_ATTRIBUTE +#define UNITY_PTR_ATTRIBUTE +#endif + +#ifndef UNITY_INTERNAL_PTR +#define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* +/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const _UU8* */ +#endif + +/*------------------------------------------------------- + * Float Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_FLOAT + +/* No Floating Point Support */ +#undef UNITY_INCLUDE_FLOAT +#undef UNITY_FLOAT_PRECISION +#undef UNITY_FLOAT_TYPE +#undef UNITY_FLOAT_VERBOSE + +#else + +#ifndef UNITY_INCLUDE_FLOAT +#define UNITY_INCLUDE_FLOAT +#endif + +/* Floating Point Support */ +#ifndef UNITY_FLOAT_PRECISION +#define UNITY_FLOAT_PRECISION (0.00001f) +#endif +#ifndef UNITY_FLOAT_TYPE +#define UNITY_FLOAT_TYPE float +#endif +typedef UNITY_FLOAT_TYPE _UF; + +#ifndef isinf +#define isinf(n) (((1.0f / f_zero) == n) ? 1 : 0) || (((-1.0f / f_zero) == n) ? 1 : 0) +#define UNITY_FLOAT_NEEDS_ZERO +#endif + +#ifndef isnan +#define isnan(n) ((n != n) ? 1 : 0) +#endif + +#ifndef isneg +#define isneg(n) ((n < 0.0f) ? 1 : 0) +#endif + +#ifndef ispos +#define ispos(n) ((n > 0.0f) ? 1 : 0) +#endif + +#endif + +/*------------------------------------------------------- + * Double Float Support + *-------------------------------------------------------*/ + +/* unlike FLOAT, we DON'T include by default */ +#ifndef UNITY_EXCLUDE_DOUBLE +#ifndef UNITY_INCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE +#endif +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE + +/* No Floating Point Support */ +#undef UNITY_DOUBLE_PRECISION +#undef UNITY_DOUBLE_TYPE +#undef UNITY_DOUBLE_VERBOSE + +#ifdef UNITY_INCLUDE_DOUBLE +#undef UNITY_INCLUDE_DOUBLE +#endif + +#else + +/* Double Floating Point Support */ +#ifndef UNITY_DOUBLE_PRECISION +#define UNITY_DOUBLE_PRECISION (1e-12f) +#endif +#ifndef UNITY_DOUBLE_TYPE +#define UNITY_DOUBLE_TYPE double +#endif +typedef UNITY_DOUBLE_TYPE _UD; + +#endif + +#ifdef UNITY_DOUBLE_VERBOSE +#ifndef UNITY_FLOAT_VERBOSE +#define UNITY_FLOAT_VERBOSE +#endif +#endif + +/*------------------------------------------------------- + * Output Method: stdout (DEFAULT) + *-------------------------------------------------------*/ +#ifndef UNITY_OUTPUT_CHAR +/* Default to using putchar, which is defined in stdio.h */ +#include +#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifndef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +extern void UNITY_OUTPUT_CHAR(int); + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +/* Default to using putchar, which is defined in stdio.h */ +#include +#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION +extern void UNITY_OUTPUT_FLUSH(void); + #endif +#endif + +#ifndef UNITY_PRINT_EOL +#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') +#endif + +#ifndef UNITY_OUTPUT_START +#define UNITY_OUTPUT_START() +#endif + +#ifndef UNITY_OUTPUT_COMPLETE +#define UNITY_OUTPUT_COMPLETE() +#endif + +/*------------------------------------------------------- + * Footprint + *-------------------------------------------------------*/ + +#ifndef UNITY_LINE_TYPE +#define UNITY_LINE_TYPE _U_UINT +#endif + +#ifndef UNITY_COUNTER_TYPE +#define UNITY_COUNTER_TYPE _U_UINT +#endif + +/*------------------------------------------------------- + * Language Features Available + *-------------------------------------------------------*/ +#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) +# ifdef __GNUC__ /* includes clang */ +# if !(defined(__WIN32__) && defined(__clang__)) +# define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) +# endif +# endif +#endif + +#ifdef UNITY_NO_WEAK +# undef UNITY_WEAK_ATTRIBUTE +# undef UNITY_WEAK_PRAGMA +#endif + + +/*------------------------------------------------------- + * Internal Structs Needed + *-------------------------------------------------------*/ + +typedef void (*UnityTestFunction)(void); + +#define UNITY_DISPLAY_RANGE_INT (0x10) +#define UNITY_DISPLAY_RANGE_UINT (0x20) +#define UNITY_DISPLAY_RANGE_HEX (0x40) +#define UNITY_DISPLAY_RANGE_AUTO (0x80) + +typedef enum +{ +#if (UNITY_INT_WIDTH == 16) + UNITY_DISPLAY_STYLE_INT = 2 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 32) + UNITY_DISPLAY_STYLE_INT = 4 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 64) + UNITY_DISPLAY_STYLE_INT = 8 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#endif + UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, +#endif + +#if (UNITY_INT_WIDTH == 16) + UNITY_DISPLAY_STYLE_UINT = 2 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 32) + UNITY_DISPLAY_STYLE_UINT = 4 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 64) + UNITY_DISPLAY_STYLE_UINT = 8 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#endif + UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, +#endif + UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, +#endif + UNITY_DISPLAY_STYLE_UNKNOWN +} UNITY_DISPLAY_STYLE_T; + +#ifndef UNITY_EXCLUDE_FLOAT +typedef enum _UNITY_FLOAT_TRAIT_T +{ + UNITY_FLOAT_IS_NOT_INF = 0, + UNITY_FLOAT_IS_INF, + UNITY_FLOAT_IS_NOT_NEG_INF, + UNITY_FLOAT_IS_NEG_INF, + UNITY_FLOAT_IS_NOT_NAN, + UNITY_FLOAT_IS_NAN, + UNITY_FLOAT_IS_NOT_DET, + UNITY_FLOAT_IS_DET, + UNITY_FLOAT_INVALID_TRAIT +} UNITY_FLOAT_TRAIT_T; +#endif + +struct _Unity +{ + const char* TestFile; + const char* CurrentTestName; +#ifndef UNITY_EXCLUDE_DETAILS + const char* CurrentDetail1; + const char* CurrentDetail2; +#endif + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; + jmp_buf AbortFrame; +}; + +extern struct _Unity Unity; + +/*------------------------------------------------------- + * Test Suite Management + *-------------------------------------------------------*/ + +void UnityBegin(const char* filename); +int UnityEnd(void); +void UnityConcludeTest(void); +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum); + +/*------------------------------------------------------- + * Details Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_DETAILS +#define UNITY_CLR_DETAILS() +#define UNITY_SET_DETAIL(d1) +#define UNITY_SET_DETAILS(d1,d2) +#else +#define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } +#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; } +#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; } + +#ifndef UNITY_DETAIL1_NAME +#define UNITY_DETAIL1_NAME "Function" +#endif + +#ifndef UNITY_DETAIL2_NAME +#define UNITY_DETAIL2_NAME "Argument" +#endif +#endif + +/*------------------------------------------------------- + * Test Output + *-------------------------------------------------------*/ + +void UnityPrint(const char* string); +void UnityPrintMask(const _U_UINT mask, const _U_UINT number); +void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const _U_SINT number); +void UnityPrintNumberUnsigned(const _U_UINT number); +void UnityPrintNumberHex(const _U_UINT number, const char nibbles); + +#ifdef UNITY_FLOAT_VERBOSE +void UnityPrintFloat(const _UF number); +#endif + +/*------------------------------------------------------- + * Test Assertion Fuctions + *------------------------------------------------------- + * Use the macros below this section instead of calling + * these directly. The macros have a consistent naming + * convention and will pull in file and line information + * for you. */ + +void UnityAssertEqualNumber(const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertBits(const _U_SINT mask, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const _UU32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringArray( const char** expected, + const char** actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 length, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertNumbersWithin(const _U_UINT delta, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityFail(const char* message, const UNITY_LINE_TYPE line); + +void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); + +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertFloatsWithin(const _UF delta, + const _UF expected, + const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, + UNITY_PTR_ATTRIBUTE const _UF* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertFloatSpecial(const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertDoublesWithin(const _UD delta, + const _UD expected, + const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, + UNITY_PTR_ATTRIBUTE const _UD* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertDoubleSpecial(const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +/*------------------------------------------------------- + * Error Strings We Might Need + *-------------------------------------------------------*/ + +extern const char UnityStrErrFloat[]; +extern const char UnityStrErrDouble[]; +extern const char UnityStrErr64[]; + +/*------------------------------------------------------- + * Test Running Macros + *-------------------------------------------------------*/ + +#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) + +#define TEST_ABORT() {longjmp(Unity.AbortFrame, 1);} + +/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ +#ifndef RUN_TEST +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901L +#define RUN_TEST(...) UnityDefaultTestRun(RUN_TEST_FIRST(__VA_ARGS__), RUN_TEST_SECOND(__VA_ARGS__)) +#define RUN_TEST_FIRST(...) RUN_TEST_FIRST_HELPER(__VA_ARGS__, throwaway) +#define RUN_TEST_FIRST_HELPER(first, ...) (first), #first +#define RUN_TEST_SECOND(...) RUN_TEST_SECOND_HELPER(__VA_ARGS__, __LINE__, throwaway) +#define RUN_TEST_SECOND_HELPER(first, second, ...) (second) +#endif +#endif +#endif + +/* If we can't do the tricky version, we'll just have to require them to always include the line number */ +#ifndef RUN_TEST +#ifdef CMOCK +#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) +#else +#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) +#endif +#endif + +#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) +#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) +#define UNITY_NEW_TEST(a) \ + Unity.CurrentTestName = (a); \ + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ + Unity.NumberOfTests++; + +#ifndef UNITY_BEGIN +#define UNITY_BEGIN() UnityBegin(__FILE__) +#endif + +#ifndef UNITY_END +#define UNITY_END() UnityEnd() +#endif + +#define UNITY_UNUSED(x) (void)(sizeof(x)) + +/*------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line)) + +/*------------------------------------------------------- + * Test Asserts + *-------------------------------------------------------*/ + +#define UNITY_TEST_ASSERT(condition, line, message) if (condition) {} else {UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message));} +#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) + +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU8 )(expected), (_U_SINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU16)(expected), (_U_SINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU32)(expected), (_U_SINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((_U_SINT)(mask), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) + +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UP)(expected), (_U_SINT)(_UP)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (_UU32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(_UP*)(expected), (UNITY_INTERNAL_PTR)(_UP*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) + +#ifdef UNITY_SUPPORT_64 +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#else +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#endif + +#ifdef UNITY_EXCLUDE_FLOAT +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#else +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((_UF)(delta), (_UF)(expected), (_UF)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((_UF)(expected) * (_UF)UNITY_FLOAT_PRECISION, (_UF)(expected), (_UF)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((_UF*)(expected), (_UF*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#else +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((_UD)(delta), (_UD)(expected), (_UD)(actual), (message), (UNITY_LINE_TYPE)line) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((_UD)(expected) * (_UD)UNITY_DOUBLE_PRECISION, (_UD)expected, (_UD)actual, (UNITY_LINE_TYPE)(line), message) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((_UD*)(expected), (_UD*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +/* End of UNITY_INTERNALS_H */ +#endif diff --git a/tools/unit-test-app/components/unity/license.txt b/tools/unit-test-app/components/unity/license.txt new file mode 100644 index 000000000..d66fba53e --- /dev/null +++ b/tools/unit-test-app/components/unity/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/tools/unit-test-app/components/unity/unity.c b/tools/unit-test-app/components/unity/unity.c new file mode 100644 index 000000000..4a99208d8 --- /dev/null +++ b/tools/unit-test-app/components/unity/unity.c @@ -0,0 +1,1306 @@ +/* ========================================================================= + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +============================================================================ */ + +#include "unity.h" +#include + +/* If omitted from header, declare overrideable prototypes here so they're ready for use */ +#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +int UNITY_OUTPUT_CHAR(int); +#endif +#ifdef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION +int UNITY_OUTPUT_FLUSH(void); +#endif + +/* Helpful macros for us to use here */ +#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } +#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } + +/* return prematurely if we are already in failure or ignore state */ +#define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } + +struct _Unity Unity; + +static const char UnityStrOk[] = "OK"; +static const char UnityStrPass[] = "PASS"; +static const char UnityStrFail[] = "FAIL"; +static const char UnityStrIgnore[] = "IGNORE"; +static const char UnityStrNull[] = "NULL"; +static const char UnityStrSpacer[] = ". "; +static const char UnityStrExpected[] = " Expected "; +static const char UnityStrWas[] = " Was "; +static const char UnityStrElement[] = " Element "; +static const char UnityStrByte[] = " Byte "; +static const char UnityStrMemory[] = " Memory Mismatch."; +static const char UnityStrDelta[] = " Values Not Within Delta "; +static const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +static const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +static const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +static const char UnityStrNot[] = "Not "; +static const char UnityStrInf[] = "Infinity"; +static const char UnityStrNegInf[] = "Negative Infinity"; +static const char UnityStrNaN[] = "NaN"; +static const char UnityStrDet[] = "Determinate"; +static const char UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; +const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; +static const char UnityStrBreaker[] = "-----------------------"; +static const char UnityStrResultsTests[] = " Tests "; +static const char UnityStrResultsFailures[] = " Failures "; +static const char UnityStrResultsIgnored[] = " Ignored "; +static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; + +#ifdef UNITY_FLOAT_NEEDS_ZERO +/* Dividing by these constants produces +/- infinity. + * The rationale is given in UnityAssertFloatIsInf's body. */ +static const _UF f_zero = 0.0f; +#endif + +/* compiler-generic print formatting masks */ +static const _U_UINT UnitySizeMask[] = +{ + 255u, /* 0xFF */ + 65535u, /* 0xFFFF */ + 65535u, + 4294967295u, /* 0xFFFFFFFF */ + 4294967295u, + 4294967295u, + 4294967295u +#ifdef UNITY_SUPPORT_64 + ,0xFFFFFFFFFFFFFFFF +#endif +}; + +/*----------------------------------------------- + * Pretty Printers & Test Result Output Handlers + *-----------------------------------------------*/ + +void UnityPrint(const char* string) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +void UnityPrintLen(const char* string, const _UU32 length); +void UnityPrintLen(const char* string, const _UU32 length) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch && (_UU32)(pch - string) < length) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + UnityPrintNumber(number); + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); + } + else + { + UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumber(const _U_SINT number_to_print) +{ + _U_UINT number = (_U_UINT)number_to_print; + + if (number_to_print < 0) + { + /* A negative number, including MIN negative */ + UNITY_OUTPUT_CHAR('-'); + number = (_U_UINT)(-number_to_print); + } + UnityPrintNumberUnsigned(number); +} + +/*----------------------------------------------- + * basically do an itoa using as little ram as possible */ +void UnityPrintNumberUnsigned(const _U_UINT number) +{ + _U_UINT divisor = 1; + + /* figure out initial divisor */ + while (number / divisor > 9) + { + divisor *= 10; + } + + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } + while (divisor > 0); +} + +/*-----------------------------------------------*/ +void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) +{ + _U_UINT nibble; + char nibbles = nibbles_to_print; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + + while (nibbles > 0) + { + nibble = (number >> (--nibbles << 2)) & 0x0000000F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintMask(const _U_UINT mask, const _U_UINT number) +{ + _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); + _US32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +/*-----------------------------------------------*/ +#ifdef UNITY_FLOAT_VERBOSE +#include + +#ifndef UNITY_VERBOSE_NUMBER_MAX_LENGTH +# ifdef UNITY_DOUBLE_VERBOSE +# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 317 +# else +# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 47 +# endif +#endif + +void UnityPrintFloat(_UF number) +{ + char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; + snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); + UnityPrint(TempBuffer); +} +#endif + +/*-----------------------------------------------*/ + +void UnityPrintFail(void); +void UnityPrintFail(void) +{ + UnityPrint(UnityStrFail); +} + +void UnityPrintOk(void); +void UnityPrintOk(void) +{ + UnityPrint(UnityStrOk); +} + +/*-----------------------------------------------*/ +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((_U_SINT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UNITY_UNUSED(file); + UNITY_UNUSED(line); +#endif +} + +/*-----------------------------------------------*/ +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityTestResultsBegin(Unity.TestFile, line); +#else + UNITY_UNUSED(line); +#endif + UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +/*-----------------------------------------------*/ +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EOL(); + UNITY_OUTPUT_FLUSH(); +} + +/*-----------------------------------------------*/ +static void UnityAddMsgIfSpecified(const char* msg); +static void UnityAddMsgIfSpecified(const char* msg) +{ + if (msg) + { + UnityPrint(UnityStrSpacer); +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + UnityPrint(msg); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + + + +/*----------------------------------------------- + * Assertion & Control Helpers + *-----------------------------------------------*/ + +static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) +{ + /* return true if they are both NULL */ + if ((expected == NULL) && (actual == NULL)) + return 1; + + /* throw error if just expected is NULL */ + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + /* throw error if just actual is NULL */ + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + /* return false if neither is NULL */ + return 0; +} + +/*----------------------------------------------- + * Assertion Functions + *-----------------------------------------------*/ + +void UnityAssertBits(const _U_SINT mask, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_SKIP_EXECUTION; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualNumber(const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + UNITY_SKIP_EXECUTION; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#define UnityPrintPointlessAndBail() \ +{ \ + UnityTestResultsFailBegin(lineNumber); \ + UnityPrint(UnityStrPointless); \ + UnityAddMsgIfSpecified(msg); \ + UNITY_FAIL_AND_BAIL; } + +/*-----------------------------------------------*/ +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + _UU32 elements = num_elements; + UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; + UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + /* If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case + * as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific + * variants do not. Therefore remove this flag. */ + switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) + { + case UNITY_DISPLAY_STYLE_HEX8: + case UNITY_DISPLAY_STYLE_INT8: + case UNITY_DISPLAY_STYLE_UINT8: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + break; + case UNITY_DISPLAY_STYLE_HEX16: + case UNITY_DISPLAY_STYLE_INT16: + case UNITY_DISPLAY_STYLE_UINT16: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); + } + break; +#ifdef UNITY_SUPPORT_64 + case UNITY_DISPLAY_STYLE_HEX64: + case UNITY_DISPLAY_STYLE_INT64: + case UNITY_DISPLAY_STYLE_UINT64: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); + } + break; +#endif + default: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); + } + break; + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, + UNITY_PTR_ATTRIBUTE const _UF* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; + _UF diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0f) + diff = 0.0f - diff; + tol = UNITY_FLOAT_PRECISION * *ptr_expected; + if (tol < 0.0f) + tol = 0.0f - tol; + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(*ptr_expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(*ptr_actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsWithin(const _UF delta, + const _UF expected, + const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UF diff = actual - expected; + _UF pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0f) + { + diff = 0.0f - diff; + } + if (pos_delta < 0.0f) + { + pos_delta = 0.0f - pos_delta; + } + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatSpecial(const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = (_U_SINT)(style >> 1); + + UNITY_SKIP_EXECUTION; + + switch(style) + { + /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_FLOAT */ + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, + UNITY_PTR_ATTRIBUTE const _UD* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; + _UD diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0) + diff = 0.0 - diff; + tol = UNITY_DOUBLE_PRECISION * *ptr_expected; + if (tol < 0.0) + tol = 0.0 - tol; + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)(*ptr_expected)); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)(*ptr_actual)); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesWithin(const _UD delta, + const _UD expected, + const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UD diff = actual - expected; + _UD pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0) + { + diff = 0.0 - diff; + } + if (pos_delta < 0.0) + { + pos_delta = 0.0 - pos_delta; + } + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)expected); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ + +void UnityAssertDoubleSpecial(const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = (_U_SINT)(style >> 1); + + UNITY_SKIP_EXECUTION; + + switch(style) + { + /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +#endif /* not UNITY_EXCLUDE_DOUBLE */ + +/*-----------------------------------------------*/ +void UnityAssertNumbersWithin( const _U_UINT delta, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + UNITY_SKIP_EXECUTION; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + else + Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + } + else + { + if ((_U_UINT)actual > (_U_UINT)expected) + Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + else + Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((_U_SINT)delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const _UU32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; (expected[i] || actual[i]) && i < length; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +/*-----------------------------------------------*/ +void UnityAssertEqualStringArray( const char** expected, + const char** actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i, j = 0; + + UNITY_SKIP_EXECUTION; + + /* if no elements, it's an error */ + if (num_elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + do + { + /* if both pointers not null compare the strings */ + if (expected[j] && actual[j]) + { + for (i = 0; expected[j][i] || actual[j][i]; i++) + { + if (expected[j][i] != actual[j][i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected[j] != actual[j]) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(j); + } + UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +/*-----------------------------------------------*/ +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 length, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; + _UU32 elements = num_elements; + _UU32 bytes; + + UNITY_SKIP_EXECUTION; + + if ((elements == 0) || (length == 0)) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + /* /////////////////////////////////// */ + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + } + UnityPrint(UnityStrByte); + UnityPrintNumberUnsigned(length - bytes - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + /* /////////////////////////////////// */ + + } +} + +/*----------------------------------------------- + * Control Functions + *-----------------------------------------------*/ + +void UnityFail(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrintFail(); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +/*-----------------------------------------------*/ +#if defined(UNITY_WEAK_ATTRIBUTE) + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } +#elif defined(UNITY_WEAK_PRAGMA) +# pragma weak setUp + void setUp(void) { } +# pragma weak tearDown + void tearDown(void) { } +#endif +/*-----------------------------------------------*/ +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) + { + tearDown(); + } + UnityConcludeTest(); +} + +/*-----------------------------------------------*/ +void UnityBegin(const char* filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +/*-----------------------------------------------*/ +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((_U_SINT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrintOk(); + } + else + { + UnityPrintFail(); +#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL + UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); +#endif + } + UNITY_PRINT_EOL(); + UNITY_OUTPUT_FLUSH(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +/*-----------------------------------------------*/ diff --git a/tools/unit-test-app/components/unity/unity_platform.c b/tools/unit-test-app/components/unity/unity_platform.c new file mode 100644 index 000000000..4e1c0b8e0 --- /dev/null +++ b/tools/unit-test-app/components/unity/unity_platform.c @@ -0,0 +1,165 @@ +#include +#include +#include +#include "unity.h" +#include "rom/ets_sys.h" + +#define unity_printf ets_printf + +// Functions which are defined in ROM, linker script provides addresses for these: +int uart_tx_one_char(uint8_t c); +void uart_tx_wait_idle(uint8_t uart_no); +int UartRxString(uint8_t* dst, uint8_t max_length); + +// Pointers to the head and tail of linked list of test description structs: +static struct test_desc_t* s_unity_tests_first = NULL; +static struct test_desc_t* s_unity_tests_last = NULL; + + +void unity_putc(int c) +{ + if (c == '\n') + { + uart_tx_one_char('\n'); + uart_tx_one_char('\r'); + } + else if (c == '\r') + { + } + else + { + uart_tx_one_char(c); + } +} + +void unity_flush() +{ + uart_tx_wait_idle(0); // assume that output goes to UART0 +} + +void unity_testcase_register(struct test_desc_t* desc) +{ + if (!s_unity_tests_first) + { + s_unity_tests_first = desc; + } + else + { + s_unity_tests_last->next = desc; + } + s_unity_tests_last = desc; + desc->next = NULL; +} + +static void unity_run_single_test(const struct test_desc_t* test) +{ + Unity.TestFile = test->file; + Unity.CurrentDetail1 = test->desc; + UnityDefaultTestRun(test->fn, test->name, test->line); +} + +static void unity_run_single_test_by_index(int index) +{ + const struct test_desc_t* test; + for (test = s_unity_tests_first; test != NULL && index != 0; test = test->next, --index) + { + } + if (test != NULL) + { + unity_run_single_test(test); + } + +} + +static void unity_run_single_test_by_name(const char* filter) +{ + char tmp[256]; + strncpy(tmp, filter + 1, sizeof(tmp) - 1); + tmp[strlen(filter) - 2] = 0; + for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next) + { + if (strstr(test->name, tmp) != NULL) + { + unity_run_single_test(test); + } + } +} + +void unity_run_all_tests() +{ + for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next) + { + unity_run_single_test(test); + } +} + +void unity_run_tests_with_filter(const char* filter) +{ + for (const struct test_desc_t* test = s_unity_tests_first; test != NULL; test = test->next) + { + if (strstr(test->desc, filter) != NULL) + { + unity_run_single_test(test); + } + } +} + +static void trim_trailing_space(char* str) +{ + char* end = str + strlen(str) - 1; + while (end >= str && isspace((int) *end)) + { + *end = 0; + --end; + } +} + +void unity_run_menu() +{ + while (true) + { + int test_counter = 0; + unity_printf("\n\nHere's the test menu, pick your combo:\n"); + for (const struct test_desc_t* test = s_unity_tests_first; + test != NULL; + test = test->next, ++test_counter) + { + unity_printf("(%d)\t\"%s\" %s\n", test_counter + 1, test->name, test->desc); + } + + char cmdline[256]; + UartRxString((uint8_t*) cmdline, sizeof(cmdline) - 1); + trim_trailing_space(cmdline); + + if (strlen(cmdline) == 0) + { + continue; + } + + UNITY_BEGIN(); + + if (cmdline[0] == '*') + { + unity_run_all_tests(); + } + else if (cmdline[0] =='[') + { + unity_run_tests_with_filter(cmdline); + } + else if (cmdline[0] =='"') + { + unity_run_single_test_by_name(cmdline); + } + else + { + int test_index = strtol(cmdline, NULL, 10); + if (test_index >= 1 && test_index <= test_counter) + { + unity_run_single_test_by_index(test_index - 1); + } + } + + UNITY_END(); + } +} + diff --git a/tools/unit-test-app/main/app_main.c b/tools/unit-test-app/main/app_main.c new file mode 100644 index 000000000..b00034adf --- /dev/null +++ b/tools/unit-test-app/main/app_main.c @@ -0,0 +1,18 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" + + +void unityTask(void *pvParameters) +{ + vTaskDelay(1000 / portTICK_PERIOD_MS); + unity_run_menu(); + while(1); +} + +void app_main() +{ + xTaskCreatePinnedToCore(unityTask, "unityTask", 4096, NULL, 5, NULL, 0); +} + diff --git a/tools/unit-test-app/main/component.mk b/tools/unit-test-app/main/component.mk new file mode 100644 index 000000000..fd2dbe7b8 --- /dev/null +++ b/tools/unit-test-app/main/component.mk @@ -0,0 +1,5 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# + +include $(IDF_PATH)/make/component_common.mk diff --git a/tools/unit-test-app/sdkconfig b/tools/unit-test-app/sdkconfig new file mode 100644 index 000000000..cde49f3c8 --- /dev/null +++ b/tools/unit-test-app/sdkconfig @@ -0,0 +1,125 @@ +# +# Automatically generated file; DO NOT EDIT. +# Espressif IoT Development Framework Configuration +# + +# +# SDK tool configuration +# +CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +CONFIG_PYTHON="python" + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0" +# CONFIG_ESPTOOLPY_BAUD_115200B is not set +# CONFIG_ESPTOOLPY_BAUD_230400B is not set +CONFIG_ESPTOOLPY_BAUD_921600B=y +# CONFIG_ESPTOOLPY_BAUD_2MB is not set +# CONFIG_ESPTOOLPY_BAUD_OTHER is not set +CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 +CONFIG_ESPTOOLPY_BAUD=921600 +CONFIG_ESPTOOLPY_COMPRESSED=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="40m" + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000 +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_APP_OFFSET=0x10000 + +# +# Component config +# + +# +# ESP32-specific config +# +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 +# CONFIG_ESP32_ENABLE_STACK_WIFI is not set +# CONFIG_ESP32_ENABLE_STACK_BT is not set +CONFIG_ESP32_ENABLE_STACK_NONE=y +CONFIG_MEMMAP_SMP=y +# CONFIG_MEMMAP_TRACEMEM is not set +# CONFIG_MEMMAP_SPISRAM is not set +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2048 +CONFIG_MAIN_TASK_STACK_SIZE=4096 +CONFIG_NEWLIB_STDOUT_ADDCR=y + +# +# FreeRTOS +# +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +# CONFIG_FREERTOS_CORETIMER_2 is not set +CONFIG_FREERTOS_HZ=1000 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3 +# CONFIG_FREERTOS_PANIC_PRINT_HALT is not set +CONFIG_FREERTOS_PANIC_PRINT_REBOOT=y +# CONFIG_FREERTOS_PANIC_SILENT_REBOOT is not set +# CONFIG_FREERTOS_PANIC_GDBSTUB is not set +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set +# CONFIG_FREERTOS_ASSERT_DISABLE is not set +CONFIG_FREERTOS_BREAK_ON_SCHEDULER_START_JTAG=y +# CONFIG_ENABLE_MEMORY_DEBUG is not set +# CONFIG_FREERTOS_DEBUG_INTERNALS is not set + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_COLORS=y + +# +# LWIP +# +CONFIG_LWIP_MAX_SOCKETS=4 +CONFIG_LWIP_THREAD_LOCAL_STORAGE_INDEX=0 +# CONFIG_LWIP_SO_REUSE is not set + +# +# mbedTLS +# +CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 +# CONFIG_MBEDTLS_DEBUG is not set + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set + +# +# TESTS +# +CONFIG_FP_TEST_ENABLE=y