/*******************************************************************************
* gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/
* Copyright (C) 2014 SVS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package staticContent.evaluation.simulator.core.networkComponent;
import staticContent.evaluation.simulator.Simulator;
import staticContent.evaluation.simulator.core.event.DistantProxyEvent;
import staticContent.evaluation.simulator.core.event.Event;
import staticContent.evaluation.simulator.core.event.EventExecutor;
import staticContent.evaluation.simulator.core.message.*;
import staticContent.evaluation.simulator.core.statistics.Statistics;
import userGeneratedContent.simulatorPlugIns.pluginRegistry.StatisticsType;
public class NetworkConnection implements EventExecutor, Identifiable {
private int numericIdentifier;
private NetworkNode source;
private NetworkNode destination;
private Simulator simulator;
protected Statistics statistics;
public NetworkConnection(NetworkNode source, NetworkNode destination, Simulator simulator) {
this.source = source;
this.destination = destination;
this.simulator = simulator;
this.statistics = new Statistics(this);
this.numericIdentifier = IdGenerator.getId();
// register connected network nodes at each other
source.setConnectionToNextHop(this);
destination.setConnectionToPreviousHop(this);
}
@Override
public void executeEvent(Event event) {
if (event.getAttachment() == null) {
throw new RuntimeException("ERROR: NetworkConnection received wrong Event");
} else {
NetworkMessage networkMessage = (NetworkMessage)event.getAttachment();
NetworkNode source = networkMessage.isRequest() ? this.source : this.destination;
NetworkNode destination = networkMessage.isRequest() ? this.destination : this.source;
if (networkMessage.hasPassedSecondDelayBox()) {
event.setTarget(destination);
networkMessage.setHasPassedFirstDelayBox(false);
networkMessage.setHasPassedSecondDelayBox(false);
networkNodeHasReceivedMessage(networkMessage, destination);
} else if (networkMessage.hasPassedFirstDelayBox()) {
event.setExecutionTime(Simulator.getNow() + destination.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedSecondDelayBox(true);
networkNodeHasSentMessage(networkMessage, source);
} else {
event.setExecutionTime(Simulator.getNow() + source.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedFirstDelayBox(true);
}
/*
if (networkMessage.isRequest()) {
if (networkMessage.hasPassedSecondDelayBox()) {
event.setTarget(destination);
networkMessage.setHasPassedFirstDelayBox(false);
networkMessage.setHasPassedSecondDelayBox(false);
networkNodeHasReceivedMessage(networkMessage, destination);
} else if (networkMessage.hasPassedFirstDelayBox()) {
event.setExecutionTime(Simulator.getNow() + destination.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedSecondDelayBox(true);
networkNodeHasSentMessage(networkMessage, source);
} else {
event.setExecutionTime(Simulator.getNow() + source.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedFirstDelayBox(true);
}
if (!networkMessage.hasPassedFirstDelayBox() && !networkMessage.isDelivered()) {
// TODO: hier übertragenes datenvolumen speichern für senderichtung bei sender
//recordStatisticsMessageSent(networkMessage, source);
event.setExecutionTime(Simulator.getNow() + source.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedFirstDelayBox(true);
} else if (!networkMessage.hasPassedSecondDelayBox()) {
// TODO: hier übertragenes datenvolumen speichern für senderichtung bei empfänger
event.setExecutionTime(Simulator.getNow() + destination.getDelayBox().getSendDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedFirstDelayBox(false); // TODO: noch nicht getestet!
networkMessage.setHasPassedSecondDelayBox(true);
} else { // isDelivered() == true
event.setTarget(destination);
networkMessage.setHasPassedSecondDelayBox(false);
//recordStatisticsMessageReceived(networkMessage, source);
}
} else {
if (!networkMessage.hasPassedFirstDelayBox()) {
// TODO: hier übertragenes datenvolumen speichern für empfangsrichtung bei sender
event.setExecutionTime(Simulator.getNow() + destination.getDelayBox().getReceiveDelay(networkMessage.getLength()));
event.setTarget(this);
networkMessage.setHasPassedFirstDelayBox(true);
} else {
// TODO: hier übertragenes datenvolumen speichern für empfangsrichtung bei empfänger
event.setExecutionTime(Simulator.getNow() + source.getDelayBox().getReceiveDelay(networkMessage.getLength()));
event.setTarget(source);
networkMessage.setHasPassedFirstDelayBox(false); // TODO: noch nicht getestet!
}
}
*/
if (event.getAttachment() instanceof TransportMessage && !((TransportMessage)event.getAttachment()).isRequest() && event.getEventType() == DistantProxyEvent.INCOMING_REQUEST && event.getTarget() instanceof Mix) {
System.out.println(event + " -- " +event.getAttachment());
System.out.println(event.getTarget());
System.out.println(source);
System.out.println(destination);
}
simulator.scheduleEvent(event, this);
}
}
private void networkNodeHasSentMessage(NetworkMessage messageSent, NetworkNode sender) {
if (sender instanceof AbstractClient) {
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_SEND);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_SENDANDRECEIVE);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_PER_SECOND_SEND);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_PER_SECOND_SENDANDRECEIVE);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.AVG_TRAFFICSOURCE_SENDING_RATE_PER_CLIENT_IN_BYTE);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.AVG_TRAFFICSOURCE_SENDING_RATE_PER_CLIENT_IN_BYTE_SEND);
if (messageSent instanceof MixMessage) {
sender.getStatistics().increment(((MixMessage)messageSent).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_SEND);
sender.getStatistics().increment(((MixMessage)messageSent).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_SENDANDRECEIVE);
sender.getStatistics().increment(((MixMessage)messageSent).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_PER_SECOND_AND_CLIENT_SEND);
sender.getStatistics().increment(((MixMessage)messageSent).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_PER_SECOND_AND_CLIENT_SENDANDRECEIVE);
sender.getStatistics().addValue(((MixMessage)messageSent).getPayloadPercentage(), StatisticsType.AVG_CLIENT_PAYLOADPERCENTAGE_SEND);
sender.getStatistics().addValue(((MixMessage)messageSent).getPayloadPercentage(), StatisticsType.AVG_CLIENT_PAYLOADPERCENTAGE_SENDANDRECEIVE);
sender.getStatistics().addValue(((MixMessage)messageSent).getPaddingPercentage(), StatisticsType.AVG_CLIENT_PADDINGPERCENTAGE_SEND);
sender.getStatistics().addValue(((MixMessage)messageSent).getPaddingPercentage(), StatisticsType.AVG_CLIENT_PADDINGPERCENTAGE_SENDANDRECEIVE);
sender.getStatistics().increment(((MixMessage)messageSent).getNumberOfMessagesContained(), StatisticsType.SUM_CLIENT_LAYER5MESSAGES_SENT);
sender.getStatistics().increment(((MixMessage)messageSent).getNumberOfMessagesContained(), StatisticsType.SUM_CLIENT_LAYER5MESSAGES_SENTANDRECEIVED);
sender.getStatistics().increment(1, StatisticsType.SUM_CLIENT_MIXMESSAGES_SENT);
sender.getStatistics().increment(1, StatisticsType.SUM_CLIENT_MIXMESSAGES_SENTANDRECEIVED);
} else if (messageSent instanceof TransportMessage) {
sender.getStatistics().increment(1, StatisticsType.SUM_CLIENT_LAYER5MESSAGES_SENT);
sender.getStatistics().increment(1, StatisticsType.SUM_CLIENT_LAYER5MESSAGES_SENTANDRECEIVED);
}
} else if (sender instanceof Mix) {
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_DATAVOLUME_PER_MIX_SEND);
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_DATAVOLUME_PER_MIX_SENDANDRECEIVE);
} else if (sender instanceof DistantProxy) {
sender.getStatistics().increment(messageSent.getLength(), StatisticsType.SUM_DISTANTPROXY_DATAVOLUME_SENDANDRECEIVE);
}
}
private void networkNodeHasReceivedMessage(NetworkMessage messageReceived, NetworkNode receiver) {
if (receiver instanceof AbstractClient) {
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_RECEIVE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_SENDANDRECEIVE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_PER_SECOND_RECEIVE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_CLIENT_DATAVOLUME_PER_SECOND_SENDANDRECEIVE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.AVG_TRAFFICSOURCE_SENDING_RATE_PER_CLIENT_IN_BYTE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.AVG_TRAFFICSOURCE_SENDING_RATE_PER_CLIENT_IN_BYTE_RECEIVE);
if (messageReceived instanceof MixMessage) {
receiver.getStatistics().increment(((MixMessage)messageReceived).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_RECEIVE);
receiver.getStatistics().increment(((MixMessage)messageReceived).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_SENDANDRECEIVE);
receiver.getStatistics().increment(((MixMessage)messageReceived).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_PER_SECOND_AND_CLIENT_RECEIVE);
receiver.getStatistics().increment(((MixMessage)messageReceived).getPayloadLength(), StatisticsType.SUM_CLIENT_PAYLOADVOLUME_PER_SECOND_AND_CLIENT_SENDANDRECEIVE);
receiver.getStatistics().addValue(((MixMessage)messageReceived).getPayloadPercentage(), StatisticsType.AVG_CLIENT_PAYLOADPERCENTAGE_RECEIVE);
receiver.getStatistics().addValue(((MixMessage)messageReceived).getPayloadPercentage(), StatisticsType.AVG_CLIENT_PAYLOADPERCENTAGE_SENDANDRECEIVE);
receiver.getStatistics().addValue(((MixMessage)messageReceived).getPaddingPercentage(), StatisticsType.AVG_CLIENT_PADDINGPERCENTAGE_RECEIVE);
receiver.getStatistics().addValue(((MixMessage)messageReceived).getPaddingPercentage(), StatisticsType.AVG_CLIENT_PADDINGPERCENTAGE_SENDANDRECEIVE);
receiver.getStatistics().increment(((MixMessage)messageReceived).getNumberOfMessagesContained(), StatisticsType.SUM_CLIENT_LAYER5MESSAGES_RECEIVED);
receiver.getStatistics().increment(((MixMessage)messageReceived).getNumberOfMessagesContained(), StatisticsType.SUM_CLIENT_LAYER5MESSAGES_SENTANDRECEIVED);
receiver.getStatistics().increment(1, StatisticsType.SUM_CLIENT_MIXMESSAGES_RECEIVED);
receiver.getStatistics().increment(1, StatisticsType.SUM_CLIENT_MIXMESSAGES_SENTANDRECEIVED);
} else if (messageReceived instanceof TransportMessage) {
receiver.getStatistics().increment(1, StatisticsType.SUM_CLIENT_LAYER5MESSAGES_RECEIVED);
}
} else if (receiver instanceof Mix) {
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_DATAVOLUME_PER_MIX_RECEIVE);
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_DATAVOLUME_PER_MIX_SENDANDRECEIVE);
if (((Mix)receiver).isFirstMix()) { // notify client about arrival
}
} else if (receiver instanceof DistantProxy) {
receiver.getStatistics().increment(messageReceived.getLength(), StatisticsType.SUM_DISTANTPROXY_DATAVOLUME_SENDANDRECEIVE);
}
}
/**
* @return the source
*/
public NetworkNode getSource() {
return source;
}
/**
* @param source the source to set
*/
public void setSource(NetworkNode source) {
this.source = source;
}
/**
* @return the destination
*/
public NetworkNode getDestination() {
return destination;
}
/**
* @param destination the destination to set
*/
public void setDestination(NetworkNode destination) {
this.destination = destination;
}
/**
* @return the simulator
*/
public Simulator getSimulator() {
return simulator;
}
/**
* @param simulator the simulator to set
*/
public void setSimulator(Simulator simulator) {
this.simulator = simulator;
}
@Override
public int getGlobalId() {
return numericIdentifier;
}
}