| From 8d27edea9774e92b6b441b63f3936b3cdb1aaa88 Mon Sep 17 00:00:00 2001 |
| From: penn5 <penn5@users.noreply.github.com> |
| Date: Mon, 4 Mar 2019 22:21:07 +0000 |
| Subject: [PATCH 2/2] Add props to control supported features and states (#1) |
| |
| * Add bitmask for supported fields |
| Use persist.sys.bt.unsupport.states, defaults to 0, left-aligned. |
| Huawei suggest to use 000000000000000000000011111 |
| |
| * Add bitmask to LOCAL_SUPPORTED_FEATURES |
| For Huawei, suggest to use 00000001 |
| --- |
| hci/src/hci_packet_parser.cc | 55 ++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 55 insertions(+) |
| |
| diff --git a/hci/src/hci_packet_parser.cc b/hci/src/hci_packet_parser.cc |
| index 3f4e46cb4..9afa0deab 100644 |
| --- a/hci/src/hci_packet_parser.cc |
| +++ b/hci/src/hci_packet_parser.cc |
| @@ -27,6 +27,8 @@ |
| #include "hcimsgs.h" |
| #include "osi/include/log.h" |
| |
| +#include <cutils/properties.h> |
| + |
| static const command_opcode_t NO_OPCODE_CHECKING = 0; |
| |
| static const allocator_t* buffer_allocator; |
| @@ -137,6 +139,33 @@ static void parse_read_local_extended_features_response( |
| STREAM_TO_ARRAY(feature_pages[*page_number_ptr].as_array, stream, |
| (int)sizeof(bt_device_features_t)); |
| |
| + int ijk; |
| + for (ijk = 0; ijk < ((int)sizeof(bt_device_features_t)); ijk++) LOG_DEBUG(LOG_TAG, "supported feature 0x%x is 0x%x", ijk, feature_pages[*page_number_ptr].as_array[ijk]); |
| + |
| + char unsupport_bitmask_str[PROPERTY_VALUE_MAX]; |
| + property_get("persist.sys.bt.unsupport.features", unsupport_bitmask_str, "0"); |
| + |
| + unsigned int len = strlen(unsupport_bitmask_str); |
| + uint8_t unsupport_bitmask[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
| + unsigned int c; |
| + |
| + for (c = 0; c < len; c++) { |
| + if (unsupport_bitmask_str[c] == '1') { |
| + unsupport_bitmask[c/8] = ~ ( (1 << c%8) | ~ unsupport_bitmask[c/8] ); // The logic here is hard to represent in C(++), basically we do a bitwise AND for the bit we are on now. But C(++) pads with 0s so we end up 0ing too much. |
| + } else if (unsupport_bitmask_str[c] != '0') { |
| + LOG_ERROR(LOG_TAG, "invalid characters in bitmask; skipping %c", unsupport_bitmask_str[c]); |
| + goto out; |
| + } |
| + } |
| + |
| + |
| + for (c = 0; c < ((int)sizeof(bt_device_features_t)); c++) |
| + feature_pages[*page_number_ptr].as_array[c] &= unsupport_bitmask[c]; |
| + LOG_DEBUG(LOG_TAG, "generated bitmask 0x%x%x%x%x%x%x%x%x from prop persist.sys.bt.unsupport.features", unsupport_bitmask[0], unsupport_bitmask[1], unsupport_bitmask[2], unsupport_bitmask[3], unsupport_bitmask[4], unsupport_bitmask[5], unsupport_bitmask[6], unsupport_bitmask[7]); |
| +out: |
| + for (ijk = 0; ijk < ((int)sizeof(bt_device_features_t)); ijk++) LOG_ERROR(LOG_TAG, "supported feature 0x%x is 0x%x", ijk, feature_pages[*page_number_ptr].as_array[ijk]); |
| + LOG_DEBUG(LOG_TAG, "supported_features array done"); |
| + |
| buffer_allocator->free(response); |
| } |
| |
| @@ -170,6 +199,32 @@ static void parse_ble_read_supported_states_response( |
| CHECK(stream != NULL); |
| STREAM_TO_ARRAY(supported_states, stream, (int)supported_states_size); |
| |
| + int ijk; |
| + for (ijk = 0; ijk < ((int)supported_states_size); ijk++) LOG_DEBUG(LOG_TAG, "supported state 0x%x is 0x%x", ijk, supported_states[ijk]); |
| + |
| + char unsupport_bitmask_str[PROPERTY_VALUE_MAX]; |
| + property_get("persist.sys.bt.unsupport.states", unsupport_bitmask_str, "0"); |
| + |
| + unsigned int len = strlen(unsupport_bitmask_str); |
| + uint8_t unsupport_bitmask[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
| + unsigned int c; |
| + |
| + for (c = 0; c < len; c++) { |
| + if (unsupport_bitmask_str[c] == '1') { |
| + unsupport_bitmask[c/8] = ~ ( (1 << c%8) | ~ unsupport_bitmask[c/8] ); // The logic here is hard to represent in C(++), basically we do a bitwise AND for the bit we are on now. But C(++) pads with 0s so we end up 0ing too much. |
| + } else if (unsupport_bitmask_str[c] != '0') { |
| + LOG_ERROR(LOG_TAG, "invalid characters in bitmask; skipping %c", unsupport_bitmask_str[c]); |
| + goto out; |
| + } |
| + } |
| + |
| + |
| + for (c = 0; c < supported_states_size; c++) |
| + supported_states[c] &= unsupport_bitmask[c]; |
| + LOG_DEBUG(LOG_TAG, "generated bitmask 0x%x%x%x%x%x%x%x%x from prop persist.sys.bt.unsupport.states", unsupport_bitmask[0], unsupport_bitmask[1], unsupport_bitmask[2], unsupport_bitmask[3], unsupport_bitmask[4], unsupport_bitmask[5], unsupport_bitmask[6], unsupport_bitmask[7]); |
| +out: |
| + for (ijk = 0; ijk < ((int)supported_states_size); ijk++) LOG_ERROR(LOG_TAG, "supported state 0x%x is 0x%x", ijk, supported_states[ijk]); |
| + LOG_DEBUG(LOG_TAG, "supported_states array done"); |
| buffer_allocator->free(response); |
| } |
| |
| -- |
| 2.17.1 |
| |