uucp level g protocol

Dennis Bednar dennis at rlgvax.UUCP
Fri Nov 15 08:33:33 AEST 1985


Recently there was some requests for info on the uucp level g protocol.
I dug up some old notes that I had, and recently editted them, based
on what I remember.  Here they are:


              The level g protocol (g-protocol) is a  link  level  protocol
         analogous  to X.25 level 2.  g-protocol uses timeouts, retransmis-
         sions,  acknowledgements,  and  packet  checksums   for   reliably
         transferring  information  from  one machine to another. Data sent
         from the user program on the sending machine is passed to the user
         program  on  the receiving machine, in the same order, and without
         loss or duplication.  Each machine has a send window which  limits
         the  number  of  outstanding  DATA  packets,  and serves as a flow
         control.  Ordering  is  maintained  by  adding  PS  (packet  send)
         sequence  numbers  on  the  sending  side, and by replying with PR
         (packet receive) sequence numbers on the acknowledging side.   The
         protocol  details  are  hidden from the user program on each side.
         The program on each side first issues an  open  call.  The  sender
         transmits  data  with  protocol write calls, and the receiver gets
         data with protocol read calls.  At the end of the link connection,
         both programs normally call a protocol close routine.

	[Ed note: level g is *functionally* the same as X.25 level 2,
	but the packet types, and packet formats are drastically different.
	For opening a connection, X.25 uses the SABM and UA frames,
	level g, however, uses the INITA, INITB, and INITC frames,
	both sides must send all 3 packets and receive all 3 packets.
	For transmission of DATA, X.25 uses I-frames, level g uses
	DATAL (data long), and DATAS (data short).  For acknowledgement
	purposes, both protocols use RR (Receiver Ready).
	X.25 has 2 frames that level g doesn't have: REJ, and RNR.
	For closing a connection, X.25 uses the DISC/UA sequence,
	uucp level g simply sends 2 consecutive CLOSE packets and
	doesn't wait for any confirmation.  In fact, it sends the
	2 CLOSE packets even when there are outstanding DATA packets,
	which is discussed again later.

	Also, the g protocol is typically imlemented in user programs,
	so that the protocol interfaces to the UNIX tty driver.
	However, the code has been written with #ifdef's so that
	it can be compiled, and run in the kernel, if desired.
	One of the earlier versions of UNIX had a pkon() call
	which, apparently, told the kernel tty driver to start doing
	the level g protocol.

	]


              g-protocol does not provide certain functions.  For instance,
         it does not provide routing any more elaborate than point-to-point
         between  two machines.  Also g-protocol does not support more than
         one connection over the link.

	[ Ed note: that is level g is a point-to-point protocol, parallel
	point-to-point links between the same machines are possible,
	but the data traffic on each link would be independent. ]

              There  are  certain  other  minor  deficiencies   that   were
         discovered while experimenting with the g-protocol:

	[ Ed note: these deficiencies were brought to my attention
	when I ran a personal program that runs on one machine, and
	illustrates the protocol in live operation. It is implemented
	by running the protocol in different 2 UNIX processes
	connected by UNIX pipes.  I hope to eventually post the source
	to net.sources. ]

              -  DATA  packets  are  always  always padded so that the DATA
         field is fixed length (64 bytes  in  this  version).   This  means
         wasted space in some packets, and decreased performance.

              -  it is possible to send less data than the send window size
         and close the connection without receiving any  error  indication:
         At  the local side, two protocol writes were issued, followed by a
         protocol close. The send window happened to be  3  packets.   Each
         protocol  write call returned "numwrote" (number of bytes written)
         that was the same as "num2write" (number of bytes to be written to
         network),  indicating  success.   Each  protocol write call caused
         data to be sent to  the  network,  but  it  was  not  acknowledged
         because  the  remote task was programmed to only call the protocol
         open code, but not to call its protocol read  routine.   Thus  the
         data  was  still  buffered  in  the  local  side's driver, and un-
         delivered when the call to the protocol close was issued.

	[ Ed note:  level g allows more than one DATA packet to be
	outstanding.  That is, several DATA packets can be sent,
	without having to wait for an explicit RR acknowledment packet
	for each one. Therefore, if you call pkwrite() the first time,
	pkwrite() sends the data over the link, and returns with
	success, even though the remote protocol was not prepared to read
	the data yet.  At this point the received data will be in
	the ttydriver's input buffer, but not yet passed on to the
	receiving program.  A copy of the data will also be in the
	sending protocol's send buffer, because the sender normally
	does not discard such data until it has been acknowledged.
	The fact that the pkclose() call does not
	attempt to make sure that outstanding DATA has been acknowledged,
	is, apparently, a bug in the protocol. ]
-- 
Dennis Bednar	Computer Consoles Inc.	Reston VA	703-648-3300
{decvax,ihnp4,harpo,allegra}!seismo!rlgvax!dennis



More information about the Comp.unix.wizards mailing list