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

Commit e3cd08d9 authored by Josh Wu's avatar Josh Wu
Browse files

RootCanal: Move feature loader to features.rs

Tag: #refactor
Bug: 235777894
Test: atest liblmp_tests
Change-Id: Iab535d7cb16550cd3ee4350602d4e79d919225d4
parent a2c262dd
Loading
Loading
Loading
Loading
+1 −18
Original line number Diff line number Diff line
// Bluetooth Core, Vol 2, Part C, 4.2.1

use num_traits::ToPrimitive;

use crate::either::Either;
use crate::num_hci_command_packets;
use crate::packets::{hci, lmp};
@@ -10,21 +8,6 @@ use crate::procedure::legacy_pairing;
use crate::procedure::secure_simple_pairing;
use crate::procedure::Context;

async fn secure_simple_pairing_supported(ctx: &impl Context) -> bool {
    let ssp_bit = hci::LMPFeaturesPage1Bits::SecureSimplePairingHostSupport.to_u64().unwrap();
    let local_supported = ctx.extended_features(1) & ssp_bit != 0;
    // Lazy peer features
    let peer_supported = async move {
        let page = if let Some(page) = ctx.peer_extended_features(1) {
            page
        } else {
            features::initiate(ctx, 1).await
        };
        page & ssp_bit != 0
    };
    local_supported && peer_supported.await
}

pub async fn send_challenge(
    ctx: &impl Context,
    transaction_id: u8,
@@ -81,7 +64,7 @@ pub async fn initiate(ctx: &impl Context) {
                .build(),
            );

            let result = if secure_simple_pairing_supported(ctx).await {
            let result = if features::supported_on_both_page1(ctx, hci::LMPFeaturesPage1Bits::SecureSimplePairingHostSupport).await {
                secure_simple_pairing::initiate(ctx).await
            } else {
                legacy_pairing::initiate(ctx).await
+19 −0
Original line number Diff line number Diff line
@@ -33,3 +33,22 @@ pub async fn respond(ctx: &impl Context) {
        .build(),
    );
}

pub async fn supported_on_both_page1(
    ctx: &impl Context,
    feature: crate::packets::hci::LMPFeaturesPage1Bits,
) -> bool {
    use num_traits::ToPrimitive;
    let feature_mask = feature.to_u64().unwrap();
    let local_supported = ctx.extended_features(1) & feature_mask != 0;
    // Lazy peer features
    let peer_supported = async move {
        let page = if let Some(page) = ctx.peer_extended_features(1) {
            page
        } else {
            crate::procedure::features::initiate(ctx, 1).await
        };
        page & feature_mask != 0
    };
    local_supported && peer_supported.await
}