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 int
IP_HEADER_SIZE
IPv4 onlystatic int
IPV6_HEADER_SIZE
static int
MIN_DATA_PACKET_OVERHEAD
60static int
MIN_IPV6_DATA_PACKET_OVERHEAD
80(package private) static int
PRIORITY_HIGH
(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
static int
UDP_HEADER_SIZE
Same 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 UDPPacket
buildACK(PeerState2 peer)
Build the ack packet.UDPPacket
buildHolePunch(InetAddress to, int port)
Creates an empty unauthenticated packet for hole punching.UDPPacket
buildPacket(List<PacketBuilder.Fragment> fragments, List<SSU2Payload.Block> otherBlocks, PeerState2 peer)
UDPPacket
buildPacket(List<PacketBuilder.Fragment> fragments, PeerState2 peer)
UDPPacket
buildPacket(OutboundMessageState state, int fragment, PeerState2 peer)
This builds a data packet (PAYLOAD_TYPE_DATA).UDPPacket
buildPeerTestFromAlice(byte[] signedData, PeerState2 bob)
Build a packet as Alice, to Bob to begin a peer test.UDPPacket
buildPeerTestFromAlice(InetAddress toIP, int toPort, SessionKey introKey, long sendID, long rcvID, byte[] signedData)
Build a packet as Alice to Charlie.UDPPacket
buildPeerTestToAlice(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.UDPPacket
buildPeerTestToAlice(InetAddress aliceIP, int alicePort, SessionKey introKey, boolean firstSend, long sendID, long rcvID, byte[] signedData)
Build a packet as Charlie to Alice.UDPPacket
buildPeerTestToBob(int code, byte[] signedData, PeerState2 bob)
Build a packet as Charlie to Bob verifying that we will help test Alice.UDPPacket
buildPeerTestToCharlie(Hash aliceHash, byte[] signedData, PeerState2 charlie)
Build a packet as Bob to Charlie to help test Alice.UDPPacket
buildPing(PeerState2 peer)
A DATA packet with padding only.(package private) UDPPacket
buildRelayIntro(byte[] signedData, PeerState2 charlie)
From Bob to Charlie.(package private) UDPPacket
buildRelayRequest(byte[] signedData, PeerState2 bob)
From Alice to Bob.(package private) UDPPacket
buildRelayResponse(byte[] signedData, PeerState2 state)
From Charlie to Bob or Bob to Alice.UDPPacket
buildRetryPacket(InboundEstablishState2 state)
Build a new Retry packet for the given peer, encrypting it as necessary.UDPPacket[]
buildSessionConfirmedPackets(OutboundEstablishState2 state, RouterInfo ourInfo)
Build a new series of SessionConfirmed packets for the given peer, encrypting it as necessary.UDPPacket
buildSessionCreatedPacket(InboundEstablishState2 state)
Build a new SessionCreated packet for the given peer, encrypting it as necessary.UDPPacket
buildSessionDestroyPacket(int reason, PeerState2 peer)
Build a data packet with a termination block.UDPPacket
buildSessionRequestPacket(OutboundEstablishState2 state)
Build a new SessionRequest packet for the given peer, encrypting it as necessary.UDPPacket
buildTokenRequestPacket(OutboundEstablishState2 state)
Build a new SessionRequest packet for the given peer, encrypting it as necessary.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 doesn't leave anything for acks or anything else.
-
-
-
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
-
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 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)
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().- Returns:
- null on error
-
buildPacket
public UDPPacket buildPacket(List<PacketBuilder.Fragment> fragments, PeerState2 peer)
-
buildPacket
public UDPPacket buildPacket(List<PacketBuilder.Fragment> fragments, List<SSU2Payload.Block> otherBlocks, PeerState2 peer)
-
buildPing
public UDPPacket buildPing(PeerState2 peer)
A DATA packet with padding only. We use this for keepalive purposes.
-
buildACK
public UDPPacket buildACK(PeerState2 peer)
Build the ack packet. An ack packet is just a data packet with no data. See buildPacket() for format.
-
buildSessionDestroyPacket
public UDPPacket buildSessionDestroyPacket(int reason, PeerState2 peer)
Build a data packet with a termination block. This will also include acks and padding.
-
buildTokenRequestPacket
public UDPPacket buildTokenRequestPacket(OutboundEstablishState2 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
-
buildSessionRequestPacket
public UDPPacket buildSessionRequestPacket(OutboundEstablishState2 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
-
buildSessionCreatedPacket
public UDPPacket buildSessionCreatedPacket(InboundEstablishState2 state)
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
-
buildRetryPacket
public UDPPacket buildRetryPacket(InboundEstablishState2 state)
Build a new Retry 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(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, or null if there was a problem
-
buildPeerTestFromAlice
public UDPPacket buildPeerTestFromAlice(byte[] signedData, PeerState2 bob)
Build a packet as Alice, to Bob to begin a peer test. In-session, message 1.- Returns:
- ready to send packet, or null if there was a problem
-
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, or null if there was a problem
-
buildPeerTestToAlice
public UDPPacket buildPeerTestToAlice(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. In-session, message 4.- Parameters:
charlieHash
- fake hash (all zeros) if rejected by bob- Returns:
- ready to send packet, or null if there was a problem
-
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, or null if there was a problem
-
buildPeerTestToCharlie
public UDPPacket buildPeerTestToCharlie(Hash aliceHash, byte[] signedData, PeerState2 charlie)
Build a packet as Bob to Charlie to help test Alice. In-session, message 2.- Returns:
- ready to send packet, or null if there was a problem
-
buildPeerTestToBob
public UDPPacket buildPeerTestToBob(int code, byte[] signedData, PeerState2 bob)
Build a packet as Charlie to Bob verifying that we will help test Alice. In-session, message 3.- Returns:
- ready to send packet, or null if there was a problem
-
buildRelayRequest
UDPPacket buildRelayRequest(byte[] signedData, PeerState2 bob)
From Alice to Bob. In-session.- Returns:
- null on failure
-
buildRelayIntro
UDPPacket buildRelayIntro(byte[] signedData, PeerState2 charlie)
From Bob to Charlie. In-session.- Returns:
- null on failure
-
buildRelayResponse
UDPPacket buildRelayResponse(byte[] signedData, PeerState2 state)
From Charlie to Bob or Bob to Alice. In-session.- Parameters:
state
- Alice or Bob- Returns:
- null on failure
-
buildHolePunch
public UDPPacket buildHolePunch(InetAddress to, int port)
Creates an empty unauthenticated packet for hole punching. Parameters must be validated previously.
-
-