39 memcpy(m_Bytes.data(), &addrAsInt,
sizeof(addrAsInt));
58 IPv4Address(
const std::array<uint8_t, 4>& bytes) : m_Bytes(bytes)
67 inline uint32_t
toInt()
const;
72 return m_Bytes.data();
100 uint32_t intVal =
toInt();
101 std::reverse(
reinterpret_cast<uint8_t*
>(&intVal),
reinterpret_cast<uint8_t*
>(&intVal) +
sizeof(intVal));
103 uint32_t rhsIntVal = rhs.
toInt();
104 std::reverse(
reinterpret_cast<uint8_t*
>(&rhsIntVal),
105 reinterpret_cast<uint8_t*
>(&rhsIntVal) +
sizeof(rhsIntVal));
107 return intVal < rhsIntVal;
115 return !(*
this == rhs);
150 std::array<uint8_t, 4> m_Bytes = { 0 };
158 memcpy(&addr, m_Bytes.data(), m_Bytes.size() *
sizeof(uint8_t));
186 IPv6Address(
const std::array<uint8_t, 16>& bytes) : m_Bytes(bytes)
198 return m_Bytes.data();
237 return !(*
this == rhs);
245 PCPP_DEPRECATED(
"Use copyToNewBuffer instead.")
246 void
copyTo(uint8_t** arr,
size_t& length) const;
268 size_t copyTo(uint8_t* buffer,
size_t size)
const;
312 std::array<uint8_t, 16> m_Bytes = { 0 };
426 return !(*
this == rhs);
441 return rhs.
isIPv4() ? (m_IPv4 == rhs.m_IPv4) :
false;
444 return rhs.
isIPv6() ? m_IPv6 == rhs.m_IPv6 :
false;
453 return rhs.
isIPv4() ? (m_IPv4 < rhs.m_IPv4) :
true;
455 return rhs.
isIPv6() ? m_IPv6 < rhs.m_IPv6 :
false;
523 return m_NetworkPrefix;
552 uint32_t m_NetworkPrefix{};
555 static bool isValidNetmask(
const IPv4Address& netmaskAddress);
556 void initFromAddressAndPrefixLength(
const IPv4Address& address, uint8_t prefixLen);
557 void initFromAddressAndNetmask(
const IPv4Address& address,
const IPv4Address& netmaskAddress);
611 return { m_NetworkPrefix };
640 uint8_t m_NetworkPrefix[16]{};
641 uint8_t m_Mask[16]{};
643 static bool isValidNetmask(
const IPv6Address& netmaskAddress);
644 void initFromAddressAndPrefixLength(
const IPv6Address& address, uint8_t prefixLen);
645 void initFromAddressAndNetmask(
const IPv6Address& address,
const IPv6Address& netmaskAddress);
713 catch (
const std::invalid_argument&)
729 m_NetworkVariant = other.m_NetworkVariant;
738 m_NetworkVariant = other;
747 m_NetworkVariant = other;
755 auto ip4 = m_NetworkVariant.tryGetIPv4();
758 return ip4->getPrefixLen();
761 return m_NetworkVariant.getIPv6().getPrefixLen();
768 auto ip4 = m_NetworkVariant.tryGetIPv4();
771 return ip4->getNetmask();
774 return m_NetworkVariant.getIPv6().getNetmask();
781 auto ip4 = m_NetworkVariant.tryGetIPv4();
784 return IPAddress(ip4->getNetworkPrefix());
787 return IPAddress(m_NetworkVariant.getIPv6().getNetworkPrefix());
794 auto ip4 = m_NetworkVariant.tryGetIPv4();
797 return IPAddress(ip4->getLowestAddress());
799 return IPAddress(m_NetworkVariant.getIPv6().getLowestAddress());
806 auto ip4 = m_NetworkVariant.tryGetIPv4();
809 return IPAddress(ip4->getHighestAddress());
812 return IPAddress(m_NetworkVariant.getIPv6().getHighestAddress());
820 auto ip4 = m_NetworkVariant.tryGetIPv4();
823 return ip4->getTotalAddressCount();
825 return m_NetworkVariant.getIPv6().getTotalAddressCount();
831 return m_NetworkVariant.getType() == NetworkVariant::Type::IPv4;
837 return m_NetworkVariant.getType() == NetworkVariant::Type::IPv6;
844 auto ip4 = m_NetworkVariant.tryGetIPv4();
851 return ip4->includes(address.
getIPv4());
859 return m_NetworkVariant.getIPv6().includes(address.
getIPv6());
866 auto ip4 = m_NetworkVariant.tryGetIPv4();
869 auto otherIp4 = network.m_NetworkVariant.tryGetIPv4();
870 if (otherIp4 ==
nullptr)
874 return ip4->includes(*otherIp4);
877 auto& ip6 = m_NetworkVariant.getIPv6();
878 auto otherIp6 = network.m_NetworkVariant.tryGetIPv6();
879 if (otherIp6 ==
nullptr)
883 return ip6.includes(*otherIp6);
890 auto ip4 = m_NetworkVariant.tryGetIPv4();
893 return ip4->toString();
896 return m_NetworkVariant.getIPv6().toString();
910 NetworkVariant() : m_Type(Type::
IPv4), m_IPv4Net(IPv4Address::Zero)
912 NetworkVariant(IPv4Network
const& net) : m_Type(Type::
IPv4), m_IPv4Net(net)
914 NetworkVariant(IPv6Network
const& net) : m_Type(Type::
IPv6), m_IPv6Net(net)
921 NetworkVariant&
operator=(IPv4Network
const& other)
927 NetworkVariant&
operator=(IPv6Network
const& other)
933 NetworkVariant&
operator=(NetworkVariant
const& other)
935 swapTo(other.m_Type);
936 switch (other.m_Type)
939 m_IPv4Net = other.m_IPv4Net;
942 m_IPv6Net = other.m_IPv6Net;
948 Type getType() const noexcept
953 IPv4Network& getIPv4()
955 throwIfNot(Type::IPv4);
959 IPv4Network
const& getIPv4()
const
961 throwIfNot(Type::IPv4);
965 IPv4Network* tryGetIPv4() noexcept
967 return (m_Type == Type::IPv4) ? &m_IPv4Net :
nullptr;
969 IPv4Network
const* tryGetIPv4() const noexcept
971 return (m_Type == Type::IPv4) ? &m_IPv4Net :
nullptr;
974 IPv6Network& getIPv6()
976 throwIfNot(Type::IPv6);
980 IPv6Network
const& getIPv6()
const
982 throwIfNot(Type::IPv6);
986 IPv6Network* tryGetIPv6() noexcept
988 return (m_Type == Type::IPv6) ? &m_IPv6Net :
nullptr;
990 IPv6Network
const* tryGetIPv6() const noexcept
992 return (m_Type == Type::IPv6) ? &m_IPv6Net :
nullptr;
996 void throwIfNot(Type type)
const
1000 throw std::runtime_error(
"Bad variant access");
1004 void swapTo(Type newType) noexcept;
1005 void destroyActiveMem() noexcept;
1009 IPv4Network m_IPv4Net;
1010 IPv6Network m_IPv6Net;
1014 NetworkVariant m_NetworkVariant;
1019 inline IPv4Address
operator""_ipv4(
const char* addrString, std::size_t size)
1021 return IPv4Address(std::string(addrString, size));
1024 inline IPv6Address
operator""_ipv6(
const char* addrString, std::size_t size)
1026 return IPv6Address(std::string(addrString, size));
1030 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPv4Address& ipv4Address)
1036 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPv6Address& ipv6Address)
1042 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPAddress& ipAddress)
1048 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPv4Network& network)
1054 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPv6Network& network)
1060 inline std::ostream& operator<<(std::ostream& oss,
const pcpp::IPNetwork& network)
Definition: IpAddress.h:318
IPAddress()
A default constructor that creates an instance of the class with unspecified IPv4 address.
Definition: IpAddress.h:330
std::string toString() const
Definition: IpAddress.h:367
AddressType
An enum representing the address type: IPv4 or IPv6.
Definition: IpAddress.h:322
@ IPv6AddressType
IPv6 address type.
Definition: IpAddress.h:326
@ IPv4AddressType
IPv4 address type.
Definition: IpAddress.h:324
const IPv4Address & getIPv4() const
Definition: IpAddress.h:393
bool operator!=(const IPAddress &rhs) const
Definition: IpAddress.h:424
const IPv6Address & getIPv6() const
Definition: IpAddress.h:400
IPAddress(const std::string &addrAsString)
IPAddress(const IPv4Address &addr)
Definition: IpAddress.h:335
AddressType getType() const
Definition: IpAddress.h:360
bool operator<(const IPAddress &rhs) const
Definition: IpAddress.h:447
bool isIPv4() const
Definition: IpAddress.h:373
bool isZero() const
Definition: IpAddress.h:406
IPAddress & operator=(const IPv4Address &addr)
Definition: IpAddress.h:458
bool isIPv6() const
Definition: IpAddress.h:379
bool isMulticast() const
Definition: IpAddress.h:386
bool operator==(const IPAddress &rhs) const
Definition: IpAddress.h:437
IPAddress(const IPv6Address &addr)
Definition: IpAddress.h:340
Definition: IpAddress.h:651
IPAddress getHighestAddress() const
Definition: IpAddress.h:804
IPNetwork & operator=(const IPv6Network &other)
Definition: IpAddress.h:745
IPAddress getLowestAddress() const
Definition: IpAddress.h:792
bool includes(const IPAddress &address) const
Definition: IpAddress.h:842
bool isIPv6Network() const
Definition: IpAddress.h:835
bool includes(const IPNetwork &network) const
Definition: IpAddress.h:864
std::string toString() const
Definition: IpAddress.h:888
bool isIPv4Network() const
Definition: IpAddress.h:829
IPNetwork & operator=(const IPNetwork &other)
Definition: IpAddress.h:727
IPNetwork(const IPNetwork &other)
Definition: IpAddress.h:721
IPAddress getNetworkPrefix() const
Definition: IpAddress.h:779
IPNetwork(const IPAddress &address, const std::string &netmask)
Definition: IpAddress.h:687
uint64_t getTotalAddressCount() const
Definition: IpAddress.h:818
std::string getNetmask() const
Definition: IpAddress.h:766
uint8_t getPrefixLen() const
Definition: IpAddress.h:753
IPNetwork & operator=(const IPv4Network &other)
Definition: IpAddress.h:736
IPNetwork(const IPAddress &address)
Definition: IpAddress.h:656
IPNetwork(const std::string &addressAndNetmask)
Definition: IpAddress.h:707
IPNetwork(const IPAddress &address, uint8_t prefixLen)
Definition: IpAddress.h:666
Definition: IpAddress.h:30
static bool isValidIPv4Address(const std::string &addrAsString)
bool matchNetwork(const std::string &network) const
static const IPv4Address MulticastRangeLowerBound
Definition: IpAddress.h:146
IPv4Address(const std::array< uint8_t, 4 > &bytes)
Definition: IpAddress.h:58
bool matchNetwork(const IPv4Network &network) const
IPv4Address()=default
A default constructor that creates an instance of the class with the zero-initialized address.
std::string toString() const
IPv4Address(const std::string &addrAsString)
const uint8_t * toBytes() const
Definition: IpAddress.h:70
bool operator!=(const IPv4Address &rhs) const
Definition: IpAddress.h:113
IPv4Address(const uint8_t *bytes, size_t size)
IPv4Address(const uint32_t addrAsInt)
Definition: IpAddress.h:37
IPv4Address(const uint8_t bytes[4])
Definition: IpAddress.h:46
bool operator==(const IPv4Address &rhs) const
Definition: IpAddress.h:90
bool operator<(const IPv4Address &rhs) const
Definition: IpAddress.h:98
const std::array< uint8_t, 4 > & toByteArray() const
Definition: IpAddress.h:76
uint32_t toInt() const
Definition: IpAddress.h:155
static const IPv4Address Zero
A static value representing a zero value of IPv4 address, meaning address of value "0....
Definition: IpAddress.h:140
Definition: IpAddress.h:475
IPv4Network(const IPv4Address &address)
Definition: IpAddress.h:480
IPv4Address getLowestAddress() const
std::string getNetmask() const
Definition: IpAddress.h:515
IPv4Network(const IPv4Address &address, const std::string &netmask)
IPv4Address getHighestAddress() const
std::string toString() const
uint8_t getPrefixLen() const
bool includes(const IPv4Address &address) const
uint64_t getTotalAddressCount() const
IPv4Network(const IPv4Address &address, uint8_t prefixLen)
IPv4Address getNetworkPrefix() const
Definition: IpAddress.h:521
IPv4Network(const std::string &addressAndNetmask)
bool includes(const IPv4Network &network) const
Definition: IpAddress.h:165
static const IPv6Address MulticastRangeLowerBound
Definition: IpAddress.h:309
void copyTo(uint8_t **arr, size_t &length) const
const uint8_t * toBytes() const
Definition: IpAddress.h:196
bool matchNetwork(const IPv6Network &network) const
IPv6Address(const uint8_t bytes[16])
Definition: IpAddress.h:174
IPv6Address(const uint8_t *bytes, size_t size)
A constructor that creates an instance of the class out of a 16-byte array.
static const IPv6Address Zero
Definition: IpAddress.h:304
bool matchNetwork(const std::string &network) const
bool operator<(const IPv6Address &rhs) const
Definition: IpAddress.h:227
bool operator!=(const IPv6Address &rhs) const
Definition: IpAddress.h:235
const std::array< uint8_t, 16 > & toByteArray() const
Definition: IpAddress.h:203
IPv6Address(const std::string &addrAsString)
bool copyToNewBuffer(uint8_t **buffer, size_t &size) const
Allocates a new buffer and copies the address value to it. The user is responsible for deallocating t...
size_t copyTo(uint8_t *buffer, size_t size) const
Copies the address value to a user-provided buffer.
IPv6Address()=default
A default constructor that creates an instance of the class with the zero-initialized address.
static bool isValidIPv6Address(const std::string &addrAsString)
std::string toString() const
bool operator==(const IPv6Address &rhs) const
Definition: IpAddress.h:219
IPv6Address(const std::array< uint8_t, 16 > &bytes)
Definition: IpAddress.h:186
Definition: IpAddress.h:563
IPv6Network(const std::string &addressAndNetmask)
IPv6Address getHighestAddress() const
uint8_t getPrefixLen() const
std::string getNetmask() const
Definition: IpAddress.h:603
bool includes(const IPv6Network &network) const
IPv6Address getLowestAddress() const
IPv6Network(const IPv6Address &address, const std::string &netmask)
IPv6Network(const IPv6Address &address, uint8_t prefixLen)
uint64_t getTotalAddressCount() const
IPv6Address getNetworkPrefix() const
Definition: IpAddress.h:609
std::string toString() const
bool includes(const IPv6Address &address) const
IPv6Network(const IPv6Address &address)
Definition: IpAddress.h:568
const ProtocolType IPv4
IPv4 protocol.
Definition: ProtocolType.h:48
const ProtocolType IPv6
IPv6 protocol.
Definition: ProtocolType.h:51
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19