Class FastI2NPMessageImpl

java.lang.Object
net.i2p.data.i2np.I2NPMessageImpl
net.i2p.data.i2np.FastI2NPMessageImpl
All Implemented Interfaces:
I2NPMessage
Direct Known Subclasses:
DatabaseLookupMessage, DatabaseSearchReplyMessage, DatabaseStoreMessage, DataMessage, DeliveryStatusMessage, GarlicMessage, TunnelDataMessage, TunnelGatewayMessage, UnknownI2NPMessage

public abstract class FastI2NPMessageImpl extends I2NPMessageImpl
Ignore, but save, the SHA-256 checksum in the full 16-byte header when read in. Use the same checksum when writing out. This is a savings for NTCP in, and for NTCP-in to NTCP-out for TunnelDataMessages. It's also a savings for messages embedded in other messages. Note that SSU does not use the SHA-256 checksum. Subclasses must take care to set _hasChecksum to false to invalidate it if the message payload changes between reading and writing. It isn't clear where, if anywhere, we actually need to send a checksum. For point-to-point messages over NTCP where we know the router version of the peer, we could add a method to skip checksum generation. For end-to-end I2NP messages embedded in a Garlic, TGM, etc... we would need a flag day.
Since:
0.8.12
  • Field Details

    • _checksum

      protected byte _checksum
    • _hasChecksum

      protected boolean _hasChecksum
  • Constructor Details

    • FastI2NPMessageImpl

      public FastI2NPMessageImpl(I2PAppContext context)
  • Method Details

    • readBytes

      public int readBytes(byte[] data, int type, int offset, int maxLen) throws I2NPMessageException
      Ignore, but save, the checksum, to be used later if necessary.
      Specified by:
      readBytes in interface I2NPMessage
      Overrides:
      readBytes in class I2NPMessageImpl
      Parameters:
      data - the data, may or may not include the type
      type - the message type or -1 if we should read it here
      offset - where to start starting at type if type is < 0 (16 byte header) starting at ID if type is >= 0 (15 byte header)
      maxLen - read no more than this many bytes from data starting at offset, even if it is longer This includes the type byte only if type < 0
      Returns:
      total length of the message
      Throws:
      IllegalStateException - if called twice, to protect saved checksum
      I2NPMessageException - if there is no valid message
    • toByteArray

      public int toByteArray(byte[] buffer)
      If available, use the previously-computed or previously-read checksum for speed
      Specified by:
      toByteArray in interface I2NPMessage
      Overrides:
      toByteArray in class I2NPMessageImpl
      Returns:
      the length written
    • toByteArrayWithSavedChecksum

      protected int toByteArrayWithSavedChecksum(byte[] buffer)
      Use a previously-computed checksum for speed