net.i2p.router.transport.udp
Class PacketBuilder

java.lang.Object
  extended by net.i2p.router.transport.udp.PacketBuilder

public class PacketBuilder
extends java.lang.Object

Big ol' class to do all our packet formatting. The UDPPackets generated are fully authenticated, encrypted, and configured for delivery to the peer.


Field Summary
(package private) static int PROTOCOL_VERSION
          we only talk to people of the right version
(package private) static int TYPE_ACK
           
(package private) static int TYPE_CONF
           
(package private) static int TYPE_CREAT
           
(package private) static int TYPE_FIRST
          For debugging and stats only - does not go out on the wire.
(package private) static int TYPE_INTRO
           
(package private) static int TYPE_PUNCH
           
(package private) static int TYPE_RESP
           
(package private) static int TYPE_RREQ
           
(package private) static int TYPE_SREQ
           
(package private) static int TYPE_TBC
           
(package private) static int TYPE_TCB
           
(package private) static int TYPE_TFA
           
(package private) static int TYPE_TTA
           
 
Constructor Summary
PacketBuilder(I2PAppContext ctx, UDPTransport transport)
           
 
Method Summary
 UDPPacket buildACK(PeerState peer, java.util.List<ACKBitfield> ackBitfields)
          Build the ack packet.
 UDPPacket buildHolePunch(UDPPacketReader reader)
           
 UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer)
           
 UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer, java.util.List<java.lang.Long> ackIdsRemaining, java.util.List<ACKBitfield> partialACKsRemaining)
           
 UDPPacket buildPeerTestFromAlice(java.net.InetAddress toIP, int toPort, SessionKey toIntroKey, long nonce, SessionKey aliceIntroKey)
          Build a packet as if we are Alice and we either want Bob to begin a peer test or Charlie to finish a peer test.
 UDPPacket buildPeerTestFromAlice(java.net.InetAddress toIP, int toPort, SessionKey toCipherKey, SessionKey toMACKey, long nonce, SessionKey aliceIntroKey)
           
 UDPPacket buildPeerTestToAlice(java.net.InetAddress aliceIP, int alicePort, SessionKey aliceIntroKey, SessionKey charlieIntroKey, long nonce)
          Build a packet as if we are either Bob or Charlie and we are helping test Alice.
 UDPPacket buildPeerTestToBob(java.net.InetAddress bobIP, int bobPort, java.net.InetAddress aliceIP, int alicePort, SessionKey aliceIntroKey, long nonce, SessionKey bobCipherKey, SessionKey bobMACKey)
          Build a packet as if we are Charlie sending Bob a packet verifying that we will help test Alice.
 UDPPacket buildPeerTestToCharlie(java.net.InetAddress aliceIP, int alicePort, SessionKey aliceIntroKey, long nonce, java.net.InetAddress charlieIP, int charliePort, SessionKey charlieCipherKey, SessionKey charlieMACKey)
          Build a packet as if we are Bob sending Charlie a packet to help test Alice.
 UDPPacket buildPing(PeerState peer)
           
(package private)  UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request)
           
 UDPPacket buildRelayRequest(java.net.InetAddress introHost, int introPort, byte[] introKey, long introTag, SessionKey ourIntroKey, long introNonce, boolean encrypt)
           
 UDPPacket[] buildRelayRequest(UDPTransport transport, OutboundEstablishState state, SessionKey ourIntroKey)
          build intro packets for each of the published introducers
(package private)  UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey)
           
 UDPPacket buildSessionConfirmedPacket(OutboundEstablishState state, int fragmentNum, int numFragments, byte[] identity)
          Build a new SessionConfirmed packet for the given peer
 UDPPacket[] buildSessionConfirmedPackets(OutboundEstablishState state, RouterIdentity ourIdentity)
          Build a new series of SessionConfirmed packets for the given peer, encrypting it as necessary.
 UDPPacket buildSessionCreatedPacket(InboundEstablishState state, int externalPort, SessionKey ourIntroKey)
          Build a new SessionCreated packet for the given peer, encrypting it as necessary.
 UDPPacket buildSessionRequestPacket(OutboundEstablishState state)
          Build a new SessionRequest packet for the given peer, encrypting it as necessary.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

TYPE_FIRST

static final int TYPE_FIRST
For debugging and stats only - does not go out on the wire. These are chosen to be higher than the highest I2NP message type, as a data packet is set to the underlying I2NP message type.

See Also:
Constant Field Values

TYPE_ACK

static final int TYPE_ACK
See Also:
Constant Field Values

TYPE_PUNCH

static final int TYPE_PUNCH
See Also:
Constant Field Values

TYPE_RESP

static final int TYPE_RESP
See Also:
Constant Field Values

TYPE_INTRO

static final int TYPE_INTRO
See Also:
Constant Field Values

TYPE_RREQ

static final int TYPE_RREQ
See Also:
Constant Field Values

TYPE_TCB

static final int TYPE_TCB
See Also:
Constant Field Values

TYPE_TBC

static final int TYPE_TBC
See Also:
Constant Field Values

TYPE_TTA

static final int TYPE_TTA
See Also:
Constant Field Values

TYPE_TFA

static final int TYPE_TFA
See Also:
Constant Field Values

TYPE_CONF

static final int TYPE_CONF
See Also:
Constant Field Values

TYPE_SREQ

static final int TYPE_SREQ
See Also:
Constant Field Values

TYPE_CREAT

static final int TYPE_CREAT
See Also:
Constant Field Values

PROTOCOL_VERSION

static final int PROTOCOL_VERSION
we only talk to people of the right version

See Also:
Constant Field Values
Constructor Detail

PacketBuilder

public PacketBuilder(I2PAppContext ctx,
                     UDPTransport transport)
Method Detail

buildPacket

public UDPPacket buildPacket(OutboundMessageState state,
                             int fragment,
                             PeerState peer)

buildPacket

public UDPPacket buildPacket(OutboundMessageState state,
                             int fragment,
                             PeerState peer,
                             java.util.List<java.lang.Long> ackIdsRemaining,
                             java.util.List<ACKBitfield> partialACKsRemaining)
Parameters:
ackIdsRemaining - list of messageIds (Long) that should be acked by this packet. The list itself is passed by reference, and if a messageId is transmitted and the sender does not want the ID to be included in subsequent acks, it should be removed from the list. NOTE: right now this does NOT remove the IDs, which means it assumes that the IDs will be transmitted potentially multiple times, and should otherwise be removed from the list.
partialACKsRemaining - list of messageIds (ACKBitfield) that should be acked by this packet. The list itself is passed by reference, and if a messageId is included, it should be removed from the list.

buildPing

public UDPPacket buildPing(PeerState peer)

buildACK

public UDPPacket buildACK(PeerState peer,
                          java.util.List<ACKBitfield> ackBitfields)
Build the ack packet. The list need not be sorted into full and partial; this method will put all fulls before the partials in the outgoing packet.

Parameters:
ackBitfields - list of ACKBitfield instances to either fully or partially ACK

buildSessionCreatedPacket

public UDPPacket buildSessionCreatedPacket(InboundEstablishState state,
                                           int externalPort,
                                           SessionKey ourIntroKey)
Build a new SessionCreated packet for the given peer, encrypting it as necessary.

Returns:
ready to send packet, or null if there was a problem

buildSessionRequestPacket

public UDPPacket buildSessionRequestPacket(OutboundEstablishState state)
Build a new SessionRequest packet for the given peer, encrypting it as necessary.

Returns:
ready to send packet, or null if there was a problem

buildSessionConfirmedPackets

public UDPPacket[] buildSessionConfirmedPackets(OutboundEstablishState state,
                                                RouterIdentity ourIdentity)
Build a new series of SessionConfirmed packets for the given peer, encrypting it as necessary.

Returns:
ready to send packets, or null if there was a problem TODO: doesn't really return null, and caller doesn't handle null return (null SigningPrivateKey should cause this?) Should probably return null if buildSessionConfirmedPacket() turns null for any fragment

buildSessionConfirmedPacket

public UDPPacket buildSessionConfirmedPacket(OutboundEstablishState state,
                                             int fragmentNum,
                                             int numFragments,
                                             byte[] identity)
Build a new SessionConfirmed packet for the given peer

Returns:
ready to send packets, or null if there was a problem

buildPeerTestFromAlice

public UDPPacket buildPeerTestFromAlice(java.net.InetAddress toIP,
                                        int toPort,
                                        SessionKey toIntroKey,
                                        long nonce,
                                        SessionKey aliceIntroKey)
Build a packet as if we are Alice and we either want Bob to begin a peer test or Charlie to finish a peer test.

Returns:
ready to send packet, or null if there was a problem

buildPeerTestFromAlice

public UDPPacket buildPeerTestFromAlice(java.net.InetAddress toIP,
                                        int toPort,
                                        SessionKey toCipherKey,
                                        SessionKey toMACKey,
                                        long nonce,
                                        SessionKey aliceIntroKey)

buildPeerTestToAlice

public UDPPacket buildPeerTestToAlice(java.net.InetAddress aliceIP,
                                      int alicePort,
                                      SessionKey aliceIntroKey,
                                      SessionKey charlieIntroKey,
                                      long nonce)
Build a packet as if we are either Bob or Charlie and we are helping test Alice.

Returns:
ready to send packet, or null if there was a problem

buildPeerTestToCharlie

public UDPPacket buildPeerTestToCharlie(java.net.InetAddress aliceIP,
                                        int alicePort,
                                        SessionKey aliceIntroKey,
                                        long nonce,
                                        java.net.InetAddress charlieIP,
                                        int charliePort,
                                        SessionKey charlieCipherKey,
                                        SessionKey charlieMACKey)
Build a packet as if we are Bob sending Charlie a packet to help test Alice.

Returns:
ready to send packet, or null if there was a problem

buildPeerTestToBob

public UDPPacket buildPeerTestToBob(java.net.InetAddress bobIP,
                                    int bobPort,
                                    java.net.InetAddress aliceIP,
                                    int alicePort,
                                    SessionKey aliceIntroKey,
                                    long nonce,
                                    SessionKey bobCipherKey,
                                    SessionKey bobMACKey)
Build a packet as if we are Charlie sending Bob a packet verifying that we will help test Alice.

Returns:
ready to send packet, or null if there was a problem

buildRelayRequest

public UDPPacket[] buildRelayRequest(UDPTransport transport,
                                     OutboundEstablishState state,
                                     SessionKey ourIntroKey)
build intro packets for each of the published introducers


buildRelayRequest

public UDPPacket buildRelayRequest(java.net.InetAddress introHost,
                                   int introPort,
                                   byte[] introKey,
                                   long introTag,
                                   SessionKey ourIntroKey,
                                   long introNonce,
                                   boolean encrypt)

buildRelayIntro

UDPPacket buildRelayIntro(RemoteHostId alice,
                          PeerState charlie,
                          UDPPacketReader.RelayRequestReader request)

buildRelayResponse

UDPPacket buildRelayResponse(RemoteHostId alice,
                             PeerState charlie,
                             long nonce,
                             SessionKey aliceIntroKey)

buildHolePunch

public UDPPacket buildHolePunch(UDPPacketReader reader)