VirtMgr: Check Sk is declared before fetching it.
If the service is not declared at all, getSecretkeeper() should return
None immediately instead of requesting for the service & waiting for the
call to timeout.
Bug: 291213394
Test: Check bootime using MicrodroidBenchmarks#testMicrodroidBootTime
Change-Id: I0606f315bb74b0c925a91be916188888bb20036e
diff --git a/virtualizationmanager/src/aidl.rs b/virtualizationmanager/src/aidl.rs
index d775555..12b8f88 100644
--- a/virtualizationmanager/src/aidl.rs
+++ b/virtualizationmanager/src/aidl.rs
@@ -1392,17 +1392,12 @@
}
fn getSecretkeeper(&self) -> binder::Result<Option<Strong<dyn ISecretkeeper>>> {
- let sk = match binder::get_interface(SECRETKEEPER_IDENTIFIER) {
- Ok(sk) => {
- Some(BnSecretkeeper::new_binder(SecretkeeperProxy(sk), BinderFeatures::default()))
- }
- Err(StatusCode::NAME_NOT_FOUND) => None,
- Err(e) => {
- error!("unexpected error while fetching connection to Secretkeeper {:?}", e);
- return Err(e.into());
- }
+ let sk = if is_secretkeeper_present() {
+ Some(binder::wait_for_interface(SECRETKEEPER_IDENTIFIER)?)
+ } else {
+ None
};
- Ok(sk)
+ Ok(sk.map(|s| BnSecretkeeper::new_binder(SecretkeeperProxy(s), BinderFeatures::default())))
}
fn requestAttestation(&self, csr: &[u8]) -> binder::Result<Vec<Certificate>> {
@@ -1410,6 +1405,11 @@
}
}
+fn is_secretkeeper_present() -> bool {
+ binder::is_declared(SECRETKEEPER_IDENTIFIER)
+ .expect("Could not check for declared Secretkeeper interface")
+}
+
impl VirtualMachineService {
fn new_binder(state: Arc<Mutex<State>>, cid: Cid) -> Strong<dyn IVirtualMachineService> {
BnVirtualMachineService::new_binder(