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("
| ")
+ .append(_t("Transport")).append(" | ")
+ .append(_t("Total")).append(" | ")
+ .append(_t("IPv4")).append("  | ")
+ .append(_t("IPv4")).append("  | ")
+ .append(_t("IPv6")).append("  | ")
+ .append(_t("IPv6")).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("| ")
+ .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(" |
\n");
+ }
+ }
+ 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;