Network Working Group				 Dave Crocker, Rand-ISD
Request for Comments: 729			 (Dcrocker at Rand-Unix)
NlC: 40306					 13 May l977

TELNET Byte Macro Option

1. Command name and code:

BM 19

2. Command Meanings:


The sender of this command REQUESTS or AGREES to use the BM option, and will send sing1e data characters which are to be interpreted as if longer data strings had been sent.


The sender of this option REFUSES to send single data characters which are to be interpreted as if longer data strings had been sent.


The sender REQUESTS or AGREES to have the other side (send of WILL BM) issue send single data characters which are to be interpreted as if longer data strings had been sent.


The sender REFUSES to allow the other side to send single data characters which are to be interpreted as if longer data strings had been sent.

IAC SB BM <DEFINE> <macro byte> <count>

                   <expansion string> IAC SE

	   <macro byte> is the  data byte actually  to be sent  across
	   the network; it may NOT be Telnet IAC (decimal 255).

	   <count> is a  one-byte binary number,  indicating how  many
	   <expansion string> characters follow, up to the ending  IAC
	   SE, but not including it.

	   <expansion string> is a string of one or more Telnet  ASCII
	   characters and/or commands,  which the <macro  byte> is  to
	   represent; any  character may  occur within  an  <expansion

The indicated <macro byte> will be sent instead of the indicated <expansion string>. The receiver of the <macro byte> (the sender of the DO BM) is to behave EXACTLY as if the

	<expansion string> of bytes had instead been received from the
	network. This  interpretation is  to  occur before  any  other
	Telnet interpretations, unless the <macro byte> occurs as part
	of a BM subcommand; in this case no special interpretation  is
	to be made.

Note that the effect of a particular <macro byte> may be
negated by reseting it to "expand" into itself.

	<DEFINE> is decimal 01.

IAC SB BM <ACCEPT> <macro byte> IAC SE

The receiver of the <DEFINE> for <macro byte> accepts the requested definition and will perform the indicating expansion whenever a <macro byte> is received and is not part of a BM subcommand.

	<ACCEPT> is decimal 02.


The receive of the <DEFINE> for <macro byte> refuses to

	perform  the  indicated  translation  from  <macro  byte>   to
	<expansion string> either because the particular <macro  byte>
	is not  an acceptable  choice  or because  the length  of  the
	<expansion string> exceeds available storage.

   <REFUSE> is decimal 03.

   <REASON> may be

	   <BAD CHOICE> which is decimal 01; or

	   <TOO LONG> which is decimal 02.

IAC SB BM <LITERAL> <macro byte> IAC SE

The <macro byte> is to be treated as real data, rather than as representative of the <expansion string>

	<LITERAL> is decimal 03.

3. Default:


No reinterpretation of data is allowed.

4. Motivation for the option:

Subcommands for Telnet options currently require a minimum of five characters to be sent over the network (i.e., IAC SB <Option name> IAC SE). For sub-commands which are employed infrequently, in absolute numbers and in relation to normal data, this overhead is tolerable. In other cases, however, it is not. For example, data which is sent in a block-oriented fashion may need a "block separator" mark. If blocks are commonly as small as five or ten bytes, then most of the cross-net data will be control information. The BM option is intended as a simple data compression technique, to remove this overhead from the communication channel.

5. Description of the option

   The  option  is   enabled  through  the   standard  Telnet   Option
   negotiation process. Afterwards, the SENDER of data (the side which
   sends the IAC WILL BM) is  free to define and use mappings  between
   single and multiple NOT characters. Except for the ability to offer
   a blanket refusal,  the receiver of  data has no  control over  the
   definition and use of mappings.

The sender (of the WILL BM) is prohibited from using or redefining a <macro byte> until it has received an <ACCEPT> or <REFUSE>, in reply to a <DEFINE>.

NOTE: The Telnet command character IAC (decimal 255) may be a member of an <expansion string> but is the ONLY character which may NOT be defined as a <macro byte>. ALL OTHER Telnet command characters use IAC as a preface and therefore occupy a SEPARATE portion of the data space than do regular data bytes.

   With  the  exception  of  IAC,  data  transfered  as  part  of   BM
   subcommands are NOT to be interpreted. They are to be taken only as
   their  normal  character  values.   This  avoids  the  problem   of
   distinguishing between a character which is to be taken as a <macro
   byte>, and interpreted as its corresponding <expansion string>, and
   that same character to be taken  as its usual Telnet NVT value.  In
   all other  cases,  however, <macro  byte>s  are to  be  interpreted
   immediately, as if  the <expansion string>  had actually been  sent
   across  the  network.    Expanded  strings  are   not  subject   to
   reinterpretation, so that recursive definitions cannot be made.

The <count> in the <DEFINE> subcommand allows the receiver to allocate storage. IAC interpretation is not over-ridden during BM subcommands so that IAC SE will continue to safely terminate malformed subcommands. To include IAC as part of a <DEFINE>, the string "IAC IAC" must be sent.

The BM option is notably inefficient with regard to problems during

   <macro byte> definition and use of  <macro byte>s as real data.  It
   is expected that relatively few  <macro byte>s will be defined  and
   that they will represent relatively short strings. Since the Telnet
   data space  between decimal  128 and  decimal 254  is not  normally
   used, except  by  implementations  employing  the  original  Telnet
   protocol, it is  recommended that <macro  byte>s normally be  drawn
   from that pool.