forked from I2P_Developers/i2p.i2p
SSU:
Synchronize UDPPacket methods, possible fix for bad packets and UDP stalls caused by cache corruption? Cleanup unused methods and fields
This commit is contained in:
@ -18,7 +18,7 @@ public class RouterVersion {
|
||||
/** deprecated */
|
||||
public final static String ID = "Monotone";
|
||||
public final static String VERSION = CoreVersion.VERSION;
|
||||
public final static long BUILD = 26;
|
||||
public final static long BUILD = 27;
|
||||
|
||||
/** for example "-test" */
|
||||
public final static String EXTRA = "-rc";
|
||||
|
@ -357,7 +357,7 @@ class PacketHandler {
|
||||
} else {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Validation with existing con failed, and validation as reestablish failed too. DROP " + packet);
|
||||
_context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime(), packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime());
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -455,7 +455,7 @@ class PacketHandler {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Cannot validate rcvd pkt (path) wasCached? " + alreadyFailed + ": " + packet);
|
||||
|
||||
_context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime(), packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime());
|
||||
switch (peerType) {
|
||||
case INBOUND_FALLBACK:
|
||||
_context.statManager().addRateData("udp.droppedInvalidEstablish.inbound", packet.getLifetime(), packet.getTimeSinceReceived());
|
||||
@ -532,7 +532,7 @@ class PacketHandler {
|
||||
_state = 34;
|
||||
receivePacket(reader, packet, INBOUND_FALLBACK);
|
||||
} else {
|
||||
_context.statManager().addRateData("udp.droppedInvalidInboundEstablish", packet.getLifetime(), packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidInboundEstablish", packet.getLifetime());
|
||||
}
|
||||
}
|
||||
|
||||
@ -638,12 +638,12 @@ class PacketHandler {
|
||||
if (skew > GRACE_PERIOD) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Packet too far in the past: " + new Date(sendOn) + ": " + packet);
|
||||
_context.statManager().addRateData("udp.droppedInvalidSkew", skew, packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidSkew", skew);
|
||||
return;
|
||||
} else if (skew < 0 - GRACE_PERIOD) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Packet too far in the future: " + new Date(sendOn) + ": " + packet);
|
||||
_context.statManager().addRateData("udp.droppedInvalidSkew", 0-skew, packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidSkew", 0-skew);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -790,7 +790,7 @@ class PacketHandler {
|
||||
_state = 52;
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
|
||||
_context.statManager().addRateData("udp.droppedInvalidUnknown", packet.getLifetime(), packet.getExpiration());
|
||||
_context.statManager().addRateData("udp.droppedInvalidUnknown", packet.getLifetime());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -26,15 +26,15 @@ class UDPPacket implements CDQEntry {
|
||||
private final DatagramPacket _packet;
|
||||
private volatile short _priority;
|
||||
private volatile long _initializeTime;
|
||||
private volatile long _expiration;
|
||||
//private volatile long _expiration;
|
||||
private final byte[] _data;
|
||||
private final byte[] _validateBuf;
|
||||
private final byte[] _ivBuf;
|
||||
private volatile int _markedType;
|
||||
private volatile RemoteHostId _remoteHost;
|
||||
private volatile boolean _released;
|
||||
private volatile Exception _releasedBy;
|
||||
private volatile Exception _acquiredBy;
|
||||
private RemoteHostId _remoteHost;
|
||||
private boolean _released;
|
||||
//private volatile Exception _releasedBy;
|
||||
//private volatile Exception _acquiredBy;
|
||||
private long _enqueueTime;
|
||||
private long _receivedTime;
|
||||
//private long _beforeValidate;
|
||||
@ -112,7 +112,7 @@ class UDPPacket implements CDQEntry {
|
||||
init(ctx);
|
||||
}
|
||||
|
||||
private void init(I2PAppContext ctx) {
|
||||
private synchronized void init(I2PAppContext ctx) {
|
||||
_context = ctx;
|
||||
//_dataBuf = _dataCache.acquire();
|
||||
Arrays.fill(_data, (byte)0);
|
||||
@ -146,20 +146,20 @@ class UDPPacket implements CDQEntry {
|
||||
****/
|
||||
|
||||
/** */
|
||||
public DatagramPacket getPacket() { verifyNotReleased(); return _packet; }
|
||||
public short getPriority() { verifyNotReleased(); return _priority; }
|
||||
public long getExpiration() { verifyNotReleased(); return _expiration; }
|
||||
public long getBegin() { verifyNotReleased(); return _initializeTime; }
|
||||
public synchronized DatagramPacket getPacket() { verifyNotReleased(); return _packet; }
|
||||
public synchronized short getPriority() { verifyNotReleased(); return _priority; }
|
||||
//public long getExpiration() { verifyNotReleased(); return _expiration; }
|
||||
public synchronized long getBegin() { verifyNotReleased(); return _initializeTime; }
|
||||
public long getLifetime() { /** verifyNotReleased(); */ return _context.clock().now() - _initializeTime; }
|
||||
public void resetBegin() { _initializeTime = _context.clock().now(); }
|
||||
public synchronized void resetBegin() { _initializeTime = _context.clock().now(); }
|
||||
/** flag this packet as a particular type for accounting purposes */
|
||||
public void markType(int type) { verifyNotReleased(); _markedType = type; }
|
||||
public synchronized void markType(int type) { verifyNotReleased(); _markedType = type; }
|
||||
/**
|
||||
* flag this packet as a particular type for accounting purposes, with
|
||||
* 1 implying the packet is an ACK, otherwise it is a data packet
|
||||
*
|
||||
*/
|
||||
public int getMarkedType() { verifyNotReleased(); return _markedType; }
|
||||
public synchronized int getMarkedType() { verifyNotReleased(); return _markedType; }
|
||||
|
||||
private int _messageType;
|
||||
private int _fragmentCount;
|
||||
@ -174,7 +174,7 @@ class UDPPacket implements CDQEntry {
|
||||
/** only for debugging and stats */
|
||||
void setFragmentCount(int count) { _fragmentCount = count; }
|
||||
|
||||
RemoteHostId getRemoteHost() {
|
||||
synchronized RemoteHostId getRemoteHost() {
|
||||
if (_remoteHost == null) {
|
||||
//long before = System.currentTimeMillis();
|
||||
InetAddress addr = _packet.getAddress();
|
||||
@ -193,7 +193,7 @@ class UDPPacket implements CDQEntry {
|
||||
* MAC matches, false otherwise.
|
||||
*
|
||||
*/
|
||||
public boolean validate(SessionKey macKey) {
|
||||
public synchronized boolean validate(SessionKey macKey) {
|
||||
verifyNotReleased();
|
||||
//_beforeValidate = _context.clock().now();
|
||||
boolean eq = false;
|
||||
@ -242,7 +242,7 @@ class UDPPacket implements CDQEntry {
|
||||
} else {
|
||||
Log log = _context.logManager().getLog(UDPPacket.class);
|
||||
if (log.shouldLog(Log.WARN))
|
||||
log.warn("Payload length is " + payloadLength + ", too short!\n" +
|
||||
log.warn("Payload length is " + payloadLength + ", too short! From: " + getRemoteHost() + '\n' +
|
||||
net.i2p.util.HexDump.dump(_data, _packet.getOffset(), _packet.getLength()));
|
||||
}
|
||||
|
||||
@ -256,7 +256,7 @@ class UDPPacket implements CDQEntry {
|
||||
* with the decrypted data (leaving the MAC and IV unaltered)
|
||||
*
|
||||
*/
|
||||
public void decrypt(SessionKey cipherKey) {
|
||||
public synchronized void decrypt(SessionKey cipherKey) {
|
||||
verifyNotReleased();
|
||||
System.arraycopy(_data, MAC_SIZE, _ivBuf, 0, IV_SIZE);
|
||||
int len = _packet.getLength();
|
||||
@ -279,7 +279,7 @@ class UDPPacket implements CDQEntry {
|
||||
public void setEnqueueTime(long now) { _enqueueTime = now; }
|
||||
|
||||
/** a packet handler has pulled it off the inbound queue */
|
||||
void received() { _receivedTime = _context.clock().now(); }
|
||||
synchronized void received() { _receivedTime = _context.clock().now(); }
|
||||
|
||||
/** a packet handler has decrypted and verified the packet and is about to parse out the good bits */
|
||||
//void beforeReceiveFragments() { _beforeReceiveFragments = _context.clock().now(); }
|
||||
@ -293,7 +293,7 @@ class UDPPacket implements CDQEntry {
|
||||
public long getEnqueueTime() { return _enqueueTime; }
|
||||
|
||||
/** a packet handler has pulled it off the inbound queue */
|
||||
long getTimeSinceReceived() { return (_receivedTime > 0 ? _context.clock().now() - _receivedTime : 0); }
|
||||
synchronized long getTimeSinceReceived() { return (_receivedTime > 0 ? _context.clock().now() - _receivedTime : 0); }
|
||||
|
||||
/** a packet handler has decrypted and verified the packet and is about to parse out the good bits */
|
||||
//long getTimeSinceReceiveFragments() { return (_beforeReceiveFragments > 0 ? _context.clock().now() - _beforeReceiveFragments : 0); }
|
||||
@ -343,16 +343,20 @@ class UDPPacket implements CDQEntry {
|
||||
UDPPacket rv = null;
|
||||
if (CACHE) {
|
||||
rv = _packetCache.poll();
|
||||
if (rv != null)
|
||||
rv.init(ctx);
|
||||
if (rv != null) {
|
||||
synchronized(rv) {
|
||||
if (!rv._released) {
|
||||
Log log = rv._context.logManager().getLog(UDPPacket.class);
|
||||
log.error("Unreleased cached packet", new Exception());
|
||||
rv = null;
|
||||
} else {
|
||||
rv.init(ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rv == null)
|
||||
rv = new UDPPacket(ctx);
|
||||
//if (rv._acquiredBy != null) {
|
||||
// _log.log(Log.CRIT, "Already acquired! current stack trace is:", new Exception());
|
||||
// _log.log(Log.CRIT, "Earlier acquired:", rv._acquiredBy);
|
||||
//}
|
||||
//rv._acquiredBy = new Exception("acquired on");
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -364,7 +368,7 @@ class UDPPacket implements CDQEntry {
|
||||
release();
|
||||
}
|
||||
|
||||
public void release() {
|
||||
public synchronized void release() {
|
||||
verifyNotReleased();
|
||||
_released = true;
|
||||
//_releasedBy = new Exception("released by");
|
||||
@ -385,7 +389,7 @@ class UDPPacket implements CDQEntry {
|
||||
_packetCache.clear();
|
||||
}
|
||||
|
||||
private void verifyNotReleased() {
|
||||
private synchronized void verifyNotReleased() {
|
||||
if (!CACHE) return;
|
||||
if (_released) {
|
||||
Log log = _context.logManager().getLog(UDPPacket.class);
|
||||
|
Reference in New Issue
Block a user