next up previous contents
Next: High Level Funktionen für Up: Entwicklung eines eigenen Subagenten Previous: Darstellung der MIB im

Low Level DPI Funktionen

Der grundsätzliche Ablauf der DPI Kommuniktion wurde bereits im vorigen Kapitel abgehandelt. An dieser Stelle soll nur gezeigt werden, welche Funktionen der Subagent zur DPI Kommunikation zur Verfügung stellt.

Dieser Funktionsblock darf bei der Implementierung als Black Box betrachet werden. Er wird nur einmal im Modul subagent_standard.pl abgearbeitet:

# Ermitteln des TCP-Port's, der fuer die DPI-Kommunikation
# mit dem Agenten benutzt werden soll.
$Port = &qDPIport;
print "Port:$Port\n";

# Ueber den ermittelten Port eine TCP-Verbindung zum Agenten
# aufbauen (fuer die DPI-Kommunikation) => Handle: DPI_Anschluss
&TCPConnect($Port);

# Oeffnen der DPI-Verbindung
&DPI_Open;
sleep 1;

# Registrieren des Teilbaums
&DPI_Register;

...

# Unregistrieren des Teilbaums
&DPI_UnRegister;

# Schliessen der DPI-Verbindung
&DPI_Close;

# Schliessen des Handles fuer die TCP-Verbindung zum Agenten
close(DPI_Anschluss);
}
########################################################
# Ende des Hauptprogramms
########################################################

Interessanter sind die beiden folgenden Funktionen, die z.B. beim Implementieren eigener, von den generischen Funktionen abweichenden, GET und SET Funktionen benötigt werden:

Hinweise für die eigene Implementierung:

Es ist wichtig zu beachten, daß das Beantworten von Fehlern z.B. beim GET Zugriff auf nicht vorhandene MIB Variablen mittels ResponseError() SNMPv1 Verhalten ist und nach Möglichkeit nicht genutzt werden sollte.
Unter SNMPv2 wird stattdessen ein detaillierter Fehlercode als eigener Typ zurückgeschickt. Die generischen GET und SET Funktionen dieses Subagenten reagieren unterschiedlich, je nachdem, wie die globale Steuervariable snmpversion gesetzt ist:

    ...
    $Wert = &get($InstID);
    if (defined ($Wert)) {
        &ResponseSuccess($dpi_get_packet_id,$GID,$InstID,$Wert);
    }
    else {  # Nicht vorhanden
        if ($$snmpversion == 1) {
            # SNMP_ERROR_noSuchName
            &ResponseError($dpi_get_packet_id,"02")
        }
        else {
            # SNMP_TYPE_noSuchInstance
            &ResponseSuccess($dpi_get_packet_id,$GID,$InstID,$Wert,"10");
        }
    }
    ...

Dieses Verhalten sollte auch beim Implementieren eigener GET und SET Funktionen, die Gebrauch von ResponseError() oder ResponseSuccess() machen, modelliert werden.

Weiterhin ist zu beachten, daß nur die folgenden SNMP Typen für ein ResponseSuccess() implementiert sind:

Die Funktion ResponseSuccess() läßt sich aber leicht um weitere Typen erweitern, wenn man die if-then Schleife entsprechend erweitert. Die Konstruktion eines entsprechenden Packstrings, also die Kodierung des neuen Typen findet man im RFC 1592.


next up previous contents
Next: High Level Funktionen für Up: Entwicklung eines eigenen Subagenten Previous: Darstellung der MIB im
Copyright Munich Network Management Team