This commit introduces several key enhancements to the AirSpace class, improving the realism and configurability of the wireless network. Major additions include the AirSpaceEnvironmentType and ChannelWidth enums, dynamic adjustment of interface speeds based on environmental settings, and comprehensive bandwidth management features. Additionally, the software now supports configuration of channel widths via the config file, incorporates accurate SNR and capacity calculations, and enforces bandwidth limits more effectively across wireless interfaces. Updated tests ensure that the new functionalities integrate seamlessly with existing systems.
107 lines
4.6 KiB
Python
107 lines
4.6 KiB
Python
# © Crown-owned copyright 2024, Defence Science and Technology Laboratory UK
|
|
import yaml
|
|
|
|
from primaite.game.game import PrimaiteGame
|
|
from primaite.simulator.network.airspace import (
|
|
AirspaceEnvironmentType,
|
|
AirSpaceFrequency,
|
|
calculate_total_channel_capacity,
|
|
ChannelWidth,
|
|
)
|
|
from primaite.simulator.network.hardware.nodes.network.wireless_router import WirelessRouter
|
|
from tests import TEST_ASSETS_ROOT
|
|
|
|
|
|
def test_wireless_wan_wifi_5_80_channel_width_urban():
|
|
config_path = TEST_ASSETS_ROOT / "configs" / "wireless_wan_wifi_5_80_channel_width_urban.yaml"
|
|
|
|
with open(config_path, "r") as f:
|
|
config_dict = yaml.safe_load(f)
|
|
network = PrimaiteGame.from_config(cfg=config_dict).simulation.network
|
|
|
|
airspace = network.airspace
|
|
|
|
assert airspace.airspace_environment_type == AirspaceEnvironmentType.URBAN
|
|
|
|
router_1: WirelessRouter = network.get_node_by_hostname("router_1")
|
|
router_2: WirelessRouter = network.get_node_by_hostname("router_2")
|
|
|
|
expected_speed = calculate_total_channel_capacity(
|
|
channel_width=ChannelWidth.WIDTH_80_MHZ,
|
|
frequency=AirSpaceFrequency.WIFI_5,
|
|
environment_type=AirspaceEnvironmentType.URBAN,
|
|
)
|
|
|
|
assert router_1.wireless_access_point.speed == expected_speed
|
|
assert router_2.wireless_access_point.speed == expected_speed
|
|
|
|
pc_a = network.get_node_by_hostname("pc_a")
|
|
pc_b = network.get_node_by_hostname("pc_b")
|
|
|
|
assert pc_a.ping(pc_a.default_gateway), "PC A should ping its default gateway successfully."
|
|
assert pc_b.ping(pc_b.default_gateway), "PC B should ping its default gateway successfully."
|
|
|
|
assert pc_a.ping(pc_b.network_interface[1].ip_address), "PC A should ping PC B across routers successfully."
|
|
assert pc_b.ping(pc_a.network_interface[1].ip_address), "PC B should ping PC A across routers successfully."
|
|
|
|
|
|
def test_wireless_wan_wifi_5_80_channel_width_blocked():
|
|
config_path = TEST_ASSETS_ROOT / "configs" / "wireless_wan_wifi_5_80_channel_width_blocked.yaml"
|
|
|
|
with open(config_path, "r") as f:
|
|
config_dict = yaml.safe_load(f)
|
|
network = PrimaiteGame.from_config(cfg=config_dict).simulation.network
|
|
|
|
airspace = network.airspace
|
|
|
|
assert airspace.airspace_environment_type == AirspaceEnvironmentType.BLOCKED
|
|
|
|
router_1: WirelessRouter = network.get_node_by_hostname("router_1")
|
|
router_2: WirelessRouter = network.get_node_by_hostname("router_2")
|
|
|
|
expected_speed = calculate_total_channel_capacity(
|
|
channel_width=ChannelWidth.WIDTH_80_MHZ,
|
|
frequency=AirSpaceFrequency.WIFI_5,
|
|
environment_type=AirspaceEnvironmentType.BLOCKED,
|
|
)
|
|
|
|
assert router_1.wireless_access_point.speed == expected_speed
|
|
assert router_2.wireless_access_point.speed == expected_speed
|
|
|
|
pc_a = network.get_node_by_hostname("pc_a")
|
|
pc_b = network.get_node_by_hostname("pc_b")
|
|
|
|
assert pc_a.ping(pc_a.default_gateway), "PC A should ping its default gateway successfully."
|
|
assert pc_b.ping(pc_b.default_gateway), "PC B should ping its default gateway successfully."
|
|
|
|
assert not pc_a.ping(pc_b.network_interface[1].ip_address), "PC A should ping PC B across routers unsuccessfully."
|
|
assert not pc_b.ping(pc_a.network_interface[1].ip_address), "PC B should ping PC A across routers unsuccessfully."
|
|
|
|
|
|
def test_wireless_wan_blocking_and_unblocking_airspace():
|
|
config_path = TEST_ASSETS_ROOT / "configs" / "wireless_wan_wifi_5_80_channel_width_urban.yaml"
|
|
|
|
with open(config_path, "r") as f:
|
|
config_dict = yaml.safe_load(f)
|
|
network = PrimaiteGame.from_config(cfg=config_dict).simulation.network
|
|
|
|
airspace = network.airspace
|
|
|
|
assert airspace.airspace_environment_type == AirspaceEnvironmentType.URBAN
|
|
|
|
pc_a = network.get_node_by_hostname("pc_a")
|
|
pc_b = network.get_node_by_hostname("pc_b")
|
|
|
|
assert pc_a.ping(pc_b.network_interface[1].ip_address), "PC A should ping PC B across routers successfully."
|
|
assert pc_b.ping(pc_a.network_interface[1].ip_address), "PC B should ping PC A across routers successfully."
|
|
|
|
airspace.airspace_environment_type = AirspaceEnvironmentType.BLOCKED
|
|
|
|
assert not pc_a.ping(pc_b.network_interface[1].ip_address), "PC A should ping PC B across routers unsuccessfully."
|
|
assert not pc_b.ping(pc_a.network_interface[1].ip_address), "PC B should ping PC A across routers unsuccessfully."
|
|
|
|
airspace.airspace_environment_type = AirspaceEnvironmentType.URBAN
|
|
|
|
assert pc_a.ping(pc_b.network_interface[1].ip_address), "PC A should ping PC B across routers successfully."
|
|
assert pc_b.ping(pc_a.network_interface[1].ip_address), "PC B should ping PC A across routers successfully."
|