2016-09-12 12:55:12 +02:00
|
|
|
/*
|
|
|
|
* \brief Reflects an effective domain configuration node
|
|
|
|
* \author Martin Stein
|
|
|
|
* \date 2016-08-19
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2017-02-20 13:23:52 +01:00
|
|
|
* Copyright (C) 2016-2017 Genode Labs GmbH
|
2016-09-12 12:55:12 +02:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
2017-02-20 13:23:52 +01:00
|
|
|
* under the terms of the GNU Affero General Public License version 3.
|
2016-09-12 12:55:12 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _DOMAIN_H_
|
|
|
|
#define _DOMAIN_H_
|
|
|
|
|
|
|
|
/* local includes */
|
|
|
|
#include <forward_rule.h>
|
|
|
|
#include <transport_rule.h>
|
|
|
|
#include <nat_rule.h>
|
|
|
|
#include <ip_rule.h>
|
2017-12-13 17:02:01 +01:00
|
|
|
#include <arp_cache.h>
|
2016-09-12 12:55:12 +02:00
|
|
|
#include <port_allocator.h>
|
|
|
|
#include <pointer.h>
|
2017-10-13 16:22:05 +02:00
|
|
|
#include <ipv4_config.h>
|
2017-10-16 13:07:49 +02:00
|
|
|
#include <dhcp_server.h>
|
2017-12-13 17:02:01 +01:00
|
|
|
#include <interface.h>
|
2016-09-12 12:55:12 +02:00
|
|
|
|
|
|
|
/* Genode includes */
|
|
|
|
#include <util/avl_string.h>
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
#include <util/reconstructible.h>
|
2016-09-12 12:55:12 +02:00
|
|
|
|
2017-12-14 16:24:42 +01:00
|
|
|
namespace Genode {
|
|
|
|
|
|
|
|
class Xml_generator;
|
|
|
|
class Allocator;
|
|
|
|
}
|
2016-09-12 12:55:12 +02:00
|
|
|
|
|
|
|
namespace Net {
|
|
|
|
|
|
|
|
class Interface;
|
|
|
|
class Configuration;
|
|
|
|
class Domain_avl_member;
|
|
|
|
class Domain_base;
|
|
|
|
class Domain;
|
|
|
|
class Domain_tree;
|
|
|
|
using Domain_name = Genode::String<160>;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class Net::Domain_avl_member : public Genode::Avl_string_base
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
|
|
|
Domain &_domain;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
Domain_avl_member(Domain_name const &name,
|
|
|
|
Domain &domain);
|
|
|
|
|
|
|
|
|
|
|
|
/***************
|
|
|
|
** Accessors **
|
|
|
|
***************/
|
|
|
|
|
|
|
|
Domain &domain() const { return _domain; }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Net::Domain_base
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
|
|
|
|
Domain_name const _name;
|
|
|
|
|
2016-12-06 14:39:17 +01:00
|
|
|
Domain_base(Genode::Xml_node const node);
|
2016-09-12 12:55:12 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2018-03-23 02:43:00 +01:00
|
|
|
class Net::Domain : public Domain_base,
|
|
|
|
public List<Domain>::Element
|
2016-09-12 12:55:12 +02:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
Domain_avl_member _avl_member;
|
|
|
|
Configuration &_config;
|
|
|
|
Genode::Xml_node _node;
|
|
|
|
Genode::Allocator &_alloc;
|
2018-03-23 02:43:00 +01:00
|
|
|
Ip_rule_list _ip_rules { };
|
|
|
|
Forward_rule_tree _tcp_forward_rules { };
|
|
|
|
Forward_rule_tree _udp_forward_rules { };
|
|
|
|
Transport_rule_list _tcp_rules { };
|
|
|
|
Transport_rule_list _udp_rules { };
|
|
|
|
Port_allocator _tcp_port_alloc { };
|
|
|
|
Port_allocator _udp_port_alloc { };
|
|
|
|
Nat_rule_tree _nat_rules { };
|
|
|
|
Interface_list _interfaces { };
|
|
|
|
unsigned long _interface_cnt { 0 };
|
|
|
|
Pointer<Dhcp_server> _dhcp_server { };
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
Genode::Reconstructible<Ipv4_config> _ip_config;
|
2018-03-23 02:43:00 +01:00
|
|
|
List<Domain> _ip_config_dependents { };
|
|
|
|
Arp_cache _arp_cache { *this };
|
|
|
|
Arp_waiter_list _foreign_arp_waiters { };
|
|
|
|
Link_side_tree _tcp_links { };
|
|
|
|
Link_side_tree _udp_links { };
|
|
|
|
Genode::size_t _tx_bytes { 0 };
|
|
|
|
Genode::size_t _rx_bytes { 0 };
|
|
|
|
bool const _verbose_packets { false };
|
2016-09-12 12:55:12 +02:00
|
|
|
|
|
|
|
void _read_forward_rules(Genode::Cstring const &protocol,
|
|
|
|
Domain_tree &domains,
|
2016-12-06 14:39:17 +01:00
|
|
|
Genode::Xml_node const node,
|
2016-09-12 12:55:12 +02:00
|
|
|
char const *type,
|
|
|
|
Forward_rule_tree &rules);
|
|
|
|
|
|
|
|
void _read_transport_rules(Genode::Cstring const &protocol,
|
|
|
|
Domain_tree &domains,
|
2016-12-06 14:39:17 +01:00
|
|
|
Genode::Xml_node const node,
|
2016-09-12 12:55:12 +02:00
|
|
|
char const *type,
|
|
|
|
Transport_rule_list &rules);
|
|
|
|
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
void _ip_config_changed();
|
|
|
|
|
2018-03-19 19:16:17 +01:00
|
|
|
void __FIXME__dissolve_foreign_arp_waiters();
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
public:
|
|
|
|
|
|
|
|
struct Invalid : Genode::Exception { };
|
|
|
|
struct No_next_hop : Genode::Exception { };
|
|
|
|
|
|
|
|
Domain(Configuration &config,
|
2016-12-06 14:39:17 +01:00
|
|
|
Genode::Xml_node const node,
|
2016-09-12 12:55:12 +02:00
|
|
|
Genode::Allocator &alloc);
|
|
|
|
|
2017-10-06 13:00:05 +02:00
|
|
|
~Domain();
|
|
|
|
|
2018-03-22 21:06:11 +01:00
|
|
|
void init(Domain_tree &domains);
|
2016-09-12 12:55:12 +02:00
|
|
|
|
|
|
|
Ipv4_address const &next_hop(Ipv4_address const &ip) const;
|
|
|
|
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
void ip_config(Ipv4_address ip,
|
|
|
|
Ipv4_address subnet_mask,
|
2018-03-23 00:30:04 +01:00
|
|
|
Ipv4_address gateway,
|
|
|
|
Ipv4_address dns_server);
|
nic_router: DHCP client functionality
If the attribute 'interface' is not set in a 'domain' tag, the router tries to
dynamically receive and maintain an IP configuration for that domain by using
DHCP in the client role at all interfaces that connect to the domain. In the
DHCP discover phase, the router simply chooses the first DHCP offer that
arrives. So, no comparison of different DHCP offers is done. In the DHCP
request phase, the server is expected to provide an IP address, a gateway, a
subnet mask, and an IP lease time to the router. If anything substantial goes
wrong during a DHCP exchange, the router discards the outcome of the exchange
and goes back to the DHCP discover phase. At any time where there is no valid
IP configuration present at a domain, the domain does only act as DHCP client
and all other router functionality is disabled for the domain. A domain cannot
act as DHCP client and DHCP server at once. So, a 'domain' tag must either
have an 'interface' attribute or must not contain a 'dhcp-server' tag.
Ref #2534
2017-10-16 11:31:43 +02:00
|
|
|
|
|
|
|
void discard_ip_config();
|
|
|
|
|
2017-12-13 17:02:01 +01:00
|
|
|
Link_side_tree &links(L3_protocol const protocol);
|
|
|
|
|
2018-02-07 18:38:49 +01:00
|
|
|
void attach_interface(Interface &interface);
|
2017-12-13 17:02:01 +01:00
|
|
|
|
2018-02-07 18:38:49 +01:00
|
|
|
void detach_interface(Interface &interface);
|
2017-12-13 17:02:01 +01:00
|
|
|
|
2017-12-14 16:24:42 +01:00
|
|
|
void raise_rx_bytes(Genode::size_t bytes) { _rx_bytes += bytes; }
|
|
|
|
|
|
|
|
void raise_tx_bytes(Genode::size_t bytes) { _tx_bytes += bytes; }
|
|
|
|
|
|
|
|
void report(Genode::Xml_generator &xml);
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
|
|
|
|
/*********
|
|
|
|
** log **
|
|
|
|
*********/
|
|
|
|
|
|
|
|
void print(Genode::Output &output) const;
|
|
|
|
|
|
|
|
|
|
|
|
/***************
|
|
|
|
** Accessors **
|
|
|
|
***************/
|
|
|
|
|
2018-02-04 15:58:25 +01:00
|
|
|
bool verbose_packets() const { return _verbose_packets; }
|
|
|
|
Ipv4_config const &ip_config() const { return *_ip_config; }
|
2018-03-23 02:43:00 +01:00
|
|
|
List<Domain> &ip_config_dependents() { return _ip_config_dependents; }
|
2018-03-19 19:16:17 +01:00
|
|
|
Domain_name const &name() const { return _name; }
|
2018-02-04 15:58:25 +01:00
|
|
|
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; }
|
2018-03-19 19:16:17 +01:00
|
|
|
Interface_list &interfaces() { return _interfaces; }
|
2018-02-04 15:58:25 +01:00
|
|
|
Configuration &config() const { return _config; }
|
|
|
|
Domain_avl_member &avl_member() { return _avl_member; }
|
2018-03-22 22:53:32 +01:00
|
|
|
Dhcp_server &dhcp_server();
|
2018-02-04 15:58:25 +01:00
|
|
|
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; }
|
2016-09-12 12:55:12 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct Net::Domain_tree : Genode::Avl_tree<Genode::Avl_string_base>
|
|
|
|
{
|
|
|
|
using Avl_tree = Genode::Avl_tree<Genode::Avl_string_base>;
|
|
|
|
|
|
|
|
struct No_match : Genode::Exception { };
|
|
|
|
|
|
|
|
static Domain &domain(Genode::Avl_string_base const &node);
|
|
|
|
|
|
|
|
Domain &find_by_name(Domain_name name);
|
|
|
|
|
|
|
|
template <typename FUNC>
|
|
|
|
void for_each(FUNC && functor) const {
|
|
|
|
Avl_tree::for_each([&] (Genode::Avl_string_base const &node) {
|
|
|
|
functor(domain(node));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void insert(Domain &domain) { Avl_tree::insert(&domain.avl_member()); }
|
2018-03-07 13:57:49 +01:00
|
|
|
|
|
|
|
void destroy_each(Genode::Deallocator &dealloc);
|
2016-09-12 12:55:12 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _DOMAIN_H_ */
|