void traversal_algorithm::traverse(node_id const& id, udp::endpoint addr) { #ifdef TORRENT_DHT_VERBOSE_LOGGING if (id.is_all_zeros()) TORRENT_LOG(traversal) << time_now_string() << "[" << this << ":" << name() << "] WARNING: node returned a list which included a node with id 0"; #endif add_entry(id, addr, 0); }
void traversal_algorithm::traverse(node_id const& id, udp::endpoint addr) { #ifdef TORRENT_DHT_VERBOSE_LOGGING if (id.is_all_zeros()) { TORRENT_LOG(traversal) << time_now_string() << "[" << this << "] WARNING node returned a list which included a node with id 0"; } #endif // let the routing table know this node may exist m_node.m_table.heard_about(id, addr); add_entry(id, addr, 0); }
void disconnect_web_seed(peer_connection* p) { std::list<web_seed_entry>::iterator i = std::find_if(m_web_seeds.begin(), m_web_seeds.end() , (boost::bind(&web_seed_entry::connection, _1) == p)); // this happens if the web server responded with a redirect // or with something incorrect, so that we removed the web seed // immediately, before we disconnected if (i == m_web_seeds.end()) return; TORRENT_ASSERT(i->resolving == false); #if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING (*m_ses.m_logger) << time_now_string() << " disconnect_web_seed: " << i->url << "\n"; #endif TORRENT_ASSERT(i->connection); i->connection = 0; }
void rpc_manager::unreachable(udp::endpoint const& ep) { #ifdef TORRENT_DHT_VERBOSE_LOGGING TORRENT_LOG(rpc) << time_now_string() << " PORT_UNREACHABLE [ ip: " << ep << " ]"; #endif for (transactions_t::iterator i = m_transactions.begin(); i != m_transactions.end();) { TORRENT_ASSERT(*i); observer_ptr const& o = *i; if (o->target_ep() != ep) { ++i; continue; } observer_ptr ptr = *i; m_transactions.erase(i++); #ifdef TORRENT_DHT_VERBOSE_LOGGING TORRENT_LOG(rpc) << " found transaction [ tid: " << ptr->transaction_id() << " ]"; #endif ptr->timeout(); break; } }
void on_read_ok_block(std::pair<piece_block, block_entry> b, int ret, disk_io_job const& j) { aux::session_impl::mutex_t::scoped_lock l(m_torrent.session().m_mutex); disk_buffer_holder buffer(m_torrent.session(), j.buffer); // ignore read errors if (ret != j.buffer_size) return; adler32_crc crc; crc.update(j.buffer, j.buffer_size); crc.update((char const*)&m_salt, sizeof(m_salt)); unsigned long ok_crc = crc.final(); if (b.second.crc == ok_crc) return; policy::peer* p = b.second.peer; if (p == 0) return; if (!m_torrent.get_policy().has_peer(p)) return; #ifdef TORRENT_LOGGING char const* client = "-"; peer_info info; if (p->connection) { p->connection->get_peer_info(info); client = info.client.c_str(); } (*m_torrent.session().m_logger) << time_now_string() << " BANNING PEER [ p: " << b.first.piece_index << " | b: " << b.first.block_index << " | c: " << client << " | ok_crc: " << ok_crc << " | bad_crc: " << b.second.crc << " | ip: " << p->ip() << " ]\n"; #endif p->banned = true; if (p->connection) p->connection->disconnect("banning peer for sending bad data"); }
log_event(log& log) : log_(log) { if (log_.enabled()) log_ << time_now_string() << " [" << log.id() << "] "; }
void on_read_failed_block(piece_block b, address a, int ret, disk_io_job const& j) { aux::session_impl::mutex_t::scoped_lock l(m_torrent.session().m_mutex); disk_buffer_holder buffer(m_torrent.session(), j.buffer); // ignore read errors if (ret != j.buffer_size) return; adler32_crc crc; crc.update(j.buffer, j.buffer_size); crc.update((char const*)&m_salt, sizeof(m_salt)); std::pair<policy::iterator, policy::iterator> range = m_torrent.get_policy().find_peers(a); // there is no peer with this address anymore if (range.first == range.second) return; policy::peer* p = &range.first->second; block_entry e = {p, crc.final()}; std::map<piece_block, block_entry>::iterator i = m_block_crc.lower_bound(b); if (i != m_block_crc.end() && i->first == b && i->second.peer == p) { // this peer has sent us this block before if (i->second.crc != e.crc) { // this time the crc of the block is different // from the first time it sent it // at least one of them must be bad if (!m_torrent.get_policy().has_peer(p)) return; #ifdef TORRENT_LOGGING char const* client = "-"; peer_info info; if (p->connection) { p->connection->get_peer_info(info); client = info.client.c_str(); } (*m_torrent.session().m_logger) << time_now_string() << " BANNING PEER [ p: " << b.piece_index << " | b: " << b.block_index << " | c: " << client << " | crc1: " << i->second.crc << " | crc2: " << e.crc << " | ip: " << p->ip() << " ]\n"; #endif p->banned = true; if (p->connection) p->connection->disconnect("banning peer for sending bad data"); } // we already have this exact entry in the map // we don't have to insert it return; } m_block_crc.insert(i, std::make_pair(b, e)); #ifdef TORRENT_LOGGING char const* client = "-"; peer_info info; if (p->connection) { p->connection->get_peer_info(info); client = info.client.c_str(); } (*m_torrent.session().m_logger) << time_now_string() << " STORE BLOCK CRC [ p: " << b.piece_index << " | b: " << b.block_index << " | c: " << client << " | crc: " << e.crc << " | ip: " << p->ip() << " ]\n"; #endif }