OSDN Git Service

rusty-gd: some fixes to handle errors & get it somewhat working
authorZach Johnson <zachoverflow@google.com>
Mon, 8 Feb 2021 22:56:53 +0000 (14:56 -0800)
committerZach Johnson <zachoverflow@google.com>
Mon, 8 Feb 2021 22:58:17 +0000 (14:58 -0800)
still failing to parse an incoming event

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost DirectHciTest
Change-Id: I4496bf97eaa4903d539e80d604b0bd51d1b3dbc5

gd/packet/parser/gen_rust.cc
gd/packet/parser/packet_def.cc
gd/rust/hal/src/hidl_hal.rs
gd/rust/shim/src/hci.rs
main/shim/hci_layer.cc

index 0c8ca3e..2773e9b 100644 (file)
@@ -34,7 +34,12 @@ type Result<T> = std::result::Result<T, Error>;
 #[derive(Debug, Error)]
 pub enum Error {
   #[error("Packet parsing failed")]
-  InvalidPacketError
+  InvalidPacketError,
+  #[error("{field} was {value:x}, which is not known")]
+  ConstraintOutOfBounds {
+    field: String,
+    value: u64,
+  },
 }
 
 pub trait Packet {
index 3d97961..b51c2db 100644 (file)
@@ -964,7 +964,8 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
     }
 
     if (!constrained_descendants.empty()) {
-      s << "_ => panic!(\"unexpected value " << "\"),";
+      s << "v => return Err(Error::ConstraintOutOfBounds{field: \"" << constraint_name
+        << "\".to_string(), value: v as u64}),";
     }
 
     s << "};\n";
index c5eb838..b391308 100644 (file)
@@ -64,13 +64,20 @@ fn on_init_complete() {
 }
 
 fn on_event(data: &[u8]) {
+    log::error!("got event: {:02x?}", data);
     let callbacks = CALLBACKS.lock().unwrap();
-    callbacks.as_ref().unwrap().evt_tx.send(EventPacket::parse(data).unwrap()).unwrap();
+    match EventPacket::parse(data) {
+        Ok(p) => callbacks.as_ref().unwrap().evt_tx.send(p).unwrap(),
+        Err(e) => log::error!("failure to parse event: {:?} data: {:02x?}", e, data),
+    }
 }
 
 fn on_acl(data: &[u8]) {
     let callbacks = CALLBACKS.lock().unwrap();
-    callbacks.as_ref().unwrap().acl_tx.send(AclPacket::parse(data).unwrap()).unwrap();
+    match AclPacket::parse(data) {
+        Ok(p) => callbacks.as_ref().unwrap().acl_tx.send(p).unwrap(),
+        Err(e) => log::error!("failure to parse incoming ACL: {:?} data: {:02x?}", e, data),
+    }
 }
 
 fn on_sco(_data: &[u8]) {}
index f7e255f..dab3b49 100644 (file)
@@ -62,16 +62,24 @@ pub fn hci_send_command(
     data: &[u8],
     callback: cxx::UniquePtr<ffi::u8SliceOnceCallback>,
 ) {
-    let packet = CommandPacket::parse(data).unwrap();
-    let mut commands = hci.internal.commands.clone();
-    hci.rt.spawn(async move {
-        let resp = commands.send(packet).await.unwrap();
-        callback.Run(&resp.to_bytes());
-    });
+    log::error!("sending command: {:02x?}", data);
+    match CommandPacket::parse(data) {
+        Ok(packet) => {
+            let mut commands = hci.internal.commands.clone();
+            hci.rt.spawn(async move {
+                let resp = commands.send(packet).await.unwrap();
+                callback.Run(&resp.to_bytes());
+            });
+        }
+        Err(e) => panic!("could not parse command: {:?} {:02x?}", e, data),
+    }
 }
 
 pub fn hci_send_acl(hci: &mut Hci, data: &[u8]) {
-    hci.rt.block_on(hci.internal.acl_tx.send(AclPacket::parse(data).unwrap())).unwrap();
+    match AclPacket::parse(data) {
+        Ok(packet) => hci.rt.block_on(hci.internal.acl_tx.send(packet)).unwrap(),
+        Err(e) => panic!("could not parse acl: {:?} {:02x?}", e, data),
+    }
 }
 
 pub fn hci_register_event(hci: &mut Hci, event: u8) {
index 6408e7b..0745541 100644 (file)
@@ -558,11 +558,6 @@ static void transmit_command(BT_HDR* command,
 
   // little endian command opcode
   uint16_t command_op_code = (data[1] << 8 | data[0]);
-  // Gd stack API requires opcode specification and calculates length, so
-  // no need to provide opcode or length here.
-  data += (kCommandOpcodeSize + kCommandLengthSize);
-  len -= (kCommandOpcodeSize + kCommandLengthSize);
-
   auto op_code = static_cast<const bluetooth::hci::OpCode>(command_op_code);
 
   LOG_DEBUG("Sending command %s", bluetooth::hci::OpCodeText(op_code).c_str());