Most working version

This commit is contained in:
ktlo
2022-06-25 16:34:52 +03:00
committed by logan
parent 17223fc032
commit acf408cfa8
4 changed files with 34 additions and 34 deletions

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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()) {

View File

@@ -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)) {