From ef0cc88d0d3b431b7c599a4b381e6dbe3469a08d Mon Sep 17 00:00:00 2001 From: Ying Hsu <yinghsu@google.com> Date: Fri, 4 Nov 2022 09:11:54 +0000 Subject: [PATCH] floss: Add advertise set-scan-rsp command `advertise set-scan-rsp <enable|disable>` enables or disables scan response data of active advertising sets. Bug: 233128828 Tag: #floss Test: build.py --target test Test: manual test with btclient Change-Id: I73efe1a9f506474120c97b9b2753d1d19b90fd4f --- system/gd/rust/linux/client/src/bt_adv.rs | 21 ++++++++-- .../rust/linux/client/src/command_handler.rs | 38 ++++++++++++++++++- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/system/gd/rust/linux/client/src/bt_adv.rs b/system/gd/rust/linux/client/src/bt_adv.rs index c55a3a29187..e36fff46bf5 100644 --- a/system/gd/rust/linux/client/src/bt_adv.rs +++ b/system/gd/rust/linux/client/src/bt_adv.rs @@ -15,6 +15,9 @@ pub(crate) struct AdvSet { /// Advertising data. pub(crate) data: AdvertiseData, + + /// Scan response data. + pub(crate) scan_rsp: AdvertiseData, } impl AdvSet { @@ -33,21 +36,31 @@ impl AdvSet { }; let data = AdvertiseData { + service_uuids: Vec::new(), + solicit_uuids: Vec::new(), + transport_discovery_data: Vec::new(), + manufacturer_data: HashMap::from([(0, vec![0, 1, 2])]), + service_data: HashMap::new(), + include_tx_power_level: true, + include_device_name: true, + }; + + let scan_rsp = AdvertiseData { service_uuids: vec![Uuid::from([ 0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb, ])], solicit_uuids: Vec::new(), transport_discovery_data: Vec::new(), - manufacturer_data: HashMap::from([(0, vec![0, 1, 2])]), + manufacturer_data: HashMap::new(), service_data: HashMap::from([( "0000fef3-0000-1000-8000-00805f9b34fb".to_string(), vec![0x0a, 0x0b], )]), - include_tx_power_level: true, - include_device_name: true, + include_tx_power_level: false, + include_device_name: false, }; - AdvSet { adv_id: None, params, data } + AdvSet { adv_id: None, params, data, scan_rsp } } } diff --git a/system/gd/rust/linux/client/src/command_handler.rs b/system/gd/rust/linux/client/src/command_handler.rs index b2536984acb..60b6358df34 100644 --- a/system/gd/rust/linux/client/src/command_handler.rs +++ b/system/gd/rust/linux/client/src/command_handler.rs @@ -164,7 +164,11 @@ fn build_commands() -> HashMap<String, CommandOption> { command_options.insert( String::from("advertise"), CommandOption { - rules: vec![String::from("advertise <on|off|set-interval>")], + rules: vec![ + String::from("advertise <on|off>"), + String::from("advertise set-interval <ms>"), + String::from("advertise set-scan-rsp <enable|disable>"), + ], description: String::from("Advertising utilities."), function_pointer: CommandHandler::cmd_advertise, }, @@ -947,7 +951,8 @@ impl CommandHandler { } let callback_id = self.context.lock().unwrap().advertiser_callback_id.clone().unwrap(); - enforce_arg_len(args, 1, "advertise <on|off|set-interval>", || match &args[0][0..] { + let cmd_usage = "advertise <on|off|set-interval|set-scan-rsp>"; + enforce_arg_len(args, 1, cmd_usage, || match &args[0][0..] { "on" => { let mut context = self.context.lock().unwrap(); @@ -1004,6 +1009,35 @@ impl CommandHandler { context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params); } } + "set-scan-rsp" => { + if args.len() < 2 { + println!("usage: advertise set-scan-rsp <enable|disable>"); + return; + } + let enable = match &args[1][0..] { + "enable" => true, + "disable" => false, + _ => false, + }; + + let mut context = self.context.lock().unwrap(); + context.adv_sets.iter_mut().for_each(|(_, s)| s.params.scannable = enable); + + let advs: Vec<(_, _, _)> = context + .adv_sets + .iter() + .filter_map(|(_, s)| { + s.adv_id + .map(|adv_id| (adv_id.clone(), s.params.clone(), s.scan_rsp.clone())) + }) + .collect(); + for (adv_id, params, scan_rsp) in advs { + print_info!("Setting scan response data for {}", adv_id); + context.gatt_dbus.as_mut().unwrap().set_scan_response_data(adv_id, scan_rsp); + print_info!("Setting parameters for {}", adv_id); + context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params); + } + } _ => { println!("Invalid argument '{}'", args[0]); } -- GitLab