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; } };