Changeset b01cf32


Ignore:
Timestamp:
Aug 26, 2012 1:02:11 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0a1ff9b6, c4a3159
Parents:
9ba6c29
Message:

table lookup for more flexibility

  • Streaming: Use packet type and current window size to adjust

number of tags sent and tag threshold, to improve
efficiency and reliability

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • apps/streaming/java/src/net/i2p/client/streaming/PacketQueue.java

    r9ba6c29 rb01cf32  
    44import net.i2p.client.I2PSession;
    55import net.i2p.client.I2PSessionException;
     6import net.i2p.client.SendMessageOptions;
    67import net.i2p.data.ByteArray;
    78import net.i2p.util.ByteCache;
     
    2324    private final ByteCache _cache = ByteCache.getInstance(64, 36*1024);
    2425   
     26    private static final int FLAGS_INITIAL_TAGS = Packet.FLAG_SYNCHRONIZE;
     27    private static final int FLAGS_FINAL_TAGS = Packet.FLAG_CLOSE |
     28                                              Packet.FLAG_RESET |
     29                                              Packet.FLAG_ECHO;
     30    private static final int INITIAL_TAGS_TO_SEND = 32;
     31    private static final int MIN_TAG_THRESHOLD = 20;
     32    private static final int TAG_WINDOW_FACTOR = 5;
     33    private static final int FINAL_TAGS_TO_SEND = 4;
     34    private static final int FINAL_TAG_THRESHOLD = 2;
     35
    2536    public PacketQueue(I2PAppContext context, I2PSession session, ConnectionManager mgr) {
    2637        _context = context;
     
    89100                // so if we retransmit it will use a new tunnel/lease combo
    90101                expires = rpe.getNextSendTime() - 500;
     102            SendMessageOptions options = new SendMessageOptions();
    91103            if (expires > 0)
    92                 // I2PSessionImpl2
    93                 //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, expires);
    94                 // I2PSessionMuxedImpl
    95                 //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, expires,
    96                 //                 I2PSession.PROTO_STREAMING, I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED);
    97                 // I2PSessionMuxedImpl no tags
    98                 sent = _session.sendMessage(packet.getTo(), buf, 0, size, null, null, expires,
    99                                  I2PSession.PROTO_STREAMING, packet.getLocalPort(), packet.getRemotePort());
    100             else
    101                 // I2PSessionImpl2
    102                 //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, 0);
    103                 // I2PSessionMuxedImpl
    104                 //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent,
    105                 //                 I2PSession.PROTO_STREAMING, I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED);
    106                 // I2PSessionMuxedImpl no tags
    107                 sent = _session.sendMessage(packet.getTo(), buf, 0, size, null, null,
    108                                  I2PSession.PROTO_STREAMING, packet.getLocalPort(), packet.getRemotePort());
     104                options.setDate(expires);
     105            if (packet.isFlagSet(FLAGS_INITIAL_TAGS)) {
     106                Connection con = packet.getConnection();
     107                if (con != null && con.isInbound())
     108                    options.setSendLeaseSet(false);
     109                options.setTagsToSend(INITIAL_TAGS_TO_SEND);
     110                options.setTagThreshold(MIN_TAG_THRESHOLD);
     111            } else if (packet.isFlagSet(FLAGS_FINAL_TAGS)) {
     112                options.setSendLeaseSet(false);
     113                options.setTagsToSend(FINAL_TAGS_TO_SEND);
     114                options.setTagThreshold(FINAL_TAG_THRESHOLD);
     115            } else {
     116                Connection con = packet.getConnection();
     117                if (con != null) {
     118                    if (con.isInbound() && con.getLifetime() < 2*60*1000)
     119                        options.setSendLeaseSet(false);
     120                    // increase threshold with higher window sizes to prevent stalls
     121                    // after tag delivery failure
     122                    int wdw = con.getOptions().getWindowSize();
     123                    int thresh = Math.max(MIN_TAG_THRESHOLD, wdw * TAG_WINDOW_FACTOR);
     124                    options.setTagThreshold(thresh);
     125                }
     126            }
     127            sent = _session.sendMessage(packet.getTo(), buf, 0, size,
     128                                 I2PSession.PROTO_STREAMING, packet.getLocalPort(), packet.getRemotePort(),
     129                                 options);
    109130            end = _context.clock().now();
    110131           
  • core/java/src/net/i2p/client/SendMessageOptions.java

    r9ba6c29 rb01cf32  
    2222     *  1 means don't send, 0 means default
    2323     */
    24     private static final int LS_MASK = 0x0001;
     24    private static final int LS_MASK = 0x0100;
    2525
    2626    /**
    2727     *  Tags to send field:
    28      *<pre>
    29      *  000 - default
    30      *  001 -   2
    31      *  010 -   4
    32      *  011 -   8
    33      *  100 -  16
    34      *  101 -  32
    35      *  110 -  64
    36      *  111 - 128
    37      *</pre>
     28     *  see below for possible values
    3829     */
    39     private static final int TAGS_SEND_MASK = 0x000e;
    40     private static final int MAX_SEND_TAGS = 128;
     30    private static final int TAGS_SEND_MASK = 0x000f;
     31    /**
     32     *  Possible values. Configured values will be rounded down.
     33     *  Note that ElGamalAESEngine enforces a max of 200 on receive.
     34     */
     35    private static final int[] TAGS_SEND = {
     36                                             0, 2, 4, 6, 8, 12, 16, 24,
     37                                             32, 40, 51, 64, 80, 100, 125, 160
     38                                           };
    4139
    4240    /**
    4341     *  Tags threshold field:
    44      *<pre>
    45      *  000 - default
    46      *  001 -  1
    47      *  010 -  2
    48      *  011 -  4
    49      *  100 -  8
    50      *  101 - 16
    51      *  110 - 32
    52      *  111 - 64
    53      *</pre>
     42     *  see below for possible values
    5443     */
    55     private static final int TAGS_REQD_MASK = 0x0070;
    56     private static final int MAX_REQD_TAGS = 64;
     44    private static final int TAGS_REQD_MASK = 0x00f0;
     45    /** Possible values. Configured values will be rounded down. */
     46    private static final int[] TAGS_REQD = {
     47                                             0, 2, 3, 6, 9, 14, 20, 27,
     48                                             35, 45, 57, 72, 92, 117, 147, 192
     49                                           };
    5750
    5851    /** default true */
     
    7770     *  If we are low on tags, send this many.
    7871     *  Power of 2 recommended - rounds down.
    79      *  default 0, meaning unset
     72     *  default 0, meaning unset, use the SKM config (default 40)
    8073     *  @param tags 0 or 2 to 128
    8174     */
     
    8477            throw new IllegalArgumentException();
    8578        _flags &= ~TAGS_SEND_MASK;
    86         _flags |= linToExp(Math.min(tags, MAX_SEND_TAGS) / 2) << 1;
     79        _flags |= valToCode(tags, TAGS_SEND);
    8780    }
    8881
    8982    /**
    9083     *  If we are low on tags, send this many.
    91      *  @return default 0, meaning unset
     84     *  @return default 0, meaning unset, use the SKM config (default 40)
    9285     */
    9386    public int getTagsToSend() {
     
    9790    /**
    9891     *  If we are low on tags, send this many.
    99      *  @return default 0, meaning unset
     92     *  @return default 0, meaning unset, use the SKM config (default 40)
    10093     */
    10194    public static int getTagsToSend(int flags) {
    102         int exp = (flags & TAGS_SEND_MASK) >> 1;
    103         return 2 * expToLin(exp);
     95        int exp = (flags & TAGS_SEND_MASK);
     96        return codeToVal(exp, TAGS_SEND);
    10497    }
    10598
     
    107100     *  Low tag threshold. If less than this many, send more.
    108101     *  Power of 2 recommended - rounds down.
    109      *  default 0, meaning unset
    110      *  @param tags 0 to 64
     102     *  default 0, meaning unset, use the SKM config (default 30)
     103     *  @param tags 0 to 90
    111104     */
    112105    public void setTagThreshold(int tags) {
     
    114107            throw new IllegalArgumentException();
    115108        _flags &= ~TAGS_REQD_MASK;
    116         _flags |= linToExp(Math.min(tags, MAX_REQD_TAGS)) << 4;
     109        _flags |= valToCode(tags, TAGS_REQD) << 4;
    117110    }
    118111
    119112    /**
    120113     *  Low tag threshold. If less than this many, send more.
    121      *  @return default 0, meaning unset
     114     *  @return default 0, meaning unset, use the SKM config (default 30)
    122115     */
    123116    public int getTagThreshold() {
     
    127120    /**
    128121     *  Low tag threshold. If less than this many, send more.
    129      *  @return default 0, meaning unset
     122     *  @return default 0, meaning unset, use the SKM config (default 30)
    130123     */
    131124    public static int getTagThreshold(int flags) {
    132125        int exp = (flags & TAGS_REQD_MASK) >> 4;
    133         return expToLin(exp);
     126        return codeToVal(exp, TAGS_REQD);
    134127    }
    135128
    136129    /** rounds down */
    137     private static int linToExp(int lin) {
    138         int exp = 0;
    139         while (lin > 0) {
    140             exp++;
    141             lin >>= 1;
     130    private static int valToCode(int val, int[] codes) {
     131        // special case, round up so we don't turn it into default
     132        if (val > 0 && val <= codes[1])
     133            return 1;
     134        for (int i = 1; i < codes.length; i++) {
     135            if (val < codes[i])
     136                return i - 1;
    142137        }
    143         return exp;
     138        return codes.length - 1;
    144139    }
    145140
    146     private static int expToLin(int exp) {
    147         if (exp <= 0)
    148             return 0;
    149         return 1 << (exp - 1);
     141    private static int codeToVal(int code, int[] codes) {
     142        return codes[code];
    150143    }
    151144}
  • core/java/src/net/i2p/crypto/ElGamalAESEngine.java

    r9ba6c29 rb01cf32  
    3939    private final static int MIN_ENCRYPTED_SIZE = 80; // smallest possible resulting size
    4040    private final I2PAppContext _context;
     41    /** enforced since release 0.6 */
     42    public static final int MAX_TAGS_RECEIVED = 200;
    4143
    4244    public ElGamalAESEngine(I2PAppContext ctx) {
     
    329331            int cur = 0;
    330332            long numTags = DataHelper.fromLong(decrypted, cur, 2);
    331             if ((numTags < 0) || (numTags > 200)) throw new Exception("Invalid number of session tags");
     333            if ((numTags < 0) || (numTags > MAX_TAGS_RECEIVED)) throw new Exception("Invalid number of session tags");
    332334            if (numTags > 0) tags = new ArrayList((int)numTags);
    333335            cur += 2;
  • history.txt

    r9ba6c29 rb01cf32  
     12012-08-26 zzz
     2 * DataHelper: Trim trailing whitespace when loading properties
     3 * NetDB: Increase floodfills, decrease flood redundancy
     4 * SendMessageOptions: Increase tag fields to 4 bits and use
     5                       table lookup for more flexibility
     6 * Streaming: Use packet type and current window size to adjust
     7              number of tags sent and tag threshold, to improve
     8              efficiency and reliability
     9
    1102012-08-25 kytv
    211 * Dutch and German translation updates from Transifex
  • router/java/src/net/i2p/router/RouterVersion.java

    r9ba6c29 rb01cf32  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 18;
     21    public final static long BUILD = 19;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.