2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 05:27:55 +00:00

[2396] Add methods to IOAddress: toBytes(), isV4() and isV6()

This commit is contained in:
Stephen Morris 2012-12-04 13:23:07 +00:00
parent 1545ba5efd
commit 8bc5490b0e
3 changed files with 80 additions and 2 deletions

View File

@ -76,6 +76,21 @@ IOAddress::fromBytes(short family, const uint8_t* data) {
return IOAddress(string(addr_str));
}
std::vector<uint8_t>
IOAddress::toBytes() const {
if (asio_address_.is_v4()) {
const asio::ip::address_v4::bytes_type bytes4 =
asio_address_.to_v4().to_bytes();
return (std::vector<uint8_t>(bytes4.begin(), bytes4.end()));
}
// Not V4 address, so must be a V6 address (else we could never construct
// this object).
const asio::ip::address_v6::bytes_type bytes6 =
asio_address_.to_v6().to_bytes();
return (std::vector<uint8_t>(bytes6.begin(), bytes6.end()));
}
short
IOAddress::getFamily() const {
if (asio_address_.is_v4()) {

View File

@ -24,6 +24,7 @@
#include <functional>
#include <string>
#include <vector>
#include <exceptions/exceptions.h>
@ -103,6 +104,19 @@ public:
/// \return AF_INET for IPv4 or AF_INET6 for IPv6.
short getFamily() const;
/// \brief Convenience function to check for an IPv4 address
///
/// \return true if the address is a V4 address
bool isV4() const {
return (asio_address_.is_v4());
}
/// \brief Convenience function to check for an IPv6 address
///
/// \return true if the address is a V6 address
bool isV6() const {
return (asio_address_.is_v6());
}
/// \brief Creates an address from over wire data.
///
@ -110,8 +124,13 @@ public:
/// \param data pointer to first char of data
///
/// \return Created IOAddress object
static IOAddress
fromBytes(short family, const uint8_t* data);
static IOAddress fromBytes(short family, const uint8_t* data);
/// \brief Return address as set of bytes
///
/// \return Contents of the address as a set of bytes in network-byte
/// order.
std::vector<uint8_t> toBytes() const;
/// \brief Compare addresses for equality
///

View File

@ -18,7 +18,9 @@
#include <asiolink/io_error.h>
#include <asiolink/io_address.h>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace isc::asiolink;
@ -84,6 +86,48 @@ TEST(IOAddressTest, fromBytes) {
EXPECT_EQ(addr.toText(), IOAddress("192.0.2.3").toText());
}
TEST(IOAddressTest, toBytes) {
// Address and network byte-order representation of the address.
const char* V4STRING = "192.0.2.1";
uint8_t V4[] = {0xc0, 0x00, 0x02, 0x01};
const char* V6STRING = "2001:db8:1::dead:beef";
uint8_t V6[] = {
0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef
};
// Do the V4 check.
IOAddress v4address(V4STRING);
std::vector<uint8_t> v4bytes = v4address.toBytes();
EXPECT_EQ(sizeof(V4), v4bytes.size());
EXPECT_TRUE(std::equal(v4bytes.begin(), v4bytes.end(), &V4[0]));
// Do the same for V6.
IOAddress v6address(V6STRING);
std::vector<uint8_t> v6bytes = v6address.toBytes();
EXPECT_EQ(sizeof(V6), v6bytes.size());
EXPECT_TRUE(std::equal(v6bytes.begin(), v6bytes.end(), &V6[0]));
}
TEST(IOAddressTest, isV4) {
const IOAddress address4("192.0.2.1");
const IOAddress address6("2001:db8:1::dead:beef");
EXPECT_TRUE(address4.isV4());
EXPECT_FALSE(address6.isV4());
}
TEST(IOAddressTest, isV6) {
const IOAddress address4("192.0.2.1");
const IOAddress address6("2001:db8:1::dead:beef");
EXPECT_FALSE(address4.isV6());
EXPECT_TRUE(address6.isV6());
}
TEST(IOAddressTest, uint32) {
IOAddress addr1("192.0.2.5");