diff --git a/repos/os/src/server/nic_router/arp_cache.cc b/repos/os/src/server/nic_router/arp_cache.cc index 500e858f6e..6f8e0b1b0e 100644 --- a/repos/os/src/server/nic_router/arp_cache.cc +++ b/repos/os/src/server/nic_router/arp_cache.cc @@ -105,3 +105,17 @@ void Arp_cache::destroy_entries_with_mac(Mac_address const &mac) } catch (Arp_cache_entry_slot::Deref_unconstructed_object) { } } } + + +void Arp_cache::destroy_all_entries() +{ + if (_domain.config().verbose()) { + log("[", _domain, "] destroy all ARP entries"); + } + while (Arp_cache_entry *entry = first()) { + remove(entry); + } + for (unsigned curr = 0; curr < NR_OF_ENTRIES; curr++) { + _entries[curr].destruct(); + } +} diff --git a/repos/os/src/server/nic_router/arp_cache.h b/repos/os/src/server/nic_router/arp_cache.h index 8844f576bf..e1fca9f484 100644 --- a/repos/os/src/server/nic_router/arp_cache.h +++ b/repos/os/src/server/nic_router/arp_cache.h @@ -92,6 +92,8 @@ class Net::Arp_cache : public Genode::Avl_tree void destroy_entries_with_mac(Mac_address const &mac); Arp_cache_entry const &find_by_ip(Ipv4_address const &ip) const; + + void destroy_all_entries(); }; #endif /* _ARP_CACHE_H_ */ diff --git a/repos/os/src/server/nic_router/domain.cc b/repos/os/src/server/nic_router/domain.cc index 11af946ab7..2cede36955 100644 --- a/repos/os/src/server/nic_router/domain.cc +++ b/repos/os/src/server/nic_router/domain.cc @@ -364,8 +364,11 @@ void Domain::detach_interface(Interface &interface) { _interfaces.remove(&interface); _interface_cnt--; - if (!_interface_cnt && _ip_config_dynamic) { - discard_ip_config(); + if (!_interface_cnt) { + _arp_cache.destroy_all_entries(); + if (_ip_config_dynamic) { + discard_ip_config(); + } } if (_config.verbose_domain_state()) { log("[", *this, "] NIC sessions: ", _interface_cnt); diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc index f80ce1a97c..50491bcd5a 100644 --- a/repos/os/src/server/nic_router/interface.cc +++ b/repos/os/src/server/nic_router/interface.cc @@ -930,6 +930,7 @@ void Interface::handle_interface_link_state() throw Keep_ip_config(); } }); domain_.discard_ip_config(); + domain_.arp_cache().destroy_all_entries(); } } catch (Pointer::Invalid) { }