Merged PR 424: fix infini-ARP bug when pinging broadcast/network address
Related work items: #2661
This commit is contained in:
@@ -138,6 +138,14 @@ class ARP(Service):
|
|||||||
target_ip_address
|
target_ip_address
|
||||||
)
|
)
|
||||||
if outbound_network_interface:
|
if outbound_network_interface:
|
||||||
|
# ensure we are not attempting to find the network address or broadcast address (not useable IPs)
|
||||||
|
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 == 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}")
|
self.sys_log.info(f"Sending ARP request from NIC {outbound_network_interface} for ip {target_ip_address}")
|
||||||
arp_packet = ARPPacket(
|
arp_packet = ARPPacket(
|
||||||
sender_ip_address=outbound_network_interface.ip_address,
|
sender_ip_address=outbound_network_interface.ip_address,
|
||||||
|
|||||||
50
tests/integration_tests/system/test_arp.py
Normal file
50
tests/integration_tests/system/test_arp.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user