@@ -336,6 +336,39 @@ class NetinfoRequestHandler : public BaseRequestHandler
336
336
const std::vector<UniValue> batch{JSONRPCProcessBatchReply (batch_in)};
337
337
if (!batch[ID_PEERINFO][" error" ].isNull ()) return batch[ID_PEERINFO];
338
338
if (!batch[ID_NETWORKINFO][" error" ].isNull ()) return batch[ID_NETWORKINFO];
339
+
340
+ // Count peer connection totals.
341
+ int ipv4_i{0 }, ipv6_i{0 }, onion_i{0 }, block_relay_i{0 }; // inbound conn counters
342
+ int ipv4_o{0 }, ipv6_o{0 }, onion_o{0 }, block_relay_o{0 }; // outbound conn counters
343
+ const UniValue& getpeerinfo{batch[ID_PEERINFO][" result" ]};
344
+
345
+ for (const UniValue& peer : getpeerinfo.getValues ()) {
346
+ const std::string addr{peer[" addr" ].get_str ()};
347
+ const std::string addr_local{peer[" addrlocal" ].isNull () ? " " : peer[" addrlocal" ].get_str ()};
348
+ const int mapped_as{peer[" mapped_as" ].isNull () ? 0 : peer[" mapped_as" ].get_int ()};
349
+ const bool is_block_relay{!peer[" relaytxes" ].get_bool ()};
350
+ const bool is_inbound{peer[" inbound" ].get_bool ()};
351
+ if (is_inbound) {
352
+ if (IsAddrIPv6 (addr)) {
353
+ ++ipv6_i;
354
+ } else if (IsInboundOnion (addr_local, mapped_as)) {
355
+ ++onion_i;
356
+ } else {
357
+ ++ipv4_i;
358
+ }
359
+ if (is_block_relay) ++block_relay_i;
360
+ } else {
361
+ if (IsAddrIPv6 (addr)) {
362
+ ++ipv6_o;
363
+ } else if (IsOutboundOnion (addr, mapped_as)) {
364
+ ++onion_o;
365
+ } else {
366
+ ++ipv4_o;
367
+ }
368
+ if (is_block_relay) ++block_relay_o;
369
+ }
370
+ }
371
+
339
372
std::string result;
340
373
return JSONRPCReplyObj (UniValue{result}, NullUniValue, 1 );
341
374
}
0 commit comments