@@ -374,8 +374,11 @@ class NetinfoRequestHandler : public BaseRequestHandler
374
374
if (!batch[ID_NETWORKINFO][" error" ].isNull ()) return batch[ID_NETWORKINFO];
375
375
376
376
// Count peer connection totals, and if m_verbose is true, store peer data in a vector of structs.
377
+ const int64_t time_now{GetSystemTimeInSeconds ()};
377
378
int ipv4_i{0 }, ipv6_i{0 }, onion_i{0 }, block_relay_i{0 }, total_i{0 }; // inbound conn counters
378
379
int ipv4_o{0 }, ipv6_o{0 }, onion_o{0 }, block_relay_o{0 }, total_o{0 }; // outbound conn counters
380
+ size_t max_peer_id_length{2 }, max_version_length{1 };
381
+ bool is_asmap_on{false };
379
382
std::vector<Peer> peers;
380
383
const UniValue& getpeerinfo{batch[ID_PEERINFO][" result" ]};
381
384
@@ -420,13 +423,45 @@ class NetinfoRequestHandler : public BaseRequestHandler
420
423
const double min_ping{peer[" minping" ].isNull () ? -1 : peer[" minping" ].get_real ()};
421
424
const double ping{peer[" pingtime" ].isNull () ? -1 : peer[" pingtime" ].get_real ()};
422
425
peers.push_back ({peer_id, mapped_as, version, conn_time, last_recv, last_send, min_ping, ping, addr, sub_version, net_type, is_block_relay, !is_inbound});
426
+ max_peer_id_length = std::max (ToString (peer_id).length (), max_peer_id_length);
427
+ max_version_length = std::max ((ToString (version) + sub_version).length (), max_version_length);
428
+ is_asmap_on |= (mapped_as != 0 );
423
429
}
424
430
}
425
431
426
432
// Generate report header.
427
433
const UniValue& networkinfo{batch[ID_NETWORKINFO][" result" ]};
428
434
std::string result{strprintf (" %s %s%s - %i%s\n\n " , PACKAGE_NAME, FormatFullVersion (), ChainToString (), networkinfo[" protocolversion" ].get_int (), networkinfo[" subversion" ].get_str ())};
429
435
436
+ // Report detailed peer connections list sorted by direction and minimum ping time.
437
+ if (m_verbose && !peers.empty ()) {
438
+ std::sort (peers.begin (), peers.end ());
439
+ result += " Peer connections sorted by direction and min ping\n <-> relay net minping ping lastsend lastrecv uptime " ;
440
+ if (is_asmap_on) result += " asmap " ;
441
+ result += strprintf (" %*s %-*s address\n " , max_peer_id_length, " id" , max_version_length, " version" );
442
+ for (const Peer& peer : peers) {
443
+ std::string version{ToString (peer.version ) + peer.sub_version };
444
+ result += strprintf (
445
+ " %3s %5s %5s%8s%7s %8s %8s%7s%*i %*s %-*s %s\n " ,
446
+ peer.is_outbound ? " out" : " in" ,
447
+ peer.is_block_relay ? " block" : " full" ,
448
+ NetTypeEnumToString (peer.net_type ),
449
+ peer.min_ping == -1 ? " " : ToString (round (1000 * peer.min_ping )),
450
+ peer.ping == -1 ? " " : ToString (round (1000 * peer.ping )),
451
+ peer.last_send == 0 ? " " : ToString (time_now - peer.last_send ),
452
+ peer.last_recv == 0 ? " " : ToString (time_now - peer.last_recv ),
453
+ peer.conn_time == 0 ? " " : ToString ((time_now - peer.conn_time ) / 60 ),
454
+ is_asmap_on ? 7 : 0 , // variable spacing
455
+ is_asmap_on && peer.mapped_as != 0 ? ToString (peer.mapped_as ) : " " ,
456
+ max_peer_id_length, // variable spacing
457
+ peer.id ,
458
+ max_version_length, // variable spacing
459
+ version == " 0" ? " " : version,
460
+ peer.addr );
461
+ }
462
+ result += " ms ms sec sec min\n\n " ;
463
+ }
464
+
430
465
// Report peer connection totals by type.
431
466
total_i = ipv4_i + ipv6_i + onion_i;
432
467
total_o = ipv4_o + ipv6_o + onion_o;
0 commit comments