17 #ifndef __eip_h_included 18 #define __eip_h_included 20 #include <arpa/inet.h> 21 #include <netinet/in.h> 23 #include <unordered_map> 34 inline EIpAddress_UnrecognizedAddressFamily::EIpAddress_UnrecognizedAddressFamily(Int af) {
35 setTextf(
"Unrecognized address family %d", af);
47 memset(&address_, 0,
sizeof(address_));
83 memset(&address_, 0,
sizeof(address_));
84 if (inet_pton(AF_INET, parts[0], &address_.ipv4) == 1)
86 if (family_ != AF_INET)
88 maskWidth_ = (parts.size() > 1) ? static_cast<UChar>(std::stoi(parts[1])) : 32;
90 else if (inet_pton(AF_INET6, parts[0], &address_.ipv6) == 1)
92 if (family_ != AF_INET6)
94 maskWidth_ = (parts.size() > 1) ? static_cast<UChar>(std::stoi(parts[1])) : 128;
109 family_ = ipaddr.family_;
110 maskWidth_ = ipaddr.maskWidth_;
111 memset(&address_, 0,
sizeof(address_));
114 case AF_INET: { address_.ipv4.s_addr = ipaddr.address_.
ipv4.s_addr;
break; }
115 case AF_INET6: { memcpy(address_.ipv6.s6_addr, ipaddr.address_.
ipv6.s6_addr,
sizeof(address_.ipv6.s6_addr));
break; }
125 switch (saddr.ss_family)
131 throw EIpAddress_UnrecognizedAddressFamily(saddr.ss_family);
141 if (family_ != AF_INET)
146 address_.ipv4.s_addr = addr.s_addr;
154 if (family_ != AF_INET6)
159 memcpy(address_.ipv6.s6_addr, addr.s6_addr,
sizeof(address_.ipv6.s6_addr));
168 family_ == ip.family_ &&
169 maskWidth_ == ip.maskWidth_ &&
171 (family_ == AF_INET && address_.ipv4.s_addr == ip.address_.
ipv4.s_addr) ||
173 family_ == AF_INET6 &&
174 address_.ipv6.s6_addr[0] == ip.address_.
ipv6.s6_addr[0] &&
175 address_.ipv6.s6_addr[1] == ip.address_.
ipv6.s6_addr[1] &&
176 address_.ipv6.s6_addr[2] == ip.address_.
ipv6.s6_addr[2] &&
177 address_.ipv6.s6_addr[3] == ip.address_.
ipv6.s6_addr[3] &&
178 address_.ipv6.s6_addr[4] == ip.address_.
ipv6.s6_addr[4] &&
179 address_.ipv6.s6_addr[5] == ip.address_.
ipv6.s6_addr[5] &&
180 address_.ipv6.s6_addr[6] == ip.address_.
ipv6.s6_addr[6] &&
181 address_.ipv6.s6_addr[7] == ip.address_.
ipv6.s6_addr[7] &&
182 address_.ipv6.s6_addr[8] == ip.address_.
ipv6.s6_addr[8] &&
183 address_.ipv6.s6_addr[9] == ip.address_.
ipv6.s6_addr[9] &&
184 address_.ipv6.s6_addr[10] == ip.address_.
ipv6.s6_addr[10] &&
185 address_.ipv6.s6_addr[11] == ip.address_.
ipv6.s6_addr[11] &&
186 address_.ipv6.s6_addr[12] == ip.address_.
ipv6.s6_addr[12] &&
187 address_.ipv6.s6_addr[13] == ip.address_.
ipv6.s6_addr[13] &&
188 address_.ipv6.s6_addr[14] == ip.address_.
ipv6.s6_addr[14] &&
189 address_.ipv6.s6_addr[15] == ip.address_.
ipv6.s6_addr[15]
202 std::string str =
"any";
206 Char buf[INET6_ADDRSTRLEN] = {};
210 case AF_INET: { inet_ntop(AF_INET,&address_.ipv4,buf,
sizeof(buf));
break; }
211 case AF_INET6: { inet_ntop(AF_INET6,&address_.ipv6,buf,
sizeof(buf));
break; }
215 std::stringstream ss;
218 ss <<
"/" <<
static_cast<Int
>(
maskWidth());
231 const sa_family_t
family()
const {
return family_; }
251 case AF_INET: { maskWidth_ = (maskWidth > 32) ? 32 : maskWidth;
break; }
252 case AF_INET6: { maskWidth_ = (maskWidth > 128) ? 128 : maskWidth;
break; }
264 memset(&address_,0,
sizeof(address_));
277 case AF_INET: {
if (address_.ipv4.s_addr == 0)
return True;
break; }
278 case AF_INET6: {
for (
auto b : address_.ipv6.s6_addr) {
if (b != 0)
return False; }
return True; }
301 size_t iphash = 0xc70f6907UL;
302 switch (addr.family())
304 case AF_INET: { iphash =
EMurmurHash64::getHash(reinterpret_cast<cpUChar>(&addr.ipv4Address()),
sizeof(in_addr));
break; }
305 case AF_INET6: { iphash =
EMurmurHash64::getHash(reinterpret_cast<cpUChar>(&addr.ipv6Address()),
sizeof(in6_addr));
break; }
308 size_t mwhash = std::hash<UChar>{}(addr.maskWidth());
469 Port(UShort first = 0, UShort last = 0) : first_(first), last_(!last ? first : last) {}
472 Port(
const Port &p) : first_(p.first_), last_(p.last_) {}
476 UShort
first()
const {
return first_; }
479 UShort
last()
const {
return last_; }
531 virtual size_t hash()
const = 0;
548 return std::hash<Int>{}(
static_cast<Int
>(type()));
579 size_t typehash = std::hash<Int>{}(
static_cast<Int
>(type()));
580 size_t spechash = std::hash<std::string>{}(spec_);
615 size_t typehash = std::hash<Int>{}(
static_cast<Int
>(type()));
616 size_t spechash = std::hash<std::string>{}(spec_);
632 return std::hash<Int>{}(
static_cast<Int
>(type()));
644 return std::hash<Int>{}(
static_cast<Int
>(type()));
674 size_t typehash = std::hash<Int>{}(
static_cast<Int
>(type()));
675 size_t flagshash = std::hash<std::string>{}(flags_);
709 size_t typehash = std::hash<Int>{}(
static_cast<Int
>(type()));
710 size_t typeshash = std::hash<std::string>{}(types_);
726 : orig_(r.original()),
729 proto_(r.protocol()),
731 srcPorts_(r.sourcePorts()),
732 dst_(r.destination()),
733 dstPorts_(r.destinationPorts()),
746 srcPorts_ = r.srcPorts_;
748 dstPorts_ = r.dstPorts_;
749 options_ = r.options_;
777 const OptionPtrVec &
options()
const {
return options_; }
846 srcPorts_.push_back(
Port(first, last));
854 srcPorts_.push_back(p);
863 dstPorts_.push_back(
Port(first, last));
871 dstPorts_.push_back(p);
884 Void dump(cpStr padding=
"");
894 Void parsePorts(
const EString &str, PortVec &ports);
895 Void parseOptions(
const EString &str);
905 OptionPtrVec options_;
916 size_t firsthash = std::hash<UShort>{}(port.first());
917 size_t lasthash = std::hash<UShort>{}(port.last());
927 size_t hash = 0xc70f6907UL;
942 return option.hash();
951 size_t hash = 0xc70f6907UL;
952 for (
auto option : options)
963 size_t hash = 0xc70f6907UL;
983 #endif // #ifndef __eip_h_included EIpFilterRule & addSourcePort(UShort first=0, UShort last=0)
Sets the source port for this IPFilterRule.
Definition: eip.h:844
UChar maskWidth() const
Returns the mask width (number of signficant bits) for this address object.
Definition: eip.h:234
Action
Definition: eip.h:327
std::size_t operator()(const EIpFilterRule::Port &port) const noexcept
Definition: eip.h:914
#define True
True.
Definition: ebase.h:25
EIpFilterRule & setProtocol(Protocol proto)
Sets the protocol for this IPFilterRule.
Definition: eip.h:819
Port(const Port &p)
Copy constructor.
Definition: eip.h:472
EIpFilterRule & setAction(Action action)
Sets the action for this IPFilterRule.
Definition: eip.h:803
IcmpTypes & setTypes(const std::string &types)
Definition: eip.h:702
Bool isAny() const
determines if this IP address represents "any".
Definition: eip.h:271
const PortVec & sourcePorts() const
Returns the collection of source ports.
Definition: eip.h:771
Fragment()
Definition: eip.h:543
IcmpTypes & setTypes(cpChar types)
Definition: eip.h:692
const EIpAddress & source() const
Returns the source IP address.
Definition: eip.h:769
EIpFilterRule & addDestinationPort(const Port &p)
Sets the destination port for this IPFilterRule.
Definition: eip.h:869
IcmpTypes(cpChar types)
Definition: eip.h:688
EIpAddress & setMaskWidth(UChar maskWidth)
Assigns the mask width, in number of bits, for this address object.
Definition: eip.h:247
const EIpAddress & destination() const
Returns the destination IP address.
Definition: eip.h:773
Option & setType(OptionType t)
Definition: eip.h:526
Direction
Definition: eip.h:333
#define RAW
Definition: egetopt.cpp:31
Port & setLast(UShort last)
sets the last port in the range.
Definition: eip.h:494
std::size_t operator()(const EIpFilterRule::Option &option) const noexcept
Definition: eip.h:940
in_addr ipv4
Definition: eip.h:287
EIpAddress & operator=(const in_addr &addr)
Assignment operator.
Definition: eip.h:139
EIpAddress(const EIpAddress &ipaddr)
Copy constructor.
Definition: eip.h:65
EIpAddress & setAny(sa_family_t family)
Sets the IP address as "any" for the specified address family.
Definition: eip.h:261
EIpAddress & operator=(const EIpAddress &ipaddr)
Assignment operator.
Definition: eip.h:107
virtual ~IcmpTypes()
Definition: eip.h:690
const EString & flags()
Definition: eip.h:656
Represents an IPFilterRule "ipoptions" option.
Definition: eip.h:553
EIpFilterRule()
Default constructor.
Definition: eip.h:719
Bool operator==(const EIpAddress &ip) const
Assignment operator.
Definition: eip.h:165
EIpFilterRule & setDirection(Direction dir)
Sets the direction for this IPFilterRule.
Definition: eip.h:811
EIpAddress & operator=(const in6_addr &addr)
Assignment operator.
Definition: eip.h:152
Generates a hash value for the EIpFilterRule::PortVec object.
Definition: eip.h:923
virtual ~TcpOptions()
Definition: eip.h:595
EIpFilterRule & setOriginal(const std::string &orig)
Definition: eip.h:793
size_t hash() const
Definition: eip.h:672
TcpFlags()
Definition: eip.h:652
TcpOptions & setSpec(const std::string &spec)
Definition: eip.h:607
virtual ~Setup()
Definition: eip.h:641
size_t hash() const
Definition: eip.h:630
EIpFilterRule & parse(cpChar raw)
Parses the IPFilterRule definition.
Definition: eip.h:877
Represents an IPFilterRule as defined by RFC 6733.
Definition: eip.h:324
EIpFilterRule(cpChar raw)
Class constructor.
Definition: eip.h:722
Represents an IPFilterRule "setup" option.
Definition: eip.h:637
std::size_t operator()(const EIpAddress &addr) const noexcept
Definition: eip.h:299
Represents an IPFilterRule "tcpflags" option.
Definition: eip.h:649
Represents an IPFilterRule "established" option.
Definition: eip.h:625
std::list< EIpFilterRule > EIpFilterRuleList
Definition: eip.h:977
Represents an IPFilterRule "icmptypes" option.
Definition: eip.h:684
Represents an IPFilterRule "tcpoptions" option.
Definition: eip.h:589
TcpOptions & setSpec(const EString &spec)
Definition: eip.h:602
DECLARE_ERROR_ADVANCED4(EIpFilterRule_InvalidAction)
const EString & original() const
The original IPFilterRule string.
Definition: eip.h:761
const Protocol protocol() const
Returns the protocol for this IPFilterRule.
Definition: eip.h:767
TcpOptions()
Definition: eip.h:592
#define False
False.
Definition: ebase.h:27
std::size_t operator()(const EIpFilterRule::OptionPtrVec &options) const noexcept
Definition: eip.h:949
size_t hash() const
Definition: eip.h:577
std::shared_ptr< EIpFilterRule > EIpFilterRulePtr
Definition: eip.h:976
EIpAddress & operator=(cpStr addr)
Assignment operator.
Definition: eip.h:80
size_t hash() const
Definition: eip.h:642
IpOptions & setSpec(const EString &spec)
Definition: eip.h:566
TcpOptions & setSpec(cpChar spec)
Definition: eip.h:597
EIpFilterRule & operator=(const EIpFilterRule &r)
Assignment operator.
Definition: eip.h:740
size_t hash() const
Definition: eip.h:613
std::string address(Bool includeMask=True) const
Retrieves a string object that is the string representation of the IP address.
Definition: eip.h:198
size_t hash() const
Definition: eip.h:707
Represents an IPFilterRule "frag" option.
Definition: eip.h:540
const Action action() const
Returns the action for this IPFilterRule.
Definition: eip.h:763
IcmpTypes & setTypes(const EString &types)
Definition: eip.h:697
const EString & types()
Definition: eip.h:691
Option(OptionType t)
Definition: eip.h:522
TcpFlags(cpChar flags)
Definition: eip.h:653
std::shared_ptr< Option > OptionPtr
Definition: eip.h:536
EIpAddress(cpStr addr)
Class constructor.
Definition: eip.h:51
TcpFlags & setFlags(const std::string &flags)
Definition: eip.h:667
std::vector< OptionPtr > OptionPtrVec
Definition: eip.h:537
Option()
Definition: eip.h:521
Represents an IP address with mask.
Definition: eip.h:40
Setup()
Definition: eip.h:640
Hash calculation functions for strings and byte arrays.
virtual ~IpOptions()
Definition: eip.h:559
IpOptions()
Definition: eip.h:556
const in_addr & ipv4Address() const
Returns a reference to the in_addr structure that represents an IPv4 address.
Definition: eip.h:225
const EString & spec()
Definition: eip.h:560
const sa_family_t family() const
Returns the address family associated with this address object.
Definition: eip.h:231
TcpFlags(const TcpFlags &o)
Definition: eip.h:654
EIpFilterRule & addDestinationPort(UShort first=0, UShort last=0)
Sets the destination port for this IPFilterRule.
Definition: eip.h:861
OptionType type() const
Definition: eip.h:525
Generates a hash value for the EIpFilterRule::Port object.
Definition: eip.h:912
Protocol
Definition: eip.h:350
const PortVec & destinationPorts() const
Returns the collection of destination ports.
Definition: eip.h:775
static size_t combine(size_t h1, size_t h2)
Combines 2 64-bit hash values.
Definition: ehash.h:300
virtual ~Option()
Definition: eip.h:524
IcmpTypes(const IcmpTypes &o)
Definition: eip.h:689
Port(UShort first=0, UShort last=0)
Default constructor.
Definition: eip.h:469
EIpFilterRule(const EIpFilterRule &r)
Copy constructor.
Definition: eip.h:725
EIpAddress & operator=(const struct sockaddr_storage &saddr)
Assignment operator.
Definition: eip.h:123
std::list< EIpFilterRulePtr > EIpFilterRulePtrList
Definition: eip.h:978
in6_addr ipv6
Definition: eip.h:288
Calculates a hash value for the EIpAddress object.
Definition: eip.h:297
Option(const Option &o)
Definition: eip.h:523
EIpAddress()
Default class constructor.
Definition: eip.h:44
static EStringVec split(cpStr s, cpStr delims)
Splits a string into substrings that are based on the characters in the delimiter array...
Definition: eutil.cpp:73
std::size_t operator()(const EIpFilterRule::PortVec &pv) const noexcept
Definition: eip.h:925
EIpFilterRule & setDestination(const EIpAddress &dst)
Sets the destination IP address for this IPFilterRule.
Definition: eip.h:835
UShort last() const
retrieves the last port in the range.
Definition: eip.h:479
virtual ~Fragment()
Definition: eip.h:544
EIpFilterRule & setSource(const EIpAddress &src)
Sets the source IP address for this IPFilterRule.
Definition: eip.h:827
size_t hash() const
Definition: eip.h:546
IcmpTypes()
Definition: eip.h:687
const OptionPtrVec & options() const
Returns a collection of options.
Definition: eip.h:777
EIpFilterRule & operator=(cpStr r)
Assignment operator.
Definition: eip.h:758
TcpFlags & setFlags(const EString &flags)
Definition: eip.h:662
Port & setFirstLast(UShort first, UShort last)
sets the first and last port in the range.
Definition: eip.h:505
static size_t getHash(cChar val, size_t seed=0xc70f6907UL)
Calculates a 64-bit murmur hash for the value.
Definition: ehash.h:273
EIpFilterRule & operator=(const std::string &r)
Assignment operator.
Definition: eip.h:755
EIpAddress & setFamily(const sa_family_t family)
Assigns the address family for this address object.
Definition: eip.h:239
#define DECLARE_ERROR_ADVANCED2(__e__)
Declares exception class derived from EError with an Int as a constructor parameter and developer def...
Definition: eerror.h:69
UShort first() const
retrieves the first port in the range.
Definition: eip.h:476
OptionType
Definition: eip.h:339
The base class for IPFilterRule options.
Definition: eip.h:518
EIpFilterRule & setOriginal(cpChar orig)
Sets the original string value.
Definition: eip.h:783
EIpAddress(const std::string &addr)
Class constructor.
Definition: eip.h:58
Port & setFirst(UShort first)
sets the first port in the range.
Definition: eip.h:484
const in6_addr & ipv6Address() const
Returns a reference to the in6_addr structure that represents an IPv6 address.
Definition: eip.h:228
const Direction direction() const
Returns the direction for this IPFilterRule.
Definition: eip.h:765
String class.
Definition: estring.h:31
virtual ~TcpFlags()
Definition: eip.h:655
Established()
Definition: eip.h:628
Represents a single port or a range of ports.
Definition: eip.h:463
Generates a hash value for the EIpFilterRule::OptionPrtVec object.
Definition: eip.h:947
TcpOptions(cpChar spec)
Definition: eip.h:593
TcpOptions(const TcpOptions &o)
Definition: eip.h:594
IpOptions(cpChar spec)
Definition: eip.h:557
std::vector< Port > PortVec
Definition: eip.h:515
EIpAddress(const struct sockaddr_storage &saddr)
Class constructor.
Definition: eip.h:72
std::size_t operator()(const EIpFilterRule &r) const noexcept
Definition: eip.h:961
virtual ~Established()
Definition: eip.h:629
EIpFilterRule & setOriginal(const EString &orig)
Definition: eip.h:788
const EString & spec()
Definition: eip.h:596
EIpFilterRule & addSourcePort(const Port &p)
Sets the source port for this IPFilterRule.
Definition: eip.h:852
TcpFlags & setFlags(cpChar flags)
Definition: eip.h:657
IpOptions(const IpOptions &o)
Definition: eip.h:558
IpOptions & setSpec(const std::string &spec)
Definition: eip.h:571
IpOptions & setSpec(cpChar spec)
Definition: eip.h:561