aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilles Boccon-Gibod <bok@bok.net>2023-09-15 12:00:02 -0700
committerGilles Boccon-Gibod <bok@bok.net>2023-09-27 21:37:36 -0700
commit406a932467d94918565a090e3f6f42d956a9f062 (patch)
tree7c8dd0167e2f326037d06c9835db7fa6364a05a6
parentc6cdca892325f22e25941cbeae1ee8c15869d9ad (diff)
downloadbumble-406a932467d94918565a090e3f6f42d956a9f062.tar.gz
make grpc channels injectable
-rw-r--r--.vscode/settings.json2
-rw-r--r--bumble/transport/android_netsim.py64
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')