diff --git a/repos/libports/run/nic_router.run b/repos/libports/run/nic_router.run index 3c1607b884..4932f5a082 100644 --- a/repos/libports/run/nic_router.run +++ b/repos/libports/run/nic_router.run @@ -298,6 +298,8 @@ append config { config="yes" quota="no" stats="no" + link_state="yes" + link_state_triggers="yes" interval_sec="60" /> diff --git a/repos/os/src/server/nic_router/config.xsd b/repos/os/src/server/nic_router/config.xsd index 3cd521ef84..70c72df643 100644 --- a/repos/os/src/server/nic_router/config.xsd +++ b/repos/os/src/server/nic_router/config.xsd @@ -57,12 +57,14 @@ - - - - - - + + + + + + + + diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc index 4d5e44339d..b68c63602f 100644 --- a/repos/os/src/server/nic_router/interface.cc +++ b/repos/os/src/server/nic_router/interface.cc @@ -870,6 +870,10 @@ void Interface::handle_link_state() } catch (Domain::Ip_config_static) { } catch (Keep_ip_config) { } + + /* force report if configured */ + try { _config().report().handle_link_state(); } + catch (Pointer::Invalid) { } } @@ -2017,21 +2021,28 @@ Interface::~Interface() void Interface::report(Genode::Xml_generator &xml) { - bool const stats = _config().report().stats(); - if (stats) { - xml.node("interface", [&] () { - bool empty = true; - xml.attribute("label", _policy.label()); - try { _policy.report(xml); empty = false; } catch (Report::Empty) { } + xml.node("interface", [&] () { + bool empty { true }; + xml.attribute("label", _policy.label()); + if (_config().report().link_state()) { + xml.attribute("link_state", link_state()); + empty = false; + } + if (_config().report().stats()) { + try { + _policy.report(xml); + empty = false; + } + catch (Report::Empty) { } try { xml.node("tcp-links", [&] () { _tcp_stats.report(xml); }); empty = false; } catch (Report::Empty) { } try { xml.node("udp-links", [&] () { _udp_stats.report(xml); }); empty = false; } catch (Report::Empty) { } try { xml.node("icmp-links", [&] () { _icmp_stats.report(xml); }); empty = false; } catch (Report::Empty) { } try { xml.node("arp-waiters", [&] () { _arp_stats.report(xml); }); empty = false; } catch (Report::Empty) { } try { xml.node("dhcp-allocations", [&] () { _dhcp_stats.report(xml); }); empty = false; } catch (Report::Empty) { } - if (empty) { throw Report::Empty(); } - }); - } + } + if (empty) { throw Report::Empty(); } + }); } diff --git a/repos/os/src/server/nic_router/report.cc b/repos/os/src/server/nic_router/report.cc index 236d5ade61..bddfe60404 100644 --- a/repos/os/src/server/nic_router/report.cc +++ b/repos/os/src/server/nic_router/report.cc @@ -28,18 +28,20 @@ Net::Report::Report(bool const &verbose, Pd_session &pd, Reporter &reporter) : - _verbose { verbose }, - _config { node.attribute_value("config", true) }, - _config_triggers { node.attribute_value("config_triggers", false) }, - _bytes { node.attribute_value("bytes", true) }, - _stats { node.attribute_value("stats", true) }, - _quota { node.attribute_value("quota", true) }, - _shared_quota { shared_quota }, - _pd { pd }, - _reporter { reporter }, - _domains { domains }, - _timeout { timer, *this, &Report::_handle_report_timeout, - read_sec_attr(node, "interval_sec", 5) } + _verbose { verbose }, + _config { node.attribute_value("config", true) }, + _config_triggers { node.attribute_value("config_triggers", false) }, + _bytes { node.attribute_value("bytes", true) }, + _stats { node.attribute_value("stats", true) }, + _link_state { node.attribute_value("link_state", false) }, + _link_state_triggers { node.attribute_value("link_state_triggers", false) }, + _quota { node.attribute_value("quota", true) }, + _shared_quota { shared_quota }, + _pd { pd }, + _reporter { reporter }, + _domains { domains }, + _timeout { timer, *this, &Report::_handle_report_timeout, + read_sec_attr(node, "interval_sec", 5) } { _reporter.enabled(true); } @@ -86,3 +88,11 @@ void Net::Report::handle_config() _report(); } + +void Net::Report::handle_link_state() +{ + if (!_link_state_triggers) { + return; } + + _report(); +} diff --git a/repos/os/src/server/nic_router/report.h b/repos/os/src/server/nic_router/report.h index 1a7bc6a123..9dcae3cd03 100644 --- a/repos/os/src/server/nic_router/report.h +++ b/repos/os/src/server/nic_router/report.h @@ -48,6 +48,8 @@ class Net::Report bool const _config_triggers; bool const _bytes; bool const _stats; + bool const _link_state; + bool const _link_state_triggers; bool const _quota; Quota const &_shared_quota; Genode::Pd_session &_pd; @@ -73,14 +75,18 @@ class Net::Report void handle_config(); + void handle_link_state(); + /*************** ** Accessors ** ***************/ - bool config() const { return _config; } - bool bytes() const { return _bytes; } - bool stats() const { return _stats; } + bool config() const { return _config; } + bool bytes() const { return _bytes; } + bool stats() const { return _stats; } + bool link_state() const { return _link_state; } + bool link_state_triggers() const { return _link_state_triggers; } }; #endif /* _REPORT_H_ */