n2dsy@hou2d.UUCP (G.BEATTIE) (04/08/88)
/*
Machine Independent Asynchronous Framing Technique (AFT)
Version 1.0, by John Howell (N2FVN), Copyright August 7, 1987
This software is free for non-commercial use. All commercial
rights are retained by the author or his designees. Commercial
use without the explicit written permission of the author is
prohibited. This package is provided on an 'as is' basis
without warranty.
*/
/* Macros */
#define FLAG 0x007E
/*
This is the flag character which is used to start and end
frames. The send generates separate starting and ending flag
characters, but the receiver can accept a single flag to end one
frame and start another.
*/
#define LEAD_IN 0x007D
/*
This is the lead in character which is used when transparency is
required. When the receiver detects this character it takes the
following character and exclusive ors it with 0x20 to produce
the proper character. This is used to allow the transmission of
characters which would not otherwise be received properly.
*/
#define TRANSPARENT(c) (c ^ 0x20)
/*
This is the function to be performed to convert a character into
one which may be transmitted transparently. This is also used
to return a character to its original value since the function
is its own inverse.
*/
#define IDLE_CODE (0x0100 + FLAG)
/*
This is the idle code with is returned by aft_tx_char when it
has no frame to send. The high order byte indicates completion
and the low order byte is a flag which might be sent if flags
are to be used between frames as filler.
*/
#define GENERATOR 0x8408
/*
This is the generator polynomial for the frame check sequence.
The polynomial is the standard CCITT polynomial. It is in
reverse bit order for faster calculation. The polynomial is
X**16 + X**12 + X**5 + 1.
*/
#define EXPECT_FCS 0xF0B8
/*
This is the expected final FCS for a correctly received frame.
*/
#define OK 1
/*
This is the return code used by some routines to indicate
successful completion.
*/
#define NO_GOOD 0
/*
This is the return code used by some routines to indicate
unsuccessful completion.
*/
/* Global declarations */
static char opt_ebdt;
/*
This is a flag controlling the use of eight-bit data
transparency on transmitted and receive frames.
*/
static char opt_transparency_level;
/*
This is the transparency level to be used when transmitting
frames (0-2). Each increasing level causes more characters to
be avoided when sending frames which allows them to be sent in
situations where certain characters are not allowed.
*/
static char opt_suffix_len;
static unsigned char opt_suffix[3];
/*
This is the suffix string to be added to the end of each frame
sent. Any character including a null is allowed.
*/
static unsigned int opt_max_rx_len;
/*
This is the maximum size of a receive buffer. It is used when
receiving to make sure that a received frame does not go past
the end of the buffer. A received frame which is too long will
be discarded.
*/
static unsigned char transparency_level [256] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 2,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
/*
For each possible character this is the transparency level at
which it should be encoded for transparency. A value of nine is
used for character which should never be encoded.
*/
/* Variables and macros used by aft_tx_char */
static char tx_char_state;
/*
This is the state of the transmission routine which handles
transparency, delimiting of frames, and frame abort. It is used
to determine the next action to be performed by aft_tx_char when
it is called. State names are given by the 'TCS_' macros.
*/
#define TCS_IDLE 0
/*
This state