net: move MAC and IPV4 address to NET namespace

Ref #114
This commit is contained in:
Martin Stein 2016-08-15 12:50:33 +02:00 committed by Christian Helmuth
parent a8640f56d1
commit 0f8a39e5ac
24 changed files with 114 additions and 117 deletions

View File

@ -70,7 +70,7 @@ extern int dde_ipxe_nic_tx(unsigned if_index, const char *packet, unsigned packe
*
* \return 0 on success, -1 otherwise
*/
extern int dde_ipxe_nic_get_mac_addr(unsigned if_index, char *out_mac_addr);
extern int dde_ipxe_nic_get_mac_addr(unsigned if_index, unsigned char *out_mac_addr);
/**
* Get current link-state of device

View File

@ -271,7 +271,7 @@ int dde_ipxe_nic_tx(unsigned if_index, const char *packet, unsigned packet_len)
}
int dde_ipxe_nic_get_mac_addr(unsigned if_index, char *out_mac_addr)
int dde_ipxe_nic_get_mac_addr(unsigned if_index, unsigned char *out_mac_addr)
{
if (if_index != 1)
return -1;

View File

@ -198,26 +198,26 @@ class Net::Arp_packet
/**
* \return source MAC address.
*/
Ethernet_frame::Mac_address src_mac() {
return Ethernet_frame::Mac_address(&_src_mac_addr); }
Mac_address src_mac() {
return Mac_address(&_src_mac_addr); }
/**
* \return source IP address.
*/
Ipv4_packet::Ipv4_address src_ip() {
return Ipv4_packet::Ipv4_address(&_src_ip_addr); }
Ipv4_address src_ip() {
return Ipv4_address(&_src_ip_addr); }
/**
* \return destination MAC address.
*/
Ethernet_frame::Mac_address dst_mac() {
return Ethernet_frame::Mac_address(&_dst_mac_addr); }
Mac_address dst_mac() {
return Mac_address(&_dst_mac_addr); }
/**
* \return destination IP address.
*/
Ipv4_packet::Ipv4_address dst_ip() {
return Ipv4_packet::Ipv4_address(&_dst_ip_addr); }
Ipv4_address dst_ip() {
return Ipv4_address(&_dst_ip_addr); }
/******************************
@ -237,7 +237,7 @@ class Net::Arp_packet
*
* \param src_mac_addr MAC address to set.
*/
void src_mac(Ethernet_frame::Mac_address src_mac_addr) {
void src_mac(Mac_address src_mac_addr) {
src_mac_addr.copy(&_src_mac_addr); }
/**
@ -245,7 +245,7 @@ class Net::Arp_packet
*
* \param src_ip_addr IP address to set.
*/
void src_ip(Ipv4_packet::Ipv4_address src_ip_addr) {
void src_ip(Ipv4_address src_ip_addr) {
src_ip_addr.copy(&_src_ip_addr); }
/**
@ -253,7 +253,7 @@ class Net::Arp_packet
*
* \param src_mac_addr MAC address to set.
*/
void dst_mac(Ethernet_frame::Mac_address dst_mac_addr) {
void dst_mac(Mac_address dst_mac_addr) {
dst_mac_addr.copy(&_dst_mac_addr); }
/**
@ -261,7 +261,7 @@ class Net::Arp_packet
*
* \param src_ip_addr IP address to set.
*/
void dst_ip(Ipv4_packet::Ipv4_address dst_ip_addr) {
void dst_ip(Ipv4_address dst_ip_addr) {
dst_ip_addr.copy(&_dst_ip_addr); }

View File

@ -195,17 +195,17 @@ class Net::Dhcp_packet
bool broadcast() { return _flags & BROADCAST; }
Ipv4_packet::Ipv4_address ciaddr() {
return Ipv4_packet::Ipv4_address(&_ciaddr); }
Ipv4_packet::Ipv4_address yiaddr() {
return Ipv4_packet::Ipv4_address(&_yiaddr); }
Ipv4_packet::Ipv4_address siaddr() {
return Ipv4_packet::Ipv4_address(&_siaddr); }
Ipv4_packet::Ipv4_address giaddr() {
return Ipv4_packet::Ipv4_address(&_giaddr); }
Ipv4_address ciaddr() {
return Ipv4_address(&_ciaddr); }
Ipv4_address yiaddr() {
return Ipv4_address(&_yiaddr); }
Ipv4_address siaddr() {
return Ipv4_address(&_siaddr); }
Ipv4_address giaddr() {
return Ipv4_address(&_giaddr); }
Ethernet_frame::Mac_address client_mac() {
return Ethernet_frame::Mac_address(&_chaddr); }
Mac_address client_mac() {
return Mac_address(&_chaddr); }
const char* server_name() { return (const char*) &_sname; }
const char* file() { return (const char*) &_file; }
@ -239,16 +239,16 @@ class Net::Dhcp_packet
void broadcast(bool broadcast) {
_flags = broadcast ? BROADCAST : 0; }
void ciaddr(Ipv4_packet::Ipv4_address ciaddr) {
void ciaddr(Ipv4_address ciaddr) {
ciaddr.copy(&_ciaddr); }
void yiaddr(Ipv4_packet::Ipv4_address yiaddr) {
void yiaddr(Ipv4_address yiaddr) {
yiaddr.copy(&_yiaddr); }
void siaddr(Ipv4_packet::Ipv4_address siaddr) {
void siaddr(Ipv4_address siaddr) {
siaddr.copy(&_siaddr); }
void giaddr(Ipv4_packet::Ipv4_address giaddr) {
void giaddr(Ipv4_address giaddr) {
giaddr.copy(&_giaddr); }
void client_mac(Ethernet_frame::Mac_address mac) {
void client_mac(Mac_address mac) {
mac.copy(&_chaddr); }

View File

@ -16,11 +16,10 @@
/* Genode includes */
#include <base/exception.h>
#include <base/output.h>
#include <util/string.h>
#include <util/endian.h>
#include <net/netaddress.h>
#include <net/mac_address.h>
namespace Net { class Ethernet_frame; }
@ -44,21 +43,6 @@ class Net::Ethernet_frame
ADDR_LEN = 6, /* MAC address length in bytes */
};
struct Mac_address : Network_address<ADDR_LEN>
{
using Network_address<ADDR_LEN>::Network_address;
void print(Genode::Output &output) const
{
using namespace Genode;
for (unsigned i = 0; i < ADDR_LEN; i++) {
Genode::print(output, Hex(addr[i], Hex::OMIT_PREFIX,
Hex::PAD));
if (i < ADDR_LEN-1) output.out_char(':');
}
}
};
static const Mac_address BROADCAST; /* broadcast address */

View File

@ -16,13 +16,18 @@
/* Genode */
#include <base/exception.h>
#include <base/output.h>
#include <util/string.h>
#include <util/endian.h>
#include <net/netaddress.h>
namespace Net { class Ipv4_packet; }
namespace Net
{
enum { IPV4_ADDR_LEN = 4 };
typedef Network_address<IPV4_ADDR_LEN, '.', false> Ipv4_address;
class Ipv4_packet;
}
/**
@ -51,20 +56,7 @@ class Net::Ipv4_packet
public:
enum Size {
ADDR_LEN = 4, /* Ip address length in bytes */
};
struct Ipv4_address : Network_address<ADDR_LEN>
{
using Network_address<ADDR_LEN>::Network_address;
void print(Genode::Output &output) const
{
for (unsigned i = 0; i < ADDR_LEN; i++) {
Genode::print(output, (unsigned) addr[i]);
if (i < ADDR_LEN-1) output.out_char('.');
}
}
ADDR_LEN = IPV4_ADDR_LEN, /* Ip address length in bytes */
};
static const Ipv4_address CURRENT; /* current network */

View File

@ -0,0 +1,22 @@
/*
* \brief Ethernet network or MAC address
* \author Martin Stein
* \date 2016-06-22
*/
/*
* 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 _NET__MAC_ADDRESS_H_
#define _NET__MAC_ADDRESS_H_
/* OS includes */
#include <net/netaddress.h>
namespace Net { using Mac_address = Net::Network_address<6, ':', true>; }
#endif /* _NET__MAC_ADDRESS_H_ */

View File

@ -17,14 +17,15 @@
/* Genode */
#include <base/stdint.h>
#include <util/string.h>
#include <base/output.h>
namespace Net { template <unsigned> class Network_address; }
namespace Net { template <unsigned, char, bool> class Network_address; }
/**
* Generic form of a network address.
*/
template <unsigned LEN>
template <unsigned LEN, char DELIM, bool HEX>
struct Net::Network_address
{
Genode::uint8_t addr[LEN];
@ -47,6 +48,16 @@ struct Net::Network_address
void copy(void *dst) { Genode::memcpy(dst, addr, LEN); }
void print(Genode::Output &output) const
{
using namespace Genode;
for (unsigned i = 0; i < LEN; i++) {
if (!HEX) { Genode::print(output, (unsigned) addr[i]); }
else { Genode::print(output, Hex(addr[i], Hex::OMIT_PREFIX, Hex::PAD)); }
if (i < LEN - 1) output.out_char(DELIM);
}
}
/***************
** Operators **

View File

@ -110,8 +110,8 @@ class Net::Udp_packet
* | 4 bytes | 4 bytes | 1 byte | 1 byte | 2 bytes |
* --------------------------------------------------------------
*/
void calc_checksum(Ipv4_packet::Ipv4_address src,
Ipv4_packet::Ipv4_address dst)
void calc_checksum(Ipv4_address src,
Ipv4_address dst)
{
/* have to reset the checksum field for calculation */
_checksum = 0;

View File

@ -29,7 +29,7 @@ class Nic::Measurement
Timer::Connection &_timer;
Net::Ethernet_frame::Mac_address _mac;
Net::Mac_address _mac;
struct stat
{

View File

@ -15,16 +15,17 @@
#define _INCLUDE__NIC_SESSION__NIC_SESSION_H_
#include <dataspace/capability.h>
#include <base/output.h>
#include <base/signal.h>
#include <base/rpc.h>
#include <session/session.h>
#include <packet_stream_tx/packet_stream_tx.h>
#include <packet_stream_rx/packet_stream_rx.h>
#include <net/mac_address.h>
namespace Nic {
struct Mac_address;
using Mac_address = Net::Mac_address;
struct Session;
using Genode::Packet_stream_sink;
@ -34,22 +35,6 @@ namespace Nic {
}
struct Nic::Mac_address
{
enum { NUM_ELEM = 6 };
char addr[NUM_ELEM];
void print(Genode::Output &out) const
{
using Genode::Hex;
for (unsigned i = 0; i < NUM_ELEM; i++)
Genode::print(out, i > 0 ? ":" : "",
Hex(addr[i], Hex::OMIT_PREFIX, Hex::PAD));
}
};
/*
* NIC session interface
*

View File

@ -13,4 +13,4 @@
#include <net/ethernet.h>
const Net::Ethernet_frame::Mac_address Net::Ethernet_frame::BROADCAST(0xFF);
const Net::Mac_address Net::Ethernet_frame::BROADCAST(0xFF);

View File

@ -27,7 +27,7 @@ struct Scanner_policy_number
typedef ::Genode::Token<Scanner_policy_number> Token;
Ipv4_packet::Ipv4_address Ipv4_packet::ip_from_string(const char *ip)
Ipv4_address Ipv4_packet::ip_from_string(const char *ip)
{
Ipv4_address ip_addr;
Token t(ip);
@ -78,5 +78,5 @@ Genode::uint16_t Ipv4_packet::calculate_checksum(Ipv4_packet const &packet)
}
const Ipv4_packet::Ipv4_address Ipv4_packet::CURRENT((Genode::uint8_t)0x00);
const Ipv4_packet::Ipv4_address Ipv4_packet::BROADCAST((Genode::uint8_t)0xFF);
const Ipv4_address Ipv4_packet::CURRENT((Genode::uint8_t)0x00);
const Ipv4_address Ipv4_packet::BROADCAST((Genode::uint8_t)0xFF);

View File

@ -35,8 +35,8 @@ namespace Net {
*/
template <typename ADDRESS> class Address_node;
using Ipv4_address_node = Address_node<Ipv4_packet::Ipv4_address>;
using Mac_address_node = Address_node<Ethernet_frame::Mac_address>;
using Ipv4_address_node = Address_node<Ipv4_address>;
using Mac_address_node = Address_node<Mac_address>;
}

View File

@ -99,7 +99,7 @@ void Session_component::_unset_ipv4_node()
bool Session_component::link_state() { return _nic.link_state(); }
void Session_component::set_ipv4_address(Ipv4_packet::Ipv4_address ip_addr)
void Session_component::set_ipv4_address(Ipv4_address ip_addr)
{
_unset_ipv4_node();
_ipv4_node.addr(ip_addr);
@ -113,7 +113,7 @@ Session_component::Session_component(Genode::Ram_session &ram,
Genode::size_t amount,
Genode::size_t tx_buf_size,
Genode::size_t rx_buf_size,
Ethernet_frame::Mac_address vmac,
Mac_address vmac,
Net::Nic &nic,
char *ip_addr)
: Stream_allocator(ram, rm, amount),
@ -131,9 +131,9 @@ Session_component::Session_component(Genode::Ram_session &ram,
/* static ip parsing */
if (ip_addr != 0 && Genode::strlen(ip_addr)) {
Ipv4_packet::Ipv4_address ip = Ipv4_packet::ip_from_string(ip_addr);
Ipv4_address ip = Ipv4_packet::ip_from_string(ip_addr);
if (ip == Ipv4_packet::Ipv4_address()) {
if (ip == Ipv4_address()) {
Genode::warning("Empty or error ip address. Skipped.");
} else {
set_ipv4_address(ip);

View File

@ -120,15 +120,15 @@ class Net::Session_component : public Net::Stream_allocator,
* \param rx_buf_size buffer size for rx channel
* \param vmac virtual mac address
*/
Session_component(Genode::Ram_session &ram,
Genode::Region_map &rm,
Genode::Entrypoint &ep,
Genode::size_t amount,
Genode::size_t tx_buf_size,
Genode::size_t rx_buf_size,
Ethernet_frame::Mac_address vmac,
Net::Nic &nic,
char *ip_addr = 0);
Session_component(Genode::Ram_session &ram,
Genode::Region_map &rm,
Genode::Entrypoint &ep,
Genode::size_t amount,
Genode::size_t tx_buf_size,
Genode::size_t rx_buf_size,
Mac_address vmac,
Net::Nic &nic,
char *ip_addr = 0);
~Session_component();
@ -146,7 +146,7 @@ class Net::Session_component : public Net::Stream_allocator,
Genode::Signal_transmitter(_link_state_sigh).submit();
}
void set_ipv4_address(Ipv4_packet::Ipv4_address ip_addr);
void set_ipv4_address(Ipv4_address ip_addr);
/****************************************

View File

@ -18,4 +18,4 @@
* it's likely, that we will have no clashes here.
* (e.g. Linux uses 02:00... for its tap-devices.)
*/
Net::Ethernet_frame::Mac_address Net::Mac_allocator::mac_addr_base(0x02);
Net::Mac_address Net::Mac_allocator::mac_addr_base(0x02);

View File

@ -45,7 +45,7 @@ namespace Net {
/* reference MAC address */
static Ethernet_frame::Mac_address mac_addr_base;
static Mac_address mac_addr_base;
Mac_allocator() { Genode::memset(&_msbs, 0, sizeof(_msbs)); }
@ -56,12 +56,12 @@ namespace Net {
* \throws Alloc_failed if no more MAC addresses are available.
* \return MAC address
*/
Ethernet_frame::Mac_address alloc()
Mac_address alloc()
{
for (int i=0; i < MSB_MAX; i++) {
if (!_msbs[i].used) {
_msbs[i].used = 1;
Ethernet_frame::Mac_address mac = mac_addr_base;
Mac_address mac = mac_addr_base;
mac.addr[5] = i;
return mac;
}
@ -72,7 +72,7 @@ namespace Net {
/**
* Frees a formerly allocated MAC address.
*/
void free(Ethernet_frame::Mac_address mac) {
void free(Mac_address mac) {
_msbs[(unsigned)mac.addr[5]].used = 0; }
};
}

View File

@ -53,7 +53,7 @@ struct Main
handle_config();
/* show MAC address to use */
Net::Ethernet_frame::Mac_address mac(nic.mac());
Net::Mac_address mac(nic.mac());
Genode::log("--- NIC bridge started (mac=", mac, ") ---");
/* announce at parent */

View File

@ -42,7 +42,7 @@ bool Net::Nic::handle_arp(Ethernet_frame *eth, Genode::size_t size) {
* and destination MAC and IP addresses, and set the opcode
* to reply, and then push the packet back to the NIC driver.
*/
Ipv4_packet::Ipv4_address old_src_ip = arp->src_ip();
Ipv4_address old_src_ip = arp->src_ip();
arp->opcode(Arp_packet::REPLY);
arp->dst_mac(arp->src_mac());
arp->src_mac(mac());

View File

@ -33,14 +33,14 @@ class Net::Nic : public Net::Packet_handler
::Nic::Packet_allocator _tx_block_alloc;
::Nic::Connection _nic;
Ethernet_frame::Mac_address _mac;
Mac_address _mac;
public:
Nic(Genode::Entrypoint&, Genode::Heap&, Vlan&);
::Nic::Connection *nic() { return &_nic; }
Ethernet_frame::Mac_address mac() { return _mac; }
Mac_address mac() { return _mac; }
bool link_state() { return _nic.link_state(); }

View File

@ -58,7 +58,8 @@ class Nic::Loopback_component : public Nic::Session_component
Mac_address mac_address() override
{
Mac_address result = {{1,2,3,4,5,6}};
char buf[] = {1,2,3,4,5,6};
Mac_address result((void*)buf);
return result;
}

View File

@ -34,7 +34,7 @@ class Nic_worker : public Genode::Thread_deprecated<STACK_SIZE>
private:
Nic::Connection *_nic; /* nic-session */
Net::Ethernet_frame::Mac_address _mac;
Net::Mac_address _mac;
struct stat {
Genode::uint64_t size;

View File

@ -81,7 +81,7 @@ class Openvpn_component : public Tuntap_device,
{
private:
Nic::Mac_address _mac_addr {{ 0x02, 0x00, 0x00, 0x00, 0x00, 0x01 }};
Nic::Mac_address _mac_addr;
char const *_packet;
@ -138,6 +138,8 @@ class Openvpn_component : public Tuntap_device,
Server::Entrypoint &ep)
: Session_component(tx_buf_size, rx_buf_size, rx_block_md_alloc, ram_session, ep)
{
char buf[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x01 };
_mac_addr = Nic::Mac_address((void*)buf);
if (pipe(_pipefd)) {
Genode::error("could not create pipe");
throw Genode::Exception();