NIC router: hand-over XML nodes by value

Ref #2193
This commit is contained in:
Martin Stein 2016-12-06 14:39:17 +01:00 committed by Norman Feske
parent eef18e1ecd
commit 591ed80dcf
17 changed files with 39 additions and 41 deletions

View File

@ -27,7 +27,7 @@ using namespace Genode;
** Utilities ** ** Utilities **
***************/ ***************/
static unsigned read_rtt_sec(Xml_node const &node) static unsigned read_rtt_sec(Xml_node const node)
{ {
unsigned const rtt_sec = node.attribute_value("rtt_sec", 0UL); unsigned const rtt_sec = node.attribute_value("rtt_sec", 0UL);
if (!rtt_sec) { if (!rtt_sec) {
@ -48,7 +48,7 @@ Configuration::Configuration(Xml_node const node, Allocator &alloc)
_rtt_sec(read_rtt_sec(node)), _node(node) _rtt_sec(read_rtt_sec(node)), _node(node)
{ {
/* read domains */ /* read domains */
node.for_each_sub_node("domain", [&] (Xml_node const &node) { node.for_each_sub_node("domain", [&] (Xml_node const node) {
try { _domains.insert(*new (_alloc) Domain(*this, node, _alloc)); } try { _domains.insert(*new (_alloc) Domain(*this, node, _alloc)); }
catch (Domain::Invalid) { warning("invalid domain"); } catch (Domain::Invalid) { warning("invalid domain"); }
}); });

View File

@ -14,14 +14,11 @@
/* local includes */ /* local includes */
#include <direct_rule.h> #include <direct_rule.h>
/* Genode includes */
#include <util/xml_node.h>
using namespace Net; using namespace Net;
using namespace Genode; using namespace Genode;
Direct_rule_base::Direct_rule_base(Xml_node const &node) Direct_rule_base::Direct_rule_base(Xml_node const node)
: :
_dst(node.attribute_value("dst", Ipv4_address_prefix())) _dst(node.attribute_value("dst", Ipv4_address_prefix()))
{ {

View File

@ -17,6 +17,7 @@
/* Genode includes */ /* Genode includes */
#include <net/ipv4.h> #include <net/ipv4.h>
#include <util/list.h> #include <util/list.h>
#include <util/xml_node.h>
/* local includes */ /* local includes */
#include <rule.h> #include <rule.h>
@ -39,7 +40,7 @@ class Net::Direct_rule_base : public Rule
public: public:
Direct_rule_base(Genode::Xml_node const &node); Direct_rule_base(Genode::Xml_node const node);
/********* /*********
@ -61,7 +62,7 @@ template <typename T>
struct Net::Direct_rule : Direct_rule_base, struct Net::Direct_rule : Direct_rule_base,
Direct_rule_list<T>::Element Direct_rule_list<T>::Element
{ {
Direct_rule(Genode::Xml_node const &node) : Direct_rule_base(node) { } Direct_rule(Genode::Xml_node const node) : Direct_rule_base(node) { }
}; };

View File

@ -39,7 +39,7 @@ Domain_avl_member::Domain_avl_member(Domain_name const &name,
** Domain_base ** ** Domain_base **
*****************/ *****************/
Domain_base::Domain_base(Xml_node const &node) Domain_base::Domain_base(Xml_node const node)
: :
_name(Cstring(node.attribute("name").value_base(), _name(Cstring(node.attribute("name").value_base(),
node.attribute("name").value_size())) node.attribute("name").value_size()))
@ -52,11 +52,11 @@ Domain_base::Domain_base(Xml_node const &node)
void Domain::_read_forward_rules(Cstring const &protocol, void Domain::_read_forward_rules(Cstring const &protocol,
Domain_tree &domains, Domain_tree &domains,
Xml_node const &node, Xml_node const node,
char const *type, char const *type,
Forward_rule_tree &rules) Forward_rule_tree &rules)
{ {
node.for_each_sub_node(type, [&] (Xml_node const &node) { node.for_each_sub_node(type, [&] (Xml_node const node) {
try { try {
Forward_rule &rule = *new (_alloc) Forward_rule(domains, node); Forward_rule &rule = *new (_alloc) Forward_rule(domains, node);
rules.insert(&rule); rules.insert(&rule);
@ -70,11 +70,11 @@ void Domain::_read_forward_rules(Cstring const &protocol,
void Domain::_read_transport_rules(Cstring const &protocol, void Domain::_read_transport_rules(Cstring const &protocol,
Domain_tree &domains, Domain_tree &domains,
Xml_node const &node, Xml_node const node,
char const *type, char const *type,
Transport_rule_list &rules) Transport_rule_list &rules)
{ {
node.for_each_sub_node(type, [&] (Xml_node const &node) { node.for_each_sub_node(type, [&] (Xml_node const node) {
try { try {
rules.insert(*new (_alloc) Transport_rule(domains, node, _alloc, rules.insert(*new (_alloc) Transport_rule(domains, node, _alloc,
protocol, _config)); protocol, _config));
@ -90,7 +90,7 @@ void Domain::print(Output &output) const
} }
Domain::Domain(Configuration &config, Xml_node const &node, Allocator &alloc) Domain::Domain(Configuration &config, Xml_node const node, Allocator &alloc)
: :
Domain_base(node), _avl_member(_name, *this), _config(config), Domain_base(node), _avl_member(_name, *this), _config(config),
_node(node), _alloc(alloc), _node(node), _alloc(alloc),
@ -119,7 +119,7 @@ void Domain::create_rules(Domain_tree &domains)
_read_transport_rules(udp_name(), domains, _node, "udp", _udp_rules); _read_transport_rules(udp_name(), domains, _node, "udp", _udp_rules);
/* read NAT rules */ /* read NAT rules */
_node.for_each_sub_node("nat", [&] (Xml_node const &node) { _node.for_each_sub_node("nat", [&] (Xml_node const node) {
try { try {
_nat_rules.insert( _nat_rules.insert(
new (_alloc) Nat_rule(domains, _tcp_port_alloc, new (_alloc) Nat_rule(domains, _tcp_port_alloc,
@ -128,7 +128,7 @@ void Domain::create_rules(Domain_tree &domains)
catch (Rule::Invalid) { warning("invalid NAT rule"); } catch (Rule::Invalid) { warning("invalid NAT rule"); }
}); });
/* read IP rules */ /* read IP rules */
_node.for_each_sub_node("ip", [&] (Xml_node const &node) { _node.for_each_sub_node("ip", [&] (Xml_node const node) {
try { _ip_rules.insert(*new (_alloc) Ip_rule(domains, node)); } try { _ip_rules.insert(*new (_alloc) Ip_rule(domains, node)); }
catch (Rule::Invalid) { warning("invalid IP rule"); } catch (Rule::Invalid) { warning("invalid IP rule"); }
}); });

View File

@ -66,7 +66,7 @@ class Net::Domain_base
Domain_name const _name; Domain_name const _name;
Domain_base(Genode::Xml_node const &node); Domain_base(Genode::Xml_node const node);
}; };
@ -93,13 +93,13 @@ class Net::Domain : public Domain_base
void _read_forward_rules(Genode::Cstring const &protocol, void _read_forward_rules(Genode::Cstring const &protocol,
Domain_tree &domains, Domain_tree &domains,
Genode::Xml_node const &node, Genode::Xml_node const node,
char const *type, char const *type,
Forward_rule_tree &rules); Forward_rule_tree &rules);
void _read_transport_rules(Genode::Cstring const &protocol, void _read_transport_rules(Genode::Cstring const &protocol,
Domain_tree &domains, Domain_tree &domains,
Genode::Xml_node const &node, Genode::Xml_node const node,
char const *type, char const *type,
Transport_rule_list &rules); Transport_rule_list &rules);
@ -109,7 +109,7 @@ class Net::Domain : public Domain_base
struct No_next_hop : Genode::Exception { }; struct No_next_hop : Genode::Exception { };
Domain(Configuration &config, Domain(Configuration &config,
Genode::Xml_node const &node, Genode::Xml_node const node,
Genode::Allocator &alloc); Genode::Allocator &alloc);
void create_rules(Domain_tree &domains); void create_rules(Domain_tree &domains);

View File

@ -33,7 +33,7 @@ void Forward_rule::print(Output &output) const
} }
Forward_rule::Forward_rule(Domain_tree &domains, Xml_node const &node) Forward_rule::Forward_rule(Domain_tree &domains, Xml_node const node)
: :
Leaf_rule(domains, node), Leaf_rule(domains, node),
_port(node.attribute_value("port", Port(0))), _port(node.attribute_value("port", Port(0))),

View File

@ -41,7 +41,7 @@ class Net::Forward_rule : public Leaf_rule,
public: public:
Forward_rule(Domain_tree &domains, Genode::Xml_node const &node); Forward_rule(Domain_tree &domains, Genode::Xml_node const node);
Forward_rule const &find_by_port(Port const port) const; Forward_rule const &find_by_port(Port const port) const;

View File

@ -18,7 +18,7 @@ using namespace Net;
using namespace Genode; using namespace Genode;
Ip_rule::Ip_rule(Domain_tree &domains, Xml_node const &node) Ip_rule::Ip_rule(Domain_tree &domains, Xml_node const node)
: :
Leaf_rule(domains, node), Leaf_rule(domains, node),
Direct_rule(node) Direct_rule(node)

View File

@ -29,7 +29,7 @@ struct Net::Ip_rule : Leaf_rule, Direct_rule<Ip_rule>
{ {
public: public:
Ip_rule(Domain_tree &domains, Genode::Xml_node const &node); Ip_rule(Domain_tree &domains, Genode::Xml_node const node);
}; };
#endif /* _IP_RULE_H_ */ #endif /* _IP_RULE_H_ */

View File

@ -20,7 +20,7 @@ using namespace Genode;
Domain &Leaf_rule::_find_domain(Domain_tree &domains, Domain &Leaf_rule::_find_domain(Domain_tree &domains,
Xml_node const &node) Xml_node const node)
{ {
try { try {
return domains.find_by_name( return domains.find_by_name(
@ -31,7 +31,7 @@ Domain &Leaf_rule::_find_domain(Domain_tree &domains,
} }
Leaf_rule::Leaf_rule(Domain_tree &domains, Xml_node const &node) Leaf_rule::Leaf_rule(Domain_tree &domains, Xml_node const node)
: :
_domain(_find_domain(domains, node)) _domain(_find_domain(domains, node))
{ } { }

View File

@ -33,11 +33,11 @@ class Net::Leaf_rule : public Rule
Domain &_domain; Domain &_domain;
static Domain &_find_domain(Domain_tree &domains, static Domain &_find_domain(Domain_tree &domains,
Genode::Xml_node const &node); Genode::Xml_node const node);
public: public:
Leaf_rule(Domain_tree &domains, Genode::Xml_node const &node); Leaf_rule(Domain_tree &domains, Genode::Xml_node const node);
/*************** /***************

View File

@ -35,7 +35,7 @@ bool Nat_rule::higher(Nat_rule *rule)
Nat_rule::Nat_rule(Domain_tree &domains, Nat_rule::Nat_rule(Domain_tree &domains,
Port_allocator &tcp_port_alloc, Port_allocator &tcp_port_alloc,
Port_allocator &udp_port_alloc, Port_allocator &udp_port_alloc,
Xml_node const &node) Xml_node const node)
: :
Leaf_rule(domains, node), Leaf_rule(domains, node),
_tcp_port_alloc(tcp_port_alloc, node.attribute_value("tcp-ports", 0UL)), _tcp_port_alloc(tcp_port_alloc, node.attribute_value("tcp-ports", 0UL)),

View File

@ -43,7 +43,7 @@ class Net::Nat_rule : public Leaf_rule,
Nat_rule(Domain_tree &domains, Nat_rule(Domain_tree &domains,
Port_allocator &tcp_port_alloc, Port_allocator &tcp_port_alloc,
Port_allocator &udp_port_alloc, Port_allocator &udp_port_alloc,
Genode::Xml_node const &node); Genode::Xml_node const node);
Nat_rule &find_by_domain(Domain &domain); Nat_rule &find_by_domain(Domain &domain);

View File

@ -26,7 +26,7 @@ using namespace Genode;
** Permit_rule ** ** Permit_rule **
*****************/ *****************/
Permit_rule::Permit_rule(Domain_tree &domains, Xml_node const &node) Permit_rule::Permit_rule(Domain_tree &domains, Xml_node const node)
: :
Leaf_rule(domains, node) Leaf_rule(domains, node)
{ } { }
@ -42,7 +42,7 @@ void Permit_any_rule::print(Output &output) const
} }
Permit_any_rule::Permit_any_rule(Domain_tree &domains, Xml_node const &node) Permit_any_rule::Permit_any_rule(Domain_tree &domains, Xml_node const node)
: :
Permit_rule(domains, node) Permit_rule(domains, node)
{ } { }
@ -65,7 +65,7 @@ void Permit_single_rule::print(Output &output) const
Permit_single_rule::Permit_single_rule(Domain_tree &domains, Permit_single_rule::Permit_single_rule(Domain_tree &domains,
Xml_node const &node) Xml_node const node)
: :
Permit_rule(domains, node), Permit_rule(domains, node),
_port(node.attribute_value("port", Port(0))) _port(node.attribute_value("port", Port(0)))

View File

@ -34,7 +34,7 @@ namespace Net {
struct Net::Permit_rule : Leaf_rule struct Net::Permit_rule : Leaf_rule
{ {
Permit_rule(Domain_tree &domains, Genode::Xml_node const &node); Permit_rule(Domain_tree &domains, Genode::Xml_node const node);
/********* /*********
@ -47,7 +47,7 @@ struct Net::Permit_rule : Leaf_rule
struct Net::Permit_any_rule : Permit_rule struct Net::Permit_any_rule : Permit_rule
{ {
Permit_any_rule(Domain_tree &domains, Genode::Xml_node const &node); Permit_any_rule(Domain_tree &domains, Genode::Xml_node const node);
/********* /*********
@ -68,7 +68,7 @@ class Net::Permit_single_rule : public Permit_rule,
public: public:
Permit_single_rule(Domain_tree &domains, Permit_single_rule(Domain_tree &domains,
Genode::Xml_node const &node); Genode::Xml_node const node);
Permit_single_rule const &find_by_port(Port const port) const; Permit_single_rule const &find_by_port(Port const port) const;

View File

@ -25,7 +25,7 @@ using namespace Genode;
Permit_any_rule *Transport_rule::_read_permit_any(Domain_tree &domains, Permit_any_rule *Transport_rule::_read_permit_any(Domain_tree &domains,
Xml_node const &node, Xml_node const node,
Allocator &alloc) Allocator &alloc)
{ {
try { try {
@ -39,7 +39,7 @@ Permit_any_rule *Transport_rule::_read_permit_any(Domain_tree &domains,
Transport_rule::Transport_rule(Domain_tree &domains, Transport_rule::Transport_rule(Domain_tree &domains,
Xml_node const &node, Xml_node const node,
Allocator &alloc, Allocator &alloc,
Cstring const &protocol, Cstring const &protocol,
Configuration &config) Configuration &config)
@ -55,7 +55,7 @@ Transport_rule::Transport_rule(Domain_tree &domains,
} }
/* read specific permit rules */ /* read specific permit rules */
node.for_each_sub_node("permit", [&] (Xml_node const &node) { node.for_each_sub_node("permit", [&] (Xml_node const node) {
try { try {
Permit_single_rule &rule = *new (alloc) Permit_single_rule &rule = *new (alloc)
Permit_single_rule(domains, node); Permit_single_rule(domains, node);

View File

@ -37,13 +37,13 @@ class Net::Transport_rule : public Direct_rule<Transport_rule>
static Permit_any_rule * static Permit_any_rule *
_read_permit_any(Domain_tree &domains, _read_permit_any(Domain_tree &domains,
Genode::Xml_node const &node, Genode::Xml_node const node,
Genode::Allocator &alloc); Genode::Allocator &alloc);
public: public:
Transport_rule(Domain_tree &domains, Transport_rule(Domain_tree &domains,
Genode::Xml_node const &node, Genode::Xml_node const node,
Genode::Allocator &alloc, Genode::Allocator &alloc,
Genode::Cstring const &protocol, Genode::Cstring const &protocol,
Configuration &config); Configuration &config);