From c90c0594117265f868f8d0cee740d0708f2d0fa3 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Fri, 14 Jun 2024 14:48:28 +0000 Subject: [PATCH 1/3] fix infini-ARP bug when pinging broadcast/network address --- src/primaite/simulator/system/services/arp/arp.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/primaite/simulator/system/services/arp/arp.py b/src/primaite/simulator/system/services/arp/arp.py index e24e8980..d7ab99a3 100644 --- a/src/primaite/simulator/system/services/arp/arp.py +++ b/src/primaite/simulator/system/services/arp/arp.py @@ -138,6 +138,16 @@ class ARP(Service): target_ip_address ) if outbound_network_interface: + # ensure we are not attempting to find the network address or broadcast address (not useable IPs) + intf_network_address = outbound_network_interface.ip_network.network_address + intf_broadcast_address = outbound_network_interface.ip_network.broadcast_address + if target_ip_address == intf_network_address: + self.sys_log.info(f"Cannot send ARP request to a network address {str(target_ip_address)}") + return + if target_ip_address == intf_broadcast_address: + self.sys_log.info(f"Cannot send ARP request to a broadcast addresss {str(target_ip_address)}") + return + self.sys_log.info(f"Sending ARP request from NIC {outbound_network_interface} for ip {target_ip_address}") arp_packet = ARPPacket( sender_ip_address=outbound_network_interface.ip_address, From 7375bb383ab1e03fad55dba2b8426778edc1746c Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 18 Jun 2024 10:09:06 +0100 Subject: [PATCH 2/3] #2661 Improve style on ARP check code to be more concise --- src/primaite/simulator/system/services/arp/arp.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/primaite/simulator/system/services/arp/arp.py b/src/primaite/simulator/system/services/arp/arp.py index d7ab99a3..efadf189 100644 --- a/src/primaite/simulator/system/services/arp/arp.py +++ b/src/primaite/simulator/system/services/arp/arp.py @@ -139,13 +139,11 @@ class ARP(Service): ) if outbound_network_interface: # ensure we are not attempting to find the network address or broadcast address (not useable IPs) - intf_network_address = outbound_network_interface.ip_network.network_address - intf_broadcast_address = outbound_network_interface.ip_network.broadcast_address - if target_ip_address == intf_network_address: + if target_ip_address == outbound_network_interface.ip_network.network_address: self.sys_log.info(f"Cannot send ARP request to a network address {str(target_ip_address)}") return - if target_ip_address == intf_broadcast_address: - self.sys_log.info(f"Cannot send ARP request to a broadcast addresss {str(target_ip_address)}") + if target_ip_address == outbound_network_interface.ip_network.broadcast_address: + self.sys_log.info(f"Cannot send ARP request to a broadcast address {str(target_ip_address)}") return self.sys_log.info(f"Sending ARP request from NIC {outbound_network_interface} for ip {target_ip_address}") From 636ec0cdd4b80dcb3136d9d7ee7c0f5872351a08 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Wed, 19 Jun 2024 11:31:13 +0100 Subject: [PATCH 3/3] #26661 - Added tests for testing arp doesn't work but also doesn't crash the network if attempting to resolve a broadcast or network address --- tests/integration_tests/system/test_arp.py | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/integration_tests/system/test_arp.py diff --git a/tests/integration_tests/system/test_arp.py b/tests/integration_tests/system/test_arp.py new file mode 100644 index 00000000..be8656aa --- /dev/null +++ b/tests/integration_tests/system/test_arp.py @@ -0,0 +1,50 @@ +# © Crown-owned copyright 2024, Defence Science and Technology Laboratory UK +from primaite.simulator.network.hardware.nodes.network.router import RouterARP +from primaite.simulator.system.services.arp.arp import ARP +from tests.integration_tests.network.test_routing import multi_hop_network + + +def test_arp_from_host_to_default_gateway(multi_hop_network): + pc_a = multi_hop_network.get_node_by_hostname("pc_a") + router_1 = multi_hop_network.get_node_by_hostname("router_1") + + pc_a_arp: ARP = pc_a.software_manager.arp + + expected_result = router_1.network_interface[2].mac_address + actual_result = pc_a_arp.get_arp_cache_mac_address(router_1.network_interface[2].ip_address) + + assert actual_result == expected_result + + +def test_arp_from_router_to_router(multi_hop_network): + router_1 = multi_hop_network.get_node_by_hostname("router_1") + router_2 = multi_hop_network.get_node_by_hostname("router_2") + + router_1_arp: RouterARP = router_1.software_manager.arp + + expected_result = router_2.network_interface[1].mac_address + actual_result = router_1_arp.get_arp_cache_mac_address(router_2.network_interface[1].ip_address) + + assert actual_result == expected_result + + +def test_arp_fails_for_broadcast_address_between_routers(multi_hop_network): + router_1 = multi_hop_network.get_node_by_hostname("router_1") + + router_1_arp: RouterARP = router_1.software_manager.arp + + expected_result = None + actual_result = router_1_arp.get_arp_cache_mac_address(router_1.network_interface[1].ip_network.broadcast_address) + + assert actual_result == expected_result + + +def test_arp_fails_for_network_address_between_routers(multi_hop_network): + router_1 = multi_hop_network.get_node_by_hostname("router_1") + + router_1_arp: RouterARP = router_1.software_manager.arp + + expected_result = None + actual_result = router_1_arp.get_arp_cache_mac_address(router_1.network_interface[1].ip_network.network_address) + + assert actual_result == expected_result