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)
        If inbound, caller MUST immediately call setWeRelayToThemAs() (if nonzero) and sendAck0().
        Parameters:
        rtt - from the EstablishState, or 0 if not available
    • Method Detail

      • sendAck0

        void sendAck0()
        Send immediate ACK 0 of Session Confirmed. Inbound only. Bundle relay tag if requested, see InboundEstablishState2.
        Since:
        0.9.62
      • 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
      • 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