diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/PeerHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/PeerHelper.java index dcd0b7267..bff8a6114 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/PeerHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/PeerHelper.java @@ -23,6 +23,7 @@ import net.i2p.router.transport.udp.PeerState; import net.i2p.router.transport.udp.UDPTransport; import net.i2p.router.web.HelperBase; import static net.i2p.router.web.helpers.UDPSorters.*; +import net.i2p.util.Addresses; import net.i2p.util.SystemVersion; @@ -34,16 +35,20 @@ public class PeerHelper extends HelperBase { private boolean _graphical; private static final String titles[] = { + _x("Status"), _x("Addresses"), "NTCP", "SSU", + _x("Banned"), _x("UPnP Status") }; private static final String links[] = { "", + "?tx=addresses", "?tx=ntcp", "?tx=ssu", + "?tx=banned", "?tx=upnp" }; @@ -101,7 +106,7 @@ public class PeerHelper extends HelperBase { return; } renderNavBar(out); - if (isAdvanced() && _transport == null) { + if (_transport == null) { out.write("

"); out.write(_t("Status")); out.write(": "); @@ -110,37 +115,7 @@ public class PeerHelper extends HelperBase { } SortedMap transports = _context.commSystem().getTransports(); - if (_transport != null && !_transport.equals("upnp")) { - boolean rendered = false; - for (Map.Entry e : transports.entrySet()) { - String style = e.getKey(); - Transport t = e.getValue(); - if (style.equals("NTCP") && "ntcp".equals(_transport)) { - NTCPTransport nt = (NTCPTransport) t; - render(nt, out, urlBase, sortFlags); - rendered = true; - break; - } else if (style.equals("SSU") && "ssu".equals(_transport)) { - UDPTransport ut = (UDPTransport) t; - render(ut, out, urlBase, sortFlags); - rendered = true; - break; - } else if (style.equals(_transport)) { - // pluggable (none yet) - t.renderStatusHTML(out, urlBase, sortFlags); - rendered = true; - break; - } - } - if (rendered) { - out.write(getTransportsLegend()); - } else { - out.write("

" + - "Transport not enabled: " + - DataHelper.escapeHTML(_transport) + - "

"); - } - } else if (_transport == null) { + if ("addresses".equals(_transport)) { StringBuilder buf = new StringBuilder(4*1024); buf.append("

").append(_t("Router Transport Addresses")).append("

\n");
             if (!transports.isEmpty()) {
@@ -179,6 +154,98 @@ public class PeerHelper extends HelperBase {
                .append("

"); out.write(buf.toString()); _context.commSystem().renderStatusHTML(_out, _urlBase, _sortFlags); + } else if ("banned".equals(_transport)) { + BanlistRenderer br = new BanlistRenderer(_context); + br.renderStatusHTML(_out); + } else if (_transport != null) { + boolean rendered = false; + for (Map.Entry e : transports.entrySet()) { + String style = e.getKey(); + Transport t = e.getValue(); + if (style.equals("NTCP") && "ntcp".equals(_transport)) { + NTCPTransport nt = (NTCPTransport) t; + render(nt, out, urlBase, sortFlags); + rendered = true; + break; + } else if (style.equals("SSU") && "ssu".equals(_transport)) { + UDPTransport ut = (UDPTransport) t; + render(ut, out, urlBase, sortFlags); + rendered = true; + break; + } else if (style.equals(_transport)) { + // pluggable (none yet) + t.renderStatusHTML(out, urlBase, sortFlags); + rendered = true; + break; + } + } + if (rendered) { + out.write(getTransportsLegend()); + } else { + out.write("

" + + "Transport not enabled: " + + DataHelper.escapeHTML(_transport) + + "

"); + } + } else { + // summary + StringBuilder buf = new StringBuilder(512); + buf.append("

").append(_t("Peer Connections")).append("

\n"); + boolean warnInbound = !_context.router().isHidden() && _context.router().getUptime() > 15*60*1000; + boolean warnIPv6 = Addresses.isConnectedIPv6(); + int[] totals = new int[5]; + for (Map.Entry e : transports.entrySet()) { + String style = e.getKey(); + Transport t = e.getValue(); + int[] counts = t.getPeerCounts(); + for (int idx = 0; idx < 8; idx += 4) { + if (style.equals("NTCP") && idx == 0) + continue; + buf.append("\n"); + } + } + buf.append("
") + .append(_t("Transport")).append("") + .append(_t("Total")).append("") + .append(_t("IPv4")).append(" \"").append(_t("Inbound")).append("\"") + .append(_t("IPv4")).append(" \"").append(_t("Outbound")).append("\"") + .append(_t("IPv6")).append(" \"").append(_t("Inbound")).append("\"") + .append(_t("IPv6")).append(" \"").append(_t("Outbound")).append("\"
") + .append(style) + .append(1 + (idx / 4)) + .append(""); + int total = 0; + for (int i = 0; i < 4; i++) { + total += counts[idx + i]; + } + if (total <= 0) + buf.append(" "); + else + totals[0] += total; + buf.append(total); + for (int i = 0; i < 4; i++) { + int cnt = counts[idx + i]; + buf.append(""); + if (cnt <= 0) { + if ((i >= 2 || warnIPv6) && ((i & 0x01) != 0 || warnInbound)) + buf.append(" "); + } else { + totals[i + 1] += cnt; + } + buf.append(cnt); + } + buf.append("
").append(_t("Total")).append(""); + for (int i = 0; i < 5; i++) { + int cnt = totals[i]; + buf.append(""); + if (cnt <= 0) { + if ((i >= 3 || warnIPv6) && ((i & 0x01) == 0 || warnInbound)) + buf.append(" "); + } + buf.append("").append(cnt).append("
\n"); + out.write(buf.toString()); } out.flush(); } @@ -187,12 +254,16 @@ public class PeerHelper extends HelperBase { * @since 0.9.38 */ private int getTab() { - if ("ntcp".equals(_transport)) + if ("addresses".equals(_transport)) return 1; - if ("ssu".equals(_transport)) + if ("ntcp".equals(_transport)) return 2; - if ("upnp".equals(_transport)) + if ("ssu".equals(_transport)) return 3; + if ("banned".equals(_transport)) + return 4; + if ("upnp".equals(_transport)) + return 5; return 0; } @@ -213,10 +284,10 @@ public class PeerHelper extends HelperBase { buf.append(""); buf.append(_t(titles[i])); } else { - if (i == 1) { + if (i == 2) { if (!_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_NTCP)) continue; - } else if (i == 2) { + } else if (i == 3) { if (!_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP)) continue; } @@ -734,7 +805,7 @@ public class PeerHelper extends HelperBase { //buf.append("
 "); buf.append(""); buf.append(DataHelper.formatDuration2(rtoTotal/numPeers)); - buf.append("").append(ut.getMTU(false)).append(""); + buf.append(""); // MTU } buf.append(""); buf.append(recvTotal).append("").append(sendTotal).append("\n" + diff --git a/router/java/src/net/i2p/router/transport/Transport.java b/router/java/src/net/i2p/router/transport/Transport.java index c71607809..552a249d2 100644 --- a/router/java/src/net/i2p/router/transport/Transport.java +++ b/router/java/src/net/i2p/router/transport/Transport.java @@ -173,6 +173,15 @@ public interface Transport { public int countPeers(); public int countActivePeers(); public int countActiveSendPeers(); + + /** + * @return 8 bytes: + * version 1 ipv4 in/out, ipv6 in/out + * version 2 ipv4 in/out, ipv6 in/out + * @since 0.9.57 + */ + public int[] getPeerCounts(); + public boolean haveCapacity(); public boolean haveCapacity(int pct); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 60907080c..0de5f6300 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -724,6 +724,25 @@ public class NTCPTransport extends TransportImpl { public int countPeers() { return _conByIdent.size(); } + + /** + * @return 8 bytes: + * version 1 4 bytes all zeros + * version 2 ipv4 in/out, ipv6 in/out + * @since 0.9.57 + */ + public int[] getPeerCounts() { + int[] rv = new int[8]; + for (NTCPConnection con : _conByIdent.values()) { + int idx = 4; + if (con.isIPv6()) + idx += 2; + if (!con.isInbound()) + idx++; + rv[idx]++; + } + return rv; + } /** * For /peers UI only. Not a public API, not for external use. diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index a066995fb..badf8781b 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -3399,6 +3399,27 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return _peersByIdent.size(); } + /** + * @return 8 bytes: + * version 1 ipv4 in/out, ipv6 in/out + * version 2 ipv4 in/out, ipv6 in/out + * @since 0.9.57 + */ + public int[] getPeerCounts() { + int[] rv = new int[8]; + for (PeerState peer : _peersByIdent.values()) { + int idx = 0; + if (peer.getVersion() > 1) + idx += 4; + if (peer.isIPv6()) + idx += 2; + if (!peer.isInbound()) + idx++; + rv[idx]++; + } + return rv; + } + public int countActivePeers() { long old = _context.clock().now() - 5*60*1000; int active = 0;