void CKademlia::Process() { if( m_pInstance == NULL || !m_bRunning) return; bool bUpdateUserFile = false; uint32_t uMaxUsers = 0; uint32_t uTempUsers = 0; time_t uLastContact = 0; time_t tNow = time(NULL); ASSERT(m_pInstance->m_pPrefs != NULL); uLastContact = m_pInstance->m_pPrefs->GetLastContact(); CSearchManager::UpdateStats(); if( m_tStatusUpdate <= tNow ) { bUpdateUserFile = true; m_tStatusUpdate = MIN2S(1) + tNow; } if( m_tNextFirewallCheck <= tNow) RecheckFirewalled(); if (m_tNextUPnPCheck != 0 && m_tNextUPnPCheck <= tNow) { theApp.emuledlg->RefreshUPnP(); m_tNextUPnPCheck = 0; // will be reset on firewallcheck } if (m_tNextSelfLookup <= tNow) { CSearchManager::FindNode(m_pInstance->m_pPrefs->GetKadID(), true); m_tNextSelfLookup = HR2S(4) + tNow; } if (m_tNextFindBuddy <= tNow) { m_pInstance->m_pPrefs->SetFindBuddy(); m_tNextFindBuddy = MIN2S(20) + tNow; } if (m_tExternPortLookup <= tNow && CUDPFirewallTester::IsFWCheckUDPRunning() && GetPrefs()->FindExternKadPort(false)){ // if our UDP firewallcheck is running and we don't know our external port, we send a request every 15 seconds CContact* pContact = GetRoutingZone()->GetRandomContact(3, KADEMLIA_VERSION6_49aBETA); if (pContact != NULL){ DEBUG_ONLY( DebugLog(_T("Requesting our external port from %s"), ipstr(ntohl(pContact->GetIPAddress()))) ); GetUDPListener()->SendNullPacket(KADEMLIA2_PING, pContact->GetIPAddress(), pContact->GetUDPPort(), pContact->GetUDPKey(), &pContact->GetClientID()); } else DEBUG_ONLY( DebugLogWarning(_T("No valid client for requesting external port available")) ); m_tExternPortLookup = 15 + tNow; } for (EventMap::const_iterator itEventMap = m_mapEvents.begin(); itEventMap != m_mapEvents.end(); ++itEventMap) { CRoutingZone* pZone = itEventMap->first; if( bUpdateUserFile ) { uTempUsers = pZone->EstimateCount(); if( uMaxUsers < uTempUsers ) uMaxUsers = uTempUsers; } if (m_tBigTimer <= tNow) { if( pZone->m_tNextBigTimer <= tNow ) { if(pZone->OnBigTimer()) { pZone->m_tNextBigTimer = HR2S(1) + tNow; m_tBigTimer = SEC(10) + tNow; } } else { if( uLastContact && ( (tNow - uLastContact) > (KADEMLIADISCONNECTDELAY-MIN2S(5)))) { if(pZone->OnBigTimer()) { pZone->m_tNextBigTimer = HR2S(1) + tNow; m_tBigTimer = SEC(10) + tNow; } } } } if (pZone->m_tNextSmallTimer <= tNow) { pZone->OnSmallTimer(); pZone->m_tNextSmallTimer = MIN2S(1) + tNow; } } // This is a convenient place to add this, although not related to routing if (m_tNextSearchJumpStart <= tNow) { CSearchManager::JumpStart(); m_tNextSearchJumpStart = SEARCH_JUMPSTART + tNow; } // Try to consolidate any zones that are close to empty. if (m_tConsolidate <= tNow) { uint32_t uMergedCount = m_pInstance->m_pRoutingZone->Consolidate(); if(uMergedCount) AddDebugLogLine(false, _T("Kad merged %u Zones"), uMergedCount); m_tConsolidate = MIN2S(45) + tNow; } //Update user count only if changed. if( bUpdateUserFile ) { if( uMaxUsers != m_pInstance->m_pPrefs->GetKademliaUsers()) { m_pInstance->m_pPrefs->SetKademliaUsers(uMaxUsers); m_pInstance->m_pPrefs->SetKademliaFiles(); theApp.emuledlg->ShowUserCount(); } } if(!IsConnected() && !s_liBootstapList.IsEmpty() && (tNow - m_tBootstrap > 15 || (GetRoutingZone()->GetNumContacts() == 0 && tNow - m_tBootstrap >= 2))) { CContact* pContact = s_liBootstapList.RemoveHead(); m_tBootstrap = tNow; DebugLog(_T("Trying to Bootstrap Kad from %s, Distance: %s, Version: %u, %u Contacts left"), ipstr(ntohl(pContact->GetIPAddress())), pContact->GetDistance().ToHexString(), pContact->GetVersion(), s_liBootstapList.GetCount()); m_pInstance->m_pUDPListener->Bootstrap(pContact->GetIPAddress(), pContact->GetUDPPort(), pContact->GetVersion() > 1, pContact->GetVersion(), &pContact->GetClientID()); delete pContact; } if (GetUDPListener() != NULL) GetUDPListener()->ExpireClientSearch(); // function does only one compare in most cases, so no real need for a timer }
void CKademlia::Process() { if (instance == NULL || !m_running) { return; } time_t now = time(NULL); uint32_t maxUsers = 0; uint32_t tempUsers = 0; uint32_t lastContact = 0; bool updateUserFile = false; wxASSERT(instance->m_prefs != NULL); lastContact = instance->m_prefs->GetLastContact(); CSearchManager::UpdateStats(); if (m_statusUpdate <= now) { updateUserFile = true; m_statusUpdate = MIN2S(1) + now; } if (m_nextFirewallCheck <= now) { RecheckFirewalled(); } if (m_nextSelfLookup <= now) { CSearchManager::FindNode(instance->m_prefs->GetKadID(), true); m_nextSelfLookup = HR2S(4) + now; } if (m_nextFindBuddy <= now) { instance->m_prefs->SetFindBuddy(); m_nextFindBuddy = MIN2S(20) + now; } if (m_externPortLookup <= now && CUDPFirewallTester::IsFWCheckUDPRunning() && GetPrefs()->FindExternKadPort(false)) { // If our UDP firewallcheck is running and we don't know our external port, we send a request every 15 seconds CContact *contact = GetRoutingZone()->GetRandomContact(3, 6); if (contact != NULL) { AddDebugLogLineN(logKadPrefs, wxT("Requesting our external port from ") + KadIPToString(contact->GetIPAddress())); DebugSend(Kad2Ping, contact->GetIPAddress(), contact->GetUDPPort()); GetUDPListener()->SendNullPacket(KADEMLIA2_PING, contact->GetIPAddress(), contact->GetUDPPort(), contact->GetUDPKey(), &contact->GetClientID()); } else { AddDebugLogLineN(logKadPrefs, wxT("No valid client for requesting external port available")); } m_externPortLookup = 15 + now; } for (EventMap::const_iterator it = m_events.begin(); it != m_events.end(); ++it) { CRoutingZone *zone = it->first; if (updateUserFile) { // The EstimateCount function is not made for really small networks, if we are in LAN mode, it is actually // better to assume that all users of the network are in our routing table and use the real count function if (IsRunningInLANMode()) { tempUsers = zone->GetNumContacts(); } else { tempUsers = zone->EstimateCount(); } if (maxUsers < tempUsers) { maxUsers = tempUsers; } } if (m_bigTimer <= now) { if (zone->m_nextBigTimer <= now) { if(zone->OnBigTimer()) { zone->m_nextBigTimer = HR2S(1) + now; m_bigTimer = SEC(10) + now; } } else { if (lastContact && (now - lastContact > KADEMLIADISCONNECTDELAY - MIN2S(5))) { if(zone->OnBigTimer()) { zone->m_nextBigTimer = HR2S(1) + now; m_bigTimer = SEC(10) + now; } } } } if (zone->m_nextSmallTimer <= now) { zone->OnSmallTimer(); zone->m_nextSmallTimer = MIN2S(1) + now; } } // This is a convenient place to add this, although not related to routing if (m_nextSearchJumpStart <= now) { CSearchManager::JumpStart(); m_nextSearchJumpStart = SEARCH_JUMPSTART + now; } // Try to consolidate any zones that are close to empty. if (m_consolidate <= now) { uint32_t mergedCount = instance->m_routingZone->Consolidate(); if (mergedCount) { AddDebugLogLineN(logKadRouting, CFormat(wxT("Kad merged %u zones")) % mergedCount); } m_consolidate = MIN2S(45) + now; } // Update user count only if changed. if (updateUserFile) { if (maxUsers != instance->m_prefs->GetKademliaUsers()) { instance->m_prefs->SetKademliaUsers(maxUsers); instance->m_prefs->SetKademliaFiles(); theApp->ShowUserCount(); } } if (!IsConnected() && !s_bootstrapList.empty() && (now - m_bootstrap > 15 || (GetRoutingZone()->GetNumContacts() == 0 && now - m_bootstrap >= 2))) { CContact *contact = s_bootstrapList.front(); s_bootstrapList.pop_front(); m_bootstrap = now; AddDebugLogLineN(logKadMain, CFormat(wxT("Trying to bootstrap Kad from %s, Distance: %s Version: %u, %u contacts left")) % KadIPToString(contact->GetIPAddress()) % contact->GetDistance().ToHexString() % contact->GetVersion() % s_bootstrapList.size()); instance->m_udpListener->Bootstrap(contact->GetIPAddress(), contact->GetUDPPort(), contact->GetVersion(), &contact->GetClientID()); delete contact; } if (GetUDPListener() != NULL) { GetUDPListener()->ExpireClientSearch(); // function does only one compare in most cases, so no real need for a timer } }
void CKademlia::Process() { if( m_pInstance == NULL || !m_bRunning) return; bool bUpdateUserFile = false; uint32 uMaxUsers = 0; uint32 uTempUsers = 0; uint32 uLastContact = 0; time_t tNow = time(NULL); ASSERT(m_pInstance->m_pPrefs != NULL); uLastContact = m_pInstance->m_pPrefs->GetLastContact(); CSearchManager::UpdateStats(); if( m_tStatusUpdate <= tNow ) { bUpdateUserFile = true; m_tStatusUpdate = MIN2S(1) + tNow; #ifdef _BOOTSTRAPNODESDAT // do some random lookup to fill out contact list with fresh (but for routing useless) nodes which we can // use for our bootstrap nodes.dat if (GetRoutingZone()->GetNumContacts() < 1500) { CUInt128 uRandom; uRandom.SetValueRandom(); CSearchManager::FindNode(uRandom, false); } #endif } if( m_tNextFirewallCheck <= tNow) RecheckFirewalled(); if (m_tNextUPnPCheck != 0 && m_tNextUPnPCheck <= tNow) { theApp.emuledlg->RefreshUPnP(); m_tNextUPnPCheck = 0; // will be reset on firewallcheck } if (m_tNextSelfLookup <= tNow) { CSearchManager::FindNode(m_pInstance->m_pPrefs->GetKadID(), true); m_tNextSelfLookup = HR2S(4) + tNow; } if (m_tNextFindBuddy <= tNow) { m_pInstance->m_pPrefs->SetFindBuddy(); m_tNextFindBuddy = MIN2S(20) + tNow; } if (m_tExternPortLookup <= tNow && CUDPFirewallTester::IsFWCheckUDPRunning() && GetPrefs()->FindExternKadPort(false)){ // if our UDP firewallcheck is running and we don't know our external port, we send a request every 15 seconds CContact* pContact = GetRoutingZone()->GetRandomContact(3, KADEMLIA_VERSION6_49aBETA); if (pContact != NULL){ DEBUG_ONLY( DebugLog(_T("Requesting our external port from %s"), ipstr(ntohl(pContact->GetIPAddress()))) ); GetUDPListener()->SendNullPacket(KADEMLIA2_PING, pContact->GetIPAddress(), pContact->GetUDPPort(), pContact->GetUDPKey(), &pContact->GetClientID()); } else DEBUG_ONLY( DebugLogWarning(_T("No valid client for requesting external port available")) ); m_tExternPortLookup = 15 + tNow; } for (EventMap::const_iterator itEventMap = m_mapEvents.begin(); itEventMap != m_mapEvents.end(); ++itEventMap) { CRoutingZone* pZone = itEventMap->first; if( bUpdateUserFile ) { // The EstimateCount function is not made for really small networks, if we are in LAN mode, it is actually // better to assume that all users of the network are in our routingtable and use the real count function if (IsRunningInLANMode()) uTempUsers = pZone->GetNumContacts(); else uTempUsers = pZone->EstimateCount(); if( uMaxUsers < uTempUsers ) uMaxUsers = uTempUsers; } if (m_tBigTimer <= tNow) { if( pZone->m_tNextBigTimer <= tNow ) { if(pZone->OnBigTimer()) { pZone->m_tNextBigTimer = HR2S(1) + tNow; m_tBigTimer = SEC(10) + tNow; } } else { if( uLastContact && ( (tNow - uLastContact) > (KADEMLIADISCONNECTDELAY-MIN2S(5)))) { if(pZone->OnBigTimer()) { pZone->m_tNextBigTimer = HR2S(1) + tNow; m_tBigTimer = SEC(10) + tNow; } } } } if (pZone->m_tNextSmallTimer <= tNow) { pZone->OnSmallTimer(); pZone->m_tNextSmallTimer = MIN2S(1) + tNow; } } // This is a convenient place to add this, although not related to routing if (m_tNextSearchJumpStart <= tNow) { CSearchManager::JumpStart(); m_tNextSearchJumpStart = SEARCH_JUMPSTART + tNow; } // Try to consolidate any zones that are close to empty. if (m_tConsolidate <= tNow) { uint32 uMergedCount = m_pInstance->m_pRoutingZone->Consolidate(); if(uMergedCount) AddDebugLogLine(false, _T("Kad merged %u Zones"), uMergedCount); m_tConsolidate = MIN2S(45) + tNow; } //Update user count only if changed. if( bUpdateUserFile ) { if( uMaxUsers != m_pInstance->m_pPrefs->GetKademliaUsers()) { m_pInstance->m_pPrefs->SetKademliaUsers(uMaxUsers); m_pInstance->m_pPrefs->SetKademliaFiles(); theApp.emuledlg->ShowUserCount(); } } if(!IsConnected() && !s_liBootstapList.IsEmpty() && (tNow - m_tBootstrap > 15 || (GetRoutingZone()->GetNumContacts() == 0 && tNow - m_tBootstrap >= 2))) { if (!s_liTriedBootstapList.IsEmpty()) { CContact* pLastTriedContact = s_liTriedBootstapList.GetHead(); pLastTriedContact->SetBootstrapFailed(); theApp.emuledlg->kademliawnd->ContactRef(pLastTriedContact); } CContact* pContact = s_liBootstapList.RemoveHead(); m_tBootstrap = tNow; DebugLog(_T("Trying to Bootstrap Kad from %s, Distance: %s, Version: %u, %u Contacts left"), ipstr(ntohl(pContact->GetIPAddress())), pContact->GetDistance().ToHexString(), pContact->GetVersion(), s_liBootstapList.GetCount()); m_pInstance->m_pUDPListener->Bootstrap(pContact->GetIPAddress(), pContact->GetUDPPort(), pContact->GetVersion(), &pContact->GetClientID()); s_liTriedBootstapList.AddHead(pContact); } else if (!IsConnected() && s_liBootstapList.IsEmpty() && !s_liTriedBootstapList.IsEmpty() && (tNow - m_tBootstrap > 15 || (GetRoutingZone()->GetNumContacts() == 0 && tNow - m_tBootstrap >= 2))) { // failed to bootstrap AddLogLine(true, GetResString(IDS_BOOTSTRAPFAILED)); theApp.emuledlg->kademliawnd->StopUpdateContacts(); while (!s_liTriedBootstapList.IsEmpty()) delete s_liTriedBootstapList.RemoveHead(); theApp.emuledlg->kademliawnd->StartUpdateContacts(); } if (GetUDPListener() != NULL) GetUDPListener()->ExpireClientSearch(); // function does only one compare in most cases, so no real need for a timer }