diff --git a/repos/dde_ipxe/include/dde_ipxe/nic.h b/repos/dde_ipxe/include/dde_ipxe/nic.h index 470227d606..555e6d0cf7 100644 --- a/repos/dde_ipxe/include/dde_ipxe/nic.h +++ b/repos/dde_ipxe/include/dde_ipxe/nic.h @@ -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 diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c index de53ff9ef6..42b43dc027 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c +++ b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c @@ -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; diff --git a/repos/os/include/net/arp.h b/repos/os/include/net/arp.h index 229541ef70..daf9279157 100644 --- a/repos/os/include/net/arp.h +++ b/repos/os/include/net/arp.h @@ -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); } diff --git a/repos/os/include/net/dhcp.h b/repos/os/include/net/dhcp.h index da492d0b01..603b48b3ac 100644 --- a/repos/os/include/net/dhcp.h +++ b/repos/os/include/net/dhcp.h @@ -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); } diff --git a/repos/os/include/net/ethernet.h b/repos/os/include/net/ethernet.h index fe67f0832a..0bc45834ff 100644 --- a/repos/os/include/net/ethernet.h +++ b/repos/os/include/net/ethernet.h @@ -16,11 +16,10 @@ /* Genode includes */ #include -#include #include #include -#include +#include 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 - { - using Network_address::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 */ diff --git a/repos/os/include/net/ipv4.h b/repos/os/include/net/ipv4.h index fca7e0a541..cc4a10cb71 100644 --- a/repos/os/include/net/ipv4.h +++ b/repos/os/include/net/ipv4.h @@ -16,13 +16,18 @@ /* Genode */ #include -#include #include #include #include -namespace Net { class Ipv4_packet; } +namespace Net +{ + enum { IPV4_ADDR_LEN = 4 }; + typedef Network_address 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 - { - using Network_address::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 */ diff --git a/repos/os/include/net/mac_address.h b/repos/os/include/net/mac_address.h new file mode 100644 index 0000000000..1e2df63272 --- /dev/null +++ b/repos/os/include/net/mac_address.h @@ -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 + +namespace Net { using Mac_address = Net::Network_address<6, ':', true>; } + +#endif /* _NET__MAC_ADDRESS_H_ */ diff --git a/repos/os/include/net/netaddress.h b/repos/os/include/net/netaddress.h index 7124e121b1..5f0bfd1260 100644 --- a/repos/os/include/net/netaddress.h +++ b/repos/os/include/net/netaddress.h @@ -17,14 +17,15 @@ /* Genode */ #include #include +#include -namespace Net { template class Network_address; } +namespace Net { template class Network_address; } /** * Generic form of a network address. */ -template +template 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 ** diff --git a/repos/os/include/net/udp.h b/repos/os/include/net/udp.h index ba482a2ea2..6646925ce1 100644 --- a/repos/os/include/net/udp.h +++ b/repos/os/include/net/udp.h @@ -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; diff --git a/repos/os/include/nic/stat.h b/repos/os/include/nic/stat.h index a6755c1d57..826bf34863 100644 --- a/repos/os/include/nic/stat.h +++ b/repos/os/include/nic/stat.h @@ -29,7 +29,7 @@ class Nic::Measurement Timer::Connection &_timer; - Net::Ethernet_frame::Mac_address _mac; + Net::Mac_address _mac; struct stat { diff --git a/repos/os/include/nic_session/nic_session.h b/repos/os/include/nic_session/nic_session.h index 93e573c73b..0bf34e929f 100644 --- a/repos/os/include/nic_session/nic_session.h +++ b/repos/os/include/nic_session/nic_session.h @@ -15,16 +15,17 @@ #define _INCLUDE__NIC_SESSION__NIC_SESSION_H_ #include -#include #include #include #include #include #include +#include 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 * diff --git a/repos/os/src/lib/net/ethernet.cc b/repos/os/src/lib/net/ethernet.cc index 4c290481bb..bb009a7698 100644 --- a/repos/os/src/lib/net/ethernet.cc +++ b/repos/os/src/lib/net/ethernet.cc @@ -13,4 +13,4 @@ #include -const Net::Ethernet_frame::Mac_address Net::Ethernet_frame::BROADCAST(0xFF); +const Net::Mac_address Net::Ethernet_frame::BROADCAST(0xFF); diff --git a/repos/os/src/lib/net/ipv4.cc b/repos/os/src/lib/net/ipv4.cc index fdb98a897e..2e8e32fd53 100644 --- a/repos/os/src/lib/net/ipv4.cc +++ b/repos/os/src/lib/net/ipv4.cc @@ -27,7 +27,7 @@ struct Scanner_policy_number typedef ::Genode::Token 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); diff --git a/repos/os/src/server/nic_bridge/address_node.h b/repos/os/src/server/nic_bridge/address_node.h index f02c34e723..47df44e7b1 100644 --- a/repos/os/src/server/nic_bridge/address_node.h +++ b/repos/os/src/server/nic_bridge/address_node.h @@ -35,8 +35,8 @@ namespace Net { */ template class Address_node; - using Ipv4_address_node = Address_node; - using Mac_address_node = Address_node; + using Ipv4_address_node = Address_node; + using Mac_address_node = Address_node; } diff --git a/repos/os/src/server/nic_bridge/component.cc b/repos/os/src/server/nic_bridge/component.cc index b56ef8d467..a6ced95a3e 100644 --- a/repos/os/src/server/nic_bridge/component.cc +++ b/repos/os/src/server/nic_bridge/component.cc @@ -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); diff --git a/repos/os/src/server/nic_bridge/component.h b/repos/os/src/server/nic_bridge/component.h index 844ee7d1eb..4474528008 100644 --- a/repos/os/src/server/nic_bridge/component.h +++ b/repos/os/src/server/nic_bridge/component.h @@ -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); /**************************************** diff --git a/repos/os/src/server/nic_bridge/mac.cc b/repos/os/src/server/nic_bridge/mac.cc index 02931c7713..9beaef30d5 100644 --- a/repos/os/src/server/nic_bridge/mac.cc +++ b/repos/os/src/server/nic_bridge/mac.cc @@ -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); diff --git a/repos/os/src/server/nic_bridge/mac.h b/repos/os/src/server/nic_bridge/mac.h index a8366ca11f..04df21988f 100644 --- a/repos/os/src/server/nic_bridge/mac.h +++ b/repos/os/src/server/nic_bridge/mac.h @@ -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; } }; } diff --git a/repos/os/src/server/nic_bridge/main.cc b/repos/os/src/server/nic_bridge/main.cc index d318e88144..de7bc3feb7 100644 --- a/repos/os/src/server/nic_bridge/main.cc +++ b/repos/os/src/server/nic_bridge/main.cc @@ -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 */ diff --git a/repos/os/src/server/nic_bridge/nic.cc b/repos/os/src/server/nic_bridge/nic.cc index 3a4881e238..a7ceab1b3b 100644 --- a/repos/os/src/server/nic_bridge/nic.cc +++ b/repos/os/src/server/nic_bridge/nic.cc @@ -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()); diff --git a/repos/os/src/server/nic_bridge/nic.h b/repos/os/src/server/nic_bridge/nic.h index 2111b738e4..02fc068c8c 100644 --- a/repos/os/src/server/nic_bridge/nic.h +++ b/repos/os/src/server/nic_bridge/nic.h @@ -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(); } diff --git a/repos/os/src/server/nic_loopback/main.cc b/repos/os/src/server/nic_loopback/main.cc index 14b903f299..67a5d8b4f0 100644 --- a/repos/os/src/server/nic_loopback/main.cc +++ b/repos/os/src/server/nic_loopback/main.cc @@ -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; } diff --git a/repos/os/src/test/nic_raw/main.cc b/repos/os/src/test/nic_raw/main.cc index 4ed5ac0b39..fcfa39e263 100644 --- a/repos/os/src/test/nic_raw/main.cc +++ b/repos/os/src/test/nic_raw/main.cc @@ -34,7 +34,7 @@ class Nic_worker : public Genode::Thread_deprecated private: Nic::Connection *_nic; /* nic-session */ - Net::Ethernet_frame::Mac_address _mac; + Net::Mac_address _mac; struct stat { Genode::uint64_t size; diff --git a/repos/ports/src/app/openvpn/main.cc b/repos/ports/src/app/openvpn/main.cc index 4185c5b32e..040788fe96 100644 --- a/repos/ports/src/app/openvpn/main.cc +++ b/repos/ports/src/app/openvpn/main.cc @@ -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();