1 /****************************************************************************** 2 * 3 * Copyright 2015 Google, Inc. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 #pragma once 20 21 #include "device/include/interop.h" 22 #include "raw_address.h" 23 24 typedef struct { 25 RawAddress addr; 26 size_t length; 27 interop_feature_t feature; 28 } interop_addr_entry_t; 29 30 static const interop_addr_entry_t interop_addr_database[] = { 31 // Nexus Remote (Spike) 32 // Note: May affect other Asus brand devices 33 {{{0x08, 0x62, 0x66, 0, 0, 0}}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 34 {{{0x38, 0x2c, 0x4a, 0xc9, 0, 0}}, 35 4, 36 INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 37 {{{0x38, 0x2c, 0x4a, 0xe6, 0, 0}}, 38 4, 39 INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 40 {{{0x54, 0xa0, 0x50, 0xd9, 0, 0}}, 41 4, 42 INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 43 {{{0xac, 0x9e, 0x17, 0, 0, 0}}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 44 {{{0xf0, 0x79, 0x59, 0, 0, 0}}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 45 46 {{{0x08, 0x62, 0x66, 0, 0, 0}}, 3, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 47 {{{0x38, 0x2c, 0x4a, 0xc9, 0, 0}}, 4, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 48 {{{0x38, 0x2c, 0x4a, 0xe6, 0, 0}}, 4, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 49 {{{0x54, 0xa0, 0x50, 0xd9, 0, 0}}, 4, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 50 {{{0xac, 0x9e, 0x17, 0, 0, 0}}, 3, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 51 {{{0xf0, 0x79, 0x59, 0, 0, 0}}, 3, INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S}, 52 53 // Ausdom M05 - unacceptably loud volume 54 {{{0xa0, 0xe9, 0xdb, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 55 56 // BMW car kits (Harman/Becker) 57 {{{0x9c, 0xdf, 0x03, 0, 0, 0}}, 3, INTEROP_AUTO_RETRY_PAIRING}, 58 59 // Flic smart button 60 {{{0x80, 0xe4, 0xda, 0x70, 0, 0}}, 61 4, 62 INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 63 64 // iKross IKBT83B HS - unacceptably loud volume 65 {{{0x00, 0x14, 0x02, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 66 67 // JayBird BlueBuds X - low granularity on volume control 68 {{{0x44, 0x5e, 0xf3, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 69 {{{0xd4, 0x9c, 0x28, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 70 71 // Bose QuiteComfort 35, SoundSport and similar (because of older firmware) 72 {{{0x04, 0x52, 0xc7, 0, 0, 0}}, 3, INTEROP_2MBPS_LINK_ONLY}, 73 74 // JayBird Family 75 {{{0x00, 0x18, 0x91, 0, 0, 0}}, 3, INTEROP_2MBPS_LINK_ONLY}, 76 77 // Sony MBH-10 78 {{{0x20, 0x15, 0x06, 0, 0, 0}}, 3, INTEROP_2MBPS_LINK_ONLY}, 79 80 // Uconnect 81 {{{0x00, 0x54, 0xaf, 0, 0, 0}}, 3, INTEROP_2MBPS_LINK_ONLY}, 82 {{{0x30, 0x14, 0x4a, 0, 0, 0}}, 3, INTEROP_2MBPS_LINK_ONLY}, 83 84 // LG Tone HBS-730 - unacceptably loud volume 85 {{{0x00, 0x18, 0x6b, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 86 {{{0xb8, 0xad, 0x3e, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 87 88 // LG Tone HV-800 - unacceptably loud volume 89 {{{0xa0, 0xe9, 0xdb, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 90 91 // Motorola Key Link 92 {{{0x1c, 0x96, 0x5a, 0, 0, 0}}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, 93 94 // Motorola Roadster 95 {{{0x00, 0x24, 0x1C, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 96 97 // Mpow Cheetah - unacceptably loud volume 98 {{{0x00, 0x11, 0xb1, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 99 100 // Nissan car kits (ALPS) - auto-pairing fails and rejects next pairing 101 {{{0x34, 0xc7, 0x31, 0, 0, 0}}, 3, INTEROP_DISABLE_AUTO_PAIRING}, 102 103 // SOL REPUBLIC Tracks Air - unable to adjust volume back off from max 104 {{{0xa4, 0x15, 0x66, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 105 106 // Subaru car kits (ALPS) - auto-pairing fails and rejects next pairing 107 {{{0x00, 0x07, 0x04, 0, 0, 0}}, 3, INTEROP_DISABLE_AUTO_PAIRING}, 108 {{{0xe0, 0x75, 0x0a, 0, 0, 0}}, 3, INTEROP_DISABLE_AUTO_PAIRING}, 109 110 // Swage Rokitboost HS - unacceptably loud volume 111 {{{0x00, 0x14, 0xf1, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 112 113 // VW Car Kit - not enough granularity with volume 114 {{{0x00, 0x26, 0x7e, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 115 {{{0x90, 0x03, 0xb7, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 116 117 // Unknown keyboard (carried over from auto_pair_devlist.conf) 118 {{{0x00, 0x0F, 0xF6, 0, 0, 0}}, 3, INTEROP_KEYBOARD_REQUIRES_FIXED_PIN}, 119 120 // Kenwood KMM-BT518HD - no audio when A2DP codec sample rate is changed 121 {{{0x00, 0x1d, 0x86, 0, 0, 0}}, 3, INTEROP_DISABLE_AVDTP_RECONFIGURE}, 122 // http://b/255387998 123 {{{0x00, 0x1d, 0x86, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 124 125 // NAC FORD-2013 - Lincoln 126 {{{0x00, 0x26, 0xb4, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 127 128 // Toyota Prius - 2015 129 {{{0xfc, 0xc2, 0xde, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 130 131 // Toyota Prius - b/231092023 132 {{{0x9c, 0xdf, 0x03, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 133 134 // OBU II Bluetooth dongle 135 {{{0x00, 0x04, 0x3e, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 136 137 // Visteon carkit 138 {{{0x00, 0x0a, 0x30, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 139 140 // Roman R9020 141 {{{0x00, 0x23, 0x01, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 142 143 // Jabra Storm 144 {{{0x1c, 0x48, 0xf9, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 145 146 // Jeep Uconnect 147 {{{0x00, 0x54, 0xaf, 0, 0, 0}}, 3, INTEROP_DISABLE_ROLE_SWITCH}, 148 149 // deepblue2 - cannot change smoothly the volume: b/37834035 150 {{{0x0c, 0xa6, 0x94, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 151 152 // AirPods 2 - unacceptably loud volume 153 {{{0x94, 0x16, 0x25, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 154 155 // AirPods 2 - unacceptably loud volume 156 {{{0x9c, 0x64, 0x8b, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, 157 158 // for skip name request, 159 // because BR/EDR address and ADV random address are the same 160 {{{0xd4, 0x7a, 0xe2, 0, 0, 0}}, 3, INTEROP_DISABLE_NAME_REQUEST}, 161 162 // SUBARU Carkit 163 {{{0x48, 0xf0, 0x7b, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 164 165 // Audi Carkit 166 {{{0x90, 0x03, 0xb7, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 167 {{{0x28, 0xA1, 0x83, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 168 169 // Lexus Carkit 170 {{{0x64, 0xd4, 0xbd, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 171 172 // Mazda Carkit 173 {{{0xfc, 0x35, 0xe6, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 174 175 // Toyota Car Audio 176 {{{0x00, 0x17, 0x53, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 177 178 // Honda High End Carkit 179 {{{0x9c, 0x8d, 0x7c, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 180 181 // Honda Civic Carkit 182 {{{0x0c, 0xd9, 0xc1, 0, 0, 0}}, 3, INTEROP_AVRCP_1_4_ONLY}, 183 184 // KDDI Carkit 185 {{{0x44, 0xea, 0xd8, 0, 0, 0}}, 3, INTEROP_DISABLE_SNIFF}, 186 187 // Toyota Camry 2018 Carkit HFP AT+BIND missing 188 {{{0x94, 0xb2, 0xcc, 0x30, 0, 0}}, 4, INTEROP_SLC_SKIP_BIND_COMMAND}, 189 190 // BMW Carkit 191 {{{0x00, 0x0a, 0x08, 0, 0, 0}}, 3, INTEROP_AVRCP_1_3_ONLY}, 192 193 // Harman/Becker Automotive Systems GmbH (BMW Carkit) - b/234548635 194 {{{0x9c, 0xdf, 0x03, 0, 0, 0}}, 3, INTEROP_AVRCP_1_3_ONLY}, 195 196 // Eero Wi-Fi Router 197 {{{0x08, 0x9b, 0xf1, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 198 {{{0x20, 0xbe, 0xcd, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 199 {{{0x30, 0x34, 0x22, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 200 {{{0x3c, 0x5c, 0xf1, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 201 {{{0x40, 0x47, 0x5e, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 202 {{{0x50, 0x27, 0xa9, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 203 {{{0x64, 0x97, 0x14, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 204 {{{0x64, 0xc2, 0x69, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 205 {{{0x68, 0x4a, 0x76, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 206 {{{0x6c, 0xae, 0xf6, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 207 {{{0x78, 0x76, 0x89, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 208 {{{0x78, 0xd6, 0xd6, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 209 {{{0x84, 0x70, 0xd7, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 210 {{{0x98, 0xed, 0x7e, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 211 {{{0x9c, 0x0b, 0x05, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 212 {{{0x9c, 0x57, 0xbc, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 213 {{{0x9c, 0xa5, 0x70, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 214 {{{0xa0, 0x8e, 0x24, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 215 {{{0xac, 0xec, 0x85, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 216 {{{0xb4, 0x20, 0x46, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 217 {{{0xb4, 0xb9, 0xe6, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 218 {{{0xc0, 0x36, 0x53, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 219 {{{0xc4, 0xf1, 0x74, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 220 {{{0xc8, 0xb8, 0x2f, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 221 {{{0xc8, 0xe3, 0x06, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 222 {{{0xd4, 0x05, 0xde, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 223 {{{0xd4, 0x3f, 0x32, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 224 {{{0xec, 0x74, 0x27, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 225 {{{0xf0, 0x21, 0xe0, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 226 {{{0xf0, 0xb6, 0x61, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 227 {{{0xfc, 0x3f, 0xa6, 0, 0, 0}}, 3, INTEROP_DISABLE_ROBUST_CACHING}, 228 }; 229 230 typedef struct { 231 RawAddress addr_start; 232 RawAddress addr_end; 233 interop_feature_t feature; 234 } interop_addr_range_entry_t; 235 236 static const interop_addr_range_entry_t interop_addr_range_database[] = { 237 // Phonak AG - volume level not change 238 {{{0x00, 0x0f, 0x59, 0x50, 0x00, 0x00}}, 239 {{0x00, 0x0f, 0x59, 0x6f, 0xff, 0xff}}, 240 INTEROP_DISABLE_ABSOLUTE_VOLUME}, 241 }; 242 243 typedef struct { 244 char name[20]; 245 size_t length; 246 interop_feature_t feature; 247 } interop_name_entry_t; 248 249 static const interop_name_entry_t interop_name_database[] = { 250 // Carried over from auto_pair_devlist.conf migration 251 {"Audi", 4, INTEROP_DISABLE_AUTO_PAIRING}, 252 {"BMW", 3, INTEROP_DISABLE_AUTO_PAIRING}, 253 {"Parrot", 6, INTEROP_DISABLE_AUTO_PAIRING}, 254 {"Car", 3, INTEROP_DISABLE_AUTO_PAIRING}, 255 256 // Nissan Quest rejects pairing after "0000" 257 {"NISSAN", 6, INTEROP_DISABLE_AUTO_PAIRING}, 258 259 // Subaru car kits ("CAR M_MEDIA") 260 {"CAR", 3, INTEROP_DISABLE_AUTO_PAIRING}, 261 262 // Pixel C Keyboard doesn't respond to service changed indications. 263 {"Pixel C Keyboard", 16, INTEROP_GATTC_NO_SERVICE_CHANGED_IND}, 264 265 // Kenwood KMM-BT518HD - no audio when A2DP codec sample rate is changed 266 {"KMM-BT51*HD", 11, INTEROP_DISABLE_AVDTP_RECONFIGURE}, 267 268 // Nintendo Switch Pro Controller and Joy Con - do not set sniff interval 269 // dynamically. They require custom HID report command to change mode. 270 {"Pro Controller", 14, INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL}, 271 {"Joy-Con", 7, INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL}, 272 }; 273