diff --git a/router/java/src/net/i2p/router/transport/udp/Sorters.java b/router/java/src/net/i2p/router/transport/udp/Sorters.java new file mode 100644 index 0000000000..21ea5ec7af --- /dev/null +++ b/router/java/src/net/i2p/router/transport/udp/Sorters.java @@ -0,0 +1,304 @@ +package net.i2p.router.transport.udp; + +import java.io.Serializable; +import java.util.Collections; +import java.util.Comparator; + +import net.i2p.data.DataHelper; + +/** + * Comparators for various columns + * + * @since 0.9.18 moved from UDPTransport + */ +class Sorters { + + static final int FLAG_ALPHA = 0; + static final int FLAG_IDLE_IN = 1; + static final int FLAG_IDLE_OUT = 2; + static final int FLAG_RATE_IN = 3; + static final int FLAG_RATE_OUT = 4; + static final int FLAG_SKEW = 5; + static final int FLAG_CWND= 6; + static final int FLAG_SSTHRESH = 7; + static final int FLAG_RTT = 8; + // static final int FLAG_DEV = 9; + static final int FLAG_RTO = 10; + static final int FLAG_MTU = 11; + static final int FLAG_SEND = 12; + static final int FLAG_RECV = 13; + static final int FLAG_RESEND = 14; + static final int FLAG_DUP = 15; + static final int FLAG_UPTIME = 16; + static final int FLAG_DEBUG = 99; + + static Comparator getComparator(int sortFlags) { + Comparator rv; + switch (Math.abs(sortFlags)) { + case FLAG_IDLE_IN: + rv = new IdleInComparator(); + break; + case FLAG_IDLE_OUT: + rv = new IdleOutComparator(); + break; + case FLAG_RATE_IN: + rv = new RateInComparator(); + break; + case FLAG_RATE_OUT: + rv = new RateOutComparator(); + break; + case FLAG_UPTIME: + rv = new UptimeComparator(); + break; + case FLAG_SKEW: + rv = new SkewComparator(); + break; + case FLAG_CWND: + rv = new CwndComparator(); + break; + case FLAG_SSTHRESH: + rv = new SsthreshComparator(); + break; + case FLAG_RTT: + rv = new RTTComparator(); + break; + //case FLAG_DEV: + // rv = new DevComparator(); + // break; + case FLAG_RTO: + rv = new RTOComparator(); + break; + case FLAG_MTU: + rv = new MTUComparator(); + break; + case FLAG_SEND: + rv = new SendCountComparator(); + break; + case FLAG_RECV: + rv = new RecvCountComparator(); + break; + case FLAG_RESEND: + rv = new ResendComparator(); + break; + case FLAG_DUP: + rv = new DupComparator(); + break; + case FLAG_ALPHA: + default: + rv = new AlphaComparator(); + break; + } + if (sortFlags < 0) + rv = Collections.reverseOrder(rv); + return rv; + } + + static class AlphaComparator extends PeerComparator { + } + + static class IdleInComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = r.getLastReceiveTime() - l.getLastReceiveTime(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class IdleOutComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = r.getLastSendTime() - l.getLastSendTime(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class RateInComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getReceiveBps() - r.getReceiveBps(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class RateOutComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getSendBps() - r.getSendBps(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class UptimeComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class SkewComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew()); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class CwndComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getSendWindowBytes() - r.getSendWindowBytes(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class SsthreshComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getSlowStartThreshold() - r.getSlowStartThreshold(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class RTTComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getRTT() - r.getRTT(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + /*** + static class DevComparator extends PeerComparator { + static final DevComparator _instance = new DevComparator(); + public static final DevComparator instance() { return _instance; } + @Override + public int compare(PeerState l, PeerState r) { + long rv = l.getRTTDeviation() - r.getRTTDeviation(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + ****/ + + /** */ + static class RTOComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getRTO() - r.getRTO(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class MTUComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + int rv = l.getMTU() - r.getMTU(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return rv; + } + } + + static class SendCountComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class RecvCountComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = l.getPacketsReceived() - r.getPacketsReceived(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class ResendComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class DupComparator extends PeerComparator { + @Override + public int compare(PeerState l, PeerState r) { + long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate(); + if (rv == 0) // fallback on alpha + return super.compare(l, r); + else + return (int)rv; + } + } + + static class PeerComparator implements Comparator, Serializable { + public int compare(PeerState l, PeerState r) { + return DataHelper.compareTo(l.getRemotePeer().getData(), r.getRemotePeer().getData()); + } + } + + static void appendSortLinks(StringBuilder buf, String urlBase, int sortFlags, String descr, int ascending) { + if (ascending == FLAG_ALPHA) { // 0 + buf.append(" \"V\""); + } else if (sortFlags == ascending) { + buf.append(" \"V\"" + + "\"^\""); + } else if (sortFlags == 0 - ascending) { + buf.append(" \"V\"\"^\""); + } else { + buf.append(" \"V\"" + + "\"^\""); + } + } +} 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 efed5b13b0..913c3b92cc 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1,7 +1,6 @@ package net.i2p.router.transport.udp; import java.io.IOException; -import java.io.Serializable; import java.io.Writer; import java.net.InetAddress; import java.net.SocketException; @@ -9,8 +8,6 @@ import java.net.UnknownHostException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -42,8 +39,9 @@ import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; import net.i2p.router.transport.TransportUtil; import static net.i2p.router.transport.TransportUtil.IPv6Config.*; -import static net.i2p.router.transport.udp.PeerTestState.Role.*; import net.i2p.router.transport.crypto.DHSessionKeyBuilder; +import static net.i2p.router.transport.udp.PeerTestState.Role.*; +import static net.i2p.router.transport.udp.Sorters.*; import net.i2p.router.util.EventLog; import net.i2p.router.util.RandomIterator; import net.i2p.util.Addresses; @@ -2254,295 +2252,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority DHSessionKeyBuilder.Factory getDHFactory() { return _dhFactory; } - - private static final int FLAG_ALPHA = 0; - private static final int FLAG_IDLE_IN = 1; - private static final int FLAG_IDLE_OUT = 2; - private static final int FLAG_RATE_IN = 3; - private static final int FLAG_RATE_OUT = 4; - private static final int FLAG_SKEW = 5; - private static final int FLAG_CWND= 6; - private static final int FLAG_SSTHRESH = 7; - private static final int FLAG_RTT = 8; - //private static final int FLAG_DEV = 9; - private static final int FLAG_RTO = 10; - private static final int FLAG_MTU = 11; - private static final int FLAG_SEND = 12; - private static final int FLAG_RECV = 13; - private static final int FLAG_RESEND = 14; - private static final int FLAG_DUP = 15; - private static final int FLAG_UPTIME = 16; - private static final int FLAG_DEBUG = 99; - - private static Comparator getComparator(int sortFlags) { - Comparator rv; - switch (Math.abs(sortFlags)) { - case FLAG_IDLE_IN: - rv = new IdleInComparator(); - break; - case FLAG_IDLE_OUT: - rv = new IdleOutComparator(); - break; - case FLAG_RATE_IN: - rv = new RateInComparator(); - break; - case FLAG_RATE_OUT: - rv = new RateOutComparator(); - break; - case FLAG_UPTIME: - rv = new UptimeComparator(); - break; - case FLAG_SKEW: - rv = new SkewComparator(); - break; - case FLAG_CWND: - rv = new CwndComparator(); - break; - case FLAG_SSTHRESH: - rv = new SsthreshComparator(); - break; - case FLAG_RTT: - rv = new RTTComparator(); - break; - //case FLAG_DEV: - // rv = new DevComparator(); - // break; - case FLAG_RTO: - rv = new RTOComparator(); - break; - case FLAG_MTU: - rv = new MTUComparator(); - break; - case FLAG_SEND: - rv = new SendCountComparator(); - break; - case FLAG_RECV: - rv = new RecvCountComparator(); - break; - case FLAG_RESEND: - rv = new ResendComparator(); - break; - case FLAG_DUP: - rv = new DupComparator(); - break; - case FLAG_ALPHA: - default: - rv = new AlphaComparator(); - break; - } - if (sortFlags < 0) - rv = Collections.reverseOrder(rv); - return rv; - } - - private static class AlphaComparator extends PeerComparator { - } - - private static class IdleInComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = r.getLastReceiveTime() - l.getLastReceiveTime(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class IdleOutComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = r.getLastSendTime() - l.getLastSendTime(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class RateInComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getReceiveBps() - r.getReceiveBps(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class RateOutComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getSendBps() - r.getSendBps(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class UptimeComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class SkewComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew()); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class CwndComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getSendWindowBytes() - r.getSendWindowBytes(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class SsthreshComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getSlowStartThreshold() - r.getSlowStartThreshold(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class RTTComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getRTT() - r.getRTT(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - /*** - private static class DevComparator extends PeerComparator { - private static final DevComparator _instance = new DevComparator(); - public static final DevComparator instance() { return _instance; } - @Override - public int compare(PeerState l, PeerState r) { - long rv = l.getRTTDeviation() - r.getRTTDeviation(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - ****/ - - /** */ - private static class RTOComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getRTO() - r.getRTO(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class MTUComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - int rv = l.getMTU() - r.getMTU(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return rv; - } - } - - private static class SendCountComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class RecvCountComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = l.getPacketsReceived() - r.getPacketsReceived(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class ResendComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class DupComparator extends PeerComparator { - @Override - public int compare(PeerState l, PeerState r) { - long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate(); - if (rv == 0) // fallback on alpha - return super.compare(l, r); - else - return (int)rv; - } - } - - private static class PeerComparator implements Comparator, Serializable { - public int compare(PeerState l, PeerState r) { - return DataHelper.compareTo(l.getRemotePeer().getData(), r.getRemotePeer().getData()); - } - } - - private static void appendSortLinks(StringBuilder buf, String urlBase, int sortFlags, String descr, int ascending) { - if (ascending == FLAG_ALPHA) { // 0 - buf.append(" \"V\""); - } else if (sortFlags == ascending) { - buf.append(" \"V\"" + - "\"^\""); - } else if (sortFlags == 0 - ascending) { - buf.append(" \"V\"\"^\""); - } else { - buf.append(" \"V\"" + - "\"^\""); - } - } @Override public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException {