summaryrefslogtreecommitdiff
path: root/pandora
diff options
context:
space:
mode:
author Pomai Ahlo <poahlo@google.com> 2024-09-20 16:00:04 -0700
committer Pomai Ahlo <poahlo@google.com> 2024-11-08 14:51:22 -0800
commitda5f3ac058753fc91016b754ca58591d71d981d1 (patch)
tree4ac2f86d4aa551de0b16fc34655e2a62e7480795 /pandora
parent442e029becf3dcd77b8de87fe087da2e2d42920c (diff)
RfcommTest: ConnectToServer and Disconnect
Enable server side Rfcomm BumbleBluetooth tests by adding ConnectToServer and Disconnect functions in rfcomm.py Bug: 331415222 Test: atest RfcommTest#serverSecureConnectThenRemoteDisconnect Test: atest RfcommTest#serverSecureConnectThenLocalDisconnect Flag: TEST_ONLY Change-Id: Ib678c17dbfb3ce7d4e2e471853c058bc1071585a
Diffstat (limited to 'pandora')
-rw-r--r--pandora/server/bumble_experimental/rfcomm.py45
1 files changed, 42 insertions, 3 deletions
diff --git a/pandora/server/bumble_experimental/rfcomm.py b/pandora/server/bumble_experimental/rfcomm.py
index aa59566cf9..2f7c05ed4c 100644
--- a/pandora/server/bumble_experimental/rfcomm.py
+++ b/pandora/server/bumble_experimental/rfcomm.py
@@ -17,10 +17,13 @@ from typing import Dict, Optional
from bumble import core
from bumble.device import Device
+from bumble.hci import Address
from bumble.rfcomm import (
- Server,
- make_service_sdp_records,
+ Client,
DLC,
+ make_service_sdp_records,
+ find_rfcomm_channel_with_uuid,
+ Server,
)
from bumble.pandora import utils
import grpc
@@ -30,6 +33,8 @@ from pandora_experimental.rfcomm_pb2 import (
AcceptConnectionResponse,
ConnectionRequest,
ConnectionResponse,
+ DisconnectionRequest,
+ DisconnectionResponse,
RfcommConnection,
RxRequest,
RxResponse,
@@ -59,9 +64,12 @@ class RFCOMMService(RFCOMMServicer):
class Connection:
- def __init__(self, dlc):
+ client: Optional[Client]
+
+ def __init__(self, dlc, client=None):
self.dlc = dlc
self.data_queue = asyncio.Queue()
+ self.client = client
class ServerPort:
@@ -84,6 +92,27 @@ class RFCOMMService(RFCOMMServicer):
self.saved_dlc = dlc
@utils.rpc
+ async def ConnectToServer(self, request: ConnectionRequest, context: grpc.ServicerContext) -> ConnectionResponse:
+ logging.info(f"ConnectToServer")
+ address = Address(address=bytes(reversed(request.address)), address_type=Address.PUBLIC_DEVICE_ADDRESS)
+ acl_connection = self.device.find_connection_by_bd_addr(address, transport=0) # BR/EDR
+ if acl_connection is None:
+ acl_connection = await self.device.connect(address, transport=0) # BR/EDR transport
+
+ channel = await find_rfcomm_channel_with_uuid(acl_connection, request.uuid)
+
+ client = Client(acl_connection)
+ mux = await client.start()
+ assert mux is not None
+
+ dlc = await mux.open_dlc(channel)
+ id = self.next_conn_id
+ self.next_conn_id += 1
+ self.connections[id] = self.Connection(dlc=dlc, client=client)
+ self.connections[id].dlc.sink = self.connections[id].data_queue.put_nowait
+ return ConnectionResponse(connection=RfcommConnection(id=id))
+
+ @utils.rpc
async def StartServer(self, request: StartServerRequest, context: grpc.ServicerContext) -> StartServerResponse:
uuid = core.UUID(request.uuid)
logging.info(f"StartServer {uuid}")
@@ -119,6 +148,16 @@ class RFCOMMService(RFCOMMServicer):
return AcceptConnectionResponse(connection=RfcommConnection(id=id))
@utils.rpc
+ async def Disconnect(self, request: DisconnectionRequest, context: grpc.ServicerContext) -> DisconnectionResponse:
+ logging.info(f"Disconnect")
+ rfcomm_connection = self.connections[request.connection.id]
+ assert rfcomm_connection is not None
+ if rfcomm_connection.client is not None:
+ await rfcomm_connection.client.shutdown()
+ del rfcomm_connection
+ return DisconnectionResponse()
+
+ @utils.rpc
async def StopServer(self, request: StopServerRequest, context: grpc.ServicerContext) -> StopServerResponse:
logging.info(f"StopServer")
assert self.server_ports[request.server.id] is not None