genode/repos/os/src/server/nic_router/permit_rule.cc

107 lines
2.1 KiB
C++

/*
* \brief Rule for permitting ports in the context of a transport rule
* \author Martin Stein
* \date 2016-08-19
*/
/*
* Copyright (C) 2016 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
/* Genode includes */
#include <base/log.h>
/* local includes */
#include <permit_rule.h>
#include <domain.h>
using namespace Net;
using namespace Genode;
/*****************
** Permit_rule **
*****************/
Permit_rule::Permit_rule(Domain_tree &domains, Xml_node const &node)
:
Leaf_rule(domains, node)
{ }
/*********************
** Permit_any_rule **
*********************/
void Permit_any_rule::print(Output &output) const
{
Genode::print(output, "requests to ", _domain);
}
Permit_any_rule::Permit_any_rule(Domain_tree &domains, Xml_node const &node)
:
Permit_rule(domains, node)
{ }
/************************
** Permit_single_rule **
************************/
bool Permit_single_rule::higher(Permit_single_rule *rule)
{
return rule->_port > _port;
}
void Permit_single_rule::print(Output &output) const
{
Genode::print(output, "port ", _port, " requests to ", _domain);
}
Permit_single_rule::Permit_single_rule(Domain_tree &domains,
Xml_node const &node)
:
Permit_rule(domains, node),
_port(node.attribute_value("port", 0UL))
{
if (!_port || dynamic_port(_port)) {
throw Invalid(); }
}
Permit_single_rule const &
Permit_single_rule::find_by_port(uint16_t const port) const
{
if (port == _port) {
return *this; }
bool const side = port > _port;
Permit_single_rule *const rule = Avl_node<Permit_single_rule>::child(side);
if (!rule) {
throw Permit_single_rule_tree::No_match(); }
return rule->find_by_port(port);
}
/*****************************
** Permit_single_rule_tree **
*****************************/
Permit_single_rule const &
Permit_single_rule_tree::find_by_port(uint16_t const port) const
{
Permit_single_rule *const rule = first();
if (!rule) {
throw No_match(); }
return rule->find_by_port(port);
}