mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-19 21:57:55 +00:00
net: move Ipv4_address_prefix to nic_router
As this tool is not used by any other component make it local to the NIC router to keep the net-lib interface small. Ref #2534
This commit is contained in:
parent
50aba6f21b
commit
0ca248551a
@ -30,8 +30,6 @@ namespace Net
|
|||||||
|
|
||||||
class Ipv4_address;
|
class Ipv4_address;
|
||||||
|
|
||||||
class Ipv4_address_prefix;
|
|
||||||
|
|
||||||
class Ipv4_packet;
|
class Ipv4_packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,61 +220,9 @@ class Net::Ipv4_packet
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
struct Net::Ipv4_address_prefix
|
|
||||||
{
|
|
||||||
Ipv4_address address;
|
|
||||||
Genode::uint8_t prefix = 32;
|
|
||||||
|
|
||||||
bool valid() const { return address.valid() || !prefix; }
|
|
||||||
|
|
||||||
void print(Genode::Output &output) const;
|
|
||||||
|
|
||||||
bool prefix_matches(Ipv4_address const &ip) const;
|
|
||||||
|
|
||||||
Ipv4_address subnet_mask() const
|
|
||||||
{
|
|
||||||
Ipv4_address result;
|
|
||||||
if (prefix >= 8) {
|
|
||||||
|
|
||||||
result.addr[0] = 0xff;
|
|
||||||
|
|
||||||
if (prefix >= 16) {
|
|
||||||
|
|
||||||
result.addr[1] = 0xff;
|
|
||||||
|
|
||||||
if (prefix >= 24) {
|
|
||||||
|
|
||||||
result.addr[2] = 0xff;
|
|
||||||
result.addr[3] = 0xff << (32 - prefix);
|
|
||||||
} else {
|
|
||||||
result.addr[2] = 0xff << (24 - prefix);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.addr[1] = 0xff << (16 - prefix);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.addr[0] = 0xff << (8 - prefix);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ipv4_address broadcast_address() const
|
|
||||||
{
|
|
||||||
Ipv4_address result = address;
|
|
||||||
Ipv4_address const mask = subnet_mask();
|
|
||||||
for (unsigned i = 0; i < 4; i++) {
|
|
||||||
result.addr[i] |= ~mask.addr[i];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
|
|
||||||
inline size_t ascii_to(char const *s, Net::Ipv4_address &result);
|
inline size_t ascii_to(char const *s, Net::Ipv4_address &result);
|
||||||
|
|
||||||
inline size_t ascii_to(char const *s, Net::Ipv4_address_prefix &result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -310,30 +256,4 @@ Genode::size_t Genode::ascii_to(char const *s, Net::Ipv4_address &result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Genode::size_t Genode::ascii_to(char const *s, Net::Ipv4_address_prefix &result)
|
|
||||||
{
|
|
||||||
/* read the leading IPv4 address, fail if there's no address */
|
|
||||||
Net::Ipv4_address_prefix buf;
|
|
||||||
size_t read_len = ascii_to(s, buf.address);
|
|
||||||
if (!read_len) {
|
|
||||||
return 0; }
|
|
||||||
|
|
||||||
/* check for the following slash */
|
|
||||||
s += read_len;
|
|
||||||
if (*s != '/') {
|
|
||||||
return 0; }
|
|
||||||
read_len++;
|
|
||||||
s++;
|
|
||||||
|
|
||||||
/* read the prefix, fail if there's no prefix */
|
|
||||||
size_t prefix_len = ascii_to_unsigned(s, buf.prefix, 10);
|
|
||||||
if (!prefix_len) {
|
|
||||||
return 0; }
|
|
||||||
|
|
||||||
/* fill result and return read length */
|
|
||||||
result = buf;
|
|
||||||
return read_len + prefix_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _IPV4_H_ */
|
#endif /* _IPV4_H_ */
|
||||||
|
@ -149,24 +149,3 @@ Genode::uint16_t Ipv4_packet::calculate_checksum(Ipv4_packet const &packet)
|
|||||||
|
|
||||||
const Ipv4_address Ipv4_packet::CURRENT((Genode::uint8_t)0x00);
|
const Ipv4_address Ipv4_packet::CURRENT((Genode::uint8_t)0x00);
|
||||||
const Ipv4_address Ipv4_packet::BROADCAST((Genode::uint8_t)0xFF);
|
const Ipv4_address Ipv4_packet::BROADCAST((Genode::uint8_t)0xFF);
|
||||||
|
|
||||||
|
|
||||||
void Ipv4_address_prefix::print(Genode::Output &output) const
|
|
||||||
{
|
|
||||||
Genode::print(output, address, "/", prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Ipv4_address_prefix::prefix_matches(Ipv4_address const &ip) const
|
|
||||||
{
|
|
||||||
uint8_t prefix_left = prefix;
|
|
||||||
uint8_t byte = 0;
|
|
||||||
for (; prefix_left >= 8; prefix_left -= 8, byte++) {
|
|
||||||
if (ip.addr[byte] != address.addr[byte]) {
|
|
||||||
return false; }
|
|
||||||
}
|
|
||||||
if (prefix_left == 0) {
|
|
||||||
return true; }
|
|
||||||
|
|
||||||
uint8_t const mask = ~(0xff >> prefix_left);
|
|
||||||
return !((ip.addr[byte] ^ address.addr[byte]) & mask);
|
|
||||||
}
|
|
||||||
|
@ -14,14 +14,14 @@
|
|||||||
#ifndef _DIRECT_RULE_H_
|
#ifndef _DIRECT_RULE_H_
|
||||||
#define _DIRECT_RULE_H_
|
#define _DIRECT_RULE_H_
|
||||||
|
|
||||||
|
/* local includes */
|
||||||
|
#include <ipv4_address_prefix.h>
|
||||||
|
#include <rule.h>
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <net/ipv4.h>
|
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
#include <util/xml_node.h>
|
#include <util/xml_node.h>
|
||||||
|
|
||||||
/* local includes */
|
|
||||||
#include <rule.h>
|
|
||||||
|
|
||||||
namespace Genode { class Xml_node; }
|
namespace Genode { class Xml_node; }
|
||||||
|
|
||||||
namespace Net {
|
namespace Net {
|
||||||
|
79
repos/os/src/server/nic_router/ipv4_address_prefix.cc
Normal file
79
repos/os/src/server/nic_router/ipv4_address_prefix.cc
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* \brief Ipv4 address combined with a subnet prefix length
|
||||||
|
* \author Martin Stein
|
||||||
|
* \date 2017-10-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* local includes */
|
||||||
|
#include <ipv4_address_prefix.h>
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
using namespace Net;
|
||||||
|
|
||||||
|
|
||||||
|
Ipv4_address Ipv4_address_prefix::subnet_mask() const
|
||||||
|
{
|
||||||
|
Ipv4_address result;
|
||||||
|
if (prefix >= 8) {
|
||||||
|
|
||||||
|
result.addr[0] = 0xff;
|
||||||
|
|
||||||
|
if (prefix >= 16) {
|
||||||
|
|
||||||
|
result.addr[1] = 0xff;
|
||||||
|
|
||||||
|
if (prefix >= 24) {
|
||||||
|
|
||||||
|
result.addr[2] = 0xff;
|
||||||
|
result.addr[3] = 0xff << (32 - prefix);
|
||||||
|
} else {
|
||||||
|
result.addr[2] = 0xff << (24 - prefix);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.addr[1] = 0xff << (16 - prefix);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.addr[0] = 0xff << (8 - prefix);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Ipv4_address_prefix::print(Genode::Output &output) const
|
||||||
|
{
|
||||||
|
Genode::print(output, address, "/", prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Ipv4_address_prefix::prefix_matches(Ipv4_address const &ip) const
|
||||||
|
{
|
||||||
|
uint8_t prefix_left = prefix;
|
||||||
|
uint8_t byte = 0;
|
||||||
|
for (; prefix_left >= 8; prefix_left -= 8, byte++) {
|
||||||
|
if (ip.addr[byte] != address.addr[byte]) {
|
||||||
|
return false; }
|
||||||
|
}
|
||||||
|
if (prefix_left == 0) {
|
||||||
|
return true; }
|
||||||
|
|
||||||
|
uint8_t const mask = ~(0xff >> prefix_left);
|
||||||
|
return !((ip.addr[byte] ^ address.addr[byte]) & mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Ipv4_address Ipv4_address_prefix::broadcast_address() const
|
||||||
|
{
|
||||||
|
Ipv4_address result = address;
|
||||||
|
Ipv4_address const mask = subnet_mask();
|
||||||
|
for (unsigned i = 0; i < 4; i++) {
|
||||||
|
result.addr[i] |= ~mask.addr[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
71
repos/os/src/server/nic_router/ipv4_address_prefix.h
Normal file
71
repos/os/src/server/nic_router/ipv4_address_prefix.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* \brief Ipv4 address combined with a subnet prefix length
|
||||||
|
* \author Martin Stein
|
||||||
|
* \date 2017-10-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IPV4_ADDRESS_PREFIX_H_
|
||||||
|
#define _IPV4_ADDRESS_PREFIX_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <net/ipv4.h>
|
||||||
|
|
||||||
|
namespace Net { class Ipv4_address_prefix; }
|
||||||
|
|
||||||
|
|
||||||
|
struct Net::Ipv4_address_prefix
|
||||||
|
{
|
||||||
|
Ipv4_address address;
|
||||||
|
Genode::uint8_t prefix { 32 };
|
||||||
|
|
||||||
|
bool valid() const { return address.valid() || prefix == 0; }
|
||||||
|
|
||||||
|
void print(Genode::Output &output) const;
|
||||||
|
|
||||||
|
bool prefix_matches(Ipv4_address const &ip) const;
|
||||||
|
|
||||||
|
Ipv4_address subnet_mask() const;
|
||||||
|
|
||||||
|
Ipv4_address broadcast_address() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
namespace Genode {
|
||||||
|
|
||||||
|
inline size_t ascii_to(char const *s, Net::Ipv4_address_prefix &result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Genode::size_t Genode::ascii_to(char const *s, Net::Ipv4_address_prefix &result)
|
||||||
|
{
|
||||||
|
/* read the leading IPv4 address, fail if there's no address */
|
||||||
|
Net::Ipv4_address_prefix buf;
|
||||||
|
size_t read_len = ascii_to(s, buf.address);
|
||||||
|
if (!read_len) {
|
||||||
|
return 0; }
|
||||||
|
|
||||||
|
/* check for the following slash */
|
||||||
|
s += read_len;
|
||||||
|
if (*s != '/') {
|
||||||
|
return 0; }
|
||||||
|
read_len++;
|
||||||
|
s++;
|
||||||
|
|
||||||
|
/* read the prefix, fail if there's no prefix */
|
||||||
|
size_t prefix_len = ascii_to_unsigned(s, buf.prefix, 10);
|
||||||
|
if (!prefix_len) {
|
||||||
|
return 0; }
|
||||||
|
|
||||||
|
/* fill result and return read length */
|
||||||
|
result = buf;
|
||||||
|
return read_len + prefix_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _IPV4_ADDRESS_PREFIX_H_ */
|
@ -2,7 +2,7 @@ TARGET = nic_router
|
|||||||
|
|
||||||
LIBS += base net
|
LIBS += base net
|
||||||
|
|
||||||
SRC_CC += arp_waiter.cc ip_rule.cc
|
SRC_CC += arp_waiter.cc ip_rule.cc ipv4_address_prefix.cc
|
||||||
SRC_CC += component.cc port_allocator.cc forward_rule.cc
|
SRC_CC += component.cc port_allocator.cc forward_rule.cc
|
||||||
SRC_CC += nat_rule.cc mac_allocator.cc main.cc
|
SRC_CC += nat_rule.cc mac_allocator.cc main.cc
|
||||||
SRC_CC += uplink.cc interface.cc arp_cache.cc configuration.cc
|
SRC_CC += uplink.cc interface.cc arp_cache.cc configuration.cc
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
#include <interface.h>
|
#include <interface.h>
|
||||||
|
#include <ipv4_address_prefix.h>
|
||||||
|
|
||||||
namespace Net { class Uplink; }
|
namespace Net { class Uplink; }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user