diff options
author | Gilles Boccon-Gibod <bok@bok.net> | 2023-09-15 12:00:02 -0700 |
---|---|---|
committer | Gilles Boccon-Gibod <bok@bok.net> | 2023-09-27 21:37:36 -0700 |
commit | 406a932467d94918565a090e3f6f42d956a9f062 (patch) | |
tree | 7c8dd0167e2f326037d06c9835db7fa6364a05a6 | |
parent | c6cdca892325f22e25941cbeae1ee8c15869d9ad (diff) | |
download | bumble-406a932467d94918565a090e3f6f42d956a9f062.tar.gz |
make grpc channels injectable
-rw-r--r-- | .vscode/settings.json | 2 | ||||
-rw-r--r-- | bumble/transport/android_netsim.py | 64 |
2 files changed, 43 insertions, 23 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json index 864fe69..57e682a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,10 +39,12 @@ "libusb", "MITM", "NDIS", + "netsim", "NONBLOCK", "NONCONN", "OXIMETER", "popleft", + "protobuf", "psms", "pyee", "pyusb", diff --git a/bumble/transport/android_netsim.py b/bumble/transport/android_netsim.py index 3011509..c71fa3e 100644 --- a/bumble/transport/android_netsim.py +++ b/bumble/transport/android_netsim.py @@ -18,12 +18,13 @@ import asyncio import atexit import logging -import grpc.aio import os import pathlib import sys from typing import Dict, Optional +import grpc.aio + from .common import ( ParserSource, PumpedTransport, @@ -33,8 +34,8 @@ from .common import ( ) # pylint: disable=no-name-in-module -from .grpc_protobuf.packet_streamer_pb2_grpc import PacketStreamerStub from .grpc_protobuf.packet_streamer_pb2_grpc import ( + PacketStreamerStub, PacketStreamerServicer, add_PacketStreamerServicer_to_server, ) @@ -43,6 +44,7 @@ from .grpc_protobuf.hci_packet_pb2 import HCIPacket from .grpc_protobuf.startup_pb2 import Chip, ChipInfo from .grpc_protobuf.common_pb2 import ChipKind + # ----------------------------------------------------------------------------- # Logging # ----------------------------------------------------------------------------- @@ -273,8 +275,36 @@ async def open_android_netsim_controller_transport( # ----------------------------------------------------------------------------- -async def open_android_netsim_host_transport( - server_host: Optional[str], server_port: int, options: Dict[str, str] +async def open_android_netsim_host_transport_with_address( + server_host: Optional[str], + server_port: int, + options: Optional[Dict[str, str]] = None, +): + if server_host == '_' or not server_host: + server_host = 'localhost' + + if not server_port: + # Look for the gRPC config in a .ini file + instance_number = int(options.get('instance', "0")) + server_host = 'localhost' + server_port = find_grpc_port(instance_number) + if not server_port: + raise RuntimeError('gRPC server port not found') + + # Connect to the gRPC server + server_address = f'{server_host}:{server_port}' + logger.debug(f'Connecting to gRPC server at {server_address}') + channel = grpc.aio.insecure_channel(server_address) + + return await open_android_netsim_host_transport_with_channel( + channel, + options, + ) + + +# ----------------------------------------------------------------------------- +async def open_android_netsim_host_transport_with_channel( + channel, options: Optional[Dict[str, str]] = None ): # Wrapper for I/O operations class HciDevice: @@ -294,10 +324,12 @@ async def open_android_netsim_host_transport( async def read(self): response = await self.hci_device.read() response_type = response.WhichOneof('response_type') + if response_type == 'error': logger.warning(f'received error: {response.error}') raise RuntimeError(response.error) - elif response_type == 'hci_packet': + + if response_type == 'hci_packet': return ( bytes([response.hci_packet.packet_type]) + response.hci_packet.packet @@ -312,24 +344,8 @@ async def open_android_netsim_host_transport( ) ) - name = options.get('name', DEFAULT_NAME) + name = DEFAULT_NAME if options is None else options.get('name', DEFAULT_NAME) manufacturer = DEFAULT_MANUFACTURER - instance_number = int(options.get('instance', "0")) - - if server_host == '_' or not server_host: - server_host = 'localhost' - - if not server_port: - # Look for the gRPC config in a .ini file - server_host = 'localhost' - server_port = find_grpc_port(instance_number) - if not server_port: - raise RuntimeError('gRPC server port not found') - - # Connect to the gRPC server - server_address = f'{server_host}:{server_port}' - logger.debug(f'Connecting to gRPC server at {server_address}') - channel = grpc.aio.insecure_channel(server_address) # Connect as a host service = PacketStreamerStub(channel) @@ -420,7 +436,9 @@ async def open_android_netsim_transport(spec: Optional[str]) -> Transport: mode = options.get('mode', 'host') if mode == 'host': - return await open_android_netsim_host_transport(host, port, options) + return await open_android_netsim_host_transport_with_address( + host, port, options + ) if mode == 'controller': if host is None: raise ValueError('<host>:<port> missing') |