DOKU zum ISDN-Paket. R 7.      // TEXT ohne Tabs //
Basiert auf Linuxkernel 1.2.13, 1.3.26.

Dies ist eine Betaversion.

Dieses Programmpaket ist (c) 1994,1995 Matthias Urlichs <urlichs@noris.de>.
Es darf ohne meine Zustimmung _nicht_ weitergegeben werden. Kommerzielle
Verwertung jedweder Art bedarf meiner Zustimmung. Das Anbieten auf
FTP-Servern, in Mailboxen, etc.pp. ist ohne meine Zustimmung nicht
gestattet.

Obige Parameter gelten fr diese Betaversion. Die Vollversion wird
unter der GPL bzw. ihrem deutschen quivalent verfgbar sein.


Wenn ich Fehler suchen soll:
---------------------------
- Support kaufen. (Kann man natrlich auch ohne Probleme machen :-)
- DOKU LESEN. Wenn nicht verstanden, nochmal lesen. Wenn immer noch nicht
  verstanden, Verstndnisfrage stellen anstatt rumzubasteln und mich mit
  dem Resultat der Bastelei zu beglcken.  :-/
- Wenn beim Verbindungsaufbau was nicht funktioniert:
  Master mit -wdmM starten, cu und AT/L starten, zugucken was passiert,
  Konfigdatei + Master-stderr + AT/L-Output mir schicken.


Achtung:
=======

Es gibt eine Mailingliste zum Thema: linux-isdn@uranus.central.de.
"Bitte trag mich ein"-Requests bitte _nicht_ dorthin, sondern an
linux-isdn-request@uranus.central.de.


Version 14: Die CL- und DL-Zeilen haben sich gendert (erweitert um
<Key>-Parameter).  Intelligente Karten funktionieren NOCH NICHT.

In der Version 11 lagen noch ein paar .depend-Dateien und anderer Kram rum,
die den Buildproze gestrt haben. Abhilfe: "make clean".


Mit der Version 11 ist das OK am Ende des statischen Teils der AT/L-Ausgabe
weggefallen, weil das zu viele Leute irritiert hat. (Schlielich folgt noch
was nach.)

Mit der Version 11 hat sich die Installationsprozedur fuer ISDN-Karten
geaendert. Vorher: Config.c editieren, Modul bauen. Jetzt: d_teles.o
laden, dann fuer jede Karte "insmod teles.o -o Tel0 name=$(cardname Tel0)
mem=0xD6000 irq=5" ausfuehren. Daten anpassen! Unterschiedliche Namen
verwenden! Das rc-Skript in tools/ wurde entsprechend angepasst.
16-Bit-Karten: Zusaetzlich "ipl=X" (X=1..3) fuer die erste bis dritte Karte.
Damit sollte es problemlos sein, zwischen verschiedenen Systemen (mit
einigermaen identisch konfigurierten Kernels) die Treiber auszutauschen.

Mit der Version fr 1.2.0 hat sich die Syntax der cf-Datei leicht gendert:

Der :ea-Parameter in der P-Zeile wurde durch den :lr-Parameter ersetzt:
-   verwende ":lr /X" statt ":ea X".
-   hnge an die DL-Zeile an die Nummer einen / an und danach ":pr 0 :sp 65
    :pr 63" fr 1TR6 oder :sp 8 fr Euro-ISDN.
Generell steht nun "/" fr EAZs und so; "." steht fr Nebenstellennummern.
Bei externen Nummern verwende ich generell ".", aber das ist
Geschmackssache.

Einige Konfigzeilen haben als zustzlichen Parameter das ISDN-Interface
verpat bekommen.

Die Parameter :pr und :sp stehen nun in der DL-Zeile und nicht mehr in
der P-Zeile.

Die I- und O-Flags werden nun klein geschrieben.

Die Verzgerung beim Auflegen (ML-Zeile) wird nun mit einem Komma an die
Flags angehngt anstatt als Extraparameter.


Einen leicht genervten Dank an den einen von ca. 30 Leuten, die den Fehler
in der letzten DOKU-Ausgabe nicht nur bemerkt haben, sondern der sogar auf
die unheimlich neuartige Idee gekommen ist, mir eine entsprechende Mail zu
schreiben. (You know who you are.)  Und zwar nicht eine Mail "Du da pat
was nicht zusammen, ey boah ey", sondern sogar mit der anscheinend (wenn
ich mir die anderen Mails so ansehe) absolut unntigen Info, _was_ nicht
stimmt. Echt goil ey.


Geldmangel
==========

Die Entwicklung so eines Treibers kostet Zeit. Zeit ist Geld.  :-(

Wer sich an den Entwicklungskosten des Treibers beteiligen will:
Konto 2040206135, Hypo-Bank Nrnberg (BLZ 760 202 14). Fr den berwiesenen
Betrag kann ich eine Rechnung schreiben, wenn ntig inkl. Mrchen...h,
Mehrwertsteuer.


Bekannte Fehler
===============

Die Konfigurationsdatei ist manchmal etwas undurchsichtig.
_Ich_ werde das nicht ndern, keine Zeit; wenn jemand ein Frontend
schreiben will -- nur zu!

Login ber ISDN macht noch leichte Probleme.

Die Doku liegt nur auf deutsch vor.


Fragen? Probleme? (Gleich am Anfang, damit es keiner bersieht...)
=================

Bitte per Mail, und zwar an isdn-problem@smurf.noris.de.
Wenn ohne Internetanschlu: Bitte per Fax, an 0911/5980150.
Telefonanrufe von Nichtkunden sehe ich ziemlich ungern, weil sehr
zeitaufwendig.

Vollstndige Konfigdatei und genaues Protokoll dessen, was man gemacht hat,
was im Syslog oder auf der Konsole ausgegeben wurde, etc.pp., mitschicken.

Probleme mit der Doku? DIES IST noch KEINE ENDVERSION. Also bitte selber
nachdenken, in den Sourcen whlen, rausfinden wo es hakt, und mir entweder
genauere Fragen stellen oder einen Lsungsvorschlag, zB ergnzte Doku,
schicken. Oder mich dar bezahlen, da ich den Kram supporte -- das ist
nmlich der eigentliche Grund, weshalb der Treiber nicht schon vor einem
halben Jahr fertig wurde... Nheres zu meinem Supportangebot fr Linux via
Mail -> info@smurf.noris.de.

Bei Systemcrashs und hnlichen Widrigkeiten: Problem reproduzieren;
Konfiguration, genaue Infos was wann wie, Fehlermeldungen in eine Mail
verpacken und mir schicken.


Support
=======

Support gibt es bei mir zu kaufen. Nhere Informationen und Preise -> Mail.

Einen Treiberupdate gibts fuer DM 30 plus Medium. Fuer kommerzielle Kunden
gibts dasselbe fuer DM 250, Erstsupport bis zur erfolgreichen Installation
inbegriffen. Dieses Angebot gilt nicht fr Leute, die mich jeden Tag
dreimal nerven; fr die kostet der Support DM 400 pro Monat. (Jawohl, ich
habe solche Kunden...) Support fr Nebenstellenanlagen, die sich nicht an
Wortlaut oder Sinn der Normen halten, wird gesondert berechnet.

Fuer Privatleute etc. gibts den Support auch kostenlos, via
linux-isdn-request@uranus.central.de. Die Newsgroups de.comm.isdn und
de.comp.os.linux lese ich momentan wegen Zeitmangel nicht, sorry.


Systemvoraussetzungen
=====================

Linux. GCC 2.5.8, Libraries 2.6.4, oder neuere.
Passive ISDN-Karte mit Hardware-Doku, oder Teles-8 oder -16 / Creatix.
Support fuer BSC- und AVM A1-Karten ist in Vorbereitung, Source liegt bei,
funktioniert aber noch nicht so ganz (BSC: B-Kanle; beide: Interrupts?) --
wer kann und will, mge sich dransetzen.


Kernelpatches
=============

Die Patches basieren auf dem Kernel 1.2.11.
Frhere bzw. sptere Kernels auf eigene Gefahr bzw. Bastelei. 
Insbesondere sollten die Leute, die meckern, weil sie den Kram nicht unter
1.3.xx zum Laufen bekommen, sich ernsthaft fragen, wieso sie einen Kernel
einsetzen, der ausdrcklich fr Leute gedacht ist, die selber nach Bugs
suchen knnen.

Was die einzelnen Patches machen und ob sie bentigt werden,
steht in den einzelnen Dateien am Anfang. Lesen, bevor der Kernel verndert
wird!

Der Kernel sollte mit CONFIG_MODVERSIONS gebaut werden; das ist zwar nicht
unbedingt notwendig, aber sinnvoll.
Das modutils-1.2.8-Paket wird in jedem Fall bentigt, um Parameter an die
einzelnen Module zu bergeben.


Sonstiges
---------

In /etc/syslog.conf steht meistens sowas wie
    *.=debug ....
Das ist Unsinn. Ersetzen durch
    *.debug  ....
sonst debuggt er nur die Haelfte.

Der syslogd macht fsync() oder sync() nach dem Schreiben jeder Zeile.
Das ist ebenfalls Unsinn. Sourcen holen, den [f]sync()-Aufruf rauswerfen. 

Leute mit 1.3.xx-Kernel brauchen neueste Netprogramme; insbesondere ein route,
das "del ... netmask" versteht.


Grundstruktur
=============

Das Modul "compat" stellt ein paar Funktionen zur Verfgung, wie sie aus 
anderen Unixkernelumgebungen bekannt sind.

"streams" implementiert minimale Streamsuntersttzung. Wegen der
tty-Verwaltung unter Linux gibt es keinen clone-Treiber (die ist nicht
darauf ausgelegt).

Der ISDN-Treiber "isdn_2" ist die Low-Level-Schnittstelle zwischen den
ISDN-Karten und dem Steuerprogramm (bin/master). Dieses ffnet /dev/isdnmon,
liest eine Konfigdatei (siehe unten) etc. Der Treiber meldet dem
Steuerprogramm, welche Karten sich bei ihm angemeldet haben.
Es gibt _keine_ Devices fr einzelne Karten.

Der Treiber managt das Q.921-Protokoll fr die Karten. Alles andere ist
Sache des Steuerprogramms (D-Kanal) bzw. anderer Streams-Module (B-Kanle).

Ein kommunikationswilliges Programm ffnet einen freien ISDN-Port
(/dev/isdn/isdnX, X von 1 bis 99 oder so) und sendet einen Verbindungs-
wunsch an das Steuerprogramm ("atd/subnet/login", ffnen einer Verbindung
zum System "subnet" im Protokollmodus "login"). Das Steuerprogramm schiebt
diesem Kanal nun automatisch die notwendigen B-Kanal-Module unter (X.75,
T.70, V.110, was-auch-immer), baut die Verbindung auf, meldet den Zustand
der Verbindung ("RRING", "CONNECT") und verbindet schlielich B-Kanal und
Programm.  Es erscheint das login:-Prompt des Systems "subnet".

Umgekehrt wird das Steuerprogframm bei einem ankommenden Anruf selbst einen
freien Port ffnen und das zustndige Programm auf diesem Port starten.
Dasselbe passiert bei abgehenden Anrufen, die auf das zustndige Programm
beschrnkt sind, zB TCP/IP.

Beispiel:
% cu -l isdn/isdn22
  beliebig, mu nur frei sein.
AT
 OK
  Der Interpreter im Kontrollprogramm tut so, als wre er ein Modem mit
  Hayes-Befehlssatz, und schickt ein OK zurck.
  Hinweis: Das Ding ist minimal und kann nichtmal ATEx oder ATVx.
ATD/subnet/login
  [ Virtuelles Rappeln einer Whlscheibe ]
 RRING
 CONNECT
 login:
  Die Verbindung steht. Viel Spa beim Hacken eines Paworts. ;-)

BETA-BEMERKUNG: Loginverbindungen sind in der jetztigen Version nicht allzu
gut getestet. Was sehr gut tut, ist TCP/IP; siehe dazu die Beispielkonfi-
guration. Ein Anrufbeantworter existiert ebenfalls (leider noch ohne
DMTF-Erkennung).

Statt ATD/name funktioniert auch ATDnummer; /login ist der Default fr das
Protokoll.


Installation
============

### Wer noch nie einen eigenen Kernel gebaut hat, lese zunchst
### das entsprechende HOWTO-Dokument.
#
cd /usr/src
tar xfvz /wo/auch/immer/isdn-xx.tar.gz
cd isdn-xx
cd patches
for i in biglog more_free setnoswap firewall ; do
    patch -p0 -d /usr/src/linux < $i
done
# Andere Patche in diesem Verzeichnis ansehen, evtl. ebenfalls installieren.
# Vorsicht, die Patches beruhen auf Linux 1.2.11.
#
# Kernel installieren und booten.
# (alten Kernel unbedingt zu Backupzwecken erhalten!)
# Danach:

make.isdn
# Wenn er nun ber config.new und config.data meckert:
#   Siehe unten Probleme.
#   mv config/config.new config/config.data ## nicht "cp" !!
#   vi config/config.data
#   #  Insbesondere: Zeilen "PROTOCOLS" und "SUBPROTOCOLS" ansehen.
#   #                Siehe unten "DL-Zeile".
#   Danach: Nochmal make.isdn starten.
#
# Nun als Superuser:
make.isdn
# oder einfach "make install".
### Editiere /lib/modules/modules.isdn (die automatisch erzeugte Version
### steht in /lib/modules/modules.isdn.all:
    isdn/teles.o -o Tel0 name=$(cardname Tel0) mem=0xD6000 irq=5 ipl=1
  anstatt
    isdn/teles.o
  eintragen. Nheres siehe "Treiberparameter" weiter unten.
cd /usr/local/isdn/bin-Kernelversion  # also zB .../bin-1.3.29
vi /etc/isdn.conf # ISDN-Nummern, Dienste, etc. eintragen
/etc/rc.d/rc.isdn # geht automatisch in den Hintergrund
# Wenn das alles funktioniert, rc.isdn via rc.local starten.

Smtliche Gertedateien werden automatisch angelegt.

Probleme bei der Installation
--------

Als allererstes: Der obige Hinweis re Kernel installieren sollte ernst
genommen werden. Grund: Jeder modularisierte Treiber _braucht_ Zugriff auf
die korrekt konfigurierten Sourcen genau des Kernels, unter dem er spter
laufen soll. Dies gilt ganz besonders, wenn der Kernel mit
CONFIG_MODVERSIONS gebaut wurde (das ist um einiges sicherer!).

Wenn sich die Module nicht laden lassen, weil insmod Sachen wie "kfree"
nicht findet, dann liegt das daran, da die Version der Sourcen des
Kernels, des laufenden Kernels, und der ISDN-Treiber, nicht bereinstimmt.

Also: cd /wo/auch/immer/ist/src/linux; make config; make dep; make;
make modules; make modules_install; cp arch/i386/boot/zImage /boot/linux\
.versionsnummer; vi /etc/lilo.conf; lilo; reboot. 

Disclaimer: So mache ich das.


config.new und config.dist und config.data. Das Problem ist, da ich an der
config.data gelegentlich was ndern mu, aber der Benutzer daran auch
rumspielt (dazu ist die Datei da). Was tun?
Einfach: Mit den Parametern der alten config.data wird die neue config.dist
"geladen", und das Ergebnis liegt nun in config.new. Dasselbe passiert,
wenn es noch keine config.data gibt. In beiden Fllen tut man gut daran,
sich die Datei config.new nher anzusehen, evtl. mit der alten config.data
zu vergleichen, und dann "mv config.new config.data". Sicherheitshalber
weigert sich das Makefile in config/, ohne diesen Schritt weiterzuarbeiten.


Autoconfig und wieso nicht: Nein, ich weigere mich (momentan), automatisch
nach Karten, deren Interrupts, deren Konfigurationsregister etc.pp. zu
suchen. Bei einem laufenden Kernel ist das alles andere als einfach!

Stattdessen mssen die entsprechenden Daten in /lib/modules/modules.isdn
eingetragen werden. Wenn irgendwas nicht stimmt, wird im allgemeinen die
Karte nicht erkannt und das Treibermodul nicht geladen.
Ausnahme: IRQs, die werden momentan nicht berprft. Das kann man manuell
machen: nach der installation der Treiber beim ISDN-Anschlu der Karte
anrufen. Dann "cat /proc/interrupts". Wenn neben dem Wort ISDN eine Zahl
kleiner drei steht, stimmt was nicht -- anderen Interrupt probieren,
BIOS-Konfiguration berprfen: auch korrekt eingestellte Interrupts knnen
Probleme machen, wenn zB das BIOS eines PCI-Rechners den Interrupt zu einem
PCI- anstatt zu einem ISA-Slot routet. (Evtl mssen da trotz BIOS-
Konfiguration noch Jumper auf dem Mainboard umgesetzt werden. Doku des
Teils lesen!) 


Treiberparameter:
-----------------

Die Treiber fr einzelne Karten werden wie folgt geladen:
- Zunchst wird ein generischer Treiber installiert (d_XXX.o).
- Dann wird pro Interface ein Modul (XXX.o) geladen, das diesem Treiber
  genau eine Karte nennt, die er erkennen soll. Karte nicht erkannt ->
  Laden schlgt fehl.

 Alle Treiber verstehen:
- name=XXXX
  XXXX ist eine Zahl. Die Zahl wird durch Aufruf des Programms "cardname"
  aus dem 'eigentlichen' Namen der Karte gewonnen; ich wollte mich nicht
  darauf verlassen, da insmod korrekt Strings in den Treiber einbaut.

 Treiber mit Adressen im Speicher verstehen;
- mem=0xZZZZZ
  Lage der Karte im Hauptspeicher.

 Treiber mit I/O-Adrebereich verstehen;
- io=0xZZZ
  Lage der Karte im I/O-Adrebereich.

 Treiber fr Karten mit Interrupt verstehen:
- irq=XX
  Interrupt der Karte.

 Treiber fr softkonfigurierbare Karten verstehen:
- ipl=X
  Fr softwarekonfigurierte Karten: Verwende die Xte Karte.
  

Beispiel:  insmod d_teles.o
           insmod teles.o -o Tel0 name=$(cardname Tel0) mem=0xD8000 irq=5
 Zum Entfernen des Treibers:
           rmmod Tel0 ; rmmod d_teles.o


Alle Kartentreiber knnen vor oder nach Start des Masterprogramms geladen
oder wieder entfernt werden. Aktive Verbindungen werden (unsauber)
abgebrochen.


Testen:
-------

% cu -l isdn/isdn59
AT/L

sollte die konfigurierten TCP-Verbindungen auflisten.


AT-Befehle
==========
Alle Schlsselbuchstaben knnen gro oder klein geschrieben werden.
Das "AT" mu entweder vollstndig gro oder vollstndig klein
geschrieben werden. Zeichen vor dem "AT" werden ignoriert.

AT/Bn
    Schaltet Verbindung <n> von "off" auf "down" um. Siehe AT/L.
AT/K
    Beendet alle laufenden Verbindungen.
    Kann nur vom Superuser ausgefhrt werden.
AT/Kn
    Beendet die Verbindung <n>, beendet das betreffende Programm.
AT/L Karte
    Listet den momentanen Status aller Verbindungen fr die angegebene
    Karte (kann weggelassen werden: alle Karten).
<[minor:]id> <Art> <Partner> <Key> <pid> <Modus/Karte> <UnitNow> <UnitAll> <Status>
    <minor>     Nummer der Verbindung, fr AT/K o..
    <n>         interne Folgenummer der Statusmeldung; Meldungen, die einen
                alten Status ersetzen, bekommen dieselbe Nummer.
    <pid>       PID des Prozesses, der fr die Verbindung gestartet wurde.
    <Modus>
        off     Verbindung nicht aktiv, wird bei ankommendem Ruf reaktiviert.
        down    Standby; sobald ein Datenpaket ansteht, wird die Verbindung 
                aufgebaut.
        up      Verbindung steht
        ->down
        ->up    Verbindung wird gerade ab- bzw. aufgebaut.
                Zustzlich kann hinter <Modus> erscheinen:
           .N   Nter Anwahlversuch
           -N   ... nachdem N Serien fehlgeschlagen sind.
    <UnitNow>   Einheiten in der aktuellen Verbindung.
    <UnitAll>   Einheiten insgesamt seit Start des Prozesses.
    <Flags>     interner Zustand der Verbindung, komma remote-Nummer,
                strichpunkt lokale-Nummer (jeweils wenn bekannt/vorhanden).
                Interner Zustand:
                :in  Ruf ankommend
                :ou  Ruf abgehend
                :dP  virtuelle Verbindung
                :dL  Festverbindung
                :dM  Dialup, mehrfachaktiv
                :dD  Dialup, nur einmal aktiv
                :is  Verbindung ist unterbrechbar
                :nc  entfernte Nummer ist vollstndig
                :lc  lokale Nummer ist vollstndig
                :oc  Info fr abgehende Verbindung ist vollstndig
                :si  Verbindung ist neu gestartet
                :sl  Verbindung wird wieder aufgebaut
                :nj, :xi, :yi, :bi, :il, :fX, :fr, :ib
                     siehe P-Zeile.
                Der interne Zustand existiert in permanenter (bleibt mehr
                doer weniger konstant) und in transienter (wird pro
                Verbindungsaufbau neu generiert) Form. Der permanente Teil
                wird zuerst ausgegeben, danach folgt entweder ein /
                (der transiente Teil fngt bei Null an) oder ein ^ (der
                zweite Teil bernimmt die vorher angegebenen Flags;
                nochmals aufgefhrte Flags werden wieder gelscht).
    <Status>    Text; Meldung der Vermittlung (Gro/Kleinschreibung) oder
                      interner Zustand (Groschreibung).
    Ein Ausrufezeichen an erster Stelle bedeutet, da die Verbindung intern
    nicht mehr bekannt ist, der Zustand aber noch eine Zeitlang aufgehoben
    wird.
    Ein Minuszeichen am Anfang meldet die Lschung dieses internen
    Zustands; das ist fr Monitorprogramme interessant, die den Status
    anzeigen wollen, ohne sich darum zu kmmern, wie lange sie alte
    Meldungen aufheben wollen.
    Jede Minute wird auerdem ein Zeitstempel der Form "#xx: hh:mm"
    ausgegeben. xx ist die Zahl der Minuten, die der Master aktiv ist;
    hh und mm sind die aktuelle Uhrzeit. Alle anderen Zeilen 

    Bis zum nchsten AT-Befehl bleibt der Kanal im Monitormodus und meldet
    alle Zustandsnderungen automatisch. Auerdem kommt jede Minute eine
    "Keepalive"-Zeile mit der aktuellen Uhrzeit sowie der Anzahl der
    Minuten, die der Masterproze diesmal durchgelaufen ist. ;-)
AT/I
    Listet den internen Zustand. In der ersten Zeile stehen die erkannten
    ISDN-Karten, die zweite Zeile enthlt den internen Zustand des ISDN-
    Systems. Zum Debuggen.
AT/W Karte
    Beobachtet den Traffic auf den D-Kanlen der Karte (kann ein Pattern
    sein: AT/W* auf allen Karten). Dazu mu :de in der DL-Zeile stehen.
    Bei aktiven Karten sind das die Protokolldaten, zB CAPI-Nachrichten.
    Die Daten werden _nicht_ interpretiert.

    Zustzlich werden dieselben Daten wie bei AT/L angezeigt.
AT/M foo
    Sendet den Systembefehl "foo" nach unten. Gefhrlich.
    Kann zum Online-Rekonfigurieren von Modulen verwendet werden. Beispiel:
        AT/M pr :mi 2 ::ms :ms timer :tr 30 :tw 30 :ti 10
    wrde auf Verbindung 2 den automatischen Verbindungsabbau dazu berreden,
    alle 10 Sekunden nachzusehen, ob in den letzten 30 Sekunden keine Daten
    bertragen wurden, und die Verbindung gegebenenfalls beenden.
AT/Q
    Programmende. Kann nur vom Superuser ausgefhrt werden.
AT/R
    Reload der Konfigdatei. Kann nur vom Superuser ausgefhrt werden.
    Alle wegen eines Fehlers deaktivierten Programme werden wieder aufgeweckt.
AT/Xn
    Abbruch der Verbindung <n>. Kann nur vom Superuser ausgefhrt werden.
ATD/sys/proto
    Sucht Nummer und Protokoll in der Konfigdatei, whlt, macht Verbindung auf. 
ATH
    trennt die Verbindung.
<BREAK>
    wechselt vom Online- in den Befehlsmodus, falls erlaubt. Der Interpreter
    antwortet mit OK.
    (zum Verbieten: entsprechenden Konfigurationsbefehl fr das PROTO-Modul
     verwenden.)
    "+++" zum Wechseln funktioniert _nicht_.

Diverse andere Befehle sind 100% ungetestet. <BREAK> habe ich seit Ewigkeiten 
nicht mehr ausprobiert.
ATA existiert nicht; stattdessen Konfigdatei ndern.


Einschub: Was ist dieser Streams-Kram eigentlich?
========  Was ist auf dem B-Kanal los, da man sowas braucht?

Nimm an, du willst TCP/IP-Pakete verschicken. Du packst also jedes dieser
Pakete in einen Datenblock und schickst sie auf die Reise ... halt, so einfach
geht das nicht. Normalerweise wird auf dem B-Kanal sowas wie eine gesicherte
Verbindung gefahren. (Man kann sich streiten, ob das bei IP-Paketen, die
eigentlich sowieso beliebig verlorengehen drfen, Sinn macht.) Auerdem knnen
manche ISDN-Implementierungen nur ziemlich kleine Pakete verarbeiten; um
zu vermeiden, da die IP-Pakete fragmentiert werden (Overhead: ca. 20 Bytes
pro Fragment) oder von der Gegenseite weggeschmissen werden (Overhead:
unendlich ;-) , mu man sie so kennzeichnen, da die Gegenseite sie direkt
wieder zusammensetzen kann (Overhead: 2 Bytes; braucht aber besagte gesicherte 
Verbindung, um vernnftig zu funktionieren). BTX beispielsweise arbeitet
so. Auerdem ist ISDN bytesynchrton, d.h. irgendjemand mu kennzeichnen, wo
ein Datenpaket aufhrt und wo/wann das nchste anfngt. Dafr gibt es, wie
blich, mehrere Methoden...

Streams sind nun eine Mglichkeit, mehrere speziell geschriebene Module
auf einem ebenfalls speziell geschriebenen Treiber so zu stapeln, da jedes
Modul eine Einzelaufgabe dieser Arbeit erledigt. Im Idealfall sind die
einzelnen Module recht klein und damit debugbar, lassen sich vielseitig
zusammenstpseln, etc.pp. In der Praxis ist die Sache natrlich nicht ganz
so einfach; insbesondere ist der Overhead, die Pakete von einem Modul zum
nchsten zu schaufeln, nicht zu vernachlssigen. Er ist aber tolerierbar,
vor allem wenn man auf die ganzen berflssigen "Features" (von manchen
Menschen als "Bugs" oder "Designfehler" bezeichnet...) verzichtet, die
USL und Co. in Sys5 Release 4 dazuerfunden haben.

Die einzelnen Module mssen parametrisiert werden. Im Normalfall spricht
man sich mit der Gegenseite vorher ab, ob beispielsweise X.75 verwendet
wird und in welchem Modus. Alternativ, und wenn man die Normen auswendig
wei, schaltet man ein Monitor-Modul zuunterst auf den Datenstrom, lt
sich von der Gegenseite anrufen, beobachtet genau was da passiert, und
richtet die Konfiguration entsprechend ein. (Das klingt nicht nur
kompliziert, das ist es auch. Auerdem gibt es ein paar Details, die sich
nicht ohne weiteres beobachten lassen.) Zum Glck haben sich ein paar
"normale" Betriebsarten herauskristallisiert, an die sich die meisten
Systeme halten.

Paketformate
------------
Im einfachsten Fall werden IP-Pakete direkt auf die Leitung geschickt. Wer
zustzlich noch Appletalk oder IPX oder so machen will, kann diese entweder
in IP einpacken (Overhead, kein Kernelsupport unter Linux) oder ein paar
Bytes vor die Daten stellen, die angeben, um was fr Daten es sich handelt.

Die Bytes knnen entweder genauso aussehen wie im Ethernet, oder so wie der
Pakettyp von PPP. Wer PPP macht, braucht offensichtlich letzteres (PPP
selber wird auch bald kommen...); normale Leute nehmen die Ethernet-Codes.

Noch ein Einschub: TCP-IP-Routing
=================================

So ein TCP/IP-Draht ber ISDN mag ja ganz nett sein, aber irgendwie mssen
andere wissen, wie sie vom lokalen Netz zum IP-Rechner zur Gegenstelle
knnen. Und umgekehrt.

Das ganze Thema ist zu kompliziert, um es hier abzuhandeln. Man lese ein
gutes Buch ber den Kram, zB Stevens. 

Wichtige Spezialflle:
- Das Groe Internet ist auf der anderen Seite der ISDN-Leitung.
  slipto mit -d starten und auf den ganzen anderen Rechnern im lokalen Netz 
  eine Defaultroute zum ISDN-Rechner eintragen. ACHTUNG! ALLE LOKALEN
  RECHNER BRAUCHEN OFFIZIELL ZUGETEILTE IP-NUMMERN. Das Weiterleiten von
  Nummernbereichen nach RFC 1597 mu unterbunden werden (wenn diese lokal
  verwendet werden: unbedingt IP-Firewall in den Kernel einbauen und
  rausfiltern); andere unzulssige Netznummern mssen durch einen zweiten
  Gatewayrechner mit zwei Ethernetkarten o.. abgeschottet werden.

- Ein System, das eigentlich Teil des lokalen Netzes wre, sitzt am anderen
  Ende der Leitung. Am einfachsten ist hier Proxy-ARP; der bentigte Befehl
  beim Booten lautet "arp -s IP_der_entfernten_Kiste Ether_des_ISDN_-
  _Rechners pub". Die Ethernetadresse spuckt "ifconfig eth0" aus.

  diplogin (fr IP ber serielle Leitung) kann den arp-Eintrag automatisch
  setzen. Wenn jemand entsprechende Patches fr slipto macht -> her zu mir.

- Ein Netz mit stupidem ISDN-Router, der ein Transfernetz sehen will, ist
  auf der anderen Seite. Einfachste Methode: Vom lokalen Netzbereich wird
  ein 4-Adressen-Bereich abgezwackt und als Transfernetz mibraucht. Sei
  die lokale Adresse 129.130.131.x, so wird zum Beispiel der Bereich x =
  [224..227] verwendet (die beiden untersten Bits des unteren Endes des
  Adressbereichs, hier 224, mssen(!!!) 00 sein). Die nchste Adresse
  (hier: 225) wird die lokale Adresse (entweder als lokale Adresse im
  slipto, oder via dummy-Interface: "ifconfig dummy0 129.130.131.225; route
  add -host 129.130.131.225 dev lo" -- in der Konfigdatei wird in diesem
  Fall die normale Ethernetadresse des Rechners als lokale Adresse
  verwendet). Danach (hier; .226) kommt die entfernte Adresse (eintragen
  via Proxy-ARP).

  Auf der Gegenstelle wird dann das Transfernetz mit einer Netmask von
  255.255.255.252 konfiguriert, die ..225 wird dort die entfernte
  Adresse und die Defaultroute an der Gegenstelle zeigt darauf.
  (Auerdem mu manchmal eine Route fr das Netz, hier 129.130.131.0,
  eingetragen werden, die auf die Gegenseite, hier .225, zeigt.)

  Diese Methode verschwendet 75% des Adressbereichs (die Nummern .224,
  .225 und .227 werden im Internet nie in Erscheinung treten) und einer der
  Rechner auf der Gegenseite verwendet dummerweise eine Nummer aus dem
  lokalen Netz, fr die ein funktionierender Nameserver-Eintrag gepflegt
  werden mu, hat aber den Vorteil, da sie funktioniert.

  Es fllt auerdem auf, da die lokale Adresse und Konfiguration des
  ISDN-Links nichts mit dem zu tun haben mu, was die Gegenseite von uns
  denkt. Das ist auch total egal -- im Gegensatz zu PPP werden die Adressen
  nicht mit der Gegenstelle abgeglichen. Das einzige, auf das es ankommt,
  ist, da die jeweils lokalen Adressen auch als lokal angesehen werden und
  _nicht_ irgendwie wieder zur Gegenseite geroutet werden. Pingpongpakete
  haben auf einer ISDN-Leitung nichts verloren! (Und auch nirgends anders.)

  Es fllt auerdem auf, da ich nichts von routed und hnlichen Programmen
  gesagt habe. Das ist Absicht. Konfiguriert eure Routen lieber statisch,
  das ist gesnder...


Die Konfigurationsdatei
=======================

Die Datei besteht aus verschiedenen Zeilentypen, die frei gemischt werden
knnen. Der erste auf ein Problem passende Eintrag wird verwendet; auf eine
passende Zeile folgende solche werden bei manchen Zeilentypen ebenfalls 
ausgewertet.
Strings in spitzen Klammern sind Platzhalter. Ein Doppelpunkt mit zwei
folgenden Buchstaben ist ein Parameter, dem eine vom Parameter abhngige
Anzahl Werte folgen kann.


Vorgehensweise des Masterprogramms beim Aufbau einer Verbindung:
--------------
Das Zielsystem wird ausgewhlt (D- und P-Zeile: ankommende Verbindung;
    R-Zeile, bei Programmstart).
Das in der R-Zeile angegebene Programm wird gestartet. 
Die in der ML-Zeile angegebenen Module werden zwischen den ISDN-Treiber und
    das Programm geschoben.
Die Module werden mit Parametern (in MP-Zeilen angegeben) versorgt.
Eine freie Karte (Liste der installierten Karten, DL-Zeile, CL-Zeile) wird
    gesucht.
Eine Nummer des Zielsystems wird gewhlt (D- und P-Zeile: abgehende
    Verbindung).
Ein freier B-Kanal (welcher, sagt uns die Vermittlung) wird der Verbindung
    zugeordnet. 
Die Module (und optional das Programm, via Signal) werden informiert, da
    die Verbindung steht.
<Datenaustausch>

Zueinander passende Zeilen haben jeweils gleiche oder via Shell-Pattern-
matching zusammenpassende <Art>-, <Partner>- und <Karte>-Felder, in
mindestens einem Zeichen bereinstimmende <Key>-Felder, und zur
aufzubauenden Verbindung passende Zeichen im <Mod>-Feld etc.; siehe die
unten folgenden Detailbeschreibungen.

Nummern und ISDN-Karten werden im Rotationsverfahren durchprobiert; dadurch
werden mehrere lokale und entfernte Nummern gleichberechtigt verwendet.
Alle anderen Zeilen werden von oben nach unten durchsucht; die erste
passende Zeile wird verwendet. (Beim Scannen der P-Zeilen werden Daten aus
passenden Folgezeilen ebenfalls bercksichtigt -- siehe unten.)

Bei Problemen (Ggeenstelle besetzt...) wird bei permanenten Verbindungen
ein paarmal probiert, dann werden anstehende Daten weggeworfen und die
Verbindung eine bestimmte (exponentiell wachsende (ja, das mu sein) Zeit
auf Eis gelegt. Ein ankommender Anruf weckt diese Verbindung
selbstverstndlich wieder auf.


Konfigurationsdatei: Details
-------------------

Alle Zeilentypen:

<Key> ist jeweils ein beliebiger String. Alle fr eine Verbindung verwendeten
      Zeilen in der Konfigdatei mssen zueinander passende Keys haben, d.h.
      mindestens ein Zeichen mu in allen Keys bereinstimmen. "*" pat zu
      allen anderen Zeichen.
      Der resultierende String ist also die Schnittmenge aller Zeichen in
      den <Key>-Parametern aller verwendeter Konfigurationszeilen.
      <Key>-Zeilen mit einem Pluszeichen an erster Stelle werden nur auf
      Vorhandensein eines Zeichens geprft, aber die Menge wird nicht
      eingeschrnkt. Beispiel:
      "ab"  "cd"       -> leere Menge
      "ab"  "xay"      -> "a"
      "ab"  "+x"       -> leere Menge
      "ab"  "+bx"      -> "ab+bx" (oder "ab+b", aber _nicht_ "ab" oder "b")
      "ab"  "+bx" "a"  -> leere Menge
      "ab"  "+bx" "+a" -> "ab+bx+a" (oder so hnlich)
      Damit lt sich sehr flexibel einstellen, wer wann auf welcher
      Leitung / Nummer mit welchen Parametern anrufen kann.
<Karte> ist der vierstellige Name der ISDN-Karte, der dieser beim Laden
        des Treibers verpat wurde; blich ist eine dreistellike Kennung
        des Kartentyps und eine fortlaufende Numerierung.
        Ein angefgtes /# gibt an, da die Zeile nur auf das Interface
        Nr. # der Karte angewendet werden kann; mehrere Ziffern sind
        mglich (Beispiel: "Bin0/23".)
<Mod> sind einzelne Buchstaben, die der betreffenden Zeile eine Sonder-
      behandlung verpassen. Welche, ist jeweils beschrieben.
      Die Unterscheidung "mehrere gleichzeitig" oder "nur eine
      gleichzeitig" bei Whlverbindungen bezieht sich jeweils auf eine
      Art/Partner-Kombination; allgemeinere Einschrnkungen werden mit
      einer Extra-CL-Zeile realisiert.
<Parameter...> ist eine Folge von einem oder mehr Parameter-Wert-Angaben.
               (Manche Parameter haben keine Wertangabe.)
      Merke: Zeilen ohne Parameter sind nicht besonders sinnvoll.


P-Zeile ("Protokoll")
-------

Form:
P <Art> <Partner> <Key> <Karte> <Mod> <Parameter...>

Beispiel:
P login * * R   :sv 0700 :nr .2 :lr /2

Parameter:
:Ft Bei Festverbindungen angeben. (Erzwingt das Laden des
    "Verbindungs"handlers.)
:dI Eine Verbinung dieses Typs soll persistent sein, d.h. zwischen zwei
    Verbindungen wird das handhabende Programm nicht unterbrochen.
    Ein "reconn"-Streamsmodul (_mu_ in der zu dieser P-Zeile passenden
    ML-Zeile auftauchen!) stellt sicher, da das Programm davon nichts
    mitbekommt, auer wenn der Wiederaufbau der Verbindung nicht klappt.
:bc Zu verwendender B-Kanal, 1 oder 2 (oder 30, bei S2M). Nur fr Fest-
    verbindungen interessant; im normalen ISDN managt die Vermittlung die
    B-Kanle fr uns.
:nj Kann der Ruf nicht angenommen werden, wird BUSY statt CallRejected
    gesendet.
:xi Wenn ankommende und abgehende Anrufe kollidieren, soll der an-
    kommende abgewiesen werden. (Default: Der abgehende Ruf wird
    abgebrochen.)
:yi Bei einem ankommeden Ruf wird automatisch ein abgehender gestartet und
    der ankommende wird abgewiesen (Callback).
:bi Bei einem ankommenden Ruf, der nicht angenommen werden kann (belegt?),
    wird automatisch auf einer anderen Leitung zurckgerufen.
    :fr ebenfalls zu setzen ist meist sinnvoll.
:il Die CL-Zeile wird ignoriert.
:fX Ankommende Anrufe, die (zB wegen besetzt) abgewiesen werden, werden
    "schnell" abgelehnt. (Andere Gerte am Bus knnen nicht abheben, da die
    Vermittlung nicht abwartet, ob sich noch jemand meldet.)
	Dieses Flag ist bei aktivem Callback meistens notwendig, wenn der
	andere B-Kanal anderweitig beschftig ist, weil die Vermittlung den
	ankommenden Ruf noch hlt und den abgehenden wegen Kanalmangel abweist.
	:-(
:fr Abgehende Anrufe, die nicht durchkommen, werden "sofort" und "oft"
    wiederholt.
:ib Wenn ankommend kein B-Kanal mitgeliefert wird, wird die Verbindung
    abgewiesen. (zB wenn man dich den Anschlu mit einem anderen gert
    teilt.) Fehlt :ib, hrt die Gegenseite in diesem Fall ein normales
    Rufzeichen ("Anklopfen"); die Verbindung wird nach 40 Sekunden
    ausgelst, wenn bis dahin kein B-Kanal frei wird..

    Logischerweise darf :xi oder :yi nicht auf beiden Seiten angegeben
    sein..!

Spezifisch fr 1TR6 und CAPI:
:sv Dienstkennung; zwei Bytes in Hex. Telefon ist 0101 und 0102; DF ist
    07xx (xx ist blicherweise 00).
:pv Semipermanente Verbindung bei abgehenden Rufen. 
    Ankommend werden SPVs automatisch untersttzt.

Spezifisch fr Euro-ISDN:
:vB Bearer Capability. Hexstring, evtl. mit Maske.
:vL Lower Layer Compatibility. Hexstring, evtl. mit Maske.
:vU Upper Layer Compatibility. Hexstring, evtl. mit Maske.
    Was diese Dinger bedeuten, steht in der Norm Q.931.
    Die wichtigsten Codes fr :vB stehen am Ende dieser Anleitung.

Spezifisch fr die Bearbeitung von Telefonnummern:
:nr Entfernte Telefonnummer. Siehe unten unter Telefonnummernverarbeitung.
:lr Lokal angewhlte Telefonnummer, bzw. deren variabler Teil.

Metaparameter:
:om Die folgenden Nummernteile sind zum Rauswhlen bestimmt, d.h. eindeutig.
:im Die folgenden Nummernteile sind zum Einwhlen bestimmt, d.h. Muster.
:bm Die Nummernteile werden sowohl ankommend als auch abgehend verwendet
    (Default).
:vr Ankommend: bei fehlender externer Nummer wird die Zeile bersprungen.
:vl Dito, fehlende lokale Nummer.
:Vr Ankommend: bei mitgelieferter externer Nummer wird die Zeile bersprungen.
:Vl Dito, mitgelieferte lokale Nummer.

    Hierbei gilt: Angegeben werden nur die Nummernteile, die nicht in den
    D- bzw. DL-Zeilen stehen. Das System destilliert aus den verschiedenen
    Angaben lokale und entfernte Nummern.

Mod:
R  Die Zeile wird primr fr einen Verbindungsaufbau verwendet.
M  Die Zeile wird nur dann analysiert, wenn eine ber ihr gefundene P-Zeile
   "pat".
X  Wenn diese Zeile (oder eine darberliegende) "pat", wird das Scannen
   nach weiteren passenden Angaben hier abgebrochen.
i  fr ankommende Verbindungen
o  fr abgehende Verbindungen
f  fr Festverbindungen
d  fr Whlverbindungen (nur eine gleichzeitig)
m  fr Whlverbindungen (mehrere gleichzeitig)
p  fr Verbindungsaufbau nach Bedarf
,# Ein Verbindungsaufbauversuch wird #-mal wiederholt, bevor ein Fehler
   gemeldet und Daten weggeworfen werden.
.# Eine Verbindung mu mindestens # Sekunden lang bestehen, sonst wird sie
   als Fehler gewertet und erstmal als OFF markiert.
   Dasselbe passiert, wenn eine Verbindung nicht vollstndig aufgebaut
   werden konnte, aber Kosten verursacht hat.

Der Suchalgorithmus findet zunchst eine zur Verbindung passende Zeile mit
R-Flag und hngt an deren Parameterliste alle ebenfalls passenden Zeilen
mit M-Flag an (dabei werden bereits angegebene Werte beibehalten, die
spezifischen Eintrge also nach oben!), bis er auf eine Zeile mit X-Flag
trifft. 


ML-Zeile ("Modulliste")
--------

Form:
ML <Art> <Partner> <Key> <Karte> <Mod> <Module...>

Beispiel:
ML login * * * - frame x75 t70

Hiermit wird angegeben, wie die Karte eingestellt und welche Streams-Module
fr einen B-Kanal verwendet werden mssen, um zwischen diesem und einer
Anwendung zu vermitteln. Die Beschreibung der verfgbaren Module folgt
weiter unten; als erstes "Modul" wird der Modus angegeben, in den der
B-Kanal beim Verbindungsaufbau geschaltet werden soll.

Konzeptuell sind diese Module gestapelt; "unten" ist die Karte, "oben" das
Anwendungsprogramm. Zwischen diesem und dem letzten Modul in der obigen
Liste wird stets ein Spezialmodul namens "proto" eingeschoben, das die
Meldungen zum Verbindungsaufbau etc. so verarbeitet, da die Anwendung
davon nichts mitbekommt."proto" darf nie in einer ML - Zeile erscheinen.

Mod:
i fr ankommende Verbindungen
o fr abgehende Verbindungen
f fr Festverbindungen
d fr Whlverbindungen (nur eine gleichzeitig)
m fr Whlverbindungen (mehrere gleichzeitig)
p fr Verbindungsaufbau nach Bedarf
,#  Verzgerung bei Verbindungsende, in Sekunden, fr sauberes
    Herunterfahren des B-Kanalprotokolls.

Modi:

trans       volltransparente Verbindung. Es wird stndig ein synchroner 
            64-kBit-Datenstrom bertragen. Wenn nichts gesendet wird,
            werden 1-Bits bertragen. (Der Zustand "wenn nichts empfangen
            wird" kann nicht vorkommen!)
transalaw   wie oben, aber statt Einsen wird 0xAA gesendet ("Ruhepegel" bei
            A-Law-Sprachkodierung). Das Senden von Rauschen, wie auf
            gemultiplexten Satellitenleitungen, habe ich mir erspart...
transv110   wie oben, aber statt Einsen werden leere V.110-Frames (38.4 kBaud)
            gesendet.
frame       Standardmodus fr Datenbertragung; die Karte interpretiert den
            B-Kanal als HDLC-Datenstrom, inkl. 0-Bit-Einschieben nach 5
            1-Bits, Prfsumme, etc.
frame16     16-bit breite Datenbertragung auf entsprechenden
            Festverbindungen. Funktioniert nur auf dem ersten B-Kanal
            (der Modus greift sich einfach beide Kanle) und (unter anderem
            wegen mglichen Laufzeitunterschieden) nicht bei zwei
            Whlverbindungen zur gleichen Zielstation.
/* die folgenden Modi sind noch nicht implementiert, bzw. nicht getestet */
frame0      Wie 'frame', aber zustzlich wird 1-Bit-Einschieben nach 7 0-Bits
            aktiviert. Fr Leitungen in manche Ecken der USA, die keine
            Nulloktetts auf der Leitung zulassen (weil sie keinen externen
            Takt verwenden).
framehi     wie 'frame', nur werden nur die oberen 7 Bits verwendet.
framelo     ... oder die unteren Bits. Sinnvoll dann, wenn jemand den Daten-
            strom auf eine 56-kBaud-Leitung umsetzt.
ppp         PPP. Momentan (leider) nur fr aktive Karten, die PPP on-board
            knnen.


MP-Zeile ("Modulparameter")
--------

Form:
MP <Art> <Partner> <Key> <Karte> <Mod> <Modul> <Parameter...>

Beispiel:
MP login * * * - proto :bk 0 :sg 0
MP login * * * - x75 :cm 3

Mit dieser Zeile knnen Module parametrisiert werden, um ihre interne
Arbeitsweise so einzustellen, da sie korrekt mit der Gegenseite zusammen-
arbeiten. Die mglichen Parameter sind unter den einzelnen Modulen, unten, 
beschrieben.

Mod:
i fr ankommende Verbindungen
o fr abgehende Verbindungen
f fr Festverbindungen
d fr Whlverbindungen (nur eine gleichzeitig)
m fr Whlverbindungen (mehrere gleichzeitig)
p fr Verbindungsaufbau nach Bedarf
u fr Parameter, die nur beim Programmstart gesetzt werden (x75-Kram zB)
a fr Parameter, die bei Neueinlesen der Konfigdaten gesetzt werden


D-Zeile ("Dial")
-------

Form:
D <Art> <Partner> <Key> <Karte> <Mod> <Nr>

Beispiel:
D * subnet * * - +49=721-961252.
D * Any-D * * I +49=*
D * Any * * I +*
D tcp xlink * Tel2 L

Angabe der Telefonnummer, unter der eine Gegenstelle erreichbar ist bzw.
mit der sie sich bei ankommenden Rufen meldet. Festverbindungen haben 
natrlich keine Nummer. 

Mod:
i  fr ankommende Verbindungen
o  fr abgehende Verbindungen
f  fr Festverbindungen (der zu verwendende B-Kanal steht in der P-Zeile)
d  fr Whlverbindungen (nur eine gleichzeitig)
m  fr Whlverbindungen (mehrere gleichzeitig)
p  fr Verbindungsaufbau nach Bedarf
,# Dies ist eine Backup-Nummer der Prioritt #.
   Zuerst werden alle Nummern mit Prioritt Null (oder ohne Angabe)
   probiert, dann die nchsthhere Prioritt, etc.
   Der Verbindungsversuchszhler wird nach jedem Priorittswechsel
   zurckgesetzt.


TM-Zeile ("Time")
--------

Form:
TM <Key> <Zeitangabe>

Beispiel:
TM abcde SaSu,Mo-Fr18-08

Schlssel fr Zeiten. Zu der angegebenen Zeit werden nur Verbindungen
zugelassen, deren <Key>-Parameter mit dem angegebenen Key kompatibel ist.

Die gefundenen Schlsselwerte werden geODERt, d.h.
  TM ab Wk
  TM cd 08-10
wird, wenn am Montag um neun Uhr aufgerufen, zu "abcd" aufgelst.


DL-Zeile ("Dial Local")
--------

Form:
DL <Key> <Karte> <Nummer> <Protokolle>

Beispiel:
DL * Tel? +49=911-995962. :pr 0 :sp 65 :pr 63

Eigene Telefonnummer. Im Beispiel sind alle Karten, auf die "Tel?"
pat, an einer ISDN-Leitung mit dieser Nummer angeschlossen.

Diese Zeile wird verwendet, um die krzestmgliche Rufnummer fr
abgehende Verbindungen zu finden und um die verwendeten Protokolle zu
spezifizieren. Hat eine Karte mehrere Rufnummern (MSNs), werden die
Protokolle nur in der ersten DL-Zeile angegeben.

Zustzlich werden in der DL-Zeile die Protokolle beschrieben, mit denen der
ISDN-Treiber mit der Karte redet. Diese Protokolle mssen natrlich auch in
den Treiber eingebaut werden, und zwar in der Datei config/config.data,
Eintrag PROTOCOLS (spitze Klammer) und SUBPROTOCOLS (eckige Klammer).

Beispiel 1TR6: <phone tei> [german]
DL * Tel0 +49=911-23456. :pr 0 :sp 65 :pr 63

Beispiel Euro-ISDN: <phone tei> [euro]
DL * Tel0 +49=911-34567. :pr 0 :sp 8 :pr 63

Beispiel Festverbindung: <fixed>
DL * Tel2 - :pr 64

Beispiel intelligente Karte mit CAPI: <capi> [bintec]
DL * Bin0 +49=911-45678. :pr 65 :sp 0

Bedeutung der Spezialzeichen in der Nummer: Siehe "DP" unten.


Protokolle und Flags in der DL-Zeile:
--------------------

Die Reihenfolge ist wichtig.

:pp        Punkt-zu-Punkt-Verbindung, feste TEI (0x00).
           Vorsicht: Anlagenanschlu wird vom 1TR6-Treiber nicht und vom
           Euro-Treiber nur unvollstndig untersttzt.
:mp        Verbindung am Bus, variabler TEI-Identifier. Bei manchen 1TR6-
           Vermittlungen und Nebenstellenanlagen notwendig, in der DSS1-
           Norm vorgeschrieben.
:mq        Verbindung am Bus, fester TEI-Identifier. Default, weil es an
           vielen Anlagen besser funktioniert als :mp.
:mt        Verbindung am Bus, feste TEI(0x12). In Spezialfllen notwendig.
:de        Debugging, macht D-Kanal-Datenaustausch beobachtbar (mit AT/W).
           Vorsicht: Diese Option verlangsamt das gesamte ISDN-System, auch
           wenn  niemand mit AT/W zusieht.
           Die beobachteten Daten sind bei manchen aktiven Karten entweder
           verzgert, oder sie knnen nicht dargestellt werden!

:ud XX     Verzgerung zwischen dem Verbindungsaufbau (D-Kanal) und dem
           eigentlichen Datenaustausch (B-Kanal). Zehntelsekunden; max.
           2 Sekunden; Default 1/4 Sekunde. Mit :ud 0 geht der Verbindungs-
           aufbau entweder etwas schneller, oder das erste Paket wird
           verschluckt, oder die Vermittlung kommt durcheinander und die
           Verbindung ist tot.  :-(

:pr 0      Normaler ISDN-D-Kanal, angeschlossen am Netz oder an einer
           Telefonanlage. Darf nur zusammen mit TEI-Handler (:pr 63)
           verwendet werden. <phone>
  :kl      Level-2-Verbindung zur Vermittlung nicht trennen. Bei Punkt-
           zu-Punkt-Verbindungen und bei entsprechend konfigurierten
           ISDN-Anschlssen ("Dauerberwachung" oder sowas hnliches)
           notwendig.
  :cl      Level-2-Verbindung zur Vermittlung trennen, wenn keine
           Verbindung besteht. Default.

           Entweder :sp 8 oder :sp 65 mu angegeben werden, NICHT beides!
  :sp 8    DSS1, Euro-ISDN. [euro]
    :b1    an manchen Nebenstellen zur korrekten Nummernerkennung notwendig.
           Einschalten, wenn die Nebenstellennummer nicht mit . oder /
           eingeleitet wird.
    :b2    anscheinend senden manche Idioten (hollndische PTT?) die
           Gebhreninfo in DISPLAY- Datenblcken.  Grummel hoch drei.
  :sp 65   1TR6, deutscher Standard. [german]

  :ai      Ankommenden Anruf mit dem ISDN-quivalent von "RINGING"
           beantworten, dann prfen ob der Anruf angenommen werden kann. 
           Notwendig bei langsamen Rechnern.
  :ad      Ankommende Anrufe erst prfen, dann annehmen (oder auch nicht).
           Default.
:pr 63     TEI-Handler (Transport Endpoint Identifier). <tei>
  :ti      TEI sofort zuordnen lassen. Notwendig bei langsamen / sehr
           beschftigten Rechnern und bei manchen Telefonanlagen.
  :td      TEI beim ersten Verbindungsaufbau zuordnen lassen. Default.
:pr 64     Festverbindung: kein D-Kanal. <fixed>
:pr 65     Intelligente Karte mit CAPI-1.x-Schnittstelle.
           In der Konfiguration verhlt sich eine CAPI-Karte ansonsten wie
           der 1TR6-Treiber, und zwar AUCH DANN WENN DAS TEIL AM EURO-ISDN
           HNGT. <capi>
  :pb      Die Karte hngt an einem Anlagenanschlu / S2M und verhlt sich
           wie eine Nebenstellenanlage.
  :sp 0    Bintec-Karte. [bintec]
           Auf diese Karte mu zunchst boot.68k und dann entweder bri.68k
           oder pmx.68k geladen werden (LF-Zeile).
     :sc X      Die folgenden Optionen betreffen nur das Xte Interface
                auf der Karte. X in 1..4.
     :lp X X X  CAPI-Bitmasken fr EAZ, Service, Infos. Hexadezimal.
                Default: 03FF E7BF 003F.
     :st XXXXX  Protokollstack XXXXX laden. Siehe Handbuch zur Karte.
                Default ist u_1tr6_pmp (wenn "german" und nicht "euro" in
                config/config.data angegeben wurde) oder u_dss1_pmp (sonst).
     :ea N NNN  EAZ N auf lokale Nummer (MSN) NNN mappen.
                Default ist die letzte Ziffer der Nummer.
                Nicht bei :pb verwenden.
     :lw X      Warte bis zu X Sekunden auf nachgewhlte Ziffern.
                Nur bei :pb verwenden.


DP-Zeile ("Dial Prefix")
--------

Form: 
DP <Karte> <Prfixe-Dialout> <Prfixe-Dialin>

Beispiel:
DP Tel? +00=0- +00=0-

Definition von Nummernprfixen, um Vermittlungsbereiche erreichen zu knnen.

Das erste Prfix ist fr abgehende, das zweite (das weggelassen werden kann)
fr ankommende Verbindungen; 1TR6-Nebenstellenanlagen wollen beim Whlen
typischerweise eine vorgestellte Null o.. sehen, die aber bei ankommenden
Gesprchen nicht mit angezeigt wird.

Die Zeichen sind _immer_ "+" fr internationale Verbindungen, "=" fr 
nationale Verbindungen, "-" fr Ortsverbindungen, "." fr Nummern an einer
Nebenstellenanlage und "/" fr EAZs/MSNs etc. Der Unterschied zwischen "."
und "/" ist, da Nummern einer Nebenstellenanlage direkt angerufen werden
knnen, whrend man fr eine Verbindung zu einer anderen MSN am gleichen
Basisanschlu die Teilnehmernummer mitwhlen mu.

Beispiel: Eine Konfiguration
D ... -1234/[456]
DL... -23456
DP... -
MP... :nr /5
wrde die Nummer 12345 whlen.

Siehe auch unten unter "Bugs anderer Leute".


R-Zeile ("Run")
-------

Form:
R <Art> <Partner> <Key> <Karte> <Benutzer> <Mod> <Programm> <Argumentliste...>

Beispiel:
R login * * * root IDUST /bin/login

Hiermit wird ein Programm (plus Parameter) angegeben, das bei ankommenden
oder abgehenden Gesprchen aufgerufen wird. Ein Dialout zu einem System
mit "R"-Zeile ist also direkt nicht mglich, da der Datenaustausch zum
betreffenden Programm geht.

Eine R-Zeile wird ignoriert, sobald das betreffende Programm einen Fehler
gemeldet hat (Exitstatus != 0) oder bei der Verbindungssteuerung ein Fehler
aufgetreten ist. 

Im Environment dieses Programms werden folgende Variablen abgelegt, wenn
die Parameter bekannt sind:
SITE      <Partner>
PROTOCOL  <Art>
CLASS     <Key>
PHONE     Telefonnummer der Gegenstelle, so wie sie ankam bzw. gewhlt wurde
LPHONE    Lokale Nummer bzw. deren Endteil
DIRECTION "IN" oder "OUT"
DEVICE    im Normalfall: /dev/ttyiXX

Mod:
.n Die Antwort wird um n Sekunden verzgert, beispielsweise um einen Anruf-
   beantworter nicht sofort abheben zu lassen.
,n Wenn eine automatische Verbindung nicht hergestellt werden konnte, wird
   nach n Sekunden der Verbindungsaufbau wieder erlaubt. (Noch nicht 
   implementiert)
$ Die Befehlszeile wird nicht direkt ausgefhrt, sondern der Shell bergeben.
E Beim Auftreten eines Fehlers wird dieses Programm deaktiviert.
  (Reaktivieren: AT/R.)
D /dev/ttyiXX wird angelegt und nach Programmende gelscht.
F Das Programm wird sofort gestartet, und die Verbindung wird aufgebaut.
  Interessant insbesondere bei Festverbindungen und SPVs.
L nur der angegebene Benutzer kann die Verbindung aktivieren.
Q strace(1) wird automatisch auf den neuen Proze losgelassen.
R kein Dialout via ATD mglich.
S stderr des Programms liegt auf ISDN (sonst: stderr des Treiberprogramms)
T Verbindung im Terminalmodus (ankommend, also zB beim Start von /bin/login).
U ein Eintrag in /etc/utmp wird angelegt (wichtig zB fr login).
B Die Verbindung wird beim Hochfahren des Managers automatisch aufgebaut.
i fr ankommende Verbindungen
o fr abgehende Verbindungen
f fr Festverbindungen. "B" wird hier normalerweise ebenfalls angegeben.
d fr Whlverbindungen (nur eine gleichzeitig)
m fr Whlverbindungen (mehrere gleichzeitig)
p fr Verbindungsaufbau nach Bedarf ("reconn"-Modul nicht vergessen!);
  wird beim Programmstart automatisch mitgestartet. Die eigentliche
  ISDN-Verbindung wird hierdurch _nicht_ aufgebaut, dafr ist "B" gedacht.


CL-Zeile ("Connection Limit")
--------

Form: CL <Art> <Partner> <Key> <Karte> <Zahl>

Beispiel>
CL * * * Tel? 2 

Begrenzt die Zahl der fr einen gegebenen Verbindungstyp verwendbaren
B-Kanle. Ueber das Limit hinausgehende Anrufe werden mit BUSY abgelehnt,
es sei denn in der entsprechenden P-Zeile steht der entsprechende
Parameter.


LF-Zeile ("Load File")
--------

Form: LF <Karte> <Segmentgre> <Delay> <Dateiname>

Ldt die Datei auf die (aktive) Karte. Mehrere LF-Zeilen knnen angegeben
werden (in der richtigen Reihenfolge! Doku beachten!). Die maximal mgliche
Segmentgre ist 4096. Der Delay gibt an, wie lange das Programm nach dem
Laden dieser Datei mit dem nchsten Schritt warten soll (Karte macht
Speichertest ber 8 MB, und hnliche Feinheiten).


RP-Zeile ("Run Program")
--------

Form:
RP <Art> <Partner> <Key> <Karte> <Benutzer> <Mod> <Programm> <Argumentliste...>

Beispiel:
RP login * * * root IDUST$u echo "Login von $PHONE auf $DEVICE" >>/var/log/isdn.use

Hiermit wird ein Programm (plus Parameter) angegeben, das bei Eintreten
eines bestimmten Zustands einer Verbindung gestartet wird. Parameter siehe
R-Zeile; zustzliche Flags sind
c  Stdin/out des Programms wird auf ein freies ISDN-Device gelegt.
   (Sonst: /dev/null.)
s  schicke keine Signale

Die folgenden zustzlichen Flags werden auerdem in der
"REASON"-Environmentvariable bergeben:
u  Start nach erfolgtem Aufbau der Verbindung
d  Start bei Abbau einer Verbindung
f  Start nach erfolglosem Verbindungsversuch (abgehend)
x  Start bei temporrer Deaktivierung eines Interface (zu viele Versuche),
   anstehende Datenpakete werden weggeworfen
y  Start bei Reaktivierung des Interface
i  Start bei Aufruf des Verbindungshandlers (zB des "slipto"-Programms)
r  Start bei abgelehntem Anruf
t  Start nach Tod des Verbindungshandlers
k  Start bei laufenden Gebhreninformationen (whrend oder nach der Verbindung)
l  Start bei endgltigen Gebhreninformationen (nach Verbindungsende)

Die folgenden Flags werden bei Programmen bergeben, die via R-Zeile
gestartet wurden:
B  Start beim Booten oder bei Reload der Konfigdatei
I  Start bei ankommendem Anruf

Ein mit "u" gestartetes Programm bekommt SIGHUP gesendet, wenn es bei
Verbindungsende noch luft; dito ein mit "d" gestartetes Programm zu
Beginn des mchsten Verbindungsaufbaus. Einem Programm, das kontinuierlich
luft, wird bei jedem Statuswechsel SIGUSR1 gesendet. SIGQUIT wird an alle
Programme gesendet, die laufen, wenn die zugeordnete Verbindung beendet
wird.

Vorsicht: Mehrere Programme unter demselben Flag laufen zu lassen
funktioniert nur dann sicher, wenn sich alle (mglicherweise bis auf eines)
ziemlich schnell wieder beenden, sonst gibt es Probleme (mehrfach oder
nicht gestartete Programme).

Im Environment finden sich zustzlich:

COST      fr die laufende Verbindung angefallene Kosten
CCOST     insgesamt angefallene Kosten
CAUSE     Aktueller Fehlerzustand (bei 


Module und deren Konfiguration
==============================

:XX <Wertbereich> <Default> Funktion eines Parameters mit Wertangabe
:YY                         Dito, ohne Wertangabe


A-Law-Coder "alaw"
-----------
Wandelt einen A-Law-Datenstrom in einen 8-Bit-Datenstrom. Dabei werden nur
die Bytes umkodiert, die Daten aber nicht auf 12 Bit aufgeblasen. Gibt nach
oben Bytes _mit_ Vorzeichen weiter.
Zustzlich knnen fr beide Richtungen Schwellwerte definiert werden, 
unterhalb derer keine Uebertragung zugelassen wird, um Gesprchspausen
herauszufiltern.

:ro 0-127    Ansprechschwelle beim Empfang. Null schaltet permanent auf
             "Durchgang".
:rx 0-127    Abschaltschwelle. Tne werden blockiert, wenn mehr als ..:
:rc 1-32767  aufeinanderfolgende Samples unterhalb der :rx-Schwelle liegen.
:xo :xx :xc  wie :ro :rx :rc, aber fr den Sendeteil.


Befehlsinterpreter "proto"
------------------
Sitzt immer automatisch zuoberst auf dem durch den ISDN-Treiber
definierten Stream. Interpretiert im Befehlsmodus die eingetippten Zeichen
und schickt sie zeilenweise an das Managementprogramm.
Im Online-Modus wird keine Spezialzeichenfolge wie etwa "+++" gesondert
interpretiert; stattdessen wird ein _BREAK_ zum Zurckschalten verwendet.

:cr 0-255  0x13  ASCII Carriage return
:lf 0-255  0x10  ASCII line feed
:bs 0-255  0x08  ASCII Backspace
:cc 0-255  0x03  Zeile lschen (Abbruch, ^C)
:ca 0-2    2     0: kein Hangup
                 1: Hangup bei NO CARRIER
                 2: Hangup bei CONNECT...NO CARRIER
:bk 0-1    1     BREAK bewirkt Rckkehr in den Befehlsmodus.
:sg 0-1    0     wenn 1, sende SIGUSR1 beim Aufbau der Verbindung und
                 SIGUSR2 beim Abbau der Verbindung

Die folgenden Codes werden normalerweise vom L4-Treiberprogramm gesendet:
:on      schaltet auf Datenbertragung
:of      schaltet auf Befehlsmodus


Streams->IP-Wandler (str_if)
-------------------
Implementiert ein TCP/IP-Modul. Daten werden nicht in Richtung Anwender-
programm, sondern in das TCP/IP-Networking des Kernels umgeleitet.

:mt 120-4096  512  MTU des Treibers. (Die MRU hngt vom ISDN-
                   Kartentreiber ab.)
Paketformat:
:.N                TCP/IP (Default).
:.E                Ethernet-Paketheader.
:.P                PPP-Paketheader.
:eT xxxx           xxxx: hexadezimal. Angabe des bertragenen Pakettyps (:.N).
                   TCP/IP ist 0800 (Default). Damit knnen zB statt
                   "nackter" IP-Pakete ebensolche Appletalk-Pakete
                   bertragen werden.

ioctl(x,SIOCGETU,int) ioctl-Aufruf zur Uebertragung der Unit-Nummer ("strX",
0 <= X <= 15) an ein Anwenderprogramm. Das Programm kann damit die IP-
Adressen auf beiden Seiten des Links konfigurieren. Ein einfaches
Treiberprogramm, "slipto", dem lokale und entfernte IP-Adresse bergeben
werden, ist im Verzeichnis str_if.


Cisco-HDLC-Modul "fakeh"
----------------
Verwendet das Cisco-eigene "HDLC"-Protokoll. Auf der Gegenseite mu
(noch... hat jemand Doku zu den Tieren?) "no keepalives" konfiguriert
werden. Die Option fr das Paketformat mu genauso wie bei str_if
eingestellt sein!

:.N    TCP/IP (Default).
:.E    Ethernet-Paketheader.


IP-Monitor "ipmon"
----------
Loggt IP-Pakete mit. Das Programm "monitor" liest dieses Protokoll aus dem
Kernel. Die Option fr das Paketformat mu genauso wie bei str_if
eingestellt sein!

:.N    TCP/IP (Default).
:.E    Ethernet-Paketheader.
:.P    PPP-Paketheader.


Verbindungshalter "reconn"
-----------------

Verhindert (in Zusammenarbeit mit korrekten P- und R-Zeilen, siehe oben),
da eine Verbindungstrennung sich auf eine Anwendung auswirkt; die
Verbindung wird automatisch neu aufgebaut, sobald wieder Daten anstehen.

Sollte logischerweise nicht unterhalb von X.75 oder hnlichen Modulen zur
bertragungssicherung eingesetzt werden, weil die stndig Daten
austauschen, um zu prfen, ob die Gegenstelle noch da ist.

:pf  Das jeweils erste Datenpaket (das, das zum Verbindungsneuaufbau
     gefhrt hat), wird in den Syslog mitgeschrieben.
:nf  Es wird nicht mitgeschrieben. (Default.)


Zeitbegrenzer "timer"
-------------
Bricht die Verbindung ab, wenn eine bestimmte Zeit lang keine Daten
bertragen wurden.
Alle Zeitangaben sind in Sekunden.

:ti 60  Abstand zwischen den mglichen Abbruchpunkten (zB Gebhrenzeittakt)
:to 55  Zeit zwischen Verbindungsaufbau und erster Messung
:tw  0  wenn zum Mezeitpunkt soviele Sekunden nichts gesendet wurde,
        wird die Verbindung abgebrochen
:tr  0  dto., gelesen; eine der beiden Bedingungen reicht aus.
:li     unterbrochen wird nur bei ankommenden Verbindungen.
:lo     dto, bei abgehenden Verbindungen
:lb     dto, beide Verbindungsarten (Default).

Vorsicht: Es macht absolut keinen Sinn, den Timer unterhalb von
bertragungssichernden Modulen wie x.75 oder gar Datenstrom-Modulen wie
v110 anzuordnen.

Der Timeout sollte mindestens dreimal so gro sein wie die Zeit, die
typischerweise zum Verbindungsaufbau bentigt wird, weil es sonst
scheuliche Interaktionen mit den TCP-Retryalgorithmen gebenb kann.


T.70 "t70"
----
Implementiert das T-70-Minimalprotokoll -- spaltet abgehende Dateneinheiten
auf, wenn sie zu gro sind, und fat ankommende zusammen, wenn das ent-
sprechende Bit im T70-Header gesetzt ist.

:mt  0,4-4096 256 Maximale Datenblockgre (exklusive T70-Header (2 Bytes)).
                  ":mt 0": Maximum "unendlich".


CEPT "fakecept"
----
Erzeugt das von T-Online erwartete, vom T70-Standard abweichende Protokoll.
Abgehende Dateneinheiten werden wie bei T.70 aufgespalten, bei ankommenden
Dateneinheiten wird nur der Protokollheader entfernt.
/* TODO: Momentan wird die Aufspaltung _nicht_ markiert -- soll/darf das
   passieren, wenn ja wie? */

:mt  1-4096 128 Maximale Datenblockgre. Darf fuer T-Online auf keinen Fall
                128 ueberschreiten.


V.110 "v110"
-----
Implementiert V.110 im 38400-Baud-Modus. Mehr oder weniger ungetestete
Experimentierversion. Warnung: Exzessive Kernelbelastung durch
Bitschieberei etc. Fr ernsthafte Anwendungen braucht es einen
entsprechenden Wandler in Firmware / Hardware auf der Karte.


Datenpuffer "buffer"
-----------

Die meisten Module haben einen ziemlich kleinen Datenpuffer (ca. 200 Bytes).
Wenn das zuwenig ist, zB beim Empfangen von Audiodaten oder beim
Weiterleiten von IP-Paketen, kann ein Puffer zwischengeschaltet werden.

:br  XXX  Puffergre beim Lesen / Empfangen
:bw  XXX  Puffergre beim Schreiben / Senden
:bb  XXX  Puffergre beim Lesen und Schreiben
          Wertebereich fr die Puffergre: 10 bis 16*1024 Bytes.
          Default: 4 kBytes.
          Der Puffer fllt sich bis zur angegebenen Gre und leert sich
          bis auf 1/4 dieses Werts.


Datenrate "rate" (ungetestet!)
---------

Begrenzt die mgliche bertragungsrate. "berschssige" Daten werden
zunchst gepuffert, dann weggeworfen; daher ist es sinnvoll, "rate" vor
"x75" zu verwenden. Bei TCP/IP, das sowieso keinen gesicherten Kanal
voraussetzt, geht es natrlich auch ohne X75.

:ri XXX  Begrenzung der ankommenden Daten auf XXX bytes pro Sekunden.
:ro XXX  dito, gesendete Daten.
:rb XXX  dito, beide Richtungen.


Van-Jacobsen-Kompression "vanj"
------------------------
Komprimiert TCP-IP-Header.
Sollte nur auf einer gesicherten Verbindung verwendet werden.
Option fr das Paketformat mu genauso wie bei str_if eingestellt sein!

:sz tx rx  16 16  Zahl der gleichzeitig gecachten Verbindungen.
                  Zwischen 16 und 128; jeweils Sende- und Empfangsrichtung.
                  (noch nicht implementiert)
:ac               Aktiv komprimieren. (Default bei abgehenden Verbindungen.)
:pa               Komprimieren nur, nachdem ein komprimiertes Paket ankam.
                  (Default bei ankommenden Verbindungen.)
:.N               TCP/IP (Default).
:.P               PPP-Paketheader.

X.75 "x75"
----
Implementiert Ebene 2 des X75-Protokolls. Das Framing (Prfsumme, 1-Stopfen,
Interframezeichen etc.) wird von der Hardware auf der Karte erledigt.

:nk  1-7 (127) 1 Parameter "k" -- Anzahl der maximal ausstehenden
                 Datenblcke. (Die Lnge dieser Blcke wird nicht
                 begrenzt -- siehe T70-Modul)
:wd              2-Byte-Befehlswrter: SABME, max(k) 127.
:nw              1-Byte-Befehlswrter: SABM, max(k) 7.
:n1  1-100    3  Parameter "N1" -- Anzahl der Wiederholungen von Poll-Frames,
                 bis ein Fehler angenommen wird.
:t1  1-100   10  Parameter "t1" -- Timeout fr unbesttigte Daten- und
                 Poll-Frames in Zehntelsekunden.
:t3 1-1000  100  Parameter "t3" -- Timer fr Test, ob die Verbindung noch
                 aktiv ist. In Zehntelsekunden, mu > 2*t1 sein.
:ad 0-255 0-255  (dieser Parameter braucht zwei Wertangaben!)
        1     3  Adrebytes fr Befehls- und Meldungsframes. Sollten
                 das niederwertige Bit gesetzt haben und verschieden sein.
                 Wegen Abwrtskompatibilitt mit dummen Implementierungen
                 werden "falsche" Einstellungen akzeptiert.
:po              Pollmodus -- lst beim Empfang einer RNR-Meldung sofort
                 einen RR/RNR-Befehl aus. Fr Kompatibilitt mit dummen
                 Gegenstellen, die vergessen, sich mit RR bereit zu melden,
                 nachdem sie RNR gesendet hatten.
:np              schaltet den Pollmodus ab (Default).
:cm 012348  1    wann die X75-"Verbindung" aufgebaut wird
            0    gar nicht -- es wird angenommen, die Verbindung existiert.
                 Zur Kompatibilitt mit dummen Gegenstellen, die sich
                 auf die Steuerung im D-Kanal verlassen.
            1    Baldmglichst (abgehend)
            2    Baldmglichst (ankommend)
            3    Baldmglichst (an- und abgehend)
            4    wenn der erste Datenblock zur bertragung ansteht.
            8    gar nicht -- es werden UI-Frames verwendet.

pr_on
-----
Spezialmodul, um die "Verbindung hergestellt"-Kennung auf einem Stream
abzusenden, der nicht ber ISDN arbeitet. Wird zB vom slipto-Programm
verwendet.


Verzeichnisstruktur der Sourcen
===================

alaw/       Streamsmodul fr alaw-Coder.
bin/        fertige Programme (Symlinks)
cards/      Treiber fr Karten.
 dumb/        .. fr dumme Karten (mit Siemens-Chipsatz).
config/     Konfigurationsteil.
fakeh/      "Cisco-HDLC"-Modul.
final/      Installationsteil; final/Makefile wird als letztes aufgerufen
include/    Includedateien (was sonst...)
ip_mon/     TCP/IP-Monitorprogramm nebst Streamstreiber/Modul.
isdn_2/     Schicht-2-Treiber fr ISDN (D-Kanalsteuerung, B-Kanal-Routing).
isdn_3/     Schicht-3-Treiber (1TR6 etc.).
isdn_4/     Steuerprogramm (besagter wilder Hack).
ksupport/   Supportkram fr den Kernel, diverse Streamsmodule,
            Supportcode fr die ISDN-Protokollhandler.
reconnect/  Streamsmodul zum dynamischen Wiederaufbau einer Verbindung.
strslip/    Streamsmodul fr SLIP-Framing.
str_if/     Streamsmodul fr Anbindung an TCP/IP.
support/    Supportkram fr Anwendungsprogramme.
t70/        Streamsmodul fr T-70.
timer/      Streamsmodul zum Trennen einer Verbindung (Timeout).
v110/       Streamsmodul fr V.110. Momentan ungetestet.
van_j/      Streamsmodul fr VanJ-TCP/IP-Headerkompression. Funktioniert
            momentan nur auf gesicherten Verbindungen 100%ig.
x75/        Streamsmodul fr X.75-Handling.


Programme und -Optionen
=======================


isdn_4/master alias bin/isdn
----------------------------

Steuerprogramm fr den gesamten ISDN-Kram.

-d      Debugging; verhindert da das Programm sich selber in den
        Hintergrund setzt.
-f dev  Steuerdevice anstelle von /dev/isdnmon.
-I      Debugbefehle werden von stdin gelesen.
-l      setzt ein strlog-Modul auf die Steuerverbindung. Debugging.
-w      setzt ein logh-Modul auf die programminterne Verbindung zwischen
        dem Treiber im Kernel und dem Masterproze. Debugging.
-L, -W  wie -l / -w, jedoch im Kernel-Log anstatt auf stderr.
-m      schreibt die programminterne Verbindung zwischen Ebene 3 und 4 
        auf stderr mit. Sehr wichtig beim Debuggen.
-M      schreibt diverse andere Debugginginfo nach stderr.
-x file Datei mit (internen) Steuerbefehlen, die nach dem vollstndigen Start
        des ISDN-Krams ausgefhrt wird. Ungetestet.
file... Konfigurationsdateien.


monitor
-------

Protokolliert die vom ip_mon-Modul gemeldeten IP-Daten.
-a      numerische Angabe der lokalen IP-Adressen.
-b      numerische Angabe der entfernten IP-Adressen.
-c      numerische Angabe der IP-Protokolle.
-l      Debugging; setzt strlog-Modul ein.
-n      Die network/services-Dateien werden nicht permanent offengehalten.
-h      Die hosts-Dateien werden nicht permanent offengehalten.
        Das gilt auch fr die Verbindung zum Nameserver.

Monitor kann auch zum Blockieren von IP-Paketen verwendet werden. Das ist
allerdings ungetestet; besser ist es, Firewall-Support in den Kernel
einzubauen. 


slipto
------

Kontrollprogramm fr den TCP/IP-Kram. Macht bei Verwendung mit ISDN _kein_
"slip"; wenn jemand (zB ein Amiga mit KA9Q) auf SLIP besteht, mu das
"slip"-Modul via ML-Zeile explizit eingesetzt werden.

-D       Debugging-Output nach stderr.
-d       eine "Default"-Route zur Gegenseite wird eingerichtet.
-R ip    die IP-Nummer "ip" wird zur Gegenseite geroutet. (route -host)
-r ip    Das IP-Netz "ip" wird zur Gegenseite geroutet. (route -net)
-r ip:nm Das IP-Netz "ip" wird mit der Netmask "nm" zur Gegenseite geroutet.
-x       auf die eigene Adresse wird keine "Route" gesetzt. Dieses Flag
         wird immer dann verwendet, wenn die ISDN-Interfaceadresse dieselbe
         ist wie zB am lokalen Ethernet.
-A arpaddr setzt Proxy-ARP-Adresse f\ur alle Routen zur Gegenstelle.
           Die korrekte "arpaddr" wird von "ifconfig eth0" ausgegeben.
           (Vorsicht beim Wechsel der Ethernetkarte!)

Die folgenden Optionen werden _nicht_ im ISDN-Betrieb verwendet, sondern im
Standalonebetrieb mit anderen Streams-Treibern. Im ISDN-Betrieb werden
diese Optionen nicht verwendet; stattdessen werden die entsprechenden
Module auf der ML-Konfigurationszeile eingetragen bzw. als MP-Optionen
eingestellt.

-L       protokolliert den Dialog zum Modem.
-l       Debugging: setzt qinfo-Modul ein.
-ll       zustzlich count-Modul.
-lll       zustzlich strlog-Modul.
-M       setzt IP-Monitor-Modul ein.
-S       Betrieb auf synchroner Leitung: verwende kein "slip"-Modul.
-E       Autoenable; wenn slipto auf einer bestehenden Verbindung gestartet
         wird.
-o       schickt ATA zur Leitung und wartet auf CONNECT.
-p dev   ffnet Device "dev". (Man verwende "/dev/tty" fr stdin/out.)
-v       verwende Van-Jacobsen-Headerkompression.
-f       verwende Cisco-HDLC-Header.
-m mtu   setzt die MTU auf den angegebenen Wert. (Die MRU ist auf 4000 Bytes
         begrenzt.)

Die folgenden Parameter mssen immer angegeben werden:

ip_loc   lokale IP-Nummer.
         Kann auch auf anderen Interfaces (Ethernet) verwendet werden!
ip_rem   IP-Nummer der Gegenstelle.
         Die beiden Nummern muessen nicht im gleichen Netz sein!

Hackers Corner
==============

Debuggingoptionen:
Das Masterprogramm schickt Debugkram nach stderr und manches andere nach
stdout. Umleiten nach /dev/null wenn's strt; die Debugsachen werden
sukzessive abgestellt, wenn ich mal wieder ein wenig Zeit habe. :-/

Das Debuggingverhalten des Haupttreibers im Kernel lt sich durch die
isdn2_debug- und isdn2_log-Flags steuern; siehe isdn_2/isdn_2.c.

Hinweis: Wenn alles funktioniert, kann man die Debuggerei getrost
abschalten. Allerdings ist dann die Fehlersuche so gut wie unmglich...


Module
======

strlog
------

protokolliert absolut alles mit, was ber dieses Modul an Daten luft.

"xstrlog" macht dasselbe wie "strlog", nur werden DATA-Pakete (also die
eigentlichen bertragenen Informationen) nicht mitgeschrieben.


qinfo
-----

Gibt alle N Sekunden eine Meldung ber den aktuellen Zustand des
Datenstroms vom ISDN-Modul zum Anwendungsprogramm aus. Ntzlich, wenn
man sehen will, wo die Daten hngenbleiben.
:tm      Zeit zwischen Meldungen, in Sekunden.


count
-----

Zhlt mit, wieviele Datenpakete durchlaufen und wie lang diese sind.


Systemmeldungen
===============
Diese werden zwischen dem "proto"-Modul und dem ISDN-Treiber ausgetauscht
und informieren diese und die dazwischenliegenden Module vom Zustand einer
Verbindung.
"->L2" und "->Cmd" deuten an, dass die Meldung in Richtung ISDN-Treiber oder
"proto"-Modul gesendet werden.

in   die Verbindung wird ankommend sein (->Cmd)
ou   die Verbindung wird abgehend sein (->Cmd)
os X Reserviert zustzlichen Pufferplatz am Anfang von Datenblcken.
     (Separat fr beide Richtungen, wird automatisch initiiert.)
     Module inkrementieren X, um die Zahl der Bytes, die sie selbst maximal
     als Header vor die Daten stellen, und reservieren eine entsprechende
     Anzahl beim Anfordern eines neuen Datenblocks.
     "os" signalisiert auerdem, da der Aufbau des Modulstacks abge-
     schlossen ist. Module knnen sich also nach der Weitergabe dieser
     Meldung untereinander unterhalten, wenn ntig.
li   B-Kanal ankommend geschaltet, zB Whlton beim Telefon (->Cmd)
hl   B-Kanal-Durchschaltung akzeptiert (->L2)
co   B-Kanal bidirektional geschaltet (->Cmd)
hc   Verbindung hergestellt (->L2)

wi   Befehl zur Herstellung einer Unterbrechung (->Cmd)
is   Verbindung unterbrechen (->L2)
is   Verbindung ist unterbrochen (->Cmd)
hi   Rckmeldung: Verbindung unterbrochen(->L2)
wd   Befehl zum "sauberen" Abbau der Verbindung(->Cmd)
di   Verbindung abbauen (->L2)
di   Verbindung ist abgebaut (->Cmd)
hd   Rckmeldung: Verbindung ist getrennt, evtl wird NO CARRIER gemeldet.

Wer beobachten will, wie genau diese Meldungen transpoortiert werden,
verwende ein xstrlog-Modul.


Euro-ISDN: Bearer Capability und andere Feinheiten
=========

Die Informationselemente sind in mehrere Blcke aufgeteilt. Jeder Block
wird dadurch begrenzt, da das hchstwertige Bit auf 1 steht. Die
weggelassenen Bytes haben Defaultwerte. Ich fhre hier die wichtigsten
Codierungen auf; der Rest steht in der Q.931. 

1  1AABBBBB      AA       Codierungsstandard
                 00       CCITT
                 BBBBB    Datenformat
                 00000    Sprache
                 01000    digitale Daten
                 10000    Audio, 3.1 kHz
2  1AABBBBB      AA       Modus
                 00       Standard
                 BBBBB    bertragungsgeschwindigkeit
                 10000    64 kBit
3  x01AAAAA      AAAAA    Schicht-1-Protokoll
                 00001    V.110
                 00011    A-law Audio 
                 01000    V.120
                 01001    X.31 mit HDLC-Flags.

Hinter einem Hexstring kann ein weiterer String angegeben werden, der als
Maske dient, welche Bits bei ankommenden Rufen beachtet werden. Die hchst-
wertigen Bits haben dieselbe Bedeutung wie oben und knnen zum Abkrzen
verwendet werden. Siehe support/vectcmp.c.

Beispiel:
:vB 9090A3 EFFFFF   -- Sprache oder 3.1kHz Audio, fr den Anrufbeantworter
:vB 8890            -- (alle Bits signifikant) entspricht :sv 0700, fr
                       Datenverbindungen aus dem 1TR6-Raum

[ Falls jemand anders den Rest der relevanten Teile der Q.931 abtippen
  will, nur zu... ]

Ansonsten: Sich von der Gegenstelle anrufen zu lassen und die betreffenden
Daten einfach einzutragen ist wohl die einfachste Methode.


Karten mit CAPI: Die CAPI ist doof...
===============

Im Internet heit es in so gut wie jedem RFC, da reservierte Bits beim
Senden auf Null zu setzen und beim Empfangen zu ignorieren sind. Nicht so
in der CAPI 1.1, dort sind gesetzte reservierte Bits ein Grund fr eine
Fehlermeldung. Da aber nirgends definiert oder abfragbar ist, welche Bits
eigentlich erlaubt sind, ist es so gut wie unmglich, ohne Ratespiel neue
Features zu untersttzen...

Wie dem auch sei, die Infobits haben folgende Bedeutung:
00000001  Gebhreneinheiten
00000002  Datum
00000004  Display
00000008  User-User Info
00000010  Cause
00000020  Status des gerufenen Teilnehmers
00000040  Rufnummernbergabe (Anlagenanschlu)
00000080...
20000000  reserviert
40000000  SPVs
80000000  Festverbindungen

Die EAZ-Bits:
0001  Null ("Global Call", wird aber nicht besonders behandelt)
0002  Eins ...
0200  Neun
0400...
8000  reserviert

Die Dienstkennungen, entsprechend :sv 00xx ... 0Fxx:
0001  Bildtelefon
0002  Telefonie
0004  a/b-Dienste
0008  X.21-Dienste
0010  Telefax Gruppe 4
0020  BTX, 64 KBit/sec
0040  ?
0080  DF
0100  X.25
0200  Teletext
0400  Mixed Mode
0800  ?
1000  ?
2000  Fernwirken
4000  Grafiktelefon
8000  BTX (CEPT-Standard)

Ankommende Rufe, die zu diesen EAZs und Diensten passen, werden
durchgereicht (und die angeforderten Informationen werden gemeldet, wenn
die Vermittlung sie sendet(!)); andere Rufe werden ignoriert.


Bugs anderer Leute
==================

(1)
An manchen Nebenstellenanlagen werden ankommende Rufe teilweise mit,
teilweise ohne der zum Rauswhlen notwendigen Null ausgeliefert.

Das liegt an der Quelle der Anrufe; die Telekom signalisiert 1TR6-Anrufe
etwas anders als Euro-ISDN (ist aber beides legal), die Telefonanlage setzt
aber nur eine Version korrekt um.

Workaround: Keiner.
Bugfix: Hersteller krftig treten.

