Most working version
This commit is contained in:
@@ -90,42 +90,42 @@ public final class DefaultNetworkLayer implements NetworkLayer {
|
||||
@Override
|
||||
public void sendPacket(final short protocol, final ByteBuffer packet) {
|
||||
if (protocol != PROTOCOL_IPv4) {
|
||||
LOGGER.info("Unsupported network protocol");
|
||||
LOGGER.trace("Unsupported network protocol");
|
||||
return;
|
||||
}
|
||||
if (packet.remaining() < IPv4_HEADER_SIZE) {
|
||||
LOGGER.info("IP header is too small");
|
||||
LOGGER.trace("IP header is too small");
|
||||
return;
|
||||
}
|
||||
final byte versionAndIhl = packet.get();
|
||||
if ((versionAndIhl >>> 4) != IPv4_VERSION) {
|
||||
LOGGER.info("Invalid protocol version");
|
||||
LOGGER.trace("Invalid protocol version");
|
||||
return;
|
||||
}
|
||||
final int headerSize = (versionAndIhl & 0xF) * 4;
|
||||
if (headerSize < IPv4_HEADER_SIZE || packet.remaining() < headerSize) {
|
||||
LOGGER.info("Invalid header size");
|
||||
LOGGER.trace("Invalid header size");
|
||||
return;
|
||||
}
|
||||
packet.get(); // too hard, ignore
|
||||
int messageLength = Short.toUnsignedInt(packet.getShort());
|
||||
if (packet.remaining() + 4 < messageLength) {
|
||||
LOGGER.info("Packet size is lower than IP message size");
|
||||
LOGGER.trace("Packet size is lower than IP message size");
|
||||
return;
|
||||
}
|
||||
packet.getShort(); // normally, we don't expect message to be fragmented
|
||||
short flagsAndFragmentOffset = packet.getShort();
|
||||
if (((flagsAndFragmentOffset >>> 13) & 0b101) != 0) {
|
||||
LOGGER.info("Fragmented packet prohibited (1)");
|
||||
LOGGER.trace("Fragmented packet prohibited (1)");
|
||||
return; // no fragments!
|
||||
}
|
||||
if ((flagsAndFragmentOffset & 0x1FFF) != 0) {
|
||||
LOGGER.info("Fragmented packet prohibited (2)");
|
||||
LOGGER.trace("Fragmented packet prohibited (2)");
|
||||
return; // no fragments!
|
||||
}
|
||||
byte ttl = (byte) (packet.get() - 1);
|
||||
if (ttl == 0) {
|
||||
LOGGER.info("Small TTL value");
|
||||
LOGGER.trace("Small TTL value");
|
||||
return;
|
||||
}
|
||||
byte transportProtocol = packet.get();
|
||||
@@ -133,14 +133,14 @@ public final class DefaultNetworkLayer implements NetworkLayer {
|
||||
int srcIpAddress = packet.getInt();
|
||||
int dstIpAddress = packet.getInt();
|
||||
if (!internetManager.isAllowedToConnect(dstIpAddress)) {
|
||||
LOGGER.info("Forbidden IP address");
|
||||
LOGGER.trace("Forbidden IP address");
|
||||
return;
|
||||
}
|
||||
packet.position(packet.position() + headerSize - IPv4_HEADER_SIZE); // skip options
|
||||
packet.limit(packet.position() + messageLength - headerSize); // set correct limit
|
||||
|
||||
/// Next layer
|
||||
LOGGER.info("Transport message received");
|
||||
LOGGER.trace("Transport message received");
|
||||
outMessage.initializeBuffer(packet);
|
||||
outMessage.updateIpv4(srcIpAddress, dstIpAddress, ttl);
|
||||
transportLayer.sendTransportMessage(transportProtocol, outMessage);
|
||||
|
||||
@@ -64,7 +64,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
|
||||
final boolean somethingConnected = processQueue(readySessions.getToConnect(), session -> {
|
||||
if (session instanceof StreamSession streamSession) {
|
||||
LOGGER.info("Connected {}", session);
|
||||
LOGGER.trace("Connected {}", session);
|
||||
if (session.getState() != Session.States.NEW) {
|
||||
return false;
|
||||
}
|
||||
@@ -75,7 +75,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
streamSession.connect();
|
||||
return true;
|
||||
} catch (final ConnectException exception) {
|
||||
LOGGER.info("Connection rejected for {}", session);
|
||||
LOGGER.trace("Connection rejected for {}", session);
|
||||
closeSession(session);
|
||||
return true;
|
||||
} catch (final IOException exception) {
|
||||
@@ -92,7 +92,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
|
||||
processQueue(readySessions.getToRead(), session -> {
|
||||
if (session instanceof DatagramSession datagramSession) {
|
||||
LOGGER.info("Datagram received");
|
||||
LOGGER.trace("Datagram received");
|
||||
final DatagramChannel channel = getChannel(datagramSession);
|
||||
try {
|
||||
final ByteBuffer datagram = receiver.receive(datagramSession);
|
||||
@@ -109,16 +109,16 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
} catch (final IOException exception) {
|
||||
LOGGER.error("Trying to read datagram socket", exception);
|
||||
}
|
||||
LOGGER.info("Datagram received");
|
||||
LOGGER.trace("Datagram received");
|
||||
} else if (session instanceof StreamSession streamSession) {
|
||||
LOGGER.info("Stream received");
|
||||
LOGGER.trace("Stream received");
|
||||
final ByteBuffer stream = receiver.receive(streamSession);
|
||||
try {
|
||||
final SocketChannel channel = getChannel(streamSession);
|
||||
assert stream != null;
|
||||
assert false;
|
||||
final int read = channel.read(stream);
|
||||
LOGGER.info("Read from real world: {}", read);
|
||||
LOGGER.trace("Read from real world: {}", read);
|
||||
if (read == -1) {
|
||||
closeSession(session);
|
||||
}
|
||||
@@ -155,11 +155,11 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
final DatagramChannel channel =
|
||||
socketManager.createDatagramChannel(datagramSession, readySessions);
|
||||
datagramSession.setAttachment(channel);
|
||||
LOGGER.info("Open datagram socket {}", session.getDestination());
|
||||
LOGGER.trace("Open datagram socket {}", session.getDestination());
|
||||
/* Fallthrough */
|
||||
}
|
||||
case ESTABLISHED: {
|
||||
LOGGER.info("Send datagram");
|
||||
LOGGER.trace("Send datagram");
|
||||
final DatagramChannel channel = getChannel(datagramSession);
|
||||
assert data != null;
|
||||
channel.send(data, session.getDestination());
|
||||
@@ -167,7 +167,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
}
|
||||
case EXPIRED: {
|
||||
closeSession(session);
|
||||
LOGGER.info("Close datagram socket {}", session.getDestination());
|
||||
LOGGER.trace("Close datagram socket {}", session.getDestination());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -182,7 +182,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
final SocketChannel channel = socketManager.createStreamChannel(streamSession, readySessions);
|
||||
streamSession.setAttachment(channel);
|
||||
channel.connect(streamSession.getDestination());
|
||||
LOGGER.info("Open stream socket {}", streamSession.getDestination());
|
||||
LOGGER.trace("Open stream socket {}", streamSession.getDestination());
|
||||
}
|
||||
case ESTABLISHED -> {
|
||||
final SocketChannel channel = getChannel(streamSession);
|
||||
@@ -191,7 +191,7 @@ public final class DefaultSessionLayer implements SessionLayer {
|
||||
}
|
||||
case FINISH, EXPIRED -> {
|
||||
closeSession(session);
|
||||
LOGGER.info("Close stream socket {}", session.getDestination());
|
||||
LOGGER.trace("Close stream socket {}", session.getDestination());
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -96,7 +96,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
processExpirationQueue(expirationQueue, session -> {
|
||||
sessions.remove(session.getDiscriminator());
|
||||
--allSessionCount;
|
||||
LOGGER.info("Expired session {}", session.getDiscriminator());
|
||||
LOGGER.trace("Expired session {}", session.getDiscriminator());
|
||||
session.expire();
|
||||
sessionLayer.sendSession(session, null);
|
||||
});
|
||||
@@ -112,7 +112,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
}
|
||||
|
||||
private void closeSession(final SessionBase session) {
|
||||
LOGGER.info("Close session {}", session.getDiscriminator());
|
||||
LOGGER.trace("Close session {}", session.getDiscriminator());
|
||||
sessions.remove(session.getDiscriminator());
|
||||
expirationQueue.remove(session.getLastUpdateTime());
|
||||
--allSessionCount;
|
||||
@@ -148,7 +148,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
return null;
|
||||
}
|
||||
++allSessionCount;
|
||||
LOGGER.info("New session: {}", discriminator);
|
||||
LOGGER.trace("New session: {}", discriminator);
|
||||
final S newSession = factory.apply(discriminator);
|
||||
sessions.put(discriminator, newSession);
|
||||
updateSession(newSession);
|
||||
@@ -174,7 +174,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
break;
|
||||
case REJECT: {
|
||||
reject(payload, srcIpAddress);
|
||||
LOGGER.info("Reject session {}", session.getDiscriminator());
|
||||
LOGGER.trace("Reject session {}", session.getDiscriminator());
|
||||
/* Fallthrough */
|
||||
}
|
||||
case FINISH:
|
||||
@@ -212,7 +212,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
data.putShort(position + 16, checksum);
|
||||
data.position(position);
|
||||
message.updateIpv4(discriminator.getDstIpAddress(), discriminator.getSrcIpAddress());
|
||||
LOGGER.info("Prepared TCP packet to receive {}", stream.getHeader());
|
||||
LOGGER.trace("Prepared TCP packet to receive {}", stream.getHeader());
|
||||
return SessionActions.FORWARD;
|
||||
}
|
||||
default -> throw new IllegalStateException();
|
||||
@@ -226,7 +226,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
while (true) {
|
||||
if (rejectedStream != null) {
|
||||
// This branch should be checked first! Stream needs to be closed properly
|
||||
LOGGER.info("Rejecting stream {}", rejectedStream.getDiscriminator());
|
||||
LOGGER.trace("Rejecting stream {}", rejectedStream.getDiscriminator());
|
||||
final SessionActions success = prepareTCPSegment(message, rejectedStream);
|
||||
assert success == SessionActions.FORWARD;
|
||||
closeSession(rejectedStream);
|
||||
@@ -448,7 +448,7 @@ public final class DefaultTransportLayer implements TransportLayer {
|
||||
if (session == null) {
|
||||
reject(data, srcIpAddress);
|
||||
} else {
|
||||
LOGGER.info("GOT TCP");
|
||||
LOGGER.trace("GOT TCP");
|
||||
switch (session.send(data)) {
|
||||
case FORWARD -> {
|
||||
switch (session.getState()) {
|
||||
|
||||
@@ -208,7 +208,7 @@ public class StreamSessionImpl extends SessionBase implements StreamSession {
|
||||
final ByteBuffer receiveBuffer = session.receiveBuffer;
|
||||
if (session.nextSegmentMark == 0) {
|
||||
session.nextSegmentMark = Math.min(Math.min(session.vmWindow, receiveBuffer.position()), segment.remaining() - TcpHeader.MIN_HEADER_SIZE_NO_PORTS);
|
||||
LOGGER.info("Next segment mark: {}", session.nextSegmentMark);
|
||||
LOGGER.trace("Next segment mark: {}", session.nextSegmentMark);
|
||||
}
|
||||
header.urg = false;
|
||||
header.syn = false;
|
||||
@@ -222,7 +222,7 @@ public class StreamSessionImpl extends SessionBase implements StreamSession {
|
||||
header.window = session.computeWindow();
|
||||
if (!header.ack && !header.psh && session.state != TcpStates.FINISH) {
|
||||
// Nothing to send
|
||||
LOGGER.info("Established session nothing to send");
|
||||
LOGGER.trace("Established session nothing to send");
|
||||
return SessionActions.IGNORE;
|
||||
}
|
||||
if (header.psh) {
|
||||
@@ -251,15 +251,15 @@ public class StreamSessionImpl extends SessionBase implements StreamSession {
|
||||
final TcpHeader header = session.header;
|
||||
final boolean correct = header.read(segment);
|
||||
if (!correct) {
|
||||
LOGGER.info("Got invalid TCP header");
|
||||
LOGGER.trace("Got invalid TCP header");
|
||||
return SessionActions.IGNORE;
|
||||
}
|
||||
if (header.syn) {
|
||||
LOGGER.info("Got syn on established connection");
|
||||
LOGGER.trace("Got syn on established connection");
|
||||
return SessionActions.IGNORE;
|
||||
}
|
||||
if (header.sequenceNumber != session.vmSequence) {
|
||||
LOGGER.info("VM sent invalid sequence number (expected {}, got {})", session.vmSequence, header.sequenceNumber);
|
||||
LOGGER.trace("VM sent invalid sequence number (expected {}, got {})", session.vmSequence, header.sequenceNumber);
|
||||
return SessionActions.IGNORE;
|
||||
}
|
||||
final int length = segment.remaining();
|
||||
@@ -270,7 +270,7 @@ public class StreamSessionImpl extends SessionBase implements StreamSession {
|
||||
if (header.ack) {
|
||||
// Segment received
|
||||
if (header.acknowledgmentNumber != (session.mySequence + session.nextSegmentMark)) {
|
||||
LOGGER.info("VM acked wrong number (expected {}, got {})", session.mySequence, header.acknowledgmentNumber);
|
||||
LOGGER.trace("VM acked wrong number (expected {}, got {})", session.mySequence, header.acknowledgmentNumber);
|
||||
return SessionActions.IGNORE;
|
||||
}
|
||||
if (header.acknowledgmentNumber == (session.mySequence + session.nextSegmentMark)) {
|
||||
|
||||
Reference in New Issue
Block a user