1
linux/Documentation/isdn
Alan Cox 89a056df78 Rationalise Randy's address a bit
Acked-by: Randy Dunlap <rdunlap@xenotime.net>
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-10-30 11:38:47 -07:00
..
00-INDEX
CREDITS Rationalise Randy's address a bit 2008-10-30 11:38:47 -07:00
HiSax.cert
INTERFACE
INTERFACE.fax
README
README.act2000
README.audio
README.avmb1
README.concap spelling fixes: Documentation/ 2007-10-20 01:30:25 +02:00
README.diversion
README.FAQ
README.fax
README.gigaset
README.hfc-pci
README.HiSax
README.hysdn
README.icn
README.mISDN Add mISDN driver 2008-07-27 01:46:33 +02:00
README.pcbit
README.sc
README.syncppp
README.x25
syncPPP.FAQ

README for the ISDN-subsystem

1. Preface

  1.1 Introduction

  This README describes how to set up and how to use the different parts
  of the ISDN-subsystem.

  For using the ISDN-subsystem, some additional userlevel programs are
  necessary. Those programs and some contributed utilities are available
  at

   ftp.isdn4linux.de

   /pub/isdn4linux/isdn4k-utils-<VersionNumber>.tar.gz


  We also have set up a mailing-list:

   The isdn4linux-project originates in Germany, and therefore by historical
   reasons, the mailing-list's primary language is german. However mails
   written in english have been welcome all the time.

   to subscribe: write a email to majordomo@listserv.isdn4linux.de,
   Subject irrelevant, in the message body:
   subscribe isdn4linux <your_email_address>

   To write to the mailing-list, write to isdn4linux@listserv.isdn4linux.de

   This mailinglist is bidirectionally gated to the newsgroup

     de.alt.comm.isdn4linux

  There is also a well maintained FAQ in English available at
     http://www.mhessler.de/i4lfaq/
  It can be viewed online, or downloaded in sgml/text/html format.
  The FAQ can also be viewed online at
     http://www.isdn4inux.de/faq/
  or downloaded from
     ftp://ftp.isdn4linux.de/pub/isdn4linux/FAQ/

  1.1 Technical details

  In the following Text, the terms MSN and EAZ are used.

  MSN is the abbreviation for (M)ultiple(S)ubscriber(N)umber, and applies
  to Euro(EDSS1)-type lines. Usually it is simply the phone number.

  EAZ is the abbreviation of (E)ndgeraete(A)uswahl(Z)iffer and
  applies to German 1TR6-type lines. This is a one-digit string,
  simply appended to the base phone number

  The internal handling is nearly identical, so replace the appropriate
  term to that one, which applies to your local ISDN-environment.

  When the link-level-module isdn.o is loaded, it supports up to 16
  low-level-modules with up to 64 channels. (The number 64 is arbitrarily
  chosen and can be configured at compile-time --ISDN_MAX in isdn.h).
  A low-level-driver can register itself through an interface (which is
  defined in isdnif.h) and gets assigned a slot.
  The following char-devices are made available for each channel:

  A raw-control-device with the following functions:
     write: raw D-channel-messages (format: depends on driver).
     read:  raw D-channel-messages (format: depends on driver).
     ioctl: depends on driver, i.e. for the ICN-driver, the base-address of
            the ports and the shared memory on the card can be set and read
            also the boot-code and the protocol software can be loaded into
            the card.

   O N L Y !!!  for debugging (no locking against other devices):
   One raw-data-device with the following functions:
     write: data to B-channel.
     read:  data from B-channel.

   In addition the following devices are made available:

   128 tty-devices (64 cuix and 64 ttyIx) with integrated modem-emulator:
   The functionality is almost the same as that of a serial device
   (the line-discs are handled by the kernel), which lets you run
   SLIP, CSLIP and asynchronous PPP through the devices. We have tested
   Seyon, minicom, CSLIP (uri-dip) PPP, mgetty, XCept and Hylafax. 

   The modem-emulation supports the following:
           1.3.1 Commands:

               ATA      Answer incoming call.
               ATD<No.> Dial, the number may contain:
                        [0-9] and [,#.*WPT-S]
                        the latter are ignored until 'S'.
                        The 'S' must precede the number, if
                        the line is a SPV (German 1TR6).
               ATE0     Echo off.
               ATE1     Echo on (default).
               ATH      Hang-up.
               ATH1     Off hook (ignored).
               ATH0     Hang-up.
               ATI      Return "ISDN for Linux...".
               ATI0        "
               ATI1        "
               ATI2     Report of last connection.
               ATO      On line (data mode).
               ATQ0     Enable result codes (default).
               ATQ1     Disable result codes (default).
               ATSx=y   Set register x to y.
               ATSx?    Show contents of register x.
               ATV0     Numeric responses.
               ATV1     English responses (default).
               ATZ      Load registers and EAZ/MSN from Profile.
               AT&Bx    Set Send-Packet-size to x (max. 4000)
                        The real packet-size may be limited by the
                        low-level-driver used. e.g. the HiSax-Module-
                        limit is 2000. You will get NO Error-Message,
                        if you set it to higher values, because at the
                        time of giving this command the corresponding
                        driver may not be selected (see "Automatic
                        Assignment") however the size of outgoing packets
                        will be limited correctly.
               AT&D0    Ignore DTR
               AT&D2    DTR-low-edge: Hang up and return to
                        command mode (default).
               AT&D3    Same as AT&D2 but also resets all registers.
               AT&Ex    Set the EAZ/MSN for this channel to x.
               AT&F     Reset all registers and profile to "factory-defaults"
               AT&Lx    Set list of phone numbers to listen on.  x is a
                        list of wildcard patterns separated by semicolon.
                        If this is set, it has precedence over the MSN set
                        by AT&E.
               AT&Rx    Select V.110 bitrate adaption.
                        This command enables V.110 protocol with 9600 baud
                        (x=9600), 19200 baud (x=19200) or 38400 baud
                        (x=38400). A value of x=0 disables V.110 switching
                        back to default X.75. This command sets the following
                        Registers:
                          Reg 14 (Layer-2 protocol):
                            x = 0:     0
                            x = 9600:  7
                            x = 19200: 8
                            x = 38400: 9
                          Reg 18.2 = 1
                          Reg 19 (Additional Service Indicator):
                            x = 0:       0
                            x = 9600:  197
                            x = 19200: 199
                            x = 38400: 198
                          Note on value in Reg 19:
                            There is _NO_ common convention for 38400 baud.
                            The value 198 is chosen arbitrarily. Users
                            _MUST_ negotiate this value before establishing
                            a connection.
               AT&Sx    Set window-size (x = 1..8) (not yet implemented)
               AT&V     Show all settings.
               AT&W0    Write registers and EAZ/MSN to profile. See also
                        iprofd (5.c in this README).
               AT&X0    BTX-mode and T.70-mode off (default)
               AT&X1    BTX-mode on. (S13.1=1, S13.5=0 S14=0, S16=7, S18=7, S19=0)
               AT&X2    T.70-mode on. (S13.1=1, S13.5=1, S14=0, S16=7, S18=7, S19=0)
               AT+Rx    Resume a suspended call with CallID x (x = 1,2,3...)
               AT+Sx    Suspend a call with CallID x (x = 1,2,3...)

           For voice-mode commands refer to README.audio

           1.3.2 Escape sequence:
               During a connection, the emulation reacts just like
               a normal modem to the escape sequence <DELAY>+++<DELAY>.
               (The escape character - default '+' - can be set in the
               register 2).
               The DELAY must at least be 1.5 seconds long and delay
               between the escape characters must not exceed 0.5 seconds.

           1.3.3 Registers:

              Nr.  Default  Description
              0    0        Answer on ring number.
                            (no auto-answer if S0=0).
              1    0        Count of rings.
              2    43       Escape character.
                            (a value >= 128 disables the escape sequence).
              3    13       Carriage return character (ASCII).
              4    10       Line feed character (ASCII).
              5    8        Backspace character (ASCII).
              6    3        Delay in seconds before dialing.
              7    60       Wait for carrier.
              8    2        Pause time for comma (ignored)
              9    6        Carrier detect time (ignored)
             10    7        Carrier loss to disconnect time (ignored).
             11    70       Touch tone timing (ignored).
             12    69       Bit coded register:
                            Bit 0:    0 = Suppress response messages.
                                      1 = Show response messages.
                            Bit 1:    0 = English response messages.
                                      1 = Numeric response messages.
                            Bit 2:    0 = Echo off.
                                      1 = Echo on.
                            Bit 3     0 = DCD always on.
                                      1 = DCD follows carrier.
                            Bit 4     0 = CTS follows RTS
                                      1 = Ignore RTS, CTS always on.
                            Bit 5     0 = return to command mode on DTR low.
                                      1 = Same as 0 but also resets all
                                          registers.
                                      See also register 13, bit 2
                            Bit 6     0 = DSR always on.
                                      1 = DSR only on if channel is available.
                            Bit 7     0 = Cisco-PPP-flag-hack off (default).
                                      1 = Cisco-PPP-flag-hack on.
             13   0         Bit coded register:
                            Bit 0:    0 = Use delayed tty-send-algorithm
                                      1 = Direct tty-send.
                            Bit 1:    0 = T.70 protocol (Only for BTX!) off
                                      1 = T.70 protocol (Only for BTX!) on
                            Bit 2:    0 = Don't hangup on DTR low.
                                      1 = Hangup on DTR low.
                            Bit 3:    0 = Standard response messages
                                      1 = Extended response messages
                            Bit 4:    0 = CALLER NUMBER before every RING.
                                      1 = CALLER NUMBER after first RING.
                            Bit 5:    0 = T.70 extended protocol off
                                      1 = T.70 extended protocol on
                            Bit 6:    0 = Special RUNG Message off
                                      1 = Special RUNG Message on
                                          "RUNG" is delivered on a ttyI, if
                                          an incoming call happened (RING) and
                                          the remote party hung up before any
                                          local ATA was given.
			    Bit 7:    0 = Don't show display messages from net
                                      1 = Show display messages from net
				          (S12 Bit 1 must be 0 too)      
             14   0         Layer-2 protocol:
                                      0 = X75/LAPB with I-frames
                                      1 = X75/LAPB with UI-frames
                                      2 = X75/LAPB with BUI-frames
                                      3 = HDLC
                                      4 = Transparent (audio)
                                      7 = V.110, 9600 baud
                                      8 = V.110, 19200 baud
                                      9 = V.110, 38400 baud
                                     10 = Analog Modem (only if hardware supports this)
                                     11 = Fax G3 (only if hardware supports this)
             15   0         Layer-3 protocol:
                                      0 = transparent
                                      1 = transparent with audio features (e.g. DSP)
                                      2 = Fax G3 Class 2 commands (S14 has to be set to 11)
                                      3 = Fax G3 Class 1 commands (S14 has to be set to 11)
             16   250       Send-Packet-size/16
             17   8         Window-size (not yet implemented)
             18   4         Bit coded register, Service-Octet-1 to accept,
                            or to be used on dialout:
                            Bit 0:    Service 1 (audio) when set.
                            Bit 1:    Service 5 (BTX) when set.
                            Bit 2:    Service 7 (data) when set.
                            Note: It is possible to set more than one
                                  bit. In this case, on incoming calls
                                  the selected services are accepted,
                                  and if the service is "audio", the
                                  Layer-2-protocol is automatically
                                  changed to 4 regardless of the setting
                                  of register 14. On outgoing calls,
                                  the most significant 1-bit is chosen to
                                  select the outgoing service octet.
             19   0         Service-Octet-2
             20   0         Bit coded register (readonly)
                            Service-Octet-1 of last call.
                            Bit mapping is the same as register 18
             21   0         Bit coded register (readonly)
                            Set on incoming call (during RING) to
                            octet 3 of calling party number IE (Numbering plan)
                            See section 4.5.10 of ITU Q.931
             22   0         Bit coded register (readonly)
                            Set on incoming call (during RING) to
                            octet 3a of calling party number IE (Screening info)
                            See section 4.5.10 of ITU Q.931
             23   0         Bit coded register:
                            Bit 0:    0 = Add CPN to RING message off
                                      1 = Add CPN to RING message on
                            Bit 1:    0 = Add CPN to FCON message off
                                      1 = Add CPN to FCON message on
                            Bit 2:    0 = Add CDN to RING/FCON message off
                                      1 = Add CDN to RING/FCON message on

  Last but not least a (at the moment fairly primitive) device to request
  the line-status (/dev/isdninfo) is made available.

  Automatic assignment of devices to lines:

  All inactive physical lines are listening to all EAZs for incoming
  calls and are NOT assigned to a specific tty or network interface.
  When an incoming call is detected, the driver looks first for a network
  interface and then for an opened tty which:

  1. is configured for the same EAZ.
  2. has the same protocol settings for the B-channel.
  3. (only for network interfaces if the security flag is set)
     contains the caller number in its access list.
  4. Either the channel is not bound exclusively to another Net-interface, or
     it is bound AND the other checks apply to exactly this interface.
     (For usage of the bind-features, refer to the isdnctrl-man-page)

  Only when a matching interface or tty is found is the call accepted
  and the "connection" between the low-level-layer and the link-level-layer
  is established and kept until the end of the connection.
  In all other cases no connection is established. Isdn4linux can be
  configured to either do NOTHING in this case (which is useful, if
  other, external devices with the same EAZ/MSN are connected to the bus)
  or to reject the call actively. (isdnctrl busreject ...)

  For an outgoing call, the inactive physical lines are searched.
  The call is placed on the first physical line, which supports the
  requested protocols for the B-channel. If a net-interface, however
  is pre-bound to a channel, this channel is used directly.

  This makes it possible to configure several network interfaces and ttys
  for one EAZ, if the network interfaces are set to secure operation.
  If an incoming call matches one network interface, it gets connected to it.
  If another incoming call for the same EAZ arrives, which does not match
  a network interface, the first tty gets a "RING" and so on.

2 System prerequisites:

  ATTENTION!

  Always use the latest module utilities. The current version is
  named in Documentation/Changes. Some old versions of insmod
  are not capable of setting the driver-Ids correctly.

3. Lowlevel-driver configuration.

   Configuration depends on how the drivers are built. See the
   README.<yourDriver> for information on driver-specific setup.

4. Device-inodes

   The major and minor numbers and their names are described in
   Documentation/devices.txt. The major numbers are:

     43 for the ISDN-tty's.
     44 for the ISDN-callout-tty's.
     45 for control/info/debug devices.

5. Application

   a) For some card-types, firmware has to be loaded into the cards, before
      proceeding with device-independent setup. See README.<yourDriver>
      for how to do that.

   b) If you only intend to use ttys, you are nearly ready now.

   c) If you want to have really permanent "Modem"-settings on disk, you
      can start the daemon iprofd. Give it a path to a file at the command-
      line. It will store the profile-settings in this file every time
      an AT&W0 is performed on any ISDN-tty. If the file already exists,
      all profiles are initialized from this file. If you want to unload
      any of the modules, kill iprofd first.

   d) For networking, continue: Create an interface:
       isdnctrl addif isdn0

   e) Set the EAZ (or MSN for Euro-ISDN):
       isdnctrl eaz isdn0 2

     (For 1TR6 a single digit is allowed, for Euro-ISDN the number is your
      real MSN e.g.: Phone-Number)

   f) Set the number for outgoing calls on the interface:
       isdnctrl addphone isdn0 out 1234567
       ... (this can be executed more than once, all assigned numbers are
            tried in order)
      and the number(s) for incoming calls:
       isdnctrl addphone isdn0 in 1234567

   g) Set the timeout for hang-up:
       isdnctrl huptimeout isdn0 <timeout_in_seconds>

   h) additionally you may activate charge-hang-up (= Hang up before
      next charge-info, this only works, if your isdn-provider transmits
      the charge-info during and after the connection):
       isdnctrl chargehup isdn0 on

   i) Set the dial mode of the interface:
       isdnctrl dialmode isdn0 auto
      "off" means that you (or the system) cannot make any connection
        (neither incoming or outgoing connections are possible). Use
        this if you want to be sure that no connections will be made.
      "auto" means that the interface is in auto-dial mode, and will
        attempt to make a connection whenever a network data packet needs
        the interface's link. Note that this can cause unexpected dialouts,
        and lead to a high phone bill! Some daemons or other pc's that use
        this interface can cause this.
        Incoming connections are also possible.
      "manual" is a dial mode created to prevent the unexpected dialouts.
        In this mode, the interface will never make any connections on its
        own. You must explicitly initiate a connection with "isdnctrl dial
        isdn0". However, after an idle time of no traffic as configured for
	the huptimeout value with isdnctrl, the connection _will_ be ended.
	If you don't want any automatic hangup, set the huptimeout value to 0.
        "manual" is the default.

   j) Setup the interface with ifconfig as usual, and set a route to it.

   k) (optional) If you run X11 and have Tcl/Tk-wish version 4.0, you can use
     the script tools/tcltk/isdnmon. You can add actions for line-status
     changes. See the comments at the beginning of the script for how to
     do that. There are other tty-based tools in the tools-subdirectory
     contributed by Michael Knigge (imon), Volker Götz (imontty) and
     Andreas Kool (isdnmon).

   l) For initial testing, you can set the verbose-level to 2 (default: 0).
      Then all incoming calls are logged, even if they are not addressed
      to one of the configured net-interfaces:
      isdnctrl verbose 2

  Now you are ready! A ping to the set address should now result in an
  automatic dial-out (look at syslog kernel-messages).
  The phone numbers and EAZs can be assigned at any time with isdnctrl.
  You can add as many interfaces as you like with addif following the
  directions above. Of course, there may be some limitations. But we have
  tested as many as 20 interfaces without any problem. However, if you
  don't give an interface name to addif, the  kernel will assign a name
  which starts with "eth". The number of "eth"-interfaces is limited by
  the kernel.

5. Additional options for isdnctrl:

   "isdnctrl secure <InterfaceName> on"
   Only incoming calls, for which the caller-id is listed in the access
   list of the interface are accepted. You can add caller-id's With the
   command "isdnctrl addphone <InterfaceName> in <caller-id>"
   Euro-ISDN does not transmit the leading '0' of the caller-id for an
   incoming call, therefore you should configure it accordingly.
   If the real number for the dialout e.g. is "09311234567" the number
   to configure here is "9311234567". The pattern-match function
   works similar to the shell mechanism.

     ?     one arbitrary digit
     *     zero or arbitrary many digits
     [123] one of the digits in the list
     [1-5] one digit between '1' and '5'
           a '^' as the first character in a list inverts the list


   "isdnctrl secure <InterfaceName> off"
   Switch off secure operation (default).

   "isdnctrl ihup <InterfaceName> [on|off]"
   Switch the hang-up-timer for incoming calls on or off.

   "isdnctrl eaz <InterfaceName>"
   Returns the EAZ of an interface.

   "isdnctrl delphone <InterfaceName> in|out <number>"
   Deletes a number from one of the access-lists of the interface.

   "isdnctrl delif <InterfaceName>"
   Removes the interface (and possible slaves) from the kernel.
   (You have to unregister it with "ifconfig <InterfaceName> down" before).

   "isdnctrl callback <InterfaceName> [on|off]"
   Switches an interface to callback-mode. In this mode, an incoming call
   will be rejected and after this the remote-station will be called. If
   you test this feature by using ping, some routers will re-dial very
   quickly, so that the callback from isdn4linux may not be recognized.
   In this case use ping with the option -i <sec> to increase the interval
   between echo-packets.

   "isdnctrl cbdelay <InterfaceName> [seconds]"
   Sets the delay (default 5 sec) between an incoming call and start of
   dialing when callback is enabled.

   "isdnctrl cbhup <InterfaceName> [on|off]"
   This enables (default) or disables an active hangup (reject) when getting an
   incoming call for an interface which is configured for callback.

   "isdnctrl encap <InterfaceName> <EncapType>"
   Selects the type of packet-encapsulation. The encapsulation can be changed
   only while an interface is down.

   At the moment the following values are supported:

   rawip    (Default) Selects raw-IP-encapsulation. This means, MAC-headers
            are stripped off.
   ip       IP with type-field. Same as IP but the type-field of the MAC-header
            is preserved.
   x25iface X.25 interface encapsulation (first byte semantics as defined in
            ../networking/x25-iface.txt). Use this for running the linux
            X.25 network protocol stack (AF_X25 sockets) on top of isdn.
   cisco-h  A special-mode for communicating with a Cisco, which is configured
            to do "hdlc"
   ethernet No stripping. Packets are sent with full MAC-header.
            The Ethernet-address of the interface is faked, from its
            IP-address: fc:fc:i1:i2:i3:i4, where i1-4 are the IP-addr.-values.
   syncppp  Synchronous PPP

   uihdlc   HDLC with UI-frame-header (for use with DOS ISPA, option -h1)


   NOTE:    x25iface encapsulation is currently experimental. Please
            read README.x25 for further details


   Watching packets, using standard-tcpdump will fail for all encapsulations
   except ethernet because tcpdump does not know how to handle packets
   without MAC-header. A patch for tcpdump is included in the utility-package
   mentioned above.

   "isdnctrl l2_prot <InterfaceName> <L2-ProtocolName>"
   Selects a layer-2-protocol.
   (With the ICN-driver and the HiSax-driver, "x75i" and "hdlc" is available.
   With other drivers, "x75ui", "x75bui", "x25dte", "x25dce" may be
   possible too. See README.x25 for x25 related l2 protocols.)

   isdnctrl l3_prot <InterfaceName> <L3-ProtocolName>
   The same for layer-3. (At the moment only "trans" is allowed)

   "isdnctrl list <InterfaceName>"
   Shows all parameters of an interface and the charge-info.
   Try "all" as the interface name.

   "isdnctrl hangup <InterfaceName>"
   Forces hangup of an interface.

   "isdnctrl bind <InterfaceName> <DriverId>,<ChannelNumber> [exclusive]"
   If you are using more than one ISDN card, it is sometimes necessary to
   dial out using a specific card or even preserve a specific channel for
   dialout of a specific net-interface. This can be done with the above
   command. Replace <DriverId> by whatever you assigned while loading the
   module. The <ChannelNumber> is counted from zero. The upper limit
   depends on the card used. At the moment no card supports more than
   2 channels, so the upper limit is one.

   "isdnctrl unbind <InterfaceName>"
   unbinds a previously bound interface.

   "isdnctrl busreject <DriverId> on|off"
   If switched on, isdn4linux replies a REJECT to incoming calls, it
   cannot match to any configured interface.
   If switched off, nothing happens in this case.
   You normally should NOT enable this feature, if the ISDN adapter is not
   the only device connected to the S0-bus. Otherwise it could happen that
   isdn4linux rejects an incoming call, which belongs to another device on
   the bus.

   "isdnctrl addslave <InterfaceName> <SlaveName>
   Creates a slave interface for channel-bundling. Slave interfaces are
   not seen by the kernel, but their ISDN-part can be configured with
   isdnctrl as usual. (Phone numbers, EAZ/MSN, timeouts etc.) If more
   than two channels are to be bundled, feel free to create as many as you
   want. InterfaceName must be a real interface, NOT a slave. Slave interfaces
   start dialing, if the master interface resp. the previous slave interface
   has a load of more than 7000 cps. They hangup if the load goes under 7000
   cps, according to their "huptimeout"-parameter.

   "isdnctrl sdelay <InterfaceName> secs."
   This sets the minimum time an Interface has to be fully loaded, until
   it sends a dial-request to its slave.

   "isdnctrl dial <InterfaceName>"
   Forces an interface to start dialing even if no packets are to be
   transferred.

   "isdnctrl mapping <DriverId> MSN0,MSN1,MSN2,...MSN9"
   This installs a mapping table for EAZ<->MSN-mapping for a single line.
   Missing MSN's have to be given as "-" or can be omitted, if at the end
   of the commandline.
   With this command, it's now possible to have an interface listening to
   mixed 1TR6- and Euro-Type lines. In this case, the interface has to be
   configured to a 1TR6-type EAZ (one digit). The mapping is also valid
   for tty-emulation. Seen from the interface/tty-level the mapping
   CAN be used, however it's possible to use single tty's/interfaces with
   real MSN's (more digits) also, in which case the mapping will be ignored.
   Here is an example:

   You have a 1TR6-type line with base-nr. 1234567 and a Euro-line with
   MSN's 987654, 987655 and 987656. The DriverId for the Euro-line is "EURO".

   isdnctrl mapping EURO -,987654,987655,987656,-,987655
   ...
   isdnctrl eaz isdn0 1      # listen on 12345671(1tr6) and 987654(euro)
   ...
   isdnctrl eaz isdn1 4      # listen on 12345674(1tr6) only.
   ...
   isdnctrl eaz isdn2 987654 # listen on 987654(euro) only.

   Same scheme is used with AT&E...  at the tty's.

6. If you want to write a new low-level-driver, you are welcome.
   The interface to the link-level-module is described in the file INTERFACE.
   If the interface should be expanded for any reason, don't do it
   on your own, send me a mail containing the proposed changes and
   some reasoning about them.
   If other drivers will not be affected, I will include the changes
   in the next release.
   For developers only, there is a second mailing-list. Write to me
   (fritz@isdn4linux.de), if you want to join that list.

Have fun!

 -Fritz