7. Beschreibung der IsdnLib

Vor einigen Monaten, als wir nach einem geeigneten Thema für diese Diplomarbeit suchten, kam uns die Internet-Telefonie in den Sinn. Wir überlegten in wie es möglich ist, gewöhnliche Telefongespräche über eine ISDN-Verbindung von einem angeschlossenen Rechner aus führen zu können.


7.1. ISDN und SUN

Zu diesem Zweck bot sich die Beschaffung einer ISDN-Karte für eine SUN an, auch besorgt wurde. Mitbestellt wurde auch die ISDN-Software SunISDN 1.0.2, mit der es möglich sein sollte, diese Karte zu benutzen. Kurz nach der Installation stellte sich jedoch ernüchternd schnell heraus, daß es sich hierbei nur um ein PPP Netzwerk für ISDN handelte. Es war mit dieser Software nicht möglich die ISDN Karte für andere Zwecke zu benutzen. Insbesondere stellte diese keine Programmierschnittstelle zur Verfügung.

Wir versuchten zwar durch dissassemblieren zweier beiliegender Testprogramme (zum Verschicken und zum Empfangen einer Audiodatei) einen Weg zu finden dennoch mit der Karte arbeiten zu können. So fanden wir heraus, daß diese Programme mit der Software über eine named-pipe kommunizierten, und waren auch in der Lage einen Anruf zu initiieren. Jedoch fehlten Informationen über die Art und Weise von Signalisierungen.

Wir fragten natürlich auch bei SUN direkt nach und erhielten die Antwort, daß diese Software ausschließlich für den Einsatz von PPP konzipiert worden war. Die Testprogramme seinen nur aus historischen Gründen mitgeliefert worden. Von der direkten Benutzung der named-pipe riet man uns auch ab, da diese Schnittstelle sich von Version zu Version ändern könnte.

Dennoch verwiesen uns die Leute von SUN auf ein Produkt, mit dem es möglich sein sollte die ISDN Karte für unsere Zwecke nutzen zu können. Dieses Produkt (SunXTL 1.2) wurde dann auch bestellt und installiert.

7.1.1. SunXTL 1.2

SUN Microsystems bot zu dieser Karte eine interessante Programmumgebung an, genannt SunXTL 1.2 [Sun9412:xtlArch][Sun9412:xtlAdmin][Sun9412:xtlApi][sun9412:xtlMpi]. Mit dieser sollte es sehr leicht möglich sein, Telefonie-Applikationen zu entwickeln, die nicht nur auf das ISDN beschränkt sind, sondern auch Netzwerke wie ATM, Ethernet und Modem-Verbindungen. Die Abbildung [xtl] (entnommen aus [Sun9412:xtlAdmin]) gibt einen kleinen Überblick über die gesamte Architektur.

Wie in der Abbildung zu erkennen ist, stellt diese Architektur eine verteilte Telefonie Umgebung zur Verfügung. So weit so gut, als wir jedoch nach dem MPI[ Das MPI (Media Provider Interface) verbindet einen Typ eines physikalischen Gerätes (wie einer ISDN Karte) mit den XTL Teleservices. Es wandelt somit die internen Funktionen der XTL in Aktionen auf dem Gerät um (z.B. Initiieren eines Telefonanrufs), und erzeugt für eingehende Ereignisse (z.B. ein eingehender Anruf) in die internen Nachrichten. Ohne diesen MPI ist es somit nicht möglich, die unterliegende Hardware zu benutzen.] für die ISDN Karte suchten, stellte sich heraus daß dieses nicht zum Lieferumfang gehört. Auf Nachfragen hieß es dann, daß wir einen derartigen MPI von einem Fremdhersteller beziehen könnten. Die Software stellte auch kein sonstige Möglichkeit zur Verfügung, die ISDN Karte zu verwenden.

Nach dieser wiederum ernüchternden Erkenntnis fragten wir in der GMD nach, ob dort schon irgendwo eine Implementierung existiert. Dort verhielt man sich eher zurückhaltend der XTL Architektur gegenüber und riet uns, noch einige Zeit zu warten. Man war dort selber dabei eine ISDN Karte für eine SUN zu entwickeln, die dann auch besser liefe und unterstützt werden sollte.

7.1.2. Nachfragen im INTERNET

Wir fragten nach diesen Erkenntnissen im INTERNET nach, ob jemand etwas genaueres über einen MPI für XTL wisse. Wir erhielten jedoch nur negative Antworten; es wurde sogar davon gesprochen, daß SUN dieses Paket bald wieder vom Markt nehmen würde. Der mangelhafte Support von SUN bezüglich dieser Software wurde allerdings von mehreren Leuten bestätigt. Auch wurde uns nochmals bestätigt, daß es im XTL Paket keinerlei Software gibt, die die Benutzung einer ISDN Karte erlaubt.

7.1.3. SunShine

Nach diesen recht frustrierenden Erkenntnissen, stießen wir jedoch auf ein Projekt namens SunShine, an dem man an der Helsinki Universität in Finnland arbeitete. Es hieß, daß dort etwas erstellt wurde, mit dem die Benutzung der ISDN Karte möglich sein sollte.

Nach der Kontaktaufnahme erhielten wir auch gleich Zugang zu den Quellen, und konnten diese auch benutzen. Es existierten zwei Testprogramme, mit denen es möglich war eine Datei über das ISDN zu versenden.

Ein wenig enttäuschend waren jedoch,

Hinzu kam, daß das Semester dort gerade zu Ende war, und mit einer Weiterentwicklung erst in einigen Monaten zu rechnen sei.

Das SunShine Projekt war die einzige Referenz, die wir in Hinblick auf Unterstützung zur Programmierung der ISDN-Karte gefunden haben. Aus diesem Grunde entschlossen wir uns zu einer Zusammenarbeit. Ein Teil der Entwicklung wurde dort weiter von Bengt Olof Shalin betrieben, der andere Teil von uns.


7.2. Ein kurzer Überblick über ISDN

Um verstehen zu können, welchen Teil des SunShine Projektes wir übernommen haben, müssen wir zuvor einen kurzen Überblick über ISDN geben. ISDN wurde von der International Telecommunication Union (ITU) standardisiert. In der Recommendation I.120 [itu9303:I.120] ist eine Übersicht über das Rahmenwerk der ISDN Recommendations (siehe Abbildung [i120].

Zum Verständnis der weiteren Ausführung ist nur ein Überblick über die einzelnen Schichten im ISDN nötig.

Die physikalische Schicht (physical layer) ist beim ISDN durch die ITU Empfehlung I.430 [itu9303:I.430] für einen Basisanschluß[ Es werden drei Arten von Anschlüssen unterschieden, der Basisanschluß, der Primärmultiplexeranschluß und das Breitband-ISDN. Diese unterscheiden sich im wesentlichen nur in der Übertragungsrate und den physikalischen Eigenschaften. Für die weitere Betrachtung beschränken wir uns hier auf den Basisanschluß.] spezifiziert. Die ISDN Karte ist die Instanz, die eine Schnittstelle zu dieser physikalischen Schicht herstellt. Da diese bereits vorhanden ist, beschäftigen wir uns hier nicht weiter damit.

Die zweite Schicht (Link Layer) ermöglicht den Datenaustausch mittels des Physical Layers. Sie erfüllt dabei Aufgaben wie die Adressierung von Absender und Empfänger und ermöglicht einen fehlerfreien Datenaustausch durch Fehlererkennungs- und Fehlerkorrekturmaßnahmen. Sie ermöglicht auch das Mulitplexen mehrerer Zugangspunkte. Diese Schicht ist durch Q.920 [itu9303:Q.920] (gleich I.440 [itu9303:I.440]) und Q.921 [itu9303:Q.921] (entspricht I.441 [itu9303:I.441]) spezifiziert.

Die dritte Schicht (Network Layer) ermöglicht die Kommunikation zwischen zwei oder mehreren Teilnehmern. Beim ISDN entspricht dies beispielsweise einer Möglichkeit, daß zwei Teilnehmer über ISDN miteinander telefonieren können. Diese Schicht ist spezifiziert durch Q.930 [itu9303:Q.930] (I.450 [itu9303:I.450]) und Q.931 [itu9303:Q.931] (I.451 [itu9303:I.451]).

Die anderen Schichten sind für unsere Arbeit nicht weiter von Bedeutung und werden daher nicht weiter betrachtet.


7.3. Aufgabenteilung

Wie bereits erwähnt benötigten wir eine Software, die den Zugriff auf die ISDN-Karte ermöglicht. Genauer formuliert benötigen wir eine Software, die genau die Schicht 2 und 3 behandeln kann, und eine den Benutzer eine Programmierschnittstelle zur Verfügung stellt. Ohne die Behandlung (ohne eine Implementierung dieser beiden Schichten entsprechend der oben genannten ITU-T Empfehlungen) dieser beiden Schichten ist es auch nicht möglich, die ISDN-Karte in einer realen Umgebung (d.h. angeschlossen an des öffentliche ISDN-Netz der Telekom) zu benutzen.

In dem SunShine Projekt wurden diese beiden Schichten implementiert, so das es mit dieser Software möglich war, auf das "normale" ISDN zuzugreifen und es zu nutzen. Wir zuvor schon erwähnt gab es jedoch eine Menge Fehler in der Implementierung. Weiterhin war diese auch nicht für einen echten Einsatz geplant, sondern diente nur als Versuchsobjekt. Hinzu kam noch, daß die Implementierung kein Programmierinterface zur Verfügung stellte.

Es wurde daher beschlossen, einen Teil neu zu entwickeln. Glücklicherweise waren die Implementierungen der beiden Schichten von einander völlig getrennt. Die Implementierung der Schicht 2, genauer des Q.921 LAP-D Protokolls, wurde als eine eigene Streams-Extention für den SUN Kernel implementiert. Die Implementierung des Q.931 Protokolls hingegen wurde zur Applikation dazugelinkt.

Nach einigen Überlegungen entschlossen wir uns für eine Implementierung des Q.931 Moduls. Zusätzlich sollte eine Programmierschnittstelle zur Verfügung gestellt werden. Beng Olof Shalin entschied sich währenddessen, das Q.921 Modul völlig zu überarbeiten.


7.4. Beschreibung der Implementierung

Im folgenden Abschnitt wollen wir den von uns neu implementierten Teil beschreiben. Die Abbildung [isdnLib] gibt einen Überblick über die beteiligten Module.

7.4.1. DLPI Interface

Das DLPI (Data Link Provider Interface) Interface Modul ermöglicht einen relativ einfachen Zugriff auf des Q.921 Moduls. Da dieses als STREAMS Extension im Kernel der SUN integriert ist, steht nach Außen hin nur eine DLPI Schnittstelle zur Verfügung. Der Nachrichtenaustausch ist somit ein wenig umständlich, da es verschiedene Typen von Nachrichten gibt, die je nach Type einen anderen Aufbau besitzen. Da dieses Interface weitaus mehr Möglichkeiten zur Verfügung stellt, als wir für den Zugriff auf das ISDN benötigen, wurden einige Routinen geschrieben, die den Nachrichtenaustausch erheblich vereinfachen.

7.4.2. Msg Encode / Decode

Dieses Modul ist beim Scheduler als Callback-Routine für eingehende Nachrichten vom Q.921 Modul. Es nutzt das DLPI Interface Modul, um die Nachrichten über die DLPI Verbindung zu empfangen. Nachdem die Nachricht empfangen wurde, wird je nach Nachrichtentyp weiter verfahren. Die im allgemeinen eingehenden Daten Nachrichten werden dann im ersten Schritt dekodiert.

Jede nach Q.931 eingehende Nachricht besitzt den gleichen Aufbau (siehe Abbildung [q931-msg]). Nachdem die Nachricht anhand des Protocol Discriminator Feldes als Q.931 Nachricht identifiziert wurde, wird die Call Reference Value (CRF) decodiert, sowie der Message Type (MT). Die dann optional folgende Liste mit weiteren Information Elements (IE) wird dann Stück für Stück dekodiert und in einer internen Struktur abgelegt. So wie in Q.931 beschrieben werden unbekannte IEs ignoriert, sie erzeugen keinen Fehler.

Nach dem der generelle Nachrichtenaufbau überprüft wurde, wird anhand der CRV, die eine logische Verbindung zwischen dem ISDN-NT und der ISDN-Karte identifiziert, der zugehörige Kontext gesucht. Existiert keiner, so wird zunächst ein neuer angelegt, unabhängig davon, ob um welchen Nachrichtentype es sich handelt. Die dekodierte Nachricht wird dann an je nach MT an eine entsprechende Funktion weitergereicht, die diese Nachricht dann behandeln kann.

Dieses Modul ist auch für das Verschicken einer vollständig aufbereiteten Nachricht an das DLPI Modul zuständig.

7.4.3. Msg Handling, Indication Handling, Q931 State-Machine

Dieses Modul ist der Kern der gesamten Q.931 Implementierung. Zunächst beinhaltet es alle Funktionen, die einen speziellen MT behandeln. Dazu gehören

Alle Funktionen, die für die Behandlung eines speziellen Message Type nötig sind, wurden in einem eigenen Source-Files zusammengefaßt. Derzeit werden die folgenden Q.931 Message Types behandelt (vergleiche auch Q.931 [itu9303:Q.931], Abschnitt 3.1):

Es fehlen somit nach Q.931 die folgenden Typen:

Für die Benutzung der Implementierung reichte dies in der Vergangenheit aus, die fehlenden Nachrichten wurden auch nie empfangen. Um eine Q.931 konforme Implementierung zu haben, müßten diese dennoch behandelt werden.

Für jede eingehende und ausgehende Nachricht wird die Q.931 Finite State Machine des entsprechenden Kontextes abgearbeitet. Zusätzliche werden die (alle) ebenfalls in Q.931 definierten Timer entsprechend den SDL [itu9303:Z.100] Diagrammen behandelt. Realisiert wird dies mit Hilfe des Scheduler Moduls.

Wenn eingehende (zum Teil auch ausgehende) Nachrichten eine Indikation zur Applikation erfordern, wird in den einzelnen Funktionen noch eine IsdnLib Indication generiert und die zuvor registrierte Callback Funktion der Applikation aufgerufen.

7.4.4. IE Handling

Neben der Behandlung der MT, müßten die Information Elements kodiert und dekodiert werden. Bei der Betrachtung des Aufbaus einzelner IEs wird sehr schnell klar, daß dies eine etwas kompliziertere Aufgabe darstellt. Dies ist darin begründet, daß einige IEs sehr viele optionale Felder besitzen, so daß sich der Aufbau sehr stark ändert.

Aus diesem Grunde und aus dem Grunde der Übersichtlichkeit, haben diese Kodierung und Dekodierung der IEs in eine eigenen Modul ausgelagert. Für jedes IE existieren zwei Funktionen, die jeweils in einem Source-File implementiert wurden. Die eine Funktion Realisiert die Kodierung, die andere die Dekodierung. Zu Debugging Zwecken haben die meisten IEs noch eine weitere Funktion zur Verfügung, eine mit der der Inhalt formatiert ausgegeben werden kann.

In der jetzigen Implementierung werden folgende IEs unterstützt (in alphabetischer Reihenfolge):

Die markierten IEs sind noch nicht vollständig implementiert.

7.4.5. Scheduler

Der Scheduler ist für die Behandlung der asynchronen Ereignisse zuständig. Er besitzt eine Main-Loop, in der er auf ein Ereignis wartet. Er besitzt eine kleine Programmierschnittstelle, über die eine Routine für die Behandlung eines bestimmten Ereignisses registriert werden kann. Dies kann

Das Modul mit der Q.931 Finite State Machine benutzt diesen beispielsweise für die Realisierung der Timer.

7.4.6. IsdnLib

Die IsdnLib stellt die eigentliche Programmierschnittstelle nach außen hin zur Verfügung. Sie stellt eine Reihe von Funktionen zur Verfügung, mit deren Hilfe eine Applikation das ISDN relativ einfach benutzen kann.

Die IsdnLib basiert maßgeblich auf den anderen zuvor beschriebenen Modulen, so auch das Scheduler Modul. Bei der Entwicklung der IsdnLib wurde jedoch auch daran gedacht, diese später einmal in tcl/tk[ tcl/tk ist eine Scriptsprache, die von John K. Ousterhout entwickelt wurde.] einbinden zu können. Zu diesem Zweck muß es möglich sein, die Schedulling Routinen des tcl benutzen zu können. Die Implementierung wurde daher so realisiert, daß nur einige "Hüllfunktionen" geschrieben werden müssen, die den Namen der Funktionen des Scheduler Moduls besitzen, und die entsprechenden Funktionen der tcl Implementierung aufrufen. Dies wurde bisher jedoch noch nie getestet!


7.5. Warum eine neue Library?

Nachdem in dem letzten Abschnitt der Aufbau unserer Implementierung beschrieben wurde, wollen wir noch einmal kurz die Gründe beschreiben, die zu der Entscheidung führten die Library in der Art zu realisieren, wie sie jetzt existiert.

Zu Beginn des Projektes überlegten wir, was das einfachste Interface für eine ISDN Unterstützung sein könnte. Wir überlegten uns hierzu die folgenden Varianten:

  1. Realisierung als eigenständigen Prozess mit einem socket() ähnlichem Interface.
  2. Implementierung als CAPI 2.0 Schnittstelle.
  3. Definition einer eigenen Library, die zur Applikation gelinkt wird.

7.5.1. Socket-Interface

Die erste Version sah auf dem ersten Blick sehr einfach aus und hatte den Vorteil, daß das ISDN eventuell auch über das Netz zu benutzten wäre. Bei weiteren Überlegungen stellte sich jedoch schnell heraus, daß sich eine Reihe von Problemen ergeben, die den Realisierung und vor allem die Benutzung ziemlich erschwert hätten. Hinzu kommt noch die Tatsache, daß hierdurch eine erhöhtes Schedulling auf dem Rechner zu erwarten wäre, auf dem dieser Server läuft.

Besonders schwierig war es jedoch, die asynchrone Signalisierung realisieren zu können. Im ISDN können zu jeder Zeit Nachrichten für existierende oder noch aufzubauende Verbindungen eintreffen. Um diese den einzelnen Verbindungen zuordnen zu können, müßte etwas ähnliches verwendet werden, wie die Call Reference Value der Q.931 Nachrichten. Wir würden dann ein neues Protokoll benötigen, in dem wiederum verschieden Nachrichtenformate definiert werden müßten.

Er stellte sich somit heraus, daß wir wiederum eine neues Protokoll definieren müßten, das ähnlich Komplex wäre wie das Q.931 Protokoll selber, womit wir dann im Grunde überhaupt nichts gewonnen hätten.

7.5.2. CAPI 2.0

Es erschien uns daher eher sinnvoll auf eine Schnittstelle zurückzugreifen, die bereits definiert war und als quasi Standard gilt, CAPI 2.0. Wir besorgten uns darauf hin die CAPI-Spezifikation und analysierten inwieweit es möglich wäre, diese Schnittstelle zu implementieren.

Bei der Betrachtung der Spezifikation fiel jedoch schnell auf, daß dieser ebenfalls recht komplex zu sein scheint. Zumal das Problem auftrat, daß diese Implementierung dann wiederum eine STREAMS Kernel Extension realisiert werden müßte. Da wir einen derartigen Aufwand scheuten, und da die Benutzung von CAPI auch recht kompliziert erschien, verwarfen wir auch diese Idee.

7.5.3. Implementierung als eigene Library

Somit blieb noch die letzte Variante übrig, die Implementierung als eine eigenständige Library, die zu der Applikation dazugelinkt werden muß. Diese Variante erschien uns als sehr vernünftig, da es möglich war direkt anzufangen und einige Tests durchzuführen. Es mußten nicht erst umständlich Protokolle definiert, oder Kernel Extensions geschrieben werden. Und vor allem erschien uns diese Variante immer flexibel erweiterbar zu sein. Wird ein neuer Dienst mit angeboten, so muß nur eine neue Funktion implementiert werden. Sollten weitere Datenfelder zu einer Nachricht hinzukommen, würde sich hierdurch nur eine Struktur ändern, womit sich die Änderung für Applikation dann als transparent darstellt.

Ein kleinen Nachteil gab es bei dieser Variante jedoch auch. Da die Library als Teil des Prozesses läuft, würde ein Blockieren des Programms auch die ISDN-Schnittstelle beeinflussen. Eingehende Q.931-Nachrichten würden dann zeitlich nicht mehr Q.931 Konform behandelt werden können.

Wir entschieden uns dennoch für diese letzte Variante, und nannten die entstandene Library IsdnLib.


7.6. Beschreibung der entwickelten IsdnLib

Der Kern der Library stellt die interne "Event-Loop" dar. Sie ist mit der im tcl zu vergleichen. Aus diesem Grunde ist die IsdnLib in der ähnlichen Art und Weise zu benutzen, wie eine Applikation, die tcl zur Benutzung mit dazulinkt.

Die einzelnen Funktionen der IsdnLib sind im Anhang [manIsdnLib] in der Form von Manualpages beschrieben. Die Implementierung der IsdnLib ist in Anhang [srcIsdnLib].


File was created Wed Feb 26 17:43:10 1997 by tex2html