File: bluetooth_gatt_characteristic_floss.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (158 lines) | stat: -rw-r--r-- 6,368 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "device/bluetooth/floss/bluetooth_gatt_characteristic_floss.h"

#include "device/bluetooth/floss/floss_gatt_manager_client.h"

namespace {

using FlossCharacteristic = floss::GattCharacteristic;

constexpr std::pair<FlossCharacteristic::Permission,
                    device::BluetoothGattCharacteristic::Permission>
    kPermissionMapping[] = {
        {FlossCharacteristic::GATT_PERM_READ,
         device::BluetoothGattCharacteristic::PERMISSION_READ},
        {FlossCharacteristic::GATT_PERM_READ_ENCRYPTED,
         device::BluetoothGattCharacteristic::PERMISSION_READ_ENCRYPTED},
        {FlossCharacteristic::GATT_PERM_READ_ENC_MITM,
         device::BluetoothGattCharacteristic::
             PERMISSION_READ_ENCRYPTED_AUTHENTICATED},
        {FlossCharacteristic::GATT_PERM_WRITE,
         device::BluetoothGattCharacteristic::PERMISSION_WRITE},
        {FlossCharacteristic::GATT_PERM_WRITE_ENCRYPTED,
         device::BluetoothGattCharacteristic::PERMISSION_WRITE_ENCRYPTED},
        {FlossCharacteristic::GATT_PERM_WRITE_ENC_MITM,
         device::BluetoothGattCharacteristic::
             PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED},
        {FlossCharacteristic::GATT_PERM_WRITE_SIGNED_MITM,
         device::BluetoothGattCharacteristic::
             PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED},
};
constexpr std::pair<FlossCharacteristic::Property,
                    device::BluetoothGattCharacteristic::Properties>
    kPropertyMapping[] = {
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_BROADCAST,
         device::BluetoothGattCharacteristic::PROPERTY_BROADCAST},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_READ,
         device::BluetoothGattCharacteristic::PROPERTY_READ},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_WRITE_NR,
         device::BluetoothGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_WRITE,
         device::BluetoothGattCharacteristic::PROPERTY_WRITE},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_NOTIFY,
         device::BluetoothGattCharacteristic::PROPERTY_NOTIFY},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_INDICATE,
         device::BluetoothGattCharacteristic::PROPERTY_INDICATE},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_AUTH,
         device::BluetoothGattCharacteristic::
             PROPERTY_AUTHENTICATED_SIGNED_WRITES},
        {FlossCharacteristic::GATT_CHAR_PROP_BIT_EXT_PROP,
         device::BluetoothGattCharacteristic::PROPERTY_EXTENDED_PROPERTIES},
};

device::BluetoothGattCharacteristic::Permissions ConvertPermissionsFromFloss(
    const uint16_t permissions) {
  device::BluetoothGattCharacteristic::Permissions result =
      device::BluetoothGattCharacteristic::PERMISSION_NONE;

  for (const auto& permission_pair : kPermissionMapping) {
    if (permissions & permission_pair.first) {
      result |= permission_pair.second;
    }
  }
  return result;
}

FlossCharacteristic::Permission ConvertPermissionsToFloss(
    const device::BluetoothGattCharacteristic::Permissions permissions) {
  uint16_t result = 0;
  for (const auto& permission_pair : kPermissionMapping) {
    if (permissions & permission_pair.second) {
      result |= permission_pair.first;
    }
  }

  return static_cast<FlossCharacteristic::Permission>(result);
}

device::BluetoothGattCharacteristic::Properties ConvertPropertiesFromFloss(
    const uint8_t properties) {
  device::BluetoothGattCharacteristic::Properties result =
      device::BluetoothGattCharacteristic::PROPERTY_NONE;

  for (const auto& property_pair : kPropertyMapping) {
    if (properties & property_pair.first) {
      result |= property_pair.second;
    }
  }
  return result;
}

FlossCharacteristic::Property ConvertPropertiesToFloss(
    const device::BluetoothGattCharacteristic::Properties properties) {
  uint8_t result = 0;
  for (const auto& property_pair : kPropertyMapping) {
    if (properties & property_pair.second) {
      result |= property_pair.first;
    }
  }
  return static_cast<FlossCharacteristic::Property>(result);
}

}  // namespace

namespace floss {

BluetoothGattCharacteristicFloss::BluetoothGattCharacteristicFloss() = default;
BluetoothGattCharacteristicFloss::~BluetoothGattCharacteristicFloss() = default;

std::pair<device::BluetoothGattCharacteristic::Properties,
          device::BluetoothGattCharacteristic::Permissions>
BluetoothGattCharacteristicFloss::ConvertPropsAndPermsFromFloss(
    const uint8_t properties,
    const uint16_t permissions) {
  device::BluetoothGattCharacteristic::Permissions out_permissions =
      ConvertPermissionsFromFloss(permissions);
  device::BluetoothGattCharacteristic::Properties out_properties =
      ConvertPropertiesFromFloss(properties);

  // We also need to generate some properties from permissions. The spec only
  // defines 8 bits for properties but device::Bluetooth has more internally.

  if (permissions & FlossCharacteristic::GATT_PERM_READ_ENC_MITM) {
    out_properties |= PROPERTY_READ_ENCRYPTED_AUTHENTICATED;
  } else if (permissions & FlossCharacteristic::GATT_PERM_READ_ENCRYPTED) {
    out_properties |= PROPERTY_READ_ENCRYPTED;
  }

  if (permissions & FlossCharacteristic::GATT_PERM_WRITE_ENC_MITM) {
    out_properties |= PROPERTY_WRITE_ENCRYPTED_AUTHENTICATED;
  } else if (permissions & FlossCharacteristic::GATT_PERM_WRITE_ENCRYPTED) {
    out_properties |= PROPERTY_WRITE_ENCRYPTED;
  }

  // Either signed permission results in signed writes.
  if (permissions & FlossCharacteristic::GATT_PERM_WRITE_SIGNED ||
      permissions & FlossCharacteristic::GATT_PERM_WRITE_SIGNED_MITM) {
    out_properties |= PROPERTY_AUTHENTICATED_SIGNED_WRITES;
  }

  return std::make_pair(out_properties, out_permissions);
}

std::pair<uint8_t, uint16_t>
BluetoothGattCharacteristicFloss::ConvertPropsAndPermsToFloss(
    device::BluetoothGattCharacteristic::Properties properties,
    device::BluetoothGattCharacteristic::Permissions permissions) {
  uint16_t out_permissions =
      static_cast<uint16_t>(ConvertPermissionsToFloss(permissions));
  uint8_t out_properties =
      static_cast<uint8_t>(ConvertPropertiesToFloss(properties));

  return std::make_pair(out_properties, out_permissions);
}

}  // namespace floss