ChargeInt-Homepage

Version 1.03

von Georg v.Zezschwitz - just my 0.02$

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)

Übersicht

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).

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:

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.

Ü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

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: Angenommen, der Kernel liegt in /usr/src/linux und isdn4kutils in /usr/src/isdn4k-utils-2.0, die Patche selbst im Home-Verzeichnis, dann reichen folgende Befehle:
cd /usr/src
patch -p0 -l -F10 < ~/patch-chargeint-2.04
rm -rf isdn4k-utils-2.0/isdn/RCS
patch -p0 -l ~/patch-chargeint-kutils
Der 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
und anschließend
make clean
make install
geben. Wer bei dieser Gelegenheit den Kernel zum ersten Mal kompiliert, mache bitte nicht ChargeInt verantwortlich, wenn es nicht klappt!

Wie konfiguriere ich ChargeInt?

Parameter für die Hangup-Kontrolle

Das Gebührenintervall wird über den Parameter chargeint mitgeteilt. Der Parameter huptimeout erhält eine andere Bedeutung: 2 Sekunden, bevor die nächste Einheit fällig wird, prüft Chargeint, ob in den letzten huptimeout Sekunden kein Traffic war. Bei "Stille" wird aufgelegt, sonst weitergemacht. Man könnte auch anders sagen: Durch Chargeint wird der huptimeout-Parameter nur kurz vor Ablauf der Gebühreneinheit abgefragt.

Ich setze bei Cityverbindungen huptimeout auf 5 Sekunden, bei Fernverbindungen auf 3 Sekunden.

Betrieb mit Steuerung durch isdnlog

Am komfortabelsten läßt sich ChargeInt durch isdnlog steuern, wenn isdnlog mit -DCHARGEINT kompiliert wurde. Andreas Kool hat im Juli 96 isdnlog so modifiziert, daß isdnlog selbständig beim Aufbau einer Verbindung berechnet, welche Taktzeit zur Zeit von der Telekom vorgegeben wird und diese setzt. Otto Normaluserin muß sich also nur noch darum kümmern, daß Wer bei der eierlegenden Vollmichsau isdnlog den Überblick über die Optionen verliert, kann ja erstmal meine nehmen:
isdnlog -m208 -C/dev/tty8 -h0 -t2 /dev/isdnctrl
Damit wird zwar noch nicht die Kaffeemaschine eingeschaltet, wenn der Weckruf der Telekom reinkommt, aber immerhin: Mysteriöse Abstürze von isdnlog sind fast immer Ursache

Betrieb unabhängig von isdnlog

isdnlog funktioniert, wenn man ihn richtig konfiguriert und als HiSaxler auf 2.51 geupgraded hat. Und es gibt viele schöne Archive wie www.dejanews.com, die einem gerne die Postings der Vorgänger, die Probleme mit isdnlog hatten, heraussuchen (mitsamt der Antworten, wie's richtig geht.). Es gibt also eigentlich keinen Grund, unabhängig von isdnlog ChargeInt zu betreiben.

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 4
In 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.

Flexible Syntax für isdnctrl

Als ich den chargeint-Parameter in isdnctrl einbauen wollte, juckte es mich in den Fingern, das Ding gleich ein bißchen umzuschreiben. Mein ISDN-Router daheim ist ein 386DX40, und die endlos vielen isdnctrl-Befehle beim Booten, die die 5 ISDN-Verbindungen eintragen, brauchten ihre Zeit. Daher habe ich eine Möglichkeit eingebaut, mehrere Parameter auf einmal setzen zu können. Auch hier gilt die Abwärtskompatibilität, wer also nur einen Parameter ändern will, schreibt:
isdnctrl chargeint isdn 90
Z.B. beim Booten sind aber auch solche Anweisungen möglich:
isdnctrl l2_prot isdn0 hdlc eaz 232282 addphone in 40110 40112 out 2519612 huptimeout 5
Wä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


Anregungen und Kritik: gvz@garnix.de (Georg v.Zezschwitz)