Class PeerState2

java.lang.Object
net.i2p.router.transport.udp.PeerState
net.i2p.router.transport.udp.PeerState2
All Implemented Interfaces:
SSU2Bitfield.Callback, SSU2Payload.PayloadCallback

public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback, SSU2Bitfield.Callback
Contain all of the state about a UDP connection to a peer. This is instantiated only after a connection is fully established. Public only for UI peers page. Not a public API, not for external use. SSU2 only.
Since:
0.9.54
  • Field Details

  • Constructor Details

    • PeerState2

      public PeerState2(RouterContext ctx, UDPTransport transport, InetSocketAddress remoteAddress, Hash remotePeer, boolean isInbound, int rtt, CipherState sendCha, CipherState rcvCha, long sendID, long rcvID, byte[] sendHdrKey1, byte[] sendHdrKey2, byte[] rcvHdrKey2)
      Parameters:
      rtt - from the EstablishState, or 0 if not available
  • Method Details

    • getVersion

      public int getVersion()
      Overrides:
      getVersion in class PeerState
    • fragmentSize

      int fragmentSize()
      how much payload data can we shove in there? This is 5 bytes too low for first or only fragment, because the 9 byte I2NP header is included in that fragment. Does NOT leave any room for acks with a full-size fragment.
      Overrides:
      fragmentSize in class PeerState
      Returns:
      MTU - 68 (IPv4), MTU - 88 (IPv6)
    • fragmentOverhead

      int fragmentOverhead()
      Packet overhead This is 5 bytes too high for first or only fragment, because the 9 byte I2NP header is included in that fragment. Does NOT leave any room for acks with a full-size fragment.
      Overrides:
      fragmentOverhead in class PeerState
      Returns:
      68 (IPv4), 88 (IPv6)
    • clearWantedACKSendSince

      void clearWantedACKSendSince()
      All acks have been sent.
      Overrides:
      clearWantedACKSendSince in class PeerState
    • messagePartiallyReceived

      protected void messagePartiallyReceived(long now)
      Overridden to use our version of ACKTimer
      Overrides:
      messagePartiallyReceived in class PeerState
    • finishMessages

      int finishMessages(long now)
      Overridden to expire unacked packets in _sentMessages. These will remain unacked if lost; fragments will be retransmitted in a new packet.
      Overrides:
      finishMessages in class PeerState
      Returns:
      number of active outbound messages remaining
    • allocateSend

      List<OutboundMessageState> allocateSend(long now)
      Overridden to retransmit SessionConfirmed also
      Overrides:
      allocateSend in class PeerState
      Returns:
      allocated messages to send (never empty), or null if no messages or no resources
    • getCurrentFullACKs

      List<Long> getCurrentFullACKs()
      Description copied from class: PeerState
      Grab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list. If the message id is transmitted to the peer, removeACKMessage(Long) should be called. The returned list contains acks not yet sent only. The caller should NOT transmit all of them all the time, even if there is room, or the packets will have way too much overhead. SSU 1 only.
      Overrides:
      getCurrentFullACKs in class PeerState
      Returns:
      a new list, do as you like with it
    • getCurrentResendACKs

      List<Long> getCurrentResendACKs()
      Description copied from class: PeerState
      Grab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list. The returned list contains a random assortment of acks already sent. The caller should NOT transmit all of them all the time, even if there is room, or the packets will have way too much overhead. SSU 1 only.
      Overrides:
      getCurrentResendACKs in class PeerState
      Returns:
      a new list, do as you like with it
    • removeACKMessage

      void removeACKMessage(Long messageId)
      Description copied from class: PeerState
      The ack was sent. Side effect - sets _lastACKSend SSU 1 only.
      Overrides:
      removeACKMessage in class PeerState
    • fetchPartialACKs

      void fetchPartialACKs(List<ACKBitfield> rv)
      Description copied from class: PeerState
      SSU 1 only.
      Overrides:
      fetchPartialACKs in class PeerState
      Parameters:
      rv - out parameter, populated with true partial ACKBitfields. no full bitfields are included.
    • getNextPacketNumber

      long getNextPacketNumber()
      Next outbound packet number, starts at 1 for Alice (0 is Session Confirmed) and 0 for Bob
    • getSendConnID

      long getSendConnID()
    • getRcvConnID

      long getRcvConnID()
    • getSendCipher

      CipherState getSendCipher()
      caller must sync on returned object when encrypting
    • getSendHeaderEncryptKey1

      byte[] getSendHeaderEncryptKey1()
    • getRcvHeaderEncryptKey1

      byte[] getRcvHeaderEncryptKey1()
    • getSendHeaderEncryptKey2

      byte[] getSendHeaderEncryptKey2()
    • getRcvHeaderEncryptKey2

      byte[] getRcvHeaderEncryptKey2()
    • setOurAddress

      void setOurAddress(byte[] ip, int port)
    • getOurIP

      byte[] getOurIP()
    • getOurPort

      int getOurPort()
    • getReceivedMessages

      SSU2Bitfield getReceivedMessages()
    • getAckedMessages

      SSU2Bitfield getAckedMessages()
    • receivePacket

      void receivePacket(UDPPacket packet)
      Parameters:
      packet - fully encrypted, header and body decryption will be done here
    • receivePacket

      void receivePacket(RemoteHostId from, UDPPacket packet)
      From different than expected source IP/port
      Parameters:
      from - source address
      packet - fully encrypted, header and body decryption will be done here
      Since:
      0.9.55
    • gotDateTime

      public void gotDateTime(long time)
      Specified by:
      gotDateTime in interface SSU2Payload.PayloadCallback
    • gotOptions

      public void gotOptions(byte[] options, boolean isHandshake)
      Specified by:
      gotOptions in interface SSU2Payload.PayloadCallback
      Parameters:
      isHandshake - true only for message 3 part 2
    • gotRI

      public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws DataFormatException
      Specified by:
      gotRI in interface SSU2Payload.PayloadCallback
      Parameters:
      ri - will already be validated
      isHandshake - true only for message 3 part 2
      Throws:
      DataFormatException
    • gotRIFragment

      public void gotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags)
      Specified by:
      gotRIFragment in interface SSU2Payload.PayloadCallback
      Parameters:
      data - is first gzipped and then fragmented
      isHandshake - true only for message 3 part 2
    • gotAddress

      public void gotAddress(byte[] ip, int port)
      Specified by:
      gotAddress in interface SSU2Payload.PayloadCallback
    • gotRelayTagRequest

      public void gotRelayTagRequest()
      Specified by:
      gotRelayTagRequest in interface SSU2Payload.PayloadCallback
    • gotRelayTag

      public void gotRelayTag(long tag)
      Specified by:
      gotRelayTag in interface SSU2Payload.PayloadCallback
    • gotRelayRequest

      public void gotRelayRequest(byte[] data)
      Specified by:
      gotRelayRequest in interface SSU2Payload.PayloadCallback
      Parameters:
      data - excludes flag, includes signature
    • gotRelayResponse

      public void gotRelayResponse(int status, byte[] data)
      Specified by:
      gotRelayResponse in interface SSU2Payload.PayloadCallback
      Parameters:
      status - 0 = accept, 1-255 = reject
      data - excludes flag, includes signature
    • gotRelayIntro

      public void gotRelayIntro(Hash aliceHash, byte[] data)
      Specified by:
      gotRelayIntro in interface SSU2Payload.PayloadCallback
      Parameters:
      data - excludes flag, includes signature
    • gotPeerTest

      public void gotPeerTest(int msg, int status, Hash h, byte[] data)
      Specified by:
      gotPeerTest in interface SSU2Payload.PayloadCallback
      Parameters:
      msg - 1-7
      status - 0 = accept, 1-255 = reject
      h - Alice or Charlie hash for msg 2 and 4, null for msg 1, 3, 5-7
      data - excludes flag, includes signature
    • gotToken

      public void gotToken(long token, long expires)
      Specified by:
      gotToken in interface SSU2Payload.PayloadCallback
    • gotI2NP

      public void gotI2NP(I2NPMessage msg)
      Specified by:
      gotI2NP in interface SSU2Payload.PayloadCallback
    • gotFragment

      public void gotFragment(byte[] data, int off, int len, long messageId, int frag, boolean isLast) throws DataFormatException
      Description copied from interface: SSU2Payload.PayloadCallback
      Data must be copied out in this method. Data starts at the 9 byte header for fragment 0.
      Specified by:
      gotFragment in interface SSU2Payload.PayloadCallback
      Parameters:
      off - offset in data
      len - length of data to copy
      Throws:
      DataFormatException
    • gotACK

      public void gotACK(long ackThru, int acks, byte[] ranges)
      Specified by:
      gotACK in interface SSU2Payload.PayloadCallback
      Parameters:
      ranges - null if none
    • gotTermination

      public void gotTermination(int reason, long count)
      Specified by:
      gotTermination in interface SSU2Payload.PayloadCallback
      Parameters:
      count - in theory could wrap around to negative, but very unlikely
    • gotPathChallenge

      public void gotPathChallenge(RemoteHostId from, byte[] data)
      Specified by:
      gotPathChallenge in interface SSU2Payload.PayloadCallback
      Parameters:
      from - null if unknown
    • gotPathResponse

      public void gotPathResponse(RemoteHostId from, byte[] data)
      Specified by:
      gotPathResponse in interface SSU2Payload.PayloadCallback
      Parameters:
      from - null if unknown
    • changeAddress

      void changeAddress(RemoteHostId id)
      Caller should sync; UDPTransport must remove and add to peersByRemoteHost map
      Since:
      0.9.56
    • fragmentsSent

      void fragmentsSent(long pktNum, int length, List<PacketBuilder.Fragment> fragments)
      Record the mapping of packet number to what fragments were in it, so we can process acks.
      Parameters:
      length - including ip/udp header, for logging only
    • bitSet

      public void bitSet(long pktNum)
      Callback from SSU2Bitfield.forEachAndNot(). A new ack was received.
      Specified by:
      bitSet in interface SSU2Bitfield.Callback
    • confirmedPacketsSent

      void confirmedPacketsSent(byte[][] data)
      Note that we just sent the SessionConfirmed packets and save them for retransmission. This is only called the first time. For retransmit see allocateSend() above.
    • getFlags

      byte getFlags()
      Flag byte to be sent in header
      Since:
      0.9.56