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

Commit f6ebfd4a authored by Zach Johnson's avatar Zach Johnson
Browse files

rusty-gd: report acl disconnections

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost
Change-Id: Ia202284ea8a7267c0307ae9290f10154dbd3c353
parent dfb6881c
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -5,8 +5,8 @@ mod fragment;
use bt_common::Bluetooth::{self, Classic, Le};
use bt_hal::AclHal;
use bt_hci::{ControllerExports, EventRegistry};
use bt_packets::hci::EventChild::NumberOfCompletedPackets;
use bt_packets::hci::{AclPacket, EventCode};
use bt_packets::hci::EventChild::{DisconnectionComplete, NumberOfCompletedPackets};
use bt_packets::hci::{AclPacket, ErrorCode, EventCode};
use bytes::Bytes;
use fragment::{fragmenting_stream, Reassembler};
use futures::stream::{SelectAll, StreamExt};
@@ -33,12 +33,14 @@ pub struct Connection {
    tx: Sender<Bytes>,
    handle: u16,
    requests: Sender<Request>,
    evt_rx: Receiver<Event>,
}

struct ConnectionInternal {
    reassembler: Reassembler,
    bt: Bluetooth,
    close_tx: oneshot::Sender<()>,
    evt_tx: Sender<Event>,
}

impl Connection {
@@ -53,6 +55,13 @@ impl Connection {
    }
}

/// Events that can be generated by the underlying layer
#[derive(Debug)]
pub enum Event {
    /// Underlying connection was closed. Reports reason why.
    Closed(ErrorCode),
}

/// Manages rx and tx for open ACL connections
#[derive(Clone, Stoppable)]
pub struct AclDispatch {
@@ -110,7 +119,8 @@ async fn provide_acl_dispatch(
        let mut le_credits: u16 = controller.le_buffers.into();

        let (evt_tx, mut evt_rx) = channel(3);
        events.register(EventCode::NumberOfCompletedPackets, evt_tx).await;
        events.register(EventCode::NumberOfCompletedPackets, evt_tx.clone()).await;
        events.register(EventCode::DisconnectionComplete, evt_tx).await;

        loop {
            select! {
@@ -119,6 +129,7 @@ async fn provide_acl_dispatch(
                        Request::Register(req) => {
                            let (out_tx, out_rx) = channel(10);
                            let (in_tx, in_rx) = channel(10);
                            let (evt_tx, evt_rx) = channel(3);
                            let (close_tx, close_rx) = oneshot::channel();

                            assert!(connections.insert(
@@ -127,6 +138,7 @@ async fn provide_acl_dispatch(
                                    reassembler: Reassembler::new(out_tx),
                                    bt: req.bt,
                                    close_tx,
                                    evt_tx,
                                }).is_none());

                            match req.bt {
@@ -144,7 +156,8 @@ async fn provide_acl_dispatch(
                                rx: out_rx,
                                tx: in_tx,
                                handle: req.handle,
                                requests: req_tx_clone.clone()}).unwrap();
                                requests: req_tx_clone.clone(),
                                evt_rx}).unwrap();
                        },
                        Request::Unregister(req) => {
                            if let Some(connection) = connections.remove(&req.handle) {
@@ -190,6 +203,12 @@ async fn provide_acl_dispatch(
                                }
                            }
                        },
                        DisconnectionComplete(evt) => {
                            if let Some(connection) = connections.remove(&evt.get_connection_handle()) {
                                connection.close_tx.send(()).unwrap();
                                connection.evt_tx.send(Event::Closed(evt.get_reason())).await.unwrap();
                            }
                        },
                        _ => unimplemented!(),
                    }
                },