From 6c91449fae66bb80d55bd4a06d93535e70707c73 Mon Sep 17 00:00:00 2001 From: Zach Johnson Date: Sun, 13 Dec 2020 17:14:27 -0800 Subject: [PATCH] rusty-gd: A bit more controller Bug: 171749953 Tag: #gd-refactor Test: gd/cert/run --rhost SimpleHalTest Change-Id: I999c43fdbb5bcbcbb005dece73192ec2300138d0 --- gd/packet/parser/struct_def.cc | 2 +- gd/rust/hci/src/controller.rs | 66 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/gd/packet/parser/struct_def.cc b/gd/packet/parser/struct_def.cc index baeaa5b06..8d9ed63f6 100644 --- a/gd/packet/parser/struct_def.cc +++ b/gd/packet/parser/struct_def.cc @@ -358,7 +358,7 @@ void StructDef::GenRustSizeField(std::ostream& s) const { } void StructDef::GenRustDeclarations(std::ostream& s) const { - s << "#[derive(Debug)] "; + s << "#[derive(Debug, Clone)] "; s << "pub struct " << name_ << "{"; // Generate struct fields diff --git a/gd/rust/hci/src/controller.rs b/gd/rust/hci/src/controller.rs index 84a7f6603..897eeb9a8 100644 --- a/gd/rust/hci/src/controller.rs +++ b/gd/rust/hci/src/controller.rs @@ -2,7 +2,10 @@ use crate::HciExports; use bt_packets::hci::{ - Enable, ErrorCode, LeSetEventMaskBuilder, SetEventMaskBuilder, WriteSimplePairingModeBuilder, WriteLeHostSupportBuilder + Enable, ErrorCode, LeSetEventMaskBuilder, LocalVersionInformation, ReadBufferSizeBuilder, + ReadLocalExtendedFeaturesBuilder, ReadLocalNameBuilder, ReadLocalSupportedCommandsBuilder, + ReadLocalVersionInformationBuilder, SetEventMaskBuilder, WriteLeHostSupportBuilder, + WriteSimplePairingModeBuilder, }; use gddi::{module, provides, Stoppable}; @@ -14,9 +17,12 @@ module! { } macro_rules! assert_success { - ($hci:ident.send($builder:expr)) => { - assert!($hci.send($builder).await.get_status() == ErrorCode::Success); - }; + ($hci:ident.send($builder:expr)) => {{ + let response = $hci.send($builder).await; + assert!(response.get_status() == ErrorCode::Success); + + response + }}; } #[provides] @@ -34,9 +40,57 @@ async fn provide_controller(mut hci: HciExports) -> ControllerExports { le_supported_host: Enable::Enabled })); - ControllerExports {} + let response = assert_success!(hci.send(ReadLocalNameBuilder {})); + let name = std::str::from_utf8(response.get_local_name()).unwrap(); + let name = name[0..name.find('\0').unwrap()].to_string(); + + let version_info = assert_success!(hci.send(ReadLocalVersionInformationBuilder {})) + .get_local_version_information() + .clone(); + + let supported_commands = assert_success!(hci.send(ReadLocalSupportedCommandsBuilder {})) + .get_supported_commands() + .clone(); + + let lmp_features = read_lmp_features(&mut hci).await; + + let buffer_size = assert_success!(hci.send(ReadBufferSizeBuilder {})); + + ControllerExports { + name, + version_info, + supported_commands, + lmp_features, + acl_buffer_length: buffer_size.get_acl_data_packet_length(), + acl_buffers: buffer_size.get_total_num_acl_data_packets(), + sco_buffer_length: buffer_size.get_synchronous_data_packet_length(), + sco_buffers: buffer_size.get_total_num_synchronous_data_packets(), + } +} + +async fn read_lmp_features(hci: &mut HciExports) -> Vec { + let mut features = Vec::new(); + let mut page_number: u8 = 0; + let mut max_page_number: u8 = 1; + while page_number < max_page_number { + let response = assert_success!(hci.send(ReadLocalExtendedFeaturesBuilder { page_number })); + max_page_number = response.get_maximum_page_number(); + features.push(response.get_extended_lmp_features()); + page_number += 1; + } + + features } /// Controller interface #[derive(Clone, Stoppable)] -pub struct ControllerExports {} +pub struct ControllerExports { + name: String, + version_info: LocalVersionInformation, + supported_commands: [u8; 64], + lmp_features: Vec, + acl_buffer_length: u16, + acl_buffers: u16, + sco_buffer_length: u8, + sco_buffers: u16, +} -- 2.11.0