bool CSearchManager::FindNodeFWCheckUDP(){ CancelNodeFWCheckUDPSearch(); CUInt128 uID; uID.SetValueRandom(); DebugLog(_T("Starting NODEFWCHECKUDP Kad Search")); CSearch *pSearch = new CSearch; pSearch->m_uType = CSearch::NODEFWCHECKUDP; pSearch->m_uTarget = uID; return StartSearch(pSearch); }
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 }