From 1306892fbfa4699402ed4eefb79363ac8f260187 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Tue, 29 May 2018 15:24:40 +0200 Subject: [PATCH] nic_router: fix interface update on missing domain When updating an interface in the NIC router to a new configuration and the domain name of the interface has not changed but the domain disappeared, the NIC router did not detach from the old domain correctly which led to broken remnants of interface state objects (like connection states). Adapt the nic_router_uplinks run script to work with the fix. --- repos/dde_linux/run/nic_router_uplinks.run | 59 ++++++++++----------- repos/os/src/server/nic_router/interface.cc | 15 +++--- repos/os/src/server/nic_router/interface.h | 2 +- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/repos/dde_linux/run/nic_router_uplinks.run b/repos/dde_linux/run/nic_router_uplinks.run index f657a1a4b3..51202f93ae 100644 --- a/repos/dde_linux/run/nic_router_uplinks.run +++ b/repos/dde_linux/run/nic_router_uplinks.run @@ -154,7 +154,7 @@ append config { - + @@ -196,7 +196,7 @@ append config { - + @@ -242,7 +242,6 @@ append config { - @@ -318,40 +317,40 @@ append_platform_drv_boot_modules build_boot_image $boot_modules -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3001 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3001 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3002 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3002 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3003 milliseconds.*" -append done_string "From 10.0.1.79 icmp_seq=.* Destination Unreachable" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3003 milliseconds" +append done_string ".*downlink.*invalid domain.*invalid ICMP rule" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3004 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3004 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3005 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3005 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3006 milliseconds.*" -append done_string "From 10.0.1.79 icmp_seq=.* Destination Unreachable" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3006 milliseconds" +append done_string ".*downlink.*invalid domain.*invalid ICMP rule" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3007 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3007 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 3008 milliseconds.*" -append done_string ".*64 bytes from 1.1.1.1: icmp_seq=.*" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 3008 milliseconds" +append done_string ".*64 bytes from 1.1.1.1: icmp_seq=" -append done_string ".*router.config: change.*" -append done_string ".*router.config: sleep 600000 milliseconds.*" -append done_string "From 10.0.1.79 icmp_seq=.* Destination Unreachable" +append done_string ".*router.config: change" +append done_string ".*router.config: sleep 600000 milliseconds" +append done_string ".*From 10.0.1.79 icmp_seq=.* Destination Unreachable" run_genode_until $done_string 60 diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc index 003c19d42d..f132a40d70 100644 --- a/repos/os/src/server/nic_router/interface.cc +++ b/repos/os/src/server/nic_router/interface.cc @@ -233,9 +233,8 @@ Interface::_transport_rules(Domain &local_domain, L3_protocol const prot) const } -void Interface::_attach_to_domain_raw(Domain_name const &domain_name) +void Interface::_attach_to_domain_raw(Domain &domain) { - Domain &domain = _config().domains().find_by_name(domain_name); _domain = domain; Signal_transmitter(_link_state_sigh).submit(); _interfaces.remove(this); @@ -255,7 +254,7 @@ void Interface::_detach_from_domain_raw() void Interface::_attach_to_domain(Domain_name const &domain_name) { - _attach_to_domain_raw(domain_name); + _attach_to_domain_raw(_config().domains().find_by_name(domain_name)); attach_to_domain_finish(); } @@ -1566,15 +1565,15 @@ void Interface::handle_config_2() try { /* if the domains differ, detach completely from the domain */ Domain &old_domain = domain(); + Domain &new_domain = _config().domains().find_by_name(new_domain_name); if (old_domain.name() != new_domain_name) { _detach_from_domain(); - _attach_to_domain_raw(new_domain_name); + _attach_to_domain_raw(new_domain); return; } /* move to new domain object without considering any state objects */ _detach_from_domain_raw(); - _attach_to_domain_raw(new_domain_name); - Domain &new_domain = domain(); + _attach_to_domain_raw(new_domain); /* remember that the interface stays attached to the same domain */ _update_domain = *new (_alloc) @@ -1590,9 +1589,7 @@ void Interface::handle_config_2() catch (Pointer::Invalid) { /* the interface had no domain but now it may get one */ - try { - _attach_to_domain_raw(new_domain_name); - } + try { _attach_to_domain_raw(_config().domains().find_by_name(new_domain_name)); } catch (Domain_tree::No_match) { } } } diff --git a/repos/os/src/server/nic_router/interface.h b/repos/os/src/server/nic_router/interface.h index e56a5e9042..32284d59f1 100644 --- a/repos/os/src/server/nic_router/interface.h +++ b/repos/os/src/server/nic_router/interface.h @@ -269,7 +269,7 @@ class Net::Interface : private Interface_list::Element void _attach_to_domain(Domain_name const &domain_name); - void _attach_to_domain_raw(Domain_name const &domain_name); + void _attach_to_domain_raw(Domain &domain); void _apply_foreign_arp();