SSU2: Post-termination handler part 2 WIP

PeerState2 implements SSU2Sender
This commit is contained in:
zzz
2022-12-06 12:09:00 -05:00
parent 0fd6c672d3
commit 2e817416d5
2 changed files with 46 additions and 15 deletions

View File

@@ -1410,8 +1410,11 @@ public class PeerState {
- 16); // padding safety
}
/** @return non-null */
RemoteHostId getRemoteHostId() { return _remoteHostId; }
/**
* @return non-null
* @since public since 0.9.57 for SSU2Sender interface only
*/
public RemoteHostId getRemoteHostId() { return _remoteHostId; }
/**
* TODO should this use a queue, separate from the list of msgs pending an ack?

View File

@@ -28,7 +28,6 @@ import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
import net.i2p.router.transport.TransportUtil;
import net.i2p.router.transport.udp.InboundMessageFragments.ModifiableLong;
import net.i2p.router.transport.udp.PacketBuilder.Fragment;
import static net.i2p.router.transport.udp.SSU2Util.*;
import net.i2p.util.HexDump;
import net.i2p.util.Log;
@@ -44,7 +43,7 @@ import net.i2p.util.SimpleTimer2;
*
* @since 0.9.54
*/
public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback, SSU2Bitfield.Callback {
public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback, SSU2Bitfield.Callback, SSU2Sender {
private final long _sendConnID;
private final long _rcvConnID;
private final AtomicInteger _packetNumber = new AtomicInteger();
@@ -301,18 +300,40 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
// SSU 2 things
/// begin SSU2Sender interface ///
/**
* Next outbound packet number,
* starts at 1 for Alice (0 is Session Confirmed) and 0 for Bob
* @since public since 0.9.57 for SSU2Sender interface only
*/
long getNextPacketNumber() { return _packetNumber.getAndIncrement(); }
long getSendConnID() { return _sendConnID; }
public long getNextPacketNumber() { return _packetNumber.getAndIncrement(); }
/**
* @since public since 0.9.57 for SSU2Sender interface only
*/
public long getSendConnID() { return _sendConnID; }
/**
* Caller must sync on returned object when encrypting
* @since public since 0.9.57 for SSU2Sender interface only
*/
public CipherState getSendCipher() { return _sendCha; }
/**
* @since public since 0.9.57 for SSU2Sender interface only
*/
public byte[] getSendHeaderEncryptKey1() { return _sendHeaderEncryptKey1; }
/**
* @since public since 0.9.57 for SSU2Sender interface only
*/
public byte[] getSendHeaderEncryptKey2() { return _sendHeaderEncryptKey2; }
/**
* @since 0.9.57
*/
public void setDestroyReason(int reason) { /* todo */ }
/// end SSU2Sender interface ///
long getRcvConnID() { return _rcvConnID; }
/** caller must sync on returned object when encrypting */
CipherState getSendCipher() { return _sendCha; }
byte[] getSendHeaderEncryptKey1() { return _sendHeaderEncryptKey1; }
byte[] getRcvHeaderEncryptKey1() { return _rcvHeaderEncryptKey1; }
byte[] getSendHeaderEncryptKey2() { return _sendHeaderEncryptKey2; }
byte[] getRcvHeaderEncryptKey2() { return _rcvHeaderEncryptKey2; }
void setOurAddress(byte[] ip, int port) {
@@ -321,7 +342,10 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
byte[] getOurIP() { return _ourIP; }
int getOurPort() { return _ourPort; }
SSU2Bitfield getReceivedMessages() {
/**
* @since public since 0.9.57 for SSU2Sender interface only
*/
public SSU2Bitfield getReceivedMessages() {
// logged in PacketBuilder2
//if (_log.shouldDebug())
// _log.debug("Sending acks " + _receivedMessages + " on " + this);
@@ -333,7 +357,10 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
return _receivedMessages;
}
SSU2Bitfield getAckedMessages() { return _ackedMessages; }
/**
* @since public since 0.9.57 for SSU2Sender interface only
*/
public SSU2Bitfield getAckedMessages() { return _ackedMessages; }
/**
* @param packet fully encrypted, header and body decryption will be done here
@@ -877,9 +904,10 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
* so we can process acks.
*
* @param length including ip/udp header, for logging only
* @since public since 0.9.57 for SSU2Sender interface only
*
*/
void fragmentsSent(long pktNum, int length, List<PacketBuilder.Fragment> fragments) {
public void fragmentsSent(long pktNum, int length, List<PacketBuilder.Fragment> fragments) {
List<PacketBuilder.Fragment> old = _sentMessages.putIfAbsent(Long.valueOf(pktNum), fragments);
if (old != null) {
// shouldn't happen
@@ -973,9 +1001,9 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
/**
* Flag byte to be sent in header
*
* @since 0.9.56
* @since 0.9.56, public since 0.9.57 for SSU2Sender interface
*/
byte getFlags() {
public byte getFlags() {
return shouldRequestImmediateAck() ? (byte) 0x01 : 0;
}