Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b0a1c71 authored by Zach Johnson's avatar Zach Johnson
Browse files

rusty-gd: some fixes to handle errors & get it somewhat working

still failing to parse an incoming event

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost DirectHciTest
Change-Id: I4496bf97eaa4903d539e80d604b0bd51d1b3dbc5
parent fddfbdd9
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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 {
+2 −1
Original line number Diff line number Diff line
@@ -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";
+9 −2
Original line number Diff line number Diff line
@@ -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]) {}
+15 −7
Original line number Diff line number Diff line
@@ -62,16 +62,24 @@ pub fn hci_send_command(
    data: &[u8],
    callback: cxx::UniquePtr<ffi::u8SliceOnceCallback>,
) {
    let packet = CommandPacket::parse(data).unwrap();
    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) {
+0 −5
Original line number Diff line number Diff line
@@ -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());