Remove old cxconfig utility and connect new sconfig utility to the build.

The sconfig utility supports more than just cx boards, and those drivers
will make their way into FreeBSD shortly (maybe before 5.2).

Confirmed that this doesn't break the build.

Submitted by: Roman Kurakin <rik@cronyx.ru>
Approved by: re@ <scottl>
This commit is contained in:
Warner Losh 2003-12-03 17:09:41 +00:00
parent 0f23628969
commit cbdd27f0d3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=123130
4 changed files with 1 additions and 1104 deletions

View File

@ -102,7 +102,7 @@ SUBDIR+=vinum
.endif
.if ${MACHINE_ARCH} == "i386"
SUBDIR+=cxconfig
SUBDIR+=sconfig
.if ${MACHINE} == "pc98"
SUBDIR+=fdisk_pc98
.else

View File

@ -1,6 +0,0 @@
# $FreeBSD$
PROG= cxconfig
MAN= cxconfig.8
.include <bsd.prog.mk>

View File

@ -1,329 +0,0 @@
.\" $FreeBSD$
.Dd December 2, 1994
.Dt CXCONFIG 8
.Os
.Sh NAME
.Nm cxconfig
.Nd channel options management utility for Cronyx-Sigma adapter
.Sh SYNOPSIS
.Nm
.Op Fl a
.Op Ar <channel> Op Ar <option>...
.Sh DESCRIPTION
The
.Nm
utility is used for configuring the channel options of
the Cronyx-Sigma adapter.
.Pp
To change channel options the channel should be free: the corresponding
network interface in ``down'' state, the asynchronous terminal device
.Pa /dev/tty*
closed.
Generally, the channel options are set up during the operating
system startup, for example from the
.Pa /etc/rc
file.
.Pp
Note, that not all options have a sense for every particular
case, and an attempt to set some of them can hang up the channel or
the whole adapter.
.Pp
The following option is available:
.Bl -tag -width indent
.It Fl a
Display full information.
.El
.Sh "Channel options"
.Bl -tag -width 10n
.It ispeed=#
Set the receiver baud rate to the number given.
The maximal value is 256000 bits/sec.
In the synchronous mode the receiver baud rate is significant
only when DPLL mode is used.
.It ospeed=#
Set the transmitter baud rate to the number given.
The maximal value is 256000 bits/sec.
In the synchronous mode the transmitter baud rate is significant
only in the case of the internal clock source.
If receiver and transmitter have equal data rate, then it could
be set by specifying only the numerical argument.
.It async
Set the asynchronous channel mode.
.It "hdlc, bisync, bsc, x.21, x21
Set the synchronous channel mode: HDLC, Bisync (BSC) or X.21.
.It ppp
Set the link-level protocol: PpP/HDLC. The built-in simplified synchronous PPP
implementation is used (see RFC-1548, RFC-1549).
.It cisco
Set the link-level protocol: Cisco/HDLC (see RFC-1547).
This protocol is intended for compatibility with old models of Cisco routers,
and with early versions of
.Tn BSD/386
drivers.
The extensive usage of this protocol is not recommended.
.It ext
Use the external link-level protocol suite (for
.Tn BSD/386
only).
.It "+keepalive, -keepalive"
Enable the automatic line state control sub-protocol.
This setting is not significant when the external link-level protocol is used.
.It "+autorts, -autorts"
Enable the automatic RTS signal control.
When enabled, the RTS signal goes up only when both halves of
the receiver ring buffer are free and ready for receive,
and goes down when one or both buffers are busy.
.It "port=rs232, port=rs449, port=v35
Set the zero channel hardware interface type.
.El
.Sh "Common options"
.Bl -tag -width 10n
.It "nrz, nrzi, manchester"
Set the data line signal encoding.
In the case of
.Em NRZ
encoding the zero bit is transmitted by the zero signal
level, the one bit - by the positive signal level.
In the case of
.Em NRZI
encoding the zero bit is transmitted by the change of
the signal level, the one bit - by the constant signal level.
In the case of
.Em Manchester
encoding the zero bit is encoded as 01 value,
the one bit - as 10 value.
.It "+dpll, -dpll"
Enable the digital phase locked loop mode (DPLL).
When enabled, the receiver timing clock signal
is derived from the received data.
.It "+lloop, -lloop"
Set the local loopback mode.
.It "+extclock, -extclock"
Set the timing clock source of synchronous channels. There are
two possible variants:
.Em "external clock"
source or
.Em "internal clock"
generation.
.Pp
.Em "External clock"
mode is the most common method for connecting
external modem hardware. In this mode the external timing
signal is received on TXCIN pin of the connector, and it is
used as a synchronization clock for transmitting data (TXD).
.Pp
In the case of
.Em "internal clock"
mode the transmitted data (TXD)
are synchronized using the internal on-board timing generator,
the internally generated timing signal is driven on the TXCOUT
pin, and the signal on the TXCIN pin is ignored. This mode
is used for direct terminal-to-terminal communication,
e.g. for connecting two computers together in a synchronous mode
via relatively short cable. This method should also be used
for testing channels with an external loopback connector.
.It fifo=#
FIFO threshold level setup for receiver and transmitter.
.It rfifo=#
Hardware RTS/CTS flow control FIFO threshold setup.
.It "+ctsup, -ctsup"
Enable/disable interrupts on CTS (Clear To Send) signal setup (0 to 1 transition).
.It "+ctsdown, -ctsdown"
Enable/disable interrupts on CTS (Clear To Send) signal clear (1 to 0 transition).
.It "+cdup, -cdup"
Enable/disable interrupts on CD (Carrier Detect) signal setup (0 to 1 transition).
.It "+cddown, -cddown"
Enable/disable interrupts on CD (Carrier Detect) signal clear (1 to 0 transition).
.It "+dsrup, -dsrup"
Enable/disable interrupts on DSR (Data Set Ready) signal setup (0 to 1 transition).
.It "+dsrdown, -dsrdown"
Enable/disable interrupts on DSR (Data Set Ready) signal clear (1 to 0 transition).
.El
.Sh "Asynchronous mode options"
.Bl -tag -width 10n
.It cs#
Select character size: 5, 6, 7 or 8 bits.
.It "parodd, pareven
Parity mode: odd or even.
.It "+ignpar, -ignpar
Disable/enable parity detection.
.It nopar
Disable parity bit generation.
.It forcepar
Force parity: even - 0, odd - 1.
.It "stopb1, stopb1.5, stopb2
Use 1 or 1.5 or 2 stop bits per character.
.It "+dsr, -dsr"
Use the DSR input signal as receiver enable/disable.
.It "+cts, -cts"
Use the CTS input signal as transmitter enable/disable.
.It "+rts, -rts"
Drive the RTS output signal as transmitter ready.
.It "+rloop, -rloop"
Set the remote loopback mode.
.It "+etc, -etc"
Enable the embedded transmit commands mode.
.It "+ixon, -ixon"
Enable the hardware XON/XOFF flow control support.
.It "+ixany, -ixany"
Use the hardware IXANY mode support.
.It "+sdt, -sdt"
Detect the spec. characters SCHR1 and SCHR2 in the receive data.
.It "+flowct, -flowct"
Receive the flow control spec. characters as data.
.It "+rdt, -rdt"
Detect the spec. characters in range SCRL..SCRH in the receive data.
.It "+exdt, -exdt"
Detect the spec. characters SCHR3 and SCHR4 in the receive data.
.It "parintr, parnull, parign, pardisc, parffnull
Action on parity errors:
.Pp
.Bl -tag -width parffnullxxx -compact
.It Mode
Action
.It parintr
Generate the receiver error interrupt
.It parnull
Input the NUL character
.It parign
Ignore the error, receive as good data
.It pardisc
Ignore the character
.It parffnull
Input the sequence <0xFF, NUL, character>
.El
.It "brkintr, brknull, brkdisc
Line break state action:
.Pp
.Bl -tag -width parffnullxxx -compact
.It Mode
Action
.It brkintr
Generate the receiver error interrupt
.It brknull
Input the NUL character
.It brkdisc
Ignore the line break state
.El
.It "+inlcr, -inlcr"
Translate received NL characters to CR.
.It "+icrnl, -icrnl"
Translate received CR characters to NL.
.It "+igncr, -igncr"
Ignore received CR characters.
.It "+ocrnl, -ocrnl"
Translate transmitted CR characters to NL.
.It "+onlcr, -onlcr"
Translate transmitted NL characters to CR.
.It "+fcerr, -fcerr"
Process (don't process) the characters, received with errors,
for special character/flow control matching.
.It "+lnext, -lnext"
Enable the LNEXT character option: the character following
the LNEXT character is not processed for special character/flow
control matching.
.It "+istrip, -istrip"
Strip input characters to seven bits.
.It schr1=#
The XON flow control character value.
.It schr2=#
The XOFF flow control character value.
.It schr3=#
The SCHR3 spec. character value.
.It schr4=#
The SCHR4 spec. character value.
.It "scrl=#, scrh=#
The spec. character range (inclusive).
.It lnext=#
The LNEXT spec. character value.
.El
.Sh "HDLC mode options"
.Bl -tag -width 10n
.It if#
The minimum number of flags transmitted before a frame is started.
.It noaddr
No frame address recognition.
.It "addrlen1, addrlen2"
Address field length: 1 or 2 bytes.
.It "addr1, addr2"
Addressing mode: 4x1 bytes or 2x2 bytes.
Registers RFAR1..RFAR4 should contain the address to be matched.
.It "+clrdet, -clrdet"
Enable/disable clear detect for X.21 protocol support.
.It "+dsr, -dsr"
Use the DSR input signal as receiver enable/disable.
.It "+cts, -cts"
Use the CTS input signal as transmitter enable/disable.
.It "+rts, -rts"
Drive the RTS output signal as transmitter ready.
.It "+fcs, -fcs"
Enable/disable the frame checksum generation and checking.
.It "crc-16, crc-v.41
Select the CRC polynomial: CRC-16 (x^16+x^15+x^2+1)
or CRC V.41 (x^16+x^12+x^5+1).
.It "fcs-crc-16, fcs-v.41
Frame checksum preset: all zeros (CRC-16) or all ones (CRC V.41).
.It "+crcinv, -crcinv"
Invert (ie. CRC V.41) or don't invert (ie. CRC-16) the transmitted frame checksum.
.It "+fcsapd, -fcsapd"
Pass the received CRC to the host at the end of receiver data buffer.
.It "idlemark, idleflag
Idle mode: idle in mark (transmit all ones) or idle in flag (transmit flag).
.It "+syn, -syn"
Enable/disable sending pad characters before sending flag when coming out
of the idle mode.
.It pad#
The number of synchronous characters sent (0..4).
.It "syn=0xaa, syn=0x00
Send sync pattern.
.It "rfar1=#, rfar2=#, rfar3=#, rfar4=#
Frame address registers for address recognition.
.El
.Sh EXAMPLES
Set up the channel 7 of the adapter Sigma-400 under
.Fx .
Physical 4-wire leased line with Zelax+ M115 short-range modems.
Synchronous mode, 128000 bits/sec, interface RS-232,
protocol PpP/HDLC without keepalive support, NRZI encoding,
DPLL mode, no flow control:
.Bd -literal
cxconfig cx7 128000 hdlc ppp -keepalive nrzi -cts +dpll -extclock
ifconfig cx7 158.250.244.2 158.250.244.1 up
.Ed
.Pp
Set up the channel 0 of the adapter Sigma-100 under
.Fx .
Attachment to the near computer by short cable, internal clock source.
Synchronous mode, 256000 bits/sec, interface RS-232,
protocol Cisco/HDLC with keepalive support:
.Bd -literal
cxconfig cx0 hdlc 256000 cisco +keepalive -extclock
ifconfig cx0 200.1.1.1 200.1.1.2 up
.Ed
.Pp
Set up the channel 1 of the adapter Sigma-840 under
.Tn BSD/386 .
Synchronous 64 kbit/sec leased line, external clock source.
Synchronous mode, interface V.35, external protocol suite:
.Bd -literal
cxconfig cx1 hdlc ext
ifconfig cx1 193.124.254.50 193.124.254.49 multicast up
.Ed
.Pp
Set up the channel 0 of the adapter Sigma-840 under
.Fx .
Attachment to the Cisco-4000 router by null-modem cable, internal clock source.
Synchronous mode, 64000 bits/sec, interface RS-232,
protocol PpP/HDLC with keepalive support and flow control,
LCP and IPCP protocols (see RFC-1548 and RFC-1332) debug tracing enabled:
.Bd -literal
cxconfig cx0 hdlc 64000 port=rs232 ppp +keepalive -extclock +cts
ifconfig cx0 100.0.0.2 100.0.0.1 debug up
.Ed
.Sh FILES
.Bl -tag -width /dev/cronyx -compact
.It Pa /dev/cronyx
the special device file for adapter options management
.El
.Sh SEE ALSO
.Xr cx 4

View File

@ -1,768 +0,0 @@
/*
* Cronyx-Sigma adapter configuration utility for Unix.
*
* Copyright (C) 1994 Cronyx Ltd.
* Author: Serge Vakulenko, <vak@zebub.msk.su>
*
* This software is distributed with NO WARRANTIES, not even the implied
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Authors grant any other persons or organisations permission to use
* or modify this software as long as this message is kept with the software,
* all derivative works or modified versions.
*
* Version 1.9, Wed Oct 4 18:58:15 MSK 1995
*
* Usage:
* cxconfig [-a]
* -- print status of all channels
* cxconfig [-a] <channel>
* -- print status of the channel
* cxconfig <channel> <option>...
* -- set channel options
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <machine/cronyx.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define NBRD 3
#define CXDEV "/dev/cronyx"
#define atoi(a) strtol((a), (char**)0, 0)
cx_options_t o;
cx_stat_t st;
int aflag;
int sflag;
static char *
symbol(unsigned char sym)
{
static char buf[40];
if (sym < ' ')
sprintf (buf, "^%c", sym+0100);
else if (sym == '\\')
strcat (buf, "\\\\");
else if (sym < 127)
sprintf (buf, "%c", sym);
else
sprintf (buf, "\\%03o", sym);
return (buf);
}
static unsigned char
atosym(char *s)
{
if (*s == '^')
return (*++s & 037);
if (*s == '\\')
return (strtol (++s, 0, 8));
return (*s);
}
static void
usage(void)
{
fprintf (stderr,
"Cronyx-Sigma Adapter Configuration Utility, Version 1.0\n");
fprintf (stderr, "Copyright (C) 1994 Cronyx Ltd.\n");
fprintf (stderr, "usage: cxconfig [-a] [<channel> [<option>...]]\n");
exit (1);
}
static const char *
chantype(int type)
{
switch (type) {
default:
case T_NONE: return ("none");
case T_ASYNC: return ("RS-232");
case T_UNIV_RS232: return ("RS-232");
case T_UNIV_RS449: return ("RS-232/RS-449");
case T_UNIV_V35: return ("RS-232/V.35");
case T_SYNC_RS232: return ("RS-232");
case T_SYNC_V35: return ("V.35");
case T_SYNC_RS449: return ("RS-449");
}
}
static const char *
chanmode(int mode)
{
switch (mode) {
case M_ASYNC: return ("Async");
case M_HDLC: return ("HDLC");
case M_BISYNC: return ("Bisync");
case M_X21: return ("X.21");
default: return ("???");
}
}
static void
getchan(int channel)
{
int s = open (CXDEV, 0);
if (s < 0)
err (1, "%s", CXDEV);
o.board = channel/NCHAN;
o.channel = channel%NCHAN;
if (ioctl (s, CXIOCGETMODE, (caddr_t)&o) < 0)
err (1, "CXIOCGETMODE");
close (s);
if (o.type == T_NONE)
errx (1, "cx%d: channel %d not configured", o.board,
o.channel);
}
static int
printstats(int channel, int hflag)
{
int s, res;
s = open (CXDEV, 0);
if (s < 0)
err (1, "%s", CXDEV);
st.board = channel/NCHAN;
st.channel = channel%NCHAN;
res = ioctl (s, CXIOCGETSTAT, (caddr_t)&st);
close (s);
if (res < 0)
return (-1);
if (hflag)
printf ("Chan Rintr Tintr Mintr Ibytes Ipkts Ierrs Obytes Opkts Oerrs\n");
printf ("cx%-2d %7ld %7ld %7ld %8ld %7ld %7ld %8ld %7ld %7ld\n",
channel, st.rintr, st.tintr, st.mintr, st.ibytes, st.ipkts,
st.ierrs, st.obytes, st.opkts, st.oerrs);
return (0);
}
static void
printallstats(void)
{
int b, c;
printf ("Chan Rintr Tintr Mintr Ibytes Ipkts Ierrs Obytes Opkts Oerrs\n");
for (b=0; b<NBRD; ++b)
for (c=0; c<NCHAN; ++c)
printstats (b*NCHAN + c, 0);
}
static void
setchan(int channel)
{
int s = open (CXDEV, 0);
if (s < 0)
err (1, "%s", CXDEV);
o.board = channel/NCHAN;
o.channel = channel%NCHAN;
if (ioctl (s, CXIOCSETMODE, (caddr_t)&o) < 0)
err (1, "CXIOCSETMODE");
close (s);
}
static void
printopt(void)
{
/* Common channel options */
/* channel option register 4 */
printf ("\t");
printf ("fifo=%d ", o.opt.cor4.thr); /* FIFO threshold */
printf ("%cctsdown ", o.opt.cor4.cts_zd ? '+' : '-'); /* detect 1 to 0 transition on the CTS */
printf ("%ccddown ", o.opt.cor4.cd_zd ? '+' : '-'); /* detect 1 to 0 transition on the CD */
printf ("%cdsrdown ", o.opt.cor4.dsr_zd ? '+' : '-'); /* detect 1 to 0 transition on the DSR */
printf ("\n");
/* channel option register 5 */
printf ("\t");
printf ("rfifo=%d ", o.opt.cor5.rx_thr); /* receive flow control FIFO threshold */
printf ("%cctsup ", o.opt.cor5.cts_od ? '+' : '-'); /* detect 0 to 1 transition on the CTS */
printf ("%ccdup ", o.opt.cor5.cd_od ? '+' : '-'); /* detect 0 to 1 transition on the CD */
printf ("%cdsrup ", o.opt.cor5.dsr_od ? '+' : '-'); /* detect 0 to 1 transition on the DSR */
printf ("\n");
/* receive clock option register */
printf ("\t");
printf ("%s ", o.opt.rcor.encod == ENCOD_NRZ ? "nrz" : /* signal encoding */
o.opt.rcor.encod == ENCOD_NRZI ? "nrzi" :
o.opt.rcor.encod == ENCOD_MANCHESTER ? "manchester" : "???");
printf ("%cdpll ", o.opt.rcor.dpll ? '+' : '-'); /* DPLL enable */
/* transmit clock option register */
printf ("%clloop ", o.opt.tcor.llm ? '+' : '-'); /* local loopback mode */
printf ("%cextclock ", o.opt.tcor.ext1x ? '+' : '-'); /* external 1x clock mode */
printf ("\n");
switch (o.mode) {
case M_ASYNC: /* async mode options */
/* channel option register 1 */
printf ("\t");
printf ("cs%d ", o.aopt.cor1.charlen+1); /* character length, 5..8 */
printf ("par%s ", o.aopt.cor1.parity ? "odd" : "even"); /* parity */
printf ("%cignpar ", o.aopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
if (o.aopt.cor1.parmode != PARM_NORMAL) /* parity mode */
printf ("%s ", o.aopt.cor1.parmode == PARM_NOPAR ? "nopar" :
o.aopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
printf ("\n");
/* channel option register 2 */
printf ("\t");
printf ("%cdsr ", o.aopt.cor2.dsrae ? '+' : '-'); /* DSR automatic enable */
printf ("%ccts ", o.aopt.cor2.ctsae ? '+' : '-'); /* CTS automatic enable */
printf ("%crts ", o.aopt.cor2.rtsao ? '+' : '-'); /* RTS automatic output enable */
printf ("%crloop ", o.aopt.cor2.rlm ? '+' : '-'); /* remote loopback mode enable */
printf ("%cetc ", o.aopt.cor2.etc ? '+' : '-'); /* embedded transmitter cmd enable */
printf ("%cxon ", o.aopt.cor2.ixon ? '+' : '-'); /* in-band XON/XOFF enable */
printf ("%cxany ", o.aopt.cor2.ixany ? '+' : '-'); /* XON on any character */
printf ("\n");
/* option register 3 */
printf ("\t");
printf ("%s ", o.aopt.cor3.stopb == STOPB_1 ? "stopb1" : /* stop bit length */
o.aopt.cor3.stopb == STOPB_15 ? "stopb1.5" :
o.aopt.cor3.stopb == STOPB_2 ? "stopb2" : "???");
printf ("%csdt ", o.aopt.cor3.scde ? '+' : '-'); /* special char detection enable */
printf ("%cflowct ", o.aopt.cor3.flowct ? '+' : '-'); /* flow control transparency mode */
printf ("%crdt ", o.aopt.cor3.rngde ? '+' : '-'); /* range detect enable */
printf ("%cexdt ", o.aopt.cor3.escde ? '+' : '-'); /* extended spec. char detect enable */
printf ("\n");
/* channel option register 6 */
printf ("\t");
printf ("%s ", o.aopt.cor6.parerr == PERR_INTR ? "parintr" : /* parity/framing error actions */
o.aopt.cor6.parerr == PERR_NULL ? "parnull" :
o.aopt.cor6.parerr == PERR_IGNORE ? "parign" :
o.aopt.cor6.parerr == PERR_DISCARD ? "pardisc" :
o.aopt.cor6.parerr == PERR_FFNULL ? "parffnull" : "???");
printf ("%s ", o.aopt.cor6.brk == BRK_INTR ? "brkintr" : /* action on break condition */
o.aopt.cor6.brk == BRK_NULL ? "brknull" :
o.aopt.cor6.brk == BRK_DISCARD ? "brkdisc" : "???");
printf ("%cinlcr ", o.aopt.cor6.inlcr ? '+' : '-'); /* translate NL to CR on input */
printf ("%cicrnl ", o.aopt.cor6.icrnl ? '+' : '-'); /* translate CR to NL on input */
printf ("%cigncr ", o.aopt.cor6.igncr ? '+' : '-'); /* discard CR on input */
printf ("\n");
/* channel option register 7 */
printf ("\t");
printf ("%cocrnl ", o.aopt.cor7.ocrnl ? '+' : '-'); /* translate CR to NL on output */
printf ("%conlcr ", o.aopt.cor7.onlcr ? '+' : '-'); /* translate NL to CR on output */
printf ("%cfcerr ", o.aopt.cor7.fcerr ? '+' : '-'); /* process flow ctl err chars enable */
printf ("%clnext ", o.aopt.cor7.lnext ? '+' : '-'); /* LNext option enable */
printf ("%cistrip ", o.aopt.cor7.istrip ? '+' : '-'); /* strip 8-bit on input */
printf ("\n");
printf ("\t");
printf ("schr1=%s ", symbol (o.aopt.schr1)); /* special character register 1 (XON) */
printf ("schr2=%s ", symbol (o.aopt.schr2)); /* special character register 2 (XOFF) */
printf ("schr3=%s ", symbol (o.aopt.schr3)); /* special character register 3 */
printf ("schr4=%s ", symbol (o.aopt.schr4)); /* special character register 4 */
printf ("scrl=%s ", symbol (o.aopt.scrl)); /* special character range low */
printf ("scrh=%s ", symbol (o.aopt.scrh)); /* special character range high */
printf ("lnext=%s ", symbol (o.aopt.lnxt)); /* LNext character */
printf ("\n");
break;
case M_HDLC: /* hdlc mode options */
/* hdlc channel option register 1 */
printf ("\t");
printf ("if%d ", o.hopt.cor1.ifflags); /* number of inter-frame flags sent */
printf ("%s ", o.hopt.cor1.admode == ADMODE_NOADDR ? "noaddr" : /* addressing mode */
o.hopt.cor1.admode == ADMODE_4_1 ? "addr1" :
o.hopt.cor1.admode == ADMODE_2_2 ? "addr2" : "???");
printf ("%cclrdet ", o.hopt.cor1.clrdet ? '+' : '-'); /* clear detect for X.21 data transfer phase */
printf ("addrlen%d ", o.hopt.cor1.aflo + 1); /* address field length option */
printf ("\n");
/* hdlc channel option register 2 */
printf ("\t");
printf ("%cdsr ", o.hopt.cor2.dsrae ? '+' : '-'); /* DSR automatic enable */
printf ("%ccts ", o.hopt.cor2.ctsae ? '+' : '-'); /* CTS automatic enable */
printf ("%crts ", o.hopt.cor2.rtsao ? '+' : '-'); /* RTS automatic output enable */
printf ("%ccrcinv ", o.hopt.cor2.crcninv ? '-' : '+'); /* CRC invertion option */
printf ("%cfcsapd ", o.hopt.cor2.fcsapd ? '+' : '-'); /* FCS append */
printf ("\n");
/* hdlc channel option register 3 */
printf ("\t");
printf ("pad%d ", o.hopt.cor3.padcnt); /* pad character count */
printf ("idle%s ", o.hopt.cor3.idle ? "mark" : "flag"); /* idle mode */
printf ("%cfcs ", o.hopt.cor3.nofcs ? '-' : '+'); /* FCS disable */
printf ("fcs-%s ", o.hopt.cor3.fcspre ? "crc-16" : "v.41"); /* FCS preset */
printf ("syn=%s ", o.hopt.cor3.syncpat ? "0xAA" : "0x00"); /* send sync pattern */
printf ("%csyn ", o.hopt.cor3.sndpad ? '+' : '-'); /* send pad characters before flag enable */
printf ("\n");
printf ("\t");
printf ("rfar1=0x%02x ", o.hopt.rfar1); /* receive frame address register 1 */
printf ("rfar2=0x%02x ", o.hopt.rfar2); /* receive frame address register 2 */
printf ("rfar3=0x%02x ", o.hopt.rfar3); /* receive frame address register 3 */
printf ("rfar4=0x%02x ", o.hopt.rfar4); /* receive frame address register 4 */
printf ("crc-%s ", o.hopt.cpsr ? "16" : "v.41"); /* CRC polynomial select */
printf ("\n");
break;
case M_BISYNC: /* bisync mode options */
/* channel option register 1 */
printf ("\t");
printf ("cs%d ", o.bopt.cor1.charlen+1); /* character length, 5..8 */
printf ("par%s ", o.bopt.cor1.parity ? "odd" : "even"); /* parity */
printf ("%cignpar ", o.bopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
if (o.bopt.cor1.parmode != PARM_NORMAL) /* parity mode */
printf ("%s ", o.bopt.cor1.parmode == PARM_NOPAR ? "nopar" :
o.bopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
printf ("\n");
/* channel option register 2 */
printf ("\t");
printf ("syn%d ", o.bopt.cor2.syns+2); /* number of extra SYN chars before a frame */
printf ("%ccrcinv ", o.bopt.cor2.crcninv ? '-' : '+'); /* CRC invertion option */
printf ("%s ", o.bopt.cor2.ebcdic ? "ebcdic" : "ascii"); /* use EBCDIC as char set (instead of ASCII) */
printf ("%cbccapd ", o.bopt.cor2.bcc ? '+' : '-'); /* BCC append enable */
printf ("%s ", o.bopt.cor2.lrc ? "lrc" : "crc-16"); /* longitudinal redundancy check */
printf ("\n");
/* channel option register 3 */
printf ("\t");
printf ("pad%d ", o.bopt.cor3.padcnt); /* pad character count */
printf ("idle%s ", o.bopt.cor3.idle ? "mark" : "syn"); /* idle mode */
printf ("%cfcs ", o.bopt.cor3.nofcs ? '-' : '+'); /* FCS disable */
printf ("fcs-%s ", o.bopt.cor3.fcspre ? "crc-16" : "v.41"); /* FCS preset */
printf ("syn=%s ", o.bopt.cor3.padpat ? "0x55" : "0xAA"); /* send sync pattern */
printf ("%csyn ", o.bopt.cor3.sndpad ? '+' : '-'); /* send pad characters before flag enable */
printf ("\n");
/* channel option register 6 */
printf ("\t");
printf ("specterm=%s ", symbol (o.bopt.cor6.specterm)); /* special termination character */
printf ("crc-%s ", o.bopt.cpsr ? "16" : "v.41"); /* CRC polynomial select */
printf ("\n");
break;
case M_X21: /* x.21 mode options */
/* channel option register 1 */
printf ("\t");
printf ("cs%d ", o.xopt.cor1.charlen+1); /* character length, 5..8 */
printf ("par%s ", o.xopt.cor1.parity ? "odd" : "even"); /* parity */
printf ("%cignpar ", o.xopt.cor1.ignpar ? '+' : '-'); /* ignore parity */
if (o.xopt.cor1.parmode != PARM_NORMAL) /* parity mode */
printf ("%s ", o.xopt.cor1.parmode == PARM_NOPAR ? "nopar" :
o.xopt.cor1.parmode == PARM_FORCE ? "forcepar" : "???");
printf ("\n");
/* channel option register 2 */
printf ("\t");
printf ("%cetc ", o.xopt.cor2.etc ? '+' : '-'); /* embedded transmitter cmd enable */
/* channel option register 3 */
printf ("%csdt ", o.xopt.cor3.scde ? '+' : '-'); /* special char detection enable */
printf ("%cstripsyn ", o.xopt.cor3.stripsyn ? '+' : '-'); /* treat SYN chars as special condition */
printf ("%cssdt ", o.xopt.cor3.ssde ? '+' : '-'); /* steady state detect enable */
printf ("syn%c ", o.xopt.cor3.syn ? '1' : '2'); /* the number of SYN chars on receive */
printf ("\n");
/* channel option register 6 */
printf ("\t");
printf ("syn=%s ", symbol (o.xopt.cor6.synchar)); /* syn character */
printf ("schr1=%s ", symbol (o.xopt.schr1)); /* special character register 1 */
printf ("schr2=%s ", symbol (o.xopt.schr2)); /* special character register 2 */
printf ("schr3=%s ", symbol (o.xopt.schr3)); /* special character register 3 */
printf ("\n");
break;
}
}
static void
printchan(int channel)
{
printf ("cx%d (%s) %s", channel, chantype (o.type), chanmode (o.mode));
if (o.txbaud == o.rxbaud)
printf (" %lu", o.rxbaud);
else
printf (" ospeed=%lu ispeed=%lu", o.txbaud, o.rxbaud);
if ((o.channel == 0 || o.channel == 8) &&
(o.type == T_UNIV_V35 || o.type == T_UNIV_RS449))
printf (" port=%s", o.iftype ? (o.type == T_UNIV_V35 ?
"v35" : "rs449") : "rs232");
printf (o.sopt.ext ? " ext" : o.sopt.cisco ? " cisco" : " ppp");
printf (" %ckeepalive", o.sopt.keepalive ? '+' : '-');
printf (" %cautorts", o.sopt.norts ? '-' : '+');
if (*o.master)
printf (" master=%s", o.master);
printf ("\n");
if (aflag)
printopt ();
}
static void
printall(void)
{
struct ifconf ifc;
struct ifreq *ifr;
char buf[BUFSIZ], *cp;
int s, c;
s = socket (AF_INET, SOCK_DGRAM, 0);
if (s < 0)
err (1, "socket");
ifc.ifc_len = sizeof (buf);
ifc.ifc_buf = buf;
if (ioctl (s, SIOCGIFCONF, (caddr_t)&ifc) < 0)
err (1, "SIOCGIFCONF");
close (s);
s = open (CXDEV, 0);
if (s < 0)
err (1, "%s", CXDEV);
ifr = ifc.ifc_req;
#define max(a,b) ((a)>(b) ? (a) : (b))
#define size(p) max((p).sa_len, sizeof(p))
for (cp=buf; cp<buf+ifc.ifc_len; cp+=sizeof(ifr->ifr_name)+size(ifr->ifr_addr)) {
ifr = (struct ifreq*) cp;
if (ifr->ifr_addr.sa_family != AF_LINK)
continue;
if (strncmp (ifr->ifr_name, "cx", 2) != 0)
continue;
c = atoi (ifr->ifr_name + 2);
o.board = c/NCHAN;
o.channel = c%NCHAN;
if (ioctl (s, CXIOCGETMODE, (caddr_t)&o) < 0)
err (1, "CXIOCGETMODE");
printchan (c);
}
close (s);
}
static void
set_interface_type(char *type)
{
if (o.channel != 0 && o.channel != 8) {
printf ("interface option is applicable only for channels 0 and 8\n");
exit (1);
}
if (o.type != T_UNIV_V35 && o.type != T_UNIV_RS449) {
printf ("interface option is applicable only for universal channels\n");
exit (1);
}
if (! strcasecmp (type, "port=rs232"))
o.iftype = 0;
else
o.iftype = 1;
}
static void
set_master(char *ifname)
{
if (o.type == T_ASYNC) {
printf ("master option is not applicable for async channels\n");
exit (1);
}
strcpy (o.master, ifname);
}
static void
set_async_opt(char *opt)
{
/* channel option register 1 */
if (! strncasecmp (opt, "cs", 2)) o.aopt.cor1.charlen = atoi (opt + 2) - 1;
else if (! strcasecmp (opt, "parodd")) o.aopt.cor1.parity = 1;
else if (! strcasecmp (opt, "pareven")) o.aopt.cor1.parity = 0;
else if (! strcasecmp (opt, "-ignpar")) o.aopt.cor1.ignpar = 0;
else if (! strcasecmp (opt, "+ignpar")) o.aopt.cor1.ignpar = 1;
else if (! strcasecmp (opt, "nopar")) o.aopt.cor1.parmode = PARM_NOPAR;
else if (! strcasecmp (opt, "forcepar")) o.aopt.cor1.parmode = PARM_FORCE;
/* channel option register 2 */
else if (! strcasecmp (opt, "-dsr")) o.aopt.cor2.dsrae = 0;
else if (! strcasecmp (opt, "+dsr")) o.aopt.cor2.dsrae = 1;
else if (! strcasecmp (opt, "-cts")) o.aopt.cor2.ctsae = 0;
else if (! strcasecmp (opt, "+cts")) o.aopt.cor2.ctsae = 1;
else if (! strcasecmp (opt, "-rts")) o.aopt.cor2.rtsao = 0;
else if (! strcasecmp (opt, "+rts")) o.aopt.cor2.rtsao = 1;
else if (! strcasecmp (opt, "-rloop")) o.aopt.cor2.rlm = 0;
else if (! strcasecmp (opt, "+rloop")) o.aopt.cor2.rlm = 1;
else if (! strcasecmp (opt, "-etc")) o.aopt.cor2.etc = 0;
else if (! strcasecmp (opt, "+etc")) o.aopt.cor2.etc = 1;
else if (! strcasecmp (opt, "-ixon")) o.aopt.cor2.ixon = 0;
else if (! strcasecmp (opt, "+ixon")) o.aopt.cor2.ixon = 1;
else if (! strcasecmp (opt, "-ixany")) o.aopt.cor2.ixany = 0;
else if (! strcasecmp (opt, "+ixany")) o.aopt.cor2.ixany = 1;
/* option register 3 */
else if (! strcasecmp (opt, "stopb1")) o.aopt.cor3.stopb = STOPB_1;
else if (! strcasecmp (opt, "stopb1.5")) o.aopt.cor3.stopb = STOPB_15;
else if (! strcasecmp (opt, "stopb2")) o.aopt.cor3.stopb = STOPB_2;
else if (! strcasecmp (opt, "-sdt")) o.aopt.cor3.scde = 0;
else if (! strcasecmp (opt, "+sdt")) o.aopt.cor3.scde = 1;
else if (! strcasecmp (opt, "-flowct")) o.aopt.cor3.flowct = 0;
else if (! strcasecmp (opt, "+flowct")) o.aopt.cor3.flowct = 1;
else if (! strcasecmp (opt, "-rdt")) o.aopt.cor3.rngde = 0;
else if (! strcasecmp (opt, "+rdt")) o.aopt.cor3.rngde = 1;
else if (! strcasecmp (opt, "-exdt")) o.aopt.cor3.escde = 0;
else if (! strcasecmp (opt, "+exdt")) o.aopt.cor3.escde = 1;
/* channel option register 6 */
else if (! strcasecmp (opt, "parintr")) o.aopt.cor6.parerr = PERR_INTR;
else if (! strcasecmp (opt, "parnull")) o.aopt.cor6.parerr = PERR_NULL;
else if (! strcasecmp (opt, "parign")) o.aopt.cor6.parerr = PERR_IGNORE;
else if (! strcasecmp (opt, "pardisc")) o.aopt.cor6.parerr = PERR_DISCARD;
else if (! strcasecmp (opt, "parffnull")) o.aopt.cor6.parerr = PERR_FFNULL;
else if (! strcasecmp (opt, "brkintr")) o.aopt.cor6.brk = BRK_INTR;
else if (! strcasecmp (opt, "brknull")) o.aopt.cor6.brk = BRK_NULL;
else if (! strcasecmp (opt, "brkdisc")) o.aopt.cor6.brk = BRK_DISCARD;
else if (! strcasecmp (opt, "-inlcr")) o.aopt.cor6.inlcr = 0;
else if (! strcasecmp (opt, "+inlcr")) o.aopt.cor6.inlcr = 1;
else if (! strcasecmp (opt, "-icrnl")) o.aopt.cor6.icrnl = 0;
else if (! strcasecmp (opt, "+icrnl")) o.aopt.cor6.icrnl = 1;
else if (! strcasecmp (opt, "-igncr")) o.aopt.cor6.igncr = 0;
else if (! strcasecmp (opt, "+igncr")) o.aopt.cor6.igncr = 1;
/* channel option register 7 */
else if (! strcasecmp (opt, "-ocrnl")) o.aopt.cor7.ocrnl = 0;
else if (! strcasecmp (opt, "+ocrnl")) o.aopt.cor7.ocrnl = 1;
else if (! strcasecmp (opt, "-onlcr")) o.aopt.cor7.onlcr = 0;
else if (! strcasecmp (opt, "+onlcr")) o.aopt.cor7.onlcr = 1;
else if (! strcasecmp (opt, "-fcerr")) o.aopt.cor7.fcerr = 0;
else if (! strcasecmp (opt, "+fcerr")) o.aopt.cor7.fcerr = 1;
else if (! strcasecmp (opt, "-lnext")) o.aopt.cor7.lnext = 0;
else if (! strcasecmp (opt, "+lnext")) o.aopt.cor7.lnext = 1;
else if (! strcasecmp (opt, "-istrip")) o.aopt.cor7.istrip = 0;
else if (! strcasecmp (opt, "+istrip")) o.aopt.cor7.istrip = 1;
else if (! strncasecmp (opt, "schr1=", 6)) o.aopt.schr1 = atosym (opt+6);
else if (! strncasecmp (opt, "schr2=", 6)) o.aopt.schr2 = atosym (opt+6);
else if (! strncasecmp (opt, "schr3=", 6)) o.aopt.schr3 = atosym (opt+6);
else if (! strncasecmp (opt, "schr4=", 6)) o.aopt.schr4 = atosym (opt+6);
else if (! strncasecmp (opt, "scrl=", 5)) o.aopt.scrl = atosym (opt+5);
else if (! strncasecmp (opt, "scrh=", 5)) o.aopt.scrh = atosym (opt+5);
else if (! strncasecmp (opt, "lnext=", 6)) o.aopt.lnxt = atosym (opt+6);
else
usage ();
}
static void
set_hdlc_opt(char *opt)
{
/* hdlc channel option register 1 */
if (! strncasecmp (opt, "if", 2)) o.hopt.cor1.ifflags = atoi (opt + 2);
else if (! strcasecmp (opt, "noaddr")) o.hopt.cor1.admode = ADMODE_NOADDR;
else if (! strcasecmp (opt, "addr1")) o.hopt.cor1.admode = ADMODE_4_1;
else if (! strcasecmp (opt, "addr2")) o.hopt.cor1.admode = ADMODE_2_2;
else if (! strcasecmp (opt, "-clrdet")) o.hopt.cor1.clrdet = 0;
else if (! strcasecmp (opt, "+clrdet")) o.hopt.cor1.clrdet = 1;
else if (! strcasecmp (opt, "addrlen1")) o.hopt.cor1.aflo = 0;
else if (! strcasecmp (opt, "addrlen2")) o.hopt.cor1.aflo = 1;
/* hdlc channel option register 2 */
else if (! strcasecmp (opt, "-dsr")) o.hopt.cor2.dsrae = 0;
else if (! strcasecmp (opt, "+dsr")) o.hopt.cor2.dsrae = 1;
else if (! strcasecmp (opt, "-cts")) o.hopt.cor2.ctsae = 0;
else if (! strcasecmp (opt, "+cts")) o.hopt.cor2.ctsae = 1;
else if (! strcasecmp (opt, "-rts")) o.hopt.cor2.rtsao = 0;
else if (! strcasecmp (opt, "+rts")) o.hopt.cor2.rtsao = 1;
else if (! strcasecmp (opt, "-fcsapd")) o.hopt.cor2.fcsapd = 0;
else if (! strcasecmp (opt, "+fcsapd")) o.hopt.cor2.fcsapd = 1;
else if (! strcasecmp (opt, "-crcinv")) o.hopt.cor2.crcninv = 1;
else if (! strcasecmp (opt, "+crcinv")) o.hopt.cor2.crcninv = 0;
/* hdlc channel option register 3 */
else if (! strncasecmp (opt, "pad", 3)) o.hopt.cor3.padcnt = atoi (opt + 3);
else if (! strcasecmp (opt, "idlemark")) o.hopt.cor3.idle = 1;
else if (! strcasecmp (opt, "idleflag")) o.hopt.cor3.idle = 0;
else if (! strcasecmp (opt, "-fcs")) o.hopt.cor3.nofcs = 1;
else if (! strcasecmp (opt, "+fcs")) o.hopt.cor3.nofcs = 0;
else if (! strcasecmp (opt, "fcs-crc-16")) o.hopt.cor3.fcspre = 1;
else if (! strcasecmp (opt, "fcs-v.41")) o.hopt.cor3.fcspre = 0;
else if (! strcasecmp (opt, "syn=0xaa")) o.hopt.cor3.syncpat = 1;
else if (! strcasecmp (opt, "syn=0x00")) o.hopt.cor3.syncpat = 0;
else if (! strcasecmp (opt, "-syn")) o.hopt.cor3.sndpad = 0;
else if (! strcasecmp (opt, "+syn")) o.hopt.cor3.sndpad = 1;
else if (! strncasecmp (opt, "rfar1=", 6)) o.hopt.rfar1 = atoi (opt + 6);
else if (! strncasecmp (opt, "rfar2=", 6)) o.hopt.rfar2 = atoi (opt + 6);
else if (! strncasecmp (opt, "rfar3=", 6)) o.hopt.rfar3 = atoi (opt + 6);
else if (! strncasecmp (opt, "rfar4=", 6)) o.hopt.rfar4 = atoi (opt + 6);
else if (! strcasecmp (opt, "crc-16")) o.hopt.cpsr = 1;
else if (! strcasecmp (opt, "crc-v.41")) o.hopt.cpsr = 0;
else usage ();
}
static void
set_bisync_opt(char *opt __unused)
{
usage ();
}
static void
set_x21_opt(char *opt __unused)
{
usage ();
}
int
main(int argc, char **argv)
{
int channel;
for (--argc, ++argv; argc>0 && **argv=='-'; --argc, ++argv)
if (! strcasecmp (*argv, "-a"))
++aflag;
else if (! strcasecmp (*argv, "-s"))
++sflag;
else
usage ();
if (argc <= 0) {
if (sflag)
printallstats ();
else
printall ();
return (0);
}
if (argv[0][0]=='c' && argv[0][1]=='x')
*argv += 2;
if (**argv<'0' || **argv>'9')
usage ();
channel = atoi (*argv);
--argc, ++argv;
if (sflag) {
if (printstats (channel, 1) < 0)
printf ("channel cx%d not available\n", channel);
return (0);
}
getchan (channel);
if (argc <= 0) {
printchan (channel);
return (0);
}
for (; argc>0; --argc, ++argv)
if (**argv == '(')
continue;
else if (! strncasecmp (*argv, "ispeed=", 7))
o.rxbaud = atoi (*argv+7);
else if (! strncasecmp (*argv, "ospeed=", 7))
o.txbaud = atoi (*argv+7);
else if (! strcasecmp (*argv, "async"))
o.mode = M_ASYNC;
else if (! strcasecmp (*argv, "hdlc"))
o.mode = M_HDLC;
else if (! strcasecmp (*argv, "bisync") ||
! strcasecmp (*argv, "bsc"))
o.mode = M_BISYNC;
else if (! strcasecmp (*argv, "x.21") ||
! strcasecmp (*argv, "x21"))
o.mode = M_X21;
else if (**argv>='0' && **argv<='9')
o.txbaud = o.rxbaud = atoi (*argv);
else if (! strcasecmp (*argv, "cisco")) {
o.sopt.cisco = 1;
o.sopt.ext = 0;
} else if (! strcasecmp (*argv, "ppp")) {
o.sopt.cisco = 0;
o.sopt.ext = 0;
} else if (! strcasecmp (*argv, "ext"))
o.sopt.ext = 1;
else if (! strcasecmp (*argv, "+keepalive"))
o.sopt.keepalive = 1;
else if (! strcasecmp (*argv, "-keepalive"))
o.sopt.keepalive = 0;
else if (! strcasecmp (*argv, "+autorts"))
o.sopt.norts = 0;
else if (! strcasecmp (*argv, "-autorts"))
o.sopt.norts = 1;
else if (! strcasecmp (*argv, "port=rs232") ||
! strcasecmp (*argv, "port=rs449") ||
! strcasecmp (*argv, "port=v35"))
set_interface_type (*argv);
else if (! strncasecmp (*argv, "master=",7))
set_master (*argv+7);
/*
* Common channel options
*/
/* channel option register 4 */
else if (! strcasecmp (*argv, "-ctsdown"))
o.opt.cor4.cts_zd = 0;
else if (! strcasecmp (*argv, "+ctsdown"))
o.opt.cor4.cts_zd = 1;
else if (! strcasecmp (*argv, "-cddown"))
o.opt.cor4.cd_zd = 0;
else if (! strcasecmp (*argv, "+cddown"))
o.opt.cor4.cd_zd = 1;
else if (! strcasecmp (*argv, "-dsrdown"))
o.opt.cor4.dsr_zd = 0;
else if (! strcasecmp (*argv, "+dsrdown"))
o.opt.cor4.dsr_zd = 1;
else if (! strncasecmp (*argv, "fifo=", 5))
o.opt.cor4.thr = atoi (*argv + 5);
/* channel option register 5 */
else if (! strcasecmp (*argv, "-ctsup"))
o.opt.cor5.cts_od = 0;
else if (! strcasecmp (*argv, "+ctsup"))
o.opt.cor5.cts_od = 1;
else if (! strcasecmp (*argv, "-cdup"))
o.opt.cor5.cd_od = 0;
else if (! strcasecmp (*argv, "+cdup"))
o.opt.cor5.cd_od = 1;
else if (! strcasecmp (*argv, "-dsrup"))
o.opt.cor5.dsr_od = 0;
else if (! strcasecmp (*argv, "+dsrup"))
o.opt.cor5.dsr_od = 1;
else if (! strncasecmp (*argv, "rfifo=", 6))
o.opt.cor5.rx_thr = atoi (*argv + 6);
/* receive clock option register */
else if (! strcasecmp (*argv, "nrz"))
o.opt.rcor.encod = ENCOD_NRZ;
else if (! strcasecmp (*argv, "nrzi"))
o.opt.rcor.encod = ENCOD_NRZI;
else if (! strcasecmp (*argv, "manchester"))
o.opt.rcor.encod = ENCOD_MANCHESTER;
else if (! strcasecmp (*argv, "-dpll"))
o.opt.rcor.dpll = 0;
else if (! strcasecmp (*argv, "+dpll"))
o.opt.rcor.dpll = 1;
/* transmit clock option register */
else if (! strcasecmp (*argv, "-lloop"))
o.opt.tcor.llm = 0;
else if (! strcasecmp (*argv, "+lloop"))
o.opt.tcor.llm = 1;
else if (! strcasecmp (*argv, "-extclock"))
o.opt.tcor.ext1x = 0;
else if (! strcasecmp (*argv, "+extclock"))
o.opt.tcor.ext1x = 1;
/*
* Mode dependent channel options
*/
else switch (o.mode) {
case M_ASYNC: set_async_opt (*argv); break;
case M_HDLC: set_hdlc_opt (*argv); break;
case M_BISYNC: set_bisync_opt (*argv); break;
case M_X21: set_x21_opt (*argv); break;
}
setchan (channel);
return (0);
}