Skip to content
Snippets Groups Projects
Select Git revision
  • 18e53b9ec83bf41f4b08431fe7e99a8bfaf6cd1f
  • master default
  • cmake_fixes
  • pulls/1772757862/750
  • copilot/fix-770
  • windows_ci_static
  • c_link
  • cpack
  • windows_ci
  • cert_pk_id
  • proxy_push_result
  • cnode_put_id
  • update-windows-build
  • proxy
  • resubscribe_on_token_change
  • actions
  • client_mode
  • llhttp
  • search_node_add
  • crypto_aes_gcm_argon2
  • ios_notifications
  • v3.4.0
  • v3.3.1
  • v3.3.1rc1
  • v3.3.1rc2
  • v3.3.0
  • v3.2.0
  • v3.1.11
  • v3.1.10
  • v3.1.9
  • v3.1.8.2
  • v3.1.8.1
  • v3.1.8
  • v3.1.7
  • v3.1.6
  • v3.1.5
  • v3.1.4
  • v3.1.3
  • v3.1.2
  • v3.1
  • v3.0.1
41 results

dht.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    dht.cpp 93.23 KiB
    /*
     *  Copyright (C) 2014-2022 Savoir-faire Linux Inc.
     *  Author(s) : Adrien Béraud <adrien.beraud@savoirfairelinux.com>
     *              Simon Désaulniers <simon.desaulniers@savoirfairelinux.com>
     *
     *  This program is free software; you can redistribute it and/or modify
     *  it under the terms of the GNU General Public License as published by
     *  the Free Software Foundation; either version 3 of the License, or
     *  (at your option) any later version.
     *
     *  This program is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *  GNU General Public License for more details.
     *
     *  You should have received a copy of the GNU General Public License
     *  along with this program. If not, see <https://www.gnu.org/licenses/>.
     */
    
    #include "dht.h"
    #include "rng.h"
    #include "search.h"
    #include "storage.h"
    #include "request.h"
    
    #include <msgpack.hpp>
    
    #include <algorithm>
    #include <random>
    #include <sstream>
    #include <fstream>
    
    #include <inttypes.h>
    
    namespace dht {
    
    using namespace std::placeholders;
    
    constexpr std::chrono::minutes Dht::MAX_STORAGE_MAINTENANCE_EXPIRE_TIME;
    constexpr std::chrono::minutes Dht::SEARCH_EXPIRE_TIME;
    constexpr std::chrono::seconds Dht::BOOTSTRAP_PERIOD;
    constexpr duration Dht::LISTEN_EXPIRE_TIME;
    constexpr duration Dht::LISTEN_EXPIRE_TIME_PUBLIC;
    constexpr duration Dht::REANNOUNCE_MARGIN;
    static constexpr size_t MAX_REQUESTS_PER_SEC {8 * 1024};
    static constexpr duration BOOTSTRAP_PERIOD_MAX {std::chrono::hours(24)};
    
    NodeStatus
    Dht::updateStatus(sa_family_t af)
    {
        auto& d = dht(af);
        auto old = d.status;
        d.status = d.getStatus(scheduler.time());
        if (d.status != old) {
            auto& other = dht(af == AF_INET ? AF_INET6 : AF_INET);
            if (other.status == NodeStatus::Disconnected && d.status == NodeStatus::Disconnected) {
                onDisconnected();
            } else if (other.status == NodeStatus::Connected || d.status == NodeStatus::Connected) {
                onConnected();
            }
        }
        return d.status;
    }
    
    NodeStatus
    Dht::Kad::getStatus(time_point now) const
    {
        unsigned dubious = 0;
        for (const auto& b : buckets) {
            for (auto& n : b.nodes) {