next up previous contents
Next: Binden an den Event Up: Schnittstelle zum Manager Previous: Software through Picture (StP)

Der Switch-Agent

Der Switch Agent wurde anhand des Objektmodells aus Abbildung 4.4 entwickelt. Die Klasse SwitchStationaryAgent implementiert dabei die Methoden des Interface Switch. Um die benötigten Codegerüste zu bekommen, mußte der von StP generierte IDL-Code mittels idl2java nach Java übersetzt werden. Die daraus generierte Klasse _example_Switch.java wurde nach SwitchStationaryAgent.java umbenannt und anschließend erweitert.

Zum Einbinden des Agenten in das Managementsystem muß der Code der Klasse folgenden Kopf besitzen:

1 import de.unimuenchen.informatik.mnm.masa.agent.*;
2 import Port;
3 import DTE;

4 public class SwitchStationaryAgent
5   extends StationaryAgent
6   implements SwitchOperations

Diese Vorgaben werden in [Kem98] gemacht. Die Klasse stützt sich auf Methoden aus dem Paket de.unimuenchen.informatik.mnm.masa.agent auf. Sie erbt von der Klasse StationaryAgent, die ebenfalls in [Kem98] beschrieben ist und implementiert die Klasse SwitchOperations, die die Interface-Klasse für das Objekt Switch darstellt. Darüberhinaus müssen die Klassen Port und DTE eingebunden werden.

Wie man sieht, erbt die Klasse SwitchStationaryAgent nicht wie üblich von der Klasse _SwitchImplBase, die die Anbindung an den ORB realisierten würde, sondern von der Klasse StationaryAgent, die von Bernhard Kempter im Rahmen von [Kem98] entwickelt wurde. Das dort entworfene Agentensystem kümmert sich auch um die Anbindung der Agenten an den ORB.

Das folgende Programmstück stellt die Konstruktermethode vor. Für insgesamt acht Ports[*] werden neue Objekte instantiiert und einem Array von Ports zugeordnet.

1  int n = 8;
2  Port port_array[] = new Port[n];
3
4  /** Construct a persistently named object. */
5  /** Construct a transient object. */
6  public SwitchStationaryAgent() {
7    super();
8    
9    for (int i=0; i<n; i++) {
10      Port p = new Port(i);
11      port_array[i] = p;
12   }
13    
14 }

Die Methode bridge_config() ruft das in Kapitel 5.1.2 erweiterte Konfigurationstool brcfg mit dem ihr übergebenen String-Parameter auf:

1  public void bridge_config(java.lang.String parameter) {
2    // executes brcfg with specified parameter
3    try {
4      Runtime runshell = Runtime.getRuntime();
5      Process process = 
6        (Process)runshell.exec(new String("/sbin/brcfg "
7                                           +parameter));
8    }
9    
10    catch (java.io.IOException e) {
11     // error, read() or exec() failed
12     //throw new ResourceException();
13     e.printStackTrace();
14   } 
15 }

Anschließend folgen die in 4.4 spezifizierten Methoden. Diese rufen dann nur noch die Methode bridge_config() mit dem entsprechenden Parameter auf. Die Implementierung des Prototypen beschränkt sich aus zeitlichen Gründen auf exemplarische Methoden wie start(), stop(), debug(), stats(), enable_port(), disable_port(), set_port_vlan_id() und set_mac_vlan_id(), die im folgenden beschrieben werden.

Die Methode zum Starten des Switch sieht so aus:

1 public void start() {
2   // implement operation...
3   this.bridge_config("start");
4 }

Sie macht nichts anderes, als bridge_config() mit dem Parameter start aufzurufen. Analoges gilt für die Methode zum Stoppen des Switch. Interessanter sind da schon die Methoden, die auf dem Objekt Port arbeiten:

1 public void enable_port(int number) {
2   // implement operation...
3   // enable the specified port
4   port_array[number].enable_port();
5 }

Veranlaßt den Port mit der übergebenen Nummer seine Bridging-Funktionalität (wieder) aufzunehmen. Dazu wird die Methode enable_port() des Objekts Port aufgerufen. Das Abschalten eines Ports gleicht diesem Methodenaufruf, mit der Ausnahme, daß statt enable_port() die Methode disable_port() aufgerufen wird.

Der Methode debug() wird ein String als Parameter übergeben, der wiederum der Methode bridge_config() übergeben wird. Gleiches gilt für die Methode stats().

1 public void debug(java.lang.String para) {
2   // implement operation...
3   this.bridge_config("debug "+para);
4 }

Für das Setzen der VLAN ID eines Ports wird der Methode set_vlan_id() der Klasse Port als Parameter die VLAN ID übergeben:

1 public void set_port_vlan_id(
2                              int number,
3                              int vlan_id
4 ) {
5   // implement operation...
6   port_array[number].set_vlan_id(vlan_id);
7 }

Das Setzen der VLAN ID für eine MAC-Adresse veranschaulicht folgende Methode. Dieser wird die MAC-Adresse als String und die VLAN ID als Integer übergeben. In Zeile 7 wird ein neues Objekt der Klasse DTE instatiiert, mit der Variable dte eine Referenz auf die Instanz gelegt und dem Konstruktor die MAC-Adresse übergeben. Anschliessend wird in Zeile 10 der neu erzeugten Instanz über die Methode set_vlan_id() eine VLAN ID zugewiesen:

1  public void set_mac_vlan_id(
2                              java.lang.String mac,
3                              int vlan_id
4  ) {
5    // implement operation...
6    // instantiiere neues Objekt
7    DTE dte = new DTE(mac);
8
9    // Setze vlan_id
10   dte.set_vlan_id(vlan_id);
11 }

Am Ende stehen die Methoden cleanUp() und finalize(), die dazu dienen, nicht mehr benötigte Referenzen beim Beenden des Agenten explizit aufzuräumen. Java sollte das aber ohnehin von selber bewerkstelligen, so daß diese Methoden hier leer bleiben.

Der Code der Klasse Port besteht aus einem Konstruktor, der der erzeugten Instanz eine Nummer, die Portnummer, zuordnet. Ausserdem wurden die Methoden enable_port(), disable_port() und set_vlan_id() für diesen Prototypen exemplarisch implementiert. Der Code ansich bietet nichts Neues. Auch hier dient eine Methode brcfg mit einem String als Parameter zum Aufruf des C-Programms brcfg, das die eigentliche Konfiguration des Switch übernimmt.

Die Klasse DTE ist ähnlich wie die Klasse Port aufgebaut. Ein Konstruktor weist der neu erzeugten Instanz der Klasse die übergebene MAC-Adresse zu. Sie stellt die ID des Objekts dar. Neben der Methode brcfg, die der gleichnamigen Methode des Objekts Port gleicht, stellt das Objekt DTE nur die Methode set_vlan_id() zur Verfügung, der als Parameter die VLAN ID als String übergeben wird:

1 public void set_vlan_id(int vlan_id)
2   {
3     //java.lang.String mac = new java.lang.String(mac);
4     Integer vlan = new Integer(vlan_id);
5     this.brcfg(("mac ")+mac+(" vlan ")+vlan.toString());
6   }


next up previous contents
Next: Binden an den Event Up: Schnittstelle zum Manager Previous: Software through Picture (StP)
Root on HPHEGER0
3/3/1999