Package net.i2p.router.transport.udp
Class PacketBuilder2
- java.lang.Object
-
- net.i2p.router.transport.udp.PacketBuilder2
-
class PacketBuilder2 extends Object
SSU2 only- Since:
- 0.9.54
-
-
Field Summary
Fields Modifier and Type Field Description static intIP_HEADER_SIZEIPv4 onlystatic intIPV6_HEADER_SIZEstatic intMIN_DATA_PACKET_OVERHEAD60static intMIN_IPV6_DATA_PACKET_OVERHEAD80(package private) static intPRIORITY_HIGH(package private) static intTYPE_ACK(package private) static intTYPE_CONF(package private) static intTYPE_CREAT(package private) static intTYPE_DESTROY(package private) static intTYPE_FIRSTFor debugging and stats only - does not go out on the wire.(package private) static intTYPE_INTRO(package private) static intTYPE_PUNCH(package private) static intTYPE_RESP(package private) static intTYPE_RREQ(package private) static intTYPE_SREQ(package private) static intTYPE_TBC(package private) static intTYPE_TCB(package private) static intTYPE_TFA(package private) static intTYPE_TTAstatic intUDP_HEADER_SIZESame for IPv4 and IPv6
-
Constructor Summary
Constructors Constructor Description PacketBuilder2(RouterContext ctx, UDPTransport transport)No state, all methods are thread-safe.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description UDPPacketbuildACK(PeerState2 peer)Build the ack packet.UDPPacketbuildHolePunch(InetAddress to, int port, SessionKey introKey, long sendID, long rcvID, byte[] signedData)Out-of-session, containing a RelayResponse block.UDPPacketbuildPacket(List<PacketBuilder.Fragment> fragments, List<SSU2Payload.Block> otherBlocks, SSU2Sender peer)UDPPacketbuildPacket(List<PacketBuilder.Fragment> fragments, PeerState2 peer)UDPPacketbuildPacket(OutboundMessageState state, int fragment, PeerState2 peer)This builds a data packet (PAYLOAD_TYPE_DATA).UDPPacketbuildPeerTestFromAlice(byte[] signedData, PeerState2 bob)Build a packet as Alice, to Bob to begin a peer test.UDPPacketbuildPeerTestFromAlice(InetAddress toIP, int toPort, SessionKey introKey, long sendID, long rcvID, byte[] signedData)Build a packet as Alice to Charlie.UDPPacketbuildPeerTestToAlice(int code, Hash charlieHash, byte[] signedData, PeerState2 alice)Build a packet as Bob to Alice, with the response from Charlie, or a rejection by Bob.UDPPacketbuildPeerTestToAlice(int code, Hash charlieHash, byte[] signedData, SSU2Payload.Block riBlock, PeerState2 alice)Build a packet as Bob to Alice, with the response from Charlie, or a rejection by Bob.UDPPacketbuildPeerTestToAlice(InetAddress aliceIP, int alicePort, SessionKey introKey, boolean firstSend, long sendID, long rcvID, byte[] signedData)Build a packet as Charlie to Alice.UDPPacketbuildPeerTestToBob(int code, byte[] signedData, PeerState2 bob)Build a packet as Charlie to Bob verifying that we will help test Alice.UDPPacketbuildPeerTestToCharlie(Hash aliceHash, byte[] signedData, SSU2Payload.Block riBlock, PeerState2 charlie)Build a packet as Bob to Charlie to help test Alice.UDPPacketbuildPing(PeerState2 peer)A DATA packet with padding only.(package private) UDPPacketbuildRelayIntro(byte[] signedData, SSU2Payload.Block riBlock, PeerState2 charlie)From Bob to Charlie.(package private) UDPPacketbuildRelayRequest(byte[] signedData, PeerState2 bob)From Alice to Bob.(package private) UDPPacketbuildRelayResponse(byte[] signedData, PeerState2 state)From Charlie to Bob or Bob to Alice.UDPPacketbuildRetryPacket(InboundEstablishState2 state, int terminationCode)Build a new Retry packet for the given peer, encrypting it as necessary.UDPPacketbuildRetryPacket(RemoteHostId to, SocketAddress toAddr, long destID, long srcID, int terminationCode)Build a new Retry packet with a termination code, for a rejection direct from the EstablishmentManager.UDPPacket[]buildSessionConfirmedPackets(OutboundEstablishState2 state, RouterInfo ourInfo)Build a new series of SessionConfirmed packets for the given peer, encrypting it as necessary.UDPPacketbuildSessionCreatedPacket(InboundEstablishState2 state)Build a new SessionCreated packet for the given peer, encrypting it as necessary.UDPPacketbuildSessionDestroyPacket(int reason, SSU2Sender peer)Build a data packet with a termination block.UDPPacketbuildSessionRequestPacket(OutboundEstablishState2 state)Build a new SessionRequest packet for the given peer, encrypting it as necessary.UDPPacketbuildTokenRequestPacket(OutboundEstablishState2 state)Build a new SessionRequest packet for the given peer, encrypting it as necessary.static intgetMaxAdditionalFragmentSize(PeerState peer, int numFragments, int curDataSize)Will a packet to 'peer' that already has 'numFragments' fragments totalling 'curDataSize' bytes fit another fragment? This includes the 3 byte block overhead, but NOT the 5 byte followon fragment overhead.
-
-
-
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
-
TYPE_DESTROY
static final int TYPE_DESTROY
- See Also:
- Constant Field Values
-
IP_HEADER_SIZE
public static final int IP_HEADER_SIZE
IPv4 only- See Also:
- Constant Field Values
-
UDP_HEADER_SIZE
public static final int UDP_HEADER_SIZE
Same for IPv4 and IPv6- See Also:
- Constant Field Values
-
MIN_DATA_PACKET_OVERHEAD
public static final int MIN_DATA_PACKET_OVERHEAD
60- See Also:
- Constant Field Values
-
IPV6_HEADER_SIZE
public static final int IPV6_HEADER_SIZE
- See Also:
- Constant Field Values
-
MIN_IPV6_DATA_PACKET_OVERHEAD
public static final int MIN_IPV6_DATA_PACKET_OVERHEAD
80- See Also:
- Constant Field Values
-
PRIORITY_HIGH
static final int PRIORITY_HIGH
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
PacketBuilder2
public PacketBuilder2(RouterContext ctx, UDPTransport transport)
No state, all methods are thread-safe.- Parameters:
transport- may be null for unit testing only
-
-
Method Detail
-
getMaxAdditionalFragmentSize
public static int getMaxAdditionalFragmentSize(PeerState peer, int numFragments, int curDataSize)
Will a packet to 'peer' that already has 'numFragments' fragments totalling 'curDataSize' bytes fit another fragment? This includes the 3 byte block overhead, but NOT the 5 byte followon fragment overhead. This doesn't leave anything for acks or anything else.- Parameters:
numFragments- >= 1- Returns:
- max additional fragment size
-
buildPacket
public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState2 peer) throws IOException
This builds a data packet (PAYLOAD_TYPE_DATA). See the methods below for the other message types. Note that while the UDP message spec allows for more than one fragment in a message, this method writes exactly one fragment. For no fragments use buildAck().- Throws:
IOException- if peer is dead
-
buildPacket
public UDPPacket buildPacket(List<PacketBuilder.Fragment> fragments, PeerState2 peer) throws IOException
- Throws:
IOException
-
buildPacket
public UDPPacket buildPacket(List<PacketBuilder.Fragment> fragments, List<SSU2Payload.Block> otherBlocks, SSU2Sender peer) throws IOException
- Throws:
IOException
-
buildPing
public UDPPacket buildPing(PeerState2 peer) throws IOException
A DATA packet with padding only. We use this for keepalive purposes.- Throws:
IOException- if peer is dead
-
buildACK
public UDPPacket buildACK(PeerState2 peer) throws IOException
Build the ack packet. An ack packet is just a data packet with no data. See buildPacket() for format.- Throws:
IOException- if peer is dead
-
buildSessionDestroyPacket
public UDPPacket buildSessionDestroyPacket(int reason, SSU2Sender peer) throws IOException
Build a data packet with a termination block. This will also include acks, a new token block, and padding.- Throws:
IOException- if peer is dead
-
buildTokenRequestPacket
public UDPPacket buildTokenRequestPacket(OutboundEstablishState2 state)
Build a new SessionRequest packet for the given peer, encrypting it as necessary.- Returns:
- ready to send packet, non-null
-
buildSessionRequestPacket
public UDPPacket buildSessionRequestPacket(OutboundEstablishState2 state)
Build a new SessionRequest packet for the given peer, encrypting it as necessary.- Returns:
- ready to send packet, non-null
-
buildSessionCreatedPacket
public UDPPacket buildSessionCreatedPacket(InboundEstablishState2 state)
Build a new SessionCreated packet for the given peer, encrypting it as necessary.- Returns:
- ready to send packet, non-null
-
buildRetryPacket
public UDPPacket buildRetryPacket(InboundEstablishState2 state, int terminationCode)
Build a new Retry packet for the given peer, encrypting it as necessary.- Parameters:
terminationCode- 0 normally, nonzero to send termination block- Returns:
- ready to send packet, non-null
-
buildRetryPacket
public UDPPacket buildRetryPacket(RemoteHostId to, SocketAddress toAddr, long destID, long srcID, int terminationCode)
Build a new Retry packet with a termination code, for a rejection direct from the EstablishmentManager. No InboundEstablishState2 required.- Parameters:
terminationCode- must be greater than zero- Returns:
- ready to send packet, non-null
- Since:
- 0.9.57
-
buildSessionConfirmedPackets
public UDPPacket[] buildSessionConfirmedPackets(OutboundEstablishState2 state, RouterInfo ourInfo)
Build a new series of SessionConfirmed packets for the given peer, encrypting it as necessary. If the RI is large enough that it is fragmented, this will still only return a single Session Confirmed message. The remaining RI blocks will be passed to the establish state via confirmedPacketsSent(), and the state will transmit them via the new PeerState2.- Returns:
- ready to send packets, non-null
-
buildPeerTestFromAlice
public UDPPacket buildPeerTestFromAlice(byte[] signedData, PeerState2 bob) throws IOException
Build a packet as Alice, to Bob to begin a peer test. In-session, message 1.- Returns:
- ready to send packet, non-null
- Throws:
IOException- if peer is dead
-
buildPeerTestFromAlice
public UDPPacket buildPeerTestFromAlice(InetAddress toIP, int toPort, SessionKey introKey, long sendID, long rcvID, byte[] signedData)
Build a packet as Alice to Charlie. Out-of-session, message 6.- Returns:
- ready to send packet, non-null
-
buildPeerTestToAlice
public UDPPacket buildPeerTestToAlice(int code, Hash charlieHash, byte[] signedData, PeerState2 alice) throws IOException
Build a packet as Bob to Alice, with the response from Charlie, or a rejection by Bob. In-session, message 4.- Parameters:
charlieHash- fake hash (all zeros) if rejected by bob- Returns:
- ready to send packet, non-null
- Throws:
IOException- if peer is dead
-
buildPeerTestToAlice
public UDPPacket buildPeerTestToAlice(int code, Hash charlieHash, byte[] signedData, SSU2Payload.Block riBlock, PeerState2 alice) throws IOException
Build a packet as Bob to Alice, with the response from Charlie, or a rejection by Bob. In-session, message 4.- Parameters:
charlieHash- fake hash (all zeros) if rejected by bobriBlock- to include, may be null- Returns:
- ready to send packet, non-null
- Throws:
IOException- if peer is dead- Since:
- 0.9.57
-
buildPeerTestToAlice
public UDPPacket buildPeerTestToAlice(InetAddress aliceIP, int alicePort, SessionKey introKey, boolean firstSend, long sendID, long rcvID, byte[] signedData)
Build a packet as Charlie to Alice. Out-of-session, messages 5 and 7.- Returns:
- ready to send packet, non-null
-
buildPeerTestToCharlie
public UDPPacket buildPeerTestToCharlie(Hash aliceHash, byte[] signedData, SSU2Payload.Block riBlock, PeerState2 charlie) throws IOException
Build a packet as Bob to Charlie to help test Alice. In-session, message 2.- Parameters:
riBlock- to include, may be null- Returns:
- ready to send packet, non-null
- Throws:
IOException- if peer is dead
-
buildPeerTestToBob
public UDPPacket buildPeerTestToBob(int code, byte[] signedData, PeerState2 bob) throws IOException
Build a packet as Charlie to Bob verifying that we will help test Alice. In-session, message 3.- Returns:
- ready to send packet, non-null
- Throws:
IOException- if peer is dead
-
buildRelayRequest
UDPPacket buildRelayRequest(byte[] signedData, PeerState2 bob) throws IOException
From Alice to Bob. In-session.- Parameters:
signedData- flag + signed data- Returns:
- non-null
- Throws:
IOException- if peer is dead
-
buildRelayIntro
UDPPacket buildRelayIntro(byte[] signedData, SSU2Payload.Block riBlock, PeerState2 charlie) throws IOException
From Bob to Charlie. In-session.- Parameters:
signedData- flag + alice hash + signed datariBlock- to include, may be null- Returns:
- non-null
- Throws:
IOException- if peer is dead
-
buildRelayResponse
UDPPacket buildRelayResponse(byte[] signedData, PeerState2 state) throws IOException
From Charlie to Bob or Bob to Alice. In-session.- Parameters:
signedData- flag + response code + signed data + optional tokenstate- Alice or Bob- Returns:
- non-null
- Throws:
IOException- if peer is dead
-
buildHolePunch
public UDPPacket buildHolePunch(InetAddress to, int port, SessionKey introKey, long sendID, long rcvID, byte[] signedData)
Out-of-session, containing a RelayResponse block.
-
-