Dialin service
Contributed by &a.ghelmer;.
This document provides suggestions for configuring a FreeBSD system to
handle dialup modems. This document is written based on the author's
experience with FreeBSD versions 1.0, 1.1, and 1.1.5.1 (and experience
with dialup modems on other UNIX-like operating systems); however,
this document may not answer all of your questions or provide examples
specific enough to your environment. The author cannot be responsible
if you damage your system or lose data due to attempting to follow the
suggestions here.
Prerequisites>
To begin with, the author assumes you have some basic knowledge of
FreeBSD. You need to have FreeBSD installed, know how to edit files
in a UNIX-like environment, and how to look up manual pages on the
system. As discussed below, you will need certain versions of FreeBSD,
and knowledge of some terminology & modem and cabling.
FreeBSD Version
First, it is assumed that you are using FreeBSD version 1.1 or higher
(including versions 2.x). FreeBSD version 1.0 included two different
serial drivers, which complicates the situation. Also, the serial
device driver (Terminology
A quick rundown of terminology:
If you need more information about these terms and data communications
in general, the author remembers reading that External vs. Internal Modems
External modems seem to be more convenient for dialup, because
external modems often can be semi-permanently configured via
parameters stored in non-volatile RAM and they usually provide lighted
indicators that display the state of important RS-232 signals.
Blinking lights impress visitors, but lights are also very useful to
see whether a modem is operating properly.
Internal modems usually lack non-volatile RAM, so their configuration
may be limited only to setting DIP switches. If your internal modem
has any signal indicator lights, it is probably difficult to view the
lights when the system's cover is in place.
Modems and Cables
A background knowledge of these items is assumed
- You know how to connect your modem to your computer so that the
two can communicate (unless you have an internal modem, which does not
need such a cable)
- You are familiar with your modem's command set, or know where
to look up needed commands
- You know how to configure your modem (probably via a terminal
communications program) so you can set the non-volatile RAM
parameters
The first, connecting your modem, is usually simple - most
straight-through serial cables work without any problems. You need to
have a cable with appropriate connectors (DB-25 or DB-9, male or
female) on each end, and the cable must be a DCE-to-DTE cable with
these signals wired:
- Transmitted Data (
Received Data ( Request to Send ( Clear to Send ( Data Set Ready ( Data Terminal Ready ( Carrier Detect ( Signal Ground (
FreeBSD needs the Serial Interface Considerations
FreeBSD supports NS8250-, NS16450-, NS16550-, and NS16550A-based EIA
RS-232C (CCITT V.24) communications interfaces. The 8250 and 16450
devices have single-character buffers. The 16550 device provides a
16-character buffer, which allows for better system performance.
(Bugs in plain 16550's prevent the use of the 16-character buffer, so
use 16550A's if possible). Because single-character-buffer devices
require more work by the operating system than the 16-character-buffer
devices, 16550A-based serial interface cards are much prefered. If
the system has many active serial ports or will have a heavy load,
16550A-based cards are better for low-error-rate communications.
Quick Overview
Here is the process that FreeBSD follows to accept dialup logins. A
/dev/ttyd0 , for our example). The
command
4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0
When a user dials the modem's line and the modems connect, the /usr/bin/login , which completes the login
by asking for the user's password and then starting the user's shell.
Let's dive into the configuration...
Kernel Configuration
FreeBSD kernels typically come prepared to search for four serial
ports, known in the PC-DOS world as /sbin/dmesg command to replay the kernel's boot messages. In
particular, look for messages that start with the characters
/sbin/dmesg | grep 'sio'
For example, on a system with four serial ports, these are the
serial-port specific kernel boot messages:
sio0 at 0x3f8-0x3ff irq 4 on isa
sio0: type 16550A
sio1 at 0x2f8-0x2ff irq 3 on isa
sio1: type 16550A
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
sio3 at 0x2e8-0x2ef irq 9 on isa
sio3: type 16550A
If your kernel does not recognize all of your serial ports, you will
probably need to configure a custom FreeBSD kernel for your system.
Please see the BSD System Manager's Manual chapter on ``Building
Berkeley Kernels with Config'' [the source for which is in
/usr/src/share/doc/smm ] and ``FreeBSD Configuration
Options'' [in /sys/conf/options and in
/sys/arch /conf/options.arch , with
arch for example being i386 ] for more
information on configuring and building kernels. You may have to
unpack the kernel source distribution if have not installed the system
sources already (srcdist/srcsys.?? in FreeBSD 1.1,
srcdist/sys.?? in FreeBSD 1.1.5.1, or the entire source
distribution in FreeBSD 2.0) to be able to configure and build
kernels.
Create a kernel configuration file for your system (if you have not
already) by /sys/i386/conf . Then, if you are
creating a new custom configuration file, copy the file GENERICAH (or
GENERICBT, if you have a BusTek SCSI controller on FreeBSD 1.x) to
device sio0 at isa? port "IO_COM1" tty irq 4 vector siointr
device sio1 at isa? port "IO_COM2" tty irq 3 vector siointr
device sio2 at isa? port "IO_COM3" tty irq 5 vector siointr
device sio3 at isa? port "IO_COM4" tty irq 9 vector siointr
You can comment-out or completely remove lines for devices you do not
have. If you have a multiport serial board, such as the Boca Board
BB2016, please see the cannot share interrupts on ISA-bus PCs (multiport boards have
on-board electronics that allow all the 16550A's on the board to share
one or two interrupt request lines).
When you are finished adjusting the kernel configuration file, use the
program Device Special Files
Most devices in the kernel are accessed through ``device special
files'', which are located in the /dev directory. The
/dev/ttyd?
(dial-in) and /dev/cua0? (call-out) devices. On FreeBSD
version 1.1.5 and higher, there are also initialization devices
(/dev/ttyid? and /dev/cuai0? ) and locking devices
(/dev/ttyld? and /dev/cual0? ). The initialization
devices are used to initialize communications port parameters each
time a port is opened, such as crtscts for modems which use
CTS/RTS signaling for flow control. The locking devices are
used to lock flags on ports to prevent users or programs changing
certain parameters; see the manual pages Making Device Special Files
A shell script called /dev directory
manages the device special files. (The manual page for
/dev
and issue the command /dev/ttyd? device special
files, but also creates the /dev/cua0? (and all of the
initializing and locking special files under FreeBSD 1.1.5 and up) and
removes the hardwired terminal special file /dev/tty0? , if it
exists.
After making new device special files, be sure to check the
permissions on the files (especially the /dev/cua* files) to
make sure that only users who should have access to those device
special files can read & write on them - you probably do not want
to allow your average user to use your modems to dialout. The default
permissions on the /dev/cua* files should be sufficient:
crw-rw---- 1 uucp dialer 28, 129 Feb 15 14:38 /dev/cua01
crw-rw---- 1 uucp dialer 28, 161 Feb 15 14:38 /dev/cuai01
crw-rw---- 1 uucp dialer 28, 193 Feb 15 14:38 /dev/cual01
These permissions allow the user Configuration Files
There are three system configuration files in the /etc
directory that you will probably need to edit to allow dialup access to
your FreeBSD system. The first, /etc/gettytab , contains
configuration information for the /usr/libexec/getty daemon.
Second, /etc/ttys holds information that tells
/sbin/init what /etc/rc.serial script if you have FreeBSD
1.1.5.1 or higher; otherwise, you can initialize ports in the
/etc/rc.local script.
There are two schools of thought regarding dialup modems on UNIX. One
group likes to configure their modems and system so that no matter at
what speed a remote user dials in, the local computer-to-modem RS-232
interface runs at a locked speed. The benefit of this configuration
is that the remote user always sees a system login prompt immediately.
The downside is that the system does not know what a user's true data
rate is, so full-screen programs like Emacs will not adjust their
screen-painting methods to make their response better for slower
connections.
The other school configures their modems' RS-232 interface to vary its
speed based on the remote user's connection speed. For example,
V.32bis (14.4 Kbps) connections to the modem might make the modem run
its RS-232 interface at 19.2 Kbps, while 2400 bps connections make the
modem's RS-232 interface run at 2400 bps. Because <Enter> key until they see a recognizable prompt. If
the data rates do not match, /etc/gettytab
/etc/gettytab is a Locked-Speed Config
If you are locking your modem's data communications rate at a
particular speed, you probably will not need to make any changes to
/etc/gettytab .
Matching-Speed Config
You will need to setup an entry in /etc/gettytab to give
#
# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
#
D2400|d2400|Fast-Dial-2400:\
:nx=D1200:tc=2400-baud:
3|D1200|Fast-Dial-1200:\
:nx=D300:tc=1200-baud:
5|D300|Fast-Dial-300:\
:nx=D2400:tc=300-baud:
If you have a higher speed modem, you will probably need to add an entry
in /etc/gettytab ; here is an entry you could use for a 14.4
Kbps modem with a top interface speed of 19.2 Kbps:
#
# Additions for a V.32bis Modem
#
um|V300|High Speed Modem at 300,8-bit:\
:nx=V19200:tc=std.300:
un|V1200|High Speed Modem at 1200,8-bit:\
:nx=V300:tc=std.1200:
uo|V2400|High Speed Modem at 2400,8-bit:\
:nx=V1200:tc=std.2400:
up|V9600|High Speed Modem at 9600,8-bit:\
:nx=V2400:tc=std.9600:
uq|V19200|High Speed Modem at 19200,8-bit:\
:nx=V9600:tc=std.19200:
On FreeBSD 1.1.5 and later, this will result in 8-bit, no parity
connections. Under FreeBSD 1.1, add std. entries at the top of the file for 8 bits, no
parity; otherwise, the default is 7 bits, even parity.
The example above starts the communications rate at 19.2 Kbps (for a
V.32bis connection), then cycles through 9600 bps (for V.32), 2400
bps, 1200 bps, 300 bps, and back to 19.2 Kbps. Communications rate
cycling is implemented with the
#
# Additions for a V.32bis or V.34 Modem
# Starting at 57.6 Kbps
#
vm|VH300|Very High Speed Modem at 300,8-bit:\
:nx=VH57600:tc=std.300:
vn|VH1200|Very High Speed Modem at 1200,8-bit:\
:nx=VH300:tc=std.1200:
vo|VH2400|Very High Speed Modem at 2400,8-bit:\
:nx=VH1200:tc=std.2400:
vp|VH9600|Very High Speed Modem at 9600,8-bit:\
:nx=VH2400:tc=std.9600:
vq|VH57600|Very High Speed Modem at 57600,8-bit:\
:nx=VH9600:tc=std.57600:
If you have a slow CPU or a heavily loaded system and you do not have
16550A-based serial ports, you may receive sio ``silo'' errors at 57.6
Kbps.
/etc/ttys
/etc/ttys is the list of /etc/ttys also provides security information to /etc/ttys or
add new lines to make
ttyd0 "/usr/libexec/getty xxx" dialup on
The first item in the above line is the device special file for this
entry - /dev/ttyd0 is the file that this
"/usr/libexec/getty
(secure , but it
should only be used for terminals which are physically secure (such as
the system console).
The default terminal type (/etc/ttys , you may send the
kill -1 1
to send the signal. If this is your first time setting up the system,
though, you may want to wait until your modem(s) are properly
configured and connected before signaling Locked-Speed Config
For a locked-speed configuration, your
ttyd0 "/usr/libexec/getty std.19200" dialup on
If your modem is locked at a different data rate, substitute the
appropriate name for the std. entry for
/etc/gettytab for your modem's data rate.
Matching-Speed Config
In a matching-speed configuration, your /etc/gettytab . For example, if you added the above suggested
entry for a matching-speed modem that starts at 19.2 Kbps (the
ttyd0 "/usr/libexec/getty V19200" dialup on
/etc/rc.serial or /etc/rc.local
High-speed modems, like V.32, V.32bis, and V.34 modems, need to use
hardware (RTS/CTS ) flow control. You can add /etc/rc.serial on FreeBSD 1.1.5.1 and up, or
/etc/rc.local on FreeBSD 1.1, to set the hardware flow
control flag in the FreeBSD kernel for the modem ports.
For example, on a sample FreeBSD 1.1.5.1 system,
/etc/rc.serial reads:
#!/bin/sh
#
# Serial port initial configuration
stty -f /dev/ttyid1 crtscts
stty -f /dev/cuai01 crtscts
which sets the
# Set serial ports to use RTS/CTS flow control
stty -f /dev/ttyd0 crtscts
stty -f /dev/ttyd1 crtscts
stty -f /dev/ttyd2 crtscts
stty -f /dev/ttyd3 crtscts
Since there is no initialization device special file on FreeBSD
1.1, one has to just set the flags on the sole device special file and
hope the flags are not cleared by a miscreant.
Modem Settings
If you have a modem whose parameters may be permanently set in
non-volatile RAM, you will need to use a terminal program (such as Telix
under PC-DOS or
-
Disable XON/XOFF flow control
-
Quiet mode (no result codes)
- No command echo
Please read the documentation for your modem to find out what commands
and/or DIP switch settings you need to give it.
For example, to set the above parameters on a USRobotics Sportster
14,400 external modem, one could give these commands to the modem:
ATZ
AT&C1&D2&H1&I0&R2&W
You might also want to take this opportunity to adjust other settings
in the modem, such as whether it will use V.42bis and/or MNP5
compression.
The USR Sportster 14,400 external modem also has some DIP switches
that need to be set; for other modems, perhaps you can use these
settings as an example:
- Switch 1: UP - DTR Normal
- Switch 2: Do not care (Verbal Result Codes/Numeric Result Codes)
- Switch 3: UP - Suppress Result Codes
- Switch 4: DOWN - No echo, offline commands
- Switch 5: UP - Auto Answer
- Switch 6: UP - Carrier Detect Normal
- Switch 7: UP - Load NVRAM Defaults
- Switch 8: Do not care (Smart Mode/Dumb Mode)
Result codes should be disabled/suppressed for dialup modems to avoid
problems that can occur if Locked-speed Config
For a locked-speed configuration, you will need to configure the modem
to maintain a constant modem-to-computer data rate independent of the
communications rate. On a USR Sportster 14,400 external modem, these
commands will lock the modem-to-computer data rate at the speed used
to issue the commands:
ATZ
AT&B1&W
Matching-speed Config
For a variable-speed configuration, you will need to configure your
modem to adjust its serial port data rate to match the incoming call
rate. On a USR Sportster 14,400 external modem, these commands will
lock the modem's error-corrected data rate to the speed used to issue
the commands, but allow the serial port rate to vary for
non-error-corrected connections:
ATZ
AT&B2&W
Checking the Modem's Configuration
Most high-speed modems provide commands to view the modem's current
operating parameters in a somewhat human-readable fashion. On the USR
Sportster 14,400 external modems, the command Troubleshooting
Here are a few steps you can follow to check out the dialup modem on
your system.
Checking out the FreeBSD system
Hook up your modem to your FreeBSD system, boot the system, and, if
your modem has status indication lights, watch to see whether the
modem's
114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0
115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1
If you see something different, like this:
114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0
^^
and the modem has not accepted a call yet, this means that /etc/ttys to
see if there are any mistakes there. Also, check the log file
/var/log/messages to see if there are any log messages from
/etc/ttys and
/etc/gettytab , as well as the appropriate device special
files /dev/ttyd? , for any mistakes, missing entries, or
missing device special files.
Try Dialing In
Try dialing into the system; be sure to use 8 bits, no parity, 1 stop
bit on the remote system. If you do not get a prompt right away, or
get garbage, try pressing <Enter> about once per
second. If you still do not see a BREAK . If you are using a high-speed modem to
do the dialing, try dialing again after locking the dialing modem's
interface speed (via AT&B1 on a USR Sportster, for
example).
If you still cannot get a /etc/gettytab again and double-check that
- The initial capability name specified in
/etc/ttys for
the line matches a name of a capability in /etc/gettytab
- Each
Each
If you dial but the modem on the FreeBSD system will not answer, make
sure that the modem is configured to answer the phone when Acknowledgments
Thanks to these people for comments and advice:
&a.kelly for a number of good suggestions