<!-- This is an SGML document in the linuxdoc DTD of the Tutorial for
     Configuring a FreeBSD for Dialup Services by Guy Helmer.
     $Id: dialup.sgml,v 1.5 1996/01/31 14:26:02 mpp Exp $

<!DOCTYPE linuxdoc PUBLIC "-//Linux//DTD linuxdoc//EN">


<article>

<title>
Configuring FreeBSD for Dialup Services
<author>Guy Helmer, <tt/ghelmer@alpha.dsu.edu/
<date>v0.1, 28 March 1995
<abstract>

-->

<sect><heading>Dialup access<label id="dialup"></heading>

<p><em>Contributed by &a.ghelmer;.</em>

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.

<sect1><heading>Prerequisites<label id="dialup:prereqs"></>
<p>

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'll need certain versions of FreeBSD,
and knowledge of some terminology &amp; modem and cabling.

<sect2><heading>FreeBSD Version</heading>
<p>

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 (<tt/sio/) has improved in every release of FreeBSD, so
more recent versions of FreeBSD are assumed to have better and more
efficient drivers than earlier versions.

<sect2><heading>Terminology</heading>
<p>

A quick rundown of terminology:

<descrip>

<tag/bps/ Bits per Second - the rate at which data is transmitted

<tag/DTE/ Data Terminal Equipment - for example, your computer

<tag/DCE/ Data Communications Equipment -  your modem

<tag/RS-232/ EIA standard for serial communications via hardware

</descrip>

If you need more information about these terms and data communications
in general, the author remembers reading that <em/The RS-232 Bible/
(anybody have an ISBN?) is a good reference.

When talking about communications data rates, the author doesn't use
the term <bf/baud/.  Baud refers to the number of electrical state
transitions that may be made in a period of time, while <bf/bps/ (bits
per second) is the ``correct'' term to use (at least it doesn't seem
to bother the curmudgeons quite a much).

<sect2><heading>External vs. Internal Modems</heading>
<p>

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.

<sect2><heading>Modems and Cables</heading>
<p>

A background knowledge of these items is assumed

<itemize>

<item> You know how to connect your modem to your computer so that the
two can communicate (unless you have an internal modem, which doesn't
need such a cable)

<item> You are familiar with your modem's command set, or know where
to look up needed commands

<item> You know how to configure your modem (probably via a terminal
communications program) so you can set the non-volatile RAM
parameters

</itemize>

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:

<itemize>
<item> Transmitted Data (<tt/SD/)
<item> Received Data (<tt/RD/)
<item> Request to Send (<tt/RTS/)
<item> Clear to Send (<tt/CTS/)
<item> Data Set Ready (<tt/DSR/)
<item> Data Terminal Ready (<tt/DTR/)
<item> Carrier Detect (<tt/CD/)
<item> Signal Ground (<tt/SG/)
</itemize>

FreeBSD needs the <tt/RTS/ and <tt/CTS/ signals for flow-control at
speeds above 2400bps, the <tt/CD/ signal to detect when a call has
been answered or the line has been hung up, and the <tt/DTR/ signal to
reset the modem after a session is complete.  Some cables are wired
without all of the needed signals, so if you have problems, such as
a login session not going away when the line hangs up, you may have a
problem with your cable.

The second prerequisite depends on the modem(s) you use.  If you don't
know your modem's command set by heart, you will need to have the
modem's reference book or user's guide handy.  Sample commands for USR
Sportster 14,400 external modems will be given, which you may be able
to use as a reference for your own modem's commands.

Lastly, you'll need to know how to setup your modem so that it will
work well with FreeBSD.  Like other UNIX-like operating systems,
FreeBSD uses the hardware signals to find out when a call has been
answered or a line has been hung up and to hangup and reset the modem
after a call.  FreeBSD avoids sending commands to the modem or
watching for status reports from the modem.  If you are familiar with
connecting modems to PC-based bulletin board systems, this may seem
awkward.

<sect2><heading>Serial Interface Considerations</heading>
<p>

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.

<sect1><heading>Quick Overview</heading>
<p>

Here is the process that FreeBSD follows to accept dialup logins.  A
<tt/getty/ process, spawned by <tt/init/, patiently waits to open the
assigned serial port (<tt>/dev/ttyd0</tt>, for our example).  The
command <tt/ps ax/ might show this:

<tscreen><verb>
 4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0
</verb></tscreen>

When a user dials the modem's line and the modems connect, the <tt/CD/
line is asserted by the modem.  The kernel notices that carrier has
been detected and completes <tt/getty/'s open of the port.  <tt/getty/
sends a <tt/login:/ prompt at the specified initial line speed.
<tt/getty/ watches to see if legitimate characters are received, and,
in a typical configuration, if it finds junk (probably due to the
modem's connection speed being different than <tt/getty/'s speed),
<tt/getty/ tries adjusting the line speeds until it receives
reasonable characters.

We hope <tt/getty/ finds the correct speed and the user sees a
<tt/login:/ prompt.  After the user enters his/her login name,
<tt/getty/ executes <tt>/usr/bin/login</tt>, which completes the login
by asking for the user's password and then starting the user's shell.

Let's dive into the configuration...

<sect1><heading>Kernel Configuration</heading>
<p>

FreeBSD kernels typically come prepared to search for four serial
ports, known in the PC-DOS world as <tt/COM1:/, <tt/COM2:/,
<tt/COM3:/, and <tt/COM4:/.  FreeBSD can presently also handle
``dumb'' multiport serial interface cards, such as the Boca Board
1008 and 2016 (please see the manual page <tt/sio(4)/ for kernel
configuration information if you have a multiport serial card).  The
default kernel only looks for the standard COM ports, though.

To see if your kernel recognizes any of your serial ports, watch for
messages while the kernel is booting, or use the
<tt>/sbin/dmesg</tt> command to replay the kernel's boot messages.  In
particular, look for messages that start with the characters <tt/sio/.
Hint: to view just the messages that have the word <tt/sio/, use the
command: 

<tscreen><verb>
/sbin/dmesg | grep 'sio'
</verb></tscreen>

For example, on a system with four serial ports, these are the
serial-port specific kernel boot messages:

<tscreen><verb>
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
</verb></tscreen>

If your kernel doesn't recognize all of your serial ports, you'll
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'' &lsqb;the source for which is in
<tt>/usr/src/share/doc/smm</tt>&rsqb; and ``FreeBSD Configuration
Options'' &lsqb;in <tt>/sys/doc/options.doc</tt>&rsqb; for more
information on configuring and building kernels.  You may have to
unpack the kernel source distribution if haven't installed the system
sources already (<tt>srcdist/srcsys.??</tt> in FreeBSD 1.1,
<tt>srcdist/sys.??</tt> 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 haven't
already) by <tt/cd/ing to <tt>/sys/i386/conf</tt>.  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
<em/YOURSYS/, where <em/YOURSYS/ is the name of your system, but in
upper-case letters.  Edit the file, and change the device lines:

<tscreen><verb>
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
</verb></tscreen>

You can comment-out or completely remove lines for devices you don't
have.  If you have a multiport serial board, such as the Boca Board
BB2016, please see the <tt/sio(4)/ man page for complete information
on how to write configuration lines for multiport boards.  Be careful
if you are using a configuration file that was previously used for a
different version of FreeBSD because the device flags have changed
between versions.

Note that <tt/port "IO_COM1"/ is a substitution for <tt/port 0x3f8/,
<tt/IO_COM2/ is <tt/0x2f8/, <tt/IO_COM3/ is <tt/0x3e8/, and
<tt/IO_COM4/ is <tt/0x2e8/, which are fairly common port addresses for
their respective serial ports; interrupts 4, 3, 5, and 9 are fairly
common interrupt request lines.  Also note that regular serial ports
<bf>can't</bf> 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 <tt/config/ as documented in ``Building Berkeley Kernels with
Config'' and the <tt/config(8)/ manual page to prepare a kernel
building directory, then build, install, and test the new kernel.

<sect1><heading>Device Special Files</heading>
<p>

Most devices in the kernel are accessed through ``device special
files'', which are located in the <tt>/dev</tt> directory.  The
<tt/sio/ devices are accessed through the <tt>/dev/ttyd?</tt>
(dial-in) and <tt>/dev/cua0?</tt> (call-out) devices.  On FreeBSD
version 1.1.5 and higher, there are also initialization devices
(<tt>/dev/ttyid?</tt> and <tt>/dev/cuai0?</tt>) and locking devices
(<tt>/dev/ttyld?</tt> and <tt>/dev/cual0?</tt>).  The initialization
devices are used to initialize communications port parameters each
time a port is opened, such as <tt>crtscts</tt> for modems which use
<tt>CTS/RTS</tt> 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 <tt/termios(4)/, <tt/sio(4)/,
and <tt/stty(1)/ for information on the terminal settings, locking
&amp; initializing devices, and setting terminal options,
respectively.

<sect2><heading>Making Device Special Files</heading>
<p>

A shell script called <tt/MAKEDEV/ in the <tt>/dev</tt> directory
manages the device special files.  (The manual page for
<tt/MAKEDEV(8)/ on FreeBSD 1.1.5 is fairly bogus in its discussion of
<tt/COM/ ports, so ignore it.)  To use <tt/MAKEDEV/ to make dialup
device special files for <tt/COM1:/ (port 0), <tt/cd/ to <tt>/dev</tt>
and issue the command <tt/MAKEDEV ttyd0/.  Likewise, to make dialup
device special files for <tt/COM2:/ (port 1), use <tt/MAKEDEV ttyd1/.

<tt/MAKDEV/ not only creates the <tt>/dev/ttyd?</tt> device special
files, but also creates the <tt>/dev/cua0?</tt> (and all of the
initializing and locking special files under FreeBSD 1.1.5 and up) and
removes the hardwired terminal special file <tt>/dev/tty0?</tt>, if it
exists. 

After making new device special files, be sure to check the
permissions on the files (especially the <tt>/dev/cua*</tt> files) to
make sure that only users who should have access to those device
special files can read &amp; write on them - you probably don't want
to allow your average user to use your modems to dialout.  The default
permissions on the <tt>/dev/cua*</tt> files should be sufficient:

<tscreen><verb>
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
</verb></tscreen>

These permissions allow the user <tt/uucp/ and users in the group
<tt/dialer/ to use the call-out devices.

<sect1><heading>Configuration Files</heading>
<p>

There are three system configuration files in the <tt>/etc</tt>
directory that you'll probably need to edit to allow dialup access to
your FreeBSD system.  The first, <tt>/etc/gettytab</tt>, contains
configuration information for the <tt>/usr/libexec/getty</tt> daemon.
Second, <tt>/etc/ttys</tt> holds information that tells
<tt>/sbin/init</tt> what <tt/tty/ devices should have <tt/getty/
processes running on them.  Lastly, you can place port initialization
commands in the <tt>/etc/rc.serial</tt> script if you have FreeBSD
1.1.5.1 or higher; otherwise, you can initialize ports in the
<tt>/etc/rc.local</tt> 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 doesn't know what a user's true data
rate is, so full-screen programs like Emacs won't 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 <tt/getty/ doesn't
understand any particular modem's connection speed reporting,
<tt/getty/ gives a <tt/login:/ message at an initial speed and watches
the characters that come back in response.  If the user sees junk,
it's assumed that they know they should press the
<tt>&lt;Enter&gt;</tt> key until they see a recognizable prompt.  If
the data rates don't match, <tt/getty/ sees anything the user types as
``junk'', tries going to the next speed and gives the <tt/login:/
prompt again.  This procedure can continue ad nauseum, but normally
only takes a keystroke or two before the user sees a good prompt.
Obviously, this login sequence doesn't look as clean as the former
``locked-speed'' method, but a user on a low-speed connection should
receive better interactive response from full-screen programs.

The author will try to give balanced configuration information, but is
biased towards having the modem's data rate follow the connection
rate.

<sect2><heading>/etc/gettytab</heading>
<p>

<tt>/etc/gettytab</tt> is a <tt/termcap(5)/-style file of
configuration information for <tt/getty(8)/.  Please see the
<tt/gettytab(4)/ manual page for complete information on the format of
the file and the list of capabilities.

<sect3><heading>Locked-Speed Config</heading>
<p>

If you are locking your modem's data communications rate at a
particular speed, you probably won't need to make any changes to
<tt>/etc/gettytab</tt>.

<sect3><heading>Matching-Speed Config</heading>
<p>

You'll need to setup an entry in <tt>/etc/gettytab</tt> to give
<tt/getty/ information about the speeds you wish to use for your
modem.  If you have a 2400 bps modem, you can probably use the
existing <tt/D2400/ entry.  This entry already exists in the FreeBSD
1.1.5.1 <tt/gettytab/ file, so you don't need to add it unless it is
missing under your version of FreeBSD:

<tscreen><verb>
#
# 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:
</verb></tscreen>

If you have a higher speed modem, you'll probably need to add an entry
in <tt>/etc/gettytab</tt>; here's an entry you could use for a 14.4
Kbps modem with a top interface speed of 19.2 Kpbs:

<tscreen><verb>
#
# 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:
</verb></tscreen>

On FreeBSD 1.1.5 and later, this will result in 8-bit, no parity
connections.  Under FreeBSD 1.1, add <tt/:np:/ parameters to the
<tt>std.<em/xxx/</tt> 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 <tt/nx=/ (<bf/next table/) capability.
Each of the lines uses a <tt/tc=/ (<bf/table continuation/) entry to
pick up the rest of the ``standard'' settings for a particular data
rate.

If you have a 28.8 Kbps modem and/or you want to take advantage of
compression on a 14.4 Kbps modem, you need to use a higher
communications rate than 19.2 Kbps.  Here's an example of a
<tt/gettytab/ entry starting a 57.6 Kpbs:

<tscreen><verb>
#
# Additions for a V.32bis or V.34 Modem
# Starting at 57.6 Kpbs
#
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:
</verb></tscreen>

If you have a slow CPU or a heavily loaded system and you don't have
16550A-based serial ports, you may receive sio ``silo'' errors at 57.6
Kbps.

<sect2><heading>/etc/ttys</heading>
<p>

<tt>/etc/ttys</tt> is the list of <tt/ttys/ for <tt/init/ to monitor.
<tt>/etc/ttys</tt> also provides security information to <tt/login/
(user <tt/root/ may only login on ttys marked <tt/secure/).  See the
manual page for <tt/ttys(5)/ for more information.

You'll need to either modify existing lines in <tt>/etc/ttys</tt> or
add new lines to make <tt/init/ run <tt/getty/ processes automatically
on your new dialup ports.  The general format of the line will be the
same, whether you are using a locked-speed or matching-speed
configuration: 

<tscreen><verb>
ttyd0   "/usr/libexec/getty xxx"   dialup on
</verb></tscreen>

The first item in the above line is the device special file for this
entry - <tt/ttyd0/ means <tt>/dev/ttyd0</tt> is the file that this
<tt/getty/ will be watching.  The second item, <tt>"/usr/libexec/getty
<em/xxx/"</tt> (<em/xxx/ will be replaced by the initial <tt/gettytab/
capability) is the process <tt/init/ will run on the device.  The
third item, <tt/dialup/, is the default terminal type.  The fourth
parameter, <tt/on/, indicates to <tt/init/ that the line is
operational.  There can be a fifth parameter, <tt>secure</tt>, but it
should only be used for terminals which are physically secure (such as
the system console).

The default terminal type (<tt/dialup/ in the example above) may
depend on local preferences.  <tt/dialup/ is the traditional default
terminal type on dialup lines so that users may customize their login
scripts to notice when the terminal is <tt/dialup/ and automatically
adjust their terminal type.  However, the author finds it easier at
his site to specify <tt/vt102/ as the default terminal type, since the
users just use VT102 emulation on their remote systems.

After you have made changes to <tt>/etc/ttys</tt>, you may send the
<tt/init/ process a <tt/HUP/ signal to re-read the file.  You can use
the command

<tscreen><verb>
kill -1 1
</verb></tscreen>

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 <tt/init/.

<sect3><heading>Locked-Speed Config</heading>
<p>

For a locked-speed configuration, your <tt/ttys/ entry needs to
have a fixed-speed entry provided to <tt/getty/.  For a modem whose
port speed is locked at 19.2 Kbps, the <tt/ttys/ entry might look like
this: 

<tscreen><verb>
ttyd0   "/usr/libexec/getty std.19200"   dialup on
</verb></tscreen>

If your modem is locked at a different data rate, substitute the
appropriate name for the <tt>std.<em/speed/</tt> entry for
<tt/std.19200/ from <tt>/etc/gettytab</tt> for your modem's data rate.

<sect3><heading>Matching-Speed Config</heading>
<p>

In a matching-speed configuration, your <tt/ttys/ entry needs to
reference the appropriate beginning ``auto-baud'' (sic) entry in
<tt>/etc/gettytab</tt>.  For example, if you added the above suggested
entry for a matching-speed modem that starts at 19.2 Kbps (the
<tt/gettytab/ entry containing the <tt/V19200/ starting point), your
<tt/ttys/ entry might look like this:

<tscreen><verb>
ttyd0   "/usr/libexec/getty V19200"   dialup on
</verb></tscreen>

<sect2><heading>/etc/rc.serial or /etc/rc.local</heading>
<p>

High-speed modems, like V.32, V.32bis, and V.34 modems, need to use
hardware (<tt>RTS/CTS</tt>) flow control.  You can add <tt/stty/
commands to <tt>/etc/rc.serial</tt> on FreeBSD 1.1.5.1 and up, or
<tt>/etc/rc.local</tt> 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,
<tt>/etc/rc.serial</tt> reads:

<tscreen><verb>
#!/bin/sh
#
# Serial port initial configuration

stty -f /dev/ttyid1 crtscts
stty -f /dev/cuai01 crtscts
</verb></tscreen>

which sets the <tt/termios/ flag <tt/crtscts/ on serial port &num;1's
(<tt/COM2:/) dialin and dialout initialization devices.

On an old FreeBSD 1.1 system, these entries were added to
/etc/rc.local to set the <tt/crtscts/ flag on the devices:

<tscreen><verb>
# 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
</verb></tscreen>

Since there isn't an 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 aren't cleared by a miscreant.

<sect1><heading>Modem Settings</heading>
<p>

If you have a modem whose parameters may be permanently set in
non-volatile RAM, you'll need to use a terminal program (such as Telix
under PC-DOS or <tt/tip/ under FreeBSD) to set the parameters.
Connect to the modem using the same communications speed as the
initial speed <tt/getty/ will use and configure the modem's
non-volatile RAM to match these requirements:

<itemize>

<item> <tt/CD/ asserted when connected

<item> <tt/DTR/ asserted for operation; dropping DTR hangs up line
&amp; resets modem

<item> <tt/CTS/ transmitted data flow control

<item> Disable <tt>XON/XOFF</tt> flow control

<item> <tt/RTS/ received data flow control

<item> Quiet mode (no result codes)

<item> No command echo

</itemize>

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:

<tscreen><verb>
ATZ
AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W
</verb></tscreen>

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:

<itemize>

<item> Switch 1: UP - DTR Normal

<item> Switch 2: Don't care (Verbal Result Codes/Numeric Result Codes)

<item> Switch 3: UP - Suppress Result Codes

<item> Switch 4: DOWN - No echo, offline commands

<item> Switch 5: UP - Auto Answer

<item> Switch 6: UP - Carrier Detect Normal

<item> Switch 7: UP - Load NVRAM Defaults

<item> Switch 8: Don't care (Smart Mode/Dumb Mode)

</itemize>

Result codes should be disabled/suppressed for dialup modems to avoid
problems that can occur if <tt/getty/ mistakenly gives a <tt/login:/
prompt to a modem that is in command mode and the modem echoes the
command or returns a result code.  I've heard this sequence can result
in a extended, silly conversation between <tt/getty/ and the modem.

<sect2><heading>Locked-speed Config</heading>
<p>

For a locked-speed configuration, you'll 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:

<tscreen><verb>
ATZ
AT&amp;B1&amp;W
</verb></tscreen>

<sect2><heading>Matching-speed Config</heading>
<p>

For a variable-speed configuration, you'll 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:

<tscreen><verb>
ATZ
AT&amp;B2&amp;W
</verb></tscreen>

<sect2><heading>Checking the Modem's Configuration</heading>
<p>

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 <tt/ATI5/ displays the
settings that are stored in the non-volatile RAM.  To see the true
operating parameters of the modem (as influenced by the USR's DIP
switch settings), use the commands <tt/ATZ/ and then <tt/ATI4/.

If you have a different brand of modem, check your modem's manual to
see how to double-check your modem's configuration parameters.

<sect1><heading>Troubleshooting</heading>
<p>

Here are a few steps you can follow to check out the dialup modem on
your system.

<sect2><heading>Checking out the FreeBSD system</heading>
<p>

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 <tt/DTR/ indicator lights when the <tt/login:/ prompt appears
on the system's console - if it lights up, that should mean that
FreeBSD has started a <tt/getty/ process on the appropriate
communications port and is waiting for the modem to accept a call.

If the <tt/DTR/ indicator doesn't light, login to the FreeBSD system
through the console and issue a <tt/ps ax/ to see if FreeBSD is trying
to run a <tt/getty/ process on the correct port.  You should see a
lines like this among the processes displayed:

<tscreen><verb>
  114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
  115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1
</verb></tscreen>

If you see something different, like this:

<tscreen><verb>
  114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0
      ^^
</verb></tscreen>

and the modem hasn't accepted a call yet, this means that <tt/getty/
has completed its open on the communications port.  This could
indicate a problem with the cabling or a mis-configured modem, because
<tt/getty/ should not be able to open the communications port until
<tt/CD/ (carrier detect) has been asserted by the modem.

If you don't see any <tt/getty/ processes waiting to open the desired
<tt/ttyd?/ port, double-check your entries in <tt>/etc/ttys</tt> to
see if there are any mistakes there.  Also, check the log file
<tt>/var/log/messages</tt> to see if there are any log messages from
<tt/init/ or <tt/getty/ regarding any problems.  If there are any
messages, triple-check the configuration files <tt>/etc/ttys</tt> and
<tt>/etc/gettytab</tt>, as well as the appropriate device special
files <tt>/dev/ttyd?</tt>, for any mistakes, missing entries, or
missing device special files.

<sect2><heading>Try Dialing In</heading>
<p>

Try dialing into the system; be sure to use 8 bits, no parity, 1 stop
bit on the remote system.  If you don't get a prompt right away, or
get garbage, try pressing <tt>&lt;Enter&gt;</tt> about once per
second.  If you still don't see a <tt/login:/ prompt after a while,
try sending a <tt>BREAK</tt>.  If you are using a high-speed modem to
do the dialing, try dialing again after locking the dialing modem's
interface speed (via <tt>AT&amp;B1</tt> on a USR Sportster, for
example).

If you still can't get a <tt/login:/ prompt, check
<tt>/etc/gettytab</tt> again and double-check that

<itemize>
<item> The initial capability name specified in <tt>/etc/ttys</tt> for
the line matches a name of a capability in <tt>/etc/gettytab</tt>

<item> Each <tt/nx=/ entry matches another <tt/gettytab/ capability
name

<item> Each <tt/tc=/ entry matches another <tt/gettytab/ capability
name

</itemize>

If you dial but the modem on the FreeBSD system won't answer, make
sure that the modem is configured to answer the phone when <tt/DTR/ is
asserted.  If the modem seems to be configured correctly, verify that
the <tt/DTR/ line is asserted by checking the modem's indicator lights
(if it has any).

If you've gone over everything several times and it still doesn't work,
take a break and come back to it later.  If it still doesn't work,
perhaps you can send an electronic mail message to <tt><htmlurl
url="mailto:questions@freebsd.org" name="questions@FreeBSD.ORG"></tt>
describing your modem and your problem, and the good folks on the list will
try to help.

<sect1><heading>Acknowledgments</heading>
<p>

Thanks to these people for comments and advice:

<descrip>

<tag/Sean Kelly/ &lt;kelly@fsl.noaa.gov&gt; for a number of good
suggestions

</descrip>


