tools/hci_throughput: Custom transport option

Added option to pass custom transport module.
This commit is contained in:
Jakub
2022-07-27 10:48:13 +02:00
committed by Szymon Janc
parent 5932b3c2dd
commit 9212b4f774
5 changed files with 69 additions and 28 deletions
+12 -4
View File
@@ -34,8 +34,15 @@ def parse_arguments():
sudo python check_addr.py -i 0 1 2')
parser.add_argument('-i', '--indexes', type=str, nargs='*',
help='specify hci adapters indexes', default=0)
parser.add_argument('-t', '--transport_directory', type=str, nargs='*',
help='specify hci transport directory path', default="default")
try:
args = parser.parse_args()
if (type(args.transport_directory) == list):
args.transport_directory = args.transport_directory.pop()
else:
args.transport_directory = args.transport_directory
except Exception as e:
print(traceback.format_exc())
return args
@@ -64,7 +71,7 @@ async def main(dev: hci_commands.HCI_Commands):
task.cancel()
return result
def check_addr(device_indexes: list, addresses: list) -> list:
def check_addr(device_indexes: list, addresses: list, transport_directory: str) -> list:
util.configure_logging(f"log/check_addr.log", clear_log_file=True)
logging.info(f"Devices indexes: {device_indexes}")
@@ -73,8 +80,9 @@ def check_addr(device_indexes: list, addresses: list) -> list:
asyncio.set_event_loop(loop)
loop.set_debug(True)
transport = transport_factory.TransportFactory(device_index=index,
asyncio_loop=loop)
transport = transport_factory.TransportFactory(device_index=str(index),
asyncio_loop=loop,
transport_directory=transport_directory)
bt_dev = hci_commands.HCI_Commands(send=transport.send,
rx_buffer_q=transport.rx_buffer_q,
@@ -96,7 +104,7 @@ if __name__ == '__main__':
args = parse_arguments()
print(args)
addresses = []
addresses = check_addr(args.indexes, addresses)
addresses = check_addr(args.indexes, addresses, args.transport_directory)
print(addresses)
except Exception as e:
print(traceback.format_exc())
+6 -3
View File
@@ -33,6 +33,7 @@ import signal
show_tp_plots = False
test_dir = None
transport_directory = None
class ParentCalledException(KeyboardInterrupt):
""" This exception is raised when e.g. parent process sends signal.
@@ -273,7 +274,7 @@ def parse_cfg_files(args) -> dict:
ini = {
"own_address": args.own_addr,
"own_address_type": args.own_addr_type,
"dev_index": str(args.dev_idx),
"dev_index": args.dev_idx,
"peer_address": args.peer_addr,
"peer_address_type": args.peer_addr_type,
"peer_dev_index": args.peer_dev_idx
@@ -282,8 +283,9 @@ def parse_cfg_files(args) -> dict:
with open(args.init_file, "r") as file:
init_file = yaml.safe_load(file)
ini = init_file[args.mode]
global test_dir
global test_dir, transport_directory
test_dir = init_file["test_dir"]
transport_directory = init_file["transport_directory"]
with open(args.config_file) as f:
cfg = yaml.safe_load(f)
@@ -316,7 +318,8 @@ def main():
transport = transport_factory.TransportFactory(device_index=ini['dev_index'],
device_mode=args.mode,
asyncio_loop=loop)
asyncio_loop=loop,
transport_directory=transport_directory)
signal.signal(signal.SIGTERM, signal_handler)
-1
View File
@@ -58,7 +58,6 @@ class HCI_User_Channel_Socket():
self.libc = ctypes.cdll.LoadLibrary('libc.so.6')
self.rx_buffer_q = multiprocessing.Manager().Queue()
self.counter = 0
self.device_index = device_index
self.device_mode = device_mode
self.hci_socket = self.socket_create()
+20 -7
View File
@@ -43,6 +43,9 @@ def parse_arguments():
parser.add_argument('-m', '--modes', type=str, nargs="*",
help='devices modes - receiver, transmitter',
choices=['rx', 'tx'], default=['rx', 'tx'])
parser.add_argument('-t', '--transport_directory', type=str, nargs='*',
help='specify hci transport directory path. \
The default is linux socket', default=["default"])
parser.add_argument('-cf', '--config_file', type=str, nargs="*",
help='configuration file for devices',
default=["config.yaml"])
@@ -53,18 +56,20 @@ def parse_arguments():
print(f"Indexes: {args.indexes}")
print(f"Modes: {args.modes}")
print(f"Transport directory: {args.transport_directory}")
return args
def get_dev_addr_and_type(hci_indexes: list):
def get_dev_addr_and_type(hci_indexes: list, transport_directory: str):
if (len(hci_indexes) != 2):
raise Exception("HCI index error.")
manager = multiprocessing.Manager()
addr_list = manager.list()
check_addrs_proc = multiprocessing.Process(target=check_addr.check_addr,
name="Check addresses",
args=(hci_indexes, addr_list))
args=(hci_indexes, addr_list,
transport_directory))
check_addrs_proc.start()
print("check_addrs_proc pid: ", check_addrs_proc.pid)
check_addrs_proc.join()
@@ -89,7 +94,8 @@ def change_config_var(filename: str, group: str, variable: str,
default_style=None, default_flow_style=False)
def get_init_dict(filename: str, args_list: list, modes: list, dir: str):
def get_init_dict(filename: str, args_list: list, modes: list, dir: str,
transport_directory: str):
ini = {
modes[0]:{
"dev_index": args_list[0][0],
@@ -107,7 +113,8 @@ def get_init_dict(filename: str, args_list: list, modes: list, dir: str):
"peer_address_type": args_list[0][1],
"peer_address": args_list[0][2]
},
"test_dir": dir
"test_dir": dir,
"transport_directory": transport_directory
}
with open(filename, 'w') as file:
@@ -142,7 +149,8 @@ def run_once(modes: list, cfg_file: str, init_file: str):
def testing_variable_influence(cfg: dict, modes: list, cfg_file: str,
init_file: str, init_dict: dict, save_to_file: bool):
init_file: str, init_dict: dict,
save_to_file: bool):
tp_test_counter = 1
changed_params_list = []
averages = []
@@ -201,18 +209,23 @@ def main():
init_file = "init.yaml"
cfg_file = args.config_file[0]
if (type(args.transport_directory) == list):
args.transport_directory = args.transport_directory.pop()
else:
args.transport_directory = args.transport_directory
with open(cfg_file, "r") as file:
cfg = yaml.safe_load(file)
addr_list = get_dev_addr_and_type(args.indexes)
addr_list = get_dev_addr_and_type(args.indexes, args.transport_directory)
if len(addr_list) != len(args.indexes):
raise Exception("No device address received. Check HCI indexes.")
print(f"Received: {addr_list}")
test_dir_path = util.create_test_directory()
init_dict = get_init_dict(filename=init_file, args_list=addr_list,
modes=args.modes, dir=test_dir_path)
modes=args.modes, dir=test_dir_path,
transport_directory=args.transport_directory)
util.copy_config_files_to_test_directory([init_file, cfg_file],
init_dict["test_dir"])
+31 -13
View File
@@ -18,21 +18,39 @@
#
import hci_socket
import logging
import traceback
import sys
class TransportFactory:
def __init__(self, device_index=None, device_mode=None,
asyncio_loop=None) -> None:
if (type(device_index) == int or device_index.isnumeric()):
self.transport = hci_socket.HCI_User_Channel_Socket(int(device_index),
device_mode, asyncio_loop)
else:
raise Exception("No such transport found.")
def __init__(self, device_index: str = None, device_mode=None,
asyncio_loop=None, transport_directory=None) -> None:
if (device_index.isnumeric()):
self.transport = hci_socket.HCI_User_Channel_Socket(int(device_index),
device_mode,
asyncio_loop)
else:
try:
if (transport_directory != "default"):
sys.path.append(transport_directory)
print(sys.path)
import custom_transport
self.transport = custom_transport.Transport(device_index,
device_mode,
asyncio_loop)
else:
raise Exception(
"Device index and transport does not match.")
except Exception as e:
logging.error(traceback.format_exc())
sys.exit()
self.rx_buffer_q = self.transport.rx_buffer_q
self.send = self.transport.send
self.rx_buffer_q = self.transport.rx_buffer_q
self.send = self.transport.send
def start(self):
self.transport.start()
def start(self):
self.transport.start()
def stop(self):
self.transport.stop()
def stop(self):
self.transport.stop()