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

Commit f049f4c2 authored by Chris Manton's avatar Chris Manton
Browse files

Introduce stack/acl::PeerPacketTypes

Bug: 182370398
Test: gd/cert/run
Tag: #refactor
BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: I5034f21c30f3e8217b0b6d82e588560e0f5cdd7a
parent 65e62735
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -716,6 +716,7 @@ cc_test {
        "btm/btm_sec.cc",
        "metrics/stack_metrics_logging.cc",
        "test/btm/stack_btm_test.cc",
        "test/btm/peer_packet_types_test.cc",
        "test/common/mock_bta_dm_act.cc",
        "test/common/mock_bta_sys_conn.cc",
        "test/common/mock_btif_bqr.cc",
+71 −0
Original line number Diff line number Diff line
/*
 * Copyright 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "stack/include/bt_types.h"
#include "stack/include/hcidefs.h"

/**
 * Create a bitmask of packet types from the remote feature
 */
class PeerPacketTypes {
 public:
  struct {
    uint16_t supported{0};
    uint16_t unsupported{0};
  } acl, sco;

  PeerPacketTypes(const BD_FEATURES& features) {
    /* 3 and 5 slot packets? */
    if (HCI_3_SLOT_PACKETS_SUPPORTED(features))
      acl.supported |= (HCI_PKT_TYPES_MASK_DH3 | HCI_PKT_TYPES_MASK_DM3);

    if (HCI_5_SLOT_PACKETS_SUPPORTED(features))
      acl.supported |= HCI_PKT_TYPES_MASK_DH5 | HCI_PKT_TYPES_MASK_DM5;

    /* 2 and 3 MPS support? */
    if (!HCI_EDR_ACL_2MPS_SUPPORTED(features))
      /* Not supported. Add 'not_supported' mask for all 2MPS packet types */
      acl.unsupported |=
          (HCI_PKT_TYPES_MASK_NO_2_DH1 | HCI_PKT_TYPES_MASK_NO_2_DH3 |
           HCI_PKT_TYPES_MASK_NO_2_DH5);

    if (!HCI_EDR_ACL_3MPS_SUPPORTED(features))
      /* Not supported. Add 'not_supported' mask for all 3MPS packet types */
      acl.unsupported |=
          (HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 |
           HCI_PKT_TYPES_MASK_NO_3_DH5);

    /* EDR 3 and 5 slot support? */
    if (HCI_EDR_ACL_2MPS_SUPPORTED(features) ||
        HCI_EDR_ACL_3MPS_SUPPORTED(features)) {
      if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(features))
        /* Not supported. Add 'not_supported' mask for all 3-slot EDR packet
         * types
         */
        acl.unsupported |=
            (HCI_PKT_TYPES_MASK_NO_2_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH3);

      if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(features))
        /* Not supported. Add 'not_supported' mask for all 5-slot EDR packet
         * types
         */
        acl.unsupported |=
            (HCI_PKT_TYPES_MASK_NO_2_DH5 | HCI_PKT_TYPES_MASK_NO_3_DH5);
    }
  }
};
+86 −0
Original line number Diff line number Diff line
/*
 *
 *  Copyright 2021 The Android Open Source Project
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <map>

#include "stack/acl/peer_packet_types.h"
#include "stack/include/bt_types.h"

namespace {

using testing::_;
using testing::DoAll;
using testing::NotNull;
using testing::Pointee;
using testing::Return;
using testing::SaveArg;
using testing::SaveArgPointee;
using testing::StrEq;
using testing::StrictMock;
using testing::Test;

class PeerPacketTest : public Test {
 public:
 protected:
  void SetUp() override {}
  void TearDown() override {}
};

TEST_F(PeerPacketTest, all_ones) {
  const BD_FEATURES bd_features = {0xff, 0xff, 0xff, 0xff,
                                   0xff, 0xff, 0xff, 0xff};
  PeerPacketTypes peer_packet_types(bd_features);
  ASSERT_EQ(peer_packet_types.acl.supported, 0xcc00);
  ASSERT_EQ(peer_packet_types.acl.unsupported, 0x0);
}

TEST_F(PeerPacketTest, 3SLOT_DH3_DM3) {
  const BD_FEATURES bd_features = {0x01, 0x00, 0x00, 0x00,
                                   0x00, 0x00, 0x00, 0x00};
  PeerPacketTypes peer_packet_types(bd_features);
  ASSERT_EQ(peer_packet_types.acl.supported, 0x0c00);
  ASSERT_EQ(peer_packet_types.acl.unsupported, 0x3306);
}

TEST_F(PeerPacketTest, 5SLOT_DH5_DM5) {
  const BD_FEATURES bd_features = {0x02, 0x00, 0x00, 0x00,
                                   0x00, 0x00, 0x00, 0x00};
  PeerPacketTypes peer_packet_types(bd_features);
  ASSERT_EQ(peer_packet_types.acl.supported, 0xc000);
  ASSERT_EQ(peer_packet_types.acl.unsupported, 0x3306);
}

TEST_F(PeerPacketTest, 2Mb_support) {
  const BD_FEATURES bd_features = {0x00, 0x00, 0x00, 0x02,
                                   0x00, 0x00, 0x00, 0x00};
  PeerPacketTypes peer_packet_types(bd_features);
  ASSERT_EQ(peer_packet_types.acl.supported, 0x0000);
  ASSERT_EQ(peer_packet_types.acl.unsupported, 0x3304);
}

TEST_F(PeerPacketTest, 3Mb_support) {
  const BD_FEATURES bd_features = {0x00, 0x00, 0x00, 0x04,
                                   0x00, 0x00, 0x00, 0x00};
  PeerPacketTypes peer_packet_types(bd_features);
  ASSERT_EQ(peer_packet_types.acl.supported, 0x0000);
  ASSERT_EQ(peer_packet_types.acl.unsupported, 0x3302);
}

}  // namespace