package Simulator; import java.io.*; /** * Models links in the simulator. */ public class Link extends NetComponents { // Fields private int number; // link number double Distance; double LocalTime; // need to be reset to zero in Cprobing Statistic private double propagationTime; private NetworkConfigure simulator; // the following variables are used only for bandwidth measurement // These variables are meaningful only for the bottleneck link double Tstarting_time = 0.0; // traffic measurement starting time //double end_time; // traffic measurement end time long Transfered_bit = 0; // the transfered bits in a traffic measure cycle //int DelayTransfered_bit = 0; // the bits delay to transfer at the next time cycle boolean BottleneckLink; // whether the link is the bottleneck link double LinkBandwidth; PrintWriter OFILE; // only for the bottleneck link log purpose. // Constructor public Link(NetworkConfigure simulator, double distance, int number, double LinkBandwidth) { String k = simulator.getClass().getName(); this.simulator = simulator; this.BottleneckLink = false; this.propagationTime = distance / simulator.signalPropagationSpeed; this.number = number; this.LocalTime = 0.0; this.LinkBandwidth = LinkBandwidth; this.Distance = distance; //this.end_time = Tstarting_time + simulator.TBIntervalTime; try { this.OFILE = new PrintWriter(new FileWriter("LFile"+number+".txt")); } catch (IOException e) { } } // Commands public boolean EventHandler (Message Mess) { int index=0; double ATime = Mess.getArrivalTime(); if (Mess.MessageType.compareTo("ICMP-request") == 0) index = Mess.NextObjectIndex; else index = 2*(simulator.RoadTable[Mess.RouterTableNum].numOfNode-1)-Mess.NextObjectIndex; //"ICMP-response" if (BottleneckLink && (Mess.getArrivalTime()>7.752) && (Mess.getArrivalTime()<7.758)) ATime = Mess.getArrivalTime(); if (LocalTime > Mess.getArrivalTime()) { if ((Mess.MessageType.compareTo("ICMP-request") == 0) || (Mess.MessageType.compareTo("ICMP-response") == 0)) Mess.QueuingTime[index] = LocalTime - Mess.getArrivalTime(); } else { LocalTime = Mess.getArrivalTime(); if ((Mess.MessageType.compareTo("ICMP-request") == 0) || (Mess.MessageType.compareTo("ICMP-response") == 0)) Mess.QueuingTime[index] = 0.0; } //double begin_handleTime = LocalTime; // what is the real time to handle the message double transmissionTime = Mess.getSize()/LinkBandwidth; LocalTime += transmissionTime; Mess.setTime(LocalTime+propagationTime); Mess.setNextNode(simulator.RoadTable[Mess.RouterTableNum].numOfNode); if (BottleneckLink && simulator.NeedTraffic) { //if (LocalTime <= end_time) Transfered_bit += Mess.getSize(); //else { // one message is handled across the traffic measurement time boundary // Transfered_bit += (long)(((end_time - begin_handleTime)/(LocalTime - begin_handleTime))*Mess.getSize())+DelayTransfered_bit; // DelayTransfered_bit = (int)(((LocalTime - end_time)/(LocalTime - begin_handleTime))*Mess.getSize()); //} } // Link always return false because a link is unlikely to be the // last object in a road table. A road always starts and ends by a router OFILE.println(Mess.MessNum + " : "+ATime+" | "+LocalTime+" | "+Mess.MessageType+" | "+Mess.getSize()); return false; } public void reset_bottlelink (double init_time) { this.Tstarting_time = init_time; //this.end_time = init_time + simulator.TBIntervalTime; //this.Transfered_bit = DelayTransfered_bit; // a new measure cycle //this.DelayTransfered_bit = 0; this.Transfered_bit = 0; } public double getLocalTime() { return LocalTime; } }