address external_ip::external_address(address const& ip) const { address ext = m_vote_group[ip.is_v6()].external_address(); #if TORRENT_USE_IPV6 if (ip.is_v6() && ext == address_v4()) return address_v6(); #endif return ext; }
void ip_filter::add_rule(address first, address last, int flags) { if (first.is_v4()) { assert(last.is_v4()); m_filter4.add_rule(first.to_v4(), last.to_v4(), flags); } else if (first.is_v6()) { assert(last.is_v6()); m_filter6.add_rule(first.to_v6(), last.to_v6(), flags); } else assert(false); }
int ip_filter::access(address const& addr) const { if (addr.is_v4()) return m_filter4.access(addr.to_v4()); assert(addr.is_v6()); return m_filter6.access(addr.to_v6()); }
inline T address_cast(const address& addr, typename enable_if<is_same<T, address_v6>::value>::type* = 0) { if (!addr.is_v6()) throw bad_address_cast(); return get_v6_helper(addr); }
void ip_filter::add_rule(address first, address last, boost::uint32_t flags) { if (first.is_v4()) { TORRENT_ASSERT(last.is_v4()); m_filter4.add_rule(first.to_v4().to_bytes(), last.to_v4().to_bytes(), flags); } #if TORRENT_USE_IPV6 else if (first.is_v6()) { TORRENT_ASSERT(last.is_v6()); m_filter6.add_rule(first.to_v6().to_bytes(), last.to_v6().to_bytes(), flags); } #endif else TORRENT_ASSERT(false); }
int ip_filter::access(address const& addr) const { if (addr.is_v4()) return m_filter4.access(addr.to_v4().to_bytes()); #if TORRENT_USE_IPV6 TORRENT_ASSERT(addr.is_v6()); return m_filter6.access(addr.to_v6().to_bytes()); #else return 0; #endif }
bool in_subnet(address const& addr, ip_interface const& iface) { if (addr.is_v4() != iface.interface_address.is_v4()) return false; // since netmasks seems unreliable for IPv6 interfaces // (MacOS X returns AF_INET addresses as bitmasks) assume // that any IPv6 address belongs to the subnet of any // interface with an IPv6 address if (addr.is_v6()) return true; return (addr.to_v4().to_ulong() & iface.netmask.to_v4().to_ulong()) == (iface.interface_address.to_v4().to_ulong() & iface.netmask.to_v4().to_ulong()); }
void write_address(address const& a, OutIt& out) { if (a.is_v4()) { write_uint32(a.to_v4().to_ulong(), out); } else if (a.is_v6()) { address_v6::bytes_type bytes = a.to_v6().to_bytes(); std::copy(bytes.begin(), bytes.end(), out); } }
std::string address_to_bytes(address const& a) { #if LIBED2K_USE_IPV6 if (a.is_v6()) { address_v6::bytes_type b = a.to_v6().to_bytes(); return std::string((char*)&b[0], b.size()); } else #endif { address_v4::bytes_type b = a.to_v4().to_bytes(); return std::string((char*)&b[0], b.size()); } }
void write_address(address const& a, OutIt&& out) { #if TORRENT_USE_IPV6 if (a.is_v4()) { #endif write_uint32(a.to_v4().to_ulong(), out); #if TORRENT_USE_IPV6 } else if (a.is_v6()) { for (auto b : a.to_v6().to_bytes()) write_uint8(b, out); } #endif }
void write_address(address const& a, OutIt& out) { #if TORRENT_USE_IPV6 if (a.is_v4()) { #endif write_uint32(a.to_v4().to_ulong(), out); #if TORRENT_USE_IPV6 } else if (a.is_v6()) { address_v6::bytes_type bytes = a.to_v6().to_bytes(); std::copy(bytes.begin(), bytes.end(), out); } #endif }
void write_address(address const& a, OutIt& out) { #if TORRENT_USE_IPV6 if (a.is_v4()) { #endif write_uint32(a.to_v4().to_ulong(), out); #if TORRENT_USE_IPV6 } else if (a.is_v6()) { typedef address_v6::bytes_type bytes_t; bytes_t bytes = a.to_v6().to_bytes(); for (bytes_t::iterator i = bytes.begin() , end(bytes.end()); i != end; ++i) write_uint8(*i, out); } #endif }
std::string ipport_to_string(address const& addr,int port) { error_code ec; std::string straddr = addr.to_string(ec); std::string ret; ret.reserve(straddr.length()+10); if (addr.is_v6()) { ret += '['; ret += straddr; ret += ']'; ret += ':'; ret += boost::lexical_cast<std::string>(port); } else { ret += straddr; ret += ':'; ret += boost::lexical_cast<std::string>(port); } return ret; }
bool external_ip::cast_vote(address const& ip, int source_type, address const& source) { return m_vote_group[ip.is_v6()].cast_vote(ip, source_type, source); }