2016-08-25 17:48:53 +02:00
|
|
|
/*
|
|
|
|
* \brief Downlink interface in form of a NIC session component
|
|
|
|
* \author Martin Stein
|
|
|
|
* \date 2016-08-23
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _COMPONENT_H_
|
|
|
|
#define _COMPONENT_H_
|
|
|
|
|
|
|
|
/* Genode includes */
|
2016-09-12 12:55:12 +02:00
|
|
|
#include <base/allocator_guard.h>
|
2016-08-25 17:48:53 +02:00
|
|
|
#include <root/component.h>
|
|
|
|
#include <nic/packet_allocator.h>
|
|
|
|
#include <nic_session/rpc_object.h>
|
2016-09-12 12:55:12 +02:00
|
|
|
#include <nic_bridge/mac_allocator.h>
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
/* local includes */
|
|
|
|
#include <interface.h>
|
|
|
|
|
|
|
|
namespace Net {
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
class Domain;
|
2016-08-25 17:48:53 +02:00
|
|
|
class Communication_buffer;
|
2016-09-12 12:55:12 +02:00
|
|
|
class Session_component_base;
|
2016-08-25 17:48:53 +02:00
|
|
|
class Session_component;
|
|
|
|
class Root;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
class Net::Communication_buffer : public Genode::Ram_dataspace_capability
|
2016-08-25 17:48:53 +02:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Genode::Ram_session &_ram;
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Communication_buffer(Genode::Ram_session &ram,
|
|
|
|
Genode::size_t const size);
|
2016-08-25 17:48:53 +02:00
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
~Communication_buffer() { _ram.free(*this); }
|
2016-08-25 17:48:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
class Net::Session_component_base
|
2016-08-25 17:48:53 +02:00
|
|
|
{
|
2016-09-12 12:55:12 +02:00
|
|
|
protected:
|
2016-08-25 17:48:53 +02:00
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Genode::Allocator_guard _guarded_alloc;
|
|
|
|
Nic::Packet_allocator _range_alloc;
|
|
|
|
Communication_buffer _tx_buf;
|
|
|
|
Communication_buffer _rx_buf;
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Session_component_base(Genode::Allocator &guarded_alloc_backing,
|
|
|
|
Genode::size_t const guarded_alloc_amount,
|
|
|
|
Genode::Ram_session &buf_ram,
|
|
|
|
Genode::size_t const tx_buf_size,
|
|
|
|
Genode::size_t const rx_buf_size);
|
2016-08-25 17:48:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
class Net::Session_component : public Session_component_base,
|
|
|
|
public ::Nic::Session_rpc_object,
|
|
|
|
public Interface
|
2016-08-25 17:48:53 +02:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
/********************
|
|
|
|
** Net::Interface **
|
|
|
|
********************/
|
|
|
|
|
|
|
|
Packet_stream_sink &_sink() { return *_tx.sink(); }
|
|
|
|
Packet_stream_source &_source() { return *_rx.source(); }
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Session_component(Genode::Allocator &alloc,
|
|
|
|
Genode::Timer &timer,
|
|
|
|
Genode::size_t const amount,
|
|
|
|
Genode::Ram_session &buf_ram,
|
|
|
|
Genode::size_t const tx_buf_size,
|
|
|
|
Genode::size_t const rx_buf_size,
|
|
|
|
Mac_address const mac,
|
|
|
|
Genode::Entrypoint &ep,
|
|
|
|
Mac_address const &router_mac,
|
|
|
|
Domain &domain);
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
/******************
|
|
|
|
** Nic::Session **
|
|
|
|
******************/
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Mac_address mac_address() { return _mac; }
|
2016-08-25 17:48:53 +02:00
|
|
|
bool link_state();
|
|
|
|
void link_state_sigh(Genode::Signal_context_capability sigh);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Net::Root : public Genode::Root_component<Session_component>
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Genode::Timer &_timer;
|
|
|
|
Mac_allocator _mac_alloc;
|
|
|
|
Genode::Entrypoint &_ep;
|
|
|
|
Mac_address const _router_mac;
|
|
|
|
Configuration &_config;
|
|
|
|
Genode::Ram_session &_buf_ram;
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
/********************
|
|
|
|
** Root_component **
|
|
|
|
********************/
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Session_component *_create_session(char const *args);
|
2016-08-25 17:48:53 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-09-12 12:55:12 +02:00
|
|
|
Root(Genode::Entrypoint &ep,
|
|
|
|
Genode::Timer &timer,
|
|
|
|
Genode::Allocator &alloc,
|
|
|
|
Mac_address const &router_mac,
|
|
|
|
Configuration &config,
|
|
|
|
Genode::Ram_session &buf_ram);
|
2016-08-25 17:48:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _COMPONENT_H_ */
|