/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius 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 2 of the License, or ** (at your option) version 3. ** ** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.hardware; import java.io.Serializable; import java.util.LinkedList; import java.util.Observable; import filius.Main; import filius.software.netzzugangsschicht.EthernetFrame; import filius.exception.VerbindungsException; import filius.rahmenprogramm.I18n; import filius.rahmenprogramm.Information; /** * @author carsten * */ public abstract class Verbindung extends Hardware implements Serializable, I18n { //! Verzoegerung in Millisekunden private static int verzoegerung = 30; /** maximale Anzahl von Hops zum Datenaustausch. Diese * Zahl wird verwendet, um eine Round-Trip-Time (RTT) zu * berechnen. Da es auch möglich ist, Datenaustausch mit einem * einem virtuellen Rechnernetz ueber eine 'Modemverbindung' * zu erstellen, wird diese Zahl hoch angesetzt. <br /> * Mit dieser Zahl sind die HOPS fuer einen Round-Trip * als fuer die Hin- und Zurueck-Uebertragung beim Datenaustausch * mit einem anderen Knoten gemeint. */ private static final int MAX_HOPS = 50; //! Minimale RTT private static final int RTTMIN = 500; // extend RTT in case of slow machines by this factor; 1: no change private static int extendRTTfactor = 1; private Port[] anschluesse = null; private SimplexVerbindung simplexEins, simplexZwei; public void setAnschluesse(Port[] anschluesse) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (Verbindung), setAnschluesse("+anschluesse+")"); this.anschluesse = anschluesse; try { verbinde(); } catch (VerbindungsException e) { // TODO Auto-generated catch block e.printStackTrace(Main.debug); } } private void verbinde() throws VerbindungsException { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (Verbindung), verbinde()"+ "\t"+anschluesse[0].hashCode()+" <-> "+anschluesse[1].hashCode()); try { simplexEins = new SimplexVerbindung(anschluesse[0], anschluesse[1], this); simplexZwei = new SimplexVerbindung(anschluesse[1], anschluesse[0], this); anschluesse[0].setVerbindung(this); anschluesse[1].setVerbindung(this); Thread t1 = new Thread(simplexEins); Thread t2 = new Thread(simplexZwei); t1.start(); t2.start(); } catch (NullPointerException e) { simplexEins = null; simplexZwei = null; anschluesse[0].setVerbindung(null); anschluesse[1].setVerbindung(null); throw new VerbindungsException("EXCEPTION: "+messages.getString("verbindung_msg1")); } } public Port[] getAnschluesse() { return anschluesse; } public void anschluesseTrennen () throws VerbindungsException { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (Verbindung), anschluesseTrennen()"); simplexEins.anschluesseTrennen(); simplexZwei.anschluesseTrennen(); } /** Gibt die Verzoegerung einer Verbindung zwischen zwei Knoten im * Rechnernetz in Millisekunden zurueck. * * @return Verzoegerung der Uebertragung zwischen zwei Knoten im * Rechnernetz in Millisekunden */ public static int holeVerzoegerung() { return verzoegerung; } public static void setzeVerzoegerung(int delay) { verzoegerung = delay; } public static void setRTTfactor(int factor) { extendRTTfactor = factor; } public static int getRTTfactor() { return extendRTTfactor; } /** maximale Round-Trip-Time (RTT) in Millisekunden <br /> * solange wird auf eine Antwort auf ein Segment gewartet */ public static int holeRTT() { return MAX_HOPS * holeVerzoegerung() * extendRTTfactor + RTTMIN; } }