diff --git a/repos/libports/run/nic_router_ipv4_fragm.run b/repos/libports/run/nic_router_ipv4_fragm.run
index 05e2e392cc..d0ffb69a52 100644
--- a/repos/libports/run/nic_router_ipv4_fragm.run
+++ b/repos/libports/run/nic_router_ipv4_fragm.run
@@ -45,7 +45,9 @@ create_boot_directory
import_from_depot [depot_user]/pkg/[drivers_nic_pkg]
-build { core init timer server/nic_router app/ping test/lwip/udp }
+build {
+ core init timer server/nic_router app/ping test/lwip/udp
+ server/report_rom }
append config {
@@ -83,6 +85,12 @@ append config {
+
+
+
+
+
+
@@ -96,6 +104,9 @@ append config {
+
+
@@ -135,7 +146,7 @@ append config {
install_config $config
build_boot_image {
core init timer nic_router ping test-lwip-udp-server ld.lib.so libc.lib.so
- libm.lib.so vfs.lib.so vfs_lwip.lib.so }
+ libm.lib.so vfs.lib.so vfs_lwip.lib.so report_rom }
# wait for server ip stack to come up
run_genode_until {.*lwIP Nic interface up.*\n} 30
@@ -158,4 +169,5 @@ set pattern_string ""
append pattern_string {.*drop packet .fragmented IPv4 not supported.*\n}
append pattern_string {.*drop packet .fragmented IPv4 not supported.*\n}
append pattern_string {.*drop packet .fragmented IPv4 not supported.*\n}
+append pattern_string {.*.*\n}
run_genode_until $pattern_string 30 $genode_id
diff --git a/repos/os/src/server/nic_router/README b/repos/os/src/server/nic_router/README
index c4e862cc19..d61cba0a6e 100644
--- a/repos/os/src/server/nic_router/README
+++ b/repos/os/src/server/nic_router/README
@@ -528,6 +528,7 @@ Configuration example (shows default values of attributes):
!
!
!
! ...
+!
!
!
! ...
@@ -595,6 +597,7 @@ A complete state report of the NIC router is structured the following way
!
!
! ...
+!
!
!
! ...
@@ -652,6 +655,15 @@ in an tag. When in a tag, they only list the number of
already destroyed objects of these types that can't be correlated anymore to
any interface of the domain.
+'dropped-fragm-ipv4'
+
+A boolean value that controls whether the subtag is
+generated in the tags and . When in an tag, the
+value shows the number of packets that were dropped at the corresponding
+interface because they were fragmented IPv4 (which is not supported). When in a
+ tag, the value refers to the number of dropped fragmented IPv4 packets
+that can't be correlated to any interface of the domain anymore.
+
'quota'
A boolean value that controls whether the subtags and of the
diff --git a/repos/os/src/server/nic_router/config.xsd b/repos/os/src/server/nic_router/config.xsd
index fd1712016f..388b614c1e 100644
--- a/repos/os/src/server/nic_router/config.xsd
+++ b/repos/os/src/server/nic_router/config.xsd
@@ -65,6 +65,7 @@
+
diff --git a/repos/os/src/server/nic_router/domain.cc b/repos/os/src/server/nic_router/domain.cc
index 9ddb6f3a77..bac1c58465 100644
--- a/repos/os/src/server/nic_router/domain.cc
+++ b/repos/os/src/server/nic_router/domain.cc
@@ -417,6 +417,12 @@ void Domain::report(Xml_generator &xml)
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 (_config.report().dropped_fragm_ipv4() && _dropped_fragm_ipv4) {
+ xml.node("dropped-fragm-ipv4", [&] () {
+ xml.attribute("value", _dropped_fragm_ipv4);
+ });
+ empty = false;
+ }
_interfaces.for_each([&] (Interface &interface) {
try {
interface.report(xml);
@@ -429,6 +435,12 @@ void Domain::report(Xml_generator &xml)
}
+void Domain::add_dropped_fragm_ipv4(unsigned long dropped_fragm_ipv4)
+{
+ _dropped_fragm_ipv4 += dropped_fragm_ipv4;
+}
+
+
/***********************
** Domain_link_stats **
***********************/
diff --git a/repos/os/src/server/nic_router/domain.h b/repos/os/src/server/nic_router/domain.h
index fe12759d85..1adfec6288 100644
--- a/repos/os/src/server/nic_router/domain.h
+++ b/repos/os/src/server/nic_router/domain.h
@@ -126,6 +126,7 @@ class Net::Domain : public Domain_base,
Domain_link_stats _icmp_stats { };
Domain_object_stats _arp_stats { };
Domain_object_stats _dhcp_stats { };
+ unsigned long _dropped_fragm_ipv4 { 0 };
void _read_forward_rules(Genode::Cstring const &protocol,
Domain_tree &domains,
@@ -195,6 +196,8 @@ class Net::Domain : public Domain_base,
void report(Genode::Xml_generator &xml);
+ void add_dropped_fragm_ipv4(unsigned long dropped_fragm_ipv4);
+
/*********
** log **
diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc
index e5c8496f8b..ec1cb27a4f 100644
--- a/repos/os/src/server/nic_router/interface.cc
+++ b/repos/os/src/server/nic_router/interface.cc
@@ -354,6 +354,7 @@ void Interface::_detach_from_domain_raw()
_domain = Pointer();
_policy.interface_unready();
+ domain.add_dropped_fragm_ipv4(_dropped_fragm_ipv4);
domain.tcp_stats().dissolve_interface(_tcp_stats);
domain.udp_stats().dissolve_interface(_udp_stats);
domain.icmp_stats().dissolve_interface(_icmp_stats);
@@ -371,6 +372,7 @@ void Interface::_update_domain_object(Domain &new_domain) {
_domain = Pointer();
_policy.interface_unready();
+ old_domain.add_dropped_fragm_ipv4(_dropped_fragm_ipv4);
old_domain.tcp_stats().dissolve_interface(_tcp_stats);
old_domain.udp_stats().dissolve_interface(_udp_stats);
old_domain.icmp_stats().dissolve_interface(_icmp_stats);
@@ -1120,6 +1122,7 @@ void Interface::_handle_ip(Ethernet_frame ð,
if (ip.more_fragments() ||
ip.fragment_offset() != 0) {
+ _dropped_fragm_ipv4++;
throw Drop_packet("fragmented IPv4 not supported");
}
/* try handling subnet-local IP packets */
@@ -2191,6 +2194,12 @@ void Interface::report(Genode::Xml_generator &xml)
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 (_config().report().dropped_fragm_ipv4() && _dropped_fragm_ipv4) {
+ xml.node("dropped-fragm-ipv4", [&] () {
+ xml.attribute("value", _dropped_fragm_ipv4);
+ });
+ empty = false;
+ }
if (empty) { throw Report::Empty(); }
});
}
diff --git a/repos/os/src/server/nic_router/interface.h b/repos/os/src/server/nic_router/interface.h
index 88852cd4b7..0968c05394 100644
--- a/repos/os/src/server/nic_router/interface.h
+++ b/repos/os/src/server/nic_router/interface.h
@@ -163,6 +163,7 @@ class Net::Interface : private Interface_list::Element
Interface_link_stats _icmp_stats { };
Interface_object_stats _arp_stats { };
Interface_object_stats _dhcp_stats { };
+ unsigned long _dropped_fragm_ipv4 { 0 };
void _new_link(L3_protocol const protocol,
Link_side_id const &local_id,
diff --git a/repos/os/src/server/nic_router/report.cc b/repos/os/src/server/nic_router/report.cc
index b7497d0932..3299c1fd3c 100644
--- a/repos/os/src/server/nic_router/report.cc
+++ b/repos/os/src/server/nic_router/report.cc
@@ -33,6 +33,7 @@ Net::Report::Report(bool const &verbose,
_config_triggers { node.attribute_value("config_triggers", false) },
_bytes { node.attribute_value("bytes", true) },
_stats { node.attribute_value("stats", true) },
+ _dropped_fragm_ipv4 { node.attribute_value("dropped_fragm_ipv4", false) },
_link_state { node.attribute_value("link_state", false) },
_link_state_triggers { node.attribute_value("link_state_triggers", false) },
_quota { node.attribute_value("quota", true) },
diff --git a/repos/os/src/server/nic_router/report.h b/repos/os/src/server/nic_router/report.h
index 49b9b1e200..8255ccde5f 100644
--- a/repos/os/src/server/nic_router/report.h
+++ b/repos/os/src/server/nic_router/report.h
@@ -48,6 +48,7 @@ class Net::Report
bool const _config_triggers;
bool const _bytes;
bool const _stats;
+ bool const _dropped_fragm_ipv4;
bool const _link_state;
bool const _link_state_triggers;
bool const _quota;
@@ -85,6 +86,7 @@ class Net::Report
bool config() const { return _config; }
bool bytes() const { return _bytes; }
bool stats() const { return _stats; }
+ bool dropped_fragm_ipv4() const { return _dropped_fragm_ipv4; }
bool link_state() const { return _link_state; }
bool link_state_triggers() const { return _link_state_triggers; }
};