diff --git a/repos/libports/run/nic_router.run b/repos/libports/run/nic_router.run
index 98244df8b1..14b088c525 100644
--- a/repos/libports/run/nic_router.run
+++ b/repos/libports/run/nic_router.run
@@ -224,7 +224,11 @@ append config {
-
+
+
diff --git a/repos/os/src/server/nic_router/README b/repos/os/src/server/nic_router/README
index 731cab6369..1f317f77d8 100644
--- a/repos/os/src/server/nic_router/README
+++ b/repos/os/src/server/nic_router/README
@@ -377,6 +377,12 @@ sent by the router (ETH, IPv4, ARP, UDP, TCP, DHCP).
Log most important changes in the state of a domain (number of nic sessions
connected, current IPv4 config).
+!
+!
+!
+
+Log most important protocol header fields of each packet that is received or
+sent at a specific domain (ETH, IPv4, ARP, UDP, TCP, DHCP).
Examples
########
diff --git a/repos/os/src/server/nic_router/config.xsd b/repos/os/src/server/nic_router/config.xsd
index 6edd132ee3..3f731025a7 100644
--- a/repos/os/src/server/nic_router/config.xsd
+++ b/repos/os/src/server/nic_router/config.xsd
@@ -140,9 +140,10 @@
-
-
-
+
+
+
+
diff --git a/repos/os/src/server/nic_router/domain.cc b/repos/os/src/server/nic_router/domain.cc
index 3447016c76..474da24ff4 100644
--- a/repos/os/src/server/nic_router/domain.cc
+++ b/repos/os/src/server/nic_router/domain.cc
@@ -110,7 +110,9 @@ Domain::Domain(Configuration &config, Xml_node const node, Allocator &alloc)
Domain_base(node), _avl_member(_name, *this), _config(config),
_node(node), _alloc(alloc),
_ip_config(_node.attribute_value("interface", Ipv4_address_prefix()),
- _node.attribute_value("gateway", Ipv4_address()))
+ _node.attribute_value("gateway", Ipv4_address())),
+ _verbose_packets(_node.attribute_value("verbose_packets", false) ||
+ _config.verbose_packets())
{
if (_name == Domain_name()) {
error("Missing name attribute in domain node");
diff --git a/repos/os/src/server/nic_router/domain.h b/repos/os/src/server/nic_router/domain.h
index f8fb944279..ff87e60693 100644
--- a/repos/os/src/server/nic_router/domain.h
+++ b/repos/os/src/server/nic_router/domain.h
@@ -104,6 +104,7 @@ class Net::Domain : public Domain_base
Link_side_tree _udp_links { };
Genode::size_t _tx_bytes { 0 };
Genode::size_t _rx_bytes { 0 };
+ bool const _verbose_packets { false };
void _read_forward_rules(Genode::Cstring const &protocol,
Domain_tree &domains,
@@ -164,22 +165,23 @@ class Net::Domain : public Domain_base
** Accessors **
***************/
- Ipv4_config const &ip_config() const { return *_ip_config; }
- Domain_name const &name() { return _name; }
- Ip_rule_list &ip_rules() { return _ip_rules; }
- Forward_rule_tree &tcp_forward_rules() { return _tcp_forward_rules; }
- Forward_rule_tree &udp_forward_rules() { return _udp_forward_rules; }
- Transport_rule_list &tcp_rules() { return _tcp_rules; }
- Transport_rule_list &udp_rules() { return _udp_rules; }
- Nat_rule_tree &nat_rules() { return _nat_rules; }
- List &interfaces() { return _interfaces; }
- Configuration &config() const { return _config; }
- Domain_avl_member &avl_member() { return _avl_member; }
- Dhcp_server &dhcp_server() { return _dhcp_server.deref(); }
- Arp_cache &arp_cache() { return _arp_cache; }
- Arp_waiter_list &foreign_arp_waiters() { return _foreign_arp_waiters; }
- Link_side_tree &tcp_links() { return _tcp_links; }
- Link_side_tree &udp_links() { return _udp_links; }
+ bool verbose_packets() const { return _verbose_packets; }
+ Ipv4_config const &ip_config() const { return *_ip_config; }
+ Domain_name const &name() { return _name; }
+ Ip_rule_list &ip_rules() { return _ip_rules; }
+ Forward_rule_tree &tcp_forward_rules() { return _tcp_forward_rules; }
+ Forward_rule_tree &udp_forward_rules() { return _udp_forward_rules; }
+ Transport_rule_list &tcp_rules() { return _tcp_rules; }
+ Transport_rule_list &udp_rules() { return _udp_rules; }
+ Nat_rule_tree &nat_rules() { return _nat_rules; }
+ List &interfaces() { return _interfaces; }
+ Configuration &config() const { return _config; }
+ Domain_avl_member &avl_member() { return _avl_member; }
+ Dhcp_server &dhcp_server() { return _dhcp_server.deref(); }
+ Arp_cache &arp_cache() { return _arp_cache; }
+ Arp_waiter_list &foreign_arp_waiters() { return _foreign_arp_waiters; }
+ Link_side_tree &tcp_links() { return _tcp_links; }
+ Link_side_tree &udp_links() { return _udp_links; }
};
diff --git a/repos/os/src/server/nic_router/interface.cc b/repos/os/src/server/nic_router/interface.cc
index 4aff7472f6..125e03ec57 100644
--- a/repos/os/src/server/nic_router/interface.cc
+++ b/repos/os/src/server/nic_router/interface.cc
@@ -879,7 +879,7 @@ void Interface::_handle_eth(void *const eth_base,
/* inspect and handle ethernet frame */
try {
Ethernet_frame *const eth = reinterpret_cast(eth_base);
- if (_config().verbose_packets()) {
+ if (_domain.verbose_packets()) {
log("(router <- ", _domain, ") ", *eth); }
if (_domain.ip_config().valid) {
@@ -953,7 +953,7 @@ void Interface::_send_submit_pkt(Packet_descriptor &pkt,
{
_source().submit_packet(pkt);
_domain.raise_tx_bytes(pkt_size);
- if (_config().verbose_packets()) {
+ if (_domain.verbose_packets()) {
log("(", _domain, " <- router) ",
*reinterpret_cast(pkt_base));
}