Merge "rust: Update to syn-2"
diff --git a/TEST_MAPPING b/TEST_MAPPING
index a3778c8..a676392 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -155,9 +155,6 @@
"name": "net_test_eatt"
},
{
- "name": "net_test_hci_fragmenter_native"
- },
- {
"name": "net_test_main_shim"
},
{
@@ -369,9 +366,6 @@
"name": "net_test_eatt"
},
{
- "name": "net_test_hci_fragmenter_native"
- },
- {
"name": "net_test_main_shim"
},
{
diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
index 382a61e..131a4aa 100644
--- a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+++ b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
@@ -1991,6 +1991,12 @@
Object[] args = generateArgs(arg);
+ if (!(args[0] instanceof String)) {
+ Log.w(TAG, "Incorrect type of Android AT command!");
+ mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ return true;
+ }
+
String type = (String) args[0];
if (type.equals(BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID)) {
diff --git a/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
index b630783..35010f0 100644
--- a/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
+++ b/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
@@ -2246,11 +2246,19 @@
* 2. remote device supports audio policy
*/
if (getForceSetAudioPolicyProperty()) {
- setAudioPolicy(new BluetoothSinkAudioPolicy.Builder(mHsClientAudioPolicy)
- .setCallEstablishPolicy(establishPolicy)
- .setActiveDevicePolicyAfterConnection(getConnectingTimePolicyProperty())
- .setInBandRingtonePolicy(getInBandRingtonePolicyProperty())
- .build());
+ // set call establish policy and connecting policy to POLICY_ALLOWED if allowed=true,
+ // otherwise set them to the default values
+ int connectingTimePolicy =
+ allowed
+ ? BluetoothSinkAudioPolicy.POLICY_ALLOWED
+ : getConnectingTimePolicyProperty();
+
+ setAudioPolicy(
+ new BluetoothSinkAudioPolicy.Builder(mHsClientAudioPolicy)
+ .setCallEstablishPolicy(establishPolicy)
+ .setActiveDevicePolicyAfterConnection(connectingTimePolicy)
+ .setInBandRingtonePolicy(getInBandRingtonePolicyProperty())
+ .build());
} else {
setAudioPolicy(new BluetoothSinkAudioPolicy.Builder(mHsClientAudioPolicy)
.setCallEstablishPolicy(establishPolicy).build());
diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java
index 2a96489..632bdb3 100644
--- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java
+++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java
@@ -48,7 +48,6 @@
import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.bluetooth.R;
import com.android.bluetooth.TestUtils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.storage.DatabaseManager;
@@ -56,7 +55,6 @@
import org.hamcrest.core.IsInstanceOf;
import org.junit.After;
import org.junit.Assert;
-import org.junit.Assume;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -1442,22 +1440,40 @@
@Test
public void testCheckAndProcessAndroidAt() {
// Commands that will be handled
+ int counter_ok = 0;
+ int counter_error = 0;
Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt(
"+ANDROID=?" , mTestDevice));
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_ok))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt(
"+ANDROID=SINKAUDIOPOLICY,1,1,1" , mTestDevice));
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(2)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_ok))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt(
"+ANDROID=SINKAUDIOPOLICY,100,100,100" , mTestDevice));
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(3)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_ok))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt(
"+ANDROID=SINKAUDIOPOLICY,1,2,3,4,5" , mTestDevice));
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt("+ANDROID=1", mTestDevice));
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ Assert.assertTrue(
+ mHeadsetStateMachine.checkAndProcessAndroidAt("+ANDROID=1,2", mTestDevice));
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ Assert.assertTrue(
+ mHeadsetStateMachine.checkAndProcessAndroidAt("+ANDROID=1,2,3", mTestDevice));
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ Assert.assertTrue(
+ mHeadsetStateMachine.checkAndProcessAndroidAt(
+ "+ANDROID=1,2,3,4,5,6,7", mTestDevice));
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(++counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
// Commands with correct format but will not be handled
Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt(
@@ -1474,10 +1490,10 @@
"RANDOM FORMAT" , mTestDevice));
// Check no any AT result was sent for the failed ones
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(3)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
- verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode(
- mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(counter_ok))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0);
+ verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(counter_error))
+ .atResponseCode(mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0);
}
@Test
diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java
index bfda3f7..e377201 100644
--- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java
+++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java
@@ -16,10 +16,7 @@
package com.android.bluetooth.hfpclient;
-import static android.bluetooth.BluetoothProfile.STATE_CONNECTED;
-import static android.bluetooth.BluetoothProfile.STATE_CONNECTING;
import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTED;
-import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTING;
import static com.android.bluetooth.hfpclient.HeadsetClientStateMachine.AT_OK;
import static com.android.bluetooth.hfpclient.HeadsetClientStateMachine.ENTER_PRIVATE_MODE;
@@ -58,16 +55,13 @@
import com.android.bluetooth.R;
import com.android.bluetooth.TestUtils;
-import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.hfp.HeadsetService;
-import com.android.bluetooth.hfp.HeadsetStackEvent;
import org.hamcrest.core.AllOf;
import org.hamcrest.core.IsInstanceOf;
import org.junit.After;
import org.junit.Assert;
-import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -935,7 +929,7 @@
// Expect: Should send +ANDROID=SINKAUDIOPOLICY,1,2,1 to remote
mHeadsetClientStateMachine.setForceSetAudioPolicyProperty(true);
mHeadsetClientStateMachine.setAudioRouteAllowed(true);
- verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,1,2,1");
+ verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,1,1,1");
}
@Test
diff --git a/android/pandora/mmi2grpc/mmi2grpc/opp.py b/android/pandora/mmi2grpc/mmi2grpc/opp.py
index 2a474ec..4f0bd3c 100644
--- a/android/pandora/mmi2grpc/mmi2grpc/opp.py
+++ b/android/pandora/mmi2grpc/mmi2grpc/opp.py
@@ -122,7 +122,7 @@
Take action to create an rfcomm channel for an OBEX connection.
"""
- self._android.SendFile()
+ self._android.SendFile('PTS')
return "OK"
@@ -132,7 +132,7 @@
Take action to create an l2cap channel for an OBEX connection.
"""
- self._android.SendFile()
+ self._android.SendFile('PTS')
return "OK"
diff --git a/android/pandora/server/src/com/android/pandora/AndroidInternal.kt b/android/pandora/server/src/com/android/pandora/AndroidInternal.kt
index 6f2fd32..1119acb 100644
--- a/android/pandora/server/src/com/android/pandora/AndroidInternal.kt
+++ b/android/pandora/server/src/com/android/pandora/AndroidInternal.kt
@@ -58,7 +58,10 @@
private val INCOMING_FILE_TITLE = "Incoming file"
private val INCOMING_FILE_WAIT_TIMEOUT = 2000L
- private val BT_DEVICE_SELECT_WAIT_TIMEOUT = 3000L
+ // PTS does not configure the Extended Inquiry Response with the
+ // device name; the device will be found after the Inquiry Timeout
+ // (12.8sec) has elapsed.
+ private val BT_DEVICE_SELECT_WAIT_TIMEOUT = 20000L
private val IMAGE_FILE_NAME = "OPP_TEST_IMAGE.bmp"
private val bluetoothManager = context.getSystemService(BluetoothManager::class.java)!!
@@ -141,18 +144,15 @@
}
}
- override fun sendFile(request: Empty, responseObserver: StreamObserver<Empty>) {
+ override fun sendFile(request: SendFileRequest, responseObserver: StreamObserver<Empty>) {
grpcUnary<Empty>(scope, responseObserver) {
initiateSendFile(getImageId(IMAGE_FILE_NAME), "image/bmp")
- waitAndSelectBluetoothDevice()
+ waitAndSelectBluetoothDevice(request.name)
Empty.getDefaultInstance()
}
}
- override fun sendPing(
- request: SendPingRequest,
- responseObserver: StreamObserver<Empty>
- ) {
+ override fun sendPing(request: SendPingRequest, responseObserver: StreamObserver<Empty>) {
grpcUnary<Empty>(scope, responseObserver) {
val pingStatus =
Runtime.getRuntime().exec("ping -I bt-pan -c 1 ${request.ipAddress}").waitFor()
@@ -160,12 +160,10 @@
}
}
- suspend private fun waitAndSelectBluetoothDevice() {
+ suspend private fun waitAndSelectBluetoothDevice(name: String) {
var selectJob =
scope.async {
- device
- .wait(Until.findObject(By.textContains("Cuttlefish")), BT_DEVICE_SELECT_WAIT_TIMEOUT)
- .click()
+ device.wait(Until.findObject(By.textContains(name)), BT_DEVICE_SELECT_WAIT_TIMEOUT).click()
}
selectJob.await()
}
diff --git a/android/pandora/test/Android.bp b/android/pandora/test/Android.bp
index 5fd5e30..1d73c36 100644
--- a/android/pandora/test/Android.bp
+++ b/android/pandora/test/Android.bp
@@ -20,9 +20,8 @@
name: "avatar",
main: "main.py",
srcs: [
- "*_test.py",
- "example.py",
- "main.py",
+ "*.py",
+ ":avatar-cases",
],
libs: [
"bumble_services_experimental-python",
diff --git a/android/pandora/test/asha_test.py b/android/pandora/test/asha_test.py
index 0eeabc4..24332e2 100644
--- a/android/pandora/test/asha_test.py
+++ b/android/pandora/test/asha_test.py
@@ -18,7 +18,8 @@
import grpc
import logging
-from avatar import BumblePandoraDevice, PandoraDevice, PandoraDevices, asynchronous, bumble_server
+from avatar import BumblePandoraDevice, PandoraDevice, PandoraDevices, asynchronous
+from bumble import pandora as bumble_server
from bumble.gatt import GATT_ASHA_SERVICE
from bumble.pairing import PairingDelegate
from bumble_experimental.asha import AshaGattService, AshaService
@@ -48,7 +49,7 @@
RIGHT = 1
-class ASHATest(base_test.BaseTestClass): # type: ignore[misc]
+class AshaTest(base_test.BaseTestClass): # type: ignore[misc]
devices: Optional[PandoraDevices] = None
# pandora devices.
diff --git a/android/pandora/test/avatar.sh b/android/pandora/test/avatar.sh
index 69f6cca..688ee1c 100755
--- a/android/pandora/test/avatar.sh
+++ b/android/pandora/test/avatar.sh
@@ -24,10 +24,9 @@
_BT_ROOT="${ANDROID_BUILD_TOP}/packages/modules/Bluetooth"
_TEST_ROOT="${_BT_ROOT}/android/pandora/test"
_PY_SOURCES=(
- "${ANDROID_BUILD_TOP}/external/pandora/avatar/"{avatar,examples}
+ "${ANDROID_BUILD_TOP}/external/pandora/avatar/"{avatar,cases}
"${_BT_ROOT}/pandora/server/bumble_experimental"
- "${_TEST_ROOT}/"*_test.py
- "${_TEST_ROOT}/main.py"
+ "${_TEST_ROOT}/"*.py
)
_PANDORA_PYTHON_PATHS=(
diff --git a/android/pandora/test/classic_ssp_test.py b/android/pandora/test/classic_ssp_test.py
deleted file mode 100644
index 0b1335f..0000000
--- a/android/pandora/test/classic_ssp_test.py
+++ /dev/null
@@ -1,330 +0,0 @@
-# Copyright 2023 Google LLC
-#
-# 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
-#
-# https://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.
-
-import asyncio
-import avatar
-import itertools
-import logging
-
-from avatar import BumblePandoraDevice, PandoraDevice, PandoraDevices
-from bumble.hci import HCI_CENTRAL_ROLE, HCI_PERIPHERAL_ROLE
-from bumble.pairing import PairingDelegate
-from mobly import base_test, signals, test_runner
-from mobly.asserts import assert_equal # type: ignore
-from mobly.asserts import assert_in # type: ignore
-from mobly.asserts import assert_is_not_none # type: ignore
-from mobly.asserts import fail # type: ignore
-from pandora.host_pb2 import Connection
-from pandora.security_pb2 import LEVEL2, PairingEventAnswer, SecureResponse, SecurityLevel, WaitSecurityResponse
-from typing import Callable, Coroutine, Optional, Tuple
-
-ALL_ROLES = (HCI_CENTRAL_ROLE, HCI_PERIPHERAL_ROLE)
-ALL_IO_CAPABILITIES = (
- None,
- PairingDelegate.DISPLAY_OUTPUT_ONLY,
- PairingDelegate.DISPLAY_OUTPUT_AND_YES_NO_INPUT,
- PairingDelegate.KEYBOARD_INPUT_ONLY,
- PairingDelegate.NO_OUTPUT_NO_INPUT,
- PairingDelegate.DISPLAY_OUTPUT_AND_KEYBOARD_INPUT,
-)
-
-
-class ClassicSspTest(base_test.BaseTestClass): # type: ignore[misc]
- '''
- This class aim to test SSP (Secure Simple Pairing) on Classic
- Bluetooth devices.
- '''
-
- devices: Optional[PandoraDevices] = None
-
- # pandora devices.
- dut: PandoraDevice
- ref: PandoraDevice
-
- @avatar.asynchronous
- async def setup_class(self) -> None:
- self.devices = PandoraDevices(self)
- self.dut, self.ref, *_ = self.devices
-
- # Enable BR/EDR mode and SSP for Bumble devices.
- for device in self.devices:
- if isinstance(device, BumblePandoraDevice):
- device.config.setdefault('classic_enabled', True)
- device.config.setdefault('classic_ssp_enabled', True)
- device.config.setdefault(
- 'server',
- {
- 'io_capability': 'display_output_and_yes_no_input',
- },
- )
-
- await asyncio.gather(self.dut.reset(), self.ref.reset())
-
- def teardown_class(self) -> None:
- if self.devices:
- self.devices.stop_all()
-
- @avatar.asynchronous
- async def setup_test(self) -> None: # pytype: disable=wrong-arg-types
- await asyncio.gather(self.dut.reset(), self.ref.reset())
-
- @avatar.parameterized(*itertools.product(ALL_IO_CAPABILITIES, ALL_ROLES)) # type: ignore[misc]
- @avatar.asynchronous
- async def test_success_initiate_connection_initiate_pairing(
- self,
- ref_io_capability: Optional[PairingDelegate.IoCapability],
- ref_role: Optional[int],
- ) -> None:
- # Override REF IO capability if supported.
- set_io_capability(self.ref, ref_io_capability)
-
- # Connection/pairing task.
- async def connect_and_pair() -> Tuple[SecureResponse, WaitSecurityResponse]:
- dut_ref, ref_dut = await make_classic_connection(self.dut, self.ref)
- if ref_role is not None:
- await role_switch(self.ref, ref_dut, ref_role)
- return await authenticate(self.dut, dut_ref, self.ref, ref_dut, LEVEL2)
-
- # Handle pairing.
- initiator_pairing, acceptor_pairing = await handle_pairing(
- self.dut,
- self.ref,
- connect_and_pair,
- )
-
- # Assert success.
- assert_equal(initiator_pairing.result_variant(), 'success')
- assert_equal(acceptor_pairing.result_variant(), 'success')
-
- @avatar.parameterized(*itertools.product(ALL_IO_CAPABILITIES, ALL_ROLES)) # type: ignore[misc]
- @avatar.asynchronous
- async def test_success_initiate_connection_accept_pairing(
- self,
- ref_io_capability: Optional[PairingDelegate.IoCapability],
- ref_role: Optional[int],
- ) -> None:
- if not isinstance(self.dut, BumblePandoraDevice):
- raise signals.TestSkip('TODO: Fix rootcanal when both AOSP and Bumble trigger the auth.')
-
- # Override REF IO capability if supported.
- set_io_capability(self.ref, ref_io_capability)
-
- # Connection/pairing task.
- async def connect_and_pair() -> Tuple[SecureResponse, WaitSecurityResponse]:
- dut_ref, ref_dut = await make_classic_connection(self.dut, self.ref)
- if ref_role is not None:
- await role_switch(self.ref, ref_dut, ref_role)
- return await authenticate(self.ref, ref_dut, self.dut, dut_ref, LEVEL2)
-
- # Handle pairing.
- initiator_pairing, acceptor_pairing = await handle_pairing(
- self.dut,
- self.ref,
- connect_and_pair,
- )
-
- # Assert success.
- assert_equal(initiator_pairing.result_variant(), 'success')
- assert_equal(acceptor_pairing.result_variant(), 'success')
-
- @avatar.parameterized(*itertools.product(ALL_IO_CAPABILITIES, ALL_ROLES)) # type: ignore[misc]
- @avatar.asynchronous
- async def test_success_accept_connection_initiate_pairing(
- self,
- ref_io_capability: Optional[PairingDelegate.IoCapability],
- ref_role: Optional[int],
- ) -> None:
- # Override REF IO capability if supported.
- set_io_capability(self.ref, ref_io_capability)
-
- # Connection/pairing task.
- async def connect_and_pair() -> Tuple[SecureResponse, WaitSecurityResponse]:
- ref_dut, dut_ref = await make_classic_connection(self.ref, self.dut)
- if ref_role is not None:
- await role_switch(self.ref, ref_dut, ref_role)
- return await authenticate(self.dut, dut_ref, self.ref, ref_dut, LEVEL2)
-
- # Handle pairing.
- initiator_pairing, acceptor_pairing = await handle_pairing(
- self.dut,
- self.ref,
- connect_and_pair,
- )
-
- # Assert success.
- assert_equal(initiator_pairing.result_variant(), 'success')
- assert_equal(acceptor_pairing.result_variant(), 'success')
-
- @avatar.parameterized(*itertools.product(ALL_IO_CAPABILITIES, ALL_ROLES)) # type: ignore[misc]
- @avatar.asynchronous
- async def test_success_accept_connection_accept_pairing(
- self,
- ref_io_capability: Optional[PairingDelegate.IoCapability],
- ref_role: Optional[int],
- ) -> None:
- # Override REF IO capability if supported.
- set_io_capability(self.ref, ref_io_capability)
-
- # Connection/pairing task.
- async def connect_and_pair() -> Tuple[SecureResponse, WaitSecurityResponse]:
- ref_dut, dut_ref = await make_classic_connection(self.ref, self.dut)
- if ref_role is not None:
- await role_switch(self.ref, ref_dut, ref_role)
- return await authenticate(self.ref, ref_dut, self.dut, dut_ref, LEVEL2)
-
- # Handle pairing.
- initiator_pairing, acceptor_pairing = await handle_pairing(
- self.dut,
- self.ref,
- connect_and_pair,
- )
-
- # Assert success.
- assert_equal(initiator_pairing.result_variant(), 'success')
- assert_equal(acceptor_pairing.result_variant(), 'success')
-
-
-def set_io_capability(device: PandoraDevice, io_capability: Optional[PairingDelegate.IoCapability]) -> None:
- if io_capability is None:
- return
- if isinstance(device, BumblePandoraDevice):
- # Override Bumble reference device default IO capability.
- device.server_config.io_capability = io_capability
- else:
- raise signals.TestSkip('Unable to override IO capability on non Bumble device.')
-
-
-# Connection task.
-async def make_classic_connection(initiator: PandoraDevice, acceptor: PandoraDevice) -> Tuple[Connection, Connection]:
- '''Connect two device and returns both connection tokens.'''
-
- (connect, wait_connection) = await asyncio.gather(
- initiator.aio.host.Connect(address=acceptor.address),
- acceptor.aio.host.WaitConnection(address=initiator.address),
- )
-
- # Assert connection are successful.
- assert_equal(connect.result_variant(), 'connection')
- assert_equal(wait_connection.result_variant(), 'connection')
- assert_is_not_none(connect.connection)
- assert_is_not_none(wait_connection.connection)
- assert connect.connection and wait_connection.connection
-
- # Returns connections.
- return connect.connection, wait_connection.connection
-
-
-# Pairing task.
-async def authenticate(
- initiator: PandoraDevice,
- initiator_connection: Connection,
- acceptor: PandoraDevice,
- acceptor_connection: Connection,
- security_level: SecurityLevel,
-) -> Tuple[SecureResponse, WaitSecurityResponse]:
- '''Pair two device and returns both pairing responses.'''
-
- return await asyncio.gather(
- initiator.aio.security.Secure(connection=initiator_connection, classic=security_level),
- acceptor.aio.security.WaitSecurity(connection=acceptor_connection, classic=security_level),
- )
-
-
-# Role switch task.
-async def role_switch(
- device: PandoraDevice,
- connection: Connection,
- role: int,
-) -> None:
- '''Switch role if supported.'''
-
- if not isinstance(device, BumblePandoraDevice):
- return
-
- connection_handle = int.from_bytes(connection.cookie.value, 'big')
- bumble_connection = device.device.lookup_connection(connection_handle)
- assert_is_not_none(bumble_connection)
- assert bumble_connection
-
- if bumble_connection.role != role:
- device.log.info(f"Role switch to: {'`CENTRAL`' if role == HCI_CENTRAL_ROLE else '`PERIPHERAL`'}")
- await bumble_connection.switch_role(role)
-
-
-# Handle pairing events task.
-async def handle_pairing(
- dut: PandoraDevice,
- ref: PandoraDevice,
- connect_and_pair: Callable[[], Coroutine[None, None, Tuple[SecureResponse, WaitSecurityResponse]]],
- confirm: Callable[[bool], bool] = lambda x: x,
- passkey: Callable[[int], int] = lambda x: x,
-) -> Tuple[SecureResponse, WaitSecurityResponse]:
-
- # Listen for pairing event on bot DUT and REF.
- dut_pairing, ref_pairing = dut.aio.security.OnPairing(), ref.aio.security.OnPairing()
-
- # Start connection/pairing.
- connect_and_pair_task = asyncio.create_task(connect_and_pair())
-
- try:
- dut_ev = await asyncio.wait_for(anext(dut_pairing), timeout=25.0)
- dut.log.info(f'DUT pairing event: {dut_ev.method_variant()}')
-
- ref_ev = await asyncio.wait_for(anext(ref_pairing), timeout=3.0)
- ref.log.info(f'REF pairing event: {ref_ev.method_variant()}')
-
- if dut_ev.method_variant() in ('numeric_comparison', 'just_works'):
- assert_in(ref_ev.method_variant(), ('numeric_comparison', 'just_works'))
- confirm_res = True
- if dut_ev.method_variant() == 'numeric_comparison' and ref_ev.method_variant() == 'numeric_comparison':
- confirm_res = ref_ev.numeric_comparison == dut_ev.numeric_comparison
- confirm_res = confirm(confirm_res)
- dut_pairing.send_nowait(PairingEventAnswer(event=dut_ev, confirm=confirm_res))
- ref_pairing.send_nowait(PairingEventAnswer(event=ref_ev, confirm=confirm_res))
-
- elif dut_ev.method_variant() == 'passkey_entry_notification':
- assert_equal(ref_ev.method_variant(), 'passkey_entry_request')
- assert_is_not_none(dut_ev.passkey_entry_notification)
- assert dut_ev.passkey_entry_notification is not None
- passkey_res = passkey(dut_ev.passkey_entry_notification)
- ref_pairing.send_nowait(PairingEventAnswer(event=ref_ev, passkey=passkey_res))
-
- elif dut_ev.method_variant() == 'passkey_entry_request':
- assert_equal(ref_ev.method_variant(), 'passkey_entry_notification')
- assert_is_not_none(ref_ev.passkey_entry_notification)
- assert ref_ev.passkey_entry_notification is not None
- passkey_res = passkey(ref_ev.passkey_entry_notification)
- dut_pairing.send_nowait(PairingEventAnswer(event=dut_ev, passkey=passkey_res))
-
- else:
- fail("")
-
- except (asyncio.CancelledError, asyncio.TimeoutError):
- logging.exception('Pairing timed-out.')
-
- finally:
-
- try:
- (secure, wait_security) = await asyncio.wait_for(connect_and_pair_task, 15.0)
- logging.info(f'Pairing result: {secure.result_variant()}/{wait_security.result_variant()}')
- return secure, wait_security
-
- finally:
- dut_pairing.cancel()
- ref_pairing.cancel()
-
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.DEBUG)
- test_runner.main() # type: ignore
diff --git a/android/pandora/test/example.py b/android/pandora/test/example.py
deleted file mode 120000
index 27ac5be..0000000
--- a/android/pandora/test/example.py
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../external/pandora/avatar/examples/example.py
\ No newline at end of file
diff --git a/android/pandora/test/gatt_test.py b/android/pandora/test/gatt_test.py
index 156e27b..df8b912 100644
--- a/android/pandora/test/gatt_test.py
+++ b/android/pandora/test/gatt_test.py
@@ -16,7 +16,8 @@
import avatar
import logging
-from avatar import BumblePandoraDevice, PandoraDevice, PandoraDevices, bumble_server
+from avatar import BumblePandoraDevice, PandoraDevice, PandoraDevices
+from bumble import pandora as bumble_server
from bumble.gatt import Characteristic, Service
from bumble.pairing import PairingConfig
from bumble_experimental.gatt import GATTService
diff --git a/android/pandora/test/le_advertising_test.py b/android/pandora/test/le_advertising_test.py
deleted file mode 100644
index cb7f6eb..0000000
--- a/android/pandora/test/le_advertising_test.py
+++ /dev/null
@@ -1,172 +0,0 @@
-# Copyright 2022 Google LLC
-#
-# 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
-#
-# https://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.
-
-import asyncio
-import enum
-import logging
-import random
-
-from avatar import PandoraDevice, PandoraDevices, asynchronous, parameterized
-from mobly import base_test, test_runner
-from mobly.asserts import assert_equal # type: ignore
-from mobly.asserts import assert_false # type: ignore
-from mobly.asserts import assert_true # type: ignore
-from pandora.host_pb2 import PUBLIC, DataTypes
-from typing import Any, Dict, Optional
-
-
-class AdvertisingEventProperties(enum.IntEnum):
- ADV_IND = 0x13
- ADV_DIRECT_IND = 0x15
- ADV_SCAN_IND = 0x12
- ADV_NONCONN_IND = 0x10
-
- CONNECTABLE = 0x01
- SCANNABLE = 0x02
- DIRECTED = 0x04
- LEGACY = 0x10
- ANONYMOUS = 0x20
-
-
-class LeAdvertisingTest(base_test.BaseTestClass): # type: ignore[misc]
- """Suite of tests designed to validate that Android correctly reports
- all kinds of advertising events to the user application."""
-
- devices: Optional[PandoraDevices] = None
- dut: PandoraDevice
- ref: PandoraDevice
-
- def setup_class(self) -> None:
- self.devices = PandoraDevices(self)
- dut, ref, *_ = self.devices
- self.dut, self.ref = dut, ref
-
- def teardown_class(self) -> None:
- if self.devices:
- self.devices.stop_all()
-
- @asynchronous
- async def setup_test(self) -> None:
- await asyncio.gather(self.dut.reset(), self.ref.reset())
-
- @parameterized(
- (AdvertisingEventProperties.ADV_IND, 0),
- (AdvertisingEventProperties.ADV_IND, 31),
- (AdvertisingEventProperties.ADV_DIRECT_IND, 0),
- (AdvertisingEventProperties.ADV_SCAN_IND, 0),
- (AdvertisingEventProperties.ADV_SCAN_IND, 31),
- (AdvertisingEventProperties.ADV_NONCONN_IND, 0),
- (AdvertisingEventProperties.ADV_NONCONN_IND, 31),
- ) # type: ignore[misc]
- def test_legacy_advertising_parameters(
- self, advertising_event_properties: AdvertisingEventProperties, advertising_data_length: int
- ) -> None:
- # Advertise from the Ref device with the specified legacy advertising
- # event properties. Use the manufacturer specific data to pad the advertising data to the
- # desired length. The scan response data must always be provided when
- # scannable but it is defaulted.
- connectable = (advertising_event_properties & AdvertisingEventProperties.CONNECTABLE) != 0
- scannable = (advertising_event_properties & AdvertisingEventProperties.SCANNABLE) != 0
- directed = (advertising_event_properties & AdvertisingEventProperties.DIRECTED) != 0
-
- manufacturer_specific_data_length = max(0, advertising_data_length - 5) # Flags (3) + LV (2)
- manufacturer_specific_data = bytes([random.randint(1, 255) for _ in range(manufacturer_specific_data_length)])
- advertising_data = (
- DataTypes(manufacturer_specific_data=manufacturer_specific_data) if advertising_data_length > 0 else None
- )
-
- scan_response_data = DataTypes() if scannable else None
- target = self.dut.address if directed else None
-
- advertiser = self.ref.host.Advertise(
- legacy=True,
- connectable=connectable,
- data=advertising_data, # type: ignore[arg-type]
- scan_response_data=scan_response_data, # type: ignore[arg-type]
- public=target,
- own_address_type=PUBLIC,
- )
- scanner = self.dut.host.Scan(legacy=False, passive=False)
-
- report = next((x for x in scanner if x.public == self.ref.address))
-
- scanner.cancel()
- advertiser.cancel()
-
- assert_true(report.legacy, msg='expected legacy advertising report')
- assert_equal(report.connectable, connectable)
- # TODO: scannable is not set by the android server
- # assert_equal(report.scannable, scannable)
- # TODO: direct_address is not set by the android server
- assert_equal(report.data.manufacturer_specific_data, manufacturer_specific_data)
- assert_false(report.truncated, msg='expected non-truncated advertising report')
-
- @parameterized(
- (dict(incomplete_service_class_uuids16=["183A", "181F"]),),
- # (dict(complete_service_class_uuids16=["183A", "181F"]),),
- (dict(incomplete_service_class_uuids32=["FFFF183A", "FFFF181F"]),),
- # (dict(complete_service_class_uuids32=["FFFF183A", "FFFF181F"]),),
- (dict(incomplete_service_class_uuids128=["FFFF181F-FFFF-1000-8000-00805F9B34FB"]),),
- # (dict(complete_service_class_uuids128=["FFFF183A-FFFF-1000-8000-00805F9B34FB"]),),
- (dict(shortened_local_name="avatar"),),
- (dict(complete_local_name="avatar_the_last_test_blender"),),
- (dict(tx_power_level=20),),
- (dict(class_of_device=0x40680),),
- (dict(peripheral_connection_interval_min=0x0006, peripheral_connection_interval_max=0x0C80),),
- (dict(service_solicitation_uuids16=["183A", "181F"]),),
- (dict(service_solicitation_uuids32=["FFFF183A", "FFFF181F"]),),
- (dict(service_solicitation_uuids128=["FFFF183A-FFFF-1000-8000-00805F9B34FB"]),),
- (dict(service_data_uuid16={"183A": bytes([1, 2, 3, 4])}),),
- (dict(service_data_uuid32={"FFFF183A": bytes([1, 2, 3, 4])}),),
- (dict(service_data_uuid128={"FFFF181F-FFFF-1000-8000-00805F9B34FB": bytes([1, 2, 3, 4])}),),
- # (dict(public_target_addresses=[bytes([1, 2, 3, 4, 5, 6]),
- # bytes([6, 5, 2, 4, 3, 1])]),),
- # (dict(random_target_addresses=[bytes([1, 2, 3, 4, 5, 6]),
- # bytes([6, 5, 2, 4, 3, 1])]),),
- (dict(appearance=0x0591),),
- (dict(advertising_interval=0x1000),),
- # (dict(advertising_interval=0x100000),),
- (dict(uri="https://www.google.com"),),
- (dict(le_supported_features=bytes([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0x9F])),),
- (dict(manufacturer_specific_data=bytes([0, 1, 2, 3, 4])),),
- # (dict(le_discoverability_mode=DISCOVERABLE_GENERAL),),
- ) # type: ignore[misc]
- def test_advertising_data_types(self, advertising_data: Dict[str, Any]) -> None:
- # Advertise from the Ref device with the specified advertising data.
- # Validate that the Ref generates the correct advertising data,
- # and that the dut presents the correct advertising data in the scan
- # result.
- advertiser = self.ref.host.Advertise(
- legacy=True,
- connectable=True,
- data=DataTypes(**advertising_data),
- own_address_type=PUBLIC,
- )
- scanner = self.dut.host.Scan(legacy=False, passive=False)
-
- report = next((x for x in scanner if x.public == self.ref.address))
-
- scanner.cancel()
- advertiser.cancel()
-
- assert_true(report.legacy, msg='expected legacy advertising report')
- assert_equal(report.connectable, True)
- for (key, value) in advertising_data.items(): # type: ignore [misc]
- assert_equal(getattr(report.data, key), value) # type: ignore [misc]
- assert_false(report.truncated, msg='expected non-truncated advertising report')
-
-
-if __name__ == '__main__':
- logging.basicConfig(level=logging.DEBUG)
- test_runner.main() # type: ignore
diff --git a/android/pandora/test/main.py b/android/pandora/test/main.py
index d963e31..f1a27ab 100644
--- a/android/pandora/test/main.py
+++ b/android/pandora/test/main.py
@@ -13,21 +13,23 @@
_BUMBLE_BTSNOOP_FMT = 'bumble_btsnoop_{pid}_{instance}.log'
-# Import test modules.
+# Import test cases modules.
import asha_test
-import classic_ssp_test
-import example
+import cases.host_test
+import cases.le_host_test
+import cases.le_security_test
+import cases.security_test
import gatt_test
-import le_advertising_test
import smp_test
_TEST_CLASSES_LIST = [
- example.ExampleTest,
- asha_test.ASHATest,
- gatt_test.GattTest,
- le_advertising_test.LeAdvertisingTest,
+ cases.host_test.HostTest,
+ cases.le_host_test.LeHostTest,
+ cases.security_test.SecurityTest,
+ cases.le_security_test.LeSecurityTest,
smp_test.SmpTest,
- classic_ssp_test.ClassicSspTest,
+ gatt_test.GattTest,
+ asha_test.AshaTest,
]
diff --git a/framework/java/android/bluetooth/BluetoothHapClient.java b/framework/java/android/bluetooth/BluetoothHapClient.java
index 75665b4..f9ff308 100644
--- a/framework/java/android/bluetooth/BluetoothHapClient.java
+++ b/framework/java/android/bluetooth/BluetoothHapClient.java
@@ -88,11 +88,9 @@
service.registerCallback(mCallback, mAttributionSource, recv);
recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(null);
}
- } catch (TimeoutException e) {
+ } catch (RemoteException | TimeoutException e) {
Log.e(TAG, e.toString() + "\n"
+ Log.getStackTraceString(new Throwable()));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
}
}
}
diff --git a/framework/java/android/bluetooth/BluetoothLeAudio.java b/framework/java/android/bluetooth/BluetoothLeAudio.java
index af7e0fe..1f749be 100644
--- a/framework/java/android/bluetooth/BluetoothLeAudio.java
+++ b/framework/java/android/bluetooth/BluetoothLeAudio.java
@@ -91,10 +91,8 @@
service.registerCallback(mCallback, mAttributionSource, recv);
recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(null);
}
- } catch (TimeoutException e) {
+ } catch (RemoteException | TimeoutException e) {
Log.e(TAG, "Failed to register callback", e);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
}
}
}
diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcast.java b/framework/java/android/bluetooth/BluetoothLeBroadcast.java
index 89fb54e..d724335 100644
--- a/framework/java/android/bluetooth/BluetoothLeBroadcast.java
+++ b/framework/java/android/bluetooth/BluetoothLeBroadcast.java
@@ -194,11 +194,12 @@
recv.awaitResultNoInterrupt(getSyncTimeout())
.getValue(null);
}
- } catch (TimeoutException e) {
- Log.e(TAG, "onBluetoothServiceUp: Failed to register "
- + "Le Broadcaster callback", e);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ } catch (RemoteException | TimeoutException e) {
+ Log.e(
+ TAG,
+ "onServiceConnected: Failed to register "
+ + "Le Broadcaster callback",
+ e);
}
}
}
diff --git a/framework/java/android/bluetooth/BluetoothProfileConnector.java b/framework/java/android/bluetooth/BluetoothProfileConnector.java
index 8620ed6..7eaebcd 100644
--- a/framework/java/android/bluetooth/BluetoothProfileConnector.java
+++ b/framework/java/android/bluetooth/BluetoothProfileConnector.java
@@ -131,7 +131,7 @@
private boolean doBind() {
synchronized (mConnection) {
if (mService == null) {
- logDebug("Binding service...");
+ logDebug("Binding service for " + mContext.getPackageName());
mCloseGuard.open("doUnbind");
try {
return BluetoothAdapter.getDefaultAdapter().getBluetoothManager()
@@ -148,7 +148,7 @@
private void doUnbind() {
synchronized (mConnection) {
if (mService != null) {
- logDebug("Unbinding service...");
+ logDebug("Unbinding service for " + mContext.getPackageName());
mCloseGuard.close();
try {
BluetoothAdapter.getDefaultAdapter().getBluetoothManager()
diff --git a/framework/java/android/bluetooth/BluetoothUtils.java b/framework/java/android/bluetooth/BluetoothUtils.java
index 1167837..1eb59df 100644
--- a/framework/java/android/bluetooth/BluetoothUtils.java
+++ b/framework/java/android/bluetooth/BluetoothUtils.java
@@ -35,10 +35,8 @@
*/
private BluetoothUtils() {}
- /**
- * Timeout value for synchronous binder call
- */
- private static final Duration SYNC_CALLS_TIMEOUT = Duration.ofSeconds(5);
+ /** Timeout value for synchronous binder call */
+ private static final Duration SYNC_CALLS_TIMEOUT = Duration.ofSeconds(3);
/**
* @return timeout value for synchronous binder call
diff --git a/pandora/interfaces/pandora_experimental/_android.proto b/pandora/interfaces/pandora_experimental/_android.proto
index 4c495ca..530e208 100644
--- a/pandora/interfaces/pandora_experimental/_android.proto
+++ b/pandora/interfaces/pandora_experimental/_android.proto
@@ -21,7 +21,8 @@
// Accept incoming file
rpc AcceptIncomingFile(google.protobuf.Empty) returns (google.protobuf.Empty);
// Send file
- rpc SendFile(google.protobuf.Empty) returns (google.protobuf.Empty);
+ rpc SendFile(SendFileRequest) returns (google.protobuf.Empty);
+
// Send ping
rpc SendPing(SendPingRequest) returns (google.protobuf.Empty);
}
@@ -45,6 +46,11 @@
AccessType access_type = 2;
}
+message SendFileRequest {
+ // Peer Bluetooth Device name.
+ string name = 1;
+}
+
// Internal representation of a Connection - not exposed to clients, included here
// just for code-generation convenience. This is what we put in the Connection.cookie.
message InternalConnectionRef {
@@ -55,4 +61,4 @@
// Request for the `SendPing` rpc.
message SendPingRequest {
string ip_address = 1;
-}
\ No newline at end of file
+}
diff --git a/pandora/server/bumble_experimental/asha.py b/pandora/server/bumble_experimental/asha.py
index fab9100..8db1a56 100644
--- a/pandora/server/bumble_experimental/asha.py
+++ b/pandora/server/bumble_experimental/asha.py
@@ -17,7 +17,6 @@
import logging
import struct
-from avatar.bumble_server import utils
from bumble.core import AdvertisingData
from bumble.device import Connection, Connection as BumbleConnection, Device
from bumble.gatt import (
@@ -32,6 +31,7 @@
TemplateService,
)
from bumble.l2cap import Channel
+from bumble.pandora import utils
from bumble.utils import AsyncRunner
from google.protobuf.empty_pb2 import Empty # pytype: disable=pyi-error
from pandora_experimental.asha_grpc_aio import AshaServicer
diff --git a/pandora/server/bumble_experimental/gatt.py b/pandora/server/bumble_experimental/gatt.py
index 323a43e..adbb6dd 100644
--- a/pandora/server/bumble_experimental/gatt.py
+++ b/pandora/server/bumble_experimental/gatt.py
@@ -16,10 +16,10 @@
import grpc
import logging
-from avatar.bumble_server import utils
from bumble.core import ProtocolError
from bumble.device import Connection as BumbleConnection, Device, Peer
from bumble.gatt_client import CharacteristicProxy, ServiceProxy
+from bumble.pandora import utils
from pandora_experimental.gatt_grpc_aio import GATTServicer
from pandora_experimental.gatt_pb2 import (
SUCCESS,
diff --git a/service/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTracker.java b/service/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTracker.java
deleted file mode 100644
index a035338..0000000
--- a/service/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTracker.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.bluetooth;
-
-import android.provider.DeviceConfig;
-import android.provider.DeviceConfig.Properties;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-/**
- * The BluetoothDeviceConfigChangeTracker receives changes to the DeviceConfig for
- * NAMESPACE_BLUETOOTH, and determines whether we should queue a restart, if any Bluetooth-related
- * INIT_ flags have been changed.
- *
- * <p>The initialProperties should be fetched from the BLUETOOTH namespace in DeviceConfig
- */
-public final class BluetoothDeviceConfigChangeTracker {
- private static final String TAG = "BluetoothDeviceConfigChangeTracker";
-
- private final HashMap<String, String> mCurrFlags;
-
- public BluetoothDeviceConfigChangeTracker(Properties initialProperties) {
- mCurrFlags = getFlags(initialProperties);
- }
-
- /**
- * Updates the instance state tracking the latest init flag values, and determines whether an
- * init flag has changed (requiring a restart at some point)
- */
- public boolean shouldRestartWhenPropertiesUpdated(Properties newProperties) {
- if (!newProperties.getNamespace().equals(DeviceConfig.NAMESPACE_BLUETOOTH)) {
- return false;
- }
- ArrayList<String> flags = new ArrayList<>();
- for (String name : newProperties.getKeyset()) {
- flags.add(name + "='" + newProperties.getString(name, "") + "'");
- }
- Log.d(TAG, "shouldRestartWhenPropertiesUpdated: " + String.join(",", flags));
- boolean shouldRestart = false;
- for (String name : newProperties.getKeyset()) {
- if (!isInitFlag(name)) {
- continue;
- }
- var oldValue = mCurrFlags.get(name);
- var newValue = newProperties.getString(name, "");
- if (newValue.equals(oldValue)) {
- continue;
- }
- Log.d(TAG, "Property " + name + " changed from " + oldValue + " -> " + newValue);
- mCurrFlags.put(name, newValue);
- shouldRestart = true;
- }
- return shouldRestart;
- }
-
- private HashMap<String, String> getFlags(Properties initialProperties) {
- var out = new HashMap();
- for (var name : initialProperties.getKeyset()) {
- if (isInitFlag(name)) {
- out.put(name, initialProperties.getString(name, ""));
- }
- }
- return out;
- }
-
- private Boolean isInitFlag(String flagName) {
- return flagName.startsWith("INIT_");
- }
-}
diff --git a/service/src/com/android/server/bluetooth/BluetoothDeviceConfigListener.java b/service/src/com/android/server/bluetooth/BluetoothDeviceConfigListener.java
deleted file mode 100644
index 197ec46..0000000
--- a/service/src/com/android/server/bluetooth/BluetoothDeviceConfigListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2020 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.
- */
-
-package com.android.server.bluetooth;
-
-import android.provider.DeviceConfig;
-import android.util.Log;
-
-/**
- * The BluetoothDeviceConfigListener handles system device config change callback and checks
- * whether we need to inform BluetoothManagerService on this change.
- *
- * The information of device config change would not be passed to the BluetoothManagerService
- * when Bluetooth is on and Bluetooth is in one of the following situations:
- * 1. Bluetooth A2DP is connected.
- * 2. Bluetooth Hearing Aid profile is connected.
- */
-public class BluetoothDeviceConfigListener {
- private static final String TAG = "BluetoothDeviceConfigListener";
-
- private final BluetoothManagerService mService;
- private final boolean mLogDebug;
- private final BluetoothDeviceConfigChangeTracker mConfigChangeTracker;
-
- BluetoothDeviceConfigListener(BluetoothManagerService service, boolean logDebug) {
- mService = service;
- mLogDebug = logDebug;
- mConfigChangeTracker =
- new BluetoothDeviceConfigChangeTracker(
- DeviceConfig.getProperties(DeviceConfig.NAMESPACE_BLUETOOTH));
- DeviceConfig.addOnPropertiesChangedListener(
- DeviceConfig.NAMESPACE_BLUETOOTH,
- (Runnable r) -> r.run(),
- mDeviceConfigChangedListener);
- }
-
- private final DeviceConfig.OnPropertiesChangedListener mDeviceConfigChangedListener =
- new DeviceConfig.OnPropertiesChangedListener() {
- @Override
- public void onPropertiesChanged(DeviceConfig.Properties newProperties) {
- if (mConfigChangeTracker.shouldRestartWhenPropertiesUpdated(newProperties)) {
- Log.d(TAG, "Properties changed, enqueuing restart");
- mService.onInitFlagsChanged();
- } else {
- Log.d(TAG, "All properties unchanged, skipping restart");
- }
- }
- };
-}
diff --git a/service/src/com/android/server/bluetooth/BluetoothManagerService.java b/service/src/com/android/server/bluetooth/BluetoothManagerService.java
index 8fb2c32..958ebc0 100644
--- a/service/src/com/android/server/bluetooth/BluetoothManagerService.java
+++ b/service/src/com/android/server/bluetooth/BluetoothManagerService.java
@@ -32,10 +32,7 @@
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.BroadcastOptions;
-import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothHearingAid;
-import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothProtoEnums;
import android.bluetooth.BluetoothStatusCodes;
@@ -72,13 +69,11 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.sysprop.BluetoothProperties;
-import android.text.TextUtils;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
@@ -142,8 +137,6 @@
private static final int ADD_PROXY_DELAY_MS = 100;
// Delay for retrying enable and disable in msec
private static final int ENABLE_DISABLE_DELAY_MS = 300;
- private static final int DELAY_BEFORE_RESTART_DUE_TO_INIT_FLAGS_CHANGED_MS = 300;
- private static final int DELAY_FOR_RETRY_INIT_FLAG_CHECK_MS = 86400000;
private static final int MESSAGE_ENABLE = 1;
@VisibleForTesting
@@ -163,7 +156,6 @@
private static final int MESSAGE_ADD_PROXY_DELAYED = 400;
private static final int MESSAGE_BIND_PROFILE_SERVICE = 401;
private static final int MESSAGE_RESTORE_USER_SETTING = 500;
- private static final int MESSAGE_INIT_FLAGS_CHANGED = 600;
private static final int RESTORE_SETTING_TO_ON = 1;
private static final int RESTORE_SETTING_TO_OFF = 0;
@@ -202,36 +194,37 @@
// Locks are not provided for mName and mAddress.
// They are accessed in handler or broadcast receiver, same thread context.
- private String mAddress;
- private String mName;
+ private String mAddress = null;
+ private String mName = null;
private final ContentResolver mContentResolver;
- private final RemoteCallbackList<IBluetoothManagerCallback> mCallbacks;
- private final RemoteCallbackList<IBluetoothStateChangeCallback> mStateChangeCallbacks;
- private IBinder mBluetoothBinder;
+ private final RemoteCallbackList<IBluetoothManagerCallback> mCallbacks =
+ new RemoteCallbackList<IBluetoothManagerCallback>();
+ private final RemoteCallbackList<IBluetoothStateChangeCallback> mStateChangeCallbacks =
+ new RemoteCallbackList<IBluetoothStateChangeCallback>();
+ private IBinder mBluetoothBinder = null;
private final BluetoothServiceBinder mBinder;
private final ReentrantReadWriteLock mBluetoothLock = new ReentrantReadWriteLock();
- @GuardedBy("mBluetoothLock")
- private IBluetooth mBluetooth;
- private IBluetoothGatt mBluetoothGatt;
- private boolean mBinding;
- private boolean mUnbinding;
+ @GuardedBy("mBluetoothLock")
+ private IBluetooth mBluetooth = null;
+
+ private IBluetoothGatt mBluetoothGatt = null;
+ private boolean mBinding = false;
+ private boolean mUnbinding = false;
private List<Integer> mSupportedProfileList = new ArrayList<>();
private BluetoothModeChangeHelper mBluetoothModeChangeHelper;
private BluetoothAirplaneModeListener mBluetoothAirplaneModeListener;
- private BluetoothDeviceConfigListener mBluetoothDeviceConfigListener;
-
private BluetoothNotificationManager mBluetoothNotificationManager;
private BluetoothSatelliteModeListener mBluetoothSatelliteModeListener;
// used inside handler thread
private boolean mQuietEnable = false;
- private boolean mEnable;
+ private boolean mEnable = false;
private boolean mShutdownInProgress = false;
private static String timeToLog(long timestamp) {
@@ -268,24 +261,25 @@
private final LinkedList<ActiveLog> mActiveLogs = new LinkedList<>();
private final LinkedList<Long> mCrashTimestamps = new LinkedList<>();
- private int mCrashes;
+ private int mCrashes = 0;
private long mLastEnabledTime;
// configuration from external IBinder call which is used to
// synchronize with broadcast receiver.
- private boolean mQuietEnableExternal;
- private boolean mEnableExternal;
+ private boolean mQuietEnableExternal = false;
+ private boolean mEnableExternal = false;
// Map of apps registered to keep BLE scanning on.
private Map<IBinder, ClientDeathRecipient> mBleApps =
new ConcurrentHashMap<IBinder, ClientDeathRecipient>();
- private int mState;
- private final HandlerThread mBluetoothHandlerThread;
- private final BluetoothHandler mHandler;
- private int mErrorRecoveryRetryCounter;
+ private int mState = BluetoothAdapter.STATE_OFF;
+ private final HandlerThread mBluetoothHandlerThread =
+ BluetoothServerProxy.getInstance().createHandlerThread("BluetoothManagerService");
+ @VisibleForTesting private final BluetoothHandler mHandler;
+ private int mErrorRecoveryRetryCounter = 0;
- private boolean mIsHearingAidProfileSupported;
+ private final boolean mIsHearingAidProfileSupported;
// Save a ProfileServiceConnections object for each of the bound
// bluetooth profile services
@@ -322,11 +316,6 @@
}
}
- @VisibleForTesting
- public void onInitFlagsChanged() {
- // TODO(b/265386284)
- }
-
boolean onFactoryReset(AttributionSource source) {
// Wait for stable state if bluetooth is temporary state.
int state = getState();
@@ -601,17 +590,6 @@
mHandler.sendMessage(msg);
}
}
- } else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)
- || BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED.equals(action)
- || BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED.equals(action)) {
- final int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
- BluetoothProfile.STATE_CONNECTED);
- if (mHandler.hasMessages(MESSAGE_INIT_FLAGS_CHANGED)
- && state == BluetoothProfile.STATE_DISCONNECTED
- && !mBluetoothModeChangeHelper.isMediaProfileConnected()) {
- Log.i(TAG, "Device disconnected, reactivating pending flag changes");
- onInitFlagsChanged();
- }
} else if (action.equals(Intent.ACTION_SHUTDOWN)) {
Log.i(TAG, "Device is shutting down.");
mShutdownInProgress = true;
@@ -641,32 +619,14 @@
"UserManager system service cannot be null");
mBinder = new BluetoothServiceBinder(this, context, mUserManager);
- mBluetoothHandlerThread = BluetoothServerProxy.getInstance()
- .createHandlerThread("BluetoothManagerService");
mBluetoothHandlerThread.start();
-
mHandler = BluetoothServerProxy.getInstance().newBluetoothHandler(
new BluetoothHandler(mBluetoothHandlerThread.getLooper()));
- mCrashes = 0;
- mBluetooth = null;
- mBluetoothBinder = null;
- mBluetoothGatt = null;
- mBinding = false;
- mUnbinding = false;
- mEnable = false;
- mState = BluetoothAdapter.STATE_OFF;
- mQuietEnableExternal = false;
- mEnableExternal = false;
- mAddress = null;
- mName = null;
- mErrorRecoveryRetryCounter = 0;
mContentResolver = context.getContentResolver();
// Observe BLE scan only mode settings change.
registerForBleScanModeChange();
- mCallbacks = new RemoteCallbackList<IBluetoothManagerCallback>();
- mStateChangeCallbacks = new RemoteCallbackList<IBluetoothStateChangeCallback>();
mBluetoothNotificationManager = new BluetoothNotificationManager(mContext);
@@ -685,24 +645,10 @@
.orElse(isAshaEnabledByDefault);
}
- String value = SystemProperties.get(
- "persist.sys.fflag.override.settings_bluetooth_hearing_aid");
-
- if (!TextUtils.isEmpty(value)) {
- boolean isHearingAidEnabled = Boolean.parseBoolean(value);
- Log.v(TAG, "set feature flag HEARING_AID_SETTINGS to " + isHearingAidEnabled);
- if (isHearingAidEnabled && !mIsHearingAidProfileSupported) {
- // Overwrite to enable support by FeatureFlag
- mIsHearingAidProfileSupported = true;
- }
- }
-
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED);
filter.addAction(Intent.ACTION_SETTING_RESTORED);
- filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
- filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(Intent.ACTION_SHUTDOWN);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
mContext.registerReceiver(mReceiver, filter);
@@ -1158,35 +1104,6 @@
return mIsHearingAidProfileSupported;
}
- private boolean isDeviceProvisioned() {
- return Settings.Global.getInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED,
- 0) != 0;
- }
-
- // Monitor change of BLE scan only mode settings.
- private void registerForProvisioningStateChange() {
- ContentObserver contentObserver = new ContentObserver(null) {
- @Override
- public void onChange(boolean selfChange) {
- if (!isDeviceProvisioned()) {
- if (DBG) {
- Log.d(TAG, "DEVICE_PROVISIONED setting changed, but device is not "
- + "provisioned");
- }
- return;
- }
- if (mHandler.hasMessages(MESSAGE_INIT_FLAGS_CHANGED)) {
- Log.i(TAG, "Device provisioned, reactivating pending flag changes");
- onInitFlagsChanged();
- }
- }
- };
-
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), false,
- contentObserver);
- }
-
// Monitor change of BLE scan only mode settings.
private void registerForBleScanModeChange() {
ContentObserver contentObserver = new ContentObserver(null) {
@@ -1658,8 +1575,6 @@
if (mBluetoothAirplaneModeListener != null) {
mBluetoothAirplaneModeListener.start(mBluetoothModeChangeHelper);
}
- registerForProvisioningStateChange();
- mBluetoothDeviceConfigListener = new BluetoothDeviceConfigListener(this, DBG);
loadApmEnhancementStateFromResource();
}
@@ -1671,9 +1586,7 @@
mBluetoothModeChangeHelper = bluetoothModeChangeHelper;
}
- /**
- * Load whether APM Enhancement feature should be enabled from overlay
- */
+ /** Load whether APM Enhancement feature should be enabled from overlay */
@VisibleForTesting
void loadApmEnhancementStateFromResource() {
String btPackageName = mBluetoothModeChangeHelper.getBluetoothPackageName();
@@ -1682,20 +1595,21 @@
return;
}
try {
- Resources resources = mContext.getPackageManager()
- .getResourcesForApplication(btPackageName);
- int apmEnhancement = resources.getIdentifier("config_bluetooth_apm_enhancement_enabled",
- "bool", btPackageName);
- Settings.Global.putInt(mContext.getContentResolver(),
- APM_ENHANCEMENT, resources.getBoolean(apmEnhancement) ? 1 : 0);
+ Resources resources =
+ mContext.getPackageManager().getResourcesForApplication(btPackageName);
+ int apmEnhancement =
+ resources.getIdentifier(
+ "config_bluetooth_apm_enhancement_enabled", "bool", btPackageName);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ APM_ENHANCEMENT,
+ resources.getBoolean(apmEnhancement) ? 1 : 0);
} catch (Exception e) {
Log.e(TAG, "Unable to set whether APM enhancement should be enabled");
}
}
- /**
- * Called when switching to a different foreground user.
- */
+ /** Called when switching to a different foreground user. */
void handleSwitchUser(UserHandle userHandle) {
if (DBG) {
Log.d(TAG, "User " + userHandle + " switched");
@@ -1712,8 +1626,8 @@
}
/**
- * This class manages the clients connected to a given ProfileService
- * and maintains the connection with that service.
+ * This class manages the clients connected to a given ProfileService and maintains the
+ * connection with that service.
*/
private final class ProfileServiceConnections
implements ServiceConnection, IBinder.DeathRecipient {
@@ -2545,36 +2459,6 @@
}
break;
}
- case MESSAGE_INIT_FLAGS_CHANGED: {
- if (DBG) {
- Log.d(TAG, "MESSAGE_INIT_FLAGS_CHANGED");
- }
- mHandler.removeMessages(MESSAGE_INIT_FLAGS_CHANGED);
- if (mBluetoothModeChangeHelper.isMediaProfileConnected()) {
- Log.i(TAG, "Delaying MESSAGE_INIT_FLAGS_CHANGED by "
- + DELAY_FOR_RETRY_INIT_FLAG_CHECK_MS
- + " ms due to existing connections");
- mHandler.sendEmptyMessageDelayed(
- MESSAGE_INIT_FLAGS_CHANGED,
- DELAY_FOR_RETRY_INIT_FLAG_CHECK_MS);
- break;
- }
- if (!isDeviceProvisioned()) {
- Log.i(TAG, "Delaying MESSAGE_INIT_FLAGS_CHANGED by "
- + DELAY_FOR_RETRY_INIT_FLAG_CHECK_MS
- + "ms because device is not provisioned");
- mHandler.sendEmptyMessageDelayed(
- MESSAGE_INIT_FLAGS_CHANGED,
- DELAY_FOR_RETRY_INIT_FLAG_CHECK_MS);
- break;
- }
- if (mBluetooth != null && isEnabled()) {
- Log.i(TAG, "Restarting Bluetooth due to init flag change");
- restartForReason(
- BluetoothProtoEnums.ENABLE_DISABLE_REASON_INIT_FLAGS_CHANGED);
- }
- break;
- }
}
}
diff --git a/service/tests/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTrackerTest.java b/service/tests/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTrackerTest.java
deleted file mode 100644
index 9eaffc1..0000000
--- a/service/tests/src/com/android/server/bluetooth/BluetoothDeviceConfigChangeTrackerTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.bluetooth;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.provider.DeviceConfig;
-import android.provider.DeviceConfig.Properties;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class BluetoothDeviceConfigChangeTrackerTest {
- @Test
- public void testNoProperties() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH).build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH).build());
-
- assertThat(shouldRestart).isFalse();
- }
-
- @Test
- public void testNewFlag() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .setString("INIT_b", "true")
- .build());
-
- assertThat(shouldRestart).isTrue();
- }
-
- @Test
- public void testChangedFlag() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "false")
- .build());
-
- assertThat(shouldRestart).isTrue();
- }
-
- @Test
- public void testUnchangedInitFlag() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- assertThat(shouldRestart).isFalse();
- }
-
- @Test
- public void testRepeatedChangeInitFlag() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH).build());
-
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .build());
-
- assertThat(shouldRestart).isFalse();
- }
-
- @Test
- public void testWrongNamespace() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH).build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder("another_namespace")
- .setString("INIT_a", "true")
- .build());
-
- assertThat(shouldRestart).isFalse();
- }
-
- @Test
- public void testSkipProperty() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_a", "true")
- .setString("INIT_b", "false")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("INIT_b", "false")
- .build());
-
- assertThat(shouldRestart).isFalse();
- }
-
- @Test
- public void testNonInitFlag() {
- BluetoothDeviceConfigChangeTracker changeTracker =
- new BluetoothDeviceConfigChangeTracker(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("a", "true")
- .build());
-
- boolean shouldRestart =
- changeTracker.shouldRestartWhenPropertiesUpdated(
- new Properties.Builder(DeviceConfig.NAMESPACE_BLUETOOTH)
- .setString("a", "false")
- .build());
-
- assertThat(shouldRestart).isFalse();
- }
-}
diff --git a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java
index a8eb5a1..c802683 100644
--- a/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java
+++ b/service/tests/src/com/android/server/bluetooth/BluetoothManagerServiceTest.java
@@ -49,17 +49,17 @@
static int sTimeout = 3000;
BluetoothManagerService mManagerService;
Context mContext;
- @Mock
- BluetoothServerProxy mBluetoothServerProxy;
- @Mock
- BluetoothManagerService.BluetoothHandler mHandler;
+ @Mock BluetoothServerProxy mBluetoothServerProxy;
+ @Mock BluetoothManagerService.BluetoothHandler mHandler;
HandlerThread mHandlerThread;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = spy(new ContextWrapper(
- InstrumentationRegistry.getInstrumentation().getTargetContext()));
+ mContext =
+ spy(
+ new ContextWrapper(
+ InstrumentationRegistry.getInstrumentation().getTargetContext()));
mHandlerThread = new HandlerThread("BluetoothManagerServiceTest");
}
@@ -69,8 +69,9 @@
}
private void createBluetoothManagerService() {
- doReturn(mock(Intent.class)).when(mContext).registerReceiverForAllUsers(any(), any(),
- eq(null), eq(null));
+ doReturn(mock(Intent.class))
+ .when(mContext)
+ .registerReceiverForAllUsers(any(), any(), eq(null), eq(null));
BluetoothServerProxy.setInstanceForTesting(mBluetoothServerProxy);
// Mock the handler to avoid handle message & to terminate the thread after
// test
@@ -78,10 +79,12 @@
doReturn(mHandler).when(mBluetoothServerProxy).newBluetoothHandler(any());
// Mock these functions so security errors won't throw
- doReturn("name").when(mBluetoothServerProxy).settingsSecureGetString(any(),
- eq(Settings.Secure.BLUETOOTH_NAME));
- doReturn("00:11:22:33:44:55").when(mBluetoothServerProxy).settingsSecureGetString(any(),
- eq(Settings.Secure.BLUETOOTH_ADDRESS));
+ doReturn("name")
+ .when(mBluetoothServerProxy)
+ .settingsSecureGetString(any(), eq(Settings.Secure.BLUETOOTH_NAME));
+ doReturn("00:11:22:33:44:55")
+ .when(mBluetoothServerProxy)
+ .settingsSecureGetString(any(), eq(Settings.Secure.BLUETOOTH_ADDRESS));
mManagerService = new BluetoothManagerService(mContext);
}
@@ -91,10 +94,12 @@
// Spy UserManager so we can mimic the case when restriction settings changed
UserManager userManager = mock(UserManager.class);
doReturn(userManager).when(mContext).getSystemService(UserManager.class);
- doReturn(true).when(userManager).hasUserRestrictionForUser(
- eq(UserManager.DISALLOW_BLUETOOTH), any());
- doReturn(false).when(userManager).hasUserRestrictionForUser(
- eq(UserManager.DISALLOW_BLUETOOTH_SHARING), any());
+ doReturn(true)
+ .when(userManager)
+ .hasUserRestrictionForUser(eq(UserManager.DISALLOW_BLUETOOTH), any());
+ doReturn(false)
+ .when(userManager)
+ .hasUserRestrictionForUser(eq(UserManager.DISALLOW_BLUETOOTH_SHARING), any());
createBluetoothManagerService();
// Check if disable message sent once for system user only
@@ -102,13 +107,13 @@
// test run on user -1, should not turning Bluetooth off
mManagerService.onUserRestrictionsChanged(UserHandle.CURRENT);
- verify(mBluetoothServerProxy, timeout(sTimeout).times(0)).handlerSendWhatMessage(mHandler,
- BluetoothManagerService.MESSAGE_DISABLE);
+ verify(mBluetoothServerProxy, timeout(sTimeout).times(0))
+ .handlerSendWhatMessage(mHandler, BluetoothManagerService.MESSAGE_DISABLE);
// called from SYSTEM user, should try to toggle Bluetooth off
mManagerService.onUserRestrictionsChanged(UserHandle.SYSTEM);
- verify(mBluetoothServerProxy, timeout(sTimeout)).handlerSendWhatMessage(mHandler,
- BluetoothManagerService.MESSAGE_DISABLE);
+ verify(mBluetoothServerProxy, timeout(sTimeout))
+ .handlerSendWhatMessage(mHandler, BluetoothManagerService.MESSAGE_DISABLE);
}
@Test
@@ -117,14 +122,17 @@
mManagerService.setBluetoothModeChangeHelper(new BluetoothModeChangeHelper(mContext));
// Change the apm enhancement enabled value to 0
- Settings.Global.putInt(mContext.getContentResolver(),
- "apm_enhancement_enabled", 0);
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- "apm_enhancement_enabled", 0)).isEqualTo(0);
+ Settings.Global.putInt(mContext.getContentResolver(), "apm_enhancement_enabled", 0);
+ assertThat(
+ Settings.Global.getInt(
+ mContext.getContentResolver(), "apm_enhancement_enabled", 0))
+ .isEqualTo(0);
// Confirm that apm enhancement enabled value has been updated to 1
mManagerService.loadApmEnhancementStateFromResource();
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- "apm_enhancement_enabled", 0)).isEqualTo(1);
+ assertThat(
+ Settings.Global.getInt(
+ mContext.getContentResolver(), "apm_enhancement_enabled", 0))
+ .isEqualTo(1);
}
}
diff --git a/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_test.py b/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_test.py
index db91860..2fc1025 100644
--- a/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_test.py
+++ b/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_test.py
@@ -63,6 +63,10 @@
default_timeout = 10
default_discovery_timeout = 3
+ ADDR_TYPE_PUBLIC = 0
+ ADDR_TYPE_RPA = 1
+ ADDR_TYPE_NRPA = 2
+
def setup_class(self):
super().setup_class()
self.central = self.dut
@@ -265,7 +269,7 @@
self.gatt_server_list.append(gatt_server)
autoconnect = False
mac_address, adv_callback, scan_callback = (get_mac_address_of_generic_advertisement(
- self.central, self.peripheral))
+ self.central, self.peripheral, self.ADDR_TYPE_PUBLIC))
self.adv_instances.append(adv_callback)
self.central.log.info("Discovered BLE advertisement, connecting GATT with autoConnect={}".format(autoconnect))
try:
@@ -292,8 +296,9 @@
return
autoconnect = True
self.central.log.info("Connecting GATT with autoConnect={}".format(autoconnect))
- bluetooth_gatt = self.central.sl4a.gattClientConnectGatt(
- gatt_callback, mac_address, autoconnect, GattTransport.TRANSPORT_AUTO, False, GattPhyMask.PHY_LE_1M_MASK)
+ bluetooth_gatt = self.central.sl4a.gattClientConnectGatt(gatt_callback, mac_address, autoconnect,
+ GattTransport.TRANSPORT_LE, False,
+ GattPhyMask.PHY_LE_1M_MASK)
self.central.log.info("Waiting for GATt to become connected")
self.bluetooth_gatt_list.append(bluetooth_gatt)
expected_event = GattCallbackString.GATT_CONN_CHANGE.format(gatt_callback)
@@ -344,8 +349,11 @@
self.central, self.peripheral))
# Make GATT connection 1
try:
- bluetooth_gatt_1, gatt_callback_1 = setup_gatt_connection(
- self.central, mac_address, False, transport=GattTransport.TRANSPORT_AUTO, opportunistic=False)
+ bluetooth_gatt_1, gatt_callback_1 = setup_gatt_connection(self.central,
+ mac_address,
+ False,
+ transport=GattTransport.TRANSPORT_AUTO,
+ opportunistic=False)
self.central.sl4a.bleStopBleScan(scan_callback)
self.adv_instances.append(adv_callback)
self.bluetooth_gatt_list.append(bluetooth_gatt_1)
@@ -355,8 +363,11 @@
return
# Make GATT connection 2
try:
- bluetooth_gatt_2, gatt_callback_2 = setup_gatt_connection(
- self.central, mac_address, False, transport=GattTransport.TRANSPORT_AUTO, opportunistic=True)
+ bluetooth_gatt_2, gatt_callback_2 = setup_gatt_connection(self.central,
+ mac_address,
+ False,
+ transport=GattTransport.TRANSPORT_AUTO,
+ opportunistic=True)
self.bluetooth_gatt_list.append(bluetooth_gatt_2)
except GattTestUtilsError as err:
logging.error(err)
@@ -378,96 +389,6 @@
if bluetooth_gatt_2 in self.bluetooth_gatt_list:
self.bluetooth_gatt_list.remove(bluetooth_gatt_2)
- @test_tracker_info(uuid='1e01838e-c4de-4720-9adf-9e0419378226')
- def test_gatt_request_min_mtu(self):
- """Test GATT connection over LE and exercise MTU sizes.
-
- Test establishing a gatt connection between a GATT server and GATT
- client. Request an MTU size that matches the correct minimum size.
-
- Steps:
- 1. Start a generic advertisement.
- 2. Start a generic scanner.
- 3. Find the advertisement and extract the mac address.
- 4. Stop the first scanner.
- 5. Create a GATT connection between the scanner and advertiser.
- 6. From the scanner (client) request MTU size change to the
- minimum value.
- 7. Find the MTU changed event on the client.
- 8. Disconnect the GATT connection.
-
- Expected Result:
- Verify that a connection was established and the MTU value found
- matches the expected MTU value.
-
- Returns:
- Pass if True
- Fail if False
-
- TAGS: LE, Advertising, Filtering, Scanning, GATT, MTU
- Priority: 0
- """
- gatt_server_cb = self.peripheral.sl4a.gattServerCreateGattServerCallback()
- gatt_server = self.peripheral.sl4a.gattServerOpenGattServer(gatt_server_cb)
- self.gatt_server_list.append(gatt_server)
- try:
- bluetooth_gatt, gatt_callback, adv_callback = (orchestrate_gatt_connection(self.central, self.peripheral))
- self.bluetooth_gatt_list.append(bluetooth_gatt)
- except GattTestUtilsError as err:
- logging.error(err)
- asserts.fail("Failed to connect to GATT, error: {}".format(err))
- return
- self.adv_instances.append(adv_callback)
- expected_mtu = GattMtuSize.MIN
- self.central.sl4a.gattClientRequestMtu(bluetooth_gatt, expected_mtu)
- assertThat(self._verify_mtu_changed_on_client_and_server(expected_mtu, gatt_callback, gatt_server_cb)).isTrue()
- assertThat(self._orchestrate_gatt_disconnection(bluetooth_gatt, gatt_callback)).isTrue()
-
- @test_tracker_info(uuid='c1fa3a2d-fb47-47db-bdd1-458928cd6a5f')
- def test_gatt_request_max_mtu(self):
- """Test GATT connection over LE and exercise MTU sizes.
-
- Test establishing a gatt connection between a GATT server and GATT
- client. Request an MTU size that matches the correct maximum size.
-
- Steps:
- 1. Start a generic advertisement.
- 2. Start a generic scanner.
- 3. Find the advertisement and extract the mac address.
- 4. Stop the first scanner.
- 5. Create a GATT connection between the scanner and advertiser.
- 6. From the scanner (client) request MTU size change to the
- maximum value.
- 7. Find the MTU changed event on the client.
- 8. Disconnect the GATT connection.
-
- Expected Result:
- Verify that a connection was established and the MTU value found
- matches the expected MTU value.
-
- Returns:
- Pass if True
- Fail if False
-
- TAGS: LE, Advertising, Filtering, Scanning, GATT, MTU
- Priority: 0
- """
- gatt_server_cb = self.peripheral.sl4a.gattServerCreateGattServerCallback()
- gatt_server = self.peripheral.sl4a.gattServerOpenGattServer(gatt_server_cb)
- self.gatt_server_list.append(gatt_server)
- try:
- bluetooth_gatt, gatt_callback, adv_callback = (orchestrate_gatt_connection(self.central, self.peripheral))
- self.bluetooth_gatt_list.append(bluetooth_gatt)
- except GattTestUtilsError as err:
- logging.error(err)
- asserts.fail("Failed to connect to GATT, error: {}".format(err))
- return
- self.adv_instances.append(adv_callback)
- expected_mtu = GattMtuSize.MAX
- self.central.sl4a.gattClientRequestMtu(bluetooth_gatt, expected_mtu)
- assertThat(self._verify_mtu_changed_on_client_and_server(expected_mtu, gatt_callback, gatt_server_cb)).isTrue()
- assertThat(self._orchestrate_gatt_disconnection(bluetooth_gatt, gatt_callback)).isTrue()
-
@test_tracker_info(uuid='4416d483-dec3-46cb-8038-4d82620f873a')
def test_gatt_request_out_of_bounds_mtu(self):
"""Test GATT connection over LE and exercise an out of bound MTU size.
@@ -933,7 +854,8 @@
conn_cen_devices = self.central.sl4a.bluetoothGetConnectedLeDevices(BluetoothProfile.GATT)
conn_per_devices = self.peripheral.sl4a.bluetoothGetConnectedLeDevices(BluetoothProfile.GATT_SERVER)
target_name = self.peripheral.sl4a.bluetoothGetLocalName()
- error_message = ("Connected device {} not found in list of connected " "devices {}")
+ error_message = ("Connected device {} not found in list of connected "
+ "devices {}")
if not any(d['name'] == target_name for d in conn_cen_devices):
logging.error(error_message.format(target_name, conn_cen_devices))
asserts.fail(error_message.format(target_name, conn_cen_devices))
diff --git a/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_with_irk_test.py b/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_with_irk_test.py
index eab98fe..eb96468 100644
--- a/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_with_irk_test.py
+++ b/system/blueberry/tests/sl4a_sl4a/gatt/gatt_connect_with_irk_test.py
@@ -111,8 +111,8 @@
# Set up SL4A DUT side to scan
addr_type = ble_address_types["public"]
- logging.info("Start scanning for PUBLIC_ADDRESS %s with address type %d and IRK %s" % (cert_public_address,
- addr_type, irk))
+ logging.info("Start scanning for PUBLIC_ADDRESS %s with address type %d and IRK %s" %
+ (cert_public_address, addr_type, irk))
self.dut.sl4a.bleSetScanSettingsScanMode(ble_scan_settings_modes['low_latency'])
self.dut.sl4a.bleSetScanSettingsLegacy(False)
filter_list, scan_settings, scan_callback = generate_ble_scan_objects(self.dut.sl4a)
@@ -129,8 +129,7 @@
assertThat(mac_address).isNotNone()
logging.info("Filter advertisement with address {}".format(mac_address))
- # Stop scanning and try to connect GATT
- self.dut.sl4a.bleStopBleScan(scan_callback)
+ # Try to connect GATT
gatt_callback = self.dut.sl4a.gattCreateGattCallback()
bluetooth_gatt = self.dut.sl4a.gattClientConnectGatt(gatt_callback, mac_address, False,
GattTransport.TRANSPORT_LE, False, None)
@@ -142,6 +141,7 @@
# Test over
self.cert.sl4a.bleStopBleAdvertising(advertise_callback)
+ self.dut.sl4a.bleStopBleScan(scan_callback)
if __name__ == '__main__':
diff --git a/system/blueberry/tests/sl4a_sl4a/security/irk_rotation_test.py b/system/blueberry/tests/sl4a_sl4a/security/irk_rotation_test.py
index 9061f13..40ab025 100644
--- a/system/blueberry/tests/sl4a_sl4a/security/irk_rotation_test.py
+++ b/system/blueberry/tests/sl4a_sl4a/security/irk_rotation_test.py
@@ -90,7 +90,7 @@
return address, irk
- def test_le_reconnect_after_irk_rotation_cert_privacy_enabled(self):
+ def __test_le_reconnect_after_irk_rotation_cert_privacy_enabled(self):
self._test_le_reconnect_after_irk_rotation(True)
def test_le_reconnect_after_irk_rotation_cert_privacy_disabled(self):
diff --git a/system/blueberry/utils/bt_test_utils.py b/system/blueberry/utils/bt_test_utils.py
index c1948e7..414be14 100644
--- a/system/blueberry/utils/bt_test_utils.py
+++ b/system/blueberry/utils/bt_test_utils.py
@@ -206,12 +206,13 @@
wf.close()
-def get_mac_address_of_generic_advertisement(scan_device, adv_device):
+def get_mac_address_of_generic_advertisement(scan_device, adv_device, adv_addr_type=None):
"""Start generic advertisement and get it's mac address by LE scanning.
Args:
scan_ad: The Android device to use as the scanner.
adv_device: The Android device to use as the advertiser.
+ adv_addr_type: The address type for the advertiser (refer to AdvertiseSettings.java)
Returns:
mac_address: The mac address of the advertisement.
@@ -222,6 +223,10 @@
adv_device.sl4a.bleSetAdvertiseSettingsAdvertiseMode(ble_advertise_settings_modes['low_latency'])
adv_device.sl4a.bleSetAdvertiseSettingsIsConnectable(True)
adv_device.sl4a.bleSetAdvertiseSettingsTxPowerLevel(ble_advertise_settings_tx_powers['high'])
+
+ if adv_addr_type is not None:
+ adv_device.sl4a.bleSetAdvertiseSettingsOwnAddressType(adv_addr_type)
+
advertise_callback, advertise_data, advertise_settings = (generate_ble_advertise_objects(adv_device.sl4a))
adv_device.sl4a.bleStartBleAdvertising(advertise_callback, advertise_data, advertise_settings)
try:
diff --git a/system/bta/Android.bp b/system/bta/Android.bp
index d05fb13..26ca647 100644
--- a/system/bta/Android.bp
+++ b/system/bta/Android.bp
@@ -202,6 +202,7 @@
":LegacyStackSdp",
":TestCommonLogMsg",
":TestCommonMockFunctions",
+ ":TestFakeOsi",
":TestMockBtif",
":TestMockMainShim",
":TestMockStackBtm",
@@ -237,7 +238,6 @@
"libchrome",
"libcom.android.sysprop.bluetooth",
"libgmock",
- "libosi",
],
data: [
":audio_set_configurations_bfbs",
@@ -302,16 +302,31 @@
"BluetoothGeneratedPackets_h",
],
srcs: [
+ ":LegacyStackSdp",
":OsiCompatSources",
":TestCommonLogMsg",
":TestCommonMainHandler",
":TestCommonMockFunctions",
+ ":TestFakeOsi",
":TestMockBtaSdp",
":TestMockBtif",
":TestMockDevice",
":TestMockMainShim",
- ":TestMockOsi",
- ":TestMockStack",
+ ":TestMockSrvcDis",
+ ":TestMockStackA2dp",
+ ":TestMockStackAcl",
+ ":TestMockStackAvct",
+ ":TestMockStackAvdt",
+ ":TestMockStackAvrc",
+ ":TestMockStackBtm",
+ ":TestMockStackCryptotoolbox",
+ ":TestMockStackGap",
+ ":TestMockStackGatt",
+ ":TestMockStackHid",
+ ":TestMockStackL2cap",
+ ":TestMockStackMetrics",
+ ":TestMockStackPan",
+ ":TestMockStackRfcomm",
"ar/bta_ar.cc",
"av/bta_av_aact.cc",
"av/bta_av_act.cc",
@@ -356,6 +371,7 @@
"sys/utl.cc",
"test/bta_api_test.cc",
"test/bta_av_test.cc",
+ "test/bta_dm_cust_uuid_test.cc",
"test/bta_dm_test.cc",
"test/bta_gatt_test.cc",
"test/bta_hf_client_add_record_test.cc",
diff --git a/system/bta/ag/bta_ag_act.cc b/system/bta/ag/bta_ag_act.cc
index b8a8a24..25a7e53 100644
--- a/system/bta/ag/bta_ag_act.cc
+++ b/system/bta/ag/bta_ag_act.cc
@@ -40,8 +40,11 @@
#include "osi/include/osi.h" // UNUSED_ATTR
#include "stack/include/l2c_api.h"
#include "stack/include/port_api.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
/*****************************************************************************
* Constants
****************************************************************************/
@@ -880,7 +883,8 @@
UNUSED_ATTR const tBTA_AG_DATA& data) {
/* Cancel SDP if it had been started. */
if (p_scb->p_disc_db) {
- SDP_CancelServiceSearch(p_scb->p_disc_db);
+ get_legacy_stack_sdp_api()->service.SDP_CancelServiceSearch(
+ p_scb->p_disc_db);
bta_ag_free_db(p_scb, tBTA_AG_DATA::kEmpty);
}
diff --git a/system/bta/ag/bta_ag_sdp.cc b/system/bta/ag/bta_ag_sdp.cc
index 956335c..fa8b033 100644
--- a/system/bta/ag/bta_ag_sdp.cc
+++ b/system/bta/ag/bta_ag_sdp.cc
@@ -40,8 +40,10 @@
#include "stack/include/btm_api.h"
#include "stack/include/btu.h" // do_in_main_thread
#include "stack/include/port_api.h"
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
+using namespace bluetooth::legacy::stack::sdp;
using bluetooth::Uuid;
/* Number of protocol elements in protocol element list. */
@@ -155,14 +157,14 @@
proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM;
proto_elem_list[1].num_params = 1;
proto_elem_list[1].params[0] = scn;
- result &=
- SDP_AddProtocolList(sdp_handle, BTA_AG_NUM_PROTO_ELEMS, proto_elem_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
+ sdp_handle, BTA_AG_NUM_PROTO_ELEMS, proto_elem_list);
/* add service class id list */
svc_class_id_list[0] = service_uuid;
svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO;
- result &= SDP_AddServiceClassIdList(sdp_handle, BTA_AG_NUM_SVC_ELEMS,
- svc_class_id_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
+ sdp_handle, BTA_AG_NUM_SVC_ELEMS, svc_class_id_list);
/* add profile descriptor list */
if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) {
@@ -176,11 +178,12 @@
profile_uuid = UUID_SERVCLASS_HEADSET;
version = HSP_VERSION_1_2;
}
- result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
+ sdp_handle, profile_uuid, version);
/* add service name */
if (p_service_name != nullptr && p_service_name[0] != 0) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_service_name) + 1), (uint8_t*)p_service_name);
}
@@ -188,8 +191,9 @@
/* add features and network */
if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) {
network = (features & BTA_AG_FEAT_REJECT) ? 1 : 0;
- result &= SDP_AddAttribute(sdp_handle, ATTR_ID_DATA_STORES_OR_NETWORK,
- UINT_DESC_TYPE, 1, &network);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_DATA_STORES_OR_NETWORK, UINT_DESC_TYPE, 1,
+ &network);
// check property for SWB support
if (hfp_hal_interface::get_swb_supported()) {
@@ -206,13 +210,13 @@
if (swb_supported) features |= BTA_AG_FEAT_SWB_SUPPORT;
UINT16_TO_BE_FIELD(buf, features);
- result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, 2, buf);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf);
}
/* add browse group list */
- result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
- browse_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
return result;
}
@@ -237,7 +241,8 @@
if (services & 1) {
/* add sdp record if not already registered */
if (bta_ag_cb.profile[i].sdp_handle == 0) {
- bta_ag_cb.profile[i].sdp_handle = SDP_CreateRecord();
+ bta_ag_cb.profile[i].sdp_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
bta_ag_cb.profile[i].scn = BTM_AllocateSCN();
bta_ag_add_record(bta_ag_uuid[i], data.api_register.p_name[i],
bta_ag_cb.profile[i].scn, data.api_register.features,
@@ -284,7 +289,8 @@
if (((services & 1) == 1) && ((others & 1) == 0)) {
APPL_TRACE_DEBUG("bta_ag_del_records %d", i);
if (bta_ag_cb.profile[i].sdp_handle != 0) {
- SDP_DeleteRecord(bta_ag_cb.profile[i].sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ bta_ag_cb.profile[i].sdp_handle);
bta_ag_cb.profile[i].sdp_handle = 0;
}
BTM_FreeSCN(bta_ag_cb.profile[i].scn);
@@ -328,13 +334,15 @@
/* loop through all records we found */
while (true) {
/* get next record; if none found, we're done */
- p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(p_scb->p_disc_db,
+ uuid, p_rec);
if (p_rec == nullptr) {
if (uuid == UUID_SERVCLASS_HEADSET_HS) {
/* Search again in case the peer device uses the old HSP UUID */
uuid = UUID_SERVCLASS_HEADSET;
p_scb->peer_version = HSP_VERSION_1_0;
- p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_scb->p_disc_db, uuid, p_rec);
if (p_rec == nullptr) {
break;
}
@@ -344,7 +352,8 @@
/* get scn from proto desc list if initiator */
if (p_scb->role == BTA_AG_INT) {
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
p_scb->peer_scn = (uint8_t)pe.params[0];
} else {
continue;
@@ -353,7 +362,8 @@
/* get profile version (if failure, version parameter is not updated) */
uint16_t peer_version = HFP_HSP_VERSION_UNKNOWN;
- if (!SDP_FindProfileVersionInRec(p_rec, uuid, &peer_version)) {
+ if (!get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, uuid, &peer_version)) {
APPL_TRACE_WARNING("%s: Get peer_version failed, using default 0x%04x",
__func__, p_scb->peer_version);
peer_version = p_scb->peer_version;
@@ -373,7 +383,8 @@
}
}
/* get features if HFP */
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr != nullptr) {
/* Found attribute. Get value. */
/* There might be race condition between SDP and BRSF. */
@@ -415,8 +426,8 @@
/* No peer version caching for HSP, use discovered one directly */
p_scb->peer_version = peer_version;
/* get features if HSP */
- p_attr =
- SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL);
if (p_attr != nullptr) {
/* Remote volume control of HSP */
if (p_attr->attr_value.v.u8)
@@ -506,9 +517,10 @@
/* allocate buffer for sdp database */
p_scb->p_disc_db = (tSDP_DISCOVERY_DB*)osi_malloc(BTA_AG_DISC_BUF_SIZE);
/* set up service discovery database; attr happens to be attr_list len */
- if (SDP_InitDiscoveryDb(p_scb->p_disc_db, BTA_AG_DISC_BUF_SIZE, num_uuid,
- uuid_list, num_attr, attr_list)) {
- if (SDP_ServiceSearchAttributeRequest(
+ if (get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ p_scb->p_disc_db, BTA_AG_DISC_BUF_SIZE, num_uuid, uuid_list, num_attr,
+ attr_list)) {
+ if (get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest(
p_scb->peer_addr, p_scb->p_disc_db,
bta_ag_sdp_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1])) {
return;
diff --git a/system/bta/ar/bta_ar.cc b/system/bta/ar/bta_ar.cc
index ea6108f..c122fc2 100644
--- a/system/bta/ar/bta_ar.cc
+++ b/system/bta/ar/bta_ar.cc
@@ -28,8 +28,11 @@
#include "bta/sys/bta_sys.h"
#include "stack/include/avct_api.h"
#include "stack/include/avrc_api.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
/* AV control block */
tBTA_AR_CB bta_ar_cb;
@@ -167,7 +170,8 @@
if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET) {
if (bta_ar_cb.sdp_tg_handle == 0) {
bta_ar_cb.tg_registered = mask;
- bta_ar_cb.sdp_tg_handle = SDP_CreateRecord();
+ bta_ar_cb.sdp_tg_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
AVRC_AddRecord(service_uuid, service_name, provider_name, categories,
bta_ar_cb.sdp_tg_handle, browse_supported,
profile_version, 0);
@@ -180,7 +184,8 @@
bta_ar_cb.ct_categories[mask - 1] = categories;
categories = bta_ar_cb.ct_categories[0] | bta_ar_cb.ct_categories[1];
if (bta_ar_cb.sdp_ct_handle == 0) {
- bta_ar_cb.sdp_ct_handle = SDP_CreateRecord();
+ bta_ar_cb.sdp_ct_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
AVRC_AddRecord(service_uuid, service_name, provider_name, categories,
bta_ar_cb.sdp_ct_handle, browse_supported,
profile_version, 0);
@@ -190,8 +195,9 @@
* Change supported categories on the second one */
p = temp;
UINT16_TO_BE_STREAM(p, categories);
- SDP_AddAttribute(bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, (uint32_t)2, (uint8_t*)temp);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE,
+ (uint32_t)2, (uint8_t*)temp);
}
}
}
@@ -214,7 +220,8 @@
if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET) {
if (bta_ar_cb.sdp_tg_handle && mask == bta_ar_cb.tg_registered) {
bta_ar_cb.tg_registered = 0;
- SDP_DeleteRecord(bta_ar_cb.sdp_tg_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ bta_ar_cb.sdp_tg_handle);
bta_ar_cb.sdp_tg_handle = 0;
bta_sys_remove_uuid(service_uuid);
}
@@ -224,15 +231,17 @@
categories = bta_ar_cb.ct_categories[0] | bta_ar_cb.ct_categories[1];
if (!categories) {
/* no CT is still registered - cleaup */
- SDP_DeleteRecord(bta_ar_cb.sdp_ct_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ bta_ar_cb.sdp_ct_handle);
bta_ar_cb.sdp_ct_handle = 0;
bta_sys_remove_uuid(service_uuid);
} else {
/* change supported categories to the remaning one */
p = temp;
UINT16_TO_BE_STREAM(p, categories);
- SDP_AddAttribute(bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, (uint32_t)2, (uint8_t*)temp);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE,
+ (uint32_t)2, (uint8_t*)temp);
}
}
}
diff --git a/system/bta/av/bta_av_act.cc b/system/bta/av/bta_av_act.cc
index 8711e6e..a2fbf43 100644
--- a/system/bta/av/bta_av_act.cc
+++ b/system/bta/av/bta_av_act.cc
@@ -40,8 +40,11 @@
#include "stack/include/acl_api.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/l2c_api.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
/*****************************************************************************
* Constants
****************************************************************************/
@@ -169,7 +172,7 @@
******************************************************************************/
static void bta_av_del_sdp_rec(uint32_t* p_sdp_handle) {
if (*p_sdp_handle != 0) {
- SDP_DeleteRecord(*p_sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(*p_sdp_handle);
*p_sdp_handle = 0;
}
}
@@ -1661,12 +1664,13 @@
tSDP_DISC_REC* p_rec = NULL;
uint16_t peer_rc_version = 0; /*Assuming Default peer version as 1.3*/
- if ((p_rec = SDP_FindServiceInDb(
+ if ((p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL)) != NULL) {
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
/* get profile version (if failure, version parameter is not updated) */
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- &peer_rc_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
}
if (peer_rc_version != 0)
DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
@@ -1675,12 +1679,13 @@
}
peer_rc_version = 0;
- if ((p_rec = SDP_FindServiceInDb(
+ if ((p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) != NULL) {
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
/* get profile version (if failure, version parameter is not updated) */
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- &peer_rc_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
}
if (peer_rc_version != 0)
DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
@@ -1711,28 +1716,30 @@
/* loop through all records we found */
while (true) {
/* get next record; if none found, we're done */
- p_rec = SDP_FindServiceInDb(p_cb->p_disc_db, service_uuid, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, service_uuid, p_rec);
if (p_rec == NULL) {
break;
}
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_CLASS_ID_LIST)) !=
- NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_CLASS_ID_LIST)) != NULL) {
/* find peer features */
- if (SDP_FindServiceInDb(p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- NULL)) {
+ if (get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL)) {
peer_features |= BTA_AV_FEAT_RCCT;
}
- if (SDP_FindServiceInDb(p_cb->p_disc_db,
- UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) {
+ if (get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) {
peer_features |= BTA_AV_FEAT_RCTG;
}
}
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
/* get profile version (if failure, version parameter is not updated) */
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- &peer_rc_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
APPL_TRACE_DEBUG("%s: peer_rc_version 0x%x", __func__, peer_rc_version);
if (peer_rc_version >= AVRC_REV_1_3)
@@ -1740,7 +1747,8 @@
if (peer_rc_version >= AVRC_REV_1_4) {
/* get supported categories */
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr != NULL) {
categories = p_attr->attr_value.v.u16;
if (categories & AVRC_SUPF_CT_CAT2)
@@ -1772,29 +1780,30 @@
APPL_TRACE_DEBUG("%s: service_uuid:x%x", __func__, service_uuid);
/* loop through all records we found */
- tSDP_DISC_REC* p_rec =
- SDP_FindServiceInDb(p_cb->p_disc_db, service_uuid, NULL);
+ tSDP_DISC_REC* p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, service_uuid, NULL);
while (p_rec) {
APPL_TRACE_DEBUG("%s: found Service record for x%x", __func__,
service_uuid);
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_CLASS_ID_LIST)) !=
- NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_CLASS_ID_LIST)) != NULL) {
/* find peer features */
- if (SDP_FindServiceInDb(p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- NULL)) {
+ if (get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL)) {
peer_features |= BTA_AV_FEAT_RCCT;
}
- if (SDP_FindServiceInDb(p_cb->p_disc_db,
- UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) {
+ if (get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) {
peer_features |= BTA_AV_FEAT_RCTG;
}
}
- if ((SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
+ if ((get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) {
/* get profile version (if failure, version parameter is not updated) */
uint16_t peer_rc_version = 0;
- bool val = SDP_FindProfileVersionInRec(
+ bool val = get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
APPL_TRACE_DEBUG("%s: peer_rc_version for TG 0x%x, profile_found %d",
__func__, peer_rc_version, val);
@@ -1804,7 +1813,8 @@
/* Get supported features */
tSDP_DISC_ATTR* p_attr =
- SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
+ get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr != NULL) {
uint16_t categories = p_attr->attr_value.v.u16;
/*
@@ -1831,7 +1841,8 @@
}
}
/* get next record; if none found, we're done */
- p_rec = SDP_FindServiceInDb(p_cb->p_disc_db, service_uuid, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, service_uuid, p_rec);
}
APPL_TRACE_DEBUG("%s: peer_features:x%x", __func__, peer_features);
return peer_features;
@@ -1852,12 +1863,12 @@
APPL_TRACE_DEBUG("%s: searching for cover art psm", __func__);
/* Cover Art L2CAP PSM is only available on a target device */
tBTA_AV_CB* p_cb = &bta_av_cb;
- tSDP_DISC_REC* p_rec =
- SDP_FindServiceInDb(p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET,
- NULL);
+ tSDP_DISC_REC* p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL);
while (p_rec) {
tSDP_DISC_ATTR* p_attr =
- (SDP_FindAttributeInRec(p_rec, ATTR_ID_ADDITION_PROTO_DESC_LISTS));
+ (get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_ADDITION_PROTO_DESC_LISTS));
/*
* If we have the Additional Protocol Description Lists attribute then we
* specifically want the list that is an L2CAP protocol leading to OBEX.
@@ -1931,8 +1942,8 @@
}
}
/* get next record; if none found, we're done */
- p_rec = SDP_FindServiceInDb(p_cb->p_disc_db,
- UUID_SERVCLASS_AV_REM_CTRL_TARGET, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, p_rec);
}
/* L2CAP PSM range is 0x1000-0xFFFF so 0x0000 is safe default invalid */
APPL_TRACE_DEBUG("%s: could not find a BIP psm", __func__);
@@ -2009,14 +2020,15 @@
/* Change our features if the remote AVRCP version is 1.3 or less */
tSDP_DISC_REC* p_rec = nullptr;
- p_rec = SDP_FindServiceInDb(p_cb->p_disc_db,
- UUID_SERVCLASS_AV_REMOTE_CONTROL, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL, p_rec);
if (p_rec != NULL &&
- SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST) != NULL) {
+ get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_BT_PROFILE_DESC_LIST) != NULL) {
/* get profile version (if failure, version parameter is not updated) */
uint16_t peer_rc_version = 0xFFFF; // Don't change the AVRCP version
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL,
- &peer_rc_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
if (peer_rc_version <= AVRC_REV_1_3) {
APPL_TRACE_DEBUG("%s: Using AVRCP 1.3 Capabilities with remote device",
__func__);
diff --git a/system/bta/av/bta_av_main.cc b/system/bta/av/bta_av_main.cc
index f646da3..3088c9b 100644
--- a/system/bta/av/bta_av_main.cc
+++ b/system/bta/av/bta_av_main.cc
@@ -24,6 +24,8 @@
#define LOG_TAG "bt_bta_av"
+#include <base/logging.h>
+
#include <cstdint>
#include "bt_target.h" // Must be first to define build configuration
@@ -41,10 +43,11 @@
#include "stack/include/acl_api.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/btm_api.h"
+#include "stack/include/sdp_api.h"
#include "types/hci_role.h"
#include "types/raw_address.h"
-#include <base/logging.h>
+using namespace bluetooth::legacy::stack::sdp;
/*****************************************************************************
* Constants and types
@@ -143,11 +146,13 @@
return;
}
if (bta_av_cb.sdp_a2dp_handle) {
- SDP_DeleteRecord(bta_av_cb.sdp_a2dp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ bta_av_cb.sdp_a2dp_handle);
bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
}
if (bta_av_cb.sdp_a2dp_snk_handle) {
- SDP_DeleteRecord(bta_av_cb.sdp_a2dp_snk_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ bta_av_cb.sdp_a2dp_snk_handle);
bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
}
// deregister from AVDT
@@ -607,12 +612,14 @@
bta_av_cb.sdp_a2dp_snk_handle = 0;
if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) {
/* create the SDP records on the 1st audio channel */
- bta_av_cb.sdp_a2dp_handle = SDP_CreateRecord();
+ bta_av_cb.sdp_a2dp_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
A2DP_AddRecord(UUID_SERVCLASS_AUDIO_SOURCE, p_service_name, NULL,
A2DP_SUPF_PLAYER, bta_av_cb.sdp_a2dp_handle);
bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
} else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) {
- bta_av_cb.sdp_a2dp_snk_handle = SDP_CreateRecord();
+ bta_av_cb.sdp_a2dp_snk_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
A2DP_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL,
A2DP_SUPF_PLAYER, bta_av_cb.sdp_a2dp_snk_handle);
bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc
index c39f948..0a709b9 100644
--- a/system/bta/dm/bta_dm_act.cc
+++ b/system/bta/dm/bta_dm_act.cc
@@ -76,6 +76,7 @@
#include "gap_api.h"
#endif
+using namespace bluetooth::legacy::stack::sdp;
using bluetooth::Uuid;
namespace {
@@ -1201,7 +1202,8 @@
static void store_avrcp_profile_feature(tSDP_DISC_REC* sdp_rec) {
tSDP_DISC_ATTR* p_attr =
- SDP_FindAttributeInRec(sdp_rec, ATTR_ID_SUPPORTED_FEATURES);
+ get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ sdp_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr == NULL) {
return;
}
@@ -1240,17 +1242,18 @@
}};
for (const auto& audio_profile : audio_profiles) {
- tSDP_DISC_REC* sdp_rec = SDP_FindServiceInDb(
+ tSDP_DISC_REC* sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
bta_dm_search_cb.p_sdp_db, audio_profile.servclass_uuid, NULL);
if (sdp_rec == NULL) continue;
- if (SDP_FindAttributeInRec(sdp_rec, ATTR_ID_BT_PROFILE_DESC_LIST) == NULL)
+ if (get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ sdp_rec, ATTR_ID_BT_PROFILE_DESC_LIST) == NULL)
continue;
uint16_t profile_version = 0;
/* get profile version (if failure, version parameter is not updated) */
- SDP_FindProfileVersionInRec(sdp_rec, audio_profile.btprofile_uuid,
- &profile_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ sdp_rec, audio_profile.btprofile_uuid, &profile_version);
if (profile_version != 0) {
if (btif_config_set_bin(sdp_rec->remote_bd_addr.ToString().c_str(),
audio_profile.profile_key,
@@ -1292,16 +1295,17 @@
do {
p_sdp_rec = NULL;
if (bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1)) {
- if (p_sdp_rec && SDP_FindProtocolListElemInRec(
- p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (p_sdp_rec &&
+ get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
bta_dm_search_cb.peer_scn = (uint8_t)pe.params[0];
scn_found = true;
}
} else {
service =
bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
- p_sdp_rec =
- SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
}
/* finished with BR/EDR services, now we check the result for GATT based
* service UUID */
@@ -1312,11 +1316,12 @@
do {
/* find a service record, report it */
- p_sdp_rec =
- SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, 0, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ bta_dm_search_cb.p_sdp_db, 0, p_sdp_rec);
if (p_sdp_rec) {
Uuid service_uuid;
- if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindServiceUUIDInRec(
+ p_sdp_rec, &service_uuid)) {
gatt_uuids.push_back(service_uuid);
}
}
@@ -1370,12 +1375,14 @@
p_sdp_rec = NULL;
do {
/* find a service record, report it */
- p_sdp_rec =
- SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb_128bit(
+ bta_dm_search_cb.p_sdp_db, p_sdp_rec);
if (p_sdp_rec) {
// SDP_FindServiceUUIDInRec_128bit is used only once, refactor?
Uuid temp_uuid;
- if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) {
+ if (get_legacy_stack_sdp_api()
+ ->record.SDP_FindServiceUUIDInRec_128bit(p_sdp_rec,
+ &temp_uuid)) {
uuid_list.push_back(temp_uuid);
}
}
@@ -1390,8 +1397,8 @@
#if TARGET_FLOSS
tSDP_DI_GET_RECORD di_record;
- if (SDP_GetDiRecord(1, &di_record, bta_dm_search_cb.p_sdp_db) ==
- SDP_SUCCESS) {
+ if (get_legacy_stack_sdp_api()->device_id.SDP_GetDiRecord(
+ 1, &di_record, bta_dm_search_cb.p_sdp_db) == SDP_SUCCESS) {
tBTA_DM_SEARCH result;
result.did_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
result.did_res.vendor_id_src = di_record.rec.vendor_id_source;
@@ -1859,16 +1866,17 @@
}
LOG_INFO("%s search UUID = %s", __func__, uuid.ToString().c_str());
- SDP_InitDiscoveryDb(bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1,
- &uuid, 0, NULL);
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
- if (!SDP_ServiceSearchAttributeRequest(bd_addr, bta_dm_search_cb.p_sdp_db,
- &bta_dm_sdp_callback)) {
+ if (!get_legacy_stack_sdp_api()
+ ->service.SDP_ServiceSearchAttributeRequest(
+ bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) {
/*
* If discovery is not successful with this device, then
* proceed with the next one.
@@ -1877,12 +1885,14 @@
bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
} else {
+#ifndef TARGET_FLOSS
if (uuid == Uuid::From16Bit(UUID_PROTOCOL_L2CAP)) {
if (!is_sdp_pbap_pce_disabled(bd_addr)) {
LOG_DEBUG("SDP search for PBAP Client ");
BTA_SdpSearch(bd_addr, Uuid::From16Bit(UUID_SERVCLASS_PBAP_PCE));
}
}
+#endif
bta_dm_search_cb.service_index++;
return;
}
@@ -2514,7 +2524,7 @@
static tBTM_STATUS bta_dm_sp_cback(tBTM_SP_EVT event,
tBTM_SP_EVT_DATA* p_data) {
tBTM_STATUS status = BTM_CMD_STARTED;
- tBTA_DM_SEC sec_event;
+ tBTA_DM_SEC sec_event = {};
tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
@@ -2559,10 +2569,19 @@
break;
}
+ // TODO PleaseFix: This assignment only works with event
+ // BTM_SP_KEY_NOTIF_EVT
bta_dm_cb.num_val = sec_event.key_notif.passkey =
p_data->key_notif.passkey;
if (BTM_SP_CFM_REQ_EVT == event) {
+ /* Due to the switch case falling through below to
+ BTM_SP_KEY_NOTIF_EVT,
+ copy these values into key_notif from cfm_req */
+ sec_event.key_notif.bd_addr = p_data->cfm_req.bd_addr;
+ dev_class_copy(sec_event.key_notif.dev_class,
+ p_data->cfm_req.dev_class);
+ bd_name_copy(sec_event.key_notif.bd_name, p_data->cfm_req.bd_name);
/* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
call remote name request using values from cfm_req */
if (p_data->cfm_req.bd_name[0] == 0) {
@@ -2573,23 +2592,20 @@
bta_dm_cb.rmt_auth_req = sec_event.cfm_req.rmt_auth_req;
bta_dm_cb.loc_auth_req = sec_event.cfm_req.loc_auth_req;
- BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class,
- p_data->cfm_req.dev_class);
- if ((BTM_ReadRemoteDeviceName(
- p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
- BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
- return BTM_CMD_STARTED;
- APPL_TRACE_WARNING(
- " bta_dm_sp_cback() -> Failed to start Remote Name Request ");
- } else {
- /* Due to the switch case falling through below to
- BTM_SP_KEY_NOTIF_EVT,
- copy these values into key_notif from cfm_req */
- sec_event.key_notif.bd_addr = p_data->cfm_req.bd_addr;
- BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class,
- p_data->cfm_req.dev_class);
- strlcpy((char*)sec_event.key_notif.bd_name,
- (char*)p_data->cfm_req.bd_name, BD_NAME_LEN + 1);
+ dev_class_copy(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
+ {
+ const tBTM_STATUS btm_status = BTM_ReadRemoteDeviceName(
+ p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
+ BT_TRANSPORT_BR_EDR);
+ switch (btm_status) {
+ case BTM_CMD_STARTED:
+ return btm_status;
+ default:
+ // NOTE: This will issue callback on this failure path
+ LOG_WARN("Failed to start Remote Name Request btm_status:%s",
+ btm_status_text(btm_status).c_str());
+ };
+ }
}
}
@@ -4781,6 +4797,12 @@
return ::bta_dm_determine_discovery_transport(bd_addr);
}
+tBTM_STATUS bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data) {
+ return ::bta_dm_sp_cback(event, p_data);
+}
+
+void btm_set_local_io_caps(uint8_t io_caps) { ::btm_local_io_caps = io_caps; }
+
} // namespace testing
} // namespace legacy
} // namespace bluetooth
diff --git a/system/bta/dm/bta_dm_api.cc b/system/bta/dm/bta_dm_api.cc
index b8be10a..91c3c52 100644
--- a/system/bta/dm/bta_dm_api.cc
+++ b/system/bta/dm/bta_dm_api.cc
@@ -35,9 +35,12 @@
#include "stack/include/btm_api.h"
#include "stack/include/btm_client_interface.h"
#include "stack/include/btu.h" // do_in_main_thread
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using bluetooth::Uuid;
/*****************************************************************************
@@ -323,8 +326,8 @@
tBTA_STATUS status = BTA_FAILURE;
if (bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) {
- if (SDP_SetLocalDiRecord((tSDP_DI_RECORD*)p_device_info, p_handle) ==
- SDP_SUCCESS) {
+ if (get_legacy_stack_sdp_api()->device_id.SDP_SetLocalDiRecord(
+ (tSDP_DI_RECORD*)p_device_info, p_handle) == SDP_SUCCESS) {
if (!p_device_info->primary_record) {
bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle;
bta_dm_di_cb.di_num++;
diff --git a/system/bta/gatt/bta_gattc_cache.cc b/system/bta/gatt/bta_gattc_cache.cc
index cd0f64d..4fc81e2 100644
--- a/system/bta/gatt/bta_gattc_cache.cc
+++ b/system/bta/gatt/bta_gattc_cache.cc
@@ -41,9 +41,12 @@
#include "osi/include/log.h"
#include "stack/btm/btm_sec.h"
#include "stack/include/gatt_api.h"
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using base::StringPrintf;
using bluetooth::Uuid;
using gatt::Characteristic;
@@ -368,14 +371,18 @@
bool no_pending_disc = !p_srvc_cb->pending_discovery.InProgress();
- tSDP_DISC_REC* p_sdp_rec = SDP_FindServiceInDb(cb_data->p_sdp_db, 0, nullptr);
+ tSDP_DISC_REC* p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ cb_data->p_sdp_db, 0, nullptr);
while (p_sdp_rec != nullptr) {
/* find a service record, report it */
Uuid service_uuid;
- if (!SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) continue;
+ if (!get_legacy_stack_sdp_api()->record.SDP_FindServiceUUIDInRec(
+ p_sdp_rec, &service_uuid))
+ continue;
tSDP_PROTOCOL_ELEM pe;
- if (!SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_ATT, &pe))
+ if (!get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_sdp_rec, UUID_PROTOCOL_ATT, &pe))
continue;
uint16_t start_handle = (uint16_t)pe.params[0];
@@ -391,7 +398,8 @@
!GATT_HANDLE_IS_VALID(end_handle)) {
LOG(ERROR) << "invalid start_handle=" << loghex(start_handle)
<< ", end_handle=" << loghex(end_handle);
- p_sdp_rec = SDP_FindServiceInDb(cb_data->p_sdp_db, 0, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ cb_data->p_sdp_db, 0, p_sdp_rec);
continue;
}
@@ -399,7 +407,8 @@
p_srvc_cb->pending_discovery.AddService(start_handle, end_handle,
service_uuid, true);
- p_sdp_rec = SDP_FindServiceInDb(cb_data->p_sdp_db, 0, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ cb_data->p_sdp_db, 0, p_sdp_rec);
}
// If discovery is already pending, no need to call
@@ -431,10 +440,10 @@
attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
Uuid uuid = Uuid::From16Bit(UUID_PROTOCOL_ATT);
- SDP_InitDiscoveryDb(cb_data->p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, &uuid,
- num_attrs, attr_list);
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ cb_data->p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
- if (!SDP_ServiceSearchAttributeRequest2(
+ if (!get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest2(
p_server_cb->server_bda, cb_data->p_sdp_db, &bta_gattc_sdp_callback,
const_cast<const void*>(static_cast<void*>(cb_data)))) {
osi_free(cb_data);
diff --git a/system/bta/hd/bta_hd_act.cc b/system/bta/hd/bta_hd_act.cc
index 76fc8ec..4572f1c 100644
--- a/system/bta/hd/bta_hd_act.cc
+++ b/system/bta/hd/bta_hd_act.cc
@@ -38,8 +38,11 @@
#include "osi/include/log.h"
#include "stack/include/bt_hdr.h"
#include "stack/include/hidd_api.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
static void bta_hd_cback(const RawAddress& bd_addr, uint8_t event,
uint32_t data, BT_HDR* pdata);
@@ -128,7 +131,7 @@
/* Remove service record */
if (bta_hd_cb.sdp_handle != 0) {
- SDP_DeleteRecord(bta_hd_cb.sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(bta_hd_cb.sdp_handle);
bta_sys_remove_uuid(UUID_SERVCLASS_HUMAN_INTERFACE);
}
@@ -185,11 +188,11 @@
/* Remove old record if for some reason it's already registered */
if (bta_hd_cb.sdp_handle != 0) {
- SDP_DeleteRecord(bta_hd_cb.sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(bta_hd_cb.sdp_handle);
}
bta_hd_cb.use_report_id = use_report_id;
- bta_hd_cb.sdp_handle = SDP_CreateRecord();
+ bta_hd_cb.sdp_handle = get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
HID_DevAddRecord(bta_hd_cb.sdp_handle, p_app_data->name,
p_app_data->description, p_app_data->provider,
p_app_data->subclass, p_app_data->d_len, p_app_data->d_data);
@@ -233,7 +236,7 @@
HID_DevSetIncomingPolicy(FALSE);
if (bta_hd_cb.sdp_handle != 0) {
- SDP_DeleteRecord(bta_hd_cb.sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(bta_hd_cb.sdp_handle);
}
bta_hd_cb.sdp_handle = 0;
diff --git a/system/bta/hf_client/bta_hf_client_main.cc b/system/bta/hf_client/bta_hf_client_main.cc
index cae5798..7ec2165 100644
--- a/system/bta/hf_client/bta_hf_client_main.cc
+++ b/system/bta/hf_client/bta_hf_client_main.cc
@@ -17,6 +17,8 @@
*
******************************************************************************/
+#include <base/logging.h>
+
#include <cstdint>
#include <cstdio>
@@ -26,9 +28,10 @@
#include "osi/include/osi.h" // UNUSED_ATTR
#include "stack/include/bt_hdr.h"
#include "stack/include/btm_api.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
-#include <base/logging.h>
+using namespace bluetooth::legacy::stack::sdp;
static const char* bta_hf_client_evt_str(uint16_t event);
static const char* bta_hf_client_state_str(uint8_t state);
@@ -385,7 +388,8 @@
/* Cancel SDP if it had been started. */
if (client_cb->p_disc_db) {
- (void)SDP_CancelServiceSearch(client_cb->p_disc_db);
+ get_legacy_stack_sdp_api()->service.SDP_CancelServiceSearch(
+ client_cb->p_disc_db);
osi_free_and_reset((void**)&client_cb->p_disc_db);
}
diff --git a/system/bta/hf_client/bta_hf_client_rfc.cc b/system/bta/hf_client/bta_hf_client_rfc.cc
index 2999eb9..e9e73e5 100644
--- a/system/bta/hf_client/bta_hf_client_rfc.cc
+++ b/system/bta/hf_client/bta_hf_client_rfc.cc
@@ -35,6 +35,8 @@
#include <base/logging.h>
+using namespace bluetooth::legacy::stack::sdp;
+
/*******************************************************************************
*
* Function bta_hf_client_port_cback
@@ -288,7 +290,8 @@
/* Cancel SDP if it had been started. */
if (client_cb->p_disc_db) {
- (void)SDP_CancelServiceSearch(client_cb->p_disc_db);
+ (void)get_legacy_stack_sdp_api()->service.SDP_CancelServiceSearch(
+ client_cb->p_disc_db);
osi_free_and_reset((void**)&client_cb->p_disc_db);
}
}
diff --git a/system/bta/hf_client/bta_hf_client_sdp.cc b/system/bta/hf_client/bta_hf_client_sdp.cc
index e0ba984..1c84dca 100644
--- a/system/bta/hf_client/bta_hf_client_sdp.cc
+++ b/system/bta/hf_client/bta_hf_client_sdp.cc
@@ -35,10 +35,12 @@
#include "stack/btm/btm_sec.h"
#include "stack/include/btm_api.h"
#include "stack/include/port_api.h"
+#include "stack/include/sdp_api.h"
#include "stack/include/sdpdefs.h"
#include "types/bluetooth/uuid.h"
using bluetooth::Uuid;
+using namespace bluetooth::legacy::stack::sdp;
/* Number of protocol elements in protocol element list. */
#define BTA_HF_CLIENT_NUM_PROTO_ELEMS 2
@@ -84,7 +86,8 @@
* Description This function is called by a server application to add
* HFP Client information to an SDP record. Prior to
* calling this function the application must call
- * SDP_CreateRecord() to create an SDP record.
+ * get_legacy_stack_sdp_api()->handle.SDP_CreateRecord() to
+ * create an SDP record.
*
* Returns true if function execution succeeded,
* false if function execution failed.
@@ -113,24 +116,25 @@
proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM;
proto_elem_list[1].num_params = 1;
proto_elem_list[1].params[0] = scn;
- result &= SDP_AddProtocolList(sdp_handle, BTA_HF_CLIENT_NUM_PROTO_ELEMS,
- proto_elem_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
+ sdp_handle, BTA_HF_CLIENT_NUM_PROTO_ELEMS, proto_elem_list);
/* add service class id list */
svc_class_id_list[0] = UUID_SERVCLASS_HF_HANDSFREE;
svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO;
- result &= SDP_AddServiceClassIdList(sdp_handle, BTA_HF_CLIENT_NUM_SVC_ELEMS,
- svc_class_id_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
+ sdp_handle, BTA_HF_CLIENT_NUM_SVC_ELEMS, svc_class_id_list);
/* add profile descriptor list */
profile_uuid = UUID_SERVCLASS_HF_HANDSFREE;
version = get_default_hfp_version();
- result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
+ sdp_handle, profile_uuid, version);
/* add service name */
if (p_service_name != NULL && p_service_name[0] != 0) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_service_name) + 1), (uint8_t*)p_service_name);
}
@@ -153,12 +157,12 @@
if (features & BTA_HF_CLIENT_FEAT_CODEC) sdp_features |= 0x0020;
UINT16_TO_BE_FIELD(buf, sdp_features);
- result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, 2, buf);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf);
/* add browse group list */
- result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
- browse_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
return result;
}
@@ -177,7 +181,8 @@
const char* p_service_name) {
/* add sdp record if not already registered */
if (client_cb_arr->sdp_handle == 0) {
- client_cb_arr->sdp_handle = SDP_CreateRecord();
+ client_cb_arr->sdp_handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
client_cb_arr->scn = BTM_AllocateSCN();
bta_hf_client_add_record(p_service_name, client_cb_arr->scn,
client_cb_arr->features,
@@ -201,7 +206,7 @@
APPL_TRACE_DEBUG("%s", __func__);
if (client_cb->sdp_handle != 0) {
- SDP_DeleteRecord(client_cb->sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(client_cb->sdp_handle);
client_cb->sdp_handle = 0;
BTM_FreeSCN(client_cb->scn);
bta_sys_remove_uuid(UUID_SERVCLASS_HF_HANDSFREE);
@@ -229,15 +234,16 @@
/* loop through all records we found */
while (true) {
/* get next record; if none found, we're done */
- p_rec = SDP_FindServiceInDb(client_cb->p_disc_db,
- UUID_SERVCLASS_AG_HANDSFREE, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ client_cb->p_disc_db, UUID_SERVCLASS_AG_HANDSFREE, p_rec);
if (p_rec == NULL) {
break;
}
/* get scn from proto desc list if initiator */
if (client_cb->role == BTA_HF_CLIENT_INT) {
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
client_cb->peer_scn = (uint8_t)pe.params[0];
} else {
continue;
@@ -245,11 +251,12 @@
}
/* get profile version (if failure, version parameter is not updated) */
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_HF_HANDSFREE,
- &client_cb->peer_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_HF_HANDSFREE, &client_cb->peer_version);
/* get features */
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr != NULL) {
/* Found attribute. Get value. */
/* There might be race condition between SDP and BRSF. */
@@ -264,7 +271,8 @@
}
/* get network for ability to reject calls */
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_NETWORK);
if (p_attr != NULL) {
if (p_attr->attr_value.v.u16 == 0x01) {
client_cb->peer_features |= BTA_HF_CLIENT_PEER_REJECT;
@@ -323,14 +331,16 @@
client_cb->p_disc_db = (tSDP_DISCOVERY_DB*)osi_malloc(BT_DEFAULT_BUFFER_SIZE);
/* set up service discovery database; attr happens to be attr_list len */
- db_inited = SDP_InitDiscoveryDb(client_cb->p_disc_db, BT_DEFAULT_BUFFER_SIZE,
- num_uuid, uuid_list, num_attr, attr_list);
+ db_inited = get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ client_cb->p_disc_db, BT_DEFAULT_BUFFER_SIZE, num_uuid, uuid_list,
+ num_attr, attr_list);
if (db_inited) {
/*Service discovery not initiated */
- db_inited = SDP_ServiceSearchAttributeRequest2(
- client_cb->peer_addr, client_cb->p_disc_db, bta_hf_client_sdp_cback,
- (void*)client_cb);
+ db_inited =
+ get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest2(
+ client_cb->peer_addr, client_cb->p_disc_db, bta_hf_client_sdp_cback,
+ (void*)client_cb);
}
if (!db_inited) {
diff --git a/system/bta/hh/bta_hh_act.cc b/system/bta/hh/bta_hh_act.cc
index c237534..6c3abd0 100644
--- a/system/bta/hh/bta_hh_act.cc
+++ b/system/bta/hh/bta_hh_act.cc
@@ -42,9 +42,12 @@
#include "stack/include/bt_hdr.h"
#include "stack/include/hiddefs.h"
#include "stack/include/hidh_api.h"
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
/*****************************************************************************
* Constants
****************************************************************************/
@@ -274,9 +277,11 @@
if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) &&
(p_cb != NULL)) {
if (result == SDP_SUCCESS &&
- SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0) {
+ get_legacy_stack_sdp_api()->device_id.SDP_GetNumDiRecords(
+ bta_hh_cb.p_disc_db) != 0) {
/* always update information with primary DI record */
- if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) {
+ if (get_legacy_stack_sdp_api()->device_id.SDP_GetDiRecord(
+ 1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS) {
bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product,
di_rec.rec.version, 0, 0);
}
@@ -324,9 +329,9 @@
(tSDP_DISCOVERY_DB*)osi_malloc(p_bta_hh_cfg->sdp_db_size);
/* Do DI discovery first */
- if (SDP_DiDiscover(p_data->api_conn.bd_addr, bta_hh_cb.p_disc_db,
- p_bta_hh_cfg->sdp_db_size,
- bta_hh_di_sdp_cback) == SDP_SUCCESS) {
+ if (get_legacy_stack_sdp_api()->device_id.SDP_DiDiscover(
+ p_data->api_conn.bd_addr, bta_hh_cb.p_disc_db,
+ p_bta_hh_cfg->sdp_db_size, bta_hh_di_sdp_cback) == SDP_SUCCESS) {
/* SDP search started successfully
* Connection will be triggered at the end of successful SDP search
*/
@@ -942,8 +947,6 @@
}
/* otherwise report CLOSE/VC_UNPLUG event */
else {
- /* finaliza device driver */
- bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
/* inform role manager */
bta_sys_conn_close(BTA_ID_HH, p_cb->app_id, p_cb->addr);
/* update total conn number */
diff --git a/system/bta/hh/bta_hh_le.cc b/system/bta/hh/bta_hh_le.cc
index 6324f1f..11ea930 100644
--- a/system/bta/hh/bta_hh_le.cc
+++ b/system/bta/hh/bta_hh_le.cc
@@ -1679,8 +1679,7 @@
/* deregister all notification */
bta_hh_le_deregister_input_notif(p_cb);
- /* finaliza device driver */
- bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
+
/* update total conn number */
bta_hh_cb.cnt_num--;
diff --git a/system/bta/hh/bta_hh_utils.cc b/system/bta/hh/bta_hh_utils.cc
index ce4858c..ace7484 100644
--- a/system/bta/hh/bta_hh_utils.cc
+++ b/system/bta/hh/bta_hh_utils.cc
@@ -28,8 +28,11 @@
#include "osi/include/osi.h"
#include "stack/include/acl_api.h"
#include "stack/include/btm_client_interface.h"
+#include "stack/include/sdp_api.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
/* if SSR max latency is not defined by remote device, set the default value
as half of the link supervision timeout */
#define BTA_HH_GET_DEF_SSR_MAX_LAT(x) ((x) >> 1)
@@ -308,7 +311,8 @@
if (bta_hh_cb.p_disc_db) {
/* Cancel SDP if it had been started. */
- (void)SDP_CancelServiceSearch (bta_hh_cb.p_disc_db);
+ (void)get_legacy_stack_sdp_api()->service.SDP_CancelServiceSearch(
+ bta_hh_cb.p_disc_db);
osi_free_and_reset((void**)&bta_hh_cb.p_disc_db);
}
diff --git a/system/bta/include/bta_hh_co.h b/system/bta/include/bta_hh_co.h
index 2814aaa..2ddaf68 100644
--- a/system/bta/include/bta_hh_co.h
+++ b/system/bta/include/bta_hh_co.h
@@ -70,18 +70,6 @@
/*******************************************************************************
*
- * Function bta_hh_co_close
- *
- * Description This callout function is executed by HH when connection is
- * closed, and device specific finalizatio nmay be needed.
- *
- * Returns void.
- *
- ******************************************************************************/
-void bta_hh_co_close(uint8_t dev_handle, uint8_t app_id);
-
-/*******************************************************************************
- *
* Function bta_hh_co_set_rpt_rsp
*
* Description This callout function is executed by HH when Set Report
diff --git a/system/bta/jv/bta_jv_act.cc b/system/bta/jv/bta_jv_act.cc
index d8d593d..532e980 100644
--- a/system/bta/jv/bta_jv_act.cc
+++ b/system/bta/jv/bta_jv_act.cc
@@ -45,6 +45,7 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
using bluetooth::Uuid;
tBTA_JV_CB bta_jv_cb;
@@ -811,11 +812,12 @@
tSDP_DISC_REC* p_sdp_rec = NULL;
tSDP_PROTOCOL_ELEM pe;
VLOG(2) << __func__ << ": bta_jv_cb.uuid=" << bta_jv_cb.uuid;
- p_sdp_rec = SDP_FindServiceUUIDInDb(p_bta_jv_cfg->p_sdp_db,
- bta_jv_cb.uuid, p_sdp_rec);
+ p_sdp_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceUUIDInDb(
+ p_bta_jv_cfg->p_sdp_db, bta_jv_cb.uuid, p_sdp_rec);
VLOG(2) << __func__ << ": p_sdp_rec=" << p_sdp_rec;
if (p_sdp_rec &&
- SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
dcomp.scn = (uint8_t)pe.params[0];
status = BTA_JV_SUCCESS;
}
@@ -848,8 +850,9 @@
/* init the database/set up the filter */
VLOG(2) << __func__ << ": call SDP_InitDiscoveryDb, num_uuid=" << num_uuid;
- SDP_InitDiscoveryDb(p_bta_jv_cfg->p_sdp_db, p_bta_jv_cfg->sdp_db_size,
- num_uuid, uuid_list, 0, NULL);
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ p_bta_jv_cfg->p_sdp_db, p_bta_jv_cfg->sdp_db_size, num_uuid, uuid_list, 0,
+ NULL);
/* tell SDP to keep the raw data */
p_bta_jv_cfg->p_sdp_db->raw_data = p_bta_jv_cfg->p_sdp_raw_data;
@@ -863,9 +866,9 @@
uint32_t* rfcomm_slot_id_copy = (uint32_t*)osi_malloc(sizeof(uint32_t));
*rfcomm_slot_id_copy = rfcomm_slot_id;
- if (!SDP_ServiceSearchAttributeRequest2(bd_addr, p_bta_jv_cfg->p_sdp_db,
- bta_jv_start_discovery_cback,
- (void*)rfcomm_slot_id_copy)) {
+ if (!get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest2(
+ bd_addr, p_bta_jv_cfg->p_sdp_db, bta_jv_start_discovery_cback,
+ (void*)rfcomm_slot_id_copy)) {
bta_jv_cb.sdp_active = BTA_JV_SDP_ACT_NONE;
/* failed to start SDP. report the failure right away */
if (bta_jv_cb.p_dm_cback) {
@@ -895,7 +898,7 @@
void bta_jv_delete_record(uint32_t handle) {
if (handle) {
/* this is a record created by btif layer*/
- SDP_DeleteRecord(handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(handle);
}
}
diff --git a/system/bta/sdp/bta_sdp_act.cc b/system/bta/sdp/bta_sdp_act.cc
index f0f2291..4ac2d4c 100644
--- a/system/bta/sdp/bta_sdp_act.cc
+++ b/system/bta/sdp/bta_sdp_act.cc
@@ -35,6 +35,8 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
static void bta_create_mns_sdp_record(bluetooth_sdp_record* record,
tSDP_DISC_REC* p_rec) {
tSDP_DISC_ATTR* p_attr;
@@ -48,28 +50,32 @@
record->mns.hdr.profile_version = 0;
record->mns.supported_features = 0x0000001F; // default value if not found
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
if (p_attr != NULL) {
record->mns.supported_features = p_attr->attr_value.v.u32;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->mns.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
record->mns.hdr.service_name = (char*)p_attr->attr_value.v.array;
}
- if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE,
- &pversion)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) {
record->mns.hdr.profile_version = pversion;
}
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->mns.hdr.rfcomm_channel_number = pe.params[0];
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_GOEP_L2CAP_PSM);
if (p_attr != NULL) {
record->mns.hdr.l2cap_psm = p_attr->attr_value.v.u16;
}
@@ -91,38 +97,44 @@
record->mas.supported_features = 0x0000001F;
record->mas.supported_message_types = 0;
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_MAS_INSTANCE_ID);
if (p_attr != NULL) {
record->mas.mas_instance_id = p_attr->attr_value.v.u8;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_MSG_TYPE);
if (p_attr != NULL) {
record->mas.supported_message_types = p_attr->attr_value.v.u8;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
if (p_attr != NULL) {
record->mas.supported_features = p_attr->attr_value.v.u32;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->mas.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
record->mas.hdr.service_name = (char*)p_attr->attr_value.v.array;
}
- if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE,
- &pversion)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_MAP_PROFILE, &pversion)) {
record->mas.hdr.profile_version = pversion;
}
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->mas.hdr.rfcomm_channel_number = pe.params[0];
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_GOEP_L2CAP_PSM);
if (p_attr != NULL) {
record->mas.hdr.l2cap_psm = p_attr->attr_value.v.u16;
}
@@ -143,32 +155,37 @@
record->pse.supported_features = 0x00000003;
record->pse.supported_repositories = 0;
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_REPOSITORIES);
if (p_attr != NULL) {
record->pse.supported_repositories = p_attr->attr_value.v.u8;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES);
if (p_attr != NULL) {
record->pse.supported_features = p_attr->attr_value.v.u32;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->pse.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array;
}
- if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS,
- &pversion)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_PHONE_ACCESS, &pversion)) {
record->pse.hdr.profile_version = pversion;
}
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->pse.hdr.rfcomm_channel_number = pe.params[0];
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_GOEP_L2CAP_PSM);
if (p_attr != NULL) {
record->pse.hdr.l2cap_psm = p_attr->attr_value.v.u16;
}
@@ -188,27 +205,31 @@
record->ops.hdr.profile_version = 0;
record->ops.supported_formats_list_len = 0;
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->ops.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
record->ops.hdr.service_name = (char*)p_attr->attr_value.v.array;
}
- if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH,
- &pversion)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH, &pversion)) {
record->ops.hdr.profile_version = pversion;
}
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->ops.hdr.rfcomm_channel_number = pe.params[0];
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_GOEP_L2CAP_PSM);
if (p_attr != NULL) {
record->ops.hdr.l2cap_psm = p_attr->attr_value.v.u16;
}
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST);
if (p_attr != NULL) {
/* Safety check - each entry should itself be a sequence */
if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) {
@@ -272,18 +293,21 @@
record->sap.hdr.l2cap_psm = -1;
record->sap.hdr.profile_version = 0;
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->sap.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
record->sap.hdr.service_name = (char*)p_attr->attr_value.v.array;
}
- if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_SAP, &pversion)) {
record->sap.hdr.profile_version = pversion;
}
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->sap.hdr.rfcomm_channel_number = pe.params[0];
}
}
@@ -302,40 +326,43 @@
record->dip.hdr.l2cap_psm = -1;
record->dip.hdr.profile_version = 0;
- p_attr =
- SDP_FindAttributeInRec(p_rec, ATTR_ID_SPECIFICATION_ID);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SPECIFICATION_ID);
if (p_attr != nullptr)
record->dip.spec_id = p_attr->attr_value.v.u16;
else
APPL_TRACE_ERROR("%s() ATTR_ID_SPECIFICATION_ID not found", __func__);
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_VENDOR_ID);
if (p_attr != nullptr)
record->dip.vendor = p_attr->attr_value.v.u16;
else
APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID not found", __func__);
- p_attr =
- SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID_SOURCE);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_VENDOR_ID_SOURCE);
if (p_attr != nullptr)
record->dip.vendor_id_source = p_attr->attr_value.v.u16;
else
APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID_SOURCE not found", __func__);
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_ID);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_PRODUCT_ID);
if (p_attr != nullptr)
record->dip.product = p_attr->attr_value.v.u16;
else
APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_ID not found", __func__);
- p_attr =
- SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_VERSION);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_PRODUCT_VERSION);
if (p_attr != nullptr)
record->dip.version = p_attr->attr_value.v.u16;
else
APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_VERSION not found", __func__);
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRIMARY_RECORD);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_PRIMARY_RECORD);
if (p_attr != nullptr)
record->dip.primary_record = !(!p_attr->attr_value.v.u8);
else
@@ -355,7 +382,8 @@
record->hdr.profile_version = -1;
/* Try to extract a service name */
- p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
+ p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME);
if (p_attr != NULL) {
record->pse.hdr.service_name_length =
SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
@@ -363,7 +391,8 @@
}
/* Try to extract an RFCOMM channel */
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
record->pse.hdr.rfcomm_channel_number = pe.params[0];
}
record->hdr.user1_ptr_len = p_bta_sdp_cfg->p_sdp_db->raw_size;
@@ -390,7 +419,8 @@
if (result == SDP_SUCCESS || result == SDP_DB_FULL) {
tSDP_DISC_REC* p_rec = NULL;
do {
- p_rec = SDP_FindServiceUUIDInDb(p_bta_sdp_cfg->p_sdp_db, uuid, p_rec);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceUUIDInDb(
+ p_bta_sdp_cfg->p_sdp_db, uuid, p_rec);
/* generate the matching record data pointer */
if (!p_rec) {
APPL_TRACE_DEBUG("%s() - UUID not found", __func__);
@@ -419,8 +449,8 @@
if (p_rec != NULL) {
uint16_t peer_pce_version = 0;
- SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS,
- &peer_pce_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, UUID_SERVCLASS_PHONE_ACCESS, &peer_pce_version);
if (peer_pce_version != 0) {
btif_storage_set_pce_profile_version(p_rec->remote_bd_addr,
peer_pce_version);
@@ -513,14 +543,14 @@
/* initialize the search for the uuid */
APPL_TRACE_DEBUG("%s init discovery with UUID: %s", __func__,
uuid.ToString().c_str());
- SDP_InitDiscoveryDb(p_bta_sdp_cfg->p_sdp_db, p_bta_sdp_cfg->sdp_db_size, 1,
- &uuid, 0, NULL);
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ p_bta_sdp_cfg->p_sdp_db, p_bta_sdp_cfg->sdp_db_size, 1, &uuid, 0, NULL);
Uuid* bta_sdp_search_uuid = (Uuid*)osi_malloc(sizeof(Uuid));
*bta_sdp_search_uuid = uuid;
- if (!SDP_ServiceSearchAttributeRequest2(bd_addr, p_bta_sdp_cfg->p_sdp_db,
- bta_sdp_search_cback,
- (void*)bta_sdp_search_uuid)) {
+ if (!get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest2(
+ bd_addr, p_bta_sdp_cfg->p_sdp_db, bta_sdp_search_cback,
+ (void*)bta_sdp_search_uuid)) {
bta_sdp_cb.sdp_active = false;
/* failed to start SDP. report the failure right away */
diff --git a/system/bta/test/bta_dm_cust_uuid_test.cc b/system/bta/test/bta_dm_cust_uuid_test.cc
index a0cdcb5..bae16a7 100644
--- a/system/bta/test/bta_dm_cust_uuid_test.cc
+++ b/system/bta/test/bta_dm_cust_uuid_test.cc
@@ -18,15 +18,22 @@
#include <gtest/gtest.h>
+#include <memory>
+
#include "bta/dm/bta_dm_int.h"
#include "stack/include/bt_hdr.h"
+#include "test/fake/fake_osi.h"
#include "types/bluetooth/uuid.h"
using bluetooth::Uuid;
class BtaCustUuid : public testing::Test {
protected:
- void SetUp() override { bta_dm_cb = {}; }
+ void SetUp() override {
+ fake_osi_ = std::make_unique<test::fake::FakeOsi>();
+ bta_dm_cb = {};
+ }
+ std::unique_ptr<test::fake::FakeOsi> fake_osi_;
};
namespace {
diff --git a/system/bta/test/bta_dm_test.cc b/system/bta/test/bta_dm_test.cc
index c46a297..a0f8345 100644
--- a/system/bta/test/bta_dm_test.cc
+++ b/system/bta/test/bta_dm_test.cc
@@ -16,9 +16,13 @@
#include <base/functional/bind.h>
#include <base/location.h>
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <chrono>
+#include <iostream>
+#include <memory>
+#include <string>
#include "bta/dm/bta_dm_int.h"
#include "bta/hf_client/bta_hf_client_int.h"
@@ -28,15 +32,20 @@
#include "btif/include/stack_manager.h"
#include "common/message_loop_thread.h"
#include "osi/include/compat.h"
+#include "stack/include/bt_dev_class.h"
+#include "stack/include/bt_name.h"
#include "stack/include/btm_status.h"
#include "test/common/main_handler.h"
#include "test/common/mock_functions.h"
+#include "test/fake/fake_osi.h"
#include "test/mock/mock_osi_alarm.h"
#include "test/mock/mock_osi_allocator.h"
#include "test/mock/mock_stack_acl.h"
+#include "test/mock/mock_stack_btm_inq.h"
#include "test/mock/mock_stack_btm_sec.h"
using namespace std::chrono_literals;
+using ::testing::ElementsAre;
extern struct btm_client_interface_t btm_client_interface;
@@ -48,12 +57,9 @@
constexpr uint8_t kUnusedTimer = BTA_ID_MAX;
const RawAddress kRawAddress({0x11, 0x22, 0x33, 0x44, 0x55, 0x66});
const RawAddress kRawAddress2({0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc});
-constexpr char kRemoteName[] = "TheRemoteName";
+const DEV_CLASS kDeviceClass = {0x11, 0x22, 0x33};
-const char* test_flags[] = {
- "INIT_logging_debug_enabled_for_all=true",
- nullptr,
-};
+constexpr char kRemoteName[] = "TheRemoteName";
bool bta_dm_search_sm_execute(BT_HDR_RIGID* p_msg) { return true; }
void bta_dm_search_sm_disable() { bta_sys_deregister(BTA_ID_DM_SEARCH); }
@@ -63,33 +69,11 @@
} // namespace
-struct alarm_t {
- alarm_t(const char* name){};
- int any_value;
-};
-
class BtaDmTest : public testing::Test {
protected:
void SetUp() override {
reset_mock_function_count_map();
- bluetooth::common::InitFlags::Load(test_flags);
- test::mock::osi_alarm::alarm_new.body = [](const char* name) -> alarm_t* {
- return new alarm_t(name);
- };
- test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) {
- delete alarm;
- };
- test::mock::osi_allocator::osi_malloc.body = [](size_t size) {
- return malloc(size);
- };
- test::mock::osi_allocator::osi_calloc.body = [](size_t size) {
- return calloc(1UL, size);
- };
- test::mock::osi_allocator::osi_free.body = [](void* ptr) { free(ptr); };
- test::mock::osi_allocator::osi_free_and_reset.body = [](void** ptr) {
- free(*ptr);
- *ptr = nullptr;
- };
+ fake_osi_ = std::make_unique<test::fake::FakeOsi>();
main_thread_start_up();
post_on_bt_main([]() { LOG_INFO("Main thread started up"); });
@@ -108,14 +92,9 @@
bta_dm_deinit_cb();
post_on_bt_main([]() { LOG_INFO("Main thread shutting down"); });
main_thread_shut_down();
-
- test::mock::osi_alarm::alarm_new = {};
- test::mock::osi_alarm::alarm_free = {};
- test::mock::osi_allocator::osi_malloc = {};
- test::mock::osi_allocator::osi_calloc = {};
- test::mock::osi_allocator::osi_free = {};
- test::mock::osi_allocator::osi_free_and_reset = {};
}
+
+ std::unique_ptr<test::fake::FakeOsi> fake_osi_;
};
TEST_F(BtaDmTest, nop) {
@@ -250,6 +229,10 @@
tBT_TRANSPORT bta_dm_determine_discovery_transport(
const RawAddress& remote_bd_addr);
+void btm_set_local_io_caps(uint8_t io_caps);
+
+tBTM_STATUS bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data);
+
} // namespace testing
} // namespace legacy
} // namespace bluetooth
@@ -540,3 +523,178 @@
bta_dm_remote_name_cmpl(&msg);
ASSERT_EQ(1, get_func_call_count("BTM_InqDbRead"));
}
+
+TEST_F(BtaDmTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithName) {
+ constexpr uint32_t kNumVal = 1234;
+ static bool callback_sent = false;
+ static tBTA_DM_SP_CFM_REQ cfm_req{};
+ bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+ callback_sent = true;
+ cfm_req = p_data->cfm_req;
+ });
+
+ bluetooth::legacy::testing::btm_set_local_io_caps(0xff);
+
+ tBTM_SP_EVT_DATA data = {
+ .cfm_req =
+ {
+ // tBTM_SP_CFM_REQ
+ .bd_addr = kRawAddress,
+ .dev_class = {},
+ .bd_name = {},
+ .num_val = kNumVal,
+ .just_works = false,
+ .loc_auth_req = BTM_AUTH_SP_YES,
+ .rmt_auth_req = BTM_AUTH_SP_YES,
+ .loc_io_caps = BTM_IO_CAP_NONE,
+ .rmt_io_caps = BTM_IO_CAP_NONE,
+ },
+ };
+ dev_class_copy(data.cfm_req.dev_class, kDeviceClass);
+ bd_name_copy(data.cfm_req.bd_name, kRemoteName);
+
+ ASSERT_EQ(btm_status_text(BTM_CMD_STARTED),
+ btm_status_text(bluetooth::legacy::testing::bta_dm_sp_cback(
+ BTM_SP_CFM_REQ_EVT, &data)));
+ ASSERT_EQ(kNumVal, bta_dm_cb.num_val);
+ ASSERT_TRUE(callback_sent);
+
+ ASSERT_EQ(kRawAddress, cfm_req.bd_addr);
+ ASSERT_THAT(cfm_req.dev_class,
+ ElementsAre(kDeviceClass[0], kDeviceClass[1], kDeviceClass[2]));
+ ASSERT_STREQ(kRemoteName, reinterpret_cast<const char*>(cfm_req.bd_name));
+ ASSERT_EQ(kNumVal, cfm_req.num_val);
+ ASSERT_EQ(false, cfm_req.just_works);
+ ASSERT_EQ(BTM_AUTH_SP_YES, cfm_req.loc_auth_req);
+ ASSERT_EQ(BTM_AUTH_SP_YES, cfm_req.rmt_auth_req);
+ ASSERT_EQ(BTM_IO_CAP_NONE, cfm_req.loc_io_caps);
+ ASSERT_EQ(BTM_IO_CAP_NONE, cfm_req.rmt_io_caps);
+}
+
+TEST_F(BtaDmTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRSuccess) {
+ constexpr uint32_t kNumVal = 1234;
+ static bool callback_sent = false;
+ test::mock::stack_btm_inq::BTM_ReadRemoteDeviceName.body =
+ [](const RawAddress& remote_bda, tBTM_NAME_CMPL_CB* p_cb,
+ tBT_TRANSPORT transport) { return BTM_CMD_STARTED; };
+
+ static tBTA_DM_SP_CFM_REQ cfm_req{};
+ bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+ callback_sent = true;
+ cfm_req = p_data->cfm_req;
+ });
+
+ bluetooth::legacy::testing::btm_set_local_io_caps(0xff);
+
+ tBTM_SP_EVT_DATA data = {
+ .cfm_req =
+ {
+ // tBTM_SP_CFM_REQ
+ .bd_addr = kRawAddress,
+ .dev_class = {},
+ .bd_name = {0},
+ .num_val = kNumVal,
+ .just_works = false,
+ .loc_auth_req = BTM_AUTH_SP_YES,
+ .rmt_auth_req = BTM_AUTH_SP_YES,
+ .loc_io_caps = BTM_IO_CAP_NONE,
+ .rmt_io_caps = BTM_IO_CAP_NONE,
+ },
+ };
+ dev_class_copy(data.cfm_req.dev_class, kDeviceClass);
+
+ ASSERT_EQ(btm_status_text(BTM_CMD_STARTED),
+ btm_status_text(bluetooth::legacy::testing::bta_dm_sp_cback(
+ BTM_SP_CFM_REQ_EVT, &data)));
+ ASSERT_EQ(kNumVal, bta_dm_cb.num_val);
+ ASSERT_FALSE(callback_sent);
+
+ test::mock::stack_btm_inq::BTM_ReadRemoteDeviceName = {};
+}
+
+TEST_F(BtaDmTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRFail) {
+ constexpr uint32_t kNumVal = 1234;
+ static bool callback_sent = false;
+ test::mock::stack_btm_inq::BTM_ReadRemoteDeviceName.body =
+ [](const RawAddress& remote_bda, tBTM_NAME_CMPL_CB* p_cb,
+ tBT_TRANSPORT transport) { return BTM_SUCCESS; };
+
+ static tBTA_DM_SP_CFM_REQ cfm_req{};
+ bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+ callback_sent = true;
+ cfm_req = p_data->cfm_req;
+ });
+
+ bluetooth::legacy::testing::btm_set_local_io_caps(0xff);
+
+ tBTM_SP_EVT_DATA data = {
+ .cfm_req =
+ {
+ // tBTM_SP_CFM_REQ
+ .bd_addr = kRawAddress,
+ .dev_class = {},
+ .bd_name = {0},
+ .num_val = kNumVal,
+ .just_works = false,
+ .loc_auth_req = BTM_AUTH_SP_YES,
+ .rmt_auth_req = BTM_AUTH_SP_YES,
+ .loc_io_caps = BTM_IO_CAP_NONE,
+ .rmt_io_caps = BTM_IO_CAP_NONE,
+ },
+ };
+ dev_class_copy(data.cfm_req.dev_class, kDeviceClass);
+
+ ASSERT_EQ(btm_status_text(BTM_CMD_STARTED),
+ btm_status_text(bluetooth::legacy::testing::bta_dm_sp_cback(
+ BTM_SP_CFM_REQ_EVT, &data)));
+ ASSERT_EQ(kNumVal, bta_dm_cb.num_val);
+ ASSERT_TRUE(callback_sent);
+
+ ASSERT_EQ(kRawAddress, cfm_req.bd_addr);
+ ASSERT_THAT(cfm_req.dev_class,
+ ElementsAre(kDeviceClass[0], kDeviceClass[1], kDeviceClass[2]));
+ ASSERT_EQ(kNumVal, cfm_req.num_val);
+ ASSERT_EQ(false, cfm_req.just_works);
+ ASSERT_EQ(BTM_AUTH_SP_YES, cfm_req.loc_auth_req);
+ ASSERT_EQ(BTM_AUTH_SP_YES, cfm_req.rmt_auth_req);
+ ASSERT_EQ(BTM_IO_CAP_NONE, cfm_req.loc_io_caps);
+ ASSERT_EQ(BTM_IO_CAP_NONE, cfm_req.rmt_io_caps);
+
+ test::mock::stack_btm_inq::BTM_ReadRemoteDeviceName = {};
+}
+
+TEST_F(BtaDmTest, bta_dm_sp_cback__BTM_SP_KEY_NOTIF_EVT) {
+ constexpr uint32_t kPassKey = 1234;
+ static bool callback_sent = false;
+ static tBTA_DM_SP_KEY_NOTIF key_notif{};
+ bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+ callback_sent = true;
+ key_notif = p_data->key_notif;
+ });
+ bluetooth::legacy::testing::btm_set_local_io_caps(0xff);
+
+ tBTM_SP_EVT_DATA data = {
+ .key_notif =
+ {
+ // tBTM_SP_KEY_NOTIF
+ .bd_addr = kRawAddress,
+ .dev_class = {},
+ .bd_name = {},
+ .passkey = kPassKey,
+ },
+ };
+ dev_class_copy(data.key_notif.dev_class, kDeviceClass);
+ bd_name_copy(data.key_notif.bd_name, kRemoteName);
+
+ ASSERT_EQ(btm_status_text(BTM_CMD_STARTED),
+ btm_status_text(bluetooth::legacy::testing::bta_dm_sp_cback(
+ BTM_SP_KEY_NOTIF_EVT, &data)));
+ ASSERT_EQ(kPassKey, bta_dm_cb.num_val);
+ ASSERT_TRUE(callback_sent);
+
+ ASSERT_EQ(kRawAddress, key_notif.bd_addr);
+ ASSERT_THAT(key_notif.dev_class,
+ ElementsAre(kDeviceClass[0], kDeviceClass[1], kDeviceClass[2]));
+ ASSERT_STREQ(kRemoteName, reinterpret_cast<const char*>(key_notif.bd_name));
+ ASSERT_EQ(kPassKey, key_notif.passkey);
+}
diff --git a/system/bta/test/bta_hf_client_add_record_test.cc b/system/bta/test/bta_hf_client_add_record_test.cc
index 851315f..5af4668 100644
--- a/system/bta/test/bta_hf_client_add_record_test.cc
+++ b/system/bta/test/bta_hf_client_add_record_test.cc
@@ -19,19 +19,18 @@
#include <base/logging.h>
#include <gtest/gtest.h>
+#include <memory>
+
#include "bta/hf_client/bta_hf_client_int.h"
#include "bta/include/bta_hf_client_api.h"
-#include "types/bluetooth/uuid.h"
-
-static uint16_t gVersion;
+#include "test/fake/fake_osi.h"
class BtaHfClientAddRecordTest : public ::testing::Test {
protected:
- void SetUp() override {
- gVersion = 0;
- }
+ void SetUp() override { fake_osi_ = std::make_unique<test::fake::FakeOsi>(); }
void TearDown() override {}
+ std::unique_ptr<test::fake::FakeOsi> fake_osi_;
};
TEST_F(BtaHfClientAddRecordTest, test_hf_client_add_record) {
diff --git a/system/bta/test/bta_hf_client_test.cc b/system/bta/test/bta_hf_client_test.cc
index ca45b44..d92585c 100644
--- a/system/bta/test/bta_hf_client_test.cc
+++ b/system/bta/test/bta_hf_client_test.cc
@@ -18,9 +18,12 @@
#include <gtest/gtest.h>
+#include <memory>
+
#include "bta/hf_client/bta_hf_client_int.h"
#include "bta/include/bta_hf_client_api.h"
#include "common/message_loop_thread.h"
+#include "test/fake/fake_osi.h"
#include "types/raw_address.h"
namespace base {
@@ -37,10 +40,12 @@
class BtaHfClientTest : public testing::Test {
protected:
void SetUp() override {
+ fake_osi_ = std::make_unique<test::fake::FakeOsi>();
// Reset the memory block, this is the state on which the allocate handle
// would start operating
bta_hf_client_cb_arr_init();
}
+ std::unique_ptr<test::fake::FakeOsi> fake_osi_;
};
// Test that when we can allocate a device on the block and then check
diff --git a/system/bta/test/bta_sdp_test.cc b/system/bta/test/bta_sdp_test.cc
index abc10db..d9ad012 100644
--- a/system/bta/test/bta_sdp_test.cc
+++ b/system/bta/test/bta_sdp_test.cc
@@ -18,39 +18,24 @@
#include <gtest/gtest.h>
#include <stdarg.h>
+#include <memory>
#include <string>
#include "bta/dm/bta_dm_int.h"
#include "test/common/main_handler.h"
-#include "test/mock/mock_osi_alarm.h"
-#include "test/mock/mock_osi_allocator.h"
+#include "test/fake/fake_osi.h"
#include "test/mock/mock_stack_gatt_api.h"
void BTA_dm_on_hw_on();
void BTA_dm_on_hw_off();
-struct alarm_t {
- alarm_t(const char* name){};
- int any_value;
-};
-
class BtaSdpTest : public testing::Test {
protected:
void SetUp() override {
- test::mock::osi_allocator::osi_calloc.body = [](size_t size) -> void* {
- return calloc(1, size);
- };
- test::mock::osi_allocator::osi_free.body = [](void* ptr) { free(ptr); };
- test::mock::osi_alarm::alarm_new.body = [](const char* name) -> alarm_t* {
- return new alarm_t(name);
- };
- test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) {
- delete alarm;
- };
+ fake_osi_ = std::make_unique<test::fake::FakeOsi>();
test::mock::stack_gatt_api::GATT_Register.body =
[](const bluetooth::Uuid& p_app_uuid128, const std::string name,
tGATT_CBACK* p_cb_info, bool eatt_support) { return 5; };
-
main_thread_start_up();
sync_main_handler();
@@ -64,11 +49,8 @@
main_thread_shut_down();
test::mock::stack_gatt_api::GATT_Register = {};
- test::mock::osi_allocator::osi_calloc = {};
- test::mock::osi_allocator::osi_free = {};
- test::mock::osi_alarm::alarm_new = {};
- test::mock::osi_alarm::alarm_free = {};
}
+ std::unique_ptr<test::fake::FakeOsi> fake_osi_;
};
class BtaSdpRegisteredTest : public BtaSdpTest {
diff --git a/system/bta/vc/vc.cc b/system/bta/vc/vc.cc
index 637f56e..0ace9f3 100644
--- a/system/bta/vc/vc.cc
+++ b/system/bta/vc/vc.cc
@@ -798,28 +798,6 @@
StartQueueOperation();
}
- void ProceedVolumeOperation(int operation_id) {
- auto op = find_if(ongoing_operations_.begin(), ongoing_operations_.end(),
- [operation_id](auto& operation) {
- return operation.operation_id_ == operation_id;
- });
-
- DLOG(INFO) << __func__ << " operation_id: " << operation_id;
-
- if (op == ongoing_operations_.end()) {
- LOG(ERROR) << __func__
- << " Could not find operation_id: " << operation_id;
- return;
- }
-
- DLOG(INFO) << __func__ << " procedure continued for operation_id: "
- << op->operation_id_;
-
- alarm_set_on_mloop(op->operation_timeout_, 3000, operation_callback,
- INT_TO_PTR(op->operation_id_));
- devices_control_point_helper(op->devices_, op->opcode_, &(op->arguments_));
- }
-
void PrepareVolumeControlOperation(std::vector<RawAddress> devices,
int group_id, bool is_autonomous,
uint8_t opcode,
diff --git a/system/btif/co/bta_hh_co.cc b/system/btif/co/bta_hh_co.cc
index 1fb0668..1918f2f 100644
--- a/system/btif/co/bta_hh_co.cc
+++ b/system/btif/co/bta_hh_co.cc
@@ -48,10 +48,15 @@
#define BTA_HH_CACHE_REPORT_VERSION 1
#define THREAD_NORMAL_PRIORITY 0
#define BT_HH_THREAD "bt_hh_thread"
+#define BTA_HH_UHID_POLL_PERIOD_MS 50
+/* Max number of polling interrupt allowed */
+#define BTA_HH_UHID_INTERRUPT_COUNT_MAX 100
static const bthh_report_type_t map_rtype_uhid_hh[] = {
BTHH_FEATURE_REPORT, BTHH_OUTPUT_REPORT, BTHH_INPUT_REPORT};
+static void* btif_hh_poll_event_thread(void* arg);
+
void uhid_set_non_blocking(int fd) {
int opts = fcntl(fd, F_GETFL);
if (opts < 0)
@@ -265,6 +270,36 @@
return thread_id;
}
+/* Internal function to close the UHID driver*/
+static void uhid_fd_close(btif_hh_device_t* p_dev) {
+ if (p_dev->fd >= 0) {
+ struct uhid_event ev = {};
+ ev.type = UHID_DESTROY;
+ uhid_write(p_dev->fd, &ev);
+ LOG_DEBUG("Closing fd=%d, addr:%s", p_dev->fd,
+ ADDRESS_TO_LOGGABLE_CSTR(p_dev->bd_addr));
+ close(p_dev->fd);
+ p_dev->fd = -1;
+ }
+}
+
+/* Internal function to open the UHID driver*/
+static bool uhid_fd_open(btif_hh_device_t* p_dev) {
+ if (p_dev->fd < 0) {
+ p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
+ if (p_dev->fd < 0) {
+ LOG_ERROR("Failed to open uhid, err:%s", strerror(errno));
+ return false;
+ }
+ }
+
+ if (p_dev->hh_keep_polling == 0) {
+ p_dev->hh_keep_polling = 1;
+ p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
+ }
+ return true;
+}
+
/*******************************************************************************
*
* Function btif_hh_poll_event_thread
@@ -277,20 +312,23 @@
static void* btif_hh_poll_event_thread(void* arg) {
btif_hh_device_t* p_dev = (btif_hh_device_t*)arg;
struct pollfd pfds[1];
+ pid_t pid = gettid();
// This thread is created by bt_main_thread with RT priority. Lower the thread
// priority here since the tasks in this thread is not timing critical.
struct sched_param sched_params;
sched_params.sched_priority = THREAD_NORMAL_PRIORITY;
- if (sched_setscheduler(gettid(), SCHED_OTHER, &sched_params)) {
- APPL_TRACE_ERROR("%s: Failed to set thread priority to normal", __func__);
+ if (sched_setscheduler(pid, SCHED_OTHER, &sched_params)) {
+ LOG_ERROR("Failed to set thread priority to normal: %s", strerror(errno));
p_dev->hh_poll_thread_id = -1;
+ p_dev->hh_keep_polling = 0;
+ uhid_fd_close(p_dev);
return 0;
}
- p_dev->pid = gettid();
+
pthread_setname_np(pthread_self(), BT_HH_THREAD);
LOG_DEBUG("Host hid polling thread created name:%s pid:%d fd:%d",
- BT_HH_THREAD, p_dev->pid, p_dev->fd);
+ BT_HH_THREAD, pid, p_dev->fd);
pfds[0].fd = p_dev->fd;
pfds[0].events = POLLIN;
@@ -300,40 +338,37 @@
while (p_dev->hh_keep_polling) {
int ret;
- OSI_NO_INTR(ret = poll(pfds, 1, 50));
+ int counter = 0;
+
+ do {
+ if (counter++ > BTA_HH_UHID_INTERRUPT_COUNT_MAX) {
+ LOG_ERROR("Polling interrupted");
+ break;
+ }
+ ret = poll(pfds, 1, BTA_HH_UHID_POLL_PERIOD_MS);
+ } while (ret == -1 && errno == EINTR);
+
if (ret < 0) {
- APPL_TRACE_ERROR("%s: Cannot poll for fds: %s\n", __func__,
- strerror(errno));
+ LOG_ERROR("Cannot poll for fds: %s\n", strerror(errno));
break;
}
if (pfds[0].revents & POLLIN) {
APPL_TRACE_DEBUG("%s: POLLIN", __func__);
ret = uhid_read_event(p_dev);
- if (ret != 0) break;
+ if (ret != 0) {
+ LOG_ERROR("Unhandled UHID event");
+ break;
+ }
}
}
+ /* Todo: Disconnect if loop exited due to a failure */
+ LOG_INFO("Polling thread stopped for device %s",
+ ADDRESS_TO_LOGGABLE_CSTR(p_dev->bd_addr));
p_dev->hh_poll_thread_id = -1;
- p_dev->pid = -1;
- return 0;
-}
-
-static inline void btif_hh_close_poll_thread(btif_hh_device_t* p_dev) {
- APPL_TRACE_DEBUG("%s", __func__);
p_dev->hh_keep_polling = 0;
- if (p_dev->hh_poll_thread_id > 0)
- pthread_join(p_dev->hh_poll_thread_id, NULL);
-
- return;
-}
-
-void bta_hh_co_destroy(int fd) {
- struct uhid_event ev;
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_DESTROY;
- uhid_write(fd, &ev);
- APPL_TRACE_DEBUG("%s: Closing fd=%d", __func__, fd);
- close(fd);
+ uhid_fd_close(p_dev);
+ return 0;
}
int bta_hh_co_write(int fd, uint8_t* rpt, uint16_t len) {
@@ -352,22 +387,6 @@
return uhid_write(fd, &ev);
}
-static bool uhid_fd_open(btif_hh_device_t* p_dev) {
- if (p_dev->fd < 0) {
- p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
- if (p_dev->fd < 0) {
- LOG_ERROR("Failed to open uhid, err:%s", strerror(errno));
- return false;
- }
- }
-
- if (p_dev->hh_keep_polling == 0) {
- p_dev->hh_keep_polling = 1;
- p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
- }
- return true;
-}
-
/*******************************************************************************
*
* Function bta_hh_co_open
@@ -455,43 +474,31 @@
* Description When connection is closed, this call-out function is executed
* by HH to do platform specific finalization.
*
- * Parameters dev_handle - device handle
- * app_id - application id
+ * Parameters p_dev - device
*
- * Returns void.
+ * Returns void.
******************************************************************************/
-void bta_hh_co_close(uint8_t dev_handle, uint8_t app_id) {
- uint32_t i;
- btif_hh_device_t* p_dev = NULL;
+void bta_hh_co_close(btif_hh_device_t* p_dev) {
+ LOG_INFO("Closing device handle=%d, status=%d, address=%s", p_dev->dev_handle,
+ p_dev->dev_status, ADDRESS_TO_LOGGABLE_CSTR(p_dev->bd_addr));
- APPL_TRACE_WARNING("%s: dev_handle = %d, app_id = %d", __func__, dev_handle,
- app_id);
- if (dev_handle == BTA_HH_INVALID_HANDLE) {
- APPL_TRACE_WARNING("%s: Oops, dev_handle (%d) is invalid...", __func__,
- dev_handle);
- return;
- }
-
- for (i = 0; i < BTIF_HH_MAX_HID; i++) {
- p_dev = &btif_hh_cb.devices[i];
- fixed_queue_flush(p_dev->get_rpt_id_queue, osi_free);
- fixed_queue_free(p_dev->get_rpt_id_queue, NULL);
- p_dev->get_rpt_id_queue = NULL;
+ /* Clear the queues */
+ fixed_queue_flush(p_dev->get_rpt_id_queue, osi_free);
+ fixed_queue_free(p_dev->get_rpt_id_queue, NULL);
+ p_dev->get_rpt_id_queue = NULL;
#if ENABLE_UHID_SET_REPORT
- fixed_queue_flush(p_dev->set_rpt_id_queue, osi_free);
- fixed_queue_free(p_dev->set_rpt_id_queue, nullptr);
- p_dev->set_rpt_id_queue = nullptr;
+ fixed_queue_flush(p_dev->set_rpt_id_queue, osi_free);
+ fixed_queue_free(p_dev->set_rpt_id_queue, nullptr);
+ p_dev->set_rpt_id_queue = nullptr;
#endif // ENABLE_UHID_SET_REPORT
- if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN &&
- p_dev->dev_handle == dev_handle) {
- APPL_TRACE_WARNING(
- "%s: Found an existing device with the same handle "
- "dev_status = %d, dev_handle =%d",
- __func__, p_dev->dev_status, p_dev->dev_handle);
- btif_hh_close_poll_thread(p_dev);
- break;
- }
+
+ /* Stop the polling thread */
+ p_dev->hh_keep_polling = 0;
+ if (p_dev->hh_poll_thread_id > 0) {
+ pthread_join(p_dev->hh_poll_thread_id, NULL);
}
+ p_dev->hh_poll_thread_id = -1;
+ /* UHID file descriptor is closed by the polling thread */
}
/*******************************************************************************
diff --git a/system/btif/include/btif_hh.h b/system/btif/include/btif_hh.h
index c59fc66..d524687 100644
--- a/system/btif/include/btif_hh.h
+++ b/system/btif/include/btif_hh.h
@@ -97,7 +97,6 @@
int fd;
bool ready_for_data;
pthread_t hh_poll_thread_id;
- pid_t pid{-1};
uint8_t hh_keep_polling;
alarm_t* vup_timer;
fixed_queue_t* get_rpt_id_queue;
diff --git a/system/btif/src/btif_hh.cc b/system/btif/src/btif_hh.cc
index 451cee1..add6c4c 100644
--- a/system/btif/src/btif_hh.cc
+++ b/system/btif/src/btif_hh.cc
@@ -119,7 +119,7 @@
******************************************************************************/
bool check_cod(const RawAddress* remote_bdaddr, uint32_t cod);
bool check_cod_hid(const RawAddress* remote_bdaddr);
-void bta_hh_co_destroy(int fd);
+void bta_hh_co_close(btif_hh_device_t* p_dev);
void bta_hh_co_send_hid_info(btif_hh_device_t* p_dev, const char* dev_name,
uint16_t vendor_id, uint16_t product_id,
uint16_t version, uint8_t ctry_code, int dscp_len,
@@ -528,13 +528,7 @@
BTIF_TRACE_WARNING("%s: device_num = 0", __func__);
}
- p_dev->hh_keep_polling = 0;
- p_dev->hh_poll_thread_id = -1;
- BTIF_TRACE_DEBUG("%s: uhid fd = %d", __func__, p_dev->fd);
- if (p_dev->fd >= 0) {
- bta_hh_co_destroy(p_dev->fd);
- p_dev->fd = -1;
- }
+ bta_hh_co_close(p_dev);
}
bool btif_hh_copy_hid_info(tBTA_HH_DEV_DSCP_INFO* dest,
@@ -889,10 +883,7 @@
btif_hh_cb.status = (BTIF_HH_STATUS)BTIF_HH_DEV_DISCONNECTED;
p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
- if (p_dev->fd >= 0) {
- bta_hh_co_destroy(p_dev->fd);
- p_dev->fd = -1;
- }
+ bta_hh_co_close(p_dev);
HAL_CBACK(bt_hh_callbacks, connection_state_cb, &(p_dev->bd_addr),
p_dev->dev_status);
} else {
@@ -1821,12 +1812,7 @@
p_dev = &btif_hh_cb.devices[i];
if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->fd >= 0) {
BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __func__, p_dev->fd);
- if (p_dev->fd >= 0) {
- bta_hh_co_destroy(p_dev->fd);
- p_dev->fd = -1;
- }
- p_dev->hh_keep_polling = 0;
- p_dev->hh_poll_thread_id = -1;
+ bta_hh_co_close(p_dev);
}
}
}
diff --git a/system/device/include/esco_parameters.h b/system/device/include/esco_parameters.h
index ed206b8..9096796 100644
--- a/system/device/include/esco_parameters.h
+++ b/system/device/include/esco_parameters.h
@@ -137,6 +137,8 @@
esco_packet_types_t packet_types; /* Packet Types */
esco_retransmission_effort_t
retransmission_effort; /* 0x00-0x02, 0xFF don't care */
+ esco_coding_format_t
+ coding_format; /* Extra field to store codec when TX/RX is transparent */
} enh_esco_params_t;
// Get the enhanced eSCO configuration parameters for the provided |codec|
diff --git a/system/device/src/esco_parameters.cc b/system/device/src/esco_parameters.cc
index 48607e6..861dfd9 100644
--- a/system/device/src/esco_parameters.cc
+++ b/system/device/src/esco_parameters.cc
@@ -57,6 +57,7 @@
.packet_types = (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 |
ESCO_PKT_TYPES_MASK_HV3),
.retransmission_effort = ESCO_RETRANSMISSION_OFF,
+ .coding_format = ESCO_CODING_FORMAT_CVSD,
},
// CVSD S3
{
@@ -96,6 +97,7 @@
ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 |
ESCO_PKT_TYPES_MASK_NO_3_EV5),
.retransmission_effort = ESCO_RETRANSMISSION_POWER,
+ .coding_format = ESCO_CODING_FORMAT_CVSD,
},
// CVSD S4
{
@@ -135,6 +137,7 @@
ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 |
ESCO_PKT_TYPES_MASK_NO_3_EV5),
.retransmission_effort = ESCO_RETRANSMISSION_QUALITY,
+ .coding_format = ESCO_CODING_FORMAT_CVSD,
},
// mSBC T1
{
@@ -172,6 +175,7 @@
ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5 |
ESCO_PKT_TYPES_MASK_NO_2_EV3),
.retransmission_effort = ESCO_RETRANSMISSION_QUALITY,
+ .coding_format = ESCO_CODING_FORMAT_MSBC,
},
// mSBC T2
{
@@ -208,6 +212,7 @@
(ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 |
ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5),
.retransmission_effort = ESCO_RETRANSMISSION_QUALITY,
+ .coding_format = ESCO_CODING_FORMAT_MSBC,
},
// LC3 T1
{
@@ -245,6 +250,7 @@
ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5 |
ESCO_PKT_TYPES_MASK_NO_2_EV3),
.retransmission_effort = ESCO_RETRANSMISSION_QUALITY,
+ .coding_format = ESCO_CODING_FORMAT_LC3,
},
// LC3 T2
{
@@ -281,6 +287,7 @@
(ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 |
ESCO_PKT_TYPES_MASK_NO_3_EV5),
.retransmission_effort = ESCO_RETRANSMISSION_QUALITY,
+ .coding_format = ESCO_CODING_FORMAT_LC3,
},
};
diff --git a/system/gd/hci/acl_manager/connection_callbacks_mock.h b/system/gd/hci/acl_manager/connection_callbacks_mock.h
new file mode 100644
index 0000000..4f50b8a
--- /dev/null
+++ b/system/gd/hci/acl_manager/connection_callbacks_mock.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2023 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>
+#include <memory>
+
+#include "hci/acl_manager/connection_callbacks.h"
+#include "hci/hci_packets.h"
+
+namespace bluetooth {
+namespace hci {
+namespace acl_manager {
+
+class MockConnectionCallback : public ConnectionCallbacks {
+ public:
+ MOCK_METHOD(
+ void, OnConnectSuccess, (std::unique_ptr<ClassicAclConnection> connection), (override));
+ MOCK_METHOD(void, OnConnectRequest, (Address, ClassOfDevice), (override));
+ MOCK_METHOD(void, OnConnectFail, (Address, ErrorCode reason, bool locally_initiated), (override));
+
+ MOCK_METHOD(void, HACK_OnEscoConnectRequest, (Address, ClassOfDevice), (override));
+ MOCK_METHOD(void, HACK_OnScoConnectRequest, (Address, ClassOfDevice), (override));
+};
+
+} // namespace acl_manager
+} // namespace hci
+} // namespace bluetooth
diff --git a/system/gd/hci/acl_manager/connection_management_callbacks_mock.h b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h
new file mode 100644
index 0000000..88ab212
--- /dev/null
+++ b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2023 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 <array>
+#include <cstdint>
+
+#include "hci/acl_manager/connection_management_callbacks.h"
+#include "hci/hci_packets.h"
+
+namespace bluetooth {
+namespace hci {
+namespace acl_manager {
+
+class MockConnectionManagementCallbacks : public ConnectionManagementCallbacks {
+ public:
+ MOCK_METHOD(void, OnConnectionPacketTypeChanged, (uint16_t packet_type), (override));
+ MOCK_METHOD(void, OnAuthenticationComplete, (ErrorCode hci_status), (override));
+ MOCK_METHOD(void, OnEncryptionChange, (EncryptionEnabled enabled)), (override);
+ MOCK_METHOD(void, OnChangeConnectionLinkKeyComplete, (), (override));
+ MOCK_METHOD(void, OnReadClockOffsetComplete, (uint16_t clock_offse), (override));
+ MOCK_METHOD(
+ void, OnModeChange, (ErrorCode status, Mode current_mode, uint16_t interval), (override));
+ MOCK_METHOD(
+ void,
+ OnSniffSubrating,
+ (ErrorCode status,
+ uint16_t maximum_transmit_latency,
+ uint16_t maximum_receive_latency,
+ uint16_t minimum_remote_timeout,
+ uint16_t minimum_local_timeout),
+ (override));
+ MOCK_METHOD(
+ void,
+ OnQosSetupComplete,
+ (ServiceType service_type,
+ uint32_t token_rate,
+ uint32_t peak_bandwidth,
+ uint32_t latency,
+ uint32_t delay_variation),
+ (override));
+ MOCK_METHOD(
+ void,
+ OnFlowSpecificationComplete,
+ (FlowDirection flow_direction,
+ ServiceType service_type,
+ uint32_t token_rate,
+ uint32_t token_bucket_size,
+ uint32_t peak_bandwidth,
+ uint32_t access_latency),
+ (override));
+ MOCK_METHOD(void, OnFlushOccurred, (), (override));
+ MOCK_METHOD(void, OnRoleDiscoveryComplete, (Role current_role), (override));
+ MOCK_METHOD(void, OnReadLinkPolicySettingsComplete, (uint16_t link_policy_settings), (override));
+ MOCK_METHOD(void, OnReadAutomaticFlushTimeoutComplete, (uint16_t flush_timeout), (override));
+ MOCK_METHOD(void, OnReadTransmitPowerLevelComplete, (uint8_t transmit_power_level), (override));
+ MOCK_METHOD(
+ void, OnReadLinkSupervisionTimeoutComplete, (uint16_t link_supervision_timeout), (override));
+ MOCK_METHOD(
+ void, OnReadFailedContactCounterComplete, (uint16_t failed_contact_counter), (override));
+ MOCK_METHOD(void, OnReadLinkQualityComplete, (uint8_t link_quality), (override));
+ MOCK_METHOD(
+ void,
+ OnReadAfhChannelMapComplete,
+ (AfhMode afh_mode, (std::array<uint8_t, 10>)afh_channel_map),
+ (override));
+ MOCK_METHOD(void, OnReadRssiComplete, (uint8_t rssi), (override));
+ MOCK_METHOD(void, OnReadClockComplete, (uint32_t clock, uint16_t accuracy), (override));
+ MOCK_METHOD(void, OnCentralLinkKeyComplete, (KeyFlag flag), (override));
+ MOCK_METHOD(void, OnRoleChange, (ErrorCode hci_status, Role new_role), (override));
+ MOCK_METHOD(void, OnDisconnection, (ErrorCode reason), (override));
+ MOCK_METHOD(
+ void,
+ OnReadRemoteVersionInformationComplete,
+ (ErrorCode hci_status, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version),
+ (override));
+ MOCK_METHOD(void, OnReadRemoteSupportedFeaturesComplete, (uint64_t features), (override));
+ MOCK_METHOD(
+ void,
+ OnReadRemoteExtendedFeaturesComplete,
+ (uint8_t page_number, uint8_t max_page_number, uint64_t features),
+ (override));
+};
+
+} // namespace acl_manager
+} // namespace hci
+} // namespace bluetooth
diff --git a/system/gd/hci/acl_manager_test.cc b/system/gd/hci/acl_manager_test.cc
index 2e1f82f..594fa62 100644
--- a/system/gd/hci/acl_manager_test.cc
+++ b/system/gd/hci/acl_manager_test.cc
@@ -25,40 +25,46 @@
#include <map>
#include "common/bind.h"
+#include "hci/acl_manager/connection_callbacks_mock.h"
+#include "hci/acl_manager/connection_management_callbacks_mock.h"
#include "hci/acl_manager/le_connection_callbacks_mock.h"
#include "hci/acl_manager/le_connection_management_callbacks_mock.h"
#include "hci/address.h"
#include "hci/class_of_device.h"
#include "hci/controller.h"
+#include "hci/controller_mock.h"
#include "hci/hci_layer.h"
#include "hci/hci_layer_fake.h"
#include "os/fake_timer/fake_timerfd.h"
#include "os/thread.h"
#include "packet/raw_builder.h"
+using bluetooth::common::BidiQueue;
+using bluetooth::common::BidiQueueEnd;
+using bluetooth::os::fake_timer::fake_timerfd_advance;
+using bluetooth::packet::kLittleEndian;
+using bluetooth::packet::PacketView;
+using bluetooth::packet::RawBuilder;
using testing::_;
-namespace bluetooth {
-namespace hci {
-namespace acl_manager {
namespace {
-using common::BidiQueue;
-using common::BidiQueueEnd;
-using os::fake_timer::fake_timerfd_advance;
-using packet::kLittleEndian;
-using packet::PacketView;
-using packet::RawBuilder;
-
constexpr auto kTimeout = std::chrono::seconds(2);
constexpr auto kShortTimeout = std::chrono::milliseconds(100);
+constexpr uint16_t kHciHandle = 123;
constexpr uint16_t kScanIntervalFast = 0x0060;
constexpr uint16_t kScanWindowFast = 0x0030;
constexpr uint16_t kScanIntervalSlow = 0x0800;
constexpr uint16_t kScanWindowSlow = 0x0030;
-const AddressWithType empty_address_with_type = hci::AddressWithType();
+const bluetooth::hci::AddressWithType empty_address_with_type = bluetooth::hci::AddressWithType();
-class TestController : public Controller {
+} // namespace
+
+namespace bluetooth {
+namespace hci {
+namespace acl_manager {
+
+class TestController : public testing::MockController {
public:
void RegisterCompletedAclPacketsCallback(
common::ContextualCallback<void(uint16_t /* handle */, uint16_t /* packets */)> cb) override {
@@ -106,7 +112,13 @@
protected:
void SetUp() override {
test_hci_layer_ = new TestHciLayer; // Ownership is transferred to registry
- test_controller_ = new TestController;
+ test_controller_ = new TestController; // Ownership is transferred to registry
+
+ EXPECT_CALL(*test_controller_, GetMacAddress());
+ EXPECT_CALL(*test_controller_, GetLeFilterAcceptListSize());
+ EXPECT_CALL(*test_controller_, GetLeResolvingListSize());
+ EXPECT_CALL(*test_controller_, SupportsBlePrivacy());
+
fake_registry_.InjectTestModule(&HciLayer::Factory, test_hci_layer_);
fake_registry_.InjectTestModule(&Controller::Factory, test_controller_);
client_handler_ = fake_registry_.GetTestModuleHandler(&HciLayer::Factory);
@@ -133,13 +145,22 @@
my_initiating_address = AddressWithType(
set_random_address_packet.GetRandomAddress(), AddressType::RANDOM_DEVICE_ADDRESS);
test_hci_layer_->IncomingEvent(LeSetRandomAddressCompleteBuilder::Create(0x01, ErrorCode::SUCCESS));
+
+ ON_CALL(mock_connection_callback_, OnConnectSuccess)
+ .WillByDefault([this](std::unique_ptr<ClassicAclConnection> connection) {
+ connections_.push_back(std::move(connection));
+ if (connection_promise_ != nullptr) {
+ connection_promise_->set_value();
+ connection_promise_.reset();
+ }
+ });
}
void TearDown() override {
// Invalid mutex exception is raised if the connections
// are cleared after the AclConnectionInterface is deleted
// through fake_registry_.
- mock_connection_callback_.Clear();
+ connections_.clear();
le_connections_.clear();
fake_registry_.SynchronizeModuleHandler(&AclManager::Factory, std::chrono::milliseconds(20));
fake_registry_.StopAll();
@@ -160,9 +181,9 @@
const bool use_connect_list_ = true; // gd currently only supports connect list
std::future<void> GetConnectionFuture() {
- ASSERT_LOG(mock_connection_callback_.connection_promise_ == nullptr, "Promises promises ... Only one at a time");
- mock_connection_callback_.connection_promise_ = std::make_unique<std::promise<void>>();
- return mock_connection_callback_.connection_promise_->get_future();
+ ASSERT_LOG(connection_promise_ == nullptr, "Promises promises ... Only one at a time");
+ connection_promise_ = std::make_unique<std::promise<void>>();
+ return connection_promise_->get_future();
}
std::future<void> GetLeConnectionFuture() {
@@ -172,7 +193,7 @@
}
std::shared_ptr<ClassicAclConnection> GetLastConnection() {
- return mock_connection_callback_.connections_.back();
+ return connections_.back();
}
std::shared_ptr<LeAclConnection> GetLastLeConnection() {
@@ -203,29 +224,9 @@
return command;
}
- class MockConnectionCallback : public ConnectionCallbacks {
- public:
- void OnConnectSuccess(std::unique_ptr<ClassicAclConnection> connection) override {
- // Convert to std::shared_ptr during push_back()
- connections_.push_back(std::move(connection));
- if (connection_promise_ != nullptr) {
- connection_promise_->set_value();
- connection_promise_.reset();
- }
- }
-
- void Clear() {
- connections_.clear();
- }
- MOCK_METHOD(void, OnConnectRequest, (Address, ClassOfDevice), (override));
- MOCK_METHOD(void, OnConnectFail, (Address, ErrorCode reason, bool locally_initiated), (override));
-
- MOCK_METHOD(void, HACK_OnEscoConnectRequest, (Address, ClassOfDevice), (override));
- MOCK_METHOD(void, HACK_OnScoConnectRequest, (Address, ClassOfDevice), (override));
-
- std::list<std::shared_ptr<ClassicAclConnection>> connections_;
- std::unique_ptr<std::promise<void>> connection_promise_;
- } mock_connection_callback_;
+ std::list<std::shared_ptr<ClassicAclConnection>> connections_;
+ std::unique_ptr<std::promise<void>> connection_promise_;
+ MockConnectionCallback mock_connection_callback_;
std::list<std::shared_ptr<LeAclConnection>> le_connections_;
std::unique_ptr<std::promise<void>> le_connection_promise_;
@@ -272,7 +273,7 @@
// Invalid mutex exception is raised if the connection
// is cleared after the AclConnectionInterface is deleted
// through fake_registry_.
- mock_connection_callback_.Clear();
+ connections_.clear();
le_connections_.clear();
connection_.reset();
fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
@@ -283,55 +284,12 @@
uint16_t handle_;
std::shared_ptr<ClassicAclConnection> connection_;
- class MockConnectionManagementCallbacks : public ConnectionManagementCallbacks {
- public:
- MOCK_METHOD1(OnConnectionPacketTypeChanged, void(uint16_t packet_type));
- MOCK_METHOD1(OnAuthenticationComplete, void(hci::ErrorCode hci_status));
- MOCK_METHOD1(OnEncryptionChange, void(EncryptionEnabled enabled));
- MOCK_METHOD0(OnChangeConnectionLinkKeyComplete, void());
- MOCK_METHOD1(OnReadClockOffsetComplete, void(uint16_t clock_offse));
- MOCK_METHOD3(OnModeChange, void(ErrorCode status, Mode current_mode, uint16_t interval));
- MOCK_METHOD5(
- OnSniffSubrating,
- void(
- ErrorCode status,
- uint16_t maximum_transmit_latency,
- uint16_t maximum_receive_latency,
- uint16_t minimum_remote_timeout,
- uint16_t minimum_local_timeout));
- MOCK_METHOD5(OnQosSetupComplete, void(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
- uint32_t latency, uint32_t delay_variation));
- MOCK_METHOD6(OnFlowSpecificationComplete,
- void(FlowDirection flow_direction, ServiceType service_type, uint32_t token_rate,
- uint32_t token_bucket_size, uint32_t peak_bandwidth, uint32_t access_latency));
- MOCK_METHOD0(OnFlushOccurred, void());
- MOCK_METHOD1(OnRoleDiscoveryComplete, void(Role current_role));
- MOCK_METHOD1(OnReadLinkPolicySettingsComplete, void(uint16_t link_policy_settings));
- MOCK_METHOD1(OnReadAutomaticFlushTimeoutComplete, void(uint16_t flush_timeout));
- MOCK_METHOD1(OnReadTransmitPowerLevelComplete, void(uint8_t transmit_power_level));
- MOCK_METHOD1(OnReadLinkSupervisionTimeoutComplete, void(uint16_t link_supervision_timeout));
- MOCK_METHOD1(OnReadFailedContactCounterComplete, void(uint16_t failed_contact_counter));
- MOCK_METHOD1(OnReadLinkQualityComplete, void(uint8_t link_quality));
- MOCK_METHOD2(OnReadAfhChannelMapComplete, void(AfhMode afh_mode, std::array<uint8_t, 10> afh_channel_map));
- MOCK_METHOD1(OnReadRssiComplete, void(uint8_t rssi));
- MOCK_METHOD2(OnReadClockComplete, void(uint32_t clock, uint16_t accuracy));
- MOCK_METHOD1(OnCentralLinkKeyComplete, void(KeyFlag flag));
- MOCK_METHOD2(OnRoleChange, void(ErrorCode hci_status, Role new_role));
- MOCK_METHOD1(OnDisconnection, void(ErrorCode reason));
- MOCK_METHOD4(
- OnReadRemoteVersionInformationComplete,
- void(hci::ErrorCode hci_status, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version));
- MOCK_METHOD1(OnReadRemoteSupportedFeaturesComplete, void(uint64_t features));
- MOCK_METHOD3(
- OnReadRemoteExtendedFeaturesComplete, void(uint8_t page_number, uint8_t max_page_number, uint64_t features));
- } mock_connection_management_callbacks_;
+ MockConnectionManagementCallbacks mock_connection_management_callbacks_;
};
TEST_F(AclManagerTest, startup_teardown) {}
TEST_F(AclManagerTest, invoke_registered_callback_connection_complete_success) {
- uint16_t handle = 1;
-
acl_manager_->CreateConnection(remote);
// Wait for the connection request
@@ -342,8 +300,8 @@
auto first_connection = GetConnectionFuture();
- test_hci_layer_->IncomingEvent(
- ConnectionCompleteBuilder::Create(ErrorCode::SUCCESS, handle, remote, LinkType::ACL, Enable::DISABLED));
+ test_hci_layer_->IncomingEvent(ConnectionCompleteBuilder::Create(
+ ErrorCode::SUCCESS, kHciHandle, remote, LinkType::ACL, Enable::DISABLED));
auto first_connection_status = first_connection.wait_for(kTimeout);
ASSERT_EQ(first_connection_status, std::future_status::ready);
@@ -353,8 +311,6 @@
}
TEST_F(AclManagerTest, invoke_registered_callback_connection_complete_fail) {
- uint16_t handle = 0x123;
-
acl_manager_->CreateConnection(remote);
// Wait for the connection request
@@ -363,12 +319,36 @@
last_command = GetConnectionManagementCommand(OpCode::CREATE_CONNECTION);
}
+ struct callback_t {
+ hci::Address bd_addr;
+ hci::ErrorCode reason;
+ bool is_locally_initiated;
+ };
+
+ auto promise = std::promise<callback_t>();
+ auto future = promise.get_future();
+ ON_CALL(mock_connection_callback_, OnConnectFail)
+ .WillByDefault(
+ [&promise](hci::Address bd_addr, hci::ErrorCode reason, bool is_locally_initiated) {
+ promise.set_value({
+ .bd_addr = bd_addr,
+ .reason = reason,
+ .is_locally_initiated = is_locally_initiated,
+ });
+ });
+
EXPECT_CALL(mock_connection_callback_, OnConnectFail(remote, ErrorCode::PAGE_TIMEOUT, true));
- test_hci_layer_->IncomingEvent(
- ConnectionCompleteBuilder::Create(ErrorCode::PAGE_TIMEOUT, handle, remote, LinkType::ACL, Enable::DISABLED));
- fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
- fake_registry_.SynchronizeModuleHandler(&AclManager::Factory, std::chrono::milliseconds(20));
- fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
+
+ // Remote response event to the connection request
+ test_hci_layer_->IncomingEvent(ConnectionCompleteBuilder::Create(
+ ErrorCode::PAGE_TIMEOUT, kHciHandle, remote, LinkType::ACL, Enable::DISABLED));
+
+ ASSERT_EQ(std::future_status::ready, future.wait_for(kTimeout));
+ auto callback = future.get();
+
+ ASSERT_EQ(remote, callback.bd_addr);
+ ASSERT_EQ(ErrorCode::PAGE_TIMEOUT, callback.reason);
+ ASSERT_EQ(true, callback.is_locally_initiated);
}
class AclManagerWithLeConnectionTest : public AclManagerTest {
@@ -436,7 +416,7 @@
// Invalid mutex exception is raised if the connection
// is cleared after the AclConnectionInterface is deleted
// through fake_registry_.
- mock_connection_callback_.Clear();
+ connections_.clear();
le_connections_.clear();
connection_.reset();
fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
@@ -1407,7 +1387,6 @@
fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
}
-} // namespace
} // namespace acl_manager
} // namespace hci
} // namespace bluetooth
diff --git a/system/gd/hci/le_scanning_manager.cc b/system/gd/hci/le_scanning_manager.cc
index 7301d80..462dd28 100644
--- a/system/gd/hci/le_scanning_manager.cc
+++ b/system/gd/hci/le_scanning_manager.cc
@@ -870,7 +870,7 @@
combined_data.push_back((uint8_t)data);
combined_data.push_back((uint8_t)(data >> 8));
} else if (uuid_len == Uuid::kNumBytes32) {
- uint16_t data = uuid.As32Bit();
+ uint32_t data = uuid.As32Bit();
combined_data.push_back((uint8_t)data);
combined_data.push_back((uint8_t)(data >> 8));
combined_data.push_back((uint8_t)(data >> 16));
@@ -889,7 +889,7 @@
combined_data.push_back((uint8_t)data);
combined_data.push_back((uint8_t)(data >> 8));
} else if (uuid_len == Uuid::kNumBytes32) {
- uint16_t data = uuid_mask.As32Bit();
+ uint32_t data = uuid_mask.As32Bit();
combined_data.push_back((uint8_t)data);
combined_data.push_back((uint8_t)(data >> 8));
combined_data.push_back((uint8_t)(data >> 16));
diff --git a/system/gd/rust/common/src/init_flags.rs b/system/gd/rust/common/src/init_flags.rs
index 598346c..38882be 100644
--- a/system/gd/rust/common/src/init_flags.rs
+++ b/system/gd/rust/common/src/init_flags.rs
@@ -379,7 +379,7 @@
gd_hal_snoop_logger_filtering = true,
gd_l2cap,
gd_link_policy,
- gd_remote_name_request,
+ gd_remote_name_request = true,
gd_rust,
hci_adapter: i32,
hfp_dynamic_version = true,
diff --git a/system/hci/Android.bp b/system/hci/Android.bp
index e84c138..1e8e2b8 100644
--- a/system/hci/Android.bp
+++ b/system/hci/Android.bp
@@ -73,30 +73,3 @@
"libchrome",
],
}
-
-cc_test {
- name: "net_test_hci_fragmenter_native",
- static_libs: [
- "libbase",
- "libchrome",
- ],
- test_suites: ["device-tests"],
- defaults: [
- "bluetooth_gtest_x86_asan_workaround",
- "fluoride_test_defaults",
- "mts_defaults",
- ],
- local_include_dirs: [
- "include",
- ],
- include_dirs: [
- "packages/modules/Bluetooth/system",
- "packages/modules/Bluetooth/system/gd",
- "packages/modules/Bluetooth/system/osi/test",
- "packages/modules/Bluetooth/system/stack/include",
- ],
- srcs: [
- "src/buffer_allocator.cc",
- "test/packet_fragmenter_host_test.cc",
- ],
-}
diff --git a/system/hci/include/hci_layer.h b/system/hci/include/hci_layer.h
index 21b4c22..2e1986d 100644
--- a/system/hci/include/hci_layer.h
+++ b/system/hci/include/hci_layer.h
@@ -33,7 +33,6 @@
#define MSG_SUB_EVT_MASK 0x00FF /* eq. BT_SUB_EVT_MASK */
/* Message event ID passed from Host/Controller lib to stack */
-#define MSG_HC_TO_STACK_HCI_ACL 0x1100 /* eq. BT_EVT_TO_BTU_HCI_ACL */
#define MSG_HC_TO_STACK_HCI_SCO 0x1200 /* eq. BT_EVT_TO_BTU_HCI_SCO */
#define MSG_HC_TO_STACK_HCI_ERR 0x1300 /* eq. BT_EVT_TO_BTU_HCIT_ERR */
#define MSG_HC_TO_STACK_HCI_ISO 0x1700 /* eq. BT_EVT_TO_BTU_HCI_ISO */
@@ -65,8 +64,6 @@
command_complete_cb complete_callback,
command_status_cb status_cb, void* context);
- future_t* (*transmit_command_futured)(const BT_HDR* command);
-
// Send some data downward through the HCI layer
void (*transmit_downward)(uint16_t type, void* data);
} hci_t;
diff --git a/system/hci/include/packet_fragmenter.h b/system/hci/include/packet_fragmenter.h
index 29651a0..c82f537 100644
--- a/system/hci/include/packet_fragmenter.h
+++ b/system/hci/include/packet_fragmenter.h
@@ -23,7 +23,6 @@
#include "osi/include/allocator.h"
#include "stack/include/bt_hdr.h"
-typedef void (*transmit_finished_cb)(BT_HDR* packet, bool all_fragments_sent);
typedef void (*packet_reassembled_cb)(BT_HDR* packet);
typedef void (*packet_fragmented_cb)(BT_HDR* packet,
bool send_transmit_finished);
@@ -34,10 +33,6 @@
// Called for every completely reassembled packet.
packet_reassembled_cb reassembled;
-
- // Called when the fragmenter finishes sending all requested fragments,
- // but the packet has not been entirely sent.
- transmit_finished_cb transmit_finished;
} packet_fragmenter_callbacks_t;
typedef struct packet_fragmenter_t {
@@ -51,10 +46,8 @@
// callback.
void (*fragment_and_dispatch)(BT_HDR* packet);
// If |packet| is a complete packet, forwards to the reassembled callback.
- // Otherwise
- // holds onto it until all fragments arrive, at which point the reassembled
- // callback is called
- // with the reassembled data.
+ // Otherwise holds onto it until all fragments arrive, at which point the
+ // reassembled callback is called with the reassembled data.
void (*reassemble_and_dispatch)(BT_HDR* packet);
} packet_fragmenter_t;
diff --git a/system/hci/src/packet_fragmenter.cc b/system/hci/src/packet_fragmenter.cc
index 93c1a7e..ca0709f 100644
--- a/system/hci/src/packet_fragmenter.cc
+++ b/system/hci/src/packet_fragmenter.cc
@@ -30,12 +30,8 @@
#include "device/include/controller.h"
#include "hci/include/buffer_allocator.h"
#include "osi/include/log.h"
-#include "osi/include/osi.h"
#include "stack/include/bt_hdr.h"
-// 2 bytes for handle, 2 bytes for data length (Volume 2, Part E, 5.4.2)
-#define HCI_ACL_PREAMBLE_SIZE 4
-
#define HCI_ISO_BF_FIRST_FRAGMENTED_PACKET (0)
#define HCI_ISO_BF_CONTINUATION_FRAGMENT_PACKET (1)
#define HCI_ISO_BF_COMPLETE_PACKET (2)
@@ -84,39 +80,21 @@
static const controller_t* controller;
static const packet_fragmenter_callbacks_t* callbacks;
-static std::unordered_map<uint16_t /* handle */, BT_HDR*> partial_packets;
static std::unordered_map<uint16_t /* handle */, BT_HDR*> partial_iso_packets;
static void init(const packet_fragmenter_callbacks_t* result_callbacks) {
callbacks = result_callbacks;
}
-static void cleanup() {
- partial_packets.clear();
- partial_iso_packets.clear();
-}
-
-static bool check_uint16_overflow(uint16_t a, uint16_t b) {
- return (UINT16_MAX - a) < b;
-}
-
-static void fragment_and_dispatch_iso(BT_HDR* packet);
+static void cleanup() { partial_iso_packets.clear(); }
static void fragment_and_dispatch(BT_HDR* packet) {
CHECK(packet != NULL);
uint16_t event = packet->event & MSG_EVT_MASK;
- if (event == MSG_HC_TO_STACK_HCI_SCO) {
- callbacks->fragmented(packet, true);
- } else if (event == MSG_STACK_TO_HC_HCI_ISO) {
- fragment_and_dispatch_iso(packet);
- } else {
- callbacks->fragmented(packet, true);
- }
-}
+ CHECK(event == MSG_STACK_TO_HC_HCI_ISO);
-static void fragment_and_dispatch_iso(BT_HDR* packet) {
uint8_t* stream = packet->data + packet->offset;
uint16_t max_data_size = controller->get_iso_data_size();
uint16_t max_packet_size = max_data_size + HCI_ISO_PREAMBLE_SIZE;
@@ -162,7 +140,7 @@
callbacks->fragmented(packet, true);
}
-static void reassemble_and_dispatch_iso(UNUSED_ATTR BT_HDR* packet) {
+static void reassemble_and_dispatch(UNUSED_ATTR BT_HDR* packet) {
uint8_t* stream = packet->data;
uint16_t handle;
uint16_t iso_length;
@@ -170,6 +148,9 @@
BT_HDR* partial_packet;
uint16_t iso_full_len;
+ uint16_t event = packet->event & MSG_EVT_MASK;
+ CHECK(event == MSG_HC_TO_STACK_HCI_ISO);
+
STREAM_TO_UINT16(handle, stream);
STREAM_TO_UINT16(iso_length, stream);
// last 2 bits is RFU
@@ -343,139 +324,6 @@
}
}
-static void reassemble_and_dispatch(BT_HDR* packet) {
- if ((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_ACL) {
- uint8_t* stream = packet->data;
- uint16_t handle;
- uint16_t acl_length;
-
- STREAM_TO_UINT16(handle, stream);
- STREAM_TO_UINT16(acl_length, stream);
-
- CHECK(acl_length == packet->len - HCI_ACL_PREAMBLE_SIZE);
-
- uint8_t boundary_flag = GET_BOUNDARY_FLAG(handle);
- uint8_t broadcast_flag = GET_BROADCAST_FLAG(handle);
- handle = handle & HANDLE_MASK;
-
- if (broadcast_flag != POINT_TO_POINT) {
- LOG_WARN("dropping broadcast packet");
- buffer_allocator->free(packet);
- return;
- }
-
- if (boundary_flag == START_PACKET_BOUNDARY) {
- if (acl_length < 2) {
- LOG_WARN("%s invalid acl_length %d", __func__, acl_length);
- buffer_allocator->free(packet);
- return;
- }
- uint16_t l2cap_length;
- STREAM_TO_UINT16(l2cap_length, stream);
- auto map_iter = partial_packets.find(handle);
- if (map_iter != partial_packets.end()) {
- LOG_WARN(
- "%s found unfinished packet for handle with start packet. "
- "Dropping old.",
- __func__);
-
- BT_HDR* hdl = map_iter->second;
- partial_packets.erase(map_iter);
- buffer_allocator->free(hdl);
- }
-
- if (acl_length < L2CAP_HEADER_PDU_LEN_SIZE) {
- LOG_WARN("%s L2CAP packet too small (%d < %d). Dropping it.", __func__,
- packet->len, L2CAP_HEADER_PDU_LEN_SIZE);
- buffer_allocator->free(packet);
- return;
- }
-
- uint16_t full_length =
- l2cap_length + L2CAP_HEADER_SIZE + HCI_ACL_PREAMBLE_SIZE;
-
- // Check for buffer overflow and that the full packet size + BT_HDR size
- // is less than the max buffer size
- if (check_uint16_overflow(l2cap_length,
- (L2CAP_HEADER_SIZE + HCI_ACL_PREAMBLE_SIZE)) ||
- ((full_length + sizeof(BT_HDR)) > BT_DEFAULT_BUFFER_SIZE)) {
- LOG_ERROR("%s Dropping L2CAP packet with invalid length (%d).",
- __func__, l2cap_length);
- buffer_allocator->free(packet);
- return;
- }
-
- if (full_length <= packet->len) {
- if (full_length < packet->len)
- LOG_WARN("%s found l2cap full length %d less than the hci length %d.",
- __func__, l2cap_length, packet->len);
-
- callbacks->reassembled(packet);
- return;
- }
-
- BT_HDR* partial_packet =
- (BT_HDR*)buffer_allocator->alloc(full_length + sizeof(BT_HDR));
- partial_packet->event = packet->event;
- partial_packet->len = full_length;
- partial_packet->offset = packet->len;
-
- memcpy(partial_packet->data, packet->data, packet->len);
-
- // Update the ACL data size to indicate the full expected length
- stream = partial_packet->data;
- STREAM_SKIP_UINT16(stream); // skip the handle
- UINT16_TO_STREAM(stream, full_length - HCI_ACL_PREAMBLE_SIZE);
-
- partial_packets[handle] = partial_packet;
-
- // Free the old packet buffer, since we don't need it anymore
- buffer_allocator->free(packet);
- } else {
- auto map_iter = partial_packets.find(handle);
- if (map_iter == partial_packets.end()) {
- LOG_WARN("%s got continuation for unknown packet. Dropping it.",
- __func__);
- buffer_allocator->free(packet);
- return;
- }
- BT_HDR* partial_packet = map_iter->second;
-
- packet->offset = HCI_ACL_PREAMBLE_SIZE;
- uint16_t projected_offset =
- partial_packet->offset + (packet->len - HCI_ACL_PREAMBLE_SIZE);
- if ((packet->len - packet->offset) >
- (partial_packet->len - partial_packet->offset)) {
- LOG_WARN(
- "%s got packet which would exceed expected length of %d. "
- "Truncating.",
- __func__, partial_packet->len);
- packet->len = (partial_packet->len - partial_packet->offset) + packet->offset;
- projected_offset = partial_packet->len;
- }
-
- memcpy(partial_packet->data + partial_packet->offset,
- packet->data + packet->offset, packet->len - packet->offset);
-
- // Free the old packet buffer, since we don't need it anymore
- buffer_allocator->free(packet);
- partial_packet->offset = projected_offset;
-
- if (partial_packet->offset == partial_packet->len) {
- partial_packets.erase(handle);
- partial_packet->offset = 0;
- callbacks->reassembled(partial_packet);
- }
- }
- } else if ((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_SCO) {
- callbacks->reassembled(packet);
- } else if ((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_ISO) {
- reassemble_and_dispatch_iso(packet);
- } else {
- callbacks->reassembled(packet);
- }
-}
-
static const packet_fragmenter_t interface = {init, cleanup,
fragment_and_dispatch,
diff --git a/system/hci/test/packet_fragmenter_host_test.cc b/system/hci/test/packet_fragmenter_host_test.cc
deleted file mode 100644
index 7c566f5..0000000
--- a/system/hci/test/packet_fragmenter_host_test.cc
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright 2020 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 <base/logging.h>
-#include <gtest/gtest.h>
-
-#include <cstdint>
-#include <queue>
-
-#include "hci/src/packet_fragmenter.cc"
-#include "osi/include/allocator.h"
-#include "osi/test/AllocationTestHarness.h"
-#include "stack/include/bt_hdr.h"
-
-void allocation_tracker_uninit(void);
-
-enum kPacketOrder {
- kStart = 1,
- kContinuation = 2,
-};
-
-struct AclPacketHeader {
- struct {
- uint16_t handle : 12;
- uint16_t continuation : 1;
- uint16_t start : 1;
- uint16_t reserved : 2;
- } s;
- uint16_t length;
-
- uint16_t GetRawHandle() const { return *(uint16_t*)(this); }
-
- uint16_t GetHandle() const { return s.handle; }
- uint16_t GetLength() const { return length; }
-} __attribute__((packed));
-
-struct L2capPacketHeader {
- uint16_t length;
- uint16_t cid;
-} __attribute__((packed));
-
-struct AclL2capPacketHeader {
- struct AclPacketHeader acl_header;
- struct L2capPacketHeader l2cap_header;
-} __attribute__((packed));
-
-namespace {
-
-constexpr uint16_t kHandle = 0x123;
-constexpr uint16_t kCid = 0x4567;
-constexpr uint16_t kMaxPacketSize = BT_DEFAULT_BUFFER_SIZE - sizeof(BT_HDR) -
- L2CAP_HEADER_SIZE - HCI_ACL_PREAMBLE_SIZE;
-constexpr size_t kTypicalPacketSizes[] = {
- 1, 2, 3, 4, 8, 16, 32, 64, 127, 128, 129, 256, 1024, 2048, kMaxPacketSize};
-constexpr size_t kNumberOfTypicalPacketSizes =
- sizeof(kTypicalPacketSizes) / sizeof(kTypicalPacketSizes[0]);
-
-void FreeBuffer(BT_HDR* bt_hdr) { osi_free(bt_hdr); }
-
-struct TestMutables {
- struct {
- int access_count_{0};
- } fragmented;
- struct {
- int access_count_{0};
- std::queue<std::unique_ptr<BT_HDR, decltype(&FreeBuffer)>> queue;
- } reassembled;
- struct {
- int access_count_{0};
- } transmit_finished;
-};
-
-TestMutables test_state_;
-
-void OnFragmented(BT_HDR* packet, bool send_transmit_finished) {
- test_state_.fragmented.access_count_++;
-}
-
-void OnReassembled(BT_HDR* packet) {
- test_state_.reassembled.access_count_++;
- test_state_.reassembled.queue.push(
- std::unique_ptr<BT_HDR, decltype(&FreeBuffer)>(packet, &FreeBuffer));
-}
-
-void OnTransmitFinished(BT_HDR* packet, bool all_fragments_sent) {
- test_state_.transmit_finished.access_count_++;
-}
-
-packet_fragmenter_callbacks_t result_callbacks = {
- .fragmented = OnFragmented,
- .reassembled = OnReassembled,
- .transmit_finished = OnTransmitFinished,
-};
-
-AclPacketHeader* AclHeader(BT_HDR* packet) {
- return (AclPacketHeader*)packet->data;
-}
-L2capPacketHeader* L2capHeader(BT_HDR* packet) {
- return &((AclL2capPacketHeader*)packet->data)->l2cap_header;
-}
-
-uint8_t* Data(BT_HDR* packet) {
- AclPacketHeader* acl_header =
- reinterpret_cast<AclPacketHeader*>(packet->data);
- return acl_header->s.start
- ? (uint8_t*)(packet->data + sizeof(AclL2capPacketHeader))
- : (uint8_t*)(packet->data + sizeof(AclPacketHeader));
-}
-
-} // namespace
-
-// Needed for linkage
-const controller_t* controller_get_interface() { return nullptr; }
-
-/**
- * Test class to test selected functionality in hci/src/hci_layer.cc
- */
-class HciPacketFragmenterTest : public AllocationTestHarness {
- protected:
- void SetUp() override {
- AllocationTestHarness::SetUp();
- // Disable our allocation tracker to allow ASAN full range
- allocation_tracker_uninit();
- packet_fragmenter_ = packet_fragmenter_get_interface();
- packet_fragmenter_->init(&result_callbacks);
- test_state_ = TestMutables();
- }
-
- void TearDown() override {
- FlushPartialPackets();
- while (!test_state_.reassembled.queue.empty()) {
- test_state_.reassembled.queue.pop();
- }
- packet_fragmenter_->cleanup();
- AllocationTestHarness::TearDown();
- }
- const packet_fragmenter_t* packet_fragmenter_;
-
- // Start acl packet
- BT_HDR* AllocateL2capPacket(size_t l2cap_length,
- const std::vector<uint8_t> data) const {
- auto packet =
- AllocateAclPacket(data.size() + sizeof(L2capPacketHeader), kStart);
- L2capHeader(packet)->length = l2cap_length;
- L2capHeader(packet)->cid = kCid;
- std::copy(data.cbegin(), data.cend(), Data(packet));
- return packet;
- }
-
- // Continuation acl packet
- BT_HDR* AllocateL2capPacket(const std::vector<uint8_t> data) const {
- auto packet = AllocateAclPacket(data.size(), kContinuation);
- std::copy(data.cbegin(), data.cend(), Data(packet));
- return packet;
- }
-
- const std::vector<uint8_t> CreateData(size_t size) const {
- CHECK(size > 0);
- std::vector<uint8_t> v(size);
- uint8_t sum = 0;
- for (size_t s = 0; s < size; s++) {
- sum += v[s] = s;
- }
- v[0] = (~sum + 1); // First byte has sum complement
- return v;
- }
-
- // Verify packet integrity
- bool VerifyData(const uint8_t* data, size_t size) const {
- CHECK(size > 0);
- uint8_t sum = 0;
- for (size_t s = 0; s < size; s++) {
- sum += data[s];
- }
- return sum == 0;
- }
-
- private:
- BT_HDR* AllocateAclPacket(size_t acl_length,
- kPacketOrder packet_order) const {
- BT_HDR* packet = AllocatePacket(sizeof(AclPacketHeader) + acl_length,
- MSG_HC_TO_STACK_HCI_ACL);
- AclHeader(packet)->s.handle = kHandle;
- AclHeader(packet)->length = acl_length;
- switch (packet_order) {
- case kStart:
- AclHeader(packet)->s.start = 1;
- break;
- case kContinuation:
- AclHeader(packet)->s.continuation = 1;
- break;
- }
- return packet;
- }
-
- BT_HDR* AllocatePacket(size_t packet_length, uint16_t event_mask) const {
- BT_HDR* packet =
- static_cast<BT_HDR*>(osi_calloc(sizeof(BT_HDR) + packet_length));
- packet->event = event_mask;
- packet->len = static_cast<uint16_t>(packet_length);
- return packet;
- }
-
- void FlushPartialPackets() const {
- while (!partial_packets.empty()) {
- BT_HDR* partial_packet = partial_packets.at(kHandle);
- partial_packets.erase(kHandle);
- osi_free(partial_packet);
- }
- }
-};
-
-TEST_F(HciPacketFragmenterTest, TestStruct_Handle) {
- AclPacketHeader acl_header;
- memset(&acl_header, 0, sizeof(acl_header));
-
- for (uint16_t h = 0; h < UINT16_MAX; h++) {
- acl_header.s.handle = h;
- CHECK(acl_header.GetHandle() == (h & HANDLE_MASK));
- CHECK(acl_header.s.continuation == 0);
- CHECK(acl_header.s.start == 0);
- CHECK(acl_header.s.reserved == 0);
-
- CHECK((acl_header.GetRawHandle() & HANDLE_MASK) == (h & HANDLE_MASK));
- GET_BOUNDARY_FLAG(acl_header.GetRawHandle() == 0);
- }
-}
-
-TEST_F(HciPacketFragmenterTest, TestStruct_Continuation) {
- AclPacketHeader acl_header;
- memset(&acl_header, 0, sizeof(acl_header));
-
- for (uint16_t h = 0; h < UINT16_MAX; h++) {
- acl_header.s.continuation = h;
- CHECK(acl_header.GetHandle() == 0);
- CHECK(acl_header.s.continuation == (h & 0x1));
- CHECK(acl_header.s.start == 0);
- CHECK(acl_header.s.reserved == 0);
-
- CHECK((acl_header.GetRawHandle() & HANDLE_MASK) == 0);
- GET_BOUNDARY_FLAG(acl_header.GetRawHandle() == (h & 0x3));
- }
-}
-
-TEST_F(HciPacketFragmenterTest, TestStruct_Start) {
- AclPacketHeader acl_header;
- memset(&acl_header, 0, sizeof(acl_header));
-
- for (uint16_t h = 0; h < UINT16_MAX; h++) {
- acl_header.s.start = h;
- CHECK(acl_header.GetHandle() == 0);
- CHECK(acl_header.s.continuation == 0);
- CHECK(acl_header.s.start == (h & 0x1));
- CHECK(acl_header.s.reserved == 0);
-
- CHECK((acl_header.GetRawHandle() & HANDLE_MASK) == 0);
- GET_BOUNDARY_FLAG(acl_header.GetRawHandle() == (h & 0x3));
- }
-}
-
-TEST_F(HciPacketFragmenterTest, TestStruct_Reserved) {
- AclPacketHeader acl_header;
- memset(&acl_header, 0, sizeof(acl_header));
-
- for (uint16_t h = 0; h < UINT16_MAX; h++) {
- acl_header.s.reserved = h;
- CHECK(acl_header.GetHandle() == 0);
- CHECK(acl_header.s.continuation == 0);
- CHECK(acl_header.s.start == 0);
- CHECK(acl_header.s.reserved == (h & 0x3));
- }
-}
-TEST_F(HciPacketFragmenterTest, CreateAndVerifyPackets) {
- const size_t size_check[] = {1, 2, 3, 4, 8, 16, 32,
- 64, 127, 128, 129, 256, 1024, 0xfff0};
- const std::vector<size_t> sizes(
- size_check, size_check + sizeof(size_check) / sizeof(size_check[0]));
-
- for (const auto packet_size : sizes) {
- const std::vector<uint8_t> data = CreateData(packet_size);
- uint8_t buf[packet_size];
- std::copy(data.cbegin(), data.cend(), buf);
- CHECK(VerifyData(buf, packet_size));
- }
-}
-
-TEST_F(HciPacketFragmenterTest, OnePacket_Immediate) {
- const std::vector<size_t> sizes(
- kTypicalPacketSizes, kTypicalPacketSizes + kNumberOfTypicalPacketSizes);
-
- int reassembled_access_count = 0;
- for (const auto packet_size : sizes) {
- const std::vector<uint8_t> data = CreateData(packet_size);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), data));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == ++reassembled_access_count);
- auto packet = std::move(test_state_.reassembled.queue.front());
- test_state_.reassembled.queue.pop();
- CHECK(VerifyData(Data(packet.get()), packet_size));
- }
-}
-
-TEST_F(HciPacketFragmenterTest, OnePacket_ImmediateTooBig) {
- const size_t packet_size = kMaxPacketSize + 1;
- const std::vector<uint8_t> data = CreateData(packet_size);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), data));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 0);
-}
-
-TEST_F(HciPacketFragmenterTest, ThreePackets_Immediate) {
- const size_t packet_size = 512;
- const std::vector<uint8_t> data = CreateData(packet_size);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), data));
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), data));
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), data));
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 3);
-}
-
-TEST_F(HciPacketFragmenterTest, OnePacket_SplitTwo) {
- const std::vector<size_t> sizes(
- kTypicalPacketSizes, kTypicalPacketSizes + kNumberOfTypicalPacketSizes);
-
- int reassembled_access_count = 0;
- for (auto packet_size : sizes) {
- const std::vector<uint8_t> data = CreateData(packet_size);
- const std::vector<uint8_t> part1(data.cbegin(),
- data.cbegin() + packet_size / 2);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), part1));
-
- CHECK(partial_packets.size() == 1);
- CHECK(test_state_.reassembled.access_count_ == reassembled_access_count);
-
- const std::vector<uint8_t> part2(data.cbegin() + packet_size / 2,
- data.cend());
- reassemble_and_dispatch(AllocateL2capPacket(part2));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == ++reassembled_access_count);
-
- auto packet = std::move(test_state_.reassembled.queue.front());
- test_state_.reassembled.queue.pop();
- CHECK(VerifyData(Data(packet.get()), packet_size));
- }
-}
-
-TEST_F(HciPacketFragmenterTest, OnePacket_SplitALot) {
- const size_t packet_size = 512;
- const size_t stride = 2;
-
- const std::vector<uint8_t> data = CreateData(packet_size);
- const std::vector<uint8_t> first_part(data.cbegin(), data.cbegin() + stride);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), first_part));
- CHECK(partial_packets.size() == 1);
-
- for (size_t i = 2; i < packet_size - stride; i += stride) {
- const std::vector<uint8_t> middle_part(data.cbegin() + i,
- data.cbegin() + i + stride);
- reassemble_and_dispatch(AllocateL2capPacket(middle_part));
- }
- CHECK(partial_packets.size() == 1);
- CHECK(test_state_.reassembled.access_count_ == 0);
-
- const std::vector<uint8_t> last_part(data.cbegin() + packet_size - stride,
- data.cend());
- reassemble_and_dispatch(AllocateL2capPacket(last_part));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 1);
- auto packet = std::move(test_state_.reassembled.queue.front());
- CHECK(VerifyData(Data(packet.get()), packet_size));
-}
-
-TEST_F(HciPacketFragmenterTest, TwoPacket_InvalidLength) {
- const size_t packet_size = UINT16_MAX;
- const std::vector<uint8_t> data = CreateData(packet_size);
- const std::vector<uint8_t> first_part(data.cbegin(),
- data.cbegin() + packet_size / 2);
- reassemble_and_dispatch(AllocateL2capPacket(data.size(), first_part));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 0);
-
- const std::vector<uint8_t> second_part(data.cbegin() + packet_size / 2,
- data.cend());
- reassemble_and_dispatch(AllocateL2capPacket(second_part));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 0);
-}
-
-TEST_F(HciPacketFragmenterTest, TwoPacket_HugeBogusSecond) {
- const size_t packet_size = kMaxPacketSize;
- const std::vector<uint8_t> data = CreateData(UINT16_MAX);
- const std::vector<uint8_t> first_part(data.cbegin(),
- data.cbegin() + packet_size - 1);
- reassemble_and_dispatch(AllocateL2capPacket(packet_size, first_part));
-
- CHECK(partial_packets.size() == 1);
- CHECK(test_state_.reassembled.access_count_ == 0);
-
- const std::vector<uint8_t> second_part(data.cbegin() + packet_size - 1,
- data.cend());
- reassemble_and_dispatch(AllocateL2capPacket(second_part));
-
- CHECK(partial_packets.size() == 0);
- CHECK(test_state_.reassembled.access_count_ == 1);
-}
diff --git a/system/hci/test/packet_fragmenter_test.cc b/system/hci/test/packet_fragmenter_test.cc
index f9efd4b..7ba0934 100644
--- a/system/hci/test/packet_fragmenter_test.cc
+++ b/system/hci/test/packet_fragmenter_test.cc
@@ -389,12 +389,6 @@
UNEXPECTED_CALL;
}
-STUB_FUNCTION(void, transmit_finished_callback,
- (UNUSED_ATTR BT_HDR * packet,
- UNUSED_ATTR bool sent_all_fragments))
-UNEXPECTED_CALL;
-}
-
STUB_FUNCTION(uint16_t, get_acl_data_size_classic, (void))
DURING(no_fragmentation, non_acl_passthrough_fragmentation, no_reassembly)
return 42;
@@ -424,7 +418,6 @@
static void reset_for(TEST_MODES_T next) {
RESET_CALL_COUNT(fragmented_callback);
RESET_CALL_COUNT(reassembled_callback);
- RESET_CALL_COUNT(transmit_finished_callback);
RESET_CALL_COUNT(get_acl_data_size_classic);
RESET_CALL_COUNT(get_acl_data_size_ble);
RESET_CALL_COUNT(get_iso_data_size);
@@ -443,7 +436,6 @@
callbacks.fragmented = fragmented_callback;
callbacks.reassembled = reassembled_callback;
- callbacks.transmit_finished = transmit_finished_callback;
controller.get_acl_data_size_classic = get_acl_data_size_classic;
controller.get_acl_data_size_ble = get_acl_data_size_ble;
controller.get_iso_data_size = get_iso_data_size;
@@ -461,25 +453,6 @@
packet_fragmenter_callbacks_t callbacks;
};
-TEST_F(PacketFragmenterTest, test_non_acl_passthrough_fragmentation) {
- reset_for(non_acl_passthrough_fragmentation);
- BT_HDR* packet = manufacture_packet_for_fragmentation(MSG_STACK_TO_HC_HCI_CMD,
- sample_data);
- fragmenter->fragment_and_dispatch(packet);
-
- EXPECT_EQ(strlen(sample_data), data_size_sum);
- EXPECT_CALL_COUNT(fragmented_callback, 1);
-}
-
-TEST_F(PacketFragmenterTest, test_non_acl_passthrough_reasseembly) {
- reset_for(non_acl_passthrough_reassembly);
- manufacture_packet_and_then_reassemble(MSG_HC_TO_STACK_HCI_EVT, 42,
- sample_data);
-
- EXPECT_EQ(strlen(sample_data), data_size_sum);
- EXPECT_CALL_COUNT(reassembled_callback, 1);
-}
-
TEST_F(PacketFragmenterTest, test_iso_fragment_necessary) {
reset_for(iso_fragmentation);
iso_has_ts = true;
diff --git a/system/main/shim/hci_layer.cc b/system/main/shim/hci_layer.cc
index 1780455..71ba464 100644
--- a/system/main/shim/hci_layer.cc
+++ b/system/main/shim/hci_layer.cc
@@ -267,17 +267,12 @@
} // namespace
namespace cpp {
-bluetooth::common::BidiQueueEnd<bluetooth::hci::AclBuilder,
- bluetooth::hci::AclView>* hci_queue_end =
- nullptr;
bluetooth::common::BidiQueueEnd<bluetooth::hci::ScoBuilder,
bluetooth::hci::ScoView>* hci_sco_queue_end =
nullptr;
bluetooth::common::BidiQueueEnd<bluetooth::hci::IsoBuilder,
bluetooth::hci::IsoView>* hci_iso_queue_end =
nullptr;
-static bluetooth::os::EnqueueBuffer<bluetooth::hci::AclBuilder>* pending_data =
- nullptr;
static bluetooth::os::EnqueueBuffer<bluetooth::hci::IsoBuilder>*
pending_iso_data = nullptr;
static bluetooth::os::EnqueueBuffer<bluetooth::hci::ScoBuilder>*
@@ -449,7 +444,7 @@
return;
}
auto data = WrapPacketAndCopy(MSG_HC_TO_STACK_HCI_SCO, packet.get());
- packet_fragmenter->reassemble_and_dispatch(data);
+ send_data_upwards.Run(FROM_HERE, data);
}
static void iso_data_callback() {
@@ -490,11 +485,6 @@
}
static void on_shutting_down() {
- if (pending_data != nullptr) {
- pending_data->Clear();
- delete pending_data;
- pending_data = nullptr;
- }
if (pending_sco_data != nullptr) {
pending_sco_data->Clear();
delete pending_sco_data;
@@ -505,25 +495,6 @@
delete pending_iso_data;
pending_iso_data = nullptr;
}
- if (hci_queue_end != nullptr) {
- for (uint16_t event_code_raw = 0; event_code_raw < 0x100;
- event_code_raw++) {
- auto event_code = static_cast<bluetooth::hci::EventCode>(event_code_raw);
- if (!is_valid_event_code(event_code)) {
- continue;
- }
- if (event_already_registered_in_hci_layer(event_code)) {
- continue;
- } else if (event_already_registered_in_le_advertising_manager(
- event_code)) {
- continue;
- } else if (event_already_registered_in_le_scanning_manager(event_code)) {
- continue;
- }
- bluetooth::shim::GetHciLayer()->UnregisterEventHandler(event_code);
- }
- hci_queue_end = nullptr;
- }
if (hci_sco_queue_end != nullptr) {
hci_sco_queue_end->UnregisterDequeue();
hci_sco_queue_end = nullptr;
@@ -551,24 +522,6 @@
cpp::transmit_command(command, complete_callback, status_callback, context);
}
-static void command_complete_callback(BT_HDR* response, void* context) {
- auto future = static_cast<future_t*>(context);
- future_ready(future, response);
-}
-
-static void command_status_callback(uint8_t status, BT_HDR* command,
- void* context) {
- LOG_ALWAYS_FATAL(
- "transmit_command_futured should only send command complete opcode");
-}
-
-static future_t* transmit_command_futured(const BT_HDR* command) {
- future_t* future = future_new();
- transmit_command(command, command_complete_callback, command_status_callback,
- future);
- return future;
-}
-
static void transmit_fragment(BT_HDR* packet, bool send_transmit_finished) {
uint16_t event = packet->event & MSG_EVT_MASK;
@@ -577,11 +530,7 @@
bool free_after_transmit =
event != MSG_STACK_TO_HC_HCI_CMD && send_transmit_finished;
- if (event == MSG_STACK_TO_HC_HCI_SCO) {
- const uint8_t* stream = packet->data + packet->offset;
- size_t length = packet->len;
- cpp::transmit_sco_fragment(stream, length);
- } else if (event == MSG_STACK_TO_HC_HCI_ISO) {
+ if (event == MSG_STACK_TO_HC_HCI_ISO) {
const uint8_t* stream = packet->data + packet->offset;
size_t length = packet->len;
cpp::transmit_iso_fragment(stream, length);
@@ -592,34 +541,28 @@
}
}
static void dispatch_reassembled(BT_HDR* packet) {
- // Events should already have been dispatched before this point
- CHECK((packet->event & MSG_EVT_MASK) != MSG_HC_TO_STACK_HCI_EVT);
+ // Only ISO should be handled here
+ CHECK((packet->event & MSG_EVT_MASK) == MSG_HC_TO_STACK_HCI_ISO);
CHECK(!send_data_upwards.is_null());
send_data_upwards.Run(FROM_HERE, packet);
}
-static void fragmenter_transmit_finished(BT_HDR* packet,
- bool all_fragments_sent) {
- if (all_fragments_sent) {
- osi_free(packet);
- } else {
- // This is kind of a weird case, since we're dispatching a partially sent
- // packet up to a higher layer.
- // TODO(zachoverflow): rework upper layer so this isn't necessary.
- send_data_upwards.Run(FROM_HERE, packet);
- }
-}
static const packet_fragmenter_callbacks_t packet_fragmenter_callbacks = {
- transmit_fragment, dispatch_reassembled, fragmenter_transmit_finished};
+ transmit_fragment, dispatch_reassembled};
static void transmit_downward(uint16_t type, void* raw_data) {
+ if (type == BT_EVT_TO_LM_HCI_SCO) {
+ BT_HDR* event = static_cast<BT_HDR*>(raw_data);
+ bluetooth::shim::GetGdShimHandler()->Call(
+ cpp::transmit_sco_fragment, event->data + event->offset, event->len);
+ return;
+ }
bluetooth::shim::GetGdShimHandler()->Call(
packet_fragmenter->fragment_and_dispatch, static_cast<BT_HDR*>(raw_data));
}
static hci_t interface = {.set_data_cb = set_data_cb,
.transmit_command = transmit_command,
- .transmit_command_futured = transmit_command_futured,
.transmit_downward = transmit_downward};
const hci_t* bluetooth::shim::hci_layer_get_interface() {
diff --git a/system/stack/a2dp/a2dp_api.cc b/system/stack/a2dp/a2dp_api.cc
index 73df2b1b..e00a5a5 100644
--- a/system/stack/a2dp/a2dp_api.cc
+++ b/system/stack/a2dp/a2dp_api.cc
@@ -36,9 +36,12 @@
#include "osi/include/log.h"
#include "sdpdefs.h"
#include "stack/include/bt_types.h"
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using bluetooth::Uuid;
/*****************************************************************************
@@ -80,7 +83,7 @@
/* loop through all records we found */
do {
/* get next record; if none found, we're done */
- if ((p_rec = SDP_FindServiceInDb(
+ if ((p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
a2dp_cb.find.p_db, a2dp_cb.find.service_uuid, p_rec)) == NULL) {
break;
}
@@ -88,27 +91,28 @@
peer_address = p_rec->remote_bd_addr;
/* get service name */
- if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) !=
- NULL) {
+ if ((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_SERVICE_NAME)) != NULL) {
a2dp_svc.p_service_name = (char*)p_attr->attr_value.v.array;
a2dp_svc.service_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
}
/* get provider name */
- if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PROVIDER_NAME)) !=
- NULL) {
+ if ((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_PROVIDER_NAME)) != NULL) {
a2dp_svc.p_provider_name = (char*)p_attr->attr_value.v.array;
a2dp_svc.provider_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
}
/* get supported features */
- if ((p_attr = SDP_FindAttributeInRec(
+ if ((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL) {
a2dp_svc.features = p_attr->attr_value.v.u16;
}
/* get AVDTP version */
- if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_AVDTP, &elem)) {
+ if (get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, UUID_PROTOCOL_AVDTP, &elem)) {
a2dp_svc.avdt_version = elem.params[0];
LOG_VERBOSE("avdt_version: 0x%x", a2dp_svc.avdt_version);
}
@@ -190,7 +194,8 @@
return A2DP_INVALID_PARAMS;
/* add service class id list */
- result &= SDP_AddServiceClassIdList(sdp_handle, 1, &service_uuid);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
+ sdp_handle, 1, &service_uuid);
memset((void*)proto_list, 0,
A2DP_NUM_PROTO_ELEMS * sizeof(tSDP_PROTOCOL_ELEM));
@@ -203,38 +208,40 @@
proto_list[1].num_params = 1;
proto_list[1].params[0] = a2dp_cb.avdt_sdp_ver;
- result &= SDP_AddProtocolList(sdp_handle, A2DP_NUM_PROTO_ELEMS, proto_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
+ sdp_handle, A2DP_NUM_PROTO_ELEMS, proto_list);
/* add profile descriptor list */
- result &= SDP_AddProfileDescriptorList(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
sdp_handle, UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, A2DP_VERSION);
/* add supported feature */
if (features != 0) {
p = temp;
UINT16_TO_BE_STREAM(p, features);
- result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, (uint32_t)2, (uint8_t*)temp);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, (uint32_t)2,
+ (uint8_t*)temp);
}
/* add provider name */
if (p_provider_name != NULL) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_provider_name) + 1), (uint8_t*)p_provider_name);
}
/* add service name */
if (p_service_name != NULL) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_service_name) + 1), (uint8_t*)p_service_name);
}
/* add browse group list */
browse_list[0] = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
- result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
- browse_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
return (result ? A2DP_SUCCESS : A2DP_FAIL);
}
@@ -301,8 +308,9 @@
a2dp_cb.find.p_db = (tSDP_DISCOVERY_DB*)osi_malloc(p_db->db_len);
Uuid uuid_list = Uuid::From16Bit(service_uuid);
- if (!SDP_InitDiscoveryDb(a2dp_cb.find.p_db, p_db->db_len, 1, &uuid_list,
- p_db->num_attr, p_db->p_attrs)) {
+ if (!get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ a2dp_cb.find.p_db, p_db->db_len, 1, &uuid_list, p_db->num_attr,
+ p_db->p_attrs)) {
osi_free_and_reset((void**)&a2dp_cb.find.p_db);
LOG_ERROR("Unable to initialize SDP discovery for peer %s UUID 0x%04X",
ADDRESS_TO_LOGGABLE_CSTR(bd_addr), service_uuid);
@@ -314,8 +322,8 @@
a2dp_cb.find.p_cback = p_cback;
/* perform service search */
- if (!SDP_ServiceSearchAttributeRequest(bd_addr, a2dp_cb.find.p_db,
- a2dp_sdp_cback)) {
+ if (!get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest(
+ bd_addr, a2dp_cb.find.p_db, a2dp_sdp_cback)) {
a2dp_cb.find.service_uuid = 0;
a2dp_cb.find.p_cback = NULL;
osi_free_and_reset((void**)&a2dp_cb.find.p_db);
diff --git a/system/stack/acl/btm_acl.cc b/system/stack/acl/btm_acl.cc
index f69c3f4..02716d0 100644
--- a/system/stack/acl/btm_acl.cc
+++ b/system/stack/acl/btm_acl.cc
@@ -148,7 +148,7 @@
HCI_PKT_TYPES_MASK_NO_2_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH3 |
HCI_PKT_TYPES_MASK_NO_2_DH5 | HCI_PKT_TYPES_MASK_NO_3_DH5);
-inline bool IsEprAvailable(const tACL_CONN& p_acl) {
+static bool IsEprAvailable(const tACL_CONN& p_acl) {
if (!p_acl.peer_lmp_feature_valid[0]) {
LOG_WARN("Checking incomplete feature page read");
return false;
diff --git a/system/stack/avrc/avrc_sdp.cc b/system/stack/avrc/avrc_sdp.cc
index 753f8d2..a393346 100644
--- a/system/stack/avrc/avrc_sdp.cc
+++ b/system/stack/avrc/avrc_sdp.cc
@@ -25,9 +25,12 @@
#include "avrc_api.h"
#include "avrc_int.h"
+#include "stack/include/sdp_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using bluetooth::Uuid;
/*****************************************************************************
@@ -129,8 +132,8 @@
}
Uuid uuid_list = Uuid::From16Bit(service_uuid);
- result = SDP_InitDiscoveryDb(p_db->p_db, p_db->db_len, 1, &uuid_list,
- p_db->num_attr, p_db->p_attrs);
+ result = get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ p_db->p_db, p_db->db_len, 1, &uuid_list, p_db->num_attr, p_db->p_attrs);
if (result) {
/* store service_uuid and discovery db pointer */
@@ -140,7 +143,8 @@
/* perform service search */
result =
- SDP_ServiceSearchAttributeRequest(bd_addr, p_db->p_db, avrc_sdp_cback);
+ get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest(
+ bd_addr, p_db->p_db, avrc_sdp_cback);
if (!result) {
AVRC_TRACE_ERROR("%s: Failed to init SDP for peer %s", __func__,
@@ -158,7 +162,8 @@
*
* Description This function is called to build an AVRCP SDP record.
* Prior to calling this function the application must
- * call SDP_CreateRecord() to create an SDP record.
+ * call get_legacy_stack_sdp_api()->handle.SDP_CreateRecord()
+ * to create an SDP record.
*
* Input Parameters:
* service_uuid: Indicates
@@ -166,16 +171,17 @@
* or CT(UUID_SERVCLASS_AV_REMOTE_CONTROL)
*
* p_service_name: Pointer to a null-terminated character
- * string containing the service name.
+ * string containing the service name.
* If service name is not used set this to NULL.
*
* p_provider_name: Pointer to a null-terminated character
- * string containing the provider name.
+ * string containing the provider name.
* If provider name is not used set this to NULL.
*
* categories: Supported categories.
*
- * sdp_handle: SDP handle returned by SDP_CreateRecord().
+ * sdp_handle: SDP handle returned by
+ * get_legacy_stack_sdp_api()->handle.SDP_CreateRecord().
*
* browse_supported: browse support info.
*
@@ -219,7 +225,8 @@
class_list[1] = UUID_SERVCLASS_AV_REM_CTRL_CONTROL;
count = 2;
}
- result &= SDP_AddServiceClassIdList(sdp_handle, count, class_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
+ sdp_handle, count, class_list);
uint16_t protocol_reported_version;
/* AVRCP versions 1.3 to 1.5 report (version - 1) in the protocol
@@ -243,8 +250,8 @@
avrc_proto_desc_list[index].params[0] = protocol_reported_version;
avrc_proto_desc_list[index].params[1] = 0;
}
- result &= SDP_AddProtocolList(sdp_handle, AVRC_NUM_PROTO_ELEMS,
- &avrc_proto_desc_list[0]);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
+ sdp_handle, AVRC_NUM_PROTO_ELEMS, &avrc_proto_desc_list[0]);
/* additional protocal descriptor, required only for version > 1.3 */
if (profile_version > AVRC_REV_1_3) {
@@ -296,38 +303,39 @@
if (num_additional_protocols > 0) {
AVRC_TRACE_API("%s: Add %d additonal protocol descriptor lists",
__func__, num_additional_protocols);
- result &= SDP_AddAdditionProtoLists(sdp_handle, num_additional_protocols,
- avrc_add_proto_desc_lists);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAdditionProtoLists(
+ sdp_handle, num_additional_protocols, avrc_add_proto_desc_lists);
}
}
/* add profile descriptor list */
- result &= SDP_AddProfileDescriptorList(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
sdp_handle, UUID_SERVCLASS_AV_REMOTE_CONTROL, profile_version);
/* add supported categories */
p = temp;
UINT16_TO_BE_STREAM(p, categories);
- result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES,
- UINT_DESC_TYPE, (uint32_t)2, (uint8_t*)temp);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, (uint32_t)2,
+ (uint8_t*)temp);
/* add provider name */
if (p_provider_name != NULL) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_provider_name) + 1), (uint8_t*)p_provider_name);
}
/* add service name */
if (p_service_name != NULL) {
- result &= SDP_AddAttribute(
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
(uint32_t)(strlen(p_service_name) + 1), (uint8_t*)p_service_name);
}
/* add browse group list */
browse_list[0] = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
- result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
- browse_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
return (result ? AVRC_SUCCESS : AVRC_FAIL);
}
@@ -347,7 +355,7 @@
*******************************************************************************/
uint16_t AVRC_RemoveRecord(uint32_t sdp_handle) {
AVRC_TRACE_API("%s: remove AVRCP SDP record", __func__);
- bool result = SDP_DeleteRecord(sdp_handle);
+ bool result = get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(sdp_handle);
return (result ? AVRC_SUCCESS : AVRC_FAIL);
}
diff --git a/system/stack/btm/btm_sco.cc b/system/stack/btm/btm_sco.cc
index 6668e31..475c977 100644
--- a/system/stack/btm/btm_sco.cc
+++ b/system/stack/btm/btm_sco.cc
@@ -36,6 +36,8 @@
#include "device/include/device_iot_config.h"
#include "embdrv/sbc/decoder/include/oi_codec_sbc.h"
#include "embdrv/sbc/decoder/include/oi_status.h"
+#include "hci/include/hci_layer.h"
+#include "main/shim/hci_layer.h"
#include "osi/include/allocator.h"
#include "osi/include/log.h"
#include "osi/include/osi.h"
@@ -379,7 +381,12 @@
return;
}
BT_HDR* packet = btm_sco_make_packet(std::move(data), active_sco->hci_handle);
- bte_main_hci_send(packet, BT_EVT_TO_LM_HCI_SCO);
+
+ auto hci = bluetooth::shim::hci_layer_get_interface();
+
+ packet->event = BT_EVT_TO_LM_HCI_SCO;
+
+ hci->transmit_downward(packet->event, packet);
}
// Build a SCO packet from uint8
diff --git a/system/stack/btm/btm_sec.cc b/system/stack/btm/btm_sec.cc
index b286ff4..04ffffc 100644
--- a/system/stack/btm/btm_sec.cc
+++ b/system/stack/btm/btm_sec.cc
@@ -116,7 +116,6 @@
tHCI_STATUS reason,
uint16_t conn_handle,
std::string comment);
-tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state);
static bool btm_dev_authenticated(tBTM_SEC_DEV_REC* p_dev_rec);
static bool btm_dev_encrypted(tBTM_SEC_DEV_REC* p_dev_rec);
@@ -232,6 +231,23 @@
/*******************************************************************************
*
+ * Function btm_sec_find_dev_by_sec_state
+ *
+ * Description Look for the record in the device database for the device
+ * which is being authenticated or encrypted
+ *
+ * Returns Pointer to the record or NULL
+ *
+ ******************************************************************************/
+static tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state) {
+ list_node_t* n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state);
+ if (n) return static_cast<tBTM_SEC_DEV_REC*>(list_node(n));
+
+ return nullptr;
+}
+
+/*******************************************************************************
+ *
* Function BTM_SecRegister
*
* Description Application manager calls this function to register for
@@ -4683,23 +4699,6 @@
/*******************************************************************************
*
- * Function btm_sec_find_dev_by_sec_state
- *
- * Description Look for the record in the device database for the device
- * which is being authenticated or encrypted
- *
- * Returns Pointer to the record or NULL
- *
- ******************************************************************************/
-tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state) {
- list_node_t* n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state);
- if (n) return static_cast<tBTM_SEC_DEV_REC*>(list_node(n));
-
- return NULL;
-}
-
-/*******************************************************************************
- *
* Function btm_sec_change_pairing_state
*
* Description This function is called to change pairing state
diff --git a/system/stack/btm/btm_sec.h b/system/stack/btm/btm_sec.h
index c1c80cd..f17a3e7 100644
--- a/system/stack/btm/btm_sec.h
+++ b/system/stack/btm/btm_sec.h
@@ -40,8 +40,6 @@
******************************************************************************/
tBTM_SEC_SERV_REC* btm_sec_find_first_serv(bool is_originator, uint16_t psm);
-tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state);
-
/*******************************************************************************
*
* Function BTM_SecRegister
@@ -715,18 +713,6 @@
/*******************************************************************************
*
- * Function btm_sec_find_dev_by_sec_state
- *
- * Description Look for the record in the device database for the device
- * which is being authenticated or encrypted
- *
- * Returns Pointer to the record or NULL
- *
- ******************************************************************************/
-tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state);
-
-/*******************************************************************************
- *
* Function btm_sec_dev_rec_cback_event
*
* Description This function calls the callback function with the given
diff --git a/system/stack/btm/neighbor_inquiry.h b/system/stack/btm/neighbor_inquiry.h
index 2ef6e82..5e9f35a 100644
--- a/system/stack/btm/neighbor_inquiry.h
+++ b/system/stack/btm/neighbor_inquiry.h
@@ -285,12 +285,6 @@
} tBTM_INQUIRY_VAR_ST;
-typedef union /* contains the inquiry filter condition */
-{
- RawAddress bdaddr_cond;
- tBTM_COD_COND cod_cond;
-} tBTM_INQ_FILT_COND;
-
#define BTM_INQ_RESULT_BR 0x01
#define BTM_INQ_RESULT_BLE 0x02
diff --git a/system/stack/gatt/gatt_api.cc b/system/stack/gatt/gatt_api.cc
index da76a85..12d8122 100644
--- a/system/stack/gatt/gatt_api.cc
+++ b/system/stack/gatt/gatt_api.cc
@@ -48,6 +48,8 @@
#include "types/bt_transport.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using bluetooth::Uuid;
bool BTM_BackgroundConnectAddressKnown(const RawAddress& address);
@@ -418,7 +420,7 @@
}
if (it->sdp_handle) {
- SDP_DeleteRecord(it->sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(it->sdp_handle);
}
gatt_cb.srv_list_info->erase(it);
diff --git a/system/stack/gatt/gatt_utils.cc b/system/stack/gatt/gatt_utils.cc
index 7b45eea..3b9bca1 100644
--- a/system/stack/gatt/gatt_utils.cc
+++ b/system/stack/gatt/gatt_utils.cc
@@ -46,6 +46,8 @@
uint8_t btm_ble_read_sec_key_size(const RawAddress& bd_addr);
+using namespace bluetooth::legacy::stack::sdp;
+
using base::StringPrintf;
using bluetooth::Uuid;
using bluetooth::eatt::EattExtension;
@@ -881,13 +883,14 @@
VLOG(1) << __func__
<< StringPrintf(" s_hdl=0x%x s_hdl=0x%x", start_hdl, end_hdl);
- uint32_t sdp_handle = SDP_CreateRecord();
+ uint32_t sdp_handle = get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
if (sdp_handle == 0) return 0;
switch (uuid.GetShortestRepresentationSize()) {
case Uuid::kNumBytes16: {
uint16_t tmp = uuid.As16Bit();
- SDP_AddServiceClassIdList(sdp_handle, 1, &tmp);
+ get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(sdp_handle,
+ 1, &tmp);
break;
}
@@ -895,16 +898,18 @@
UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
uint32_t tmp = uuid.As32Bit();
UINT32_TO_BE_STREAM(p, tmp);
- SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST,
- DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - buff), buff);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
+ (uint32_t)(p - buff), buff);
break;
}
case Uuid::kNumBytes128:
UINT8_TO_BE_STREAM(p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES);
ARRAY_TO_BE_STREAM(p, uuid.To128BitBE().data(), (int)Uuid::kNumBytes128);
- SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST,
- DATA_ELE_SEQ_DESC_TYPE, (uint32_t)(p - buff), buff);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
+ (uint32_t)(p - buff), buff);
break;
}
@@ -918,11 +923,13 @@
proto_elem_list[1].params[0] = start_hdl;
proto_elem_list[1].params[1] = end_hdl;
- SDP_AddProtocolList(sdp_handle, 2, proto_elem_list);
+ get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(sdp_handle, 2,
+ proto_elem_list);
/* Make the service browseable */
uint16_t list = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
- SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &list);
+ get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &list);
return (sdp_handle);
}
diff --git a/system/stack/hid/hidd_api.cc b/system/stack/hid/hidd_api.cc
index 4281ac8..503bfdc 100644
--- a/system/stack/hid/hidd_api.cc
+++ b/system/stack/hid/hidd_api.cc
@@ -36,10 +36,13 @@
#include "osi/include/allocator.h"
#include "stack/btm/btm_sec.h"
#include "stack/include/bt_types.h"
+#include "stack/include/sdp_api.h"
#include "stack/include/stack_metrics_logging.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
tHID_DEV_CTB hd_cb;
/*******************************************************************************
@@ -165,7 +168,8 @@
// Service Class ID List
if (result) {
uint16_t uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
- result &= SDP_AddServiceClassIdList(handle, 1, &uuid);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
+ handle, 1, &uuid);
}
// Protocol Descriptor List
@@ -179,14 +183,15 @@
proto_list[1].protocol_uuid = UUID_PROTOCOL_HIDP;
proto_list[1].num_params = 0;
- result &= SDP_AddProtocolList(handle, 2, proto_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
+ handle, 2, proto_list);
}
// Language Base Attribute ID List
if (result) {
- result &= SDP_AddLanguageBaseAttrIDList(handle, LANG_ID_CODE_ENGLISH,
- LANG_ID_CHAR_ENCODE_UTF8,
- LANGUAGE_BASE_ID);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddLanguageBaseAttrIDList(
+ handle, LANG_ID_CODE_ENGLISH, LANG_ID_CHAR_ENCODE_UTF8,
+ LANGUAGE_BASE_ID);
}
// Additional Protocol Descriptor List
@@ -200,7 +205,8 @@
add_proto_list.list_elem[1].protocol_uuid = UUID_PROTOCOL_HIDP;
add_proto_list.list_elem[1].num_params = 0;
- result &= SDP_AddAdditionProtoLists(handle, 1, &add_proto_list);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAdditionProtoLists(
+ handle, 1, &add_proto_list);
}
// Service Name (O)
@@ -211,16 +217,17 @@
const char* srv_desc = p_description;
const char* provider_name = p_provider;
- result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
- strlen(srv_name) + 1, (uint8_t*)srv_name);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, strlen(srv_name) + 1,
+ (uint8_t*)srv_name);
- result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_DESCRIPTION,
- TEXT_STR_DESC_TYPE, strlen(srv_desc) + 1,
- (uint8_t*)srv_desc);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_SERVICE_DESCRIPTION, TEXT_STR_DESC_TYPE,
+ strlen(srv_desc) + 1, (uint8_t*)srv_desc);
- result &=
- SDP_AddAttribute(handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE,
- strlen(provider_name) + 1, (uint8_t*)provider_name);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE,
+ strlen(provider_name) + 1, (uint8_t*)provider_name);
}
// Bluetooth Profile Descriptor List
@@ -228,7 +235,8 @@
const uint16_t profile_uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
const uint16_t version = 0x0100;
- result &= SDP_AddProfileDescriptorList(handle, profile_uuid, version);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
+ handle, profile_uuid, version);
}
// HID Parser Version
@@ -245,25 +253,29 @@
p = (uint8_t*)&temp;
UINT16_TO_BE_STREAM(p, rel_num);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_RELNUM,
- UINT_DESC_TYPE, 2, (uint8_t*)&temp);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_DEVICE_RELNUM, UINT_DESC_TYPE, 2, (uint8_t*)&temp);
p = (uint8_t*)&temp;
UINT16_TO_BE_STREAM(p, parser_version);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_PARSER_VERSION,
- UINT_DESC_TYPE, 2, (uint8_t*)&temp);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_PARSER_VERSION, UINT_DESC_TYPE, 2, (uint8_t*)&temp);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_SUBCLASS,
- UINT_DESC_TYPE, 1, (uint8_t*)&dev_subclass);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_DEVICE_SUBCLASS, UINT_DESC_TYPE, 1,
+ (uint8_t*)&dev_subclass);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_COUNTRY_CODE, UINT_DESC_TYPE,
- 1, (uint8_t*)&country_code);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_COUNTRY_CODE, UINT_DESC_TYPE, 1,
+ (uint8_t*)&country_code);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_VIRTUAL_CABLE,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_VIRTUAL_CABLE, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_true);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_RECONNECT_INITIATE,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_RECONNECT_INITIATE, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_true);
{
static uint8_t cdt = 0x22;
@@ -305,8 +317,9 @@
UINT8_TO_BE_STREAM(p, desc_len);
ARRAY_TO_BE_STREAM(p, p_desc_data, (int)desc_len);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_DESCRIPTOR_LIST,
- DATA_ELE_SEQ_DESC_TYPE, p - p_buf, p_buf);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_DESCRIPTOR_LIST, DATA_ELE_SEQ_DESC_TYPE,
+ p - p_buf, p_buf);
osi_free(p_buf);
}
@@ -322,33 +335,38 @@
UINT16_TO_BE_STREAM(p, lang_english);
UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
UINT16_TO_BE_STREAM(p, LANGUAGE_BASE_ID);
- result &=
- SDP_AddAttribute(handle, ATTR_ID_HID_LANGUAGE_ID_BASE,
- DATA_ELE_SEQ_DESC_TYPE, p - lang_buf, lang_buf);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_LANGUAGE_ID_BASE, DATA_ELE_SEQ_DESC_TYPE,
+ p - lang_buf, lang_buf);
}
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_BATTERY_POWER,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_BATTERY_POWER, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_true);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_REMOTE_WAKE,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_false);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_REMOTE_WAKE, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_false);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_NORMALLY_CONNECTABLE,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_NORMALLY_CONNECTABLE, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_true);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_BOOT_DEVICE,
- BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_BOOT_DEVICE, BOOLEAN_DESC_TYPE, 1,
+ (uint8_t*)&bool_true);
p = (uint8_t*)&temp;
UINT16_TO_BE_STREAM(p, prof_ver);
- result &= SDP_AddAttribute(handle, ATTR_ID_HID_PROFILE_VERSION,
- UINT_DESC_TYPE, 2, (uint8_t*)&temp);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ handle, ATTR_ID_HID_PROFILE_VERSION, UINT_DESC_TYPE, 2,
+ (uint8_t*)&temp);
}
if (result) {
uint16_t browse_group = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
- result &= SDP_AddUuidSequence(handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
- &browse_group);
+ result &= get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse_group);
}
if (!result) {
diff --git a/system/stack/hid/hidh_api.cc b/system/stack/hid/hidh_api.cc
index 3cad623..be26c70 100644
--- a/system/stack/hid/hidh_api.cc
+++ b/system/stack/hid/hidh_api.cc
@@ -41,6 +41,7 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
using bluetooth::Uuid;
tHID_HOST_CTB hh_cb;
@@ -67,9 +68,11 @@
hh_cb.p_sdp_db = p_db;
Uuid uuid_list = Uuid::From16Bit(UUID_SERVCLASS_HUMAN_INTERFACE);
- SDP_InitDiscoveryDb(p_db, db_len, 1, &uuid_list, 0, NULL);
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(p_db, db_len, 1,
+ &uuid_list, 0, NULL);
- if (SDP_ServiceSearchRequest(addr, p_db, hidh_search_callback)) {
+ if (get_legacy_stack_sdp_api()->service.SDP_ServiceSearchRequest(
+ addr, p_db, hidh_search_callback)) {
hh_cb.sdp_cback = sdp_cback;
hh_cb.sdp_busy = true;
return HID_SUCCESS;
@@ -86,7 +89,8 @@
tSDP_DISC_ATTR* p_attr;
uint16_t name_len;
- p_attr = SDP_FindAttributeInRec(p_rec, attr_id);
+ p_attr =
+ get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(p_rec, attr_id);
if (p_attr != NULL) {
name_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
if (name_len < max_len) {
@@ -116,7 +120,8 @@
}
Uuid hid_uuid = Uuid::From16Bit(UUID_SERVCLASS_HUMAN_INTERFACE);
- p_rec = SDP_FindServiceUUIDInDb(p_db, hid_uuid, NULL);
+ p_rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceUUIDInDb(p_db, hid_uuid,
+ NULL);
if (p_rec == NULL) {
hh_cb.sdp_cback(HID_SDP_NO_SERV_UUID, 0, NULL);
return;
@@ -125,8 +130,8 @@
memset(&hh_cb.sdp_rec, 0, sizeof(tHID_DEV_SDP_INFO));
/* First, verify the mandatory fields we care about */
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_DESCRIPTOR_LIST)) ==
- NULL) ||
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_DESCRIPTOR_LIST)) == NULL) ||
(SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) ||
((p_subattr1 = p_attr->attr_value.v.p_sub_attr) == NULL) ||
(SDP_DISC_ATTR_TYPE(p_subattr1->attr_len_type) !=
@@ -142,38 +147,38 @@
if (p_nvi->dscp_info.dl_len != 0)
p_nvi->dscp_info.dsc_list = (uint8_t*)&p_repdesc->attr_value;
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_VIRTUAL_CABLE)) !=
- NULL) &&
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_VIRTUAL_CABLE)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_VIRTUAL_CABLE;
}
- if (((p_attr = SDP_FindAttributeInRec(
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
p_rec, ATTR_ID_HID_RECONNECT_INITIATE)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_RECONN_INIT;
}
- if (((p_attr = SDP_FindAttributeInRec(
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
p_rec, ATTR_ID_HID_NORMALLY_CONNECTABLE)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_NORMALLY_CONNECTABLE;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_SDP_DISABLE)) !=
- NULL) &&
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_SDP_DISABLE)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_SDP_DISABLE;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_BATTERY_POWER)) !=
- NULL) &&
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_BATTERY_POWER)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_BATTERY_POWER;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_REMOTE_WAKE)) !=
- NULL) &&
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_REMOTE_WAKE)) != NULL) &&
(p_attr->attr_value.v.u8)) {
attr_mask |= HID_REMOTE_WAKE;
}
@@ -185,40 +190,40 @@
hidh_get_str_attr(p_rec, ATTR_ID_PROVIDER_NAME, HID_MAX_PROV_NAME_LEN,
p_nvi->prov_name);
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_DEVICE_RELNUM)) !=
- NULL)) {
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_DEVICE_RELNUM)) != NULL)) {
p_nvi->rel_num = p_attr->attr_value.v.u16;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_COUNTRY_CODE)) !=
- NULL)) {
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_COUNTRY_CODE)) != NULL)) {
p_nvi->ctry_code = p_attr->attr_value.v.u8;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_DEVICE_SUBCLASS)) !=
- NULL)) {
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_DEVICE_SUBCLASS)) != NULL)) {
p_nvi->sub_class = p_attr->attr_value.v.u8;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_PARSER_VERSION)) !=
- NULL)) {
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_PARSER_VERSION)) != NULL)) {
p_nvi->hpars_ver = p_attr->attr_value.v.u16;
}
- if (((p_attr = SDP_FindAttributeInRec(
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
p_rec, ATTR_ID_HID_LINK_SUPERVISION_TO)) != NULL)) {
attr_mask |= HID_SUP_TOUT_AVLBL;
p_nvi->sup_timeout = p_attr->attr_value.v.u16;
}
- if (((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HID_SSR_HOST_MAX_LAT)) !=
- NULL)) {
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, ATTR_ID_HID_SSR_HOST_MAX_LAT)) != NULL)) {
attr_mask |= HID_SSR_MAX_LATENCY;
p_nvi->ssr_max_latency = p_attr->attr_value.v.u16;
} else
p_nvi->ssr_max_latency = HID_SSR_PARAM_INVALID;
- if (((p_attr = SDP_FindAttributeInRec(
+ if (((p_attr = get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
p_rec, ATTR_ID_HID_SSR_HOST_MIN_TOUT)) != NULL)) {
attr_mask |= HID_SSR_MIN_TOUT;
p_nvi->ssr_min_tout = p_attr->attr_value.v.u16;
diff --git a/system/stack/include/bt_dev_class.h b/system/stack/include/bt_dev_class.h
index b19c7a0..a0d182d 100644
--- a/system/stack/include/bt_dev_class.h
+++ b/system/stack/include/bt_dev_class.h
@@ -123,6 +123,12 @@
}
#ifdef __cplusplus
+inline void dev_class_copy(DEV_CLASS& dst, const DEV_CLASS& src) {
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+}
+
#include <sstream>
inline std::string dev_class_text(const DEV_CLASS& dev_class) {
std::ostringstream oss;
diff --git a/system/stack/include/bt_name.h b/system/stack/include/bt_name.h
index 9cf6d6d..8f98059 100644
--- a/system/stack/include/bt_name.h
+++ b/system/stack/include/bt_name.h
@@ -48,6 +48,10 @@
inline constexpr tBTM_BD_NAME kBtmBdNameEmpty = {};
constexpr size_t kBdNameLength = static_cast<size_t>(BD_NAME_LEN);
+inline size_t bd_name_copy(BD_NAME bd_name_dest, const char* src) {
+ return strlcpy(reinterpret_cast<char*>(bd_name_dest), const_cast<char*>(src),
+ kBdNameLength + 1);
+}
inline size_t bd_name_copy(BD_NAME bd_name_dest, const BD_NAME bd_name_src) {
return strlcpy(reinterpret_cast<char*>(bd_name_dest),
reinterpret_cast<const char*>(bd_name_src), kBdNameLength + 1);
diff --git a/system/stack/include/btm_api_types.h b/system/stack/include/btm_api_types.h
index 5113bd6..450e556 100644
--- a/system/stack/include/btm_api_types.h
+++ b/system/stack/include/btm_api_types.h
@@ -129,12 +129,6 @@
***************************/
/* Definitions of the parameters passed to BTM_StartInquiry.
*/
-typedef struct /* contains the two device class condition fields */
-{
- DEV_CLASS dev_class;
- DEV_CLASS dev_class_mask;
-} tBTM_COD_COND;
-
constexpr uint8_t BLE_EVT_CONNECTABLE_BIT = 0;
constexpr uint8_t BLE_EVT_SCANNABLE_BIT = 1;
constexpr uint8_t BLE_EVT_DIRECTED_BIT = 2;
diff --git a/system/stack/pan/pan_api.cc b/system/stack/pan/pan_api.cc
index 378263c..4967652 100644
--- a/system/stack/pan/pan_api.cc
+++ b/system/stack/pan/pan_api.cc
@@ -43,6 +43,8 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
using bluetooth::Uuid;
namespace {
@@ -168,7 +170,8 @@
p_desc = PAN_NAP_DEFAULT_DESCRIPTION;
if (pan_cb.pan_nap_sdp_handle != 0)
- SDP_DeleteRecord(pan_cb.pan_nap_sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ pan_cb.pan_nap_sdp_handle);
pan_cb.pan_nap_sdp_handle =
pan_register_with_sdp(UUID_SERVCLASS_NAP, p_nap_name.c_str(), p_desc);
@@ -179,7 +182,8 @@
*/
else if (pan_cb.role & PAN_ROLE_NAP_SERVER) {
if (pan_cb.pan_nap_sdp_handle != 0) {
- SDP_DeleteRecord(pan_cb.pan_nap_sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ pan_cb.pan_nap_sdp_handle);
pan_cb.pan_nap_sdp_handle = 0;
bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
nap_service_name.clear();
@@ -193,7 +197,8 @@
/* Registering for PANU service with SDP */
p_desc = PAN_PANU_DEFAULT_DESCRIPTION;
if (pan_cb.pan_user_sdp_handle != 0)
- SDP_DeleteRecord(pan_cb.pan_user_sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ pan_cb.pan_user_sdp_handle);
pan_cb.pan_user_sdp_handle =
pan_register_with_sdp(UUID_SERVCLASS_PANU, p_user_name.c_str(), p_desc);
@@ -204,7 +209,8 @@
*/
else if (pan_cb.role & PAN_ROLE_CLIENT) {
if (pan_cb.pan_user_sdp_handle != 0) {
- SDP_DeleteRecord(pan_cb.pan_user_sdp_handle);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
+ pan_cb.pan_user_sdp_handle);
pan_cb.pan_user_sdp_handle = 0;
bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
user_service_name.clear();
diff --git a/system/stack/pan/pan_utils.cc b/system/stack/pan/pan_utils.cc
index 7252ddf..d81bbb5 100644
--- a/system/stack/pan/pan_utils.cc
+++ b/system/stack/pan/pan_utils.cc
@@ -33,6 +33,8 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
static const uint8_t pan_proto_elem_data[] = {
0x35, 0x18, /* data element sequence of length 0x18 bytes */
0x35, 0x06, /* data element sequence for L2CAP descriptor */
@@ -66,7 +68,7 @@
uint32_t proto_len = (uint32_t)pan_proto_elem_data[1];
/* Create a record */
- sdp_handle = SDP_CreateRecord();
+ sdp_handle = get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
if (sdp_handle == 0) {
PAN_TRACE_ERROR("PAN_SetRole - could not create SDP record");
@@ -74,35 +76,41 @@
}
/* Service Class ID List */
- SDP_AddServiceClassIdList(sdp_handle, 1, &uuid);
+ get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(sdp_handle, 1,
+ &uuid);
/* Add protocol element sequence from the constant string */
- SDP_AddAttribute(sdp_handle, ATTR_ID_PROTOCOL_DESC_LIST,
- DATA_ELE_SEQ_DESC_TYPE, proto_len,
- (uint8_t*)(pan_proto_elem_data + 2));
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_PROTOCOL_DESC_LIST, DATA_ELE_SEQ_DESC_TYPE, proto_len,
+ (uint8_t*)(pan_proto_elem_data + 2));
/* Language base */
- SDP_AddLanguageBaseAttrIDList(sdp_handle, LANG_ID_CODE_ENGLISH,
- LANG_ID_CHAR_ENCODE_UTF8, LANGUAGE_BASE_ID);
+ get_legacy_stack_sdp_api()->handle.SDP_AddLanguageBaseAttrIDList(
+ sdp_handle, LANG_ID_CODE_ENGLISH, LANG_ID_CHAR_ENCODE_UTF8,
+ LANGUAGE_BASE_ID);
/* Profile descriptor list */
- SDP_AddProfileDescriptorList(sdp_handle, uuid, PAN_PROFILE_VERSION);
+ get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
+ sdp_handle, uuid, PAN_PROFILE_VERSION);
/* Service Name */
- SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
- (uint8_t)(strlen(p_name) + 1), (uint8_t*)p_name);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
+ (uint8_t)(strlen(p_name) + 1), (uint8_t*)p_name);
/* Service description */
- SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_DESCRIPTION, TEXT_STR_DESC_TYPE,
- (uint8_t)(strlen(p_desc) + 1), (uint8_t*)p_desc);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SERVICE_DESCRIPTION, TEXT_STR_DESC_TYPE,
+ (uint8_t)(strlen(p_desc) + 1), (uint8_t*)p_desc);
/* Security description */
// Only NAP and PANU has service level security; GN has no security
if (uuid == UUID_SERVCLASS_NAP || uuid == UUID_SERVCLASS_PANU) {
UINT16_TO_BE_FIELD(&security, 0x0001);
}
- SDP_AddAttribute(sdp_handle, ATTR_ID_SECURITY_DESCRIPTION, UINT_DESC_TYPE, 2,
- (uint8_t*)&security);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_SECURITY_DESCRIPTION, UINT_DESC_TYPE, 2,
+ (uint8_t*)&security);
if (uuid == UUID_SERVCLASS_NAP) {
uint16_t NetAccessType = 0x0005; /* Ethernet */
@@ -112,18 +120,19 @@
/* Net access type. */
p = array;
UINT16_TO_BE_STREAM(p, NetAccessType);
- SDP_AddAttribute(sdp_handle, ATTR_ID_NET_ACCESS_TYPE, UINT_DESC_TYPE, 2,
- array);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_NET_ACCESS_TYPE, UINT_DESC_TYPE, 2, array);
/* Net access rate. */
p = array;
UINT32_TO_BE_STREAM(p, NetAccessRate);
- SDP_AddAttribute(sdp_handle, ATTR_ID_MAX_NET_ACCESS_RATE, UINT_DESC_TYPE, 4,
- array);
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
+ sdp_handle, ATTR_ID_MAX_NET_ACCESS_RATE, UINT_DESC_TYPE, 4, array);
}
/* Make the service browsable */
- SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse_list);
+ get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
+ sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse_list);
return sdp_handle;
}
diff --git a/system/stack/sdp/sdp_api.cc b/system/stack/sdp/sdp_api.cc
index 27c4a8f..fa5a7f0 100644
--- a/system/stack/sdp/sdp_api.cc
+++ b/system/stack/sdp/sdp_api.cc
@@ -32,6 +32,7 @@
#include "osi/include/osi.h" // PTR_TO_UINT
#include "stack/include/bt_types.h"
#include "stack/include/sdp_api.h"
+#include "stack/sdp/internal/sdp_api.h"
#include "stack/sdp/sdpint.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
diff --git a/system/stack/sdp/sdp_db.cc b/system/stack/sdp/sdp_db.cc
index d032e49..b9a9329 100644
--- a/system/stack/sdp/sdp_db.cc
+++ b/system/stack/sdp/sdp_db.cc
@@ -42,6 +42,11 @@
const uint8_t* p_his_uuid, uint16_t his_len,
int nest_level);
+bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type,
+ uint32_t attr_len, uint8_t* p_val);
+
+bool SDP_DeleteAttribute(uint32_t handle, uint16_t attr_id);
+
/*******************************************************************************
*
* Function sdp_db_service_search
diff --git a/system/stack/sdp/sdp_utils.cc b/system/stack/sdp/sdp_utils.cc
index e3150d9..3d8785a 100644
--- a/system/stack/sdp/sdp_utils.cc
+++ b/system/stack/sdp/sdp_utils.cc
@@ -54,6 +54,16 @@
#include "types/raw_address.h"
using bluetooth::Uuid;
+
+bool SDP_FindProtocolListElemInRec(const tSDP_DISC_REC* p_rec,
+ uint16_t layer_uuid,
+ tSDP_PROTOCOL_ELEM* p_elem);
+tSDP_DISC_ATTR* SDP_FindAttributeInRec(const tSDP_DISC_REC* p_rec,
+ uint16_t attr_id);
+uint16_t SDP_GetDiRecord(uint8_t getRecordIndex,
+ tSDP_DI_GET_RECORD* device_info,
+ const tSDP_DISCOVERY_DB* p_db);
+
static const uint8_t sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x80, 0x00, 0x00, 0x80,
0x5F, 0x9B, 0x34, 0xFB};
diff --git a/system/stack/smp/smp_act.cc b/system/stack/smp/smp_act.cc
index 22942fc..e6ea894 100644
--- a/system/stack/smp/smp_act.cc
+++ b/system/stack/smp/smp_act.cc
@@ -45,6 +45,9 @@
constexpr char kBtmLogTag[] = "SMP";
}
+static void smp_key_distribution_by_transport(tSMP_CB* p_cb,
+ tSMP_INT_DATA* p_data);
+
#define SMP_KEY_DIST_TYPE_MAX 4
const tSMP_ACT smp_distribute_act[] = {
@@ -2245,7 +2248,8 @@
* Description depending on the transport used at the moment calls either
* smp_key_distribution(...) or smp_br_key_distribution(...).
******************************************************************************/
-void smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
+static void smp_key_distribution_by_transport(tSMP_CB* p_cb,
+ tSMP_INT_DATA* p_data) {
SMP_TRACE_DEBUG("%s", __func__);
if (p_cb->smp_over_br) {
smp_br_select_next_key(p_cb, NULL);
diff --git a/system/stack/smp/smp_int.h b/system/stack/smp/smp_int.h
index 8b7a913..3a3fe65 100644
--- a/system/stack/smp/smp_int.h
+++ b/system/stack/smp/smp_int.h
@@ -404,7 +404,6 @@
void smp_br_check_authorization_request(tSMP_CB* p_cb, tSMP_INT_DATA* p_data);
void smp_br_select_next_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data);
void smp_br_process_link_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data);
-void smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data);
void smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data);
/* smp_l2c */
diff --git a/system/stack/test/common/stack_test_packet_utils.cc b/system/stack/test/common/stack_test_packet_utils.cc
index 7f89a61..e605813 100644
--- a/system/stack/test/common/stack_test_packet_utils.cc
+++ b/system/stack/test/common/stack_test_packet_utils.cc
@@ -64,7 +64,7 @@
packet->offset = 4 + L2CAP_PKT_OVERHEAD;
packet->len = static_cast<uint16_t>(buffer_length - 4 - L2CAP_PKT_OVERHEAD);
packet->layer_specific = 0;
- packet->event = MSG_HC_TO_STACK_HCI_ACL;
+ packet->event = 0x1100; // MSG_HC_TO_STACK_HCI_ACL;
memcpy(packet->data, acl_packet_bytes, buffer_length);
return packet;
}
diff --git a/system/stack/test/fuzzers/sdp/sdpFuzzFunctions.h b/system/stack/test/fuzzers/sdp/sdpFuzzFunctions.h
index 10423f5..435d214 100644
--- a/system/stack/test/fuzzers/sdp/sdpFuzzFunctions.h
+++ b/system/stack/test/fuzzers/sdp/sdpFuzzFunctions.h
@@ -37,7 +37,7 @@
*/
static const std::vector<std::function<void(FuzzedDataProvider*)>>
sdp_operations = {
- // SDP_InitDiscoveryDb
+ // ::SDP_InitDiscoveryDb
[](FuzzedDataProvider* fdp) -> void {
if (sdp_db_vect.size() >= MAX_NUM_DBS) {
return;
@@ -58,43 +58,47 @@
std::shared_ptr<tSDP_DISCOVERY_DB> p_db(
reinterpret_cast<tSDP_DISCOVERY_DB*>(malloc(db_size)), free);
if (p_db) {
- bool success = SDP_InitDiscoveryDb(
- p_db.get(), db_size, uuid_list.size(), uuid_list.data(),
- attr_list.size(),
- reinterpret_cast<uint16_t*>(attr_list.data()));
+ bool success =
+ get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ p_db.get(), db_size, uuid_list.size(), uuid_list.data(),
+ attr_list.size(),
+ reinterpret_cast<uint16_t*>(attr_list.data()));
if (success) {
sdp_db_vect.push_back(p_db);
}
}
},
- // SDP_CancelServiceSearch
+ // ::SDP_CancelServiceSearch
[](FuzzedDataProvider* fdp) -> void {
- SDP_CancelServiceSearch(
+ get_legacy_stack_sdp_api()->service.SDP_CancelServiceSearch(
getArbitraryVectorElement(fdp, sdp_db_vect, true).get());
},
- // SDP_ServiceSearchRequest
+ // ::SDP_ServiceSearchRequest
[](FuzzedDataProvider* fdp) -> void {
const RawAddress bd_addr = generateRawAddress(fdp);
tSDP_DISCOVERY_DB* db =
getArbitraryVectorElement(fdp, sdp_db_vect, false).get();
if (db) {
- SDP_ServiceSearchRequest(bd_addr, db, &sdp_disc_cmpl_cb);
+ get_legacy_stack_sdp_api()->service.SDP_ServiceSearchRequest(
+ bd_addr, db, &sdp_disc_cmpl_cb);
}
},
- // SDP_ServiceSearchAttributeRequest
+ // ::SDP_ServiceSearchAttributeRequest
[](FuzzedDataProvider* fdp) -> void {
const RawAddress bd_addr = generateRawAddress(fdp);
tSDP_DISCOVERY_DB* db =
getArbitraryVectorElement(fdp, sdp_db_vect, false).get();
if (db) {
- SDP_ServiceSearchAttributeRequest(bd_addr, db, &sdp_disc_cmpl_cb);
+ get_legacy_stack_sdp_api()
+ ->service.SDP_ServiceSearchAttributeRequest(bd_addr, db,
+ &sdp_disc_cmpl_cb);
}
},
- // SDP_ServiceSearchAttributeRequest2
+ // ::SDP_ServiceSearchAttributeRequest2
[](FuzzedDataProvider* fdp) -> void {
const RawAddress bd_addr = generateRawAddress(fdp);
std::vector<uint8_t> user_data = fdp->ConsumeBytes<uint8_t>(
@@ -103,105 +107,109 @@
getArbitraryVectorElement(fdp, sdp_db_vect, false).get();
if (db) {
- SDP_ServiceSearchAttributeRequest2(bd_addr, db, &sdp_disc_cmpl_cb2,
- user_data.data());
+ get_legacy_stack_sdp_api()
+ ->service.SDP_ServiceSearchAttributeRequest2(
+ bd_addr, db, &sdp_disc_cmpl_cb2, user_data.data());
}
},
- // SDP_FindAttributeInRec
+ // ::SDP_FindAttributeInRec
[](FuzzedDataProvider* fdp) -> void {
tSDP_DISC_REC* p_rec =
generateArbitrarySdpDiscRecord(fdp, false).get();
- SDP_FindAttributeInRec(p_rec, fdp->ConsumeIntegral<uint16_t>());
+ get_legacy_stack_sdp_api()->record.SDP_FindAttributeInRec(
+ p_rec, fdp->ConsumeIntegral<uint16_t>());
},
- // SDP_FindServiceInDb
+ // ::SDP_FindServiceInDb
[](FuzzedDataProvider* fdp) -> void {
- SDP_FindServiceInDb(
+ get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
getArbitraryVectorElement(fdp, sdp_db_vect, true).get(),
fdp->ConsumeIntegral<uint16_t>(),
generateArbitrarySdpDiscRecord(fdp, true).get());
},
- // SDP_FindServiceUUIDInDb
+ // ::SDP_FindServiceUUIDInDb
[](FuzzedDataProvider* fdp) -> void {
const bluetooth::Uuid uuid = generateArbitraryUuid(fdp);
- SDP_FindServiceUUIDInDb(
+ get_legacy_stack_sdp_api()->db.SDP_FindServiceUUIDInDb(
getArbitraryVectorElement(fdp, sdp_db_vect, true).get(), uuid,
generateArbitrarySdpDiscRecord(fdp, true).get());
},
- // SDP_FindServiceUUIDInRec_128bit
+ // ::SDP_FindServiceUUIDInRec_128bit
[](FuzzedDataProvider* fdp) -> void {
bluetooth::Uuid uuid = generateArbitraryUuid(fdp);
tSDP_DISC_REC* p_rec =
generateArbitrarySdpDiscRecord(fdp, false).get();
- SDP_FindServiceUUIDInRec_128bit(p_rec, &uuid);
+ get_legacy_stack_sdp_api()->record.SDP_FindServiceUUIDInRec_128bit(
+ p_rec, &uuid);
},
- // SDP_FindServiceInDb_128bit
+ // ::SDP_FindServiceInDb_128bit
[](FuzzedDataProvider* fdp) -> void {
- SDP_FindServiceInDb_128bit(
+ get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb_128bit(
getArbitraryVectorElement(fdp, sdp_db_vect, true).get(),
generateArbitrarySdpDiscRecord(fdp, true).get());
},
- // SDP_FindProtocolListElemInRec
+ // ::SDP_FindProtocolListElemInRec
[](FuzzedDataProvider* fdp) -> void {
tSDP_PROTOCOL_ELEM elem = generateArbitrarySdpProtocolElements(fdp);
tSDP_DISC_REC* p_rec =
generateArbitrarySdpDiscRecord(fdp, false).get();
- SDP_FindProtocolListElemInRec(p_rec, fdp->ConsumeIntegral<uint16_t>(),
- &elem);
+ get_legacy_stack_sdp_api()->record.SDP_FindProtocolListElemInRec(
+ p_rec, fdp->ConsumeIntegral<uint16_t>(), &elem);
},
- // SDP_FindProfileVersionInRec
+ // ::SDP_FindProfileVersionInRec
[](FuzzedDataProvider* fdp) -> void {
uint16_t p_version;
tSDP_DISC_REC* p_rec =
generateArbitrarySdpDiscRecord(fdp, false).get();
- SDP_FindProfileVersionInRec(p_rec, fdp->ConsumeIntegral<uint16_t>(),
- &p_version);
+ get_legacy_stack_sdp_api()->record.SDP_FindProfileVersionInRec(
+ p_rec, fdp->ConsumeIntegral<uint16_t>(), &p_version);
},
- // SDP_CreateRecord
+ // ::SDP_CreateRecord
[](FuzzedDataProvider* fdp) -> void {
- uint32_t handle = SDP_CreateRecord();
+ uint32_t handle =
+ get_legacy_stack_sdp_api()->handle.SDP_CreateRecord();
if (handle) {
sdp_record_handles.push_back(handle);
}
},
- // SDP_DeleteRecord
+ // ::SDP_DeleteRecord
[](FuzzedDataProvider* fdp) -> void {
- SDP_DeleteRecord(
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(
getArbitraryVectorElement(fdp, sdp_record_handles, true));
},
- // SDP_AddAttribute
+ // ::SDP_AddAttribute
[](FuzzedDataProvider* fdp) -> void {
std::vector<uint8_t> val = fdp->ConsumeBytes<uint8_t>(
fdp->ConsumeIntegralInRange<size_t>(1, 1024));
if (val.size() > 0) {
- SDP_AddAttribute(
+ get_legacy_stack_sdp_api()->handle.SDP_AddAttribute(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>(),
fdp->ConsumeIntegral<uint8_t>(), val.size(), val.data());
}
},
- // SDP_AddSequence
+ // ::SDP_AddSequence
[](FuzzedDataProvider* fdp) -> void {
SDP_Sequence_Helper seq = generateArbitrarySdpElemSequence(fdp);
- SDP_AddSequence(
+ get_legacy_stack_sdp_api()->handle.SDP_AddSequence(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>(), seq.num_elem, seq.type.get(),
seq.len.get(), seq.p_val.get());
},
- // SDP_AddUuidSequence
+ // ::SDP_AddUuidSequence
[](FuzzedDataProvider* fdp) -> void {
uint16_t num_uuids = fdp->ConsumeIntegralInRange<uint16_t>(1, 64);
uint16_t* uuids = new uint16_t[num_uuids];
@@ -209,31 +217,31 @@
uuids[i] = fdp->ConsumeIntegral<uint16_t>();
}
- SDP_AddUuidSequence(
+ get_legacy_stack_sdp_api()->handle.SDP_AddUuidSequence(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>(), num_uuids, uuids);
delete[] uuids;
},
- // SDP_AddProtocolList
+ // ::SDP_AddProtocolList
[](FuzzedDataProvider* fdp) -> void {
std::shared_ptr<tSDP_PROTO_LIST_ELEM> p_proto_list =
generateArbitrarySdpProtocolElementList(fdp);
if (p_proto_list) {
- SDP_AddProtocolList(
+ get_legacy_stack_sdp_api()->handle.SDP_AddProtocolList(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
p_proto_list.get()->num_elems, p_proto_list.get()->list_elem);
}
},
- // SDP_AddAdditionProtoLists
+ // ::SDP_AddAdditionProtoLists
[](FuzzedDataProvider* fdp) -> void {
uint16_t arr_size;
tSDP_PROTO_LIST_ELEM** p_proto_list =
generateArbitrarySdpProtocolElementListArray(fdp, &arr_size);
if (p_proto_list) {
if (p_proto_list[0]) {
- SDP_AddAdditionProtoLists(
+ get_legacy_stack_sdp_api()->handle.SDP_AddAdditionProtoLists(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
arr_size, p_proto_list[0]);
for (uint16_t i = 0; i < arr_size; i++) {
@@ -244,24 +252,24 @@
}
},
- // SDP_AddProfileDescriptorList
+ // ::SDP_AddProfileDescriptorList
[](FuzzedDataProvider* fdp) -> void {
- SDP_AddProfileDescriptorList(
+ get_legacy_stack_sdp_api()->handle.SDP_AddProfileDescriptorList(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>(),
fdp->ConsumeIntegral<uint16_t>());
},
- // SDP_AddLanguageBaseAttrIDList
+ // ::SDP_AddLanguageBaseAttrIDList
[](FuzzedDataProvider* fdp) -> void {
- SDP_AddLanguageBaseAttrIDList(
+ get_legacy_stack_sdp_api()->handle.SDP_AddLanguageBaseAttrIDList(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>(),
fdp->ConsumeIntegral<uint16_t>(),
fdp->ConsumeIntegral<uint16_t>());
},
- // SDP_AddServiceClassIdList
+ // ::SDP_AddServiceClassIdList
[](FuzzedDataProvider* fdp) -> void {
uint16_t num_services = fdp->ConsumeIntegralInRange<uint16_t>(0, 64);
uint16_t* service_uuids = new uint16_t[num_services];
@@ -269,28 +277,29 @@
service_uuids[i] = fdp->ConsumeIntegral<uint16_t>();
}
- SDP_AddServiceClassIdList(
+ get_legacy_stack_sdp_api()->handle.SDP_AddServiceClassIdList(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
num_services, service_uuids);
delete[] service_uuids;
},
- // SDP_DeleteAttribute
+ // ::SDP_DeleteAttribute
[](FuzzedDataProvider* fdp) -> void {
- SDP_DeleteAttribute(
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteAttribute(
getArbitraryVectorElement(fdp, sdp_record_handles, true),
fdp->ConsumeIntegral<uint16_t>());
},
- // SDP_SetLocalDiRecord
+ // ::SDP_SetLocalDiRecord
[](FuzzedDataProvider* fdp) -> void {
uint32_t handle; // Output var
tSDP_DI_RECORD device_info = generateArbitrarySdpDiRecord(fdp);
- SDP_SetLocalDiRecord(&device_info, &handle);
+ get_legacy_stack_sdp_api()->device_id.SDP_SetLocalDiRecord(
+ &device_info, &handle);
},
- // SDP_DiDiscover
+ // ::SDP_DiDiscover
[](FuzzedDataProvider* fdp) -> void {
const RawAddress remote_device = generateRawAddress(fdp);
@@ -300,36 +309,37 @@
std::shared_ptr<tSDP_DISCOVERY_DB> p_db(
reinterpret_cast<tSDP_DISCOVERY_DB*>(malloc(db_size)), free);
if (p_db) {
- SDP_DiDiscover(remote_device, p_db.get(), db_size,
- &sdp_disc_cmpl_cb);
+ get_legacy_stack_sdp_api()->device_id.SDP_DiDiscover(
+ remote_device, p_db.get(), db_size, &sdp_disc_cmpl_cb);
}
},
- // SDP_GetNumDiRecords
+ // ::SDP_GetNumDiRecords
[](FuzzedDataProvider* fdp) -> void {
- SDP_GetNumDiRecords(
+ get_legacy_stack_sdp_api()->device_id.SDP_GetNumDiRecords(
getArbitraryVectorElement(fdp, sdp_db_vect, true).get());
},
- // SDP_GetDiRecord
+ // ::SDP_GetDiRecord
[](FuzzedDataProvider* fdp) -> void {
tSDP_DI_GET_RECORD device_info; // Output var
- SDP_GetDiRecord(
+ get_legacy_stack_sdp_api()->device_id.SDP_GetDiRecord(
fdp->ConsumeIntegral<uint8_t>(), &device_info,
getArbitraryVectorElement(fdp, sdp_db_vect, true).get());
},
- // SDP_SetTraceLevel
+ // ::SDP_SetTraceLevel
[](FuzzedDataProvider* fdp) -> void {
SDP_SetTraceLevel(fdp->ConsumeIntegral<uint8_t>());
},
- // SDP_FindServiceUUIDInRec
+ // ::SDP_FindServiceUUIDInRec
[](FuzzedDataProvider* fdp) -> void {
tSDP_DISC_REC* p_rec =
generateArbitrarySdpDiscRecord(fdp, false).get();
bluetooth::Uuid uuid; // Output var
- SDP_FindServiceUUIDInRec(p_rec, &uuid);
+ get_legacy_stack_sdp_api()->record.SDP_FindServiceUUIDInRec(p_rec,
+ &uuid);
}};
#endif // FUZZER_SDP_FUNCTIONS_H_
diff --git a/system/stack/test/fuzzers/sdp/sdpFuzzHelpers.h b/system/stack/test/fuzzers/sdp/sdpFuzzHelpers.h
index fead81e..43b4710 100644
--- a/system/stack/test/fuzzers/sdp/sdpFuzzHelpers.h
+++ b/system/stack/test/fuzzers/sdp/sdpFuzzHelpers.h
@@ -27,9 +27,12 @@
#include "fuzzers/common/commonFuzzHelpers.h"
#include "osi/include/alarm.h"
+#include "stack/include/sdp_api.h"
#include "stack/sdp/sdpint.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
+
#define SDP_MAX_NUM_ELEMS 128
#define SDP_MAX_ELEM_LEN 1024
#define SDP_MAX_ATTRS 1024
@@ -76,7 +79,7 @@
sdp_protolist_elem_vect.clear();
// Delete all records
- SDP_DeleteRecord(0);
+ get_legacy_stack_sdp_api()->handle.SDP_DeleteRecord(0);
sdp_record_handles.clear();
// Delete Databases
diff --git a/system/stack/test/gatt/stack_gatt_test.cc b/system/stack/test/gatt/stack_gatt_test.cc
index fb000ef..8d6b9ea 100644
--- a/system/stack/test/gatt/stack_gatt_test.cc
+++ b/system/stack/test/gatt/stack_gatt_test.cc
@@ -27,10 +27,26 @@
#include "stack/gatt/gatt_int.h"
#include "stack/include/gatt_api.h"
#include "test/common/mock_functions.h"
+#include "test/mock/mock_stack_sdp_legacy_api.h"
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
-class StackGattTest : public ::testing::Test {};
+class StackGattTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ test::mock::stack_sdp_legacy::api_.handle.SDP_CreateRecord =
+ ::SDP_CreateRecord;
+ test::mock::stack_sdp_legacy::api_.handle.SDP_AddServiceClassIdList =
+ ::SDP_AddServiceClassIdList;
+ test::mock::stack_sdp_legacy::api_.handle.SDP_AddAttribute =
+ ::SDP_AddAttribute;
+ test::mock::stack_sdp_legacy::api_.handle.SDP_AddProtocolList =
+ ::SDP_AddProtocolList;
+ test::mock::stack_sdp_legacy::api_.handle.SDP_AddUuidSequence =
+ ::SDP_AddUuidSequence;
+ }
+ void TearDown() override { test::mock::stack_sdp_legacy::api_.handle = {}; }
+};
namespace {
diff --git a/system/test/Android.bp b/system/test/Android.bp
index 32cc9d2..5656eca 100644
--- a/system/test/Android.bp
+++ b/system/test/Android.bp
@@ -206,6 +206,27 @@
}
filegroup {
+ name: "TestMockStackAvct",
+ srcs: [
+ "mock/mock_stack_avct_*.cc",
+ ],
+}
+
+filegroup {
+ name: "TestMockStackAvdt",
+ srcs: [
+ "mock/mock_stack_avdt_*.cc",
+ ],
+}
+
+filegroup {
+ name: "TestMockStackAvrc",
+ srcs: [
+ "mock/mock_stack_avrc_*.cc",
+ ],
+}
+
+filegroup {
name: "TestMockStackL2cap",
srcs: [
"mock/mock_stack_l2cap_*.cc",
@@ -315,6 +336,20 @@
}
filegroup {
+ name: "TestMockStackHid",
+ srcs: [
+ "mock/mock_stack_hid*.cc",
+ ],
+}
+
+filegroup {
+ name: "TestMockStackPan",
+ srcs: [
+ "mock/mock_stack_pan*.cc",
+ ],
+}
+
+filegroup {
name: "TestMockStackSdp",
srcs: [
"mock/mock_stack_sdp*.cc",
diff --git a/system/test/headless/sdp/sdp.cc b/system/test/headless/sdp/sdp.cc
index 4779fb4..f5adcae 100644
--- a/system/test/headless/sdp/sdp.cc
+++ b/system/test/headless/sdp/sdp.cc
@@ -29,6 +29,7 @@
#include "types/bluetooth/uuid.h"
#include "types/raw_address.h"
+using namespace bluetooth::legacy::stack::sdp;
using namespace bluetooth::test::headless;
static void bta_jv_start_discovery_callback(tSDP_STATUS result,
@@ -85,10 +86,10 @@
const RawAddress& raw_address, const bluetooth::Uuid& uuid) {
SdpDb sdp_discovery_db(kMaxDiscoveryRecords);
- if (!SDP_InitDiscoveryDb(sdp_discovery_db.RawPointer(),
- sdp_discovery_db.Length(),
- 1, // num_uuid,
- &uuid, 0, nullptr)) {
+ if (!get_legacy_stack_sdp_api()->service.SDP_InitDiscoveryDb(
+ sdp_discovery_db.RawPointer(), sdp_discovery_db.Length(),
+ 1, // num_uuid,
+ &uuid, 0, nullptr)) {
fprintf(stdout, "%s Unable to initialize sdp discovery\n", __func__);
return -1;
}
@@ -98,7 +99,7 @@
sdp_discovery_db.Print(stdout);
- if (!SDP_ServiceSearchAttributeRequest2(
+ if (!get_legacy_stack_sdp_api()->service.SDP_ServiceSearchAttributeRequest2(
raw_address, sdp_discovery_db.RawPointer(),
bta_jv_start_discovery_callback, (void*)&promise)) {
fprintf(stdout, "%s Failed to start search attribute request\n", __func__);
@@ -112,8 +113,8 @@
return result;
}
- tSDP_DISC_REC* rec = SDP_FindServiceInDb(sdp_discovery_db.RawPointer(),
- uuid.As16Bit(), nullptr);
+ tSDP_DISC_REC* rec = get_legacy_stack_sdp_api()->db.SDP_FindServiceInDb(
+ sdp_discovery_db.RawPointer(), uuid.As16Bit(), nullptr);
if (rec == nullptr) {
fprintf(stdout, "discovery record is null from:%s uuid:%s\n",
raw_address.ToString().c_str(), uuid.ToString().c_str());
diff --git a/system/test/mock/mock_btif_co_bta_hh_co.cc b/system/test/mock/mock_btif_co_bta_hh_co.cc
index 887ef8c..da9560d 100644
--- a/system/test/mock/mock_btif_co_bta_hh_co.cc
+++ b/system/test/mock/mock_btif_co_bta_hh_co.cc
@@ -43,16 +43,13 @@
inc_func_call_count(__func__);
return nullptr;
}
-void bta_hh_co_close(uint8_t dev_handle, uint8_t app_id) {
- inc_func_call_count(__func__);
-}
+void bta_hh_co_close(btif_hh_device_t* p_dev) { inc_func_call_count(__func__); }
void bta_hh_co_data(uint8_t dev_handle, uint8_t* p_rpt, uint16_t len,
tBTA_HH_PROTO_MODE mode, uint8_t sub_class,
uint8_t ctry_code, UNUSED_ATTR const RawAddress& peer_addr,
uint8_t app_id) {
inc_func_call_count(__func__);
}
-void bta_hh_co_destroy(int fd) { inc_func_call_count(__func__); }
void bta_hh_co_get_rpt_rsp(uint8_t dev_handle, uint8_t status,
const uint8_t* p_rpt, uint16_t len) {
inc_func_call_count(__func__);
diff --git a/system/test/mock/mock_stack_acl.cc b/system/test/mock/mock_stack_acl.cc
index 2958682..afe452f 100644
--- a/system/test/mock/mock_stack_acl.cc
+++ b/system/test/mock/mock_stack_acl.cc
@@ -77,7 +77,6 @@
struct sco_peer_supports_esco_2m_phy sco_peer_supports_esco_2m_phy;
struct sco_peer_supports_esco_3m_phy sco_peer_supports_esco_3m_phy;
struct acl_create_classic_connection acl_create_classic_connection;
-struct IsEprAvailable IsEprAvailable;
struct acl_get_connection_from_address acl_get_connection_from_address;
struct btm_acl_for_bda btm_acl_for_bda;
struct acl_get_connection_from_handle acl_get_connection_from_handle;
@@ -320,10 +319,6 @@
return test::mock::stack_acl::acl_create_classic_connection(
bd_addr, there_are_high_priority_channels, is_bonding);
}
-bool IsEprAvailable(const tACL_CONN& p_acl) {
- inc_func_call_count(__func__);
- return test::mock::stack_acl::IsEprAvailable(p_acl);
-}
tACL_CONN* acl_get_connection_from_address(const RawAddress& bd_addr,
tBT_TRANSPORT transport) {
inc_func_call_count(__func__);
diff --git a/system/test/mock/mock_stack_acl.h b/system/test/mock/mock_stack_acl.h
index 25ebc36..400e27d 100644
--- a/system/test/mock/mock_stack_acl.h
+++ b/system/test/mock/mock_stack_acl.h
@@ -359,15 +359,6 @@
};
};
extern struct acl_create_classic_connection acl_create_classic_connection;
-// Name: IsEprAvailable
-// Params: const tACL_CONN& p_acl
-// Returns: inline bool
-struct IsEprAvailable {
- std::function<bool(const tACL_CONN& p_acl)> body{
- [](const tACL_CONN& p_acl) { return 0; }};
- inline bool operator()(const tACL_CONN& p_acl) { return body(p_acl); };
-};
-extern struct IsEprAvailable IsEprAvailable;
// Name: acl_get_connection_from_address
// Params: const RawAddress& bd_addr, tBT_TRANSPORT transport
// Returns: tACL_CONN*
diff --git a/system/test/mock/mock_stack_btm_inq.cc b/system/test/mock/mock_stack_btm_inq.cc
index f782f59..0c7f59e 100644
--- a/system/test/mock/mock_stack_btm_inq.cc
+++ b/system/test/mock/mock_stack_btm_inq.cc
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2023 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.
@@ -13,170 +13,299 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
/*
* Generated mock file from original source file
- * Functions generated:44
+ * Functions generated:43
+ *
+ * mockcify.pl ver 0.6.0
*/
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
+#include <cstdint>
+#include <functional>
#include <map>
#include <string>
-#include "advertise_data_parser.h"
-#include "btm_api.h"
-#include "common/time_util.h"
-#include "device/include/controller.h"
-#include "main/shim/btm_api.h"
-#include "main/shim/shim.h"
-#include "osi/include/log.h"
-#include "osi/include/osi.h"
-#include "stack/btm/btm_ble_int.h"
-#include "stack/btm/btm_int_types.h"
-#include "stack/include/acl_api.h"
-#include "stack/include/bt_hdr.h"
-#include "stack/include/btm_ble_api.h"
-#include "stack/include/inq_hci_link_interface.h"
-#include "test/common/mock_functions.h"
-#include "types/bluetooth/uuid.h"
-#include "types/raw_address.h"
+// Mock include file to share data between tests and mock
+#include "test/mock/mock_stack_btm_inq.h"
-#ifndef UNUSED_ATTR
-#define UNUSED_ATTR
-#endif
+// Original usings
-void SendRemoteNameRequest(const RawAddress& raw_address) {
+// Mocked internal structures, if any
+
+namespace test {
+namespace mock {
+namespace stack_btm_inq {
+
+// Function state capture and return values, if needed
+struct BTM_AddEirService BTM_AddEirService;
+struct BTM_CancelInquiry BTM_CancelInquiry;
+struct BTM_CancelRemoteDeviceName BTM_CancelRemoteDeviceName;
+struct BTM_ClearInqDb BTM_ClearInqDb;
+struct BTM_EnableInterlacedInquiryScan BTM_EnableInterlacedInquiryScan;
+struct BTM_EnableInterlacedPageScan BTM_EnableInterlacedPageScan;
+struct BTM_GetEirSupportedServices BTM_GetEirSupportedServices;
+struct BTM_GetEirUuidList BTM_GetEirUuidList;
+struct BTM_HasEirService BTM_HasEirService;
+struct BTM_HasInquiryEirService BTM_HasInquiryEirService;
+struct BTM_InqDbFirst BTM_InqDbFirst;
+struct BTM_InqDbNext BTM_InqDbNext;
+struct BTM_InqDbRead BTM_InqDbRead;
+struct BTM_IsInquiryActive BTM_IsInquiryActive;
+struct BTM_IsRemoteNameKnown BTM_IsRemoteNameKnown;
+struct BTM_ReadRemoteDeviceName BTM_ReadRemoteDeviceName;
+struct BTM_RemoveEirService BTM_RemoveEirService;
+struct BTM_SetConnectability BTM_SetConnectability;
+struct BTM_SetDiscoverability BTM_SetDiscoverability;
+struct BTM_SetInquiryMode BTM_SetInquiryMode;
+struct BTM_StartInquiry BTM_StartInquiry;
+struct BTM_WriteEIR BTM_WriteEIR;
+struct SendRemoteNameRequest SendRemoteNameRequest;
+struct btm_clear_all_pending_le_entry btm_clear_all_pending_le_entry;
+struct btm_clr_inq_db btm_clr_inq_db;
+struct btm_clr_inq_result_flt btm_clr_inq_result_flt;
+struct btm_initiate_rem_name btm_initiate_rem_name;
+struct btm_inq_clear_ssp btm_inq_clear_ssp;
+struct btm_inq_db_find btm_inq_db_find;
+struct btm_inq_db_free btm_inq_db_free;
+struct btm_inq_db_init btm_inq_db_init;
+struct btm_inq_db_new btm_inq_db_new;
+struct btm_inq_db_reset btm_inq_db_reset;
+struct btm_inq_find_bdaddr btm_inq_find_bdaddr;
+struct btm_inq_remote_name_timer_timeout btm_inq_remote_name_timer_timeout;
+struct btm_inq_rmt_name_failed_cancelled btm_inq_rmt_name_failed_cancelled;
+struct btm_inq_stop_on_ssp btm_inq_stop_on_ssp;
+struct btm_process_cancel_complete btm_process_cancel_complete;
+struct btm_process_inq_complete btm_process_inq_complete;
+struct btm_process_inq_results btm_process_inq_results;
+struct btm_process_remote_name btm_process_remote_name;
+struct btm_set_eir_uuid btm_set_eir_uuid;
+struct btm_sort_inq_result btm_sort_inq_result;
+
+} // namespace stack_btm_inq
+} // namespace mock
+} // namespace test
+
+// Mocked function return values, if any
+namespace test {
+namespace mock {
+namespace stack_btm_inq {
+
+tBTM_STATUS BTM_CancelRemoteDeviceName::return_value = 0;
+tBTM_STATUS BTM_ClearInqDb::return_value = 0;
+uint8_t BTM_GetEirSupportedServices::return_value = 0;
+uint8_t BTM_GetEirUuidList::return_value = 0;
+bool BTM_HasEirService::return_value = false;
+tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService::return_value = 0;
+tBTM_INQ_INFO* BTM_InqDbFirst::return_value = nullptr;
+tBTM_INQ_INFO* BTM_InqDbNext::return_value = nullptr;
+tBTM_INQ_INFO* BTM_InqDbRead::return_value = nullptr;
+uint16_t BTM_IsInquiryActive::return_value = 0;
+bool BTM_IsRemoteNameKnown::return_value = false;
+tBTM_STATUS BTM_ReadRemoteDeviceName::return_value = 0;
+tBTM_STATUS BTM_SetConnectability::return_value = 0;
+tBTM_STATUS BTM_SetDiscoverability::return_value = 0;
+tBTM_STATUS BTM_SetInquiryMode::return_value = 0;
+tBTM_STATUS BTM_StartInquiry::return_value = 0;
+tBTM_STATUS BTM_WriteEIR::return_value = 0;
+tBTM_STATUS btm_initiate_rem_name::return_value = 0;
+tINQ_DB_ENT* btm_inq_db_find::return_value = nullptr;
+tINQ_DB_ENT* btm_inq_db_new::return_value = nullptr;
+bool btm_inq_find_bdaddr::return_value = false;
+
+} // namespace stack_btm_inq
+} // namespace mock
+} // namespace test
+
+// Mocked functions, if any
+void BTM_AddEirService(uint32_t* p_eir_uuid, uint16_t uuid16) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::BTM_AddEirService(p_eir_uuid, uuid16);
}
-bool BTM_HasEirService(const uint32_t* p_eir_uuid, uint16_t uuid16) {
+void BTM_CancelInquiry(void) {
inc_func_call_count(__func__);
- return false;
-}
-bool btm_inq_find_bdaddr(const RawAddress& p_bda) {
- inc_func_call_count(__func__);
- return false;
-}
-tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService(tBTM_INQ_RESULTS* p_results,
- uint16_t uuid16) {
- inc_func_call_count(__func__);
- return 0;
-}
-tBTM_INQ_INFO* BTM_InqDbFirst(void) {
- inc_func_call_count(__func__);
- return nullptr;
-}
-tBTM_INQ_INFO* BTM_InqDbNext(tBTM_INQ_INFO* p_cur) {
- inc_func_call_count(__func__);
- return nullptr;
-}
-tBTM_INQ_INFO* BTM_InqDbRead(const RawAddress& p_bda) {
- inc_func_call_count(__func__);
- return nullptr;
+ test::mock::stack_btm_inq::BTM_CancelInquiry();
}
tBTM_STATUS BTM_CancelRemoteDeviceName(void) {
inc_func_call_count(__func__);
- return BTM_SUCCESS;
+ return test::mock::stack_btm_inq::BTM_CancelRemoteDeviceName();
}
tBTM_STATUS BTM_ClearInqDb(const RawAddress* p_bda) {
inc_func_call_count(__func__);
- return BTM_SUCCESS;
+ return test::mock::stack_btm_inq::BTM_ClearInqDb(p_bda);
}
-tBTM_STATUS BTM_ReadRemoteDeviceName(const RawAddress& remote_bda,
- tBTM_NAME_CMPL_CB* p_cb,
- tBT_TRANSPORT transport) {
+void BTM_EnableInterlacedInquiryScan() {
inc_func_call_count(__func__);
- return BTM_SUCCESS;
+ test::mock::stack_btm_inq::BTM_EnableInterlacedInquiryScan();
}
-tBTM_STATUS BTM_SetConnectability(uint16_t page_mode) {
+void BTM_EnableInterlacedPageScan() {
inc_func_call_count(__func__);
- return BTM_SUCCESS;
-}
-tBTM_STATUS BTM_SetDiscoverability(uint16_t inq_mode) {
- inc_func_call_count(__func__);
- return BTM_SUCCESS;
-}
-tBTM_STATUS BTM_SetInquiryMode(uint8_t mode) {
- inc_func_call_count(__func__);
- return BTM_SUCCESS;
-}
-tBTM_STATUS BTM_StartInquiry(tBTM_INQ_RESULTS_CB* p_results_cb,
- tBTM_CMPL_CB* p_cmpl_cb) {
- inc_func_call_count(__func__);
- return BTM_SUCCESS;
-}
-tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda, uint8_t origin,
- uint64_t timeout_ms, tBTM_CMPL_CB* p_cb) {
- inc_func_call_count(__func__);
- return BTM_SUCCESS;
-}
-tINQ_DB_ENT* btm_inq_db_find(const RawAddress& p_bda) {
- inc_func_call_count(__func__);
- return nullptr;
-}
-tINQ_DB_ENT* btm_inq_db_new(const RawAddress& p_bda) {
- inc_func_call_count(__func__);
- return nullptr;
-}
-uint16_t BTM_IsInquiryActive(void) {
- inc_func_call_count(__func__);
- return 0;
+ test::mock::stack_btm_inq::BTM_EnableInterlacedPageScan();
}
uint8_t BTM_GetEirSupportedServices(uint32_t* p_eir_uuid, uint8_t** p,
uint8_t max_num_uuid16,
uint8_t* p_num_uuid16) {
inc_func_call_count(__func__);
- return 0;
+ return test::mock::stack_btm_inq::BTM_GetEirSupportedServices(
+ p_eir_uuid, p, max_num_uuid16, p_num_uuid16);
}
uint8_t BTM_GetEirUuidList(const uint8_t* p_eir, size_t eir_len,
uint8_t uuid_size, uint8_t* p_num_uuid,
uint8_t* p_uuid_list, uint8_t max_num_uuid) {
inc_func_call_count(__func__);
- return 0;
+ return test::mock::stack_btm_inq::BTM_GetEirUuidList(
+ p_eir, eir_len, uuid_size, p_num_uuid, p_uuid_list, max_num_uuid);
}
-void BTM_AddEirService(uint32_t* p_eir_uuid, uint16_t uuid16) {
+bool BTM_HasEirService(const uint32_t* p_eir_uuid, uint16_t uuid16) {
inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_HasEirService(p_eir_uuid, uuid16);
}
-void BTM_CancelInquiry(void) { inc_func_call_count(__func__); }
-void BTM_EnableInterlacedInquiryScan() { inc_func_call_count(__func__); }
-void BTM_EnableInterlacedPageScan() { inc_func_call_count(__func__); }
-void btm_clr_inq_db(const RawAddress* p_bda) { inc_func_call_count(__func__); }
-void btm_clr_inq_result_flt(void) { inc_func_call_count(__func__); }
-void btm_inq_clear_ssp(void) { inc_func_call_count(__func__); }
-void btm_inq_db_free(void) { inc_func_call_count(__func__); }
-void btm_inq_db_init(void) { inc_func_call_count(__func__); }
-void btm_inq_db_reset(void) { inc_func_call_count(__func__); }
-void btm_inq_remote_name_timer_timeout(UNUSED_ATTR void* data) {
+tBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService(tBTM_INQ_RESULTS* p_results,
+ uint16_t uuid16) {
inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_HasInquiryEirService(p_results, uuid16);
}
-void btm_inq_rmt_name_failed_cancelled(void) { inc_func_call_count(__func__); }
-void btm_inq_stop_on_ssp(void) { inc_func_call_count(__func__); }
+tBTM_INQ_INFO* BTM_InqDbFirst(void) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_InqDbFirst();
+}
+tBTM_INQ_INFO* BTM_InqDbNext(tBTM_INQ_INFO* p_cur) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_InqDbNext(p_cur);
+}
+tBTM_INQ_INFO* BTM_InqDbRead(const RawAddress& p_bda) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_InqDbRead(p_bda);
+}
+uint16_t BTM_IsInquiryActive(void) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_IsInquiryActive();
+}
+bool BTM_IsRemoteNameKnown(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_IsRemoteNameKnown(bd_addr, transport);
+}
+tBTM_STATUS BTM_ReadRemoteDeviceName(const RawAddress& remote_bda,
+ tBTM_NAME_CMPL_CB* p_cb,
+ tBT_TRANSPORT transport) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_ReadRemoteDeviceName(remote_bda, p_cb,
+ transport);
+}
+void BTM_RemoveEirService(uint32_t* p_eir_uuid, uint16_t uuid16) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::BTM_RemoveEirService(p_eir_uuid, uuid16);
+}
+tBTM_STATUS BTM_SetConnectability(uint16_t page_mode) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_SetConnectability(page_mode);
+}
+tBTM_STATUS BTM_SetDiscoverability(uint16_t inq_mode) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_SetDiscoverability(inq_mode);
+}
+tBTM_STATUS BTM_SetInquiryMode(uint8_t mode) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_SetInquiryMode(mode);
+}
+tBTM_STATUS BTM_StartInquiry(tBTM_INQ_RESULTS_CB* p_results_cb,
+ tBTM_CMPL_CB* p_cmpl_cb) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_StartInquiry(p_results_cb, p_cmpl_cb);
+}
+tBTM_STATUS BTM_WriteEIR(BT_HDR* p_buff) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::BTM_WriteEIR(p_buff);
+}
+void SendRemoteNameRequest(const RawAddress& raw_address) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::SendRemoteNameRequest(raw_address);
+}
+void btm_clear_all_pending_le_entry(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_clear_all_pending_le_entry();
+}
+void btm_clr_inq_db(const RawAddress* p_bda) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_clr_inq_db(p_bda);
+}
+void btm_clr_inq_result_flt(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_clr_inq_result_flt();
+}
+tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda, uint8_t origin,
+ uint64_t timeout_ms,
+ tBTM_NAME_CMPL_CB* p_cb) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::btm_initiate_rem_name(remote_bda, origin,
+ timeout_ms, p_cb);
+}
+void btm_inq_clear_ssp(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_clear_ssp();
+}
+tINQ_DB_ENT* btm_inq_db_find(const RawAddress& p_bda) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::btm_inq_db_find(p_bda);
+}
+void btm_inq_db_free(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_db_free();
+}
+void btm_inq_db_init(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_db_init();
+}
+tINQ_DB_ENT* btm_inq_db_new(const RawAddress& p_bda) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::btm_inq_db_new(p_bda);
+}
+void btm_inq_db_reset(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_db_reset();
+}
+bool btm_inq_find_bdaddr(const RawAddress& p_bda) {
+ inc_func_call_count(__func__);
+ return test::mock::stack_btm_inq::btm_inq_find_bdaddr(p_bda);
+}
+void btm_inq_remote_name_timer_timeout(void* data) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_remote_name_timer_timeout(data);
+}
+void btm_inq_rmt_name_failed_cancelled(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_rmt_name_failed_cancelled();
+}
+void btm_inq_stop_on_ssp(void) {
+ inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_inq_stop_on_ssp();
+}
void btm_process_cancel_complete(tHCI_STATUS status, uint8_t mode) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_process_cancel_complete(status, mode);
}
void btm_process_inq_complete(tHCI_STATUS status, uint8_t mode) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_process_inq_complete(status, mode);
}
void btm_process_inq_results(const uint8_t* p, uint8_t hci_evt_len,
uint8_t inq_res_mode) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_process_inq_results(p, hci_evt_len,
+ inq_res_mode);
}
void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
uint16_t evt_len, tHCI_STATUS hci_status) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_process_remote_name(bda, bdn, evt_len,
+ hci_status);
}
void btm_set_eir_uuid(const uint8_t* p_eir, tBTM_INQ_RESULTS* p_results) {
inc_func_call_count(__func__);
+ test::mock::stack_btm_inq::btm_set_eir_uuid(p_eir, p_results);
}
-void btm_sort_inq_result(void) { inc_func_call_count(__func__); }
-bool BTM_IsRemoteNameKnown(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
+void btm_sort_inq_result(void) {
inc_func_call_count(__func__);
- return false;
+ test::mock::stack_btm_inq::btm_sort_inq_result();
}
-void btm_clear_all_pending_le_entry(void) { inc_func_call_count(__func__); }
-
// Mocked functions complete
// END mockcify generation
diff --git a/system/test/mock/mock_stack_btm_inq.h b/system/test/mock/mock_stack_btm_inq.h
new file mode 100644
index 0000000..6265607
--- /dev/null
+++ b/system/test/mock/mock_stack_btm_inq.h
@@ -0,0 +1,573 @@
+/*
+ * Copyright 2023 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
+
+/*
+ * Generated mock file from original source file
+ * Functions generated:43
+ *
+ * mockcify.pl ver 0.6.0
+ */
+
+#include <cstdint>
+#include <functional>
+#include <map>
+#include <string>
+
+#include "test/common/mock_functions.h"
+
+// Original included files, if any
+// NOTE: Since this is a mock file with mock definitions some number of
+// include files may not be required. The include-what-you-use
+// still applies, but crafting proper inclusion is out of scope
+// for this effort. This compilation unit may compile as-is, or
+// may need attention to prune from (or add to ) the inclusion set.
+#include <base/logging.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <mutex>
+
+#include "advertise_data_parser.h"
+#include "common/time_util.h"
+#include "device/include/controller.h"
+#include "main/shim/btm_api.h"
+#include "main/shim/shim.h"
+#include "osi/include/allocator.h"
+#include "osi/include/log.h"
+#include "osi/include/osi.h"
+#include "osi/include/properties.h"
+#include "stack/btm/btm_ble_int.h"
+#include "stack/btm/btm_dev.h"
+#include "stack/btm/btm_int_types.h"
+#include "stack/include/acl_api.h"
+#include "stack/include/bt_hdr.h"
+#include "stack/include/btm_api.h"
+#include "stack/include/btm_ble_api.h"
+#include "stack/include/inq_hci_link_interface.h"
+#include "types/bluetooth/uuid.h"
+#include "types/raw_address.h"
+
+// Original usings
+using bluetooth::Uuid;
+
+// Mocked compile conditionals, if any
+
+namespace test {
+namespace mock {
+namespace stack_btm_inq {
+
+// Shared state between mocked functions and tests
+// Name: BTM_AddEirService
+// Params: uint32_t* p_eir_uuid, uint16_t uuid16
+// Return: void
+struct BTM_AddEirService {
+ std::function<void(uint32_t* p_eir_uuid, uint16_t uuid16)> body{
+ [](uint32_t* p_eir_uuid, uint16_t uuid16) {}};
+ void operator()(uint32_t* p_eir_uuid, uint16_t uuid16) {
+ body(p_eir_uuid, uuid16);
+ };
+};
+extern struct BTM_AddEirService BTM_AddEirService;
+
+// Name: BTM_CancelInquiry
+// Params: void
+// Return: void
+struct BTM_CancelInquiry {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct BTM_CancelInquiry BTM_CancelInquiry;
+
+// Name: BTM_CancelRemoteDeviceName
+// Params: void
+// Return: tBTM_STATUS
+struct BTM_CancelRemoteDeviceName {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(void)> body{[](void) { return return_value; }};
+ tBTM_STATUS operator()(void) { return body(); };
+};
+extern struct BTM_CancelRemoteDeviceName BTM_CancelRemoteDeviceName;
+
+// Name: BTM_ClearInqDb
+// Params: const RawAddress* p_bda
+// Return: tBTM_STATUS
+struct BTM_ClearInqDb {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(const RawAddress* p_bda)> body{
+ [](const RawAddress* p_bda) { return return_value; }};
+ tBTM_STATUS operator()(const RawAddress* p_bda) { return body(p_bda); };
+};
+extern struct BTM_ClearInqDb BTM_ClearInqDb;
+
+// Name: BTM_EnableInterlacedInquiryScan
+// Params:
+// Return: void
+struct BTM_EnableInterlacedInquiryScan {
+ std::function<void()> body{[]() {}};
+ void operator()() { body(); };
+};
+extern struct BTM_EnableInterlacedInquiryScan BTM_EnableInterlacedInquiryScan;
+
+// Name: BTM_EnableInterlacedPageScan
+// Params:
+// Return: void
+struct BTM_EnableInterlacedPageScan {
+ std::function<void()> body{[]() {}};
+ void operator()() { body(); };
+};
+extern struct BTM_EnableInterlacedPageScan BTM_EnableInterlacedPageScan;
+
+// Name: BTM_GetEirSupportedServices
+// Params: uint32_t* p_eir_uuid, uint8_t** p, uint8_t max_num_uuid16, uint8_t*
+// p_num_uuid16 Return: uint8_t
+struct BTM_GetEirSupportedServices {
+ static uint8_t return_value;
+ std::function<uint8_t(uint32_t* p_eir_uuid, uint8_t** p,
+ uint8_t max_num_uuid16, uint8_t* p_num_uuid16)>
+ body{[](uint32_t* p_eir_uuid, uint8_t** p, uint8_t max_num_uuid16,
+ uint8_t* p_num_uuid16) { return return_value; }};
+ uint8_t operator()(uint32_t* p_eir_uuid, uint8_t** p, uint8_t max_num_uuid16,
+ uint8_t* p_num_uuid16) {
+ return body(p_eir_uuid, p, max_num_uuid16, p_num_uuid16);
+ };
+};
+extern struct BTM_GetEirSupportedServices BTM_GetEirSupportedServices;
+
+// Name: BTM_GetEirUuidList
+// Params: const uint8_t* p_eir, size_t eir_len, uint8_t uuid_size, uint8_t*
+// p_num_uuid, uint8_t* p_uuid_list, uint8_t max_num_uuid Return: uint8_t
+struct BTM_GetEirUuidList {
+ static uint8_t return_value;
+ std::function<uint8_t(const uint8_t* p_eir, size_t eir_len, uint8_t uuid_size,
+ uint8_t* p_num_uuid, uint8_t* p_uuid_list,
+ uint8_t max_num_uuid)>
+ body{[](const uint8_t* p_eir, size_t eir_len, uint8_t uuid_size,
+ uint8_t* p_num_uuid, uint8_t* p_uuid_list,
+ uint8_t max_num_uuid) { return return_value; }};
+ uint8_t operator()(const uint8_t* p_eir, size_t eir_len, uint8_t uuid_size,
+ uint8_t* p_num_uuid, uint8_t* p_uuid_list,
+ uint8_t max_num_uuid) {
+ return body(p_eir, eir_len, uuid_size, p_num_uuid, p_uuid_list,
+ max_num_uuid);
+ };
+};
+extern struct BTM_GetEirUuidList BTM_GetEirUuidList;
+
+// Name: BTM_HasEirService
+// Params: const uint32_t* p_eir_uuid, uint16_t uuid16
+// Return: bool
+struct BTM_HasEirService {
+ static bool return_value;
+ std::function<bool(const uint32_t* p_eir_uuid, uint16_t uuid16)> body{
+ [](const uint32_t* p_eir_uuid, uint16_t uuid16) { return return_value; }};
+ bool operator()(const uint32_t* p_eir_uuid, uint16_t uuid16) {
+ return body(p_eir_uuid, uuid16);
+ };
+};
+extern struct BTM_HasEirService BTM_HasEirService;
+
+// Name: BTM_HasInquiryEirService
+// Params: tBTM_INQ_RESULTS* p_results, uint16_t uuid16
+// Return: tBTM_EIR_SEARCH_RESULT
+struct BTM_HasInquiryEirService {
+ static tBTM_EIR_SEARCH_RESULT return_value;
+ std::function<tBTM_EIR_SEARCH_RESULT(tBTM_INQ_RESULTS* p_results,
+ uint16_t uuid16)>
+ body{[](tBTM_INQ_RESULTS* p_results, uint16_t uuid16) {
+ return return_value;
+ }};
+ tBTM_EIR_SEARCH_RESULT operator()(tBTM_INQ_RESULTS* p_results,
+ uint16_t uuid16) {
+ return body(p_results, uuid16);
+ };
+};
+extern struct BTM_HasInquiryEirService BTM_HasInquiryEirService;
+
+// Name: BTM_InqDbFirst
+// Params: void
+// Return: tBTM_INQ_INFO*
+struct BTM_InqDbFirst {
+ static tBTM_INQ_INFO* return_value;
+ std::function<tBTM_INQ_INFO*(void)> body{[](void) { return return_value; }};
+ tBTM_INQ_INFO* operator()(void) { return body(); };
+};
+extern struct BTM_InqDbFirst BTM_InqDbFirst;
+
+// Name: BTM_InqDbNext
+// Params: tBTM_INQ_INFO* p_cur
+// Return: tBTM_INQ_INFO*
+struct BTM_InqDbNext {
+ static tBTM_INQ_INFO* return_value;
+ std::function<tBTM_INQ_INFO*(tBTM_INQ_INFO* p_cur)> body{
+ [](tBTM_INQ_INFO* p_cur) { return return_value; }};
+ tBTM_INQ_INFO* operator()(tBTM_INQ_INFO* p_cur) { return body(p_cur); };
+};
+extern struct BTM_InqDbNext BTM_InqDbNext;
+
+// Name: BTM_InqDbRead
+// Params: const RawAddress& p_bda
+// Return: tBTM_INQ_INFO*
+struct BTM_InqDbRead {
+ static tBTM_INQ_INFO* return_value;
+ std::function<tBTM_INQ_INFO*(const RawAddress& p_bda)> body{
+ [](const RawAddress& p_bda) { return return_value; }};
+ tBTM_INQ_INFO* operator()(const RawAddress& p_bda) { return body(p_bda); };
+};
+extern struct BTM_InqDbRead BTM_InqDbRead;
+
+// Name: BTM_IsInquiryActive
+// Params: void
+// Return: uint16_t
+struct BTM_IsInquiryActive {
+ static uint16_t return_value;
+ std::function<uint16_t(void)> body{[](void) { return return_value; }};
+ uint16_t operator()(void) { return body(); };
+};
+extern struct BTM_IsInquiryActive BTM_IsInquiryActive;
+
+// Name: BTM_IsRemoteNameKnown
+// Params: const RawAddress& bd_addr, tBT_TRANSPORT transport
+// Return: bool
+struct BTM_IsRemoteNameKnown {
+ static bool return_value;
+ std::function<bool(const RawAddress& bd_addr, tBT_TRANSPORT transport)> body{
+ [](const RawAddress& bd_addr, tBT_TRANSPORT transport) {
+ return return_value;
+ }};
+ bool operator()(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
+ return body(bd_addr, transport);
+ };
+};
+extern struct BTM_IsRemoteNameKnown BTM_IsRemoteNameKnown;
+
+// Name: BTM_ReadRemoteDeviceName
+// Params: const RawAddress& remote_bda, tBTM_NAME_CMPL_CB* p_cb, tBT_TRANSPORT
+// transport Return: tBTM_STATUS
+struct BTM_ReadRemoteDeviceName {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(const RawAddress& remote_bda,
+ tBTM_NAME_CMPL_CB* p_cb, tBT_TRANSPORT transport)>
+ body{[](const RawAddress& remote_bda, tBTM_NAME_CMPL_CB* p_cb,
+ tBT_TRANSPORT transport) { return return_value; }};
+ tBTM_STATUS operator()(const RawAddress& remote_bda, tBTM_NAME_CMPL_CB* p_cb,
+ tBT_TRANSPORT transport) {
+ return body(remote_bda, p_cb, transport);
+ };
+};
+extern struct BTM_ReadRemoteDeviceName BTM_ReadRemoteDeviceName;
+
+// Name: BTM_RemoveEirService
+// Params: uint32_t* p_eir_uuid, uint16_t uuid16
+// Return: void
+struct BTM_RemoveEirService {
+ std::function<void(uint32_t* p_eir_uuid, uint16_t uuid16)> body{
+ [](uint32_t* p_eir_uuid, uint16_t uuid16) {}};
+ void operator()(uint32_t* p_eir_uuid, uint16_t uuid16) {
+ body(p_eir_uuid, uuid16);
+ };
+};
+extern struct BTM_RemoveEirService BTM_RemoveEirService;
+
+// Name: BTM_SetConnectability
+// Params: uint16_t page_mode
+// Return: tBTM_STATUS
+struct BTM_SetConnectability {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(uint16_t page_mode)> body{
+ [](uint16_t page_mode) { return return_value; }};
+ tBTM_STATUS operator()(uint16_t page_mode) { return body(page_mode); };
+};
+extern struct BTM_SetConnectability BTM_SetConnectability;
+
+// Name: BTM_SetDiscoverability
+// Params: uint16_t inq_mode
+// Return: tBTM_STATUS
+struct BTM_SetDiscoverability {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(uint16_t inq_mode)> body{
+ [](uint16_t inq_mode) { return return_value; }};
+ tBTM_STATUS operator()(uint16_t inq_mode) { return body(inq_mode); };
+};
+extern struct BTM_SetDiscoverability BTM_SetDiscoverability;
+
+// Name: BTM_SetInquiryMode
+// Params: uint8_t mode
+// Return: tBTM_STATUS
+struct BTM_SetInquiryMode {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(uint8_t mode)> body{
+ [](uint8_t mode) { return return_value; }};
+ tBTM_STATUS operator()(uint8_t mode) { return body(mode); };
+};
+extern struct BTM_SetInquiryMode BTM_SetInquiryMode;
+
+// Name: BTM_StartInquiry
+// Params: tBTM_INQ_RESULTS_CB* p_results_cb, tBTM_CMPL_CB* p_cmpl_cb
+// Return: tBTM_STATUS
+struct BTM_StartInquiry {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(tBTM_INQ_RESULTS_CB* p_results_cb,
+ tBTM_CMPL_CB* p_cmpl_cb)>
+ body{[](tBTM_INQ_RESULTS_CB* p_results_cb, tBTM_CMPL_CB* p_cmpl_cb) {
+ return return_value;
+ }};
+ tBTM_STATUS operator()(tBTM_INQ_RESULTS_CB* p_results_cb,
+ tBTM_CMPL_CB* p_cmpl_cb) {
+ return body(p_results_cb, p_cmpl_cb);
+ };
+};
+extern struct BTM_StartInquiry BTM_StartInquiry;
+
+// Name: BTM_WriteEIR
+// Params: BT_HDR* p_buff
+// Return: tBTM_STATUS
+struct BTM_WriteEIR {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(BT_HDR* p_buff)> body{
+ [](BT_HDR* p_buff) { return return_value; }};
+ tBTM_STATUS operator()(BT_HDR* p_buff) { return body(p_buff); };
+};
+extern struct BTM_WriteEIR BTM_WriteEIR;
+
+// Name: SendRemoteNameRequest
+// Params: const RawAddress& raw_address
+// Return: void
+struct SendRemoteNameRequest {
+ std::function<void(const RawAddress& raw_address)> body{
+ [](const RawAddress& raw_address) {}};
+ void operator()(const RawAddress& raw_address) { body(raw_address); };
+};
+extern struct SendRemoteNameRequest SendRemoteNameRequest;
+
+// Name: btm_clear_all_pending_le_entry
+// Params: void
+// Return: void
+struct btm_clear_all_pending_le_entry {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_clear_all_pending_le_entry btm_clear_all_pending_le_entry;
+
+// Name: btm_clr_inq_db
+// Params: const RawAddress* p_bda
+// Return: void
+struct btm_clr_inq_db {
+ std::function<void(const RawAddress* p_bda)> body{
+ [](const RawAddress* p_bda) {}};
+ void operator()(const RawAddress* p_bda) { body(p_bda); };
+};
+extern struct btm_clr_inq_db btm_clr_inq_db;
+
+// Name: btm_clr_inq_result_flt
+// Params: void
+// Return: void
+struct btm_clr_inq_result_flt {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_clr_inq_result_flt btm_clr_inq_result_flt;
+
+// Name: btm_initiate_rem_name
+// Params: const RawAddress& remote_bda, uint8_t origin, uint64_t timeout_ms,
+// tBTM_NAME_CMPL_CB* p_cb Return: tBTM_STATUS
+struct btm_initiate_rem_name {
+ static tBTM_STATUS return_value;
+ std::function<tBTM_STATUS(const RawAddress& remote_bda, uint8_t origin,
+ uint64_t timeout_ms, tBTM_NAME_CMPL_CB* p_cb)>
+ body{[](const RawAddress& remote_bda, uint8_t origin, uint64_t timeout_ms,
+ tBTM_NAME_CMPL_CB* p_cb) { return return_value; }};
+ tBTM_STATUS operator()(const RawAddress& remote_bda, uint8_t origin,
+ uint64_t timeout_ms, tBTM_NAME_CMPL_CB* p_cb) {
+ return body(remote_bda, origin, timeout_ms, p_cb);
+ };
+};
+extern struct btm_initiate_rem_name btm_initiate_rem_name;
+
+// Name: btm_inq_clear_ssp
+// Params: void
+// Return: void
+struct btm_inq_clear_ssp {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_clear_ssp btm_inq_clear_ssp;
+
+// Name: btm_inq_db_find
+// Params: const RawAddress& p_bda
+// Return: tINQ_DB_ENT*
+struct btm_inq_db_find {
+ static tINQ_DB_ENT* return_value;
+ std::function<tINQ_DB_ENT*(const RawAddress& p_bda)> body{
+ [](const RawAddress& p_bda) { return return_value; }};
+ tINQ_DB_ENT* operator()(const RawAddress& p_bda) { return body(p_bda); };
+};
+extern struct btm_inq_db_find btm_inq_db_find;
+
+// Name: btm_inq_db_free
+// Params: void
+// Return: void
+struct btm_inq_db_free {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_db_free btm_inq_db_free;
+
+// Name: btm_inq_db_init
+// Params: void
+// Return: void
+struct btm_inq_db_init {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_db_init btm_inq_db_init;
+
+// Name: btm_inq_db_new
+// Params: const RawAddress& p_bda
+// Return: tINQ_DB_ENT*
+struct btm_inq_db_new {
+ static tINQ_DB_ENT* return_value;
+ std::function<tINQ_DB_ENT*(const RawAddress& p_bda)> body{
+ [](const RawAddress& p_bda) { return return_value; }};
+ tINQ_DB_ENT* operator()(const RawAddress& p_bda) { return body(p_bda); };
+};
+extern struct btm_inq_db_new btm_inq_db_new;
+
+// Name: btm_inq_db_reset
+// Params: void
+// Return: void
+struct btm_inq_db_reset {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_db_reset btm_inq_db_reset;
+
+// Name: btm_inq_find_bdaddr
+// Params: const RawAddress& p_bda
+// Return: bool
+struct btm_inq_find_bdaddr {
+ static bool return_value;
+ std::function<bool(const RawAddress& p_bda)> body{
+ [](const RawAddress& p_bda) { return return_value; }};
+ bool operator()(const RawAddress& p_bda) { return body(p_bda); };
+};
+extern struct btm_inq_find_bdaddr btm_inq_find_bdaddr;
+
+// Name: btm_inq_remote_name_timer_timeout
+// Params: void* data
+// Return: void
+struct btm_inq_remote_name_timer_timeout {
+ std::function<void(void* data)> body{[](void* data) {}};
+ void operator()(void* data) { body(data); };
+};
+extern struct btm_inq_remote_name_timer_timeout
+ btm_inq_remote_name_timer_timeout;
+
+// Name: btm_inq_rmt_name_failed_cancelled
+// Params: void
+// Return: void
+struct btm_inq_rmt_name_failed_cancelled {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_rmt_name_failed_cancelled
+ btm_inq_rmt_name_failed_cancelled;
+
+// Name: btm_inq_stop_on_ssp
+// Params: void
+// Return: void
+struct btm_inq_stop_on_ssp {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_inq_stop_on_ssp btm_inq_stop_on_ssp;
+
+// Name: btm_process_cancel_complete
+// Params: tHCI_STATUS status, uint8_t mode
+// Return: void
+struct btm_process_cancel_complete {
+ std::function<void(tHCI_STATUS status, uint8_t mode)> body{
+ [](tHCI_STATUS status, uint8_t mode) {}};
+ void operator()(tHCI_STATUS status, uint8_t mode) { body(status, mode); };
+};
+extern struct btm_process_cancel_complete btm_process_cancel_complete;
+
+// Name: btm_process_inq_complete
+// Params: tHCI_STATUS status, uint8_t mode
+// Return: void
+struct btm_process_inq_complete {
+ std::function<void(tHCI_STATUS status, uint8_t mode)> body{
+ [](tHCI_STATUS status, uint8_t mode) {}};
+ void operator()(tHCI_STATUS status, uint8_t mode) { body(status, mode); };
+};
+extern struct btm_process_inq_complete btm_process_inq_complete;
+
+// Name: btm_process_inq_results
+// Params: const uint8_t* p, uint8_t hci_evt_len, uint8_t inq_res_mode
+// Return: void
+struct btm_process_inq_results {
+ std::function<void(const uint8_t* p, uint8_t hci_evt_len,
+ uint8_t inq_res_mode)>
+ body{[](const uint8_t* p, uint8_t hci_evt_len, uint8_t inq_res_mode) {}};
+ void operator()(const uint8_t* p, uint8_t hci_evt_len, uint8_t inq_res_mode) {
+ body(p, hci_evt_len, inq_res_mode);
+ };
+};
+extern struct btm_process_inq_results btm_process_inq_results;
+
+// Name: btm_process_remote_name
+// Params: const RawAddress* bda, const BD_NAME bdn, uint16_t evt_len,
+// tHCI_STATUS hci_status Return: void
+struct btm_process_remote_name {
+ std::function<void(const RawAddress* bda, const BD_NAME bdn, uint16_t evt_len,
+ tHCI_STATUS hci_status)>
+ body{[](const RawAddress* bda, const BD_NAME bdn, uint16_t evt_len,
+ tHCI_STATUS hci_status) {}};
+ void operator()(const RawAddress* bda, const BD_NAME bdn, uint16_t evt_len,
+ tHCI_STATUS hci_status) {
+ body(bda, bdn, evt_len, hci_status);
+ };
+};
+extern struct btm_process_remote_name btm_process_remote_name;
+
+// Name: btm_set_eir_uuid
+// Params: const uint8_t* p_eir, tBTM_INQ_RESULTS* p_results
+// Return: void
+struct btm_set_eir_uuid {
+ std::function<void(const uint8_t* p_eir, tBTM_INQ_RESULTS* p_results)> body{
+ [](const uint8_t* p_eir, tBTM_INQ_RESULTS* p_results) {}};
+ void operator()(const uint8_t* p_eir, tBTM_INQ_RESULTS* p_results) {
+ body(p_eir, p_results);
+ };
+};
+extern struct btm_set_eir_uuid btm_set_eir_uuid;
+
+// Name: btm_sort_inq_result
+// Params: void
+// Return: void
+struct btm_sort_inq_result {
+ std::function<void(void)> body{[](void) {}};
+ void operator()(void) { body(); };
+};
+extern struct btm_sort_inq_result btm_sort_inq_result;
+
+} // namespace stack_btm_inq
+} // namespace mock
+} // namespace test
+
+// END mockcify generation
\ No newline at end of file
diff --git a/system/test/mock/mock_stack_btm_sec.cc b/system/test/mock/mock_stack_btm_sec.cc
index 815a3fa..c424e06 100644
--- a/system/test/mock/mock_stack_btm_sec.cc
+++ b/system/test/mock/mock_stack_btm_sec.cc
@@ -132,10 +132,6 @@
inc_func_call_count(__func__);
return 0;
}
-tBTM_SEC_DEV_REC* btm_sec_find_dev_by_sec_state(uint8_t state) {
- inc_func_call_count(__func__);
- return nullptr;
-}
tBTM_SEC_SERV_REC* btm_sec_find_first_serv(bool is_originator, uint16_t psm) {
inc_func_call_count(__func__);
return nullptr;
diff --git a/system/test/mock/mock_stack_sdp_legacy_api.cc b/system/test/mock/mock_stack_sdp_legacy_api.cc
index f339a26..a41c690 100644
--- a/system/test/mock/mock_stack_sdp_legacy_api.cc
+++ b/system/test/mock/mock_stack_sdp_legacy_api.cc
@@ -1,4 +1,18 @@
-
+/*
+ * Copyright 2023 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 <cstdint>
diff --git a/system/test/mock/mock_stack_sdp_legacy_api.h b/system/test/mock/mock_stack_sdp_legacy_api.h
new file mode 100644
index 0000000..93d9077
--- /dev/null
+++ b/system/test/mock/mock_stack_sdp_legacy_api.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2023 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/sdp_api.h"
+
+namespace test {
+namespace mock {
+namespace stack_sdp_legacy {
+
+extern bluetooth::legacy::stack::sdp::tSdpApi api_;
+
+} // namespace stack_sdp_legacy
+} // namespace mock
+} // namespace test
diff --git a/system/test/mock/mock_stack_smp_act.cc b/system/test/mock/mock_stack_smp_act.cc
index 06badb8..198a2b9 100644
--- a/system/test/mock/mock_stack_smp_act.cc
+++ b/system/test/mock/mock_stack_smp_act.cc
@@ -124,7 +124,6 @@
struct smp_derive_link_key_from_long_term_key
smp_derive_link_key_from_long_term_key;
struct smp_br_process_link_key smp_br_process_link_key;
-struct smp_key_distribution_by_transport smp_key_distribution_by_transport;
struct smp_br_pairing_complete smp_br_pairing_complete;
} // namespace stack_smp_act
@@ -417,10 +416,6 @@
inc_func_call_count(__func__);
test::mock::stack_smp_act::smp_br_process_link_key(p_cb, p_data);
}
-void smp_key_distribution_by_transport(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
- inc_func_call_count(__func__);
- test::mock::stack_smp_act::smp_key_distribution_by_transport(p_cb, p_data);
-}
void smp_br_pairing_complete(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
inc_func_call_count(__func__);
test::mock::stack_smp_act::smp_br_pairing_complete(p_cb, p_data);
diff --git a/system/test/mock/mock_stack_smp_act.h b/system/test/mock/mock_stack_smp_act.h
index 5754f3b..c45fecb 100644
--- a/system/test/mock/mock_stack_smp_act.h
+++ b/system/test/mock/mock_stack_smp_act.h
@@ -679,16 +679,6 @@
void operator()(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { body(p_cb, p_data); };
};
extern struct smp_br_process_link_key smp_br_process_link_key;
-// Name: smp_key_distribution_by_transport
-// Params: tSMP_CB* p_cb, tSMP_INT_DATA* p_data
-// Returns: void
-struct smp_key_distribution_by_transport {
- std::function<void(tSMP_CB* p_cb, tSMP_INT_DATA* p_data)> body{
- [](tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {}};
- void operator()(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { body(p_cb, p_data); };
-};
-extern struct smp_key_distribution_by_transport
- smp_key_distribution_by_transport;
// Name: smp_br_pairing_complete
// Params: tSMP_CB* p_cb, tSMP_INT_DATA* p_data
// Returns: void
diff --git a/tools/rootcanal/Android.bp b/tools/rootcanal/Android.bp
index 2b4b168..0b5e9d4 100644
--- a/tools/rootcanal/Android.bp
+++ b/tools/rootcanal/Android.bp
@@ -323,6 +323,7 @@
srcs: [
"test/async_manager_unittest.cc",
"test/h4_parser_unittest.cc",
+ "test/pcap_filter_unittest.cc",
"test/posix_socket_unittest.cc",
],
header_libs: [
diff --git a/tools/rootcanal/include/hci/pcap_filter.h b/tools/rootcanal/include/hci/pcap_filter.h
index beac219..a6b3993 100644
--- a/tools/rootcanal/include/hci/pcap_filter.h
+++ b/tools/rootcanal/include/hci/pcap_filter.h
@@ -50,7 +50,6 @@
std::vector<uint8_t> FilterHciCommand(std::vector<uint8_t> const& packet);
std::vector<uint8_t> FilterHciEvent(std::vector<uint8_t> const& packet);
- private:
// Specific filters for HCI commands.
std::vector<uint8_t> FilterWriteLocalName(
bluetooth::hci::CommandView& command);
@@ -87,9 +86,8 @@
// Specific filter for any Gap data array.
// The Gap data entries are modified in place.
- void FilterGapData(std::vector<bluetooth::hci::GapData>& gap_data);
- void FilterLengthAndData(
- std::vector<bluetooth::hci::LengthAndData>& gap_data);
+ void FilterGapData(uint8_t* gap_data, size_t gap_data_len);
+ void FilterGapData(std::vector<uint8_t>& gap_data);
// Helpers to replace local names.
std::array<uint8_t, 248> ChangeDeviceName(
@@ -97,6 +95,7 @@
std::vector<uint8_t> ChangeDeviceName(
std::vector<uint8_t> const& device_name);
+ private:
// Map device names to anonymous replacements.
std::vector<std::pair<std::vector<uint8_t>, std::vector<uint8_t>>>
device_name_map{};
diff --git a/tools/rootcanal/lib/hci/pcap_filter.cc b/tools/rootcanal/lib/hci/pcap_filter.cc
index bab0d9d..b8edda8 100644
--- a/tools/rootcanal/lib/hci/pcap_filter.cc
+++ b/tools/rootcanal/lib/hci/pcap_filter.cc
@@ -168,41 +168,50 @@
}
// Replace device names in GAP entries.
-void PcapFilter::FilterGapData(std::vector<GapData>& gap_data) {
- for (GapData& entry : gap_data) {
- switch (entry.data_type_) {
- case GapDataType::COMPLETE_LOCAL_NAME:
- case GapDataType::SHORTENED_LOCAL_NAME:
- entry.data_ = ChangeDeviceName(entry.data_);
- break;
- default:
- break;
- }
- }
-}
+// TODO: extended advertising reports can be chunked across multiple
+// events, and a single GAP data entry can be segmented in two.
+// The filter should account for that and keep a state for partial
+// GAP entries.
+void PcapFilter::FilterGapData(uint8_t* gap_data, size_t gap_data_len) {
+ size_t offset = 0;
+ while ((offset + 2) <= gap_data_len) {
+ size_t length = gap_data[offset];
+ GapDataType data_type = static_cast<GapDataType>(gap_data[offset + 1]);
-void PcapFilter::FilterLengthAndData(
- std::vector<bluetooth::hci::LengthAndData>& gap_data) {
- for (LengthAndData& entry : gap_data) {
- if (entry.data_.empty()) {
+ // Truncated entry.
+ if ((offset + length + 1) > gap_data_len) {
+ break;
+ }
+
+ // Empty entry.
+ if (length == 0) {
+ offset += 1;
continue;
}
- switch (GapDataType(entry.data_[0])) {
+
+ // Apply the filter to entries that contain user data.
+ switch (data_type) {
case GapDataType::COMPLETE_LOCAL_NAME:
case GapDataType::SHORTENED_LOCAL_NAME: {
- std::vector<uint8_t> device_name(entry.data_.begin() + 1,
- entry.data_.end());
- device_name = ChangeDeviceName(device_name);
- entry.data_.insert(device_name.begin(), device_name.end(),
- entry.data_.begin() + 1);
+ auto start_pos = gap_data + offset + 1;
+ auto end_pos = gap_data + offset + length;
+ std::vector<uint8_t> new_name =
+ ChangeDeviceName(std::vector<uint8_t>{start_pos, end_pos});
+ std::copy(new_name.begin(), new_name.end(), start_pos);
break;
}
default:
break;
}
+
+ offset += length + 1;
}
}
+void PcapFilter::FilterGapData(std::vector<uint8_t>& gap_data) {
+ FilterGapData(gap_data.data(), gap_data.size());
+}
+
// Replace the local device name.
std::vector<uint8_t> PcapFilter::FilterWriteLocalName(CommandView& command) {
auto parameters = WriteLocalNameView::Create(command);
@@ -219,9 +228,10 @@
auto parameters = WriteExtendedInquiryResponseView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> extended_inquiry_response =
+ std::array<uint8_t, 240> extended_inquiry_response =
parameters.GetExtendedInquiryResponse();
- FilterGapData(extended_inquiry_response);
+ FilterGapData(extended_inquiry_response.data(),
+ extended_inquiry_response.size());
return WriteExtendedInquiryResponseBuilder::Create(
parameters.GetFecRequired(), extended_inquiry_response)
->SerializeToBytes();
@@ -233,7 +243,7 @@
auto parameters = LeSetAdvertisingDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeSetAdvertisingDataBuilder::Create(advertising_data)
->SerializeToBytes();
@@ -245,7 +255,7 @@
auto parameters = LeSetScanResponseDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeSetScanResponseDataBuilder::Create(advertising_data)
->SerializeToBytes();
@@ -257,7 +267,7 @@
auto parameters = LeSetExtendedAdvertisingDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeSetExtendedAdvertisingDataBuilder::Create(
parameters.GetAdvertisingHandle(), parameters.GetOperation(),
@@ -272,7 +282,7 @@
auto parameters = LeSetExtendedScanResponseDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetScanResponseData();
+ std::vector<uint8_t> advertising_data = parameters.GetScanResponseData();
FilterGapData(advertising_data);
return LeSetExtendedScanResponseDataBuilder::Create(
parameters.GetAdvertisingHandle(), parameters.GetOperation(),
@@ -287,7 +297,7 @@
auto parameters = LeSetPeriodicAdvertisingDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeSetPeriodicAdvertisingDataBuilder::Create(
parameters.GetAdvertisingHandle(), parameters.GetOperation(),
@@ -301,7 +311,7 @@
auto parameters = LeMultiAdvtSetDataView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeMultiAdvtSetDataBuilder::Create(advertising_data,
parameters.GetAdvertisingInstance())
@@ -314,7 +324,7 @@
auto parameters = LeMultiAdvtSetScanRespView::Create(command);
ASSERT(parameters.IsValid());
- std::vector<GapData> advertising_data = parameters.GetAdvertisingData();
+ std::vector<uint8_t> advertising_data = parameters.GetAdvertisingData();
FilterGapData(advertising_data);
return LeMultiAdvtSetScanRespBuilder::Create(
advertising_data, parameters.GetAdvertisingInstance())
@@ -345,10 +355,11 @@
ReadExtendedInquiryResponseCompleteView::Create(command_complete);
ASSERT(parameters.IsValid());
- std::vector<GapData> extended_inquiry_response =
+ std::array<uint8_t, 240> extended_inquiry_response =
parameters.GetExtendedInquiryResponse();
if (parameters.GetStatus() == ErrorCode::SUCCESS) {
- FilterGapData(extended_inquiry_response);
+ FilterGapData(extended_inquiry_response.data(),
+ extended_inquiry_response.size());
}
return ReadExtendedInquiryResponseCompleteBuilder::Create(
@@ -379,10 +390,10 @@
auto parameters = ExtendedInquiryResultView::Create(event);
ASSERT(parameters.IsValid());
- std::vector<GapData> extended_inquiry_response =
+ std::array<uint8_t, 240> extended_inquiry_response =
parameters.GetExtendedInquiryResponse();
- FilterGapData(extended_inquiry_response);
-
+ FilterGapData(extended_inquiry_response.data(),
+ extended_inquiry_response.size());
return ExtendedInquiryResultBuilder::Create(
parameters.GetAddress(), parameters.GetPageScanRepetitionMode(),
parameters.GetClassOfDevice(), parameters.GetClockOffset(),
@@ -398,7 +409,7 @@
std::vector<LeAdvertisingResponse> responses = parameters.GetResponses();
for (auto& response : responses) {
- FilterLengthAndData(response.advertising_data_);
+ FilterGapData(response.advertising_data_);
}
return LeAdvertisingReportBuilder::Create(responses)->SerializeToBytes();
@@ -414,7 +425,7 @@
std::vector<LeExtendedAdvertisingResponse> responses =
parameters.GetResponses();
for (auto& response : responses) {
- FilterLengthAndData(response.advertising_data_);
+ FilterGapData(response.advertising_data_);
}
return LeExtendedAdvertisingReportBuilder::Create(responses)
diff --git a/tools/rootcanal/model/controller/dual_mode_controller.cc b/tools/rootcanal/model/controller/dual_mode_controller.cc
index 57585c7..0ec16da 100644
--- a/tools/rootcanal/model/controller/dual_mode_controller.cc
+++ b/tools/rootcanal/model/controller/dual_mode_controller.cc
@@ -1546,13 +1546,14 @@
auto command_view =
bluetooth::hci::LeReadLocalSupportedFeaturesView::Create(command);
ASSERT(command_view.IsValid());
+ uint64_t le_features = link_layer_controller_.GetLeSupportedFeatures();
LOG_INFO("%s | LeReadLocalSupportedFeatures (%016llx)",
GetAddress().ToString().c_str(),
- static_cast<unsigned long long>(properties_.le_features));
+ static_cast<unsigned long long>(le_features));
send_event_(
bluetooth::hci::LeReadLocalSupportedFeaturesCompleteBuilder::Create(
- kNumCommandPackets, ErrorCode::SUCCESS, properties_.le_features));
+ kNumCommandPackets, ErrorCode::SUCCESS, le_features));
}
void DualModeController::LeSetRandomAddress(CommandView command) {
@@ -1592,8 +1593,7 @@
}
void DualModeController::LeSetAdvertisingData(CommandView command) {
- auto command_view =
- bluetooth::hci::LeSetAdvertisingDataRawView::Create(command);
+ auto command_view = bluetooth::hci::LeSetAdvertisingDataView::Create(command);
ASSERT(command_view.IsValid());
ErrorCode status = link_layer_controller_.LeSetAdvertisingData(
command_view.GetAdvertisingData());
@@ -1603,7 +1603,7 @@
void DualModeController::LeSetScanResponseData(CommandView command) {
auto command_view =
- bluetooth::hci::LeSetScanResponseDataRawView::Create(command);
+ bluetooth::hci::LeSetScanResponseDataView::Create(command);
ASSERT(command_view.IsValid());
ErrorCode status = link_layer_controller_.LeSetScanResponseData(
command_view.GetAdvertisingData());
@@ -1945,7 +1945,7 @@
void DualModeController::LeSetPeriodicAdvertisingData(CommandView command) {
auto command_view =
- bluetooth::hci::LeSetPeriodicAdvertisingDataRawView::Create(command);
+ bluetooth::hci::LeSetPeriodicAdvertisingDataView::Create(command);
ASSERT(command_view.IsValid());
ErrorCode status = link_layer_controller_.LeSetPeriodicAdvertisingData(
command_view.GetAdvertisingHandle(), command_view.GetOperation(),
@@ -2558,7 +2558,7 @@
bluetooth::hci::LeSetExtendedAdvertisingDataView::Create(command);
ASSERT(command_view.IsValid());
auto raw_command_view =
- bluetooth::hci::LeSetExtendedAdvertisingDataRawView::Create(command);
+ bluetooth::hci::LeSetExtendedAdvertisingDataView::Create(command);
ASSERT(raw_command_view.IsValid());
ErrorCode status = link_layer_controller_.LeSetExtendedAdvertisingData(
command_view.GetAdvertisingHandle(), command_view.GetOperation(),
@@ -2574,7 +2574,7 @@
bluetooth::hci::LeSetExtendedScanResponseDataView::Create(command);
ASSERT(command_view.IsValid());
auto raw_command_view =
- bluetooth::hci::LeSetExtendedScanResponseDataRawView::Create(command);
+ bluetooth::hci::LeSetExtendedScanResponseDataView::Create(command);
ASSERT(raw_command_view.IsValid());
ErrorCode status = link_layer_controller_.LeSetExtendedScanResponseData(
command_view.GetAdvertisingHandle(), command_view.GetOperation(),
diff --git a/tools/rootcanal/model/controller/link_layer_controller.cc b/tools/rootcanal/model/controller/link_layer_controller.cc
index df1d4dc..6fc81c8 100644
--- a/tools/rootcanal/model/controller/link_layer_controller.cc
+++ b/tools/rootcanal/model/controller/link_layer_controller.cc
@@ -2691,7 +2691,6 @@
static_cast<uint8_t>(GetPageScanRepetitionMode()),
class_of_device_, GetClockOffset(), rssi,
extended_inquiry_response_));
-
} break;
default:
LOG_WARN("Unhandled Incoming Inquiry of type %d",
@@ -2759,13 +2758,13 @@
basic_inquiry_response);
ASSERT(inquiry_response.IsValid());
- send_event_(bluetooth::hci::ExtendedInquiryResultRawBuilder::Create(
+ send_event_(bluetooth::hci::ExtendedInquiryResultBuilder::Create(
inquiry_response.GetSourceAddress(),
static_cast<bluetooth::hci::PageScanRepetitionMode>(
inquiry_response.GetPageScanRepetitionMode()),
inquiry_response.GetClassOfDevice(),
inquiry_response.GetClockOffset(), inquiry_response.GetRssi(),
- extended_inquiry_response_));
+ inquiry_response.GetExtendedInquiryResponse()));
} break;
default:
LOG_WARN("Unhandled Incoming Inquiry Response of type %d",
@@ -3181,7 +3180,7 @@
if (LegacyAdvertising() && should_send_advertising_report &&
!should_send_directed_advertising_report &&
IsLeEventUnmasked(SubeventCode::ADVERTISING_REPORT)) {
- bluetooth::hci::LeAdvertisingResponseRaw response;
+ bluetooth::hci::LeAdvertisingResponse response;
response.address_type_ = resolved_advertising_address.GetAddressType();
response.address_ = resolved_advertising_address.GetAddress();
response.advertising_data_ = advertising_data;
@@ -3205,14 +3204,13 @@
break;
}
- send_event_(
- bluetooth::hci::LeAdvertisingReportRawBuilder::Create({response}));
+ send_event_(bluetooth::hci::LeAdvertisingReportBuilder::Create({response}));
}
// Extended scanning.
if (ExtendedAdvertising() && should_send_advertising_report &&
IsLeEventUnmasked(SubeventCode::EXTENDED_ADVERTISING_REPORT)) {
- bluetooth::hci::LeExtendedAdvertisingResponseRaw response;
+ bluetooth::hci::LeExtendedAdvertisingResponse response;
response.connectable_ = connectable_advertising;
response.scannable_ = scannable_advertising;
response.directed_ = directed_advertising;
@@ -3241,8 +3239,8 @@
}
response.advertising_data_ = advertising_data;
- send_event_(bluetooth::hci::LeExtendedAdvertisingReportRawBuilder::Create(
- {response}));
+ send_event_(
+ bluetooth::hci::LeExtendedAdvertisingReportBuilder::Create({response}));
}
// Did the user enable Active scanning ?
@@ -3635,7 +3633,7 @@
if (should_send_advertising_report &&
IsLeEventUnmasked(SubeventCode::EXTENDED_ADVERTISING_REPORT)) {
- bluetooth::hci::LeExtendedAdvertisingResponseRaw response;
+ bluetooth::hci::LeExtendedAdvertisingResponse response;
response.connectable_ = connectable_advertising;
response.scannable_ = scannable_advertising;
response.directed_ = directed_advertising;
@@ -3680,7 +3678,7 @@
std::vector(advertising_data.begin() + offset,
advertising_data.begin() + offset + fragment_size);
offset += fragment_size;
- send_event_(bluetooth::hci::LeExtendedAdvertisingReportRawBuilder::Create(
+ send_event_(bluetooth::hci::LeExtendedAdvertisingReportBuilder::Create(
{response}));
} while (offset < advertising_data.size());
}
@@ -5039,19 +5037,18 @@
if (LegacyAdvertising() && should_send_advertising_report &&
IsLeEventUnmasked(SubeventCode::ADVERTISING_REPORT)) {
- bluetooth::hci::LeAdvertisingResponseRaw response;
+ bluetooth::hci::LeAdvertisingResponse response;
response.event_type_ = bluetooth::hci::AdvertisingEventType::SCAN_RESPONSE;
response.address_ = resolved_advertising_address.GetAddress();
response.address_type_ = resolved_advertising_address.GetAddressType();
response.advertising_data_ = scan_response.GetScanResponseData();
response.rssi_ = rssi;
- send_event_(
- bluetooth::hci::LeAdvertisingReportRawBuilder::Create({response}));
+ send_event_(bluetooth::hci::LeAdvertisingReportBuilder::Create({response}));
}
if (ExtendedAdvertising() && should_send_advertising_report &&
IsLeEventUnmasked(SubeventCode::EXTENDED_ADVERTISING_REPORT)) {
- bluetooth::hci::LeExtendedAdvertisingResponseRaw response;
+ bluetooth::hci::LeExtendedAdvertisingResponse response;
response.address_ = resolved_advertising_address.GetAddress();
response.address_type_ =
static_cast<bluetooth::hci::DirectAdvertisingAddressType>(
@@ -5065,8 +5062,8 @@
response.tx_power_ = 0x7F;
response.advertising_data_ = scan_response.GetScanResponseData();
response.rssi_ = rssi;
- send_event_(bluetooth::hci::LeExtendedAdvertisingReportRawBuilder::Create(
- {response}));
+ send_event_(
+ bluetooth::hci::LeExtendedAdvertisingReportBuilder::Create({response}));
}
}
diff --git a/tools/rootcanal/packets/hci/hci_packets.pdl b/tools/rootcanal/packets/hci/hci_packets.pdl
index 2eb4e5e..63d5bb9 100644
--- a/tools/rootcanal/packets/hci/hci_packets.pdl
+++ b/tools/rootcanal/packets/hci/hci_packets.pdl
@@ -8,66 +8,6 @@
ENABLED = 0x01,
}
-// https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
-enum GapDataType : 8 {
- INVALID = 0x00,
- FLAGS = 0x01,
- INCOMPLETE_LIST_16_BIT_UUIDS = 0x02,
- COMPLETE_LIST_16_BIT_UUIDS = 0x03,
- INCOMPLETE_LIST_32_BIT_UUIDS = 0x04,
- COMPLETE_LIST_32_BIT_UUIDS = 0x05,
- INCOMPLETE_LIST_128_BIT_UUIDS = 0x06,
- COMPLETE_LIST_128_BIT_UUIDS = 0x07,
- SHORTENED_LOCAL_NAME = 0x08,
- COMPLETE_LOCAL_NAME = 0x09,
- TX_POWER_LEVEL = 0x0A,
- CLASS_OF_DEVICE = 0x0D,
- SIMPLE_PAIRING_HASH_C = 0x0E,
- SIMPLE_PAIRING_RANDOMIZER_R = 0x0F,
- DEVICE_ID = 0x10,
- SECURITY_MANAGER_OOB_FLAGS = 0x11,
- SLAVE_CONNECTION_INTERVAL_RANGE = 0x12,
- LIST_16BIT_SERVICE_SOLICITATION_UUIDS = 0x14,
- LIST_128BIT_SERVICE_SOLICITATION_UUIDS = 0x15,
- SERVICE_DATA_16_BIT_UUIDS = 0x16,
- PUBLIC_TARGET_ADDRESS = 0x17,
- RANDOM_TARGET_ADDRESS = 0x18,
- APPEARANCE = 0x19,
- ADVERTISING_INTERVAL = 0x1A,
- LE_BLUETOOTH_DEVICE_ADDRESS = 0x1B,
- LE_ROLE = 0x1C,
- SIMPLE_PAIRING_HASH_C_256 = 0x1D,
- SIMPLE_PAIRING_RANDOMIZER_R_256 = 0x1E,
- LIST_32BIT_SERVICE_SOLICITATION_UUIDS = 0x1F,
- SERVICE_DATA_32_BIT_UUIDS = 0x20,
- SERVICE_DATA_128_BIT_UUIDS = 0x21,
- LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE = 0x22,
- LE_SECURE_CONNECTIONS_RANDOM_VALUE = 0x23,
- URI = 0x24,
- INDOOR_POSITIONING = 0x25,
- TRANSPORT_DISCOVERY_DATA = 0x26,
- LE_SUPPORTED_FEATURES = 0x27,
- CHANNEL_MAP_UPDATE_INDICATION = 0x28,
- MESH_PB_ADV = 0x29,
- MESH_MESSAGE = 0x2A,
- MESH_BEACON = 0x2B,
- BIG_INFO = 0x2C,
- BROADCAST_CODE = 0x2D,
- THREE_D_INFORMATION_DATA = 0x3D,
- MANUFACTURER_SPECIFIC_DATA = 0xFF,
-}
-
-struct LengthAndData {
- _size_(data) : 8,
- data: 8[],
-}
-
-struct GapData {
- _size_(data) : 8, // Including one byte for data_type
- data_type : GapDataType,
- data : 8[+1],
-}
-
// HCI ACL Packets
enum PacketBoundaryFlag : 2 {
@@ -2426,13 +2366,12 @@
packet ReadExtendedInquiryResponseComplete : CommandComplete (command_op_code = READ_EXTENDED_INQUIRY_RESPONSE) {
status : ErrorCode,
fec_required : FecRequired,
- extended_inquiry_response : GapData[],
+ extended_inquiry_response : 8[240],
}
packet WriteExtendedInquiryResponse : Command (op_code = WRITE_EXTENDED_INQUIRY_RESPONSE) {
fec_required : FecRequired,
- extended_inquiry_response : GapData[],
- _padding_[240], // Zero padding GapData[] to be 240 octets
+ extended_inquiry_response : 8[240],
}
packet WriteExtendedInquiryResponseComplete : CommandComplete (command_op_code = WRITE_EXTENDED_INQUIRY_RESPONSE) {
@@ -3246,12 +3185,6 @@
packet LeSetAdvertisingData : Command (op_code = LE_SET_ADVERTISING_DATA) {
_size_(advertising_data) : 8,
- advertising_data : GapData[],
- _padding_[31], // Zero padding to 31 bytes of advertising_data
-}
-
-packet LeSetAdvertisingDataRaw : Command (op_code = LE_SET_ADVERTISING_DATA) {
- _size_(advertising_data) : 8,
advertising_data : 8[],
_padding_[31], // Zero padding to 31 bytes of advertising_data
}
@@ -3262,12 +3195,6 @@
packet LeSetScanResponseData : Command (op_code = LE_SET_SCAN_RESPONSE_DATA) {
_size_(advertising_data) : 8,
- advertising_data : GapData[],
- _padding_[31], // Zero padding to 31 bytes of advertising_data
-}
-
-packet LeSetScanResponseDataRaw : Command (op_code = LE_SET_SCAN_RESPONSE_DATA) {
- _size_(advertising_data) : 8,
advertising_data : 8[],
_padding_[31], // Zero padding to 31 bytes of advertising_data
}
@@ -3897,23 +3824,13 @@
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(advertising_data) : 8,
- advertising_data : GapData[],
+ advertising_data : 8[],
}
test LeSetExtendedAdvertisingData {
"\x37\x20\x12\x00\x03\x01\x0e\x02\x01\x02\x0a\x09\x50\x69\x78\x65\x6c\x20\x33\x20\x58",
}
-packet LeSetExtendedAdvertisingDataRaw : Command (op_code = LE_SET_EXTENDED_ADVERTISING_DATA) {
- advertising_handle : 8,
- operation : Operation,
- _reserved_ : 5,
- fragment_preference : FragmentPreference,
- _reserved_ : 7,
- _size_(advertising_data) : 8,
- advertising_data : 8[],
-}
-
packet LeSetExtendedAdvertisingDataComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_DATA) {
status : ErrorCode,
}
@@ -3929,16 +3846,6 @@
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(scan_response_data) : 8,
- scan_response_data : GapData[],
-}
-
-packet LeSetExtendedScanResponseDataRaw : Command (op_code = LE_SET_EXTENDED_SCAN_RESPONSE_DATA) {
- advertising_handle : 8,
- operation : Operation,
- _reserved_ : 5,
- fragment_preference : FragmentPreference,
- _reserved_ : 7,
- _size_(scan_response_data) : 8,
scan_response_data : 8[],
}
@@ -4048,14 +3955,6 @@
operation : Operation,
_reserved_ : 5,
_size_(advertising_data) : 8,
- advertising_data : GapData[],
-}
-
-packet LeSetPeriodicAdvertisingDataRaw : Command (op_code = LE_SET_PERIODIC_ADVERTISING_DATA) {
- advertising_handle : 8,
- operation : Operation,
- _reserved_ : 5,
- _size_(advertising_data) : 8,
advertising_data : 8[],
}
@@ -4856,7 +4755,7 @@
packet LeMultiAdvtSetData : LeMultiAdvt (sub_cmd = SET_DATA) {
_size_(advertising_data) : 8,
- advertising_data : GapData[],
+ advertising_data : 8[],
_padding_[31], // Zero padding to 31 bytes of advertising_data
advertising_instance : 8,
}
@@ -4866,7 +4765,7 @@
packet LeMultiAdvtSetScanResp : LeMultiAdvt (sub_cmd = SET_SCAN_RESP) {
_size_(advertising_data) : 8,
- advertising_data : GapData[],
+ advertising_data : 8[],
_padding_[31], // Zero padding to 31 bytes of advertising_data
advertising_instance : 8,
}
@@ -5603,29 +5502,12 @@
clock_offset : 15,
_reserved_ : 1,
rssi : 8,
- extended_inquiry_response : GapData[],
- // Extended inquiry Result is always 255 bytes long
- // padded GapData with zeroes as necessary
- // Refer to BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part C Section 8 on page 1340
- _padding_[240],
-}
-
-packet ExtendedInquiryResultRaw : Event (event_code = EXTENDED_INQUIRY_RESULT) {
- _fixed_ = 0x01 : 8,
- address : Address,
- page_scan_repetition_mode : PageScanRepetitionMode,
- _reserved_ : 8,
- class_of_device : ClassOfDevice,
- clock_offset : 15,
- _reserved_ : 1,
- rssi : 8,
- // Extended inquiry Result is always 255 bytes long
- // padded GapData with zeroes as necessary
+ // Extended inquiry Result is always 255 bytes long;
+ // the gap data is padded with zeros as necessary.
// Refer to BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part C Section 8 on page 1340
extended_inquiry_response : 8[240],
}
-
packet EncryptionKeyRefreshComplete : Event (event_code = ENCRYPTION_KEY_REFRESH_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
@@ -5747,7 +5629,7 @@
address_type : AddressType,
address : Address,
_size_(advertising_data) : 8,
- advertising_data : LengthAndData[],
+ advertising_data : 8[],
rssi : 8,
}
@@ -5756,20 +5638,6 @@
responses : LeAdvertisingResponse[],
}
-struct LeAdvertisingResponseRaw {
- event_type : AdvertisingEventType,
- address_type : AddressType,
- address : Address,
- _size_(advertising_data) : 8,
- advertising_data : 8[],
- rssi : 8,
-}
-
-packet LeAdvertisingReportRaw : LeMetaEvent (subevent_code = ADVERTISING_REPORT) {
- _count_(responses) : 8,
- responses : LeAdvertisingResponseRaw[],
-}
-
packet LeConnectionUpdateComplete : LeMetaEvent (subevent_code = CONNECTION_UPDATE_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
@@ -5901,36 +5769,9 @@
direct_address_type : DirectAdvertisingAddressType,
direct_address : Address,
_size_(advertising_data) : 8,
- advertising_data: LengthAndData[],
-}
-
-struct LeExtendedAdvertisingResponseRaw {
- connectable : 1,
- scannable : 1,
- directed : 1,
- scan_response : 1,
- legacy : 1,
- data_status : DataStatus,
- _reserved_ : 9,
- address_type : DirectAdvertisingAddressType,
- address : Address,
- primary_phy : PrimaryPhyType,
- secondary_phy : SecondaryPhyType,
- advertising_sid : 8, // SID subfield in the ADI field
- tx_power : 8,
- rssi : 8, // -127 to +20 (0x7F means not available)
- periodic_advertising_interval : 16, // 0x006 to 0xFFFF (7.5 ms to 82s)
- direct_address_type : DirectAdvertisingAddressType,
- direct_address : Address,
- _size_(advertising_data) : 8,
advertising_data: 8[],
}
-packet LeExtendedAdvertisingReportRaw : LeMetaEvent (subevent_code = EXTENDED_ADVERTISING_REPORT) {
- _count_(responses) : 8,
- responses : LeExtendedAdvertisingResponseRaw[],
-}
-
packet LeExtendedAdvertisingReport : LeMetaEvent (subevent_code = EXTENDED_ADVERTISING_REPORT) {
_count_(responses) : 8,
responses : LeExtendedAdvertisingResponse[],
@@ -6544,3 +6385,52 @@
"\x02\x01\x00\x01\x02\x03\x04\x05\x10\x00",
"\x02\x02\xf0\xf1\xf2\xf3\xf4\xf5\xaa\x02",
}
+
+// https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
+enum GapDataType : 8 {
+ INVALID = 0x00,
+ FLAGS = 0x01,
+ INCOMPLETE_LIST_16_BIT_UUIDS = 0x02,
+ COMPLETE_LIST_16_BIT_UUIDS = 0x03,
+ INCOMPLETE_LIST_32_BIT_UUIDS = 0x04,
+ COMPLETE_LIST_32_BIT_UUIDS = 0x05,
+ INCOMPLETE_LIST_128_BIT_UUIDS = 0x06,
+ COMPLETE_LIST_128_BIT_UUIDS = 0x07,
+ SHORTENED_LOCAL_NAME = 0x08,
+ COMPLETE_LOCAL_NAME = 0x09,
+ TX_POWER_LEVEL = 0x0A,
+ CLASS_OF_DEVICE = 0x0D,
+ SIMPLE_PAIRING_HASH_C = 0x0E,
+ SIMPLE_PAIRING_RANDOMIZER_R = 0x0F,
+ DEVICE_ID = 0x10,
+ SECURITY_MANAGER_OOB_FLAGS = 0x11,
+ SLAVE_CONNECTION_INTERVAL_RANGE = 0x12,
+ LIST_16BIT_SERVICE_SOLICITATION_UUIDS = 0x14,
+ LIST_128BIT_SERVICE_SOLICITATION_UUIDS = 0x15,
+ SERVICE_DATA_16_BIT_UUIDS = 0x16,
+ PUBLIC_TARGET_ADDRESS = 0x17,
+ RANDOM_TARGET_ADDRESS = 0x18,
+ APPEARANCE = 0x19,
+ ADVERTISING_INTERVAL = 0x1A,
+ LE_BLUETOOTH_DEVICE_ADDRESS = 0x1B,
+ LE_ROLE = 0x1C,
+ SIMPLE_PAIRING_HASH_C_256 = 0x1D,
+ SIMPLE_PAIRING_RANDOMIZER_R_256 = 0x1E,
+ LIST_32BIT_SERVICE_SOLICITATION_UUIDS = 0x1F,
+ SERVICE_DATA_32_BIT_UUIDS = 0x20,
+ SERVICE_DATA_128_BIT_UUIDS = 0x21,
+ LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE = 0x22,
+ LE_SECURE_CONNECTIONS_RANDOM_VALUE = 0x23,
+ URI = 0x24,
+ INDOOR_POSITIONING = 0x25,
+ TRANSPORT_DISCOVERY_DATA = 0x26,
+ LE_SUPPORTED_FEATURES = 0x27,
+ CHANNEL_MAP_UPDATE_INDICATION = 0x28,
+ MESH_PB_ADV = 0x29,
+ MESH_MESSAGE = 0x2A,
+ MESH_BEACON = 0x2B,
+ BIG_INFO = 0x2C,
+ BROADCAST_CODE = 0x2D,
+ THREE_D_INFORMATION_DATA = 0x3D,
+ MANUFACTURER_SPECIFIC_DATA = 0xFF,
+}
diff --git a/tools/rootcanal/test/pcap_filter_unittest.cc b/tools/rootcanal/test/pcap_filter_unittest.cc
new file mode 100644
index 0000000..8803540
--- /dev/null
+++ b/tools/rootcanal/test/pcap_filter_unittest.cc
@@ -0,0 +1,94 @@
+/*
+ * 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 "hci/pcap_filter.h"
+
+#include <gtest/gtest.h>
+
+#include "hci/hci_packets.h"
+
+namespace rootcanal {
+
+using namespace bluetooth::hci;
+
+class PcapFilterTest : public ::testing::Test {
+ public:
+ PcapFilterTest() = default;
+ ~PcapFilterTest() override = default;
+
+ protected:
+ PcapFilter pcap_filter_;
+};
+
+TEST_F(PcapFilterTest, UnchangedIfNotDeviceName) {
+ // Leaves gap data entries that do not contain a name unchanged.
+ std::vector<uint8_t> input_gap_data{
+ 0x2, static_cast<uint8_t>(GapDataType::FLAGS), 0x0};
+ std::vector<uint8_t> output_gap_data{input_gap_data.begin(),
+ input_gap_data.end()};
+ pcap_filter_.FilterGapData(output_gap_data);
+ ASSERT_EQ(input_gap_data, output_gap_data);
+}
+
+TEST_F(PcapFilterTest, ReplacesShortenedDeviceName) {
+ // Replaces the input gap data once, with a name of equal length.
+ std::vector<uint8_t> input_gap_data{
+ 0x2,
+ static_cast<uint8_t>(GapDataType::FLAGS),
+ 0x0,
+ 0x4,
+ static_cast<uint8_t>(GapDataType::SHORTENED_LOCAL_NAME),
+ 0xa,
+ 0xb,
+ 0xc};
+ std::vector<uint8_t> output_gap_data_1{input_gap_data.begin(),
+ input_gap_data.end()};
+ pcap_filter_.FilterGapData(output_gap_data_1);
+ ASSERT_EQ(input_gap_data.size(), output_gap_data_1.size());
+ ASSERT_NE(input_gap_data, output_gap_data_1);
+
+ // Replaces the input gap data a second time with the same name.
+ std::vector<uint8_t> output_gap_data_2{input_gap_data.begin(),
+ input_gap_data.end()};
+ pcap_filter_.FilterGapData(output_gap_data_2);
+ ASSERT_EQ(output_gap_data_1, output_gap_data_2);
+}
+
+TEST_F(PcapFilterTest, ReplacesCompleteDeviceName) {
+ // Replaces the input gap data once, with a name of equal length.
+ std::vector<uint8_t> input_gap_data{
+ 0x2,
+ static_cast<uint8_t>(GapDataType::FLAGS),
+ 0x0,
+ 0x4,
+ static_cast<uint8_t>(GapDataType::COMPLETE_LOCAL_NAME),
+ 0xa,
+ 0xb,
+ 0xc};
+ std::vector<uint8_t> output_gap_data_1{input_gap_data.begin(),
+ input_gap_data.end()};
+ pcap_filter_.FilterGapData(output_gap_data_1);
+ ASSERT_EQ(input_gap_data.size(), output_gap_data_1.size());
+ ASSERT_NE(input_gap_data, output_gap_data_1);
+
+ // Replaces the input gap data a second time with the same name.
+ std::vector<uint8_t> output_gap_data_2{input_gap_data.begin(),
+ input_gap_data.end()};
+ pcap_filter_.FilterGapData(output_gap_data_2);
+ ASSERT_EQ(output_gap_data_1, output_gap_data_2);
+}
+
+} // namespace rootcanal