net.i2p.router.transport.udp
Class UDPPacket

java.lang.Object
  extended by net.i2p.router.transport.udp.UDPPacket
All Implemented Interfaces:
CDQEntry

 class UDPPacket
extends Object
implements CDQEntry

Basic delivery unit containing the datagram. This also maintains a cache of object instances to allow rapid reuse.


Field Summary
static byte BITFIELD_CONTINUATION
           
static byte DATA_FLAG_ACK_BITFIELDS
           
static byte DATA_FLAG_ECN
           
static byte DATA_FLAG_EXPLICIT_ACK
           
static byte DATA_FLAG_EXTENDED
           
static byte DATA_FLAG_WANT_ACKS
           
static byte DATA_FLAG_WANT_REPLY
           
static int IV_SIZE
           
static int MAC_SIZE
           
(package private) static int MAX_PACKET_SIZE
          Actually it is one less than this, we assume if a received packet is this big it is truncated.
static int PAYLOAD_TYPE_DATA
           
static int PAYLOAD_TYPE_RELAY_INTRO
           
static int PAYLOAD_TYPE_RELAY_REQUEST
           
static int PAYLOAD_TYPE_RELAY_RESPONSE
           
static int PAYLOAD_TYPE_SESSION_CONFIRMED
           
static int PAYLOAD_TYPE_SESSION_CREATED
           
static int PAYLOAD_TYPE_SESSION_DESTROY
           
static int PAYLOAD_TYPE_SESSION_REQUEST
          Message types, 4 bits max
static int PAYLOAD_TYPE_TEST
           
 
Method Summary
static UDPPacket acquire(I2PAppContext ctx, boolean inbound)
           
static void clearCache()
          Call at shutdown/startup to not hold ctx refs
 void decrypt(SessionKey cipherKey)
          Decrypt this valid packet, overwriting the _data buffer's payload with the decrypted data (leaving the MAC and IV unaltered)
 void drop()
          For CDQ
 long getBegin()
           
 long getEnqueueTime()
          For CDQ
 long getExpiration()
           
(package private)  int getFragmentCount()
           
 long getLifetime()
           
 int getMarkedType()
          flag this packet as a particular type for accounting purposes, with 1 implying the packet is an ACK, otherwise it is a data packet
(package private)  int getMessageType()
          only for debugging and stats, does not go on the wire
 DatagramPacket getPacket()
           
 short getPriority()
           
(package private)  RemoteHostId getRemoteHost()
           
(package private)  long getTimeSinceReceived()
          a packet handler has pulled it off the inbound queue
 void markType(int type)
          flag this packet as a particular type for accounting purposes
(package private)  void received()
          a packet handler has pulled it off the inbound queue
 void release()
           
 void resetBegin()
           
 void setEnqueueTime(long now)
          For CDQ
(package private)  void setFragmentCount(int count)
           
(package private)  void setMessageType(int type)
          only for debugging and stats, does not go on the wire
 String toString()
          how many times we tried to validate the packet
 boolean validate(SessionKey macKey)
          Validate the packet against the MAC specified, returning true if the MAC matches, false otherwise.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

MAX_PACKET_SIZE

static final int MAX_PACKET_SIZE
Actually it is one less than this, we assume if a received packet is this big it is truncated. This is bigger than PeerState.LARGE_MTU, as the far-end's LARGE_MTU may be larger than ours. Due to longstanding bugs, a packet may be larger than LARGE_MTU (acks and padding). Together with an increase in the LARGE_MTU to 1492 in release 0.8.9, routers from 0.8.9 - 0.8.11 can generate packets up to 1536. Data packets are always a multiple of 16, so make this 4 + a multiple of 16.

See Also:
Constant Field Values

IV_SIZE

public static final int IV_SIZE
See Also:
Constant Field Values

MAC_SIZE

public static final int MAC_SIZE
See Also:
Constant Field Values

PAYLOAD_TYPE_SESSION_REQUEST

public static final int PAYLOAD_TYPE_SESSION_REQUEST
Message types, 4 bits max

See Also:
Constant Field Values

PAYLOAD_TYPE_SESSION_CREATED

public static final int PAYLOAD_TYPE_SESSION_CREATED
See Also:
Constant Field Values

PAYLOAD_TYPE_SESSION_CONFIRMED

public static final int PAYLOAD_TYPE_SESSION_CONFIRMED
See Also:
Constant Field Values

PAYLOAD_TYPE_RELAY_REQUEST

public static final int PAYLOAD_TYPE_RELAY_REQUEST
See Also:
Constant Field Values

PAYLOAD_TYPE_RELAY_RESPONSE

public static final int PAYLOAD_TYPE_RELAY_RESPONSE
See Also:
Constant Field Values

PAYLOAD_TYPE_RELAY_INTRO

public static final int PAYLOAD_TYPE_RELAY_INTRO
See Also:
Constant Field Values

PAYLOAD_TYPE_DATA

public static final int PAYLOAD_TYPE_DATA
See Also:
Constant Field Values

PAYLOAD_TYPE_TEST

public static final int PAYLOAD_TYPE_TEST
See Also:
Constant Field Values

PAYLOAD_TYPE_SESSION_DESTROY

public static final int PAYLOAD_TYPE_SESSION_DESTROY
Since:
0.8.1
See Also:
Constant Field Values

DATA_FLAG_EXPLICIT_ACK

public static final byte DATA_FLAG_EXPLICIT_ACK
See Also:
Constant Field Values

DATA_FLAG_ACK_BITFIELDS

public static final byte DATA_FLAG_ACK_BITFIELDS
See Also:
Constant Field Values

DATA_FLAG_ECN

public static final byte DATA_FLAG_ECN
See Also:
Constant Field Values

DATA_FLAG_WANT_ACKS

public static final byte DATA_FLAG_WANT_ACKS
See Also:
Constant Field Values

DATA_FLAG_WANT_REPLY

public static final byte DATA_FLAG_WANT_REPLY
See Also:
Constant Field Values

DATA_FLAG_EXTENDED

public static final byte DATA_FLAG_EXTENDED
See Also:
Constant Field Values

BITFIELD_CONTINUATION

public static final byte BITFIELD_CONTINUATION
See Also:
Constant Field Values
Method Detail

getPacket

public DatagramPacket getPacket()

getPriority

public short getPriority()

getExpiration

public long getExpiration()

getBegin

public long getBegin()

getLifetime

public long getLifetime()

resetBegin

public void resetBegin()

markType

public void markType(int type)
flag this packet as a particular type for accounting purposes


getMarkedType

public int getMarkedType()
flag this packet as a particular type for accounting purposes, with 1 implying the packet is an ACK, otherwise it is a data packet


getMessageType

int getMessageType()
only for debugging and stats, does not go on the wire


setMessageType

void setMessageType(int type)
only for debugging and stats, does not go on the wire


getFragmentCount

int getFragmentCount()

setFragmentCount

void setFragmentCount(int count)

getRemoteHost

RemoteHostId getRemoteHost()

validate

public boolean validate(SessionKey macKey)
Validate the packet against the MAC specified, returning true if the MAC matches, false otherwise.


decrypt

public void decrypt(SessionKey cipherKey)
Decrypt this valid packet, overwriting the _data buffer's payload with the decrypted data (leaving the MAC and IV unaltered)


setEnqueueTime

public void setEnqueueTime(long now)
For CDQ

Specified by:
setEnqueueTime in interface CDQEntry
Since:
0.9.3

received

void received()
a packet handler has pulled it off the inbound queue


getEnqueueTime

public long getEnqueueTime()
For CDQ

Specified by:
getEnqueueTime in interface CDQEntry
Since:
0.9.3

getTimeSinceReceived

long getTimeSinceReceived()
a packet handler has pulled it off the inbound queue


toString

public String toString()
how many times we tried to validate the packet

Overrides:
toString in class Object

acquire

public static UDPPacket acquire(I2PAppContext ctx,
                                boolean inbound)
Parameters:
inbound - unused

drop

public void drop()
For CDQ

Specified by:
drop in interface CDQEntry
Since:
0.9.3

release

public void release()

clearCache

public static void clearCache()
Call at shutdown/startup to not hold ctx refs

Since:
0.9.2