2020-05-22 15:18:41 +02:00
/*
2025-01-19 00:26:16 +01:00
* Copyright ( c ) 2013 - 2025 , The PurpleI2P Project
2020-05-22 15:18:41 +02:00
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
2015-03-24 17:47:57 +01:00
# ifndef PROFILING_H__
# define PROFILING_H__
# include <memory>
2024-04-27 22:00:43 +02:00
# include <future>
2025-01-19 00:26:16 +01:00
# include <functional>
2024-10-22 02:58:09 +02:00
# include <boost/asio.hpp>
2015-03-24 17:47:57 +01:00
# include "Identity.h"
namespace i2p
{
namespace data
2018-01-06 04:48:51 +01:00
{
2015-03-24 23:48:16 +01:00
// sections
const char PEER_PROFILE_SECTION_PARTICIPATION [ ] = " participation " ;
2015-06-05 21:55:21 +02:00
const char PEER_PROFILE_SECTION_USAGE [ ] = " usage " ;
2018-01-06 04:48:51 +01:00
// params
2024-08-26 01:07:01 +02:00
const char PEER_PROFILE_LAST_UPDATE_TIME [ ] = " lastupdatetime " ; // deprecated
const char PEER_PROFILE_LAST_UPDATE_TIMESTAMP [ ] = " lastupdatetimestamp " ;
2023-02-06 19:19:41 +01:00
const char PEER_PROFILE_LAST_UNREACHABLE_TIME [ ] = " lastunreachabletime " ;
2015-03-24 23:48:16 +01:00
const char PEER_PROFILE_PARTICIPATION_AGREED [ ] = " agreed " ;
const char PEER_PROFILE_PARTICIPATION_DECLINED [ ] = " declined " ;
2018-01-06 04:48:51 +01:00
const char PEER_PROFILE_PARTICIPATION_NON_REPLIED [ ] = " nonreplied " ;
2015-06-05 21:55:21 +02:00
const char PEER_PROFILE_USAGE_TAKEN [ ] = " taken " ;
const char PEER_PROFILE_USAGE_REJECTED [ ] = " rejected " ;
2023-05-05 22:14:54 +02:00
const char PEER_PROFILE_USAGE_CONNECTED [ ] = " connected " ;
2024-07-07 17:26:17 +02:00
const char PEER_PROFILE_USAGE_DUPLICATED [ ] = " duplicated " ;
2023-05-05 22:14:54 +02:00
2024-08-26 01:07:01 +02:00
const int PEER_PROFILE_EXPIRATION_TIMEOUT = 36 * 60 * 60 ; // in seconds (1.5 days)
2024-04-27 22:00:43 +02:00
const int PEER_PROFILE_AUTOCLEAN_TIMEOUT = 1500 ; // in seconds (25 minutes)
const int PEER_PROFILE_AUTOCLEAN_VARIANCE = 900 ; // in seconds (15 minutes)
const int PEER_PROFILE_OBSOLETE_PROFILES_CLEAN_TIMEOUT = 5400 ; // in seconds (1.5 hours)
const int PEER_PROFILE_OBSOLETE_PROFILES_CLEAN_VARIANCE = 2400 ; // in seconds (40 minutes)
2024-11-05 00:20:46 +01:00
const int PEER_PROFILE_DECLINED_RECENTLY_INTERVAL = 330 ; // in seconds (5.5 minutes)
const int PEER_PROFILE_MAX_DECLINED_INTERVAL = 4400 ; // in second (1.5 hours)
2023-02-11 22:22:02 +01:00
const int PEER_PROFILE_PERSIST_INTERVAL = 3300 ; // in seconds (55 minutes)
2024-01-31 21:41:21 +01:00
const int PEER_PROFILE_UNREACHABLE_INTERVAL = 480 ; // in seconds (8 minutes)
2023-05-05 23:30:44 +02:00
const int PEER_PROFILE_USEFUL_THRESHOLD = 3 ;
2024-11-05 00:20:46 +01:00
const int PEER_PROFILE_ALWAYS_DECLINING_NUM = 5 ; // num declines in row to consider always declined
2025-01-19 00:26:16 +01:00
const int PEER_PROFILE_APPLY_POSTPONED_TIMEOUT = 2100 ; // in milliseconds
const int PEER_PROFILE_APPLY_POSTPONED_TIMEOUT_VARIANCE = 500 ; // in milliseconds
2024-11-05 00:20:46 +01:00
2015-03-24 17:47:57 +01:00
class RouterProfile
{
public :
2016-12-31 02:09:41 +01:00
RouterProfile ( ) ;
2018-01-06 04:48:51 +01:00
2016-12-31 02:09:41 +01:00
void Save ( const IdentHash & identHash ) ;
void Load ( const IdentHash & identHash ) ;
2015-03-28 01:34:31 +01:00
2015-06-05 21:55:21 +02:00
bool IsBad ( ) ;
2023-02-06 19:19:41 +01:00
bool IsUnreachable ( ) ;
2023-05-05 22:14:54 +02:00
bool IsReal ( ) const { return m_HasConnected | | m_NumTunnelsAgreed > 0 | | m_NumTunnelsDeclined > 0 ; }
2023-02-11 07:41:51 +01:00
2015-03-24 23:48:16 +01:00
void TunnelBuildResponse ( uint8_t ret ) ;
2015-03-28 21:09:34 +01:00
void TunnelNonReplied ( ) ;
2015-03-31 03:05:04 +02:00
2023-07-18 00:44:51 +02:00
void Unreachable ( bool unreachable ) ;
2023-05-05 22:14:54 +02:00
void Connected ( ) ;
2024-07-07 17:26:17 +02:00
void Duplicated ( ) ;
2023-02-11 07:41:51 +01:00
2024-08-26 01:07:01 +02:00
uint64_t GetLastUpdateTime ( ) const { return m_LastUpdateTime ; } ;
2023-02-11 22:22:02 +01:00
bool IsUpdated ( ) const { return m_IsUpdated ; } ;
2023-05-06 09:59:40 +02:00
bool IsUseful ( ) const ;
2024-07-08 16:39:18 +02:00
bool IsDuplicated ( ) const { return m_IsDuplicated ; } ;
2024-10-22 02:58:09 +02:00
const boost : : asio : : ip : : udp : : endpoint & GetLastEndpoint ( ) const { return m_LastEndpoint ; }
void SetLastEndpoint ( const boost : : asio : : ip : : udp : : endpoint & ep ) { m_LastEndpoint = ep ; }
bool HasLastEndpoint ( bool v4 ) const { return ! m_LastEndpoint . address ( ) . is_unspecified ( ) & & m_LastEndpoint . port ( ) & &
( ( v4 & & m_LastEndpoint . address ( ) . is_v4 ( ) ) | | ( ! v4 & & m_LastEndpoint . address ( ) . is_v6 ( ) ) ) ; }
2023-02-11 22:22:02 +01:00
2015-03-31 03:05:04 +02:00
private :
void UpdateTime ( ) ;
2015-03-31 23:13:01 +02:00
bool IsAlwaysDeclining ( ) const { return ! m_NumTunnelsAgreed & & m_NumTunnelsDeclined > = 5 ; } ;
2015-06-05 21:55:21 +02:00
bool IsLowPartcipationRate ( ) const ;
bool IsLowReplyRate ( ) const ;
2024-11-05 00:20:46 +01:00
bool IsDeclinedRecently ( uint64_t ts ) ;
2018-01-06 04:48:51 +01:00
private :
2015-03-24 17:47:57 +01:00
2023-02-11 22:22:02 +01:00
bool m_IsUpdated ;
2024-08-26 01:07:01 +02:00
uint64_t m_LastDeclineTime , m_LastUnreachableTime , m_LastUpdateTime ; // in seconds
2015-03-24 17:47:57 +01:00
// participation
uint32_t m_NumTunnelsAgreed ;
2018-01-06 04:48:51 +01:00
uint32_t m_NumTunnelsDeclined ;
2015-03-28 21:09:34 +01:00
uint32_t m_NumTunnelsNonReplied ;
2015-06-05 21:55:21 +02:00
// usage
uint32_t m_NumTimesTaken ;
2018-01-06 04:48:51 +01:00
uint32_t m_NumTimesRejected ;
2023-05-06 22:43:09 +02:00
bool m_HasConnected ; // successful trusted(incoming or NTCP2) connection
2024-07-07 17:26:17 +02:00
bool m_IsDuplicated ;
2024-10-22 02:58:09 +02:00
// connectivity
boost : : asio : : ip : : udp : : endpoint m_LastEndpoint ; // SSU2 for non-published addresses
2018-01-06 04:48:51 +01:00
} ;
2015-03-24 17:47:57 +01:00
2018-01-06 04:48:51 +01:00
std : : shared_ptr < RouterProfile > GetRouterProfile ( const IdentHash & identHash ) ;
2024-03-03 13:42:39 +01:00
bool IsRouterBanned ( const IdentHash & identHash ) ; // check only existing profiles
2016-02-20 02:00:00 +01:00
void InitProfilesStorage ( ) ;
2024-04-27 22:00:43 +02:00
std : : future < void > DeleteObsoleteProfiles ( ) ;
2023-02-11 22:22:02 +01:00
void SaveProfiles ( ) ;
2024-04-27 22:00:43 +02:00
std : : future < void > PersistProfiles ( ) ;
2025-01-19 00:26:16 +01:00
bool UpdateRouterProfile ( const IdentHash & identHash , std : : function < void ( std : : shared_ptr < RouterProfile > ) > update ) ; // return true if updated immediately, and false if postponed
std : : future < void > FlushPostponedRouterProfileUpdates ( ) ;
2018-01-06 04:48:51 +01:00
}
}
2015-03-24 17:47:57 +01:00
# endif