Im Originalkernel Linux 2.0.29 (bzw. folgende) ist Chargeint nicht enthalten. Wer aber den Patch ftp://ftp.franken.de/pub/isdn4linux/isdn4kernel-2.0.29.gz und folgende einspielt, hat ChargeInt damit mit installiert. Um aber die Erweiterungen für isdnctrl zu nutzen, muß weiterhin der Patch für die Utilities benutzt werden (patch-chargeint-kutils)
2. Beispiel: Schluß mit dem Surfen, dem Ernst des Lebens
wieder zuwenden. Da gibt man gerne noch schnell ein
isdnctrl hangup isdn0, um sicher zu sein, daß
isdn4linux die Leitung nicht noch in die nächste Einheit
rein hält, also wegen eines "zu langen" huptimeout eine
weitere Einheit beginnt.
Diese beiden Beispiele machen klar, was das Sinnvollste wäre:
Überflüssig ist ChargeInt auch, wenn z.B. Daten im Batch-Betrieb
(UUCP über TCP/IP) abgeholt werden und anschließend explizit
aufgelegt wird.
Falsch ist ChargeInt dann, wenn eine Wiederanwahl so zeitaufwendig wäre,
daß sie in keiner Relation zu den Mehrkosten für eine
kontinuierliche Verbindung steht.
ChargeInt ist ideal für Leute, die
Was ist ChargeInt?
ChargeInt besteht aus einem Patch für den ISDN-Teil der Linux-Kernels und
einem Patch für isdn4kutils. Er führt einen weiteren
Parameter für isdnctrl ein: den ChargeInt-Parameter.
Mit dem ChargeInt-Parameter wird das aktuelle Gebührenintervall
einer bestimmten Verbindung angegeben, z.B. auf 90 Sekunden.
Wie wirkt ChargeInt?
Kennen Sie den? isdn4linux läuft und läuft
stabil (!) und die Hangup-Time ist auf 40 Sekunden konfiguriert. Unser
Provider liegt in der Ortszone, es ist Freitag 19 Uhr. Eine eMail kommt
vom Provider rein, und man möchte kurz mit zwei Zeilen antworten.
Dann bleiben 40 Sekunden, um noch schnell innerhalb der gleichen
Einheit antworten zu können - also noch bevor isdn4linux
nach 40 Sekunden Inaktivität auf der Leitung auflegt. Besser
wäre, isdn4linux würde die Leitung exakt 149 Sekunden
halten (150 Sekunden Tarifzone).
Mit der folgenden Schmuddelgrafik habe ich versucht, das Ganze auf
die Schnelle zu demonstrieren. Dargestellt mit der blauen Linie
ist die Aktivität; auf der Leitung, z.B. beim Surfen. Die Grafik
bildet etwa 120 Sekunden ab. Die roten Linien zeigen an, zu welchem
Zeitpunkt bei verschiedenen Konfigurationen die Leitung auf- und
abgebaut wird. Angenommen sei, es handelt sich um einen Datenverbindung
(werk)tagsüber in der City (90 Sekunden Gebührenintervall):

Wann sollte ich ChargeInt (nicht) einsetzen?
Generell spricht nichts dagegen, ChargeInt einzukompilieren. Der Patch
ist "abwärtskompatibel", d.h., wer nicht explizit per Hand oder Programm
ein
isdnctrl device chargeint Takt
gibt, wird keinerlei Änderungen feststellen. Zudem enthät der
Patch für isdnctrl die nette Möglichkeit, mit einem
einzigen isdnctrl-Befehl gleich etliche Parameter auf einmal
setzen zu können.
Warum ist ChargeInt dann nicht im Kernel?
Aus guten Gründen sind alle Linux-Entwickler/innen vorsichtig, Patches
von "irgendwem" in ihren Tree aufzunehmen. Und ich hätte auch nicht
gewollt, einen Bug-Teil zu 2.0.0 beizutragen. Da ich bisher aber noch
keinen einzigen Bug-Report bekommen habe, denke ich, daß ChargeInt
so langsam ausgereift ist :-).
Wann sollte ich ChargeInt (nicht) aktivieren?
Wer mit synchronem PPP arbeitet und eine dynamische IP bezieht, dürfte
ein Verhalten wünschen, wie es Otto-Normal-Dumm-Windows-User praktiziert:
Explizit Verbindung aufbauen, Rumsurfen, explizit Verbindung aufbauen.
Zum einen kann etwa eine FTP-Session nicht ohne weiteres bei dynamischer
IP-Vergabe fortgesetzt werden, da sich die einem selbst zugewiesene
IP-Adresse bei einer erneuten Anwahl ändert. Dies gilt für
alle TCP-Verbindungen (z.B. Telnet, rlogin). Wer mit dynamischer
IP-Adressvergabe leben muß, wird grundsätzlich seine Verbindung
während einer Sitzung stehen lassen wollen und eher noch einen
ping starten, damit auch die Gegenseite nicht auflegt. Für
diese User/innen ist ChargeInt also überflüssig.
Wie patche ich ChargeInt ein?
Wo liegt ChargeInt?
Wer sich
isdnlog-2.50 holt (Achtung: HiSax-Benutzer benötigen
den für isdnlog-2.50 den Patch auf 2.51), bekommt ChargeInt gleich
mit:
# tar tzf isdnlog-2.50.tar.gz | grep chargeint
0 Aug 24 12:06 1996 isdnlog-2.50/contrib/chargeint/
7777 Jul 10 19:55 1996 isdnlog-2.50/contrib/chargeint/patch-chargeint-2.04
30029 Jul 10 19:56 1996 isdnlog-2.50/contrib/chargeint/patch-chargeint-kutils
Die gleichen Dateien kann man auch seperat holen:
cd /usr/src patch -p0 -l -F10 < ~/patch-chargeint-2.04 rm -rf isdn4k-utils-2.0/isdn/RCS patch -p0 -l ~/patch-chargeint-kutilsDer patch-chargeint-2.04 wurde ursprünglich gegen Linux 2.0.4 erzeugt, klappt aber mit dem -F10 -l auch bei neueren Kerneln (auch 2.0.26, vielen Dank an Andreas Kool für den Tip). Wer isdnlog einsetzt, sollte nun in der Makefile im Hauptverzeichnis von isdnlog-2.50 in Zeile 50 folgendes ändern:
| alt: | COPTS = -O3 |
| neu: | COPTS = -O3 -DCHARGEINT |
make clean make installgeben. Wer bei dieser Gelegenheit den Kernel zum ersten Mal kompiliert, mache bitte nicht ChargeInt verantwortlich, wenn es nicht klappt!
Ich setze bei Cityverbindungen huptimeout auf 5 Sekunden, bei Fernverbindungen auf 3 Sekunden.
isdnlog -m208 -C/dev/tty8 -h0 -t2 /dev/isdnctrlDamit wird zwar noch nicht die Kaffeemaschine eingeschaltet, wenn der Weckruf der Telekom reinkommt, aber immerhin:
Die Alternative ist, z.B. per crontab-Eintrag die Chargeint- Zeiten zu manipulieren. Dafür hatte ich vor der Anpassung von isdnlog ein schönes Skript. Es benötigt eine Datei /etc/isdn-ifs, die z.B. so aussieht:
isdncity 1 isdnr50 2 isdnr200 3 isdnfern 4In diesem Beispiel haben wir vier Interfaces definiert, die in den Tarifregionen City, Regio 50, Regio 200 und Fern liegen (und komischerweise genauso heißen :-)). Mit folgendem Skript, daß bei mir unter /usr/local/bin/isdnchargeset liegt, wird nun das Gebührenintervall für alle in /etc/isdn-ifs angegebenen Verbindungen auf den aktuellen Wert gesetzt.
#!/bin/sh
# Erste Zahl: Tarifbereich: 1=City, 2=Region50, 3=Region200, 4=Fern
# Zweite Zahl: Wochentag: 1=Werktag, 2=Wochenende
# Dritte Zahl: Uhrzeit: 1=Vormittag, 2=Nachmittag, 3=Freizeit, 4=Mondschein, 5=Nacht
awk ' { tarif ["111"] = "90";
tarif ["112"] = "90";
tarif ["113"] = "150";
tarif ["114"] = "240";
tarif ["115"] = "240";
tarif ["121"] = "150";
tarif ["122"] = "150";
tarif ["123"] = "150";
tarif ["124"] = "240";
tarif ["125"] = "240";
tarif ["211"] = "25";
tarif ["212"] = "30";
tarif ["213"] = "45";
tarif ["214"] = "60";
tarif ["215"] = "120";
tarif ["221"] = "45";
tarif ["222"] = "45";
tarif ["223"] = "45";
tarif ["224"] = "60";
tarif ["225"] = "60";
tarif ["311"] = "13";
tarif ["312"] = "14";
tarif ["313"] = "22";
tarif ["314"] = "36";
tarif ["315"] = "120";
tarif ["321"] = "22";
tarif ["322"] = "22";
tarif ["323"] = "22";
tarif ["324"] = "36";
tarif ["325"] = "36";
tarif ["411"] = "12";
tarif ["412"] = "13";
tarif ["413"] = "21";
tarif ["414"] = "30";
tarif ["415"] = "120";
tarif ["421"] = "21";
tarif ["422"] = "21";
tarif ["423"] = "21";
tarif ["424"] = "30";
tarif ["425"] = "30";
zone = $2 + 0;
day = strftime ("%w") + 0;
if (day==0 || day==6) tag="2" ; else tag="1";
zeit = substr("445553333111222222333444", strftime ("%H")+1, 1);
interval = tarif [zone tag zeit];
if (interval + 0 > 0) system ("/sbin/isdnctrl chargeint "$1" "interval);
}' < /etc/isdn-ifs
Wer nun das Skript beim Booten und zu jeder vollen Stunde aufruft, hat
seine Interfaces stets auf den korrekten Werten stehen.
isdnctrl chargeint isdn 90Z.B. beim Booten sind aber auch solche Anweisungen möglich:
isdnctrl l2_prot isdn0 hdlc eaz 232282 addphone in 40110 40112 out 2519612 huptimeout 5Während also die Syntax für das erste Kommando unverändert
Kommando isdn-device (Parameter 1) (Parameter 2)
lautet, wird bei folgenden Kommandos im Aufruf von isdnctrl das Isdn-Device weggelassen.
Allgemein
Diese Seite ist nur zur Dokumentation von ChargeInt gedacht. Für
allgemeine Hilfen zum Einrichten von isdn4linux finde ich die
Seiten von Bernhard Hailer am geeignetsten