@@ -41,20 +41,34 @@ AdnlAddressList AdnlLocalId::get_addr_list() const {
4141}
4242
4343void AdnlLocalId::receive (td::IPAddress addr, td::BufferSlice data) {
44- auto P = td::PromiseCreator::lambda (
45- [peer_table = peer_table_, dst = short_id_, addr, id = print_id ()](td::Result<AdnlPacket> R) {
46- if (R.is_error ()) {
47- VLOG (ADNL_WARNING) << id << " : dropping IN message: cannot decrypt: " << R.move_as_error ();
48- } else {
49- auto packet = R.move_as_ok ();
50- packet.set_remote_addr (addr);
51- td::actor::send_closure (peer_table, &AdnlPeerTable::receive_decrypted_packet, dst, std::move (packet));
52- }
53- });
54-
44+ InboundRateLimiter& rate_limiter = inbound_rate_limiter_[addr];
45+ if (!rate_limiter.rate_limiter .take ()) {
46+ VLOG (ADNL_NOTICE) << this << " : dropping IN message: rate limit exceeded" ;
47+ add_dropped_packet_stats (addr);
48+ return ;
49+ }
50+ ++rate_limiter.currently_decrypting_packets ;
51+ auto P = td::PromiseCreator::lambda ([SelfId = actor_id (this ), peer_table = peer_table_, dst = short_id_, addr,
52+ id = print_id (), size = data.size ()](td::Result<AdnlPacket> R) {
53+ td::actor::send_closure (SelfId, &AdnlLocalId::decrypt_packet_done, addr);
54+ if (R.is_error ()) {
55+ VLOG (ADNL_WARNING) << id << " : dropping IN message: cannot decrypt: " << R.move_as_error ();
56+ } else {
57+ auto packet = R.move_as_ok ();
58+ packet.set_remote_addr (addr);
59+ td::actor::send_closure (peer_table, &AdnlPeerTable::receive_decrypted_packet, dst, std::move (packet), size);
60+ }
61+ });
5562 decrypt (std::move (data), std::move (P));
5663}
5764
65+ void AdnlLocalId::decrypt_packet_done (td::IPAddress addr) {
66+ auto it = inbound_rate_limiter_.find (addr);
67+ CHECK (it != inbound_rate_limiter_.end ());
68+ --it->second .currently_decrypting_packets ;
69+ add_decrypted_packet_stats (addr);
70+ }
71+
5872void AdnlLocalId::deliver (AdnlNodeIdShort src, td::BufferSlice data) {
5973 auto s = std::move (data);
6074 for (auto &cb : cb_) {
@@ -292,6 +306,67 @@ void AdnlLocalId::update_packet(AdnlPacket packet, bool update_id, bool sign, td
292306 }
293307}
294308
309+ void AdnlLocalId::get_stats (td::Promise<tl_object_ptr<ton_api::adnl_stats_localId>> promise) {
310+ auto stats = create_tl_object<ton_api::adnl_stats_localId>();
311+ stats->short_id_ = short_id_.bits256_value ();
312+ for (auto &[ip, x] : inbound_rate_limiter_) {
313+ if (x.currently_decrypting_packets != 0 ) {
314+ stats->current_decrypt_ .push_back (create_tl_object<ton_api::adnl_stats_ipPackets>(
315+ ip.is_valid () ? PSTRING () << ip.get_ip_str () << " :" << ip.get_port () : " " , x.currently_decrypting_packets ));
316+ }
317+ }
318+ prepare_packet_stats ();
319+ stats->packets_recent_ = packet_stats_prev_.tl ();
320+ stats->packets_total_ = packet_stats_total_.tl ();
321+ stats->packets_total_ ->ts_start_ = (double )Adnl::adnl_start_time ();
322+ stats->packets_total_ ->ts_end_ = td::Clocks::system ();
323+ promise.set_result (std::move (stats));
324+ }
325+
326+ void AdnlLocalId::add_decrypted_packet_stats (td::IPAddress addr) {
327+ prepare_packet_stats ();
328+ ++packet_stats_cur_.decrypted_packets [addr];
329+ ++packet_stats_total_.decrypted_packets [addr];
330+ }
331+
332+ void AdnlLocalId::add_dropped_packet_stats (td::IPAddress addr) {
333+ prepare_packet_stats ();
334+ ++packet_stats_cur_.dropped_packets [addr];
335+ ++packet_stats_total_.dropped_packets [addr];
336+ }
337+
338+ void AdnlLocalId::prepare_packet_stats () {
339+ double now = td::Clocks::system ();
340+ if (now >= packet_stats_cur_.ts_end ) {
341+ packet_stats_prev_ = std::move (packet_stats_cur_);
342+ packet_stats_cur_ = {};
343+ auto now_int = (int )td::Clocks::system ();
344+ packet_stats_cur_.ts_start = (double )(now_int / 60 * 60 );
345+ packet_stats_cur_.ts_end = packet_stats_cur_.ts_start + 60.0 ;
346+ if (packet_stats_prev_.ts_end < now - 60.0 ) {
347+ packet_stats_prev_ = {};
348+ packet_stats_prev_.ts_end = packet_stats_cur_.ts_start ;
349+ packet_stats_prev_.ts_start = packet_stats_prev_.ts_end - 60.0 ;
350+ }
351+ }
352+ }
353+
354+ tl_object_ptr<ton_api::adnl_stats_localIdPackets> AdnlLocalId::PacketStats::tl () const {
355+ auto obj = create_tl_object<ton_api::adnl_stats_localIdPackets>();
356+ obj->ts_start_ = ts_start;
357+ obj->ts_end_ = ts_end;
358+ for (const auto &[ip, packets] : decrypted_packets) {
359+ obj->decrypted_packets_ .push_back (create_tl_object<ton_api::adnl_stats_ipPackets>(
360+ ip.is_valid () ? PSTRING () << ip.get_ip_str () << " :" << ip.get_port () : " " , packets));
361+ }
362+ for (const auto &[ip, packets] : dropped_packets) {
363+ obj->dropped_packets_ .push_back (create_tl_object<ton_api::adnl_stats_ipPackets>(
364+ ip.is_valid () ? PSTRING () << ip.get_ip_str () << " :" << ip.get_port () : " " , packets));
365+ }
366+ return obj;
367+ }
368+
369+
295370} // namespace adnl
296371
297372} // namespace ton
0 commit comments