P8000/WEGA/contrib/K5JB/note.unix

476 lines
26 KiB
Plaintext

k5jb.k37.txt and preface to unix.note
There may no longer be any interest in the old NET program for Unix and
MS-DOS, but I am still running it (along with JNOS) and making occasional
changes to it.
This version contains only a couple of minor changes from k36, but is
uploaded because of the poor judgement I used in uploading .lha archives.
I use .lha archives for portability and convenience but overlooked the fact
that most Unix people don't have it. One change in k37 is addition of a
deadlock breaker in the lapb layer which can happen if the other station
returns RNR and we miss the RR signalling that it is unbusy. Now we more
closely follow the AX.25 specification by polling. I bent the rules and
let it poll even if we are running version 1 protocol, but haven't found
any bad side effects from doing it. BM has a minor modification that
permits displaying one additional line instead of the full screen at the
"Hit any key..." prompt.
The .tar.Z files uploaded with this kit were done with plain, old tar,
and plain old compress. These should be the lowest commen denominator.
The only changes in k36 from the previous upload, which was an incremental
upload for k35c on Jan 6, 95, were: 1. Some twiddling with telserv, 2.
revision of the way we discard spurious I frames & modification to VCIP_SSID
to retain vax25 in arp add command, and 3. some modifications to packet
driver which would only affect MS-DOS version. There was a minor fix
made to BM since the last upload.
It is no longer necessary to put call signs in an iponly table to deal
with ROSE switches. When ax25 mycall is set, and THEN ax25 mboxcall is
set, a flag will be set to cause all I frames containing F0 PID directed
to our ax25 mycall to be ignored. If this behavior is not desired, set
ax25 mycall again after setting ax25 mboxcall and I frames to mycall
will spawn a mailbox. The following were notes used when k35 was
posted.
Version k37 was uploaded to ftp.ucsd.edu as a complete source code kit.
Most of the previous files are irrlevant. A complete kit of useful files
would consist of:
k5jb.k37.txt -- This file
k5jb.k35upd.usr -- File for users. Contains most recent changes.
k5jb.k37.tar.Z -- Source code for Unix KA9Q NET
k5jb.k35doc.tar.Z -- Relevant user documentation for same.
k5jb.k37bm.tar.Z -- Source code for BM v.3.3.1n4, mailer. Updated a little.
k5jb.samp.tar.Z -- Optional, Sample startup files for beginners.
(These files on ftp.ucsd.edu are either in /hamradio/packet/tcpip/incoming,
or in /hamradio/packet/tcpip/k5jb.)
Brief description of Unix NET
NET is designed as an MS-DOS application, so does not make full use of Unix's
multi-tasking ability but runs quite well in Unix. You can use it in a Unix
windowing environment (or in shell layers), or you can shell out and leave
NET running in the background. If you choose to use shell layers you must
prevent blocking on input if you make the window session inactive. See the
doc on how to do this.
If you are unfamiliar with NET (the TCP/IP suite, written by Phil Karn, KA9Q,
and preceding his current project, NOS), you need to break out the files in
k5jb.k35doc.tar.Z and browse them. k5jb.k37.tar.Z contains a file,
note.unix, which has modification information.
(End of k5jb.k37.txt)
Brief description of kit
More detail on files contained in this set:
k5jb.k37.tar.Z
Contains files needed to compile NET under various System V, Release 3
versions of Unix (I use AT&T); under Coherent, and under OS9-68K. This file
also contains note.unix, a collection of revision notes, and note.os9 for
information specific to Unix, Coherent and OS9-68K that I not yet included
in the main documentation.
k5jb.k37bm.tar.Z
Contains source for Bdale's Mailer (BM). Works with same environmental
variables as K5JB version of NET. Has been sanitized to prevent memory
violations. Version in this kit is 3.3.1n, modified to deal with some
non-RFC-822 compliant mailers (like ELM), and to correct some errors in
file reading.
k5jb.k35upd.usr
Contains changes made to NET. Written for the user. Some of the
changes affect composition of startup.net.
k5jb.k35doc.tar.Z
Contains NET and BM user's documentation. Targeted for MS-DOS users, but
contains essential Unix information.
k5jb.samp.tar.Z
Contains a rough set of sample configuration files for setup. I didn't
make any particular effort to cover all instances so you must look at
chapter0 and decide if you want to go on from there.
Coherent users have no need to shell out or use the Ctrl-\ (quit) switch on
NET if they are using virtual terminals. NET runs fine when its window is
not active. In fact, using the quit signal removes one of the two places
where the CPU is released to do other tasks. If you start NET with no
serial ports attached (like if you have no startup.net file), and issue
a quit signal to ignore keyboard input, NET will become a CPU hog,
consuming an enormous amount of the machine's resources.
The Coherent problems described in earlier NET releases are now fixed with
completion of some functions by the time version 4.0.1 was released. Block-
ing reads with timed releases, finer time granualarity, and normal creation
of temporary files makes this the Coherent version almost the same as the
regular Unix version of NET.
Unix Supplement to K5JB manual for kit of KA9Q NET (pre NOS TCP/IP)
In k5jb.doc(ver).tar.Z, the files, chapter0 through chapter8, (referred to
herein as "doc") contain the documentation for NET. This supplement contains
information specific to Unix and Coherent which has not been incorporated
into those files.
The doc files are adapted from the primary MS-DOS environment so you have to
wade through a lot of MS-DOS specific stuff, but the Unix information is
there, if somewhat terse.
If you want the MS-DOS files, contact TAPR, which maintains current versions
in its library.
There are three makefiles, Makefile.unix, Makefile.coh and Makefile.os9.
Link the correct one for your operating system to Makefile. Be sure the file
depend.out (Unix) is relevant to the configuration you select in config.h
and options.h. The depend.out supplied in this kit relates to the version I
last compiled, and reflected in the config.h, options.h and unixopt.h supplied
in the kit.
Use "make depend" to use the shell script mkdep. Note that the depend.out
supplied also relates to files in MY MACHINE. It is unlikely you have the
same files do do a "make depend" before you compile. I could have
supplied a zero length depend.out but you would have thought I was crazy.
Coherent dependency is handled differently. The shell script, mkdep, doesn't
work with Coherent so source code for mkdepcoh.c, a dependency maker, is
provided for that system and the dependency information is kept in Makefile
(Makefile.coh). You shouldn't have to make a new dependency list unless you
make changes to the #includes. If you make such changes you can edit the
dependency directly or use mkdepcoh for a wholesale update. (Direct
mkdepcoh's output to a temporary file, and perhaps pipe through sort before
pasting into Makefile.) See the note in Makefile regarding spurious files,
like "enet.h" that must be deleted. If you miss them, your compiler will
find them for you. In unixopt.h, be sure and make suitable changes if
you are running Coherent, particularly the later versions.
To compile bm with Coherent, you need to edit the file makefile.unx (in
k5jb.bm.tar.Z) to include the #define COH386.
I haven't tested NET on Coherent very extensively. One person reported
that he was unable to log in from a serial port. He is right and I don't
know why that is. Another person was having some trouble at the console so
I advised him that I was using virtual terminal drivers. I don't know if
that helped him or not but he reported back that it was running fine.
I haven't tried logging in from the serial port since I got the Coherent
4.0.1 release.
The following applies to older versions of Coherent. If you are running
release 4.0.1, or a later, version, see the notes in Makefile.coh and in
unixopt.h, and define COH4 to override the patches made for the deficient
version(s). If you are running an earlier Coherent release, but not the
earliest, try compiling with COH4 defined to see if it works.
There were three (known) deficiencies in the older Coherent version. Times()
didn't return a the long integer value of clock ticks like the Unix times()
so I had to use time() to get clock ticks. Therefore, timing had one second
granularity instead of 10 ms. (Tick(), referred to in the Coherent manual,
was non-existent in my release of Coherent.)
(Net times and controls events by maintaining a linked list of timers that is
synchronized with the CPU's internal clock. In Coherent's /usr/include/sys/-
timeout.h see the tim struct for a similar struct as the one used for this
linked list. In Unix machines clock ticks are usually 60 or 100 Hz. Having
to use Coherent's time() function which returns seconds since 1/1/1970 is
probably satisfactory except that short duration processes, like pinging
yourself, will not return realistic values.)
There was no tmpfile() function in Coherent so temporary files I created with
tmpnam() were not deleted when you quit NET. They were created in /tmp and
were deleted if you reboot.
Note that the termio structure members where the control characters are kept
can be used for timeout values if canonical processing is disabled. This
didn't work in earlier Coherent, so I used a poll trick to make a micro-sleep,
which worked very well. See sys5_io.c. The value of the argument to sleep2()
is a manifest constant kept in unixopt.h. You can dink with this number
(milliseconds) to tune performance. (Note that sleep2 has a granularity of
10 ms.) Later Coherent has a similar function, nap().
A couple of Coherent users reported NET caused a core dump, or did other
un-nice things when starting. The problem may be related to the Coherent
driver kit. I'm really sorry about that, but things like that just happen.
My tests of NET in Coherent consist of running it a few hours on the air
whenever I make changes, and testing all the things that I changed. I
have never had it behave badly.
(I understand Coherent is no longer available. Too bad.)
Telunix
(Thanks to VE6BC for prompting me to fix telunix.) Telunix provides remote
login via telnet. If your computer has pseudo terminals (ptys) on it, you
can compile NET with the option, TELUNIX, set in unixopt.h and the telunix
server will be available for attachment. The failure mechanism built into
the telunix start procedure can tell if you don't have ptys, but it can't
tell if you don't have pty slaves prepared for logins. If you don't, the
start telunix command will appear to work, but users who try to log in will
just get their commands echoed back to them.
Here is how I tested the telunix under Coherent. I added three pseudo
(slave) terminals to /etc/ttys, like this:
1lPttyp0
1lPttyp1
1lpttyp2
(They were already identified in release 4.0.1 and I only edited the leading
0 to a 1 to enable three ports.)
And issued a kill quit 1 command before starting NET.
To enable your login server, use the command (either from command prompt or
from startup.net) "start telunix". It has an optional argument. Default
login "well known" socket number is 513, but you can use any unassigned
number. If you don't use telnet, (or even if you do) you can start telunix
23 and any incoming telnet session started without argument will get the
login. Users normally have to use a telnet <host> 513 to get the login on
your machine unless they have altered their telnet clients to handle the
argument, "login" (doubtful).
If a user simply closes the telnet session while logged in, it appears that
the login closes normally, but there is no mechanism for closing the telnet
session when a user logs out. Also, there is no processing of user's end of
line sequence, so I suggest that you prepare .profiles for your public login
directories (guest, anonymous, etc.) containing at least the following:
stty -echo
echo "Welcome Message ..."
echo "To prevent double prompts, do \"eol unix\" before starting telnet."
echo "Use \"exit\" to log off, then \"close\" from your end to close session."
cd /usr/public # or whatever you want to do with him...
I had to take extraordinary steps to play pty on my AT&T 3B2. On it the
master pty blocks on read, and I'll be damned if I can figure out a way
to anticipate it. So, I made a child process that does the blocking
read and puts all it gets into a pipe which NET can read from. If you
have this particular problem, contact me and I can provide the telunix.c
files that I used.
This problem with telunix prompted me to do a more general server/client
process for NET using the interprocess communications (IPC) messages
available to me. The client stub is in telserv.c. I can supply you a
sample server process if you don't know how to make one yourself. You
first have to decide what you want that process to do (look out the
window at the weather, look up a callsign, add two numbers, login into
your stupid computer, whatever) and then make the server do it.
I finally completed the shell (!) command to spawn a child process which
executes the shell for you to return while NET continues to run. I chose
to not enable the ! <cmd> syntax because the method I used has some possible
problems with certain Unix processes. The shell (!) command simply spawns a
shell process which runs until you quit it with an exit or a Ctrl-D.
What you do from here on is up to you...
Those of you who have OS9-68K have Bob Brose, N0QBJ, to thank for porting
the code. See his note, note.os9 in the kit.
Most recent changes
Source Code Notes for the Programmer
Oct 1995
Since the complete set of source notes is getting lengthy, I will only be
including the tail end of my notes. If someone wants a blow-by-blow account
of the changes since April 1989 they can contact me for my notes.
6/26/93 k30 - Corrected error in smtpcli.c where atoi() was used instead of
atol() for smtp timer value. Note that there are a lot of inconsistent usages
of atoi() where casts are needed, particularly where the value is to be put
into socket.port, which is int16 (short). The effects appear to be benign,
but in Unix, there is a large difference from an int and a short. Note also
that there are no bounds checking in ax25cmd.c. Bizarre values can be entered
for ax.25 variables. (Later cleaned up the atoi() usages and most of bounds
checks in all user-entered commands.)
In main.c, log(), corrected longstanding omission where the AX.25 mailbox
queues a message with a null tcb. This makes spurious log entries, so simply
changed this condition to put "AX25 Mailbox" in the log.
7/12/93 still k30 - Swept through the code and replaced occurences of \r and
\n where it was intended that a 0x0d and \0x0a be sent over radio. (Used
octal for portability.) This should permit porting more easily to OS9/OSK.
(Thanks to Bob, N0QBJ, for showing me the light.) Did some work on the drsi
driver to enable a maximum of 2 cards and incidentally cleaned up compiler
warnings. Added another switch, SHELL, to options.h to permit skipping the
shell commands. They aren't worth having in MS-DOS since NET stops while
shelled out, and the interrupt reaction is unpredictable.
9/6/93 k31 - Incorporated changes made by Bob, N0QBJ, so NET would compile as
well under OS9-68K. Added a receive overrun counter to the MS-DOS version.
Revised the line editing in ttydriv.c, corrected reference to "FTP" in
session,c (should have been "Finger").
11/7/93 k32-k33 - Added AX.25 segmentation, along with an ax25 seg command,
and revised lapb handling to try and reduce obsolete packets queueing in KISS
TNC. Did it by making t2 effective. The latter made an enormous improvement
in AX.25 connected mode operation. Added ability to tune interface mtu after
program started by adding param <iface> mtu command. Corrected error in up-
loading to an incoming telnet session, and corrected a midnight anomoly in the
PC clock. (It was jumping back to zero and causing the timer to do an hour's
worth of looping which caused some interesting ax.25 problems!) Recovered
considerable code space by eliminating duplicate code in lapb.c. Wrote some
advice regarding parameters and put it in Chapter 5 of the operator's manual.
1/11/94 k34 - This is the most modified release yet. Replaced the vcircuit
scheme (for dealing with ROSE circuits) with an IP only virtual circuit call
sign. This greatly simplified dealing with ROSE and substantially reduced
code size. The ax25 vcipcall command syntax is, ax25 vcipcall [<call-ssid>].
In conjunction with this, I changed two commands, the arp add, and the route
add commands. In arp add, I added another "hardware" type to the arp table.
This new type, "vax25", signals NET to use virtual circuit to reach a
specific station. In route add, I changed the syntax to, route add <dest
addr>[/<bits>] <if name> [gateway|*] [metric]. The [gateway|*] permits using
a value for metric without specifying a gateway. This metric value, if
present, replaces the interface mtu for a specific route, permitting tuning
by route.
I also enabled NET to operate in AX.25 Version 1 protocol as well as Version
2. NET's default on starting is V1, but can be changed with the ax25 version
[V1|V2] command. (The default governs with what version NET starts a connect-
ion. Regardless of the default, NET will switch to the same version used by
the other end.) Along with these changes I did some completion work on the
ax25 stat and tcp stat commands, and incidentally added a "time since last
heard" report to the tcp stat command.
I added a prompt, "FTP>" to the ftp client. I also added a message of the day
(motd) command for incoming telnet sessions. Default is none. motd <One line
message> creates one, motd - (dash) deletes it. Also added an axmotd command
so a custom greeting could be made for AX.25 and Netrom chat users. There is
a default. This axmotd will be sent even if the mbox is not turned on. Note
that an incoming telnet or AX.25 chat session will automatically become the
current session. If this bothers you, define POLITE in config.h.
I wrote an extended KISS driver (ekiss.c) that takes over when you use the
command attach asy, and specify mode ax25. It is backward compatible with
the previous KISS driver, but if an additional argument for the number of
pseudo ports is given, it creates them, appending "0", "1", etc to the name.
This driver replaced the KPC-4 driver.
I re-organized all the terminal input-output and text file writing into one
place (session.c) to eliminate duplicate code and provide better control for
different operating systems. Simultaneously, I added bios routines to simul-
ate the alternate video attributes on incoming telnet traffic as was done in
the Unix version with curses, and extended the process to AX.25 as well as
Netrom sessions. Grep for CUTE. There is rudimentary color control. The
routines have one known flaw, having to do with scrolling and inherited at-
tribute, but I am not concerned about perfection here.
While browsing files, whenever practical, I combined sequential printf()s and
other unnecessary function calls to cut code size. I started removing refer-
ences to Portable Plus, Atari ST, MAC, etc, because I seriously doubt anyone
will mess with NET on those things and I have no assurance that they work.
If someone is interested, it will be easy to exhume the old files.
I #ifdefed out the directory sort in dirutil.c. Code is 1016 bytes smaller
with simplifed directory routine. You can enable it if you think it is worth
it (after crunching, sorting only adds 368 bytes).
In the Unix version, I made some alternative telunix.c files to deal with
different kinds of pseudo terminal problems, and created a new client, tel-
serv.c which uses Unix's IPC message processes to communicate with a separate
server. Assigned it port 87, one used by NOS ttylink, until I decide what to
do with it. I completed the "shell" (!) code in Unix so it creates a child
process so NET will continue to run in the background while the user is
shelled out at the terminal. This is much simpler to use than "shl" the
shell layer manager. (This code is still being changed as I release k34 but
appears to run OK at this time.)
I corrected errors in AX.25 Mailbox (in s jy1@w1aw, the @ was punched out),
and converted all callsigns to lower case, which reduced SMTP processing
cycles by one. I combined some mailbox duplicate code into a couple of fun-
ctions to recover some space. Corrected an omitted ttyflow in netrom chat
session. Corrected error that permitted a user to enter garbage call signs
when doing connects. Added some constraint on some of the user variables
(e.g. AX.25 T1 & T2), and removed erroneous scaling of T2 and T3 times for
digipeat strings. Corrected errors in smtp t, netrom obs, and netrom nodet
commands that showed awful things if you set to zero.
In order to make NET easier for the radio amateur to set up, as I work
through them I will be making defaults more closely match the radio environ-
ment so it will be unnecessary to correct the defaults in autoexec.net, e.g.
when an attach asy command refers to ax25 hardware type the default tcp mss
is jerked down to 216 Likewise, I changed several defaults to more realistic
values for radio (e.g. tcp irtt, netrom ttl, ip ttl). Non-radio users will
just have to know what they are doing to use NET. I made the netrom verbose
option a compiler option. Grep for NR_VERBOSE.
To further assist new users, I added tests in fileinit() (files.c) to create
Note, Warning, and Error messages when NET starts. Error conditions stop
NET. Defining SKIP_FSCHECK bypasses these tests. Some functions were moved
out of main.c and into files.c to reduce main.c's bulk.
With all these changes, the only four that may affect a previous autoexec.net
or startup.net are the netrom verbose, netrom bcstifle, mbox and attach kpc4
commands. The netrom and mbox commands were changed to respond to on|off to
be consistent with other commands. Incidentally mbox is now defaulted on.
Users who were using the Kantronics KPC-4 or KAM with both ports active must
now use the attach asy command instead of attach kpc4. Since most users have
no business sending out netrom broadcasts containing their routing tables I
made this a compile time option, normally omitted. I made the exit com-
mand require an argument to help prevent accidental exit. (Error message
reads, "Usage: exit please".) I fixed up the trace command so it was easier
to use and added an option, info_only, default active, which prevents display
of AX.25 supervisory frames in tracing. I removed some spurious linefeeds in
the trace display, and added a space between displayed frames.
I replaced the requirement for typing in memory addresses for TCP, AX.25, and
Netrom control blocks with numbers (1, 2, ...). The numbers are displayed
with the stat command and further reference is by that index number. The TCP
reference number is static, unchanged between calls to tcp stat command, the
AX.25 and Netrom numbers are dynamic and can change between stat commands if
sessions open or close.
I got tired of looking at some of the nested #ifdefs for start options, stop
options and attach asy commands. Put the former in config.h and the latter
one in options.h. You have to edit them to suit the configuration.
The final changes before release dealt with smtp. Because of brain-damaged
Wampes, I had to provide a way to send "QUIT" in a separate packet. Since
this lowers NET's performance, it is not the default. Users who have to
deal with Wampes might have to use an undocumented command, smtp timer w,
which will change NET's behaviour when sending mail. (This is a toggle.
You can see the current state with the smtp timer command. If wampes is in
effect, a "W" will appear to the right of timer values. Since I was in
smtpcli.c messing around, I worked it and smtpserv.c over to stop chronic
adding of lines to the ends of messages. I also fixed an error in BM that
was adding unnecessary line to the last message in the mail file.
7/94, k35
Much twiddling of things to try and make the NET> prompt come up more
consistently. Fixed handling of zero length I frames. Hardened the
mailbox a little and added "X-Msgtype" to messages posted with AX.25.
Added test of mail left with "." only on a line. Fixed error in Telnet
relating to IAC. Fixed omitted format fields in a couple of printf()s.
Did more work on combios driver once I found one that would transmit in
blocks. Fixed an old error in upload and changed "upload stop" to
"upload off" (to abort an upload). Modified smtpcli.c to make multiple
redirections possible (user%host3%host2%host1@host0). Fixed error in
ax25cmd.c relating to vcip ssid.
Finally got a Coherent release that fixed things I had to work around.
Version 4.0.1 now is almost same as Unix in handling blocking reads,
reading system clock ticks, and making temporary files. Makefile.coh
and unixopt.h have places to define whether the newer Coherent is to be
used. (This version is a honey on a 486/66. Really makes my old AT&T
3B2 look like a plug.)
Changes since K35 have been few and I lack enthusiasm to make detailed notes.
A rewrite capability like used in NOS has been added. In the MS-DOS version
I revised the packet driver stub so I could use a software pipe between NOS
and my NET. Some minor AX.25 twiddling done, and that's all I can think of.
73 es Enjoy!
Joe Buswell, K5JB@K5JB.OK
[44.78.0.2]
3312 N. Idylwild Dr,
Midwest City OK 73110-1643
Internet: k5jb@k5jb.org