Class PeerState2

    • Constructor Detail

      • 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 Detail

      • 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)
      • 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

        public long getNextPacketNumber()
                                 throws IOException
        Next outbound packet number, starts at 1 for Alice (0 is Session Confirmed) and 0 for Bob
        Specified by:
        getNextPacketNumber in interface SSU2Sender
        Throws:
        IOException
        Since:
        public since 0.9.57 for SSU2Sender interface only
      • getNextPacketNumberNoThrow

        protected long getNextPacketNumberNoThrow()
        For PeerStateDestroyed only, after we are dead
        Since:
        0.9.57
      • getSendConnID

        public long getSendConnID()
        Specified by:
        getSendConnID in interface SSU2Sender
        Since:
        public since 0.9.57 for SSU2Sender interface only
      • getSendCipher

        public CipherState getSendCipher()
        Caller must sync on returned object when encrypting
        Specified by:
        getSendCipher in interface SSU2Sender
        Since:
        public since 0.9.57 for SSU2Sender interface only
      • getSendHeaderEncryptKey1

        public byte[] getSendHeaderEncryptKey1()
        Specified by:
        getSendHeaderEncryptKey1 in interface SSU2Sender
        Since:
        public since 0.9.57 for SSU2Sender interface only
      • getSendHeaderEncryptKey2

        public byte[] getSendHeaderEncryptKey2()
        Specified by:
        getSendHeaderEncryptKey2 in interface SSU2Sender
        Since:
        public since 0.9.57 for SSU2Sender interface only
      • setDestroyReason

        public void setDestroyReason​(int reason)
        Specified by:
        setDestroyReason in interface SSU2Sender
        Since:
        0.9.57
      • getRcvConnID

        long getRcvConnID()
      • getRcvHeaderEncryptKey1

        byte[] getRcvHeaderEncryptKey1()
      • getRcvHeaderEncryptKey2

        byte[] getRcvHeaderEncryptKey2()
      • getDestroyReason

        int getDestroyReason()
        Returns:
        0 (REASON_UNSPEC) if unset
        Since:
        0.9.57 for PeerStateDestroyed
      • getRcvCipher

        CipherState getRcvCipher()
        Since:
        0.9.57 for PeerStateDestroyed
      • setOurAddress

        void setOurAddress​(byte[] ip,
                           int port)
        For initialization by IES2/OES2 only.
      • getOurIP

        byte[] getOurIP()
        As received in the Address Block in the handshake, or subsequently in the data phase. Unvalidated. Also, if a transient IPv6 address, may be deprecated and not match our current non-deprecated IPv6 address.
      • getOurPort

        int getOurPort()
        As received in the Address Block in the handshake, or subsequently in the data phase. Unvalidated.
      • 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
      • gotOptions

        public void gotOptions​(byte[] options,
                               boolean isHandshake)
        Specified by:
        gotOptions in interface SSU2Payload.PayloadCallback
        isHandshake - true only for message 3 part 2
      • 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
      • 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
      • 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
      • gotTermination

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

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

        public 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.
        Specified by:
        fragmentsSent in interface SSU2Sender
        Parameters:
        length - including ip/udp header, for logging only
        Since:
        public since 0.9.57 for SSU2Sender interface 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

        public byte getFlags()
        Flag byte to be sent in header
        Specified by:
        getFlags in interface SSU2Sender
        Since:
        0.9.56, public since 0.9.57 for SSU2Sender interface
      • isDead

        boolean isDead()
        Since:
        0.9.57