All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.tid.netManager.emulated.CompletedEmulatedNetworkLSPManager Maven / Gradle / Ivy

The newest version!
package es.tid.netManager.emulated;

import java.net.Inet4Address;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import es.tid.netManager.NetworkLSPManager;
import es.tid.netManager.NetworkLSPManagerTypes;
import es.tid.ospf.ospfv2.OSPFv2LinkStateUpdatePacket;
import es.tid.ospf.ospfv2.lsa.tlv.subtlv.MaximumReservableBandwidth;
import es.tid.ospf.ospfv2.lsa.tlv.subtlv.UnreservedBandwidth;
import es.tid.pce.client.emulator.AutomaticTesterStatistics;
import es.tid.pce.pcep.constructs.GeneralizedBandwidthSSON;
import es.tid.pce.pcep.objects.BandwidthRequestedGeneralizedBandwidth;
import es.tid.rsvp.constructs.gmpls.DWDMWavelengthLabel;
import es.tid.rsvp.objects.subobjects.EROSubobject;
import es.tid.rsvp.objects.subobjects.GeneralizedLabelEROSubobject;
import es.tid.rsvp.objects.subobjects.IPv4prefixEROSubobject;
import es.tid.rsvp.objects.subobjects.SubObjectValues;
import es.tid.rsvp.objects.subobjects.UnnumberIfIDEROSubobject;
import es.tid.tedb.IntraDomainEdge;
import es.tid.tedb.MultiLayerTEDB;
import es.tid.tedb.SimpleTEDB;
import es.tid.vntm.LSPManager;
import es.tid.vntm.LigthPathCreateIP;

/**
 * Network Emulator.
 * 
 * Clase encargada de mandar los mensajes OSPF.
 * 
 * Actualiza la topologia con las LSP que recibe, ya sea para establecer un
 * camino (setLSP) como para eliminar un camino (removeLSP).
 * 
 * @author mcs
 */
public class CompletedEmulatedNetworkLSPManager extends NetworkLSPManager{

	/**
	 * Variable usada para bloquear la lectura y escritura en la TEDB
	 */
	private ReentrantLock lock = new ReentrantLock();

	private LigthPathCreateIP LSPcreateIP;

	private LSPManager lsp_manger;

	/**
	 * Estadisticas. Usada para analizar el tiempo teorico que tardamos en
	 * configurar la red para un LSP recivido.
	 */
	private AutomaticTesterStatistics stats;
	// loggers
	private Logger log= LoggerFactory.getLogger("PCCClient");
	/**
	 * Variable usada para saber si la red es multilayer o no
	 */
	private boolean multilayer=false;
	/**
	 * Time the ROADM lasts to configure
	 */
	private long ROADMTime=10;
	/**
	 * Constructor
	 * @param sendingQueue cola donde incluimos los mensaje ospf
	 * @param file fichero de la topologia, de donde leemos la topologia
	 * @param stats estadisticas
	 * @param isMultilayer boolean indicando si la red es multilayer o no
	 */
	public CompletedEmulatedNetworkLSPManager(
			LinkedBlockingQueue sendingQueue,
			String file,AutomaticTesterStatistics stats, boolean isMultilayer) {

		this.setEmulatorType(NetworkLSPManagerTypes.COMPLETED_EMULATED_NETWORK);
		this.multilayer=isMultilayer;
		if (isMultilayer)
			this.setDomainTEDB(new MultiLayerTEDB());
		else
			this.setDomainTEDB(new SimpleTEDB());
		this.setFile(file);
		if (file !=null){
			log.info("Initializing TEDB de "+file);
			this.getDomainTEDB().initializeFromFile(file);
		}
		else {
			log.error("Network file NOT included!!!");
		}
		this.setSendingQueue(sendingQueue);
		this.stats = stats;
	}

	/**
	 * Recorre el ERO y actualiza las propiedades de TE
	 * setLSP send the LSP for multiDomain Networks.
	 * En la Erolist me viene: 
	 *  - interfaces no numeradas
	 *  - IPv4Address
	 *  -  lambdas: (Objeto DWDMWavelengthLabel)
	 *     0                   1                   2                   3
    		0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   			|Grid | C.S.  |    Identifier   |              n                |
   			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   		Idea: Compruebas que puedas reservar todo y si es asi, lo reservas y mandas OSPF
	 * @param erolist
	 */
	@Override
	public boolean setLSP_UpperLayer(LinkedList eROSubobjectList_IP, float bw_req, boolean bidirect) {
		log.info("Setting LSP IP");
		ArrayList src=new ArrayList();
		ArrayList dst=new ArrayList();
		ArrayList dwdmWavelengthLabel=null;
		ArrayList edge = new ArrayList();
		ArrayList edge_op = new ArrayList();
		ArrayList lambda = new ArrayList();
		lambda = null;
		int number_lambdas=0;
		int reserved =0;
		int reserved_op=0;
		int layer = LayerTypes.UPPER_LAYER;
		BandwidthRequestedGeneralizedBandwidth GB = null;
		long controlPlaneDelay=0;
		int j=0;
		int number_hops =(eROSubobjectList_IP.size()-1);
		boolean error = false;
		boolean inicialize=false;
		for (int i=0;i 0){
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i-number_lambdas).getDelay_ms(),i);
				}else {				
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);						
					
				}
			}
		}
		

		//Envio los OSPFs cuando llego al final, de vuelta, esperandome los retardos
		if (!(bidirect))
			reserved_op=reserved;
		if ((reserved == number_hops)&&(reserved_op == number_hops)){
			for (int i=reserved-1;i>=0;--i){
				sendMessageOSPF(src.get(i),dst.get(i), multilayer, layer, null);
				if (edge.get(i).getDelay_ms() > 0){
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i).getDelay_ms(),i);
				}else {				
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);
				}
				if (bidirect){
					sendMessageOSPF(dst.get(i),src.get(i), multilayer, layer, null);
				}
			}
		}else
		{	//Desreservar los recursos que hemos reservado
			
			lock.lock();
			try{
				for (int i=0;i 0){
							controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i).getDelay_ms(),i);
						}else {				
							controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);
						}
					}
					/*if (bw1 == 0) {
						LSPcreateIP.deleteLigthPath(edge.get(i).getSource(), edge.get(i).getTarget());
					}*/
				}
				/* Mirar si bidireccional */
				if (bidirect){
					for (int i=0;i erolist, boolean bidirect,
			BandwidthRequestedGeneralizedBandwidth GB) {
		ArrayList src=new ArrayList();
		ArrayList dst=new ArrayList();
		ArrayList dwdmWavelengthLabel = null;
		ArrayList edge = new ArrayList();
		ArrayList edge_op = new ArrayList();
		ArrayList lambda = new ArrayList();
		int reserved =0;
		int reserved_op=0;
		int number_lambdas=0;
		int layer = LayerTypes.SIMPLE_NETWORK;
		if (multilayer){
			layer = LayerTypes.UPPER_LAYER; // MPLS layer
		}
		else{
			layer = LayerTypes.SIMPLE_NETWORK; // WSON single layer
		}
		int j=0;
		//Numero de enlaces que tiene el camino, que tenemos que comprobar que estan disponibles.
		int number_hops =(erolist.size()-1)/2;
		dwdmWavelengthLabel=new ArrayList< DWDMWavelengthLabel>();
		long controlPlaneDelay=0;
		boolean inicialize=false;
		for (int i=0;i 0){
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i-number_lambdas).getDelay_ms(),i);
				}else {				
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);						
				}
			}			
		}	
		
		//Envio los OSPFs cuando llego al final, de vuelta, esperandome los retardos
		if (!(bidirect))
			reserved_op = reserved;
		if ((reserved == number_hops) && (reserved_op == number_hops)) {
			for (int i = reserved - 1; i >= 0; --i) {
				sendMessageOSPF(src.get(i), dst.get(i), multilayer, layer, null);
				if (edge.get(i).getDelay_ms() > 0){
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i).getDelay_ms(),i);
				}else {				
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);
				}
				if (bidirect) {
					sendMessageOSPF(dst.get(i), src.get(i), multilayer, layer, null);
				}
			}
		} else
		{// Desreservar los recursos que hemos reservado
			lock.lock();
			try{
				for (int i=0;i 0){
							controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i).getDelay_ms(),i);
						}else {				
							controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);							
						}
					}
				}
				/* Mirar si bidireccional */
				if (bidirect){
					for (int i=0;iERROR");
			return false;
		}
		if (stats!=null)
			stats.analyzeTheoricLSPTime((double) controlPlaneDelay);
		return true;

	}
	
	/**
	 * Recorre el ERO y actualiza las propiedades de TE setMLLSP send the LSP
	 * for multiLayer Networks. En la Erolist me viene: - interfaces no
	 * numeradas - IPv4Address - lambdas: (Objeto DWDMWavelengthLabel) con el
	 * siguiente formato 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
	 * 4 5 6 7 8 9 0 1
	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Grid |
	 * C.S. | Identifier | n |
	 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	 * 
	 * Idea: Compruebas que puedas reservar todo y si es as�, lo reservas y
	 * mandas OSPF
	 * 
	 * @param erolist
	 */
	@Override
	public boolean setMLLSP(LinkedList erolist, boolean bidirect,
			BandwidthRequestedGeneralizedBandwidth GB) {
		// log.info("Setting LSP with ERO: "+erolist.toString());
		ArrayList src=new ArrayList();
		ArrayList dst=new ArrayList();
		ArrayList dwdmWavelengthLabel = null;
		ArrayList edge = new ArrayList();
		ArrayList edge_op = new ArrayList();
		ArrayList lambda = new ArrayList();
		int reserved =0;
		int reserved_op=0;
		int number_lambdas=0;
		int layer = LayerTypes.LOWER_LAYER;
		boolean error = false;

		// Numero de enlaces que tiene el camino, que tenemos que comprobar que
		// estan disponibles.
		
		dwdmWavelengthLabel = new ArrayList();

		long controlPlaneDelay=0;
		boolean inicialize=false;
		
		LinkedList erolist_op = new LinkedList();
		erolist_op = (LinkedList)erolist.clone();
		
		
		erolist_op.removeFirst();
		erolist_op.removeLast();
		erolist_op.removeLast();
		int number_hops = (erolist_op.size() - 1) / 2;
		
		int j=0;
		for (int i=0;i 0){
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane((long) edge.get(i-number_lambdas).getDelay_ms(),i);
				}else {				
					controlPlaneDelay=controlPlaneDelay+sleepControlPlane(ROADMTime,i);						
					
				}
			}			

		}
		
		// Envio los OSPFs cuando llego al final, de vuelta, esperandome los
		// retardos
		if (((reserved) == number_hops) && ((reserved_op) == number_hops)){
			for (int i = reserved-1; i >= 0; --i) {
				sendMessageOSPF(src.get(i), dst.get(i), multilayer, layer, dwdmWavelengthLabel.get(i));
				if (bidirect) {
					sendMessageOSPF(dst.get(i), src.get(i), multilayer, layer, dwdmWavelengthLabel.get(i));
				}
			}
		}
		else {// Desreservar los recursos que hemos reservado
			lock.lock();
			try {
				for (int i = 0; i < reserved; ++i) {
					if (dwdmWavelengthLabel != null) {// hay lambda
						edge.get(i).getTE_info().setWavelengthFree(lambda.get(i));
					}
				}
				/* Mirar si bidireccional */
				if (bidirect) {
					for (int i = 0; i < reserved_op; ++i) {
						if (dwdmWavelengthLabel != null) {// hay lambda
							edge_op.get(i).getTE_info().setWavelengthFree(lambda.get(i));
						}
					}
				}
			} finally {
				lock.unlock();
			}
			log.info("Not reserved. OSPF is not sent");
			// logPrueba.info("Setting LSP with ERO: "+erolist.toString()+"\t>ERROR");
			return false;
		}
		
		if (stats!=null)
			stats.analyzeTheoricLSPTime((double) controlPlaneDelay);
		return true;

	}
	/**
		Delete LSP WSON normal
	 */
	
	@Override
	public  void removeLSP(LinkedList erolist, boolean bidirect, BandwidthRequestedGeneralizedBandwidth GB) {
		//log.info("Removing LSP with ERO: "+erolist.toString());
		boolean isLambdaLoop=false;
		int layer;
		for (int i=0;i erolist, boolean bidirect,
			BandwidthRequestedGeneralizedBandwidth GB, float bw_delete) {
		// log.info("Removing LSP with ERO: "+erolist.toString());
		boolean isLambdaLoop = false;
		int layer;
		for (int i=0;i erolist, boolean bidirect,
			BandwidthRequestedGeneralizedBandwidth GB) {
		// log.info("Removing ML LSP with ERO: "+erolist.toString());
		int layer;
		boolean flag = false;
		for (int i=1;i erolist,int i, 
			ArrayList src, ArrayList dst,
			ArrayList dwdmWavelengthLabel,	int number_lambdas, int layer) {

		if (layer == LayerTypes.UPPER_LAYER) {
			if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				src.add(i,((IPv4prefixEROSubobject)erolist.get(i)).getIpv4address());
			}else if (erolist.get(i).getType()==SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				src.add(i,((UnnumberIfIDEROSubobject)erolist.get(i)).getRouterID());
			}

			if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				dst.add(i, ((IPv4prefixEROSubobject) erolist.get(i + 1)).getIpv4address());

			}else if (erolist.get(i+1).getType()==SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				dst.add(i,((UnnumberIfIDEROSubobject)erolist.get(i+1)).getRouterID());
			}
			return true;
		}

		else if (layer == LayerTypes.SIMPLE_NETWORK) {

			if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_LABEL) {
				return false;
			}
			if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				src.add(i-number_lambdas, ((IPv4prefixEROSubobject)erolist.get(i)).getIpv4address());
			} else if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				src.add(i - number_lambdas, ((UnnumberIfIDEROSubobject)erolist.get(i)).getRouterID());
			}
			if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				dst.add(i - number_lambdas, ((IPv4prefixEROSubobject)erolist.get(i + 1)).getIpv4address());
			} else if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				dst.add(i - number_lambdas, ((UnnumberIfIDEROSubobject)erolist.get(i + 1)).getRouterID());
			} else if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_LABEL) {
				if (dwdmWavelengthLabel == null) {
					dwdmWavelengthLabel = new ArrayList();
					dwdmWavelengthLabel.add(number_lambdas, ((GeneralizedLabelEROSubobject) erolist.get(i + 1)).getDwdmWavelengthLabel());
				} else {
					dwdmWavelengthLabel.add(number_lambdas, ((GeneralizedLabelEROSubobject) erolist.get(i + 1)).getDwdmWavelengthLabel());
				}
				if (erolist.get(i + 2).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
					dst.add(i - number_lambdas, ((IPv4prefixEROSubobject) erolist.get(i + 2)).getIpv4address());
				} else if (erolist.get(i + 2).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
					dst.add(i - number_lambdas, ((UnnumberIfIDEROSubobject) erolist.get(i + 2)).getRouterID());
				}
			}return true;
		} else if (layer == LayerTypes.LOWER_LAYER) {
			if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_LABEL) {
				return false;
			}
			if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				src.add(i - number_lambdas, ((IPv4prefixEROSubobject)erolist.get(i)).getIpv4address());
			} else if (erolist.get(i).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				src.add(i - number_lambdas, ((UnnumberIfIDEROSubobject)erolist.get(i)).getRouterID());
			}
			if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
				dst.add(i - number_lambdas, ((IPv4prefixEROSubobject)erolist.get(i + 1)).getIpv4address());
			} else if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
				dst.add(i - number_lambdas, ((UnnumberIfIDEROSubobject)erolist.get(i + 1)).getRouterID());
			} else if (erolist.get(i + 1).getType() == SubObjectValues.ERO_SUBOBJECT_LABEL) {
				if (dwdmWavelengthLabel == null) {
					dwdmWavelengthLabel = new ArrayList();
					dwdmWavelengthLabel.add(number_lambdas, ((GeneralizedLabelEROSubobject)erolist.get(i + 1)).getDwdmWavelengthLabel());
				} else {
					dwdmWavelengthLabel.add(number_lambdas, ((GeneralizedLabelEROSubobject)erolist.get(i + 1)).getDwdmWavelengthLabel());
				}
				if (erolist.get(i + 2).getType() == SubObjectValues.ERO_SUBOBJECT_IPV4PREFIX) {
					dst.add(i - number_lambdas, ((IPv4prefixEROSubobject) erolist.get(i + 2)).getIpv4address());
				} else if (erolist.get(i + 2).getType() == SubObjectValues.ERO_SUBOBJECT_UNNUMBERED_IF_ID) {
					dst.add(i - number_lambdas, ((UnnumberIfIDEROSubobject) erolist.get(i + 2)).getRouterID());
				}
			}return true;
		}return false;
	}
	/**
	 * 
	 * @param edge
	 * @param dwdmWavelengthLabel
	 * @param src
	 * @param dst
	 * @param lambda
	 * @param i
	 * @param multilayer
	 * @return
	 */
	private boolean updateEdge(ArrayList edge, ArrayList dwdmWavelengthLabel,
			ArrayList src, ArrayList dst, ArrayList lambda, int i, boolean multilayer,
			BandwidthRequestedGeneralizedBandwidth GB, int layer, int k, float bw_req) {

		IntraDomainEdge edge1=null;
		int flag;
		

		if (multilayer) {
			if (layer == LayerTypes.LOWER_LAYER){
				edge1=((MultiLayerTEDB) this.getDomainTEDB()).getLowerLayerGraph().getEdge(src.get(i), dst.get(i));
			}else if (layer == LayerTypes.UPPER_LAYER) {
				edge1=((MultiLayerTEDB) this.getDomainTEDB()).getUpperLayerGraph().getEdge(src.get(i), dst.get(i));
			}
			flag = 1;
		}
		else {
			edge1 =((SimpleTEDB)this.getDomainTEDB()).getNetworkGraph().getEdge(src.get(i), dst.get(i));
			flag = 0;
		}
		
		if (edge1 != null) {
			edge.add(k, edge1);
			
			
			if (layer == LayerTypes.UPPER_LAYER) {
				float bw = edge.get(k).getTE_info().getUnreservedBandwidth().getUnreservedBandwidth()[0];
				float[] bw_un = new float[8];
				if (bw >= bw_req) {
					bw = bw - bw_req;
					bw_un[0]=bw;
					MaximumReservableBandwidth maximumReservableBandwidth = new MaximumReservableBandwidth();
					UnreservedBandwidth unreservedBandwidth = new UnreservedBandwidth();
										
					maximumReservableBandwidth.setMaximumReservableBandwidth(bw);
					unreservedBandwidth.setUnreservedBandwidth(bw_un);
					
					edge.get(k).getTE_info().setMaximumReservableBandwidth(maximumReservableBandwidth);
					edge.get(k).getTE_info().setUnreservedBandwidth(unreservedBandwidth);
					
					return true;
				}else{
					log.info("No hay suficiente Bandwidth en el edge");
					return false;
				}
			}
			if (dwdmWavelengthLabel != null){
				int min = 0;
				if (flag == 1){
					min = ((MultiLayerTEDB)this.getDomainTEDB()).getWSONinfo().getnMin();
				}else if (flag == 0) {
					min = ((SimpleTEDB) this.getDomainTEDB()).getWSONinfo().getnMin();
				}if (dwdmWavelengthLabel.size()!=0){
					if (GB != null){
						int m=((GeneralizedBandwidthSSON)GB.getGeneralizedBandwidth()).getM();
						for (int j=((dwdmWavelengthLabel.get(i).getN() - min)) - m; j < ((dwdmWavelengthLabel.get(i).getN() - min)) + m; j++) {
							lambda.add(i,j);
							if (edge.get(i).getTE_info().isWavelengthFree(lambda.get(i))) {
								//log.info("It's possible to reserve that lambda.");
								//edge.get(i).setWavelengthUnReserved(TE_info.getUnreservedBandwidth().getUnreservedBandwidth())[0]-10));

								//Actualizo los recursos
								edge.get(i).getTE_info().setWavelengthOccupied(lambda.get(i));
								if (j==((dwdmWavelengthLabel.get(i).getN() - min)) + m - 1) {
									return true;
								}
							}
						}
					}else{
						if (dwdmWavelengthLabel != null){
							if (dwdmWavelengthLabel.size()!=0){
								lambda.add(k,dwdmWavelengthLabel.get(k).getN() - min);
								/*Hay un ancho de banda a reservar */
								if (edge.get(k).getTE_info().isWavelengthFree(lambda.get(k))) {
									//Actualizo los recursos
									edge.get(k).getTE_info().setWavelengthOccupied(lambda.get(k));
									return true;
								}
							}
						}
					}
					log.info("ROBO DE LAMBDA en edge --> "+edge1.toString());
					return false;
				}return true;
			}return true;
		}else {
			log.info("EDGE ("+ src.get(i).toString() + "-" + dst.get(i).toString() + ") NULLLLLL");
			return false;
		}
	}
	private long sleepControlPlane(long num, int iteration){
		long controlPlaneDelay = 0;
		try {
			if (iteration == 0){
				Thread.sleep(num);
				controlPlaneDelay = num;
			}
			else {
				Thread.sleep(num+1);
				controlPlaneDelay = num+1;
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return controlPlaneDelay;
	}
	public AutomaticTesterStatistics getStats() {
		return stats;
	}

	public void setStats(AutomaticTesterStatistics stats) {
		this.stats = stats;
	}
	
	public long getROADMTime() {
		return ROADMTime;
	}
	public void setROADMTime(long rOADMTime) {
		ROADMTime = rOADMTime;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy