[fa.info-vax] Preliminary DEUNA document.

info-vax@ucbvax.ARPA (09/22/84)

From: engvax!KVC@cit-vax

Ok, enough people wanted this that I am blasting it to the whole
mailing list.  This is a very preliminary version.  We have since
gathered some more information, but the little bit in here could
be valuable enough to the right people that I am not going to
wait for the final paper.  We also have a program that reads the
DEUNA counters (undocumented) and prints a monitor-like screen
of them.  Kinda handy for watching your traffic, although the
data comes fromsuch a low level that it is very hard to interpret.

I will send out the bigger paper when my co-author (Ned) gets
back from Oklahoma (yuck).  If anyone wants the counter-displayer,
I will see what I can do about distributing that too...
------------------------------------------------------------------


        DEUNA Programming Considerations


We recently completed adapting an implementation of TCP/IP for a DEC 
DEUNA that was originally written for a Interlan NI1010 device. The 
code was written in BLISS and operates under VAX/VMS. We thought our 
experiences might be of interest to anyone trying to choose proper 
network hardware.

Using the Interlan NI1010 and its device driver NIDRIVER is a very 
straightforward affair. One person assigns it (exclusively) and 
proceeds to read and write packets with simple QIOs (P1 is the packet
address, P2 the packet length). The packets include the Ethernet 
header, so the address being sent to is just part of the data being 
sent (Question -- the sender address is also part of the packet; can 
the user set this to other than his own address in order to "forge" a
packet??). The same stuff applies for receives.

The Interlan has a lot of special functions to run onboard 
diagnostics, control the number of UBA map registers used for buffers
and so forth.

The DEUNA and its associated XEDRIVER, by contrast, are much more 
complex beasts. The documentation in the I/O User's Guide is some of 
the worst we have ever seen -- it is unclear and even out and out 
wrong in some places. The following material was determined by much 
experimenting and eventually by reading the XEDRIVER source on fiche.

When a channel is assigned to the DEUNA (XEA0) the driver creates a 
new UCB (in effect a new device) and hands this newly created entity 
back to the caller (XEAn, where n>=1). The result is that many people
may use a single DEUNA all at once for different tasks. Everybody 
gets their own unit.

There are restrictions on what the various folks on the DEUNA may do 
while they are sharing it, however. The DEUNA only has one Ethernet 
address (aside from multicast addresses) available. The first person 
that gets the device may set the address. After that, as subsequent 
people assign channels, they are denied permission ("bad parameter") 
to set the receive address. You have to be the exclusive user to set 
that address.

Now, everyone uses the same device address, so the DEUNA uses the 
Ethernet protocol word (a field in every packet) to pick who gets 
what. This can be done in one of three ways. The first person to use 
a given protocol gets to pick how the protocol may be used by others:

   (1) Exclusive use. This protocol is reserved for the current user.
       Anyone else who tries to use it gets a "bad parameter" error.
       This is the default when someone starts to use a given protocol
       unless otherwise specified.

   (2) Default user. Anyone may use this protocol to transmit, but only
       the default user (the first one to use this protocol) gets any
       receive packets.
       
   (3) Shared use. Each user is required to declare who they are going to
       be sending to. Then users are locked in to sending each to their
       single specified destination. When a packet is received, the driver
       figures out who its from and hands it to whoever is sending to that
       particular place. If no one is sending there the thing is thrown
       out.

This is all fairly nasty and complicated, but it gets even worse. 
There are some special facilities of the Ethernet/DEUNA that have 
characteristics of their own:

   (1) Promiscious mode. This is a mode where the device receives ALL
       packets, not just those addressed to it. The documentation says
       that only one unit can have promiscious mode enabled, but we
       found it impossible to share the device and have it enabled at all.

   (2) Echo mode. This is a setting where the any messages transmitted are
       also regarded as received messages. The usual receive rules as to
       who gets the packet apply. This can only be used by one unit on a
       given DEUNA. If this is turned on you can do wierd things like
       activating default user mode and sending a packet to another
       user of the device. It is particularly useful for debugging, when
       you have no idea what is actually flying around out there.

   (3) Loopback mode. This is the same as echo mode except that the message
       is never actually sent out on the net. The documentation says you
       use the symbols NMA$C_LINCN_NOR and NMA$C_LINCN_LOO to control
       this. These symbols do not exist. We found that NMA$C_STATE_ON and
       NMA$C_STATE_OFF, which are used with most of the other settings,
       seems to work.

   (4) Multicasting. Multicasting is an Ethernet "feature" whereby messages
       can be sent to more than one receiver simultaneously. Only one unit
       can have this active at a time. The multicast addresses (up to 10 of
       them) are specified by the user. The list of addresses may be
       modified by appends or deletes at any time.

   (5) Data chaining. We have no idea what this is. The documentation is
       not informative. Any unit can use it or not as its chooses.

The actual QIO's to set all this up are fairly simple. An IO$_STARTUP
is used to initiate activity. This runs the onboard diagnostics, 
which take about 6 seconds. The P2 parameter can be used to pass a 
list of parameters and settings. This list takes the form of 
parameter name, parameter value, parameter name, parameter value, etc
. It is passed by descriptor. Exactly the same list is used with IO$_
SETMODE if something needs to be changed later. However, IO$_
SENSEMODE tries to return the ENTIRE list into a user-supplied buffer
; you don't get to pick what you want. (The documentation implies 
that you do.) It always returns things in a specific order and you 
only have to give it a long enough buffer to get what you want. The 
exact order can either be determined by experiment or by looking at 
XEDRIVER source (see the table LINE_PARAM).

The IO$_SENSEMODE function also has an undocumented feature. The 
DEUNA maintains a slew of statistics about what is going on on the 
Ether. These counters may be read using the function modifier IO$V_RD
_COUNT on the IO$_SENSEMODE call. If IO$V_CLR_COUNT is used the 
counters are read and then zeroed. The counters returned are in the 
order defined by the hardware starting with the seconds since the 
counters were last zeroed. Refer to figure 4-16 (page 4-31) of the 
DEUNA User's Guide (NOT the IO User's guide) for a complete list of 
all the counters. The counters apply to the whole DEUNA and it looks 
as though anybody can read or clear them with impunity.

When transmitting the P5 parameter specifies who the packet is being 
sent to; the actual packet data (passed as P1) does not contain the 
Ethernet address as it does on the Interlan. Similarly, on receives 
the P5 parameter optionally returns who the sender was. If you don't 
bother with P5 you will not know who the sender is (unless shared 
access mode is used in which case packets from all but one source are
screened out).

One more gotcha:

Due to the potentially large size of Ethernet packets you have to 
watch your nonpaged pool carefully when using the DEUNA (especially 
when TWO operations are active at the same time). Also, we were 
getting SS$_EXQUOTA errors for a while until we bumped the SYSGEN 
parameter MAXBUF, which controls the maximum size of an I/O buffer 
allocation (EXE$ALLOCBUF). The default is 1300 or so, the max 
Ethernet packet is 1500 bytes.

Conclusions:

For our application the DEUNA was the only choice (it was nice to 
find this out in retrospect -- we didn't have any say in the hardware
purchase). We are now happily running both DECnet and TCP/IP out of 
the same DEUNA. This would not have been possible with an Interlan, 
both because it cannot be shared and because DECnet does not support 
it. It took us only 4 man-days to get TCP/IP running on the DEUNA, 
and we were both programming in a language completely new to us (
BLISS). Also, the fact that the DEUNA can handle even more stuff at 
once brings up other possibilites like running BACKUP directly over a
DEUNA protocol circuit. (DECnet seems to run at about 280Kbaud, TCP/IP
at around 140Kbaud. A raw circuit should be much faster.)

	Ned Freed		(scgvaxd!ymir!mathmgr @ CIT-VAX)
	MATHLIB Project
	Harvey Mudd College
	Claremont, CA. 91711

	Kevin Carosso		(engvax!kvc @ CIT-VAX)
	Hughes Aircraft Co.
	(213) 648-1025