Changeset 394dd3c


Ignore:
Timestamp:
Jan 15, 2011 2:39:28 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7a7889b
Parents:
f679ef2 (diff), f7df15f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

propagate from branch 'i2p.i2p' (head dc55b0e10a8da0fb3b9571a30bee6d96d2b1b271)

to branch 'i2p.i2p.zzz.test4' (head b246a3f2df80018875eafca6be6d5d2096c804fd)

Files:
19 edited

Legend:

Unmodified
Added
Removed
  • build.xml

    rf679ef2 r394dd3c  
    756756    <target name="findbugs" depends="build2">
    757757        <echo message="Starting findbugs, this will take a while..." />
    758         <exec executable="nice">
     758        <exec executable="nice" failonerror="true">
    759759            <arg value="findbugs"/>
    760760            <arg value="-textui"/>
  • core/java/src/freenet/support/CPUInformation/CPUID.java

    rf679ef2 r394dd3c  
    11/*
    22 * Created on Jul 14, 2004
     3 * Updated on Jan 8, 2011
    34 */
    45package freenet.support.CPUInformation;
     
    130131        return c.EAX & 0xf;
    131132    }
    132     private static int getCPUFlags()
     133    private static int getEDXCPUFlags()
    133134    {
    134135        CPUIDResult c = doCPUID(1);
    135136        return c.EDX;
     137    }
     138    private static int getECXCPUFlags()
     139    {
     140        CPUIDResult c = doCPUID(1);
     141        return c.ECX;
     142    }
     143    private static int getExtendedEDXCPUFlags()
     144    {
     145        CPUIDResult c = doCPUID(0x80000001);
     146        return c.EDX;
     147    }
     148    private static int getExtendedECXCPUFlags()
     149    {
     150        CPUIDResult c = doCPUID(0x80000001);
     151        return c.ECX;
    136152    }
    137153   
     
    164180        }
    165181        public boolean hasMMX(){
    166             return (getCPUFlags() & 0x800000) >0; //Bit 23
     182            return (getEDXCPUFlags() & 0x800000) >0; //EDX Bit 23
    167183        }
    168184        public boolean hasSSE(){
    169             return (getCPUFlags() & 0x2000000) >0; //Bit 25
     185            return (getEDXCPUFlags() & 0x2000000) >0; //EDX Bit 25
    170186        }
    171187        public boolean hasSSE2(){
    172             return (getCPUFlags() & 0x4000000) >0; //Bit 26
     188            return (getEDXCPUFlags() & 0x4000000) >0; //EDX Bit 26
     189        }
     190        public boolean hasSSE3(){
     191            return (getEDXCPUFlags() & 0x1) >0; //ECX Bit 0
     192        }
     193        public boolean hasSSE41(){
     194            return (getEDXCPUFlags() & 0x80000) >0; //ECX Bit 19
     195        }
     196        public boolean hasSSE42(){
     197            return (getEDXCPUFlags() & 0x100000) >0; //ECX Bit 20
     198        }
     199        public boolean hasSSE4A(){
     200            return (getExtendedECXCPUFlags() & 0x40) >0; //Extended ECX Bit 6
    173201        }
    174202        public boolean IsC3Compatible() { return false; }
     
    297325        }
    298326        public boolean IsPentium3Compatible()
    299         {
    300             return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7);
     327        {       
     328                // Atom
     329                if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 12))){
     330                        return true;
     331                // ??
     332                } else if (getCPUExtendedModel() == 0 && (getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7))){
     333                        return true;
     334                } else {
     335                        return false;
     336                }
    301337        }
    302338        public boolean IsPentium4Compatible()
    303         {
    304             return getCPUFamily() >= 15;
     339        {       
     340                // P4
     341                if (getCPUFamily() >= 15){
     342                        return true;
     343                // Xeon MP (45nm) or Core i7
     344                } else if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 10 || getCPUModel() == 13))){
     345                        return true;
     346                // Core 2 Duo
     347                } else if (getCPUExtendedModel() == 0 && getCPUFamily() == 6 && getCPUModel() == 15){
     348                        return true;
     349                } else {
     350                        return false;
     351                }
    305352        }
    306353        public String getCPUModelString() throws UnknownCPUException {
    307             if(getCPUFamily() == 4){
    308                 switch(getCPUModel()){
    309                     case 0:
    310                         return "486 DX-25/33";
    311                     case 1:
    312                         return "486 DX-50";
    313                     case 2:
    314                         return "486 SX";
    315                     case 3:
    316                         return "486 DX/2";
    317                     case 4:
    318                         return "486 SL";
    319                     case 5:
    320                         return "486 SX/2";
    321                     case 7:
    322                         return "486 DX/2-WB";
    323                     case 8:
    324                         return "486 DX/4";
    325                     case 9:
    326                         return "486 DX/4-WB";
    327                 }
    328             }
    329             if(getCPUFamily() == 5){
    330                 switch(getCPUModel()){
    331                     case 0:
    332                         return "Pentium 60/66 A-step";
    333                     case 1:
    334                         return "Pentium 60/66";
    335                     case 2:
    336                         return "Pentium 75 - 200";
    337                     case 3:
    338                         return "OverDrive PODP5V83";
    339                     case 4:
    340                         return "Pentium MMX";
    341                     case 7:
    342                         return "Mobile Pentium 75 - 200";
    343                     case 8:
    344                         return "Mobile Pentium MMX";
    345                 }
     354                if (getCPUExtendedModel() == 0){
     355                    if(getCPUFamily() == 4){
     356                        switch(getCPUModel()){
     357                            case 0:
     358                                return "486 DX-25/33";
     359                            case 1:
     360                                return "486 DX-50";
     361                            case 2:
     362                                return "486 SX";
     363                            case 3:
     364                                return "486 DX/2";
     365                            case 4:
     366                                return "486 SL";
     367                            case 5:
     368                                return "486 SX/2";
     369                            case 7:
     370                                return "486 DX/2-WB";
     371                            case 8:
     372                                return "486 DX/4";
     373                            case 9:
     374                                return "486 DX/4-WB";
     375                        }
     376                    }
     377                }
     378            if (getCPUExtendedModel() == 0){
     379                    if(getCPUFamily() == 5){
     380                        switch(getCPUModel()){
     381                            case 0:
     382                                return "Pentium 60/66 A-step";
     383                            case 1:
     384                                return "Pentium 60/66";
     385                            case 2:
     386                                return "Pentium 75 - 200";
     387                            case 3:
     388                                return "OverDrive PODP5V83";
     389                            case 4:
     390                                return "Pentium MMX";
     391                            case 7:
     392                                return "Mobile Pentium 75 - 200";
     393                            case 8:
     394                                return "Mobile Pentium MMX";
     395                        }
     396                    }
    346397            }
    347398            if(getCPUFamily() == 6){
    348                 switch(getCPUModel()){
    349                     case 0:
    350                         return "Pentium Pro A-step";
    351                     case 1:
    352                         return "Pentium Pro";
    353                     case 3:
    354                         return "Pentium II (Klamath)";
    355                     case 5:
    356                         return "Pentium II (Deschutes), Celeron (Covington), Mobile Pentium II (Dixon)";
    357                     case 6:
    358                         return "Mobile Pentium II, Celeron (Mendocino)";
    359                     case 7:
    360                         return "Pentium III (Katmai)";
    361                     case 8:
    362                         return "Pentium III (Coppermine), Celeron w/SSE";
    363                     case 9:
    364                         return "Mobile Pentium III";
    365                     case 10:
    366                         return "Pentium III Xeon (Cascades)";
    367                     case 11:
    368                         return "Pentium III (130 nm)";
    369                 }
     399                if (getCPUExtendedModel() == 0){
     400                        switch(getCPUModel()){
     401                            case 0:
     402                                return "Pentium Pro A-step";
     403                            case 1:
     404                                return "Pentium Pro";
     405                            case 3:
     406                                return "Pentium II (Klamath)";
     407                            case 5:
     408                                return "Pentium II (Deschutes), Celeron (Covington), Mobile Pentium II (Dixon)";
     409                            case 6:
     410                                return "Mobile Pentium II, Celeron (Mendocino)";
     411                            case 7:
     412                                return "Pentium III (Katmai)";
     413                            case 8:
     414                                return "Pentium III (Coppermine), Celeron w/SSE";
     415                            case 9:
     416                                return "Mobile Pentium III (Banias)";
     417                            case 10:
     418                                return "Pentium III Xeon (Cascades)";
     419                            case 11:
     420                                return "Pentium III (130 nm)";
     421                            case 13:
     422                                return "Mobile Pentium III (Dothan)";
     423                            case 14:
     424                                return "Mobile Core (Yonah)";
     425                            case 15:
     426                                return "Core 2 (Conroe)";
     427                        }
     428                } else {
     429                        if (getCPUExtendedModel() == 1){
     430                                 switch(getCPUModel()){
     431                                        case 10:
     432                                                return "Core i7";
     433                                        case 12:
     434                                                return "Atom";
     435                                        case 13:
     436                                                return "Xeon MP";
     437                                 }
     438                        }
     439                }
    370440            }
    371441            if(getCPUFamily() == 7){
     
    385455                        case 3:
    386456                            return "Pentium IV (90 nm)";
     457                        case 4:
     458                            return "Pentium IV (90 nm)";
     459                        case 6:
     460                            return "Pentium IV (65 nm)";
    387461                    }
    388462                }
     
    408482        System.out.println("CPU Model: " + getCPUModel());
    409483        System.out.println("CPU Stepping: " + getCPUStepping());
    410         System.out.println("CPU Flags: " + getCPUFlags());
     484        System.out.println("CPU Flags: " + getEDXCPUFlags());
    411485       
    412486        CPUInfo c = getInfo();
     
    416490        System.out.println(" CPU has SSE: " + c.hasSSE());
    417491        System.out.println(" CPU has SSE2: " + c.hasSSE2());
     492        System.out.println(" CPU has SSE3: " + c.hasSSE3());
     493        System.out.println(" CPU has SSE4.1: " + c.hasSSE41());
     494        System.out.println(" CPU has SSE4.2: " + c.hasSSE42());
     495        System.out.println(" CPU has SSE4A: " + c.hasSSE4A());
    418496        if(c instanceof IntelCPUInfo){
    419497            System.out.println("  **Intel-info**");
  • core/java/src/freenet/support/CPUInformation/CPUInfo.java

    rf679ef2 r394dd3c  
    11/*
    2  * Created on Jul 16, 2004
    3  *
     2 * Created on Jul 14, 2004
     3 * Updated on Jan 8, 2011
    44 */
    55package freenet.support.CPUInformation;
     
    4343    public boolean hasSSE2();
    4444
     45    /**
     46     * @return true iff the CPU support the SSE3 instruction set.
     47     */
     48    public boolean hasSSE3();
     49   
     50    /**
     51     * @return true iff the CPU support the SSE4.1 instruction set.
     52     */
     53    public boolean hasSSE41();
     54
     55    /**
     56     * @return true iff the CPU support the SSE4.2 instruction set.
     57     */
     58    public boolean hasSSE42();
     59
     60    /**
     61     * @return true iff the CPU support the SSE4A instruction set.
     62     */
     63    public boolean hasSSE4A();
     64
    4565    public boolean IsC3Compatible();
    4666}
  • core/java/src/net/i2p/crypto/SHA256Generator.java

    rf679ef2 r394dd3c  
    2424    }
    2525   
    26     /** Calculate the SHA-256 has of the source
     26    /**
     27     * Calculate the SHA-256 hash of the source and cache the result.
    2728     * @param source what to hash
    2829     * @return hash of the source
     
    3132        return calculateHash(source, 0, source.length);
    3233    }
     34
     35    /**
     36     * Calculate the hash and cache the result.
     37     */
    3338    public final Hash calculateHash(byte[] source, int start, int len) {
    3439        Sha256Standalone digest = acquireGnu();
     
    4045    }
    4146   
     47    /**
     48     * Use this if you only need the data, not a Hash object.
     49     * Does not cache.
     50     */
    4251    public final void calculateHash(byte[] source, int start, int len, byte out[], int outOffset) {
    4352        Sha256Standalone digest = acquireGnu();
  • core/java/src/net/i2p/data/DataHelper.java

    rf679ef2 r394dd3c  
    3232import java.util.Collection;
    3333import java.util.Collections;
     34import java.util.Comparator;
    3435import java.util.Date;
    3536import java.util.Iterator;
     
    10411042
    10421043    /**
    1043      *  Sort based on the Hash of the DataStructure
     1044     *  Sort based on the Hash of the DataStructure.
    10441045     *  Warning - relatively slow.
    1045      *  Only used by RouterInfo
    1046      *  Why? Just because it has to be consistent so signing will work?
     1046     *  WARNING - this sort order must be consistent network-wide, so while the order is arbitrary,
     1047     *  it cannot be changed.
     1048     *  Why? Just because it has to be consistent so signing will work.
    10471049     *  How to spec as returning the same type as the param?
     1050     *  DEPRECATED - Only used by RouterInfo.
    10481051     */
    10491052    public static List<? extends DataStructure> sortStructures(Collection<? extends DataStructure> dataStructures) {
    10501053        if (dataStructures == null) return Collections.EMPTY_LIST;
    1051         ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
    1052         TreeMap<String, DataStructure> tm = new TreeMap();
    1053         for (DataStructure struct : dataStructures) {
    1054             tm.put(struct.calculateHash().toString(), struct);
    1055         }
    1056         for (DataStructure struct : tm.values()) {
    1057             rv.add(struct);
    1058         }
     1054
     1055        // This used to use Hash.toString(), which is insane, since a change to toString()
     1056        // would break the whole network. Now use Hash.toBase64().
     1057        // Note that the Base64 sort order is NOT the same as the raw byte sort order,
     1058        // despite what you may read elsewhere.
     1059
     1060        //ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
     1061        //TreeMap<String, DataStructure> tm = new TreeMap();
     1062        //for (DataStructure struct : dataStructures) {
     1063        //    tm.put(struct.calculateHash().toString(), struct);
     1064        //}
     1065        //for (DataStructure struct : tm.values()) {
     1066        //    rv.add(struct);
     1067        //}
     1068        ArrayList<DataStructure> rv = new ArrayList(dataStructures);
     1069        Collections.sort(rv, new DataStructureComparator());
    10591070        return rv;
     1071    }
     1072
     1073    /**
     1074     * See sortStructures() comments.
     1075     * @since 0.8.3
     1076     */
     1077    private static class DataStructureComparator implements Comparator<DataStructure> {
     1078        public int compare(DataStructure l, DataStructure r) {
     1079            return l.calculateHash().toBase64().compareTo(r.calculateHash().toBase64());
     1080        }
    10601081    }
    10611082
  • core/java/src/net/i2p/data/PrivateKey.java

    rf679ef2 r394dd3c  
    1616 * A private key is 256byte Integer. The private key represents only the
    1717 * exponent, not the primes, which are constant and defined in the crypto spec.
     18 *
     19 * Note that we use short exponents, so all but the last 28.25 bytes are zero.
     20 * See http://www.i2p2.i2p/how_cryptography for details.
    1821 *
    1922 * @author jrandom
     
    5154    }
    5255
     56    /**
     57     * We assume the data has enough randomness in it, so use the last 4 bytes for speed.
     58     * Overridden since we use short exponents, so the first 227 bytes are all zero.
     59     * Not that we are storing PrivateKeys in any Sets or Maps anywhere.
     60     */
     61    @Override
     62    public int hashCode() {
     63        if (_data == null)
     64            return 0;
     65        int rv = _data[KEYSIZE_BYTES - 4];
     66        for (int i = 1; i < 4; i++)
     67            rv ^= (_data[i + (KEYSIZE_BYTES - 4)] << (i*8));
     68        return rv;
     69    }
     70
     71    @Override
     72    public boolean equals(Object obj) {
     73        if ((obj == null) || !(obj instanceof PrivateKey)) return false;
     74        return DataHelper.eq(_data, ((PrivateKey) obj)._data);
     75    }
    5376}
  • core/java/src/net/i2p/data/RouterAddress.java

    rf679ef2 r394dd3c  
    132132    }
    133133   
    134     /** the style should be sufficient, for speed */
     134    /**
     135     * Just use style and hashCode for speed (expiration is always null).
     136     * If we add multiple addresses of the same style, this may need to be changed.
     137     */
    135138    @Override
    136139    public int hashCode() {
    137         return DataHelper.hashCode(_transportStyle);
     140        return DataHelper.hashCode(_transportStyle) ^ _cost;
    138141    }
    139142   
  • core/java/src/net/i2p/data/RouterInfo.java

    rf679ef2 r394dd3c  
    1515import java.io.OutputStream;
    1616import java.util.Collection;
     17import java.util.Collections;
    1718import java.util.Date;
    1819import java.util.HashSet;
     
    4041    private volatile long _published;
    4142    private final Set<RouterAddress> _addresses;
    42     private final Set<Hash> _peers;
     43    /** may be null to save memory, no longer final */
     44    private Set<Hash> _peers;
    4345    private /* FIXME final FIXME */ Properties _options;
    4446    private volatile boolean _validated;
     
    4850    private volatile int _hashCode;
    4951    private volatile boolean _hashCodeInitialized;
     52    /** should we cache the byte and string versions _byteified ? **/
     53    private boolean _shouldCache;
     54    /** maybe we should check if we are floodfill? */
     55    private static final boolean CACHE_ALL = Runtime.getRuntime().maxMemory() > 128*1024*1024l;
    5056
    5157    public static final String PROP_NETWORK_ID = "netId";
     
    5965    public RouterInfo() {
    6066        _addresses = new HashSet(2);
    61         _peers = new HashSet(0);
    6267        _options = new OrderedProperties();
    6368    }
     
    7176        setOptions(old.getOptions());
    7277        setSignature(old.getSignature());
     78        // copy over _byteified?
    7379    }
    7480
     
    106112        _identity = ident;
    107113        resetCache();
     114        // We only want to cache the bytes for our own RI, which is frequently written.
     115        // To cache for all RIs doubles the RI memory usage.
     116        // setIdentity() is only called when we are creating our own RI.
     117        // Otherwise, the data is populated with readBytes().
     118        _shouldCache = true;
    108119    }
    109120
     
    160171     */
    161172    public Set<Hash> getPeers() {
     173        if (_peers == null)
     174            return Collections.EMPTY_SET;
    162175        return _peers;
    163176    }
     
    170183     */
    171184    public void setPeers(Set<Hash> peers) {
     185        if (peers == null || peers.isEmpty()) {
     186            _peers = null;
     187            return;
     188        }
     189        if (_peers == null)
     190            _peers = new HashSet(2);
    172191        synchronized (_peers) {
    173192            _peers.clear();
    174             if (peers != null) _peers.addAll(peers);
     193            _peers.addAll(peers);
    175194        }
    176195        resetCache();
     
    224243        if (_identity == null) throw new DataFormatException("Router identity isn't set? wtf!");
    225244        if (_addresses == null) throw new DataFormatException("Router addressess isn't set? wtf!");
    226         if (_peers == null) throw new DataFormatException("Router peers isn't set? wtf!");
    227245        if (_options == null) throw new DataFormatException("Router options isn't set? wtf!");
    228246
     
    240258                Collection<RouterAddress> addresses = _addresses;
    241259                if (sz > 1)
     260                    // WARNING this sort algorithm cannot be changed, as it must be consistent
     261                    // network-wide. The signature is not checked at readin time, but only
     262                    // later, and the addresses are stored in a Set, not a List.
    242263                    addresses = (Collection<RouterAddress>) DataHelper.sortStructures(addresses);
    243264                for (RouterAddress addr : addresses) {
     
    249270            //         method of trusted links, which isn't implemented in the router
    250271            //         at the moment, and may not be later.
    251             // fixme to reduce objects - allow _peers == null
    252             int psz = _peers.size();
     272            int psz = _peers == null ? 0 : _peers.size();
    253273            DataHelper.writeLong(out, 1, psz);
    254274            if (psz > 0) {
    255275                Collection<Hash> peers = _peers;
    256276                if (psz > 1)
     277                    // WARNING this sort algorithm cannot be changed, as it must be consistent
     278                    // network-wide. The signature is not checked at readin time, but only
     279                    // later, and the hashes are stored in a Set, not a List.
    257280                    peers = (Collection<Hash>) DataHelper.sortStructures(peers);
    258281                for (Hash peerHash : peers) {
     
    267290        long after = Clock.getInstance().now();
    268291        _log.debug("getBytes()  took " + (after - before) + "ms");
    269         _byteified = data;
     292        if (CACHE_ALL || _shouldCache)
     293            _byteified = data;
    270294        return data;
    271295    }
     
    467491        }
    468492        int numPeers = (int) DataHelper.readLong(in, 1);
    469         for (int i = 0; i < numPeers; i++) {
    470             Hash peerIdentityHash = new Hash();
    471             peerIdentityHash.readBytes(in);
    472             _peers.add(peerIdentityHash);
     493        if (numPeers == 0) {
     494            _peers = null;
     495        } else {
     496            _peers = new HashSet(numPeers);
     497            for (int i = 0; i < numPeers; i++) {
     498                Hash peerIdentityHash = new Hash();
     499                peerIdentityHash.readBytes(in);
     500                _peers.add(peerIdentityHash);
     501            }
    473502        }
    474503        _options = DataHelper.readProperties(in);
     
    505534               && DataHelper.eq(_addresses, info.getAddresses())
    506535               && DataHelper.eq(_options, info.getOptions())
    507                && DataHelper.eq(_peers, info.getPeers());
     536               && DataHelper.eq(getPeers(), info.getPeers());
    508537    }
    509538   
     
    531560            buf.append("\n\t\tAddress: ").append(addr);
    532561        }
    533         Set peers = _peers; // getPeers()
     562        Set peers = getPeers();
    534563        buf.append("\n\tPeers: #: ").append(peers.size());
    535564        for (Iterator iter = peers.iterator(); iter.hasNext();) {
  • core/java/src/net/i2p/util/LogManager.java

    rf679ef2 r394dd3c  
    153153            return;
    154154        _writer = new LogWriter(this);
    155         Thread t = new I2PThread(_writer, "LogWriter", true);
     155        // NOT an I2PThread, as it contains logging and we end up with problems
     156        Thread t = new Thread(_writer, "LogWriter");
     157        t.setDaemon(true);
    156158        t.start();
    157159    }
  • history.txt

    rf679ef2 r394dd3c  
     12011-01-09 zzz
     2    * DataHelper: Speed up and annotate sortStructures()
     3    * Data Structures: More caching improvements, don't cache where we shouldn't
     4    * NetDB: Don't rescan netDb directory unless changed,
     5             to reduce Hash cache thrash (backport from test4)
     6    * RouterInfo:
     7      - Don't cache byteified data by default, to save ~1.5 MB
     8      - Don't create empty peers Set, to save ~100KB
     9
     102011-01-07 zzz
     11    * Data Structures: More caching
     12    * i2psnark: Improve request tracking to reduce memory usage
     13
    1142011-01-05 zzz
    215    * build.xml: Fix findbugs target
  • installer/resources/readme/readme.html

    rf679ef2 r394dd3c  
    1616<ul class="links"><li class="tidylist"><b>Starting Up&hellip;</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers</i> section in the side panel on the left should start to grow over the next few minutes and you'll also see a <i>Local Destination</i> named <i>Shared Clients</i> listed there, and possibly other clients and servers depending on how I2P is configured (if not, see the troubleshooting section <a href="#trouble">below</a>). These <i>Local Destinations</i> provide connections on different ports (and sometimes protocols) to the I2P network, enabling your bittorrent, e-mail, web proxy and other services to function. Your <a href="/netdb">Network Database</a> indicates all known peers on the network. Additionally, you can monitor existing <a href="/peers">Peer Connections</a>, and view existing <a href="/tunnels">Tunnels</a> and their status. More information is available on the <a href="/help">help page</a>.</li>
    1717
    18 <li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
     18<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. When I2P starts up, and during normal operation, I2P's tunnel build readiness indicator (immediately above the <i>Local Destinations</i> section in the sidepanel) may tell you that I2P is "Rejecting Tunnels"; this is normal behavior and should be of no cause for concern! Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
    1919 
    2020<h3>Services on I2P</h3>
  • installer/resources/themes/console/classic/console.css

    rf679ef2 r394dd3c  
    409409
    410410div.news h3 {
    411      text-align: left !important;
     411     background: none !important;
     412     text-align: left;
     413     border: none !important;
     414     border-bottom: 1px dotted !important;
     415     -moz-box-shadow: none;
     416     -hktml-box-shadow: none;
     417     box-shadow: none;
     418     font-size: 10pt !important;
     419     letter-spacing: 0.05em;
     420     text-transform: capitalize !important;
     421     text-shadow: none !important;
     422     padding: 5px 10px 3px;
     423     margin: 10px 10px -7px !important;
    412424}
    413425
  • installer/resources/themes/console/dark/console.css

    rf679ef2 r394dd3c  
    328328     background: #000 url("images/news.png")no-repeat scroll bottom right;
    329329     color: #7b7;
    330 /*     border-radius: 4px 4px 0 0;
    331      -moz-border-radius: 4px 4px 0 0;
    332      -khtml-border-radius: 4px 4px 0 0;*/
    333330     font-size: 7.5pt;
    334331     text-align: right;
     
    336333     -khtml-box-shadow: 0 1px 5px #000;
    337334     box-shadow: 0 1px 5px #000;
    338      min-width: 580px;
    339 /*     height: 164px;
    340      overflow-y: auto;*/
     335     min-width: 590px;
    341336}
    342337
     
    358353
    359354div.news h3 {
    360      text-align: left !important;
     355     background: none;
     356     text-align: left;
     357     border: none;
     358     padding-left: 0;
     359     padding-top: 2px;
     360     border-bottom: 1px dotted;
    361361}
    362362
     
    866866}
    867867
    868 input[type=text], input[type=password] {
     868input[type=text] {
    869869     background: #000;
    870870     color: #EE9;
     
    882882}
    883883
    884 input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover {
     884input[type=text]:active, input[type=text]:hover {
    885885     background: #000;
    886886}
  • installer/resources/themes/console/light/console.css

    rf679ef2 r394dd3c  
    106106*/     
    107107     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
     108     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
     109     box-shadow: inset 0px 0px 1px 1px #bbf;
    108110}
    109111
     
    140142     border-radius: 3px;
    141143     -moz-box-shadow: 0px 1px 5px #bbf;
     144     text-shadow: 0px 1px 1px #77f;
     145     -moz-box-shadow: outset 0px 0px 2px 1px #bbf;
     146     -khtml-box-shadow: outset 0px 0px 2px 1px #bbf;
     147     box-shadow: outset 0px 0px 2px 1px #bbf;
    142148}
    143149
     
    149155     background: #ffa url('images/header.png') center center repeat-x !important;
    150156     text-shadow: 0 0 0;
     157     -moz-box-shadow: inset 0px 0px 2px 1px #ffa;
     158     -khtml-box-shadow: inset 0px 0px 2px 1px #ffa;
     159     box-shadow: inset 0px 0px 2px 1px #ffa;
    151160}
    152161
     
    156165     font-size: 8.5pt;
    157166     letter-spacing: 0.02em;
    158      margin: -5px -7px -5px -7px !important;
     167     margin: -6px !important;
    159168     padding: 3px 3px 5px 3px;
    160      background: #eed url(images/magic.png);
     169     background: #ddf url(images/magic.png);
    161170     text-transform: capitalize;
    162171     text-decoration: none !important;
    163172     color: #2b2;
    164173     line-height: 105%;
    165 /*     text-shadow: 0px 1px 1px #99f;*/
     174     -moz-box-shadow: 0px 0px 1px 1px #fff;
     175     -khtml-box-shadow: 0px 0px 1px 1px #fff;
     176     box-shadow: 0px 0px 1px 1px #fff;
    166177}
    167178
     
    325336     border-radius: 4px;
    326337     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
     338     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
     339     box-shadow: inset 0px 0px 1px 1px #bbf;
    327340     background: #ffe url('images/magic.png') center bottom;}
    328341
     
    356369     font-size: 7.5pt;
    357370     line-height: 140%;
    358      -moz-box-shadow: inset 0px 0px 1px 0px #410;
     371     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
     372     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
     373     box-shadow: inset 0px 0px 1px 1px #bbf;
    359374     background: #ffe url('images/magic.png') center bottom;
    360      min-width: 480px;
     375     min-width: 490px;
    361376}
    362377
     
    367382     margin-top: -7px;
    368383     padding: 0 15px;
    369 }
    370 
    371 div.news h3 {
    372      text-align: left !important;
    373384}
    374385
     
    427438}
    428439
     440div.news h3 {
     441     background: none !important;
     442     text-align: left;
     443     border: none !important;
     444     padding-left: 0;
     445     padding-top: 0px;
     446     border-bottom: 1px dotted #225 !important;
     447     -moz-box-shadow: none;
     448     -khtml-box-shadow: none;
     449     box-shadow: none;
     450     font-size: 10pt !important;
     451     letter-spacing: 0.05em;
     452     text-transform: capitalize !important;
     453     text-shadow: 0px 0px 0px #77f;
     454}
     455
     456div.news i {
     457     font-style: normal;
     458}
     459
    429460/*
    430461div.news  h4 a{
     
    632663
    633664div.main li b {
    634      color: #514!important;
     665     color: #514 !important;
     666     color: #003 !important;
    635667     letter-spacing: 0.01em;
    636668     font-size: 9.5pt;
     
    658690     color: #910;
    659691     padding: 2px 3px;
    660      background: #fff;
    661      font-weight: bold;
    662      background: #ffb url('images/magic.png') center bottom;
     692     font-weight: bold;
     693/*     background: #ffb url('images/magic.png') center bottom;*/
    663694}
    664695
     
    741772h1 {
    742773     text-align: left;
    743      color: #000;
     774     color: #003;
    744775     padding: 10px 15px;
    745776     margin: 0 10px 10px 207px;
     
    747778     letter-spacing: 0.15em;
    748779     text-transform: uppercase;
    749      text-shadow: 0px 0px 1px #77f;
     780     text-shadow: 0px 1px 1px #77f;
    750781     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
     782     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
     783     box-shadow: inset 0px 0px 1px 1px #bbf;
    751784     white-space: normal;
    752785     background: #ffe url('images/header.png') center center repeat-x;
     
    760793h2 {
    761794     font-size: 13pt;
    762      color: #000;
    763      letter-spacing: 0.05em;
     795     color: #003;
     796     letter-spacing: 0.07em;
    764797     background: #ffe url('images/header.png') center center repeat-x;
    765      text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5);
    766      padding: 10px 10px;
     798     text-shadow: 0px 1px 1px #77f;
     799     padding: 10px;
    767800     wordwrap: none;
    768      border: 1px solid #113;
     801     border: 1px solid #447;
    769802     border-radius: 4px;
    770803     -moz-border-radius: 4px;
    771804     -khtml-border-radius: 4px;
    772805     margin: 15px 0px 15px 0 !important;
    773      -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4);
     806     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     807     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     808     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
    774809     word-wrap: break-word;
     810     text-transform: uppercase;
    775811     opacity: 1;
    776812}
     
    787823
    788824h3 {
    789      border: 1px solid #113;
    790      border-left: 5px solid #113;
    791      padding: 5px 5px 5px 5px;
     825     border: 1px solid #447;
     826     border-left: 5px solid #447;
     827     padding: 5px 5px 5px 10px;
    792828     margin: 12px 0 15px 0;
    793829     border-radius: 0 4px 4px 0;
     
    795831     -khtml-border-radius: 0 4px 4px 0;
    796832     background: #ffe url('images/header.png') center center repeat-x !important;
     833     text-transform: uppercase;
     834     text-shadow: 0px 1px 1px #77f;
    797835     font-size: 11pt;
    798      color: #000;
    799      -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4);
     836     color: #003;
     837     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     838     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     839     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
    800840     opacity: 1;
     841     letter-spacing: 0.07em;
    801842}
    802843
     
    812853button, button:visited{
    813854     font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
    814      border: 1px outset #999;
     855     border: 1px outset #66a;
    815856     padding: 1px 3px;
    816857     background: #ffe !important;
     
    868909.langbox img {
    869910     opacity: 0.8 !important;
    870      -moz-box-shadow: 0 0 1px #447;
     911/*     -moz-box-shadow: 0 0 1px #447;*/
    871912}
    872913
    873914.langbox img:hover {
    874915     opacity: 1 !important;
    875      -moz-box-shadow: 0 0 1px #f60;
     916/*     -moz-box-shadow: 0 0 1px #f60;*/
    876917}
    877918
     
    920961     opacity: 1.0;
    921962     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
    922 }
    923 
    924 input[type=text], input[type=password] {
     963     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     964     box-shadow: inset 0px 0px 0px 1px #f60;
     965}
     966
     967input[type=text] {
    925968     background: #ffe;
    926969     color: #001;
     
    9611004}
    9621005
     1006select:active {
     1007     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
     1008     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     1009     box-shadow: inset 0px 0px 0px 1px #f60;     
     1010}
     1011
    9631012textarea {
    9641013     padding: 5px;
     
    9731022     min-width: 97%;
    9741023     border: 1px solid #447;
     1024}
     1025
     1026textarea:active {
     1027     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
     1028     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     1029     box-shadow: inset 0px 0px 0px 1px #f60;     
    9751030}
    9761031
  • installer/resources/themes/console/light/default.css

    rf679ef2 r394dd3c  
     1/* I2P Tunnel Manager Theme: Light */
     2/* Description: Light blue highlights. */
     3/* Author: dr|z3d */
     4   
    15body {
    26     margin: 0px;
     
    4044
    4145h4 {
    42      font-size: 14px;
     46     font-size: 11pt;
    4347     font-weight: bold !important;
    4448     color: #001;
     
    4852     padding: 5px 10px;
    4953     background: #eef url(images/header.png) repeat-x center center;
    50      letter-spacing: 0.08em;
    51      -moz-box-shadow: inset 0px 0px 4px 0px #bbf;
    52      -moz-border-radius: 4px;
    53      -khtml-border-radius: 4px;
    54      border-radius: 4px;
     54     text-transform: uppercase;
     55     letter-spacing: 0.07em;
     56     -moz-border-radius: 4px;
     57     -khtml-border-radius: 4px;
     58     border-radius: 4px;
     59     text-shadow: 0px 1px 1px #77f;
     60     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     61     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
     62     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
    5563}
    5664
     
    7785
    7886textarea {
    79      border: 1px solid #9999ff;
    80      color: #001;
    81      background: #ddf;
    82      border: 1px solid #44d;
     87     color: #003;
     88     background: #fff;
     89     border: 1px solid #447;
     90     -moz-border-radius: 4px;
     91     -khtml-border-radius: 4px;
     92     border-radius: 4px;
     93}
     94
     95textarea:active {
     96     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
     97     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     98     box-shadow: inset 0px 0px 0px 1px #f60;     
    8399}
    84100
     
    127143     clear: both;
    128144     height: 1px;
    129      margin: 1px 0px 1px 0px;
    130      border-bottom: 1px solid #225;
     145     margin: 10px 0px 10px 0px;
     146     border-bottom: 1px dotted #447;
    131147/*
    132148     display: none;
     
    135151
    136152.subdivider {
    137      border-bottom: 1px solid #225;
    138      padding: 5px 0px 0px 0px;
     153     border-bottom: 1px dotted #447;
     154     padding: 5px 0;
    139155}
    140156
     
    142158     width: 150px;
    143159     height: 24px;
    144      border: 1px solid #44d;
     160     border: 1px solid #447;
    145161     padding: 2px;
    146162     margin: 4px 0 2px 0px;
    147163     font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
    148164     font-weight: bold;
    149      background: #ddf;
    150      color: #001;
    151      -moz-border-radius: 0 4px 4px 0;
    152      -khtml-border-radius: 0 4px 4px 0;
    153      border-radius: 0 4px 4px 0;
     165     background: #fff;
     166     color: #003;
     167     -moz-border-radius: 4px;
     168     -khtml-border-radius: 4px;
     169     border-radius: 4px;
    154170/*
    155171     -moz-box-shadow: inset 0px -1px 1px 0px #fff;
     
    157173}
    158174
     175.freetext:active {
     176     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
     177     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     178     box-shadow: inset 0px 0px 0px 1px #f60;     
     179}
     180
    159181.control, control:link, control:visited {
    160182     margin: 4px 0 0 4px !important;
     
    165187     background: #ffe;
    166188     color: #001;
    167      border: 1px outset #ddddc0;
     189     border: 1px outset #66a;
    168190     text-align: center;
    169191     white-space: nowrap;
     
    183205}
    184206*/
     207
    185208.control:hover, control:visited:hover {
    186      border: 1px solid #eef;
    187209     background-color: #f60;
    188210     color: #fff !important;
    189211     text-decoration: none;
     212     border: 1px solid #f60 !important;
     213     background: #f60 !important;
     214     color: #fff;
     215     -moz-box-shadow: inset 0px 0px 0px 1px #fff !important;
     216     -khtml-box-shadow: inset 0px 0px 0px 1px #fff !important;
     217     box-shadow: inset 0px 0px 0px 1px #fff !important;
    190218}
    191219
     
    197225     font-weight: bold;
    198226     color: #001;
    199      border: 1px outset #ddddc0;
     227     border: 1px outset #66a;
    200228     text-align: center;
    201229     white-space: nowrap;
     
    240268     width: 750px;
    241269     float: left;
    242      margin: 0px;
     270     margin: 2px 0;
    243271}
    244272
     
    347375
    348376select {
    349      background-color: #eef;
    350      color: #001;
     377     background-color: #fff;
     378     color: #003;
    351379     margin: 4px;
    352380     font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
    353381     font-weight: bold;
    354      border: 1px solid #001;
    355      padding: 2px;
     382     border: 1px solid #447;
     383     padding: 3px 3px 3px 0;
    356384     min-width: 270px;
    357385     font-size: 8pt;
    358386     max-height: 24px;
     387     -moz-border-radius: 4px;
     388     -khtml-border-radius: 4px;
     389     border-radius: 4px;
     390}
     391
     392select:active {
     393     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
     394     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
     395     box-shadow: inset 0px 0px 0px 1px #f60;     
    359396}
    360397
    361398a:link{
    362      color: #613;
     399     color: #359;
    363400     text-decoration: none;
    364401     font-weight: bold;
     
    367404
    368405a:visited{
    369      color: #606;
     406     color: #218;
    370407     text-decoration: none;
    371408     font-weight: bold;
  • installer/resources/themes/console/midnight/console.css

    rf679ef2 r394dd3c  
    330330     text-align: left;
    331331     color: #eef;
    332      min-width: 570px;
     332     min-width: 590px;
    333333/*     -moz-border-radius: 0 0 3px 3px;
    334334     -khtml-border-radius: 0 0 3px 3px;
     
    433433
    434434div.news h3 {
    435      text-align: left !important;
     435     background: none !important;
     436     text-align: left;
     437     border: none !important;
     438     padding-left: 0;
     439     padding-top: 0px;
     440     border-bottom: 1px dotted !important;
     441     -moz-box-shadow: none;
     442     -hktml-box-shadow: none;
     443     box-shadow: none;
     444     font-size: 10pt !important;
     445     letter-spacing: 0.05em;
     446     text-transform: uppercase !important;
     447     margin: 15px 10px -5px;
     448     padding: 5px 0 5px;
    436449}
    437450
     
    440453     font-size: 9pt;
    441454     margin-bottom: -10px;
     455     margin-top: 10px;
    442456}
    443457/*
     
    756770}
    757771
    758 input[type=text], input[type=password] {
     772input[type=text] {
    759773     margin: 3px 5px 3px 5px;
    760774     vertical-align: middle;
     
    766780}
    767781
    768 input[type=text], input[type=password] select {
     782input[type=text], select {
    769783     background: #001;
    770784     color: #eef;
  • router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java

    rf679ef2 r394dd3c  
    2121import net.i2p.data.Hash;
    2222import net.i2p.util.Log;
     23import net.i2p.util.SimpleByteCache;
    2324
    2425/**
     
    7374     *  readMessage in the implemented message type
    7475     *
     76     *<pre>
    7577     *  Specifically:
    7678     *    1 byte type (if caller didn't read already, as specified by the type param
     
    8082     *    1 byte checksum
    8183     *    size bytes of payload (read by readMessage() in implementation)
     84     *</pre>
    8285     *
    8386     *  @param type the message type or -1 if we should read it here
    8487     *  @param buffer temp buffer to use
     88     *  @return total length of the message
    8589     */
    8690    public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
     
    111115            }
    112116           
    113             Hash calc = _context.sha().calculateHash(buffer, 0, size);
     117            byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     118            _context.sha().calculateHash(buffer, 0, size, calc, 0);
    114119            //boolean eq = calc.equals(h);
    115             boolean eq = DataHelper.eq(checksum, 0, calc.getData(), 0, CHECKSUM_LENGTH);
     120            boolean eq = DataHelper.eq(checksum, 0, calc, 0, CHECKSUM_LENGTH);
     121            SimpleByteCache.release(calc);
    116122            if (!eq)
    117123                throw new I2NPMessageException("Hash does not match for " + getClass().getName());
     
    124130            //if (time > 50)
    125131            //    _context.statManager().addRateData("i2np.readTime", time, time);
    126             return size + Hash.HASH_LENGTH + 1 + 4 + DataHelper.DATE_LENGTH;
     132            return CHECKSUM_LENGTH + 1 + 2 + 4 + DataHelper.DATE_LENGTH + size;
    127133        } catch (DataFormatException dfe) {
    128134            throw new I2NPMessageException("Error reading the message header", dfe);
    129135        }
    130136    }
     137
     138    /**
     139     *  Read the header, then read the rest into buffer, then call
     140     *  readMessage in the implemented message type
     141     *
     142     *<pre>
     143     *  Specifically:
     144     *    1 byte type (if caller didn't read already, as specified by the type param
     145     *    4 byte ID
     146     *    8 byte expiration
     147     *    2 byte size
     148     *    1 byte checksum
     149     *    size bytes of payload (read by readMessage() in implementation)
     150     *</pre>
     151     *
     152     *  @param type the message type or -1 if we should read it here
     153     *  @return total length of the message
     154     */
    131155    public int readBytes(byte data[], int type, int offset) throws I2NPMessageException, IOException {
    132156        int cur = offset;
     
    154178                                           + " wanted=" + size + "]: " + getClass().getName());
    155179
    156         Hash calc = _context.sha().calculateHash(data, cur, size);
    157         //boolean eq = calc.equals(h);
    158         boolean eq = DataHelper.eq(hdata, 0, calc.getData(), 0, CHECKSUM_LENGTH);
     180        byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     181        _context.sha().calculateHash(data, cur, size, calc, 0);
     182        boolean eq = DataHelper.eq(hdata, 0, calc, 0, CHECKSUM_LENGTH);
     183        SimpleByteCache.release(calc);
    159184        if (!eq)
    160185            throw new I2NPMessageException("Hash does not match for " + getClass().getName());
     
    232257            int writtenLen = writeMessageBody(buffer, prefixLen);
    233258            int payloadLen = writtenLen - prefixLen;
    234             Hash h = _context.sha().calculateHash(buffer, prefixLen, payloadLen);
     259            byte[] h = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     260            _context.sha().calculateHash(buffer, prefixLen, payloadLen, h, 0);
    235261
    236262            int off = 0;
     
    243269            DataHelper.toLong(buffer, off, 2, payloadLen);
    244270            off += 2;
    245             System.arraycopy(h.getData(), 0, buffer, off, CHECKSUM_LENGTH);
     271            System.arraycopy(h, 0, buffer, off, CHECKSUM_LENGTH);
     272            SimpleByteCache.release(h);
    246273
    247274            //long time = _context.clock().now() - start;
  • router/java/src/net/i2p/router/RouterVersion.java

    rf679ef2 r394dd3c  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 8;
     21    public final static long BUILD = 10;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/tunnel/FragmentHandler.java

    rf679ef2 r394dd3c  
    1616import net.i2p.util.ByteCache;
    1717import net.i2p.util.Log;
     18import net.i2p.util.SimpleByteCache;
    1819import net.i2p.util.SimpleTimer;
    1920
     
    242243            _log.debug("endpoint IV: " + Base64.encode(preV, validLength - HopProcessor.IV_LENGTH, HopProcessor.IV_LENGTH));
    243244       
    244         Hash v = _context.sha().calculateHash(preV, 0, validLength);
     245        byte[] v = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     246        _context.sha().calculateHash(preV, 0, validLength, v, 0);
    245247        _validateCache.release(ba);
    246248       
    247         boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
     249        boolean eq = DataHelper.eq(v, 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
    248250        if (!eq) {
    249251            if (_log.shouldLog(Log.WARN)) {
    250252                _log.warn("Corrupt tunnel message - verification fails: " + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
    251                            + " != " + Base64.encode(v.getData(), 0, 4));
     253                           + " != " + Base64.encode(v, 0, 4));
    252254                _log.warn("No matching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1)
    253255                           + " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd + ' '
     
    255257            }
    256258        }
     259        SimpleByteCache.release(v);
    257260       
    258261        if (eq) {
Note: See TracChangeset for help on using the changeset viewer.