Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tcp ack #24

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/.idea/
/target/
SMOLSimulationExperiment_debug.html
SMOLSimulationExperiment_error.html
SMOLSimulationExperiment_report.html
SMOLSimulationExperiment_trace.html
out_java.csv

27 changes: 13 additions & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@
<name>SMOL</name>

<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-slf4j-provider</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
Expand All @@ -21,7 +32,6 @@
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.jung/jung-graph-impl -->
<dependency>
<groupId>net.sf.jung</groupId>
<artifactId>jung-graph-impl</artifactId>
Expand All @@ -38,13 +48,6 @@
<artifactId>jung-io</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>net.sf.jung</groupId>
<artifactId>jung-graph-impl</artifactId>
<version>2.0.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.sf.jung</groupId>
<artifactId>jung-visualization</artifactId>
Expand All @@ -62,8 +65,6 @@
<artifactId>desmoj</artifactId>
<version>2.5.1</version>
</dependency>


</dependencies>

<build>
Expand Down Expand Up @@ -119,15 +120,13 @@
</executions>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>main.groovy.dsl.engine.SmolDriver</mainClass>
</transformer>
</transformers>
</configuration>
</plugin>

</plugins>
</build>


</project>
5 changes: 5 additions & 0 deletions smol.iml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="desmoj-2.5.1e-bin" level="project" />
<orderEntry type="library" name="Maven: org.apache.maven:maven-slf4j-provider:3.6.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.apache.maven.shared:maven-shared-utils:3.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.10" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.groovy:groovy-all:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.11.2" level="project" />
<orderEntry type="library" name="Maven: net.sf.jung:jung-graph-impl:2.0.1" level="project" />
Expand Down
136 changes: 88 additions & 48 deletions src/main/java/com/sim/network/EthAdapter.java
Original file line number Diff line number Diff line change
@@ -1,95 +1,135 @@
package main.java.com.sim.network;



import desmoj.core.simulator.ExternalEvent;
import desmoj.core.simulator.Model;
import desmoj.core.simulator.TimeSpan;
import desmoj.core.simulator.*;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Slf4j
public class EthAdapter extends ExternalEvent {
private final boolean ENABLE_ACK = true;

protected Queue<EthFrame> inAdapterQueue;
protected Queue<EthFrame> outAdapterQueue;
protected Queue<TCPMessage> inMsgQueue;
public Queue<TCPMessage> outMsgQueue;
private String adapterAddress;
private boolean collisionDetected = false;
private boolean transmits = false;
@Getter
private final Queue<EthFrame> inAdapterQueue;

@Getter
private final Queue<EthFrame> outAdapterQueue;

public String getAdapterAddress() {
return adapterAddress;
}
public boolean isCollisionDetected() {
return collisionDetected;
}
public void setCollisionDetected(boolean collisionDetected) {
this.collisionDetected = collisionDetected;
}
private final Queue<TCPMessage> inMsgQueue;

@Getter
private final Queue<TCPMessage> outMsgQueue;

@Getter
private final String adapterAddress;

@Getter
@Setter
private boolean collisionDetected;

public EthAdapter(Model owner, String name, boolean showInTrace, String address) {
super(owner, name, showInTrace);
inAdapterQueue = new Queue<EthFrame>(owner,"in-adapterQueue-"+address,true,true);
outAdapterQueue = new Queue<EthFrame>(owner,"out-adapterQueue-"+address,true,true);
inMsgQueue = new Queue<TCPMessage>(owner, "in-messageQueue-"+address, true, true);
outMsgQueue = new Queue<TCPMessage>(owner, "out-messageQueue-"+address, true, true);
this.adapterAddress = address;

inAdapterQueue = new Queue<>(owner, "in-adapterQueue-" + address, true, true);
outAdapterQueue = new Queue<>(owner, "out-adapterQueue-" + address, true, true);
inMsgQueue = new Queue<>(owner, "in-messageQueue-" + address, true, true);
outMsgQueue = new Queue<>(owner, "out-messageQueue-" + address, true, true);

adapterAddress = address;
collisionDetected = false;
}

@Override
public void eventRoutine() {
NetworkModel model = (NetworkModel) getModel();

if(!this.collisionDetected) {
if (!outMsgQueue.isEmpty()) {
if (!isCollisionDetected()) {
outMsgQueue(model);
adapterQueue(model);
}

TCPMessage tcpMessage = outMsgQueue.first();
outMsgQueue.remove(tcpMessage);
inAdapterQueue(model);

EthAdapter adapter = null;
List<EthAdapter> adapterList = model.getEthAdapterList().stream().filter(x -> this.getName() == x.getName()).collect(Collectors.toList());
if (adapterList.size() == 1) {
adapter = adapterList.get(0);
} else {
sendTraceNote("illegal number of instance");
}
schedule(new TimeSpan(1, TimeUnit.MICROSECONDS));
}

EthFrame frame = new EthFrame(model, "ETH-Frame", true, adapter, presentTime());
private void outMsgQueue(NetworkModel model) {
if (!outMsgQueue.isEmpty()) {

frame.setDestAddress(tcpMessage.getDstAddress());
frame.setTcpMessage(tcpMessage);
TCPMessage tcpMessage = outMsgQueue.first();
outMsgQueue.remove(tcpMessage);

outAdapterQueue.insert(frame);
}
EthFrame frame = createFrame(model, (tcpMessage.getName().contains("ACK") ? "ETH-ACK-Frame" : "ETH-Frame"));
frame.setDestAddress(tcpMessage.getDstAddress());
frame.setTcpMessage(tcpMessage);

outAdapterQueue.insert(frame);
}
}

if (!outAdapterQueue.isEmpty()) {
EthFrame frame = outAdapterQueue.first();
outAdapterQueue.remove(frame);
model.ethPendingBuffer.insert(frame);
}
private void adapterQueue(NetworkModel model) {
if (!outAdapterQueue.isEmpty()) {
EthFrame frame = outAdapterQueue.first();
outAdapterQueue.remove(frame);
model.getEthPendingBuffer().insert(frame);
}
}

private void inAdapterQueue(NetworkModel model) {
if (!inAdapterQueue.isEmpty()) {
EthFrame inFrame = inAdapterQueue.first();
inAdapterQueue.remove(inFrame);

sendTraceNote("FRAME-STOP " + inFrame.getName());
inFrame.getTcpMessage().setStopTransmission(presentTime());

sendTraceNote("TCPMSG-LEFT-TIME|"+inFrame.getTcpMessage().getTransmissionTime().toString()+"|"+inFrame.adapter.getName());
if (ENABLE_ACK) {
String timeStamp = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS: ").format(new Date());

if (inFrame.getName().contains("ACK")) {
log.info(timeStamp + "ACK recv: src=" + inFrame.getTcpMessage().getSrcAddress() + ", dst=" + inFrame.getTcpMessage().getDstAddress()
+ ", " + inFrame.getName() + ", adapter=" + getName());

sendTraceNote("TCPMSG-ACK-RECV-TIME|" + inFrame.getTcpMessage().getTransmissionTime().toString() + "|" + getName());
} else {
TCPMessage ackMsg = new TCPMessage(model, "ACK Message", true);
ackMsg.setSrcAddress(inFrame.getTcpMessage().getDstAddress());
ackMsg.setDstAddress(inFrame.getTcpMessage().getSrcAddress());

outMsgQueue.insert(ackMsg);

TCPMessage inTCPMessage = new TCPMessage(model, "IN-TCP-Message", true);
inMsgQueue.insert(inTCPMessage);
sendTraceNote("TCPMSG-ACK-SENT-TIME|" + inFrame.getTcpMessage().getTransmissionTime().toString() + "|" + getName());

log.info(timeStamp + "ACK sent: src=" + ackMsg.getSrcAddress() + ", dst=" + ackMsg.getDstAddress()
+ ", " + ackMsg.getName() + ", adapter=" + getName());
}
}

sendTraceNote("TCPMSG-LEFT-TIME|" + inFrame.getTcpMessage().getTransmissionTime().toString() + "|" + inFrame.adapter.getName());
inMsgQueue(model);
}
}

private EthFrame createFrame(NetworkModel model, String name) {
List<EthAdapter> adapters = model.getEthAdapterList().stream()
.filter(x -> Objects.equals(getName(), x.getName())).collect(Collectors.toList());

schedule(new TimeSpan(1, TimeUnit.MICROSECONDS));
if (adapters.size() != 1) sendTraceNote("illegal number of instance");
return new EthFrame(model, name, true, adapters.stream().findFirst().orElse(null), presentTime());
}

private void inMsgQueue(NetworkModel model) {
TCPMessage inTCPMessage = new TCPMessage(model, "IN-TCP-Message", true);
inMsgQueue.insert(inTCPMessage);
}
}
Loading