mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-23 07:22:25 +00:00
15821e32ec
This commit includes changes to the Nic::Session_component interface. We now pass the entire env to the component instead of only ram, rm and the ep because we need the env to open connections from within the Session_component implemenation. So far only the cadence_gem driver needs this, though. Issue #2280.
76 lines
2.1 KiB
C++
76 lines
2.1 KiB
C++
/**
|
|
* \brief Simple single client NIC Root
|
|
* \author Sebastian Sumpf
|
|
* \date 2015-06-23
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2015-2017 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.
|
|
*/
|
|
|
|
#ifndef _INCLUDE__NIC__ROOT_H_
|
|
#define _INCLUDE__NIC__ROOT_H_
|
|
|
|
#include <nic/component.h>
|
|
#include <root/component.h>
|
|
|
|
namespace Nic {
|
|
using namespace Genode;
|
|
|
|
template <class SESSION_COMPONENT> class Root;
|
|
};
|
|
|
|
|
|
template <class SESSION_COMPONENT>
|
|
class Nic::Root : public Genode::Root_component<SESSION_COMPONENT,
|
|
Genode::Single_client>
|
|
{
|
|
private:
|
|
|
|
Env &_env;
|
|
Allocator &_md_alloc;
|
|
|
|
protected:
|
|
|
|
SESSION_COMPONENT *_create_session(const char *args)
|
|
{
|
|
using namespace Genode;
|
|
|
|
size_t ram_quota = Arg_string::find_arg(args, "ram_quota" ).ulong_value(0);
|
|
size_t tx_buf_size = Arg_string::find_arg(args, "tx_buf_size").ulong_value(0);
|
|
size_t rx_buf_size = Arg_string::find_arg(args, "rx_buf_size").ulong_value(0);
|
|
|
|
/* deplete ram quota by the memory needed for the session structure */
|
|
size_t session_size = max(4096UL, (unsigned long)sizeof(SESSION_COMPONENT));
|
|
if (ram_quota < session_size)
|
|
throw Genode::Root::Quota_exceeded();
|
|
|
|
/*
|
|
* Check if donated ram quota suffices for both communication
|
|
* buffers and check for overflow
|
|
*/
|
|
if (tx_buf_size + rx_buf_size < tx_buf_size ||
|
|
tx_buf_size + rx_buf_size > ram_quota - session_size) {
|
|
Genode::error("insufficient 'ram_quota', got ", ram_quota, ", "
|
|
"need ", tx_buf_size + rx_buf_size + session_size);
|
|
throw Genode::Root::Quota_exceeded();
|
|
}
|
|
|
|
return new (Root::md_alloc())
|
|
SESSION_COMPONENT(tx_buf_size, rx_buf_size,
|
|
_md_alloc, _env);
|
|
}
|
|
|
|
public:
|
|
|
|
Root(Genode::Env &env, Genode::Allocator &md_alloc)
|
|
: Genode::Root_component<SESSION_COMPONENT, Genode::Single_client>(&env.ep().rpc_ep(), &md_alloc),
|
|
_env(env), _md_alloc(md_alloc)
|
|
{ }
|
|
};
|
|
|
|
#endif /* _INCLUDE__NIC__ROOT_H_ */
|