diff options
author | Henri Herscher <henri@oreka.org> | 2008-01-23 15:27:59 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2008-01-23 15:27:59 +0000 |
commit | 27add11974dffb1d3a6b48d140e3f8dd689c995d (patch) | |
tree | 3bf94676aa61d4b78fe0276b1c3faa7d021cf2eb /orkbasecxx/Utils.cpp | |
parent | f915e7cad47201430fdb9575ecd0a93efa0d1c2b (diff) |
Added SipIgnoredMediaAddresses config parameter. If a SIP INVITE has an RTP address that matches this csv list of CIDR ranges, it will be ignored.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@521 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/Utils.cpp')
-rw-r--r-- | orkbasecxx/Utils.cpp | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/orkbasecxx/Utils.cpp b/orkbasecxx/Utils.cpp index 3a6bc84..272a90d 100644 --- a/orkbasecxx/Utils.cpp +++ b/orkbasecxx/Utils.cpp @@ -194,7 +194,7 @@ int FileSetOwnership(CStdString filename, CStdString owner, CStdString group) //===================================================== -// Network related stuff +// TcpAddress void TcpAddress::ToString(CStdString& string) { @@ -235,3 +235,78 @@ bool TcpAddressList::HasAddressOrAdd(struct in_addr ip, unsigned short port) return true; } +//========================= +// IpRanges + +void IpRanges::Compute() +{ + m_ipRangePrefixes.clear(); + m_ipRangeBitWidths.clear(); + std::list<CStdString>::iterator it; + + for(it = m_asciiIpRanges.begin(); it != m_asciiIpRanges.end(); it++) + { + CStdString cidrPrefixLengthString; + unsigned int cidrPrefixLength = 32; // by default, x.x.x.x/32 + CStdString cidrIpAddressString; + struct in_addr cidrIpAddress; + + CStdString entry = *it; + int slashPosition = entry.Find('/'); + if(slashPosition > 0) + { + cidrIpAddressString = entry.Left(slashPosition); + cidrPrefixLengthString = entry.Mid(slashPosition+1); + + bool notAnInt = false; + try + { + cidrPrefixLength = StringToInt(cidrPrefixLengthString); + } + catch (...) {notAnInt = true;} + if(cidrPrefixLength < 1 || cidrPrefixLength > 32 || notAnInt) + { + throw (CStdString("IpRanges: invalid CIDR prefix length" + entry)); + } + } + else + { + cidrIpAddressString = entry; + } + + if(ACE_OS::inet_aton((PCSTR)cidrIpAddressString, &cidrIpAddress)) + { + unsigned int rangeBitWidth = 32-cidrPrefixLength; + unsigned int prefix = ntohl((unsigned int)cidrIpAddress.s_addr) >> (rangeBitWidth); + m_ipRangePrefixes.push_back(prefix); + m_ipRangeBitWidths.push_back(rangeBitWidth); + } + else + { + throw (CStdString("invalid IP range:" + entry)); + } + } +} + +bool IpRanges::Matches(struct in_addr ip) +{ + bool matches = false; + std::list<unsigned int>::iterator bitWidthIt = m_ipRangeBitWidths.begin(); + std::list<unsigned int>::iterator prefixIt = m_ipRangePrefixes.begin(); + + while(prefixIt != m_ipRangePrefixes.end()) + { + unsigned int bitWidth = *bitWidthIt; + unsigned int prefix = *prefixIt; + unsigned int packetSourcePrefix = ntohl((unsigned int)ip.s_addr) >> bitWidth; + if(packetSourcePrefix == prefix) + { + matches = true; + break; + } + prefixIt++; + bitWidthIt++; + } + return matches; +} + |