Skip to content
Snippets Groups Projects
Commit ef0cc88d authored by Ying Hsu's avatar Ying Hsu
Browse files

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
parent 626519f8
No related branches found
No related tags found
No related merge requests found
......@@ -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 }
}
}
......@@ -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]);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment