diff --git a/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java b/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java index 721e72866..961d5f822 100644 --- a/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java +++ b/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java @@ -360,7 +360,9 @@ public Optional onSave() { @Override public void onStop() { - for (final SessionBase session : sessions.values()) { + // Avoid concurrent modifications + final HashMap, SessionBase> clone = new HashMap<>(sessions); + for (final SessionBase session : clone.values()) { session.expire(); sessionLayer.sendSession(session, null); closeSession(session); diff --git a/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java b/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java index 1d9e01f5a..8820033a4 100644 --- a/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java +++ b/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java @@ -290,13 +290,13 @@ SessionActions send(final StreamSessionImpl session, final ByteBuffer segment) { } } session.vmWindow = header.window; - if (header.psh) { - // Data to be sent - session.vmSequence += length; - final ByteBuffer sendBuffer = session.sendBuffer; - sendBuffer.compact(); - sendBuffer.put(segment); - sendBuffer.flip(); + // Data to be sent + session.vmSequence += length; + final ByteBuffer sendBuffer = session.sendBuffer; + sendBuffer.compact(); + sendBuffer.put(segment); + sendBuffer.flip(); + if (header.psh || length > 0) { session.needsAcknowledgment = true; } if (header.fin) { diff --git a/src/main/java/li/cil/oc2/common/inet/TcpHeader.java b/src/main/java/li/cil/oc2/common/inet/TcpHeader.java index eaf9f997a..0332663a3 100644 --- a/src/main/java/li/cil/oc2/common/inet/TcpHeader.java +++ b/src/main/java/li/cil/oc2/common/inet/TcpHeader.java @@ -120,7 +120,7 @@ public void acceptConnection(final int sequence, final int acknowledgment, final } public boolean isAcceptanceOrRejectionAcknowledged() { - return !syn && !urg && ack && !psh && !rst && !fin; + return !syn && !urg && ack && !rst && !fin; } public void rejectConnection(final int sequence, final int acknowledgment) {