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

Commit 517ea220 authored by Archie Pusaka's avatar Archie Pusaka Committed by Archie Pusaka
Browse files

floss: metrics: Port Allowlist from BlueZ

This is needed to filter out devices for privacy reasons.

Bug: 240782193
Tag: #floss
Test: None

BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: I4cb5ee1a5358fc8fe56b311e056c6db56a191e15
parent 5180e69e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
source_set("BluetoothMetricsSources_chromeos") {
  sources = [
    "chromeos/metrics.cc",
    "chromeos/metrics_allowlist.cc",
    "chromeos/metrics_event.cc",
  ]

+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <metrics/structured_events.h>

#include "common/time_util.h"
#include "gd/metrics/chromeos/metrics_allowlist.h"
#include "gd/metrics/chromeos/metrics_event.h"
#include "gd/metrics/utils.h"
#include "gd/os/log.h"
@@ -148,6 +149,13 @@ void LogMetricsDeviceInfoReport(
      product_id,
      version);

  if (!IsDeviceInfoInAllowlist(vendor_id_src, vendor_id, product_id)) {
    vendor_id_src = 0;
    vendor_id = 0;
    product_id = 0;
    version = 0;
  }

  ::metrics::structured::events::bluetooth::BluetoothDeviceInfoReport()
      .SetBootId(boot_id)
      .SetSystemTime(boot_time)
+340 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 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 "metrics_allowlist.h"

#include <cstdint>
#include <cstring>

namespace bluetooth {
namespace metrics {

namespace {

static constexpr int device_info_allow_list_sig[][2] = {
    /* Ericsson Technology Licensing */
    {0, 52},
    /* Motorola */
    {8, 11905},
    /* Qualcomm Technologies International, Ltd. (QTIL) */
    {10, 65535},
    /* Texas Instruments Inc. */
    {13, 0},
    /* Broadcom Corporation. */
    {15, 4608},
    /* Qualcomm */
    {29, 4608},
    /* Integrated System Solution Corp. */
    {57, 5028},
    {57, 5506},
    /* MediaTek, Inc. */
    {70, 4608},
    /* Apple, Inc. */
    {76, 8194},
    {76, 8198},
    {76, 8201},
    {76, 8203},
    {76, 8204},
    {76, 8206},
    {76, 8207},
    {76, 8208},
    {76, 8211},
    /* Harman International Industries, Inc. */
    {87, 35},
    {87, 7977},
    /* Realtek Semiconductor Corporation */
    {93, 8763},
    /* Samsung Electronics Co. Ltd. */
    {117, 256},
    {117, 40977},
    {117, 40978},
    {117, 40979},
    /* Airoha Technology Corp. */
    {148, 4},
    {148, 291},
    /* LG Electronics​ */
    {196, 5025},
    /* Google */
    {224, 0},
    {224, 4608},
    {224, 12288},
    {224, 12289},
    {224, 12290},
    {224, 12291},
    {224, 12292},
    {224, 12544},
    {224, 50181},
    /* Amazon.com Services, LLC */
    {369, 384},
    /* Bestechnic(Shanghai),Ltd */
    {688, 0},
    /* LEGO System A/S */
    {919, 1},
    /* Actions (Zhuhai) Technology Co., Limited */
    {992, 12298},
    /* STABILO International */
    {1256, 32896},
    /* GoerTek Dynaudio Co., Ltd. */
    {1452, 544},
    /* Zhuhai Jieli technology Co.,Ltd */
    {1494, 10}};

static constexpr int device_info_allow_list_usb[][2] = {
    /* Unknown */
    {14, 13330},
    /* Unknown */
    {97, 1},
    /* Unknown  */
    {125, 628},
    /* HP, Inc */
    {1008, 2124},
    {1008, 588},
    /* Unknown  */
    {1014, 40961},
    /* Microsoft Corp. */
    {1118, 736},
    {1118, 765},
    {1118, 1954},
    {1118, 2053},
    {1118, 2054},
    {1118, 2087},
    {1118, 2095},
    {1118, 2326},
    {1118, 2354},
    {1118, 2397},
    {1118, 2835},
    {1118, 2848},
    /* Primax Electronics, Ltd */
    {1121, 20206},
    {1121, 20207},
    /* Logitech, Inc. */
    {1133, 45072},
    {1133, 45076},
    {1133, 45077},
    {1133, 45078},
    {1133, 45081},
    {1133, 45082},
    {1133, 45083},
    {1133, 45089},
    {1133, 45091},
    {1133, 45093},
    {1133, 45094},
    {1133, 45095},
    {1133, 45883},
    {1133, 45885},
    {1133, 45890},
    {1133, 45901},
    {1133, 45915},
    {1133, 45917},
    {1133, 45890},
    /* Samsung Electronics Co., Ltd */
    {1256, 28705},
    /* Sony Corp. */
    {1356, 1476},
    {1356, 2508},
    {1356, 3302},
    /* Wacom Co., Ltd */
    {1386, 887},
    /* Nintendo Co., Ltd */
    {1406, 8198},
    {1406, 8199},
    {1406, 8201},
    /* Apple, Inc. */
    {1452, 544},
    {1452, 556},
    {1452, 569},
    {1452, 591},
    {1452, 597},
    {1452, 781},
    {1452, 12850},
    /* Zippy Technology Corp. */
    {2458, 1280},
    /* Broadcom Corp. */
    {2652, 1},
    {2652, 17667},
    {2652, 63369},
    /* Microdia */
    {3141, 32270},
    /* Focusrite-Novation */
    {4661, 43554},
    /* Razer USA, Ltd */
    {5426, 130},
    /* Nordic Semiconductor ASA */
    {6421, 64},
    /* Lab126, Inc. */
    {6473, 1026},
    /* Anker Innovations Limited */
    {10522, 34050},
    /* Unknown */
    {12994, 1},
    /* Fuji Yusoki Kogyo Co., Ltd. */
    {44580, 34328},

};

enum Transport {
  USB = 1,
  UART = 2,
  SDIO = 3,
};

/* Below chipset info allowlists are generated by the script:
 * go/cros-chipset-allowlist-generator
 * and feeds with the data in tsv format
 * go/cros-chipset-info-0512
 */
static constexpr int chipset_info_allow_list_vidpid[][3] = {
    /* Intel */
    {USB, 0x8086, 0x095a},  // INTEL-AC7265
    {USB, 0x8086, 0x31dc},  // INTEL-AC9560
    {USB, 0x8086, 0x4df0},  // INTEL-AX201
    {USB, 0x8086, 0x095b},  // INTEL-AC7265
    {USB, 0x8086, 0x02f0},  // INTEL-AX201
    {USB, 0x8086, 0x51f0},
    {USB, 0x8086, 0xa0f0},  // INTEL-AX201
    {USB, 0x8086, 0x2526},  // INTEL-AC9260
    {USB, 0x8086, 0x3165},
    {USB, 0x8086, 0x2723},  // INTEL-AX200
    {USB, 0x8086, 0x08b1},  // INTEL-AC7260
    {USB, 0x8086, 0x24fd},
    {USB, 0x8086, 0x9df0},  // INTEL-AC9560
    {USB, 0x8086, 0x08b3},
    {USB, 0x8086, 0x24fb},
    {USB, 0x8086, 0x3166},
    {USB, 0x8086, 0x24f3},
    {USB, 0x8086, 0x08b2},  // INTEL-AC7260
    {USB, 0x8086, 0x08b4},
    {USB, 0x8086, 0x0887},
    {USB, 0x8086, 0x4232},
    {USB, 0x8086, 0x088e},
    {USB, 0x8086, 0x0085},
    {USB, 0x8086, 0x0082},
    {USB, 0x8086, 0x4239},
    {USB, 0x8086, 0x4238},
    {USB, 0x8086, 0x4222},
    {USB, 0x8086, 0x008a},
    {USB, 0x8086, 0xa370},
    {USB, 0x8086, 0x54f0},
    {USB, 0x8086, 0x422c},
    {USB, 0x8086, 0x4237},
    {USB, 0x8086, 0x4229},
    /* Qualcomm */
    {USB, 0x168c, 0x003e},   // QCA-6174A-5
    {UART, 0x0271, 0x050a},  // QCA-6174A-3
    {USB, 0x168c, 0x0042},
    {USB, 0x168c, 0x0036},
    {USB, 0x168c, 0x0032},
    {USB, 0x168c, 0x002b},
    {USB, 0x168c, 0x0034},
    {USB, 0x168c, 0x002a},
    {USB, 0x168c, 0x0030},
    /* Realtek */
    {USB, 0x10ec, 0xc822},  // Realtek-RTL8822C-USB
    {USB, 0x10ec, 0xb723},
    {USB, 0x10ec, 0xc821},
    {USB, 0x10ec, 0x8821},
    {USB, 0x10ec, 0xb822},
    {USB, 0x10ec, 0x8852},  // Realtek-RTL8852A-USB
    {USB, 0x10ec, 0x8723},
    {USB, 0x10ec, 0x8176},
    {UART, 0x10ec, 0xc822},  // Realtek-RTL8822C-UART
    {USB, 0x10ec, 0xc82f},
    /* Marvell */
    {SDIO, 0x02df, 0x912d},  // MVL-8897
    {USB, 0x1b4b, 0x2b42},   // MVL-8997
    /* Unknown */
    {USB, 0x14e4, 0x4365},
    {USB, 0x14e4, 0x43a0},
    {USB, 0x1814, 0x3090},
    /* MediaTek */
    {USB, 0x14c3, 0x7961},   // Mediatek-MTK7921-USB
    {SDIO, 0x037a, 0x7901},  // Mediatek-MTK7921-SDIO
};

static constexpr struct chipstr_transport {
  int transport;
  uint64_t hash_value;
  const char* str;
} chipset_info_allow_list_str[] = {
    {USB, 0x676651522ac38489ULL, "usb:v8087p0AAAd0002dcE0dsc01dp01icE0isc01ip01in00"},
    {UART, 0x0f7029c4e4bee5c2ULL, "of:NbluetoothT(null)Cqcom,wcn3991-bt"},
    {USB, 0xc87adddb3473cef2ULL, "usb:v8087p0033d0000dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xd4af1ceff203aa54ULL, "usb:v8087p0A2Ad0003dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x67ff2e0860c6088cULL, "usb:v8087p0026d0002dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x5ea49b43333b6757ULL, "usb:v0BDApB009d0200dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xae4252633a7fc378ULL, "usb:v0A12p0001d8891dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xe8b1d7dcab4a9180ULL, "usb:v05ACp821Fd0156dcFFdsc01dp01icFFisc01ip01in00"},
    {USB, 0xf2fc524b34906492ULL, "usb:v413Cp8160d0173dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xa16695ffe3ebcf8eULL, "usb:v0BDApB00Cd0000dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x45fa5f31f455c161ULL, "usb:v05ACp821Ad0042dcFFdsc01dp01icFFisc01ip01in00"},
    {USB, 0xed0707b5f055458dULL, "usb:v05ACp821Dd0156dcFFdsc01dp01icFFisc01ip01in00"},
    {UART, 0x645c8874e1a27038ULL, "of:NbluetoothT(null)Cqcom,wcn6750-bt"},
    {USB, 0xf8feae883f843f61ULL, "usb:v0A5Cp21BCd0761dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x3db1b39b76523e6fULL, "usb:v0A5Cp219Cd0628dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xa4fec7094cdb7bedULL, "usb:v05ACp8205d1965dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x952ae80214a19dd9ULL, "usb:v05ACp828Ad0150dcFFdsc01dp01icFFisc01ip01in00"},
    {USB, 0x40e84e9cf6844c32ULL, "usb:v8087p0025d0002dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0x6b037999f75bc6ceULL, "usb:v0A5Cp21F1d0112dcFFdsc01dp01icFFisc01ip01in00"},
    {USB, 0x91be30aba4f17b7eULL, "usb:v8087p0A2Ad0001dcE0dsc01dp01icE0isc01ip01in00"},
    {USB, 0xd393d6690ca2c212ULL, "usb:v0BDApB720d0200dcEFdsc02dp01icE0isc01ip01in00"},
};

}  // namespace

bool IsDeviceInfoInAllowlist(int vendor_id_source, int vendor_id, int product_id) {
  if (vendor_id_source == 1) {
    for (int i = 0; i < sizeof(device_info_allow_list_sig) / sizeof(device_info_allow_list_sig[0]); i++) {
      if (vendor_id == device_info_allow_list_sig[i][0] && product_id == device_info_allow_list_sig[i][1]) {
        return true;
      }
    }
  } else if (vendor_id_source == 2) {
    for (int i = 0; i < sizeof(device_info_allow_list_usb) / sizeof(device_info_allow_list_usb[0]); i++) {
      if (vendor_id == device_info_allow_list_usb[i][0] && product_id == device_info_allow_list_usb[i][1]) {
        return true;
      }
    }
  }

  return false;
}

bool IsChipsetInfoInAllowList(
    int vendor_id, int product_id, int transport, const char* chipset_string, uint64_t* hval) {
  if (vendor_id != 0 && product_id != 0) {
    for (int i = 0; i < sizeof(chipset_info_allow_list_vidpid) / sizeof(chipset_info_allow_list_vidpid[0]); i++) {
      const int* record = chipset_info_allow_list_vidpid[i];

      if (transport == record[0] && vendor_id == record[1] && product_id == record[2]) {
        return true;
      }
    }
  } else if (!!chipset_string && !!strlen(chipset_string)) {
    for (int i = 0; i < sizeof(chipset_info_allow_list_str) / sizeof(chipset_info_allow_list_str[0]); i++) {
      const struct chipstr_transport* record = &chipset_info_allow_list_str[i];

      if (strcmp(chipset_string, record->str) == 0 && transport == record->transport) {
        *hval = record->hash_value;
        return true;
      }
    }
  }

  return false;
}

}  // namespace metrics
}  // namespace bluetooth
 No newline at end of file
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 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 <cstdint>

namespace bluetooth {
namespace metrics {

bool IsDeviceInfoInAllowlist(int vendor_id_source, int vendor_id, int product_id);
bool IsChipsetInfoInAllowList(int vendor_id, int product_id, int transport, const char* chipset_string, uint64_t* hval);

}  // namespace metrics
}  // namespace bluetooth
 No newline at end of file