From 2a779761644533f5d3818f7618bb2d3ec44537ac Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Sun, 4 Feb 2018 15:58:25 +0100 Subject: [PATCH] nic_router: add verbose_packets per domain A domain logs its packets if one of the global 'verbose_packets' or its local 'verbose_packets' is switched on. Ref #2670 --- repos/libports/run/nic_router.run | 6 +++- repos/os/src/server/nic_router/README | 6 ++++ repos/os/src/server/nic_router/config.xsd | 7 +++-- repos/os/src/server/nic_router/domain.cc | 4 ++- repos/os/src/server/nic_router/domain.h | 34 +++++++++++---------- repos/os/src/server/nic_router/interface.cc | 4 +-- 6 files changed, 38 insertions(+), 23 deletions(-) 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)); }