diff --git a/dde_ipxe/src/drivers/nic/main.cc b/dde_ipxe/src/drivers/nic/main.cc index 4eae04191..86f71438c 100644 --- a/dde_ipxe/src/drivers/nic/main.cc +++ b/dde_ipxe/src/drivers/nic/main.cc @@ -56,11 +56,11 @@ namespace Ipxe { PINF("--- init rx_callbacks"); dde_ipxe_nic_register_rx_callback(dde_rx_handler); - PINF("--- get MAC address"); dde_ipxe_nic_get_mac_addr(1, _mac_addr.addr); - PINF(" %02x:%02x:%02x:%02x:%02x:%02x", - _mac_addr.addr[0], _mac_addr.addr[1], _mac_addr.addr[2], - _mac_addr.addr[3], _mac_addr.addr[4], _mac_addr.addr[5]); + PINF("--- get MAC address %02x:%02x:%02x:%02x:%02x:%02x", + _mac_addr.addr[0] & 0xff, _mac_addr.addr[1] & 0xff, + _mac_addr.addr[2] & 0xff, _mac_addr.addr[3] & 0xff, + _mac_addr.addr[4] & 0xff, _mac_addr.addr[5] & 0xff); } void rx_handler(const char *packet, unsigned packet_len) diff --git a/dde_ipxe/src/drivers/nic_stat/main.cc b/dde_ipxe/src/drivers/nic_stat/main.cc new file mode 100644 index 000000000..ea0ccf8d9 --- /dev/null +++ b/dde_ipxe/src/drivers/nic_stat/main.cc @@ -0,0 +1,164 @@ +/* + * \brief NIC driver based on iPXE for performance measurements solely + * \author Christian Helmuth + * \date 2011-11-17 + */ + +/* + * Copyright (C) 2011-2013 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 */ +#include +#include +#include +#include +#include + +#include +#include +#include + +/* DDE */ +extern "C" { +#include +} + + +namespace Ipxe { + + class Driver : public Nic::Driver + { + public: + + static Driver *instance; + + static void dde_rx_handler(unsigned if_index, + const char *packet, + unsigned packet_len) + { + instance->rx_handler_stat(packet, packet_len); + } + + private: + + Nic::Mac_address _mac_addr; + Nic::Rx_buffer_alloc &_alloc; + + Timer::Connection _timer; + Nic::Measurement _stat; + + public: + + Driver(Nic::Rx_buffer_alloc &alloc) + : _alloc(alloc), _stat(_timer) + { + PINF("--- init iPXE NIC"); + int cnt = dde_ipxe_nic_init(); + PINF(" number of devices: %d", cnt); + + PINF("--- init rx_callbacks"); + dde_ipxe_nic_register_rx_callback(dde_rx_handler); + + dde_ipxe_nic_get_mac_addr(1, _mac_addr.addr); + PINF("--- get MAC address %02x:%02x:%02x:%02x:%02x:%02x", + _mac_addr.addr[0] & 0xff, _mac_addr.addr[1] & 0xff, + _mac_addr.addr[2] & 0xff, _mac_addr.addr[3] & 0xff, + _mac_addr.addr[4] & 0xff, _mac_addr.addr[5] & 0xff); + + _stat.set_mac(_mac_addr.addr); + } + + void rx_handler_stat(const char *packet, unsigned packet_len) + { + Genode::addr_t test = reinterpret_cast(packet); + void * buffer = reinterpret_cast(test); + + Net::Ethernet_frame *eth = + new (buffer) Net::Ethernet_frame(packet_len); + _stat.data(eth, packet_len); + } + + void rx_handler(const char *packet, unsigned packet_len) + { + void *buffer = _alloc.alloc(packet_len); + Genode::memcpy(buffer, packet, packet_len); + + _alloc.submit(); + } + + + /*************************** + ** Nic::Driver interface ** + ***************************/ + + Nic::Mac_address mac_address() { return _mac_addr; } + + void tx(char const *packet, Genode::size_t size) + { + if (dde_ipxe_nic_tx(1, packet, size)) + PWRN("Sending packet failed!"); + } + + /****************************** + ** Irq_activation interface ** + ******************************/ + + void handle_irq(int) { /* not used */ } + }; + + class Driver_factory : public Nic::Driver_factory + { + Nic::Driver *create(Nic::Rx_buffer_alloc &alloc) + { + Driver::instance = new (Genode::env()->heap()) Ipxe::Driver(alloc); + return Driver::instance; + } + + void destroy(Nic::Driver *) + { + Genode::destroy(Genode::env()->heap(), Driver::instance); + Driver::instance = 0; + } + }; + +} /* namespace Ipxe */ + + +Ipxe::Driver * Ipxe::Driver::instance = 0; + + +int main(int, char **) +{ + using namespace Genode; + + printf("--- iPXE NIC driver started ---\n"); + + /** + * Factory used by 'Nic::Root' at session creation/destruction time + */ + static Ipxe::Driver_factory driver_factory; + + enum { STACK_SIZE = 2*sizeof(addr_t)*1024 }; + static Cap_connection cap; + static Rpc_entrypoint ep(&cap, STACK_SIZE, "nic_ep"); + + static Nic::Root nic_root(&ep, env()->heap(), driver_factory); + env()->parent()->announce(ep.manage(&nic_root)); + +/* + Genode::size_t tx_buf_size = 64*1024; + Genode::size_t rx_buf_size = 64*1024; + session("ram_quota=%zd, tx_buf_size=%zd, rx_buf_size=%zd", + 6*4096 + tx_buf_size + rx_buf_size, + tx_buf_size, rx_buf_size)) +*/ + nic_root.session("ram_quota=155648, tx_buf_size=65536, rx_buf_size=65536"); + + sleep_forever(); + return 0; +} + diff --git a/dde_ipxe/src/drivers/nic_stat/target.mk b/dde_ipxe/src/drivers/nic_stat/target.mk new file mode 100644 index 000000000..6e5b405f4 --- /dev/null +++ b/dde_ipxe/src/drivers/nic_stat/target.mk @@ -0,0 +1,3 @@ +TARGET = nic_drv_stat +LIBS = dde_ipxe_nic net-stat +SRC_CC = main.cc