hci_packet_parser.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2014 Google, Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at:
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. ******************************************************************************/
  18. #include "common/bt_defs.h"
  19. #include "stack/bt_types.h"
  20. #include "stack/hcimsgs.h"
  21. #include "hci/hci_layer.h"
  22. #include "hci/hci_packet_parser.h"
  23. static const command_opcode_t NO_OPCODE_CHECKING = 0;
  24. static uint8_t *read_command_complete_header(
  25. BT_HDR *response,
  26. command_opcode_t expected_opcode,
  27. size_t minimum_bytes_after);
  28. static void parse_generic_command_complete(BT_HDR *response)
  29. {
  30. read_command_complete_header(response, NO_OPCODE_CHECKING, 0 /* bytes after */);
  31. osi_free(response);
  32. }
  33. static void parse_read_buffer_size_response(
  34. BT_HDR *response,
  35. uint16_t *acl_data_size_ptr,
  36. uint16_t *acl_buffer_count_ptr,
  37. uint8_t *sco_data_size_ptr,
  38. uint16_t *sco_buffer_count_ptr)
  39. {
  40. uint8_t *stream = read_command_complete_header(response, HCI_READ_BUFFER_SIZE, 7 /* bytes after */);
  41. assert(stream != NULL);
  42. STREAM_TO_UINT16(*acl_data_size_ptr, stream);
  43. STREAM_TO_UINT8(*sco_data_size_ptr, stream);
  44. STREAM_TO_UINT16(*acl_buffer_count_ptr, stream);
  45. STREAM_TO_UINT16(*sco_buffer_count_ptr, stream);
  46. osi_free(response);
  47. }
  48. static void parse_read_local_version_info_response(
  49. BT_HDR *response,
  50. bt_version_t *bt_version)
  51. {
  52. uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_VERSION_INFO, 8 /* bytes after */);
  53. assert(stream != NULL);
  54. STREAM_TO_UINT8(bt_version->hci_version, stream);
  55. STREAM_TO_UINT16(bt_version->hci_revision, stream);
  56. STREAM_TO_UINT8(bt_version->lmp_version, stream);
  57. STREAM_TO_UINT16(bt_version->manufacturer, stream);
  58. STREAM_TO_UINT16(bt_version->lmp_subversion, stream);
  59. osi_free(response);
  60. }
  61. static void parse_read_bd_addr_response(
  62. BT_HDR *response,
  63. bt_bdaddr_t *address_ptr)
  64. {
  65. uint8_t *stream = read_command_complete_header(response, HCI_READ_BD_ADDR, sizeof(bt_bdaddr_t) /* bytes after */);
  66. assert(stream != NULL);
  67. STREAM_TO_BDADDR(address_ptr->address, stream);
  68. osi_free(response);
  69. }
  70. static void parse_read_local_supported_commands_response(
  71. BT_HDR *response,
  72. uint8_t *supported_commands_ptr,
  73. size_t supported_commands_length)
  74. {
  75. uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_SUPPORTED_CMDS, supported_commands_length /* bytes after */);
  76. assert(stream != NULL);
  77. STREAM_TO_ARRAY(supported_commands_ptr, stream, (int)supported_commands_length);
  78. osi_free(response);
  79. }
  80. static void parse_read_local_extended_features_response(
  81. BT_HDR *response,
  82. uint8_t *page_number_ptr,
  83. uint8_t *max_page_number_ptr,
  84. bt_device_features_t *feature_pages,
  85. size_t feature_pages_count)
  86. {
  87. uint8_t *stream = read_command_complete_header(response, HCI_READ_LOCAL_EXT_FEATURES, 2 + sizeof(bt_device_features_t) /* bytes after */);
  88. if (stream != NULL) {
  89. STREAM_TO_UINT8(*page_number_ptr, stream);
  90. STREAM_TO_UINT8(*max_page_number_ptr, stream);
  91. assert(*page_number_ptr < feature_pages_count);
  92. STREAM_TO_ARRAY(feature_pages[*page_number_ptr].as_array, stream, (int)sizeof(bt_device_features_t));
  93. } else {
  94. HCI_TRACE_ERROR("%s() - WARNING: READING EXTENDED FEATURES FAILED. "
  95. "THIS MAY INDICATE A FIRMWARE/CONTROLLER ISSUE.", __func__);
  96. }
  97. osi_free(response);
  98. }
  99. static void parse_ble_read_white_list_size_response(
  100. BT_HDR *response,
  101. uint8_t *white_list_size_ptr)
  102. {
  103. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_WHITE_LIST_SIZE, 1 /* byte after */);
  104. assert(stream != NULL);
  105. STREAM_TO_UINT8(*white_list_size_ptr, stream);
  106. osi_free(response);
  107. }
  108. static void parse_ble_read_buffer_size_response(
  109. BT_HDR *response,
  110. uint16_t *data_size_ptr,
  111. uint8_t *acl_buffer_count_ptr)
  112. {
  113. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_BUFFER_SIZE, 3 /* bytes after */);
  114. assert(stream != NULL);
  115. STREAM_TO_UINT16(*data_size_ptr, stream);
  116. STREAM_TO_UINT8(*acl_buffer_count_ptr, stream);
  117. osi_free(response);
  118. }
  119. static void parse_ble_read_supported_states_response(
  120. BT_HDR *response,
  121. uint8_t *supported_states,
  122. size_t supported_states_size)
  123. {
  124. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_SUPPORTED_STATES, supported_states_size /* bytes after */);
  125. assert(stream != NULL);
  126. STREAM_TO_ARRAY(supported_states, stream, (int)supported_states_size);
  127. osi_free(response);
  128. }
  129. static void parse_ble_read_local_supported_features_response(
  130. BT_HDR *response,
  131. bt_device_features_t *supported_features)
  132. {
  133. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_LOCAL_SPT_FEAT, sizeof(bt_device_features_t) /* bytes after */);
  134. assert(stream != NULL);
  135. STREAM_TO_ARRAY(supported_features->as_array, stream, (int)sizeof(bt_device_features_t));
  136. osi_free(response);
  137. }
  138. static void parse_ble_read_resolving_list_size_response(
  139. BT_HDR *response,
  140. uint8_t *resolving_list_size_ptr)
  141. {
  142. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_RESOLVING_LIST_SIZE, 1 /* bytes after */);
  143. STREAM_TO_UINT8(*resolving_list_size_ptr, stream);
  144. osi_free(response);
  145. }
  146. static void parse_ble_read_suggested_default_data_length_response(
  147. BT_HDR *response,
  148. uint16_t *ble_default_packet_length_ptr,
  149. uint16_t *ble_default_packet_txtime_ptr)
  150. {
  151. uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */);
  152. STREAM_TO_UINT16(*ble_default_packet_length_ptr, stream);
  153. STREAM_TO_UINT16(*ble_default_packet_txtime_ptr, stream);
  154. osi_free(response);
  155. }
  156. // Internal functions
  157. static uint8_t *read_command_complete_header(
  158. BT_HDR *response,
  159. command_opcode_t expected_opcode,
  160. size_t minimum_bytes_after)
  161. {
  162. uint8_t *stream = response->data + response->offset;
  163. // Read the event header
  164. uint8_t event_code;
  165. uint8_t parameter_length;
  166. STREAM_TO_UINT8(event_code, stream);
  167. STREAM_TO_UINT8(parameter_length, stream);
  168. const size_t parameter_bytes_we_read_here = 4;
  169. // Check the event header values against what we expect
  170. assert(event_code == HCI_COMMAND_COMPLETE_EVT);
  171. assert(parameter_length >= (parameter_bytes_we_read_here + minimum_bytes_after));
  172. // Read the command complete header
  173. command_opcode_t opcode;
  174. uint8_t status;
  175. STREAM_SKIP_UINT8(stream); // skip the number of hci command packets field
  176. STREAM_TO_UINT16(opcode, stream);
  177. // Check the command complete header values against what we expect
  178. if (expected_opcode != NO_OPCODE_CHECKING) {
  179. assert(opcode == expected_opcode);
  180. }
  181. // Assume the next field is the status field
  182. STREAM_TO_UINT8(status, stream);
  183. if (status != HCI_SUCCESS) {
  184. return NULL;
  185. }
  186. return stream;
  187. }
  188. static const hci_packet_parser_t interface = {
  189. parse_generic_command_complete,
  190. parse_read_buffer_size_response,
  191. parse_read_local_version_info_response,
  192. parse_read_bd_addr_response,
  193. parse_read_local_supported_commands_response,
  194. parse_read_local_extended_features_response,
  195. parse_ble_read_white_list_size_response,
  196. parse_ble_read_buffer_size_response,
  197. parse_ble_read_supported_states_response,
  198. parse_ble_read_local_supported_features_response,
  199. parse_ble_read_resolving_list_size_response,
  200. parse_ble_read_suggested_default_data_length_response
  201. };
  202. const hci_packet_parser_t *hci_packet_parser_get_interface(void)
  203. {
  204. return &interface;
  205. }