Class PacketBuilder2

java.lang.Object
net.i2p.router.transport.udp.PacketBuilder2

class PacketBuilder2 extends Object
SSU2 only
Since:
0.9.54
  • Field Details

  • Constructor Details

    • PacketBuilder2

      public PacketBuilder2(RouterContext ctx, UDPTransport transport)
      No state, all methods are thread-safe.
      Parameters:
      transport - may be null for unit testing only
  • Method Details

    • 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)
      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, a new token block, 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, 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, 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.
      Parameters:
      signedData - flag + signed data
      Returns:
      null on failure
    • buildRelayIntro

      UDPPacket buildRelayIntro(byte[] signedData, PeerState2 charlie)
      From Bob to Charlie. In-session.
      Parameters:
      signedData - flag + alice hash + signed data
      Returns:
      null on failure
    • buildRelayResponse

      UDPPacket buildRelayResponse(byte[] signedData, PeerState2 state)
      From Charlie to Bob or Bob to Alice. In-session.
      Parameters:
      signedData - flag + response code + signed data + optional token
      state - Alice or Bob
      Returns:
      null on failure
    • buildHolePunch

      public UDPPacket buildHolePunch(InetAddress to, int port, SessionKey introKey, long sendID, long rcvID, byte[] signedData)
      Out-of-session, containing a RelayResponse block.