PcapPlusPlus  Next
IpAddress.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstdint>
4 #include <cstring>
5 #include <string>
6 #include <algorithm>
7 #include <ostream>
8 #include <array>
9 #include <memory>
10 
11 #include "DeprecationUtils.h"
12 
14 
17 namespace pcpp
18 {
19 
20  // forward declarations
21  class IPv4Network;
22  class IPv6Network;
23 
24  // The implementation of the classes is based on document N4771 "Working Draft, C++ Extensions for Networking"
25  // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4771.pdf
26 
30  {
31  public:
33  IPv4Address() = default;
34 
37  IPv4Address(const uint32_t addrAsInt)
38  {
39  memcpy(m_Bytes.data(), &addrAsInt, sizeof(addrAsInt));
40  }
41 
46  IPv4Address(const uint8_t bytes[4]) : IPv4Address(bytes, 4)
47  {}
48 
54  IPv4Address(const uint8_t* bytes, size_t size);
55 
58  IPv4Address(const std::array<uint8_t, 4>& bytes) : m_Bytes(bytes)
59  {}
60 
64  IPv4Address(const std::string& addrAsString);
65 
67  inline uint32_t toInt() const;
68 
70  const uint8_t* toBytes() const
71  {
72  return m_Bytes.data();
73  }
74 
76  const std::array<uint8_t, 4>& toByteArray() const
77  {
78  return m_Bytes;
79  }
80 
82  std::string toString() const;
83 
85  bool isMulticast() const;
86 
90  bool operator==(const IPv4Address& rhs) const
91  {
92  return toInt() == rhs.toInt();
93  }
94 
98  bool operator<(const IPv4Address& rhs) const
99  {
100  uint32_t intVal = toInt();
101  std::reverse(reinterpret_cast<uint8_t*>(&intVal), reinterpret_cast<uint8_t*>(&intVal) + sizeof(intVal));
102 
103  uint32_t rhsIntVal = rhs.toInt();
104  std::reverse(reinterpret_cast<uint8_t*>(&rhsIntVal),
105  reinterpret_cast<uint8_t*>(&rhsIntVal) + sizeof(rhsIntVal));
106 
107  return intVal < rhsIntVal;
108  }
109 
113  bool operator!=(const IPv4Address& rhs) const
114  {
115  return !(*this == rhs);
116  }
117 
121  bool matchNetwork(const IPv4Network& network) const;
122 
132  bool matchNetwork(const std::string& network) const;
133 
137  static bool isValidIPv4Address(const std::string& addrAsString);
138 
140  static const IPv4Address Zero;
141 
147  static const IPv4Address MulticastRangeUpperBound;
148 
149  private:
150  std::array<uint8_t, 4> m_Bytes = { 0 };
151  }; // class IPv4Address
152 
153  // Implementation of inline methods
154 
155  uint32_t IPv4Address::toInt() const
156  {
157  uint32_t addr = 0;
158  memcpy(&addr, m_Bytes.data(), m_Bytes.size() * sizeof(uint8_t));
159  return addr;
160  }
161 
165  {
166  public:
168  IPv6Address() = default;
169 
174  IPv6Address(const uint8_t bytes[16]) : IPv6Address(bytes, 16)
175  {}
176 
182  IPv6Address(const uint8_t* bytes, size_t size);
183 
186  IPv6Address(const std::array<uint8_t, 16>& bytes) : m_Bytes(bytes)
187  {}
188 
192  IPv6Address(const std::string& addrAsString);
193 
196  const uint8_t* toBytes() const
197  {
198  return m_Bytes.data();
199  }
200 
203  const std::array<uint8_t, 16>& toByteArray() const
204  {
205  return m_Bytes;
206  }
207 
210  std::string toString() const;
211 
214  bool isMulticast() const;
215 
219  bool operator==(const IPv6Address& rhs) const
220  {
221  return memcmp(toBytes(), rhs.toBytes(), sizeof(m_Bytes)) == 0;
222  }
223 
227  bool operator<(const IPv6Address& rhs) const
228  {
229  return memcmp(toBytes(), rhs.toBytes(), sizeof(m_Bytes)) < 0;
230  }
231 
235  bool operator!=(const IPv6Address& rhs) const
236  {
237  return !(*this == rhs);
238  }
239 
245  PCPP_DEPRECATED("Use copyToNewBuffer instead.")
246  void copyTo(uint8_t** arr, size_t& length) const;
247 
254  void copyTo(uint8_t* arr) const
255  {
256  copyTo(arr, 16);
257  }
258 
268  size_t copyTo(uint8_t* buffer, size_t size) const;
269 
277  bool copyToNewBuffer(uint8_t** buffer, size_t& size) const;
278 
282  bool matchNetwork(const IPv6Network& network) const;
283 
295  bool matchNetwork(const std::string& network) const;
296 
300  static bool isValidIPv6Address(const std::string& addrAsString);
301 
304  static const IPv6Address Zero;
305 
310 
311  private:
312  std::array<uint8_t, 16> m_Bytes = { 0 };
313  }; // class IPv6Address
314 
317  class IPAddress
318  {
319  public:
321  enum AddressType : uint8_t
322  {
327  };
328 
331  {}
332 
335  IPAddress(const IPv4Address& addr) : m_Type(IPv4AddressType), m_IPv4(addr)
336  {}
337 
340  IPAddress(const IPv6Address& addr) : m_Type(IPv6AddressType), m_IPv6(addr)
341  {}
342 
346  IPAddress(const std::string& addrAsString);
347 
351  inline IPAddress& operator=(const IPv4Address& addr);
352 
356  inline IPAddress& operator=(const IPv6Address& addr);
357 
361  {
362  return static_cast<AddressType>(m_Type);
363  }
364 
367  std::string toString() const
368  {
369  return (getType() == IPv4AddressType) ? m_IPv4.toString() : m_IPv6.toString();
370  }
371 
373  bool isIPv4() const
374  {
375  return getType() == IPv4AddressType;
376  }
377 
379  bool isIPv6() const
380  {
381  return getType() == IPv6AddressType;
382  }
383 
386  bool isMulticast() const
387  {
388  return (getType() == IPv4AddressType) ? m_IPv4.isMulticast() : m_IPv6.isMulticast();
389  }
390 
393  const IPv4Address& getIPv4() const
394  {
395  return m_IPv4;
396  }
397 
400  const IPv6Address& getIPv6() const
401  {
402  return m_IPv6;
403  }
404 
406  bool isZero() const
407  {
408  return (getType() == IPv4AddressType) ? m_IPv4 == IPv4Address::Zero : m_IPv6 == IPv6Address::Zero;
409  }
410 
414  inline bool operator==(const IPAddress& rhs) const;
415 
419  inline bool operator<(const IPAddress& rhs) const;
420 
424  bool operator!=(const IPAddress& rhs) const
425  {
426  return !(*this == rhs);
427  }
428 
429  private:
430  uint8_t m_Type;
431  IPv4Address m_IPv4;
432  IPv6Address m_IPv6;
433  };
434 
435  // implementation of inline methods
436 
437  bool IPAddress::operator==(const IPAddress& rhs) const
438  {
439  if (isIPv4())
440  {
441  return rhs.isIPv4() ? (m_IPv4 == rhs.m_IPv4) : false;
442  }
443 
444  return rhs.isIPv6() ? m_IPv6 == rhs.m_IPv6 : false;
445  }
446 
447  bool IPAddress::operator<(const IPAddress& rhs) const
448  {
449  if (isIPv4())
450  {
451  // treat IPv4 as less than IPv6
452  // If current obj is IPv4 and other is IPv6 return true
453  return rhs.isIPv4() ? (m_IPv4 < rhs.m_IPv4) : true;
454  }
455  return rhs.isIPv6() ? m_IPv6 < rhs.m_IPv6 : false;
456  }
457 
459  {
460  m_Type = IPv4AddressType;
461  m_IPv4 = addr;
462  return *this;
463  }
464 
466  {
467  m_Type = IPv6AddressType;
468  m_IPv6 = addr;
469  return *this;
470  }
471 
475  {
476  public:
480  explicit IPv4Network(const IPv4Address& address) : IPv4Network(address, 32U)
481  {}
482 
489  IPv4Network(const IPv4Address& address, uint8_t prefixLen);
490 
499  IPv4Network(const IPv4Address& address, const std::string& netmask);
500 
509  IPv4Network(const std::string& addressAndNetmask);
510 
512  uint8_t getPrefixLen() const;
513 
515  std::string getNetmask() const
516  {
517  return IPv4Address(m_Mask).toString();
518  }
519 
522  {
523  return m_NetworkPrefix;
524  }
525 
529 
533 
536  uint64_t getTotalAddressCount() const;
537 
540  bool includes(const IPv4Address& address) const;
541 
545  bool includes(const IPv4Network& network) const;
546 
549  std::string toString() const;
550 
551  private:
552  uint32_t m_NetworkPrefix{};
553  uint32_t m_Mask{};
554 
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);
558  };
559 
563  {
564  public:
568  explicit IPv6Network(const IPv6Address& address) : IPv6Network(address, 128U)
569  {}
570 
577  IPv6Network(const IPv6Address& address, uint8_t prefixLen);
578 
587  IPv6Network(const IPv6Address& address, const std::string& netmask);
588 
597  IPv6Network(const std::string& addressAndNetmask);
598 
600  uint8_t getPrefixLen() const;
601 
603  std::string getNetmask() const
604  {
605  return IPv6Address(m_Mask).toString();
606  }
607 
610  {
611  return { m_NetworkPrefix };
612  }
613 
617 
621 
624  uint64_t getTotalAddressCount() const;
625 
628  bool includes(const IPv6Address& address) const;
629 
633  bool includes(const IPv6Network& network) const;
634 
637  std::string toString() const;
638 
639  private:
640  uint8_t m_NetworkPrefix[16]{};
641  uint8_t m_Mask[16]{};
642 
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);
646  };
647 
650  class IPNetwork
651  {
652  public:
656  explicit IPNetwork(const IPAddress& address) : IPNetwork(address, address.isIPv4() ? 32U : 128U)
657  {}
658 
666  IPNetwork(const IPAddress& address, uint8_t prefixLen)
667  {
668  if (address.isIPv4())
669  {
670  m_NetworkVariant = IPv4Network(address.getIPv4(), prefixLen);
671  }
672  else
673  {
674  m_NetworkVariant = IPv6Network(address.getIPv6(), prefixLen);
675  }
676  }
677 
687  IPNetwork(const IPAddress& address, const std::string& netmask)
688  {
689  if (address.isIPv4())
690  {
691  m_NetworkVariant = IPv4Network(address.getIPv4(), netmask);
692  }
693  else
694  {
695  m_NetworkVariant = IPv6Network(address.getIPv6(), netmask);
696  }
697  }
698 
707  IPNetwork(const std::string& addressAndNetmask)
708  {
709  try
710  {
711  m_NetworkVariant = IPv4Network(addressAndNetmask);
712  }
713  catch (const std::invalid_argument&)
714  {
715  m_NetworkVariant = IPv6Network(addressAndNetmask);
716  }
717  }
718 
721  IPNetwork(const IPNetwork& other) : m_NetworkVariant(other.m_NetworkVariant)
722  {}
723 
728  {
729  m_NetworkVariant = other.m_NetworkVariant;
730  return *this;
731  }
732 
737  {
738  m_NetworkVariant = other;
739  return *this;
740  }
741 
746  {
747  m_NetworkVariant = other;
748  return *this;
749  }
750 
753  uint8_t getPrefixLen() const
754  {
755  auto ip4 = m_NetworkVariant.tryGetIPv4();
756  if (ip4 != nullptr)
757  {
758  return ip4->getPrefixLen();
759  }
760 
761  return m_NetworkVariant.getIPv6().getPrefixLen();
762  }
763 
766  std::string getNetmask() const
767  {
768  auto ip4 = m_NetworkVariant.tryGetIPv4();
769  if (ip4 != nullptr)
770  {
771  return ip4->getNetmask();
772  }
773 
774  return m_NetworkVariant.getIPv6().getNetmask();
775  }
776 
780  {
781  auto ip4 = m_NetworkVariant.tryGetIPv4();
782  if (ip4 != nullptr)
783  {
784  return IPAddress(ip4->getNetworkPrefix());
785  }
786 
787  return IPAddress(m_NetworkVariant.getIPv6().getNetworkPrefix());
788  }
789 
793  {
794  auto ip4 = m_NetworkVariant.tryGetIPv4();
795  if (ip4 != nullptr)
796  {
797  return IPAddress(ip4->getLowestAddress());
798  }
799  return IPAddress(m_NetworkVariant.getIPv6().getLowestAddress());
800  }
801 
805  {
806  auto ip4 = m_NetworkVariant.tryGetIPv4();
807  if (ip4 != nullptr)
808  {
809  return IPAddress(ip4->getHighestAddress());
810  }
811 
812  return IPAddress(m_NetworkVariant.getIPv6().getHighestAddress());
813  }
814 
818  uint64_t getTotalAddressCount() const
819  {
820  auto ip4 = m_NetworkVariant.tryGetIPv4();
821  if (ip4 != nullptr)
822  {
823  return ip4->getTotalAddressCount();
824  }
825  return m_NetworkVariant.getIPv6().getTotalAddressCount();
826  }
827 
829  bool isIPv4Network() const
830  {
831  return m_NetworkVariant.getType() == NetworkVariant::Type::IPv4;
832  }
833 
835  bool isIPv6Network() const
836  {
837  return m_NetworkVariant.getType() == NetworkVariant::Type::IPv6;
838  }
839 
842  bool includes(const IPAddress& address) const
843  {
844  auto ip4 = m_NetworkVariant.tryGetIPv4();
845  if (ip4 != nullptr)
846  {
847  if (address.isIPv6())
848  {
849  return false;
850  }
851  return ip4->includes(address.getIPv4());
852  }
853 
854  if (address.isIPv4())
855  {
856  return false;
857  }
858 
859  return m_NetworkVariant.getIPv6().includes(address.getIPv6());
860  }
861 
864  bool includes(const IPNetwork& network) const
865  {
866  auto ip4 = m_NetworkVariant.tryGetIPv4();
867  if (ip4 != nullptr)
868  {
869  auto otherIp4 = network.m_NetworkVariant.tryGetIPv4();
870  if (otherIp4 == nullptr)
871  {
872  return false;
873  }
874  return ip4->includes(*otherIp4);
875  }
876 
877  auto& ip6 = m_NetworkVariant.getIPv6();
878  auto otherIp6 = network.m_NetworkVariant.tryGetIPv6();
879  if (otherIp6 == nullptr)
880  {
881  return false;
882  }
883  return ip6.includes(*otherIp6);
884  }
885 
888  std::string toString() const
889  {
890  auto ip4 = m_NetworkVariant.tryGetIPv4();
891  if (ip4)
892  {
893  return ip4->toString();
894  }
895 
896  return m_NetworkVariant.getIPv6().toString();
897  }
898 
899  private:
900  // TODO: C++17 Replace with std::variant.
901  class NetworkVariant
902  {
903  public:
904  enum class Type
905  {
906  IPv4,
907  IPv6
908  };
909 
910  NetworkVariant() : m_Type(Type::IPv4), m_IPv4Net(IPv4Address::Zero)
911  {}
912  NetworkVariant(IPv4Network const& net) : m_Type(Type::IPv4), m_IPv4Net(net)
913  {}
914  NetworkVariant(IPv6Network const& net) : m_Type(Type::IPv6), m_IPv6Net(net)
915  {}
916  ~NetworkVariant()
917  {
918  destroyActiveMem();
919  }
920 
921  NetworkVariant& operator=(IPv4Network const& other)
922  {
923  swapTo(Type::IPv4);
924  m_IPv4Net = other;
925  return *this;
926  }
927  NetworkVariant& operator=(IPv6Network const& other)
928  {
929  swapTo(Type::IPv6);
930  m_IPv6Net = other;
931  return *this;
932  }
933  NetworkVariant& operator=(NetworkVariant const& other)
934  {
935  swapTo(other.m_Type);
936  switch (other.m_Type)
937  {
938  case Type::IPv4:
939  m_IPv4Net = other.m_IPv4Net;
940  break;
941  case Type::IPv6:
942  m_IPv6Net = other.m_IPv6Net;
943  break;
944  }
945  return *this;
946  }
947 
948  Type getType() const noexcept
949  {
950  return m_Type;
951  }
952 
953  IPv4Network& getIPv4()
954  {
955  throwIfNot(Type::IPv4);
956  return m_IPv4Net;
957  }
958 
959  IPv4Network const& getIPv4() const
960  {
961  throwIfNot(Type::IPv4);
962  return m_IPv4Net;
963  }
964 
965  IPv4Network* tryGetIPv4() noexcept
966  {
967  return (m_Type == Type::IPv4) ? &m_IPv4Net : nullptr;
968  }
969  IPv4Network const* tryGetIPv4() const noexcept
970  {
971  return (m_Type == Type::IPv4) ? &m_IPv4Net : nullptr;
972  }
973 
974  IPv6Network& getIPv6()
975  {
976  throwIfNot(Type::IPv6);
977  return m_IPv6Net;
978  }
979 
980  IPv6Network const& getIPv6() const
981  {
982  throwIfNot(Type::IPv6);
983  return m_IPv6Net;
984  }
985 
986  IPv6Network* tryGetIPv6() noexcept
987  {
988  return (m_Type == Type::IPv6) ? &m_IPv6Net : nullptr;
989  }
990  IPv6Network const* tryGetIPv6() const noexcept
991  {
992  return (m_Type == Type::IPv6) ? &m_IPv6Net : nullptr;
993  }
994 
995  private:
996  void throwIfNot(Type type) const
997  {
998  if (type != m_Type)
999  {
1000  throw std::runtime_error("Bad variant access");
1001  }
1002  }
1003 
1004  void swapTo(Type newType) noexcept;
1005  void destroyActiveMem() noexcept;
1006 
1007  Type m_Type;
1008  union {
1009  IPv4Network m_IPv4Net;
1010  IPv6Network m_IPv6Net;
1011  };
1012  };
1013 
1014  NetworkVariant m_NetworkVariant;
1015  };
1016 
1017  namespace literals
1018  {
1019  inline IPv4Address operator""_ipv4(const char* addrString, std::size_t size)
1020  {
1021  return IPv4Address(std::string(addrString, size));
1022  }
1023 
1024  inline IPv6Address operator""_ipv6(const char* addrString, std::size_t size)
1025  {
1026  return IPv6Address(std::string(addrString, size));
1027  }
1028  } // namespace literals
1029 
1030  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPv4Address& ipv4Address)
1031  {
1032  oss << ipv4Address.toString();
1033  return oss;
1034  }
1035 
1036  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPv6Address& ipv6Address)
1037  {
1038  oss << ipv6Address.toString();
1039  return oss;
1040  }
1041 
1042  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPAddress& ipAddress)
1043  {
1044  oss << ipAddress.toString();
1045  return oss;
1046  }
1047 
1048  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPv4Network& network)
1049  {
1050  oss << network.toString();
1051  return oss;
1052  }
1053 
1054  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPv6Network& network)
1055  {
1056  oss << network.toString();
1057  return oss;
1058  }
1059 
1060  inline std::ostream& operator<<(std::ostream& oss, const pcpp::IPNetwork& network)
1061  {
1062  oss << network.toString();
1063  return oss;
1064  }
1065 } // namespace pcpp
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
bool isMulticast() const
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...
bool isMulticast() const
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