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_ */