From: <bro...@us...> - 2008-02-19 02:30:39
|
Revision: 109 http://gridsim.svn.sourceforge.net/gridsim/?rev=109&view=rev Author: brobergj Date: 2008-02-18 18:30:40 -0800 (Mon, 18 Feb 2008) Log Message: ----------- *Re-coded to support FlowBuffer instead of FlowInput/FlowOutput *Added registerFlow() and deregisterFlow() functionality *Update flow duration code needs to be fixed still Removed Paths: ------------- branches/gridsim4.0-branch2/source/gridsim/net/flow/FlowLink.java Deleted: branches/gridsim4.0-branch2/source/gridsim/net/flow/FlowLink.java =================================================================== --- branches/gridsim4.0-branch2/source/gridsim/net/flow/FlowLink.java 2008-02-19 00:34:06 UTC (rev 108) +++ branches/gridsim4.0-branch2/source/gridsim/net/flow/FlowLink.java 2008-02-19 02:30:40 UTC (rev 109) @@ -1,379 +0,0 @@ -/* - * ** Network and Service Differentiation Extensions to GridSim 4.0 ** - * - * James Broberg - * - * August 2007 - * - * Licence: GPL - http://www.gnu.org/copyleft/gpl.html - * - * FlowLink.java - Simulates a network link - * - */ - -package gridsim.net.flow; - -import eduni.simjava.*; -import gridsim.*; -import gridsim.net.Link; -import gridsim.net.Packet; - -import java.util.*; - - -/** - * This class enables flow level networking over a shared link. It is based - * on SimpleLink.java by Gokul Poduval & Chen-Khong Tham - * - * @invariant $none - * @since GridSim Toolkit 4.0 - * @author James Broberg, The University of Melbourne - */ -public class FlowLink extends Link -{ - private Vector q_; - private double lastUpdateTime_; // a timer to denote the last update time - private int inEnd1_; - private int outEnd1_; - private int inEnd2_; - private int outEnd2_; - - - /** - * Constructs a Link which simulates a physical link between two entities. - * - * @param name Name of this Link - * @param baudRate baud rate of this link (bits/s) - * @param propDelay Propogation delay of the Link in milli seconds - * @param MTU Maximum Transmission Unit of the Link in bytes. - * Packets which are larger than the MTU should be split - * up into MTU size units. <br> - * For e.g. a 1024 byte packet trying to cross a 576 byte - * MTU link should get split into 2 packets of 576 bytes - * and 448 bytes. - * @throws NullPointerException This happens when name is empty or null - * @throws ParameterException This happens for the following conditions: - * <ul> - * <li> name is null - * <li> baudRate <= 0 - * <li> propDelay <= 0 - * <li> MTU <= 0 - * </ul> - * - * @pre name != null - * @pre baudRate > 0 - * @pre propDelay > 0 - * @pre MTU > 0 - * @post $none - */ - public FlowLink(String name, double baudRate, double propDelay, int MTU) - throws ParameterException, NullPointerException - { - super(name, baudRate, propDelay, MTU); - init(); - } - - /** - * Constructs a link with some default parameters. It simulates a link with - * a default value of baud rate, propagation delay and MTU. - * - * @param name Name of this Link - * @throws NullPointerException This happens when name is empty or null - * @throws ParameterException This happens when the given name is empty - * @see gridsim.net.Link#DEFAULT_BAUD_RATE - * @see gridsim.net.Link#DEFAULT_PROP_DELAY - * @see gridsim.net.Link#DEFAULT_MTU - * @pre name != null - * @post $none - */ - public FlowLink(String name) throws ParameterException, - NullPointerException - { - super(name, Link.DEFAULT_BAUD_RATE, Link.DEFAULT_PROP_DELAY, - Link.DEFAULT_MTU); - - init(); - } - - /** - * Initialises all attributes - * @pre $none - * @post $none - */ - private void init() - { - lastUpdateTime_ = 0.0; - q_ = new Vector(); - inEnd1_ = -1; - outEnd1_ = -1; - inEnd2_ = -1; - outEnd2_ = -1; - } - - /** - * Connects one entity to another via this link - * @param end1 an entity - * @param end2 an entity - * @pre end1 != null - * @pre end2 != null - * @post $none - */ - public void attach(Sim_entity end1, Sim_entity end2) - { - if (end1 == null || end2 == null) - { - System.out.println(super.get_name() + ".attach(): Warning - " + - "one or both entities are null."); - return; - } - - inEnd1_ = GridSim.getEntityId( "Input_" + end1.get_name() ); - outEnd1_ = GridSim.getEntityId( "Output_" + end1.get_name() ); - - // if end1 is a router/gateway with no Input and Output port - if (inEnd1_ == -1 || outEnd1_ == -1) - { - inEnd1_ = end1.get_id(); - outEnd1_ = end1.get_id(); - } - - inEnd2_ = GridSim.getEntityId( "Input_" + end2.get_name() ); - outEnd2_ = GridSim.getEntityId( "Output_" + end2.get_name() ); - - // if end1 is a router/gateway with no Input and Output port - if (inEnd2_ == -1 || outEnd2_ == -1) - { - inEnd2_ = end2.get_id(); - outEnd2_ = end2.get_id(); - } - } - - /** - * Connects one entity to another via this link - * @param end1 an Entity name - * @param end2 an Entity name - * @pre end1 != null - * @pre end2 != null - * @post $none - */ - public void attach(String end1, String end2) - { - if (end1 == null || end2 == null) - { - System.out.println(super.get_name() + ".attach(): Warning - " + - "can not connect since one or both entities are null."); - return; - } - - if (end1.length() == 0 || end2.length() == 0) - { - System.out.println(super.get_name() + ".attach(): Warning - " + - "can not connect since one or both entities are null."); - return; - } - - inEnd1_ = GridSim.getEntityId("Input_" + end1); - outEnd1_ = GridSim.getEntityId("Output_" + end1); - - // if end1 is a router/gateway with no Input and Output port - if (inEnd1_ == -1 || outEnd1_ == -1) - { - inEnd1_ = GridSim.getEntityId(end1); - outEnd1_ = inEnd1_; - } - - inEnd2_ = GridSim.getEntityId("Input_" + end2); - outEnd2_ = GridSim.getEntityId("Output_" + end2); - - // if end1 is a router/gateway with no Input and Output port - if (inEnd2_ == -1 || outEnd2_ == -1) - { - inEnd2_ = GridSim.getEntityId(end1); - outEnd2_ = inEnd2_; - } - } - - /** - * Handles external events that are coming to this link. - * @pre $none - * @post $none - */ - public void body() - { - // register oneself to the system GIS - super.sim_schedule(GridSim.getGridInfoServiceEntityId(), - GridSimTags.SCHEDULE_NOW, GridSimTags.REGISTER_LINK, - new Integer(super.get_id()) ); - - Sim_event ev = new Sim_event(); - while ( Sim_system.running() ) - { - super.sim_get_next(ev); - - // if the simulation finishes then exit the loop - if (ev.get_tag() == GridSimTags.END_OF_SIMULATION) { - break; - } - - // process the received event - processEvent(ev); - sim_completed(ev); - } - - while(sim_waiting() > 0) - { - // wait for event and ignore - System.out.println(super.get_name() + ".body(): Ignore !!"); - sim_get_next(ev); - } - } - - /** - * Processes incoming events - * @param ev a Sim_event object - * @pre ev != null - * @post $none - */ - private void processEvent(Sim_event ev) - { - switch ( ev.get_tag() ) - { - case GridSimTags.PKT_FORWARD: // for normal packets - case GridSimTags.JUNK_PKT: // for background traffic - enque(ev); - break; - - case GridSimTags.INSIGNIFICANT: - processInternalEvent(); - break; - - default: - System.out.println(super.get_name() + ".body(): Warning - " + - "unable to handle request from GridSimTags " + - "with constant number " + ev.get_tag()); - break; - } - } - - /** - * Sends an internal event to itself for a certain time period - * @param time the delay time - * @pre time >= 0 - * @post $none - */ - private synchronized boolean sendInternalEvent(double time) - { - if (time < 0.0) { - return false; - } - - super.sim_schedule(super.get_id(), time, GridSimTags.INSIGNIFICANT); - return true; - } - - /** - * Processes internal events - * @pre $none - * @post $none - */ - private synchronized void processInternalEvent() - { - // this is a constraint that prevents an infinite loop - // Compare between 2 floating point numbers. This might be incorrect - // for some hardware platform. - if ( lastUpdateTime_ == GridSim.clock() ) { - return; - } - - lastUpdateTime_ = GridSim.clock(); - - if (q_.size() == 0) { - return; - } - else if (q_.size() == 1) { - deque( (Packet) q_.remove(0) ); - } - else - { - deque( (Packet)q_.remove(0) ); - sendInternalEvent(super.delay_ / super.MILLI_SEC); // delay in ms - } - } - - /** - * Puts an event into a queue and sends an internal event to itself - * @param ev a Sim_event object - * @pre ev != null - * @post $none - */ - private synchronized void enque(Sim_event ev) - { - q_.add( ev.get_data() ); - if (q_.size() == 1) { - sendInternalEvent(super.delay_ / super.MILLI_SEC); // delay in ms - } - } - - /** - * Sends a packet to the next destination - * @param np a packet - * @pre np != null - * @post $none - */ - private synchronized void deque(Packet np) - { - int dest = getNextHop(np); - if (dest == -1) { - return; - } - - // other side is a Sim_entity - int tag = 0; - if (dest == outEnd2_ || dest == outEnd1_) - { - // for junk packets only - if (np.getTag() == GridSimTags.JUNK_PKT) { - tag = GridSimTags.JUNK_PKT; - } - // for other packets - else { - tag = GridSimTags.PKT_FORWARD; - } - } - // other side is a GridSim entity - else { - tag = np.getTag(); - } - - // sends the packet - super.sim_schedule(dest, GridSimTags.SCHEDULE_NOW, tag, np); - } - - /** - * Determines which end to send the event to - * since sending entities are of the form Output_entityName. - * We need to check whether the source name ends with either end1 or end2 - * the other end is the destination - * @param np a packet - * @pre np != null - * @post $none - */ - private synchronized int getNextHop(Packet np) - { - int dest = -1; - int src = np.getLast(); - - // check if source is from outEnd1_ - if (src == outEnd1_) { - dest = inEnd2_; - } - // or source is from outEnd2_ - else if (src == outEnd2_) { - dest = inEnd1_; - } - - return dest; - } - -} // end class - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |