1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-29 13:04:28 +01:00

Allow masking IPv4/6 and HW addresses

This commit is contained in:
Matias Fontanini
2016-03-19 15:44:55 -07:00
parent 1f4be63d08
commit 3773443fc8
13 changed files with 127 additions and 33 deletions

View File

@@ -63,7 +63,7 @@ ADD_CUSTOM_TARGET(
ICMPv6Test
IPTest
IPReassemblerTest
IPAddressTest
IPv4AddressTest
IPSecTest
IPv6Test
IPv6AddressTest
@@ -102,16 +102,16 @@ ADD_EXECUTABLE(DHCPv6Test EXCLUDE_FROM_ALL dhcpv6.cpp)
ADD_EXECUTABLE(DNSTest EXCLUDE_FROM_ALL dns.cpp)
ADD_EXECUTABLE(Dot1QTest EXCLUDE_FROM_ALL dot1q.cpp)
ADD_EXECUTABLE(EthernetTest EXCLUDE_FROM_ALL ethernetII.cpp)
ADD_EXECUTABLE(HWAddressTest EXCLUDE_FROM_ALL hwaddress.cpp)
ADD_EXECUTABLE(HWAddressTest EXCLUDE_FROM_ALL hw_address.cpp)
ADD_EXECUTABLE(ICMPExtensionTest EXCLUDE_FROM_ALL icmp_extension.cpp)
ADD_EXECUTABLE(ICMPTest EXCLUDE_FROM_ALL icmp.cpp)
ADD_EXECUTABLE(ICMPv6Test EXCLUDE_FROM_ALL icmpv6.cpp)
ADD_EXECUTABLE(IPTest EXCLUDE_FROM_ALL ip.cpp)
ADD_EXECUTABLE(IPReassemblerTest EXCLUDE_FROM_ALL ip_reassembler.cpp)
ADD_EXECUTABLE(IPAddressTest EXCLUDE_FROM_ALL ipaddress.cpp)
ADD_EXECUTABLE(IPv4AddressTest EXCLUDE_FROM_ALL ip_address.cpp)
ADD_EXECUTABLE(IPSecTest EXCLUDE_FROM_ALL ipsec.cpp)
ADD_EXECUTABLE(IPv6Test EXCLUDE_FROM_ALL ipv6.cpp)
ADD_EXECUTABLE(IPv6AddressTest EXCLUDE_FROM_ALL ipv6address.cpp)
ADD_EXECUTABLE(IPv6AddressTest EXCLUDE_FROM_ALL ipv6_address.cpp)
ADD_EXECUTABLE(LLCTest EXCLUDE_FROM_ALL llc.cpp)
ADD_EXECUTABLE(LoopbackTest EXCLUDE_FROM_ALL loopback.cpp)
ADD_EXECUTABLE(MPLSTest EXCLUDE_FROM_ALL mpls.cpp)
@@ -190,7 +190,7 @@ ADD_TEST(ICMP ICMPTest)
ADD_TEST(ICMPv6 ICMPv6Test)
ADD_TEST(IP IPTest)
ADD_TEST(IPReassembler IPReassemblerTest)
ADD_TEST(IPAddress IPAddressTest)
ADD_TEST(IPv4Address IPv4AddressTest)
ADD_TEST(IPSec IPSecTest)
ADD_TEST(IPv6 IPv6Test)
ADD_TEST(IPv6Address IPv6AddressTest)

View File

@@ -159,3 +159,35 @@ TEST_F(AddressRangeTest, Slash) {
EXPECT_TRUE(range2.is_iterable());
}
}
TEST_F(AddressRangeTest, SlashUsingAddressGreaterThanMask) {
// v4
{
IPv4Range range1 = IPv4Range::from_mask("192.168.0.128", "255.255.255.0");
IPv4Range range2 = IPv4Address("192.168.0.0") / 24;
EXPECT_TRUE(std::equal(range1.begin(), range1.end(), range2.begin()));
EXPECT_TRUE(std::equal(range2.begin(), range2.end(), range1.begin()));
EXPECT_TRUE(range1.is_iterable());
EXPECT_TRUE(range2.is_iterable());
}
// v6
{
IPv6Range range1 = IPv6Range::from_mask("dead:beef::1200",
"ffff:ffff:ffff:ffff:ffff:ffff:ffff::");
IPv6Range range2 = IPv6Address("dead:beef::") / 112;
EXPECT_TRUE(std::equal(range1.begin(), range1.end(), range2.begin()));
EXPECT_TRUE(std::equal(range2.begin(), range2.end(), range1.begin()));
EXPECT_TRUE(range1.is_iterable());
EXPECT_TRUE(range2.is_iterable());
}
{
typedef AddressRange<HWAddress<6> > HWAddressRange;
HWAddressRange range1 = HWAddressRange::from_mask("de:ad:be:ef:fe:00",
"ff:ff:ff:ef:00:00");
HWAddressRange range2 = HWAddress<6>("de:ad:be:ef:00:00") / 32;
EXPECT_TRUE(std::equal(range1.begin(), range1.end(), range2.begin()));
EXPECT_TRUE(std::equal(range2.begin(), range2.end(), range1.begin()));
EXPECT_TRUE(range1.is_iterable());
EXPECT_TRUE(range2.is_iterable());
}
}

View File

@@ -107,3 +107,11 @@ TEST_F(HWAddressTest, OutputOperator) {
oss << addr;
EXPECT_EQ(oss.str(), address);
}
TEST_F(HWAddressTest, Mask) {
typedef HWAddress<6> address_type;
EXPECT_EQ(
address_type("de:ad:be:e0:00:00"),
address_type("de:ad:be:ef:00:00") & address_type("ff:ff:ff:f0:00:00")
);
}

View File

@@ -101,3 +101,14 @@ TEST(IPAddressTest, IsUnicast) {
EXPECT_TRUE(IPv4Address("240.0.0.0").is_unicast());
EXPECT_TRUE(IPv4Address("127.0.0.1").is_unicast());
}
TEST(IPAddressTest, Mask) {
EXPECT_EQ(
IPv4Address("192.168.100.0"),
IPv4Address("192.168.100.1") & IPv4Address("255.255.255.0")
);
EXPECT_EQ(
IPv4Address("192.128.0.0"),
IPv4Address("192.255.1.2") & IPv4Address("255.128.0.0")
);
}

View File

@@ -106,3 +106,21 @@ TEST(IPv6AddressTest, FromPrefixLength) {
EXPECT_EQ(IPv6Address("ffff:ffff::"), IPv6Address::from_prefix_length(32));
}
TEST(IPv6AddressTest, MaskAddress) {
EXPECT_EQ(
IPv6Address("deaf:beef::"),
IPv6Address("deaf:beef:adad:beef::") & IPv6Address("ffff:ffff::")
);
EXPECT_EQ(
IPv6Address("deaf:be00::"),
IPv6Address("deaf:beef:adad:beef::") & IPv6Address("ffff:ff00::")
);
EXPECT_EQ(
IPv6Address("deaf:b000::"),
IPv6Address("deaf:beef:adad:beef::") & IPv6Address("ffff:f000::")
);
EXPECT_EQ(
IPv6Address("deaf:a000::"),
IPv6Address("deaf:beef:adad:beef::") & IPv6Address("ffff:e000::")
);
}