As per Relevance of the word statement, we have this rfc below:
Network Working Group Deepinder P.
Request for Comments: 963 Iowa State
November 1985
SOME PROBLEMS WITH THE SPECIFICATION OF
MILITARY STANDARD INTERNET
STATUS OF THIS
The purpose of this RFC is to provide helpful information on
Military Standard Internet Protocol (MIL-STD-1777) so that one
obtain a reliable implementation of this protocol standard
Distribution of this note is unlimited
This paper points out several significant problems in
specification of the Military Standard Internet
(MIL-STD-1777, dated August 1983 [MILS83a]). These results are
on an initial investigation of this protocol standard. The
are: (1) a failure to reassemble fragmented messages completely; (2)
a missing state transition; (3) errors in testing for
completion; (4) errors in computing fragment sizes; (5) minor
in message reassembly; (6) incorrectly computed length for
datagrams. This note also proposes solutions to these problems
1.
In recent years, much progress has been made in creating
integrated set of tools for developing reliable
protocols. These tools provide assistance in the specification
verification, implementation and testing of protocols.
protocols have been analyzed and developed using such tools
Examples of automated verification and implementation of several
world protocols are discussed in [BLUT82] [BLUT83] [SIDD83] [SIDD84].
We are currently working on the automatic implementation of
Military Standard Internet Protocol (IP). This analysis will
based on the published specification [MILS83a] of IP dated 12
1983.
While studying the MIL Standard IP specification, we have
numerous errors in the specification of this protocol.
consequence of these errors is that the protocol will never
fragmented incoming datagrams; if this error is corrected,
datagrams will be missing some data and their lengths will
incorrectly reported. In addition, outgoing datagrams that
divided into fragments will be missing some data. The proof of
statements follows from the specification of IP [MILS83a]
discussed below
Sidhu [Page 1]
RFC 963 November 1985
Some Problems with MIL-STD
2. Internet
The Internet Protocol (IP) is a network layer protocol in the
protocol hierarchy which provides communication across
packet-switched networks in an internetwork environment. IP
a pure datagram service with no mechanism for reliability,
control, sequencing, etc. Instead, these features are provided by
connection-oriented protocol, DoD Transmission Control Protocol (TCP
[MILS83b], which is implemented in the layer above IP. TCP
designed to operate successfully over channels that are
unreliable, i.e., which can lose, damage, duplicate, and
packets
Over the years, DARPA has supported specifications of
versions of IP; the last one appeared in [POSJ81]. A few years ago
the Defense Communications Agency decided to standardize IP for
in DoD networks. For this purpose, the DCA supported
specification of this protocol, following the design discussed
[POSJ81] and the technique and organization defined in [SDC82].
detailed specification of this protocol, given in [MILS83a], has
adopted as the DoD standard for the Internet Protocol
The specification of IP state transitions is organized into
tables; the decision functions and action procedures are specified
a subset of Ada[1], and may employ a set of machine-specific
structures. Decision tables are supplied for the pairs
interface event> as follows: <inactive, send from upper layer>,
<inactive, receive from lower layer>, and
lower layer>. To provide an error indication in the case that
fragments of a datagram are received but some are missing, a
table is also supplied for the pair reassembly
limit elapsed>. (The event names are English descriptions and
the names employed by [MILS83a].)
3. Problems with MIL Standard
One of the major functions of IP is the fragmentation of
that cannot be transmitted over a subnetwork in one piece, and
subsequent reassembly. The specification has several problems
this area. One of the most significant is the failure to insert
last fragment of an incoming datagram; this would cause datagrams
be delivered to the upper-level protocol (ULP) with some
missing. Another error in this area is that an incorrect value of
data length for reassembled datagrams is passed to the ULP,
unpredictable consequences
As the specification [MILS83a] is now written, these errors are
Sidhu [Page 2]
RFC 963 November 1985
Some Problems with MIL-STD
little consequence, since the test for reassembly completion
always fail, with the result that reassembled datagrams would
be delivered at all
In addition, a missing row in one of the decision tables creates
problem that network control (ICMP) messages that arrive in
will never be processed. Among the other errors are the
that a few bytes will be discarded from each fragment transmitted
certain statements that will create run-time exceptions instead
performing their intended functions
A general problem with this specification is that the
language and action table portions of the specification were
not checked by any automatic syntax checking process. Variable
procedure names are occasionally misspelled, and the syntax of
action statements is often incorrect. We have enumerated some
these problems below as a set of cautionary notes to implementors
but we do not claim to have listed them all. In particular,
errors are only discussed when they occur in conjunction with
problems
The following section discusses some of the serious errors that
have discovered with the MIL standard IP [MIL83a] during our
study of this protocol. We also propose corrections to each of
problems
4. Detailed Discussion of the
Problem 1: Failure to Insert Last
This problem occurs in the decision table corresponding to
state reassembling and the input "receive from lower layer
[MILS83a, sec 9.4.6.1.3]. The problem occurs in the following
of this table:[2]
________________________________________________________
check- SNP TTL where a reass
sum params valid to frag done check
valid? valid? ? ? ? ? sum
__________________________________________________________________
YES YES YES ULP YES YES d reass
delivery
state :=
__________________________________________________________________
The reass_done function, as will be seen below, returns YES if
Sidhu [Page 3]
RFC 963 November 1985
Some Problems with MIL-STD
fragment just received is the last fragment needed to assemble
complete datagram and NO otherwise. The action
reass_delivery simply delivers a completely reassembled
to the upper-level protocol. It is the action
reassemble that inserts an incoming fragment into the
being assembled. Since this row does not call reassemble,
result will be that every incoming fragmented datagram will
delivered to the upper layer with one fragment missing.
solution is to rewrite this row of the table as follows
________________________________________________________
check- SNP TTL where a reass
sum params valid to frag done check
valid? valid? ? ? ? ? sum
__________________________________________________________________
YES YES YES ULP YES YES d reassemble
reass
delivery
state :=
__________________________________________________________________
Incidentally, the mnemonic value of the name of the reass_
function is questionable, since at the moment this function
called datagram reassembly cannot possibly have been completed.
better name for this function might be last_fragment
Problem 2: Missing State
This problem is the omission of a row of the same decision
[MILS83a, sec 9.4.6.1.3]. Incoming packets may be directed to
upper-level protocol (ULP), or they may be network
messages, which are marked ICMP (Internet Control
Protocol). When control messages have been completely assembled
they are processed by an IP procedure called analyze.
decision table contains the
________________________________________________________
check- SNP TTL where a reass
sum params valid to frag done check
valid? valid? ? ? ? ? sum
__________________________________________________________________
YES YES YES ICMP YES NO d reassemble
__________________________________________________________________
Sidhu [Page 4]
RFC 963 November 1985
Some Problems with MIL-STD
but makes no provision for the case in which where_to
ICMP, a_frag returns YES, and reass_done returns YES.
additional row should be inserted, which reads as follows
________________________________________________________
check- SNP TTL where a reass
sum params valid to frag done check
valid? valid? ? ? ? ? sum
__________________________________________________________________
YES YES YES ICMP YES YES d reassemble
analyze
state :=
__________________________________________________________________
Omitting this row means that incoming fragmented ICMP
will never be analyzed, since the state machine does not have
action specified when the last fragment is received
Problem 3: Errors in reass_
The function reass_done, as can be seen from the above,
whether the incoming subnetwork packet contains the last
needed to complete the reassembly of an IP datagram. In order
understand the errors in this function, we must first
how it employs its data structures
The reassembly of incoming fragments is accomplished by means of
bit map maintained separately for each state machine. Since
fragments are not necessarily the same length, each bit in the
represents not a fragment, but a block, that is, a unit of
octets. Each fragment, with the possible exception of the "tail
fragment (we shall define this term below), is an integral
of consecutive blocks. Each fragment's offset from the
of the datagram is given, in units of blocks, by a field in
packet header of each incoming packet. The total length of
fragment, including the fragment's header, is specified in
header field total_length; this length is given in octets.
length of the header is specified in the field header_length;
length is given in words, that is, units of four octets
In analyzing this subroutine, we must distinguish between
"tail" fragment and the "last" fragment. We define the
fragment as the one which is received last in time, that is,
fragment that permits reassembly to be completed. The
fragment is the fragment that is spatially last, that is,
fragment that is spatially located after any other fragment.
Sidhu [Page 5]
RFC 963 November 1985
Some Problems with MIL-STD
length and offset of the tail fragment make it possible to
the length of the entire datagram. This computation is
done in the action procedure reassembly, and the result is
in the state vector field total_data_length; if the tail
has not been received, this value is assumed to be zero
It is the task of the reass_done function [MILS83a, sec 9.4.6.2.6]
to determine whether the incoming fragment is the last fragment
This determination is made as follows
1) If the tail fragment has not been received previously
the incoming fragment is not the tail fragment, then return NO
2) Otherwise, if the tail fragment has not been received,
the incoming fragment is the tail fragment, determine
all fragments spatially preceding the tail fragment have
been received
3) Otherwise, if the tail fragment has been received earlier
determine whether the incoming fragment is the last one
to complete reassembly
The evaluation of case (2) is accomplished by the
statment
if (state_vector.reassembly_map from 0
(((from_SNP.dtgm.total_length -
(from_SNP.dtgm.header_length * 4) + 7) / 8)
+ 7) / 8 is set
then return YES
The double occurrence of the subexpression " + 7 ) / 8"
apparently a misprint. The function f(x) = (x + 7) / 8
convert x from octets to blocks, rounding any remainder upward
There is no need for this function to be performed twice.
second problem is that the fragment_offset field of the
packet is ignored. The tail fragment specifies only its
length, not the length of the entire datagram; to determine
latter, the tail fragment's offset must be added to the
fragment's own length. The third problem hinges on the meaning
the English "... from ... to ..." phrase. If this phrase has
same meaning as the ".." range indication in Ada [ADA83, sec 3.6],
that is, includes both the upper and lower bounds, then it
necessary to subtract 1 from the final expression
The expression following the word to, above, should thus
changed to
Sidhu [Page 6]
RFC 963 November 1985
Some Problems with MIL-STD
from_SNP.dtgm.fragment_offset +
((from_SNP.dtgm.total_length -
(from_SNP.dtgm.header_length * 4) + 7) / 8) - 1
Another serious problem with this routine occurs when
case (3). In this case, the relevant statement
if (all reassembly map from 0
(state_vector.total_data_length + 7)/8 is
then return
If the tail fragment was received earlier, the code asks,
effect, whether all the bits in the reassembly map have been set
This, however, will not be the case even if the incoming
is the last fragment, since the routine reassembly, which
sets these bits, has not yet been called for this fragment.
statement must therefore skip the bits corresponding to
incoming fragment. In specifying the range to be tested
allowance must be made for whether these bits fall at
beginning of the bit map or in the middle (the case where
fall at the end has already been tested). The statement
therefore be changed to
if from_SNP.dtgm.fragment_offset = 0
if (all reassembly map
from_SNP.dtgm.fragment_offset +
((from_SNP.dtgm.total_length -
from_SNP.dtgm.header_length * 4) + 7) / 8
to ((state_vector.total_data_length + 7) / 8 - 1) is set
then return YES
else return NO
end if
if (all reassembly map from 0
(from_SNP.dtgm.fragment_offset - 1) is set
and (all reassembly map
from_SNP.dtgm.fragment_offset +
((from_SNP.dtgm.total_length -
from_SNP.dtgm.header_length * 4) + 7) / 8
to ((state_vector.total_data_length + 7) / 8 - 1) is set
then return YES
else return NO
end if
end if
Sidhu [Page 7]
RFC 963 November 1985
Some Problems with MIL-STD
Note that here again it is necessary to subtract 1 from the
bound
Problem 4: Errors in fragment_and_
The action procedure fragment_and_send [MILS83a, sec 9.4.6.3.7]
used to break up datagrams that are too large to be sent
the subnetwork as a single packet. The specification
[MILS83a sec 9.2.2, sec 9.4.6.3.7] each fragment, except
the "tail" fragment, to contain a whole number of 8-octet
(called "blocks"); moreover, each fragment must begin at a
boundary
In the algorithm set forth in fragment_and_send, all
except the tail fragment are set to the same size; the
begins by calculating this size. This is done by the
statement
data_per_fragment := maximum subnet transmission
- (20 + number of bytes of option data);
Besides the failure to allow for header padding, which
discussed in the next section, this statement makes the
error of not assuring that the result is an integral multiple
the block size, i.e., a multiple of eight octets. The
of this would be that as many as seven octets per fragment
never be sent at all. To correct this problem, and to allow
header padding, this statement must be changed
data_per_fragment := (maximum subnet transmission
- (((20 + number of bytes of option data)+3)/4*4)/8*8;
Another problem in this procedure is the failure to provide
the case in which the length of the data is an exact multiple
eight. The procedure contains the
number_of fragments := (from_ULP.length +
(data_per_fragment - 1)) / data_per_fragment
data_in_last_frag := from_ULP.length modulo data_per_fragment
(Note that in our terminology we would rename data_in_last_frag
data_in_tail_frag; notice, also, that the proper spelling of
Ada operator is mod [ADA83, sec 4.5.5].)
If data_in_last_frag is zero, some serious difficulties arise
One result might be that the datagram will be broken into one
Sidhu [Page 8]
RFC 963 November 1985
Some Problems with MIL-STD
fragment than necessary, with the tail fragment containing no
bytes. The assignment of data into the tail fragment will
even though it will now take the
output_data [i..i-1] := input_data [j..j-1];
because Ada makes provision for so-called "null slices" [ADA83,
sec 4.1.2] and will treat this assignment as a no-op [ADA83,
5.2.1].
This does, however, cause the transmission of an
packet, and also creates difficulties for the
procedure, which must now be prepared to handle empty packets,
which not even one bit of the reassembly map should be set
Moreover, as the procedure is now written, even this will
occur. This is because the calculation of the number of
is incorrect
A numerical example will clarify this point. Suppose that
total datagram length is 16 bytes and that the number of bytes
fragment is to be 8. Then the above statements will
number_of_fragments = (16 + 7)/8 = 2 and data_in_last_frag = 16
mod 8 = 0. The result of the inconsistency
number_of_fragments and data_in_last_frag will be that instead
sending three fragments, of lengths 8, 8, and 0, the
will send only two fragments, of lengths 8 and 0; the last
octets will never be sent
To avoid these difficulties, the specification should add
following statement, immediately after
data_in_last_frag
if data_in_last_frag = 0
data_in_last_frag := data_per_fragment
end if
This procedure also contains several minor errors. In addition
failures to account for packet header padding, which
enumerated in the next section, there is a failure to convert
header length from words (four octets) to octets in one statement
This statement, which calculates the total length of the non-
fragments,
to_SNP.dtgm.total_length := to_SNP.dtgm.header_
+ data_per_fragment
Sidhu [Page 9]
RFC 963 November 1985
Some Problems with MIL-STD
Since header length is expressed in units of words,
statement should
to_SNP.dtgm.total_length := to_SNP.dtgm.header_length * 4
+ data_per_fragment
This is apparently no more than a misprint, since
corresponding calculation for the tail fragment is done correctly
Problem 5: Errors in
The action procedure reassembly [MILS83a, sec 9.4.6.3.9], which
referred to as reassemble elsewhere in the specification [MILS83a
sec 9.4.6.1.2, sec 9.4.6.1.3], inserts an incoming fragment into
datagram being reassembled. This procedure contains
relatively minor errors
In two places in this procedure, a range is written to contain
more member than it ought to have. In the first, data from
fragment is to be inserted into the datagram being reassembled
state_vector.data [from_SNP.dtgm.fragment_offset*8 ..
from_SNP.dtgm.fragment_offset*8 + data_in_frag] :=
from_SNP.dtgm.data [0..data_in_frag-1];
In this statement, the slice on the left contains one more
than the slice on the right. This will cause a run-time
to be raised [ADA83, sec 5.2.1]. The statement should
state_vector.data [from_SNP.dtgm.fragment_offset*8 ..
from_SNP.dtgm.fragment_offset*8 + data_in_frag - 1] :=
from_SNP.dtgm.data [0..data_in_frag-1];
A similar problem occurs in the computation of the range of
in the reassembly map that corresponds to the incoming fragment
This statement
for j in (from_SNP.dtgm.fragment_offset) ..
((from_SNP.dtgm.fragment_offset +
data_in_frag + 7)/8)
Not only are the parentheses in this statement located
(because the function f(x) = (x + 7) / 8 should be executed
on the argument data_in_frag), but also this range contains
extra member. The statement should
Sidhu [Page 10]
RFC 963 November 1985
Some Problems with MIL-STD
for j in (from_SNP.dtgm.fragment_offset) ..
(from_SNP.dtgm.fragment_offset +
(data_in_frag + 7)/8) - 1
Note that if the statement is corrected in this manner it
also handle the case of a zero-length fragment, mentioned above
since the loop will not be executed even once [ADA83, sS 5.5].
Another minor problem occurs when this procedure attempts to
the header of the leading fragment. The relevant statement
state_vector.header := from_SNP.dtgm
This statement attempts to transfer the entire incoming
into a record that is big enough to contain only the header.
result, in Ada, is not truncation, but a run-time
[ADA83, sec 5.2]. The correction should be something
state_vector.header := from_SNP.dtgm.header
This correction cannot be made without also defining the
portion of the datagram as a subrecord in [MILS83a, sec 9.4.4.6];
such a definition would also necessitate changing many
statements. For example, from_SNP.dtgm.fragment_offset would
have to be written as from_SNP.dtgm.header.fragment_offset
Another possible solution is to write the above statement as
series of assignments for each field in the header, in
following fashion
state_vector.header.version :=
from_SNP.dtgm.version
state_vector.header.header_length :=
from_SNP.dtgm.header_length
state_vector.header.type_of_service :=
from_SNP.dtgm.type_of_service
-- etc
Note also that this procedure will fail if an incoming fragment
other than the tail fragment, does not contain a multiple of
characters. Implementors must be careful to check for this in
decision function SNP_params_valid [MILS83a, sec 9.4.6.2.7].
Sidhu [Page 11]
RFC 963 November 1985
Some Problems with MIL-STD
Problem 6: Incorrect Data Length for Fragmented
The procedure reassembled_delivery [MILS83a, sec 9.4.6.3.10]
not deliver the proper data length to the upper-level protocol
This is because the assignment
to_ULP.length := state_vector.header.total_
- state_vector.header.header_length * 4;
The fields in state_vector.header have been filled in by
reassembly procedure, discussed above, by copying the header
the leading fragment. The field total_length in this fragment
however, refers only to this particular fragment, and not to
entire datagram (this is not entirely clear from it definition
[MILS83a, sec 9.3.4], but the fragment_and_send
[MILS83a, sec 9.4.6.3.7] insures that this is the case).
The length of the entire datagram can only be computed from
length and offset of the tail fragment. This computation
actually done in the reassembly procedure [MILS83a,
9.4.6.3.9], and the result saved in state_vector.total_data_
(see above). It is impossible, however, for reassembly to fill
state_vector.header.total_length at this time,
state_vector.header.header_length is filled in from the
fragment, which may not yet have been received
Therefore, reassembled_delivery must replace the above
to_ULP.length := state_vector.total_data_length
The consequence of leaving this error uncorrected is that
upper-level protocol will be informed only of the delivery of
many octets as there are in the lead fragment
5. Implementation Difficulties of MIL Standard
In addition to the problems discussed above, there are
features of the MIL standard IP specification [MILS83a] which lead
difficulties for the implementor. These difficulties, while
actually errors in the specification, take the form of
which are not explicitly stated, but of which implementors must
aware
Sidhu [Page 12]
RFC 963 November 1985
Some Problems with MIL-STD
5.1 Header
In several places, the specification makes a computation of
length of a packet header without explicitly allowing for padding
The padding is needed because the specification requires [MILS83a
sec 9.3.14] that each header end on a 32-bit boundary
One place this problem arises is in the need_to_frag
function [MILS83a, sec 9.4.6.2.5]. This function is used
determine whether fragmentation is required for an
datagram. It consists of the single
if ((from_ULP.length + (number of bytes of option data
+ 20) > maximum transmission unit of the local
then return
else return NO
end if
(A minor syntax error results from not terminating the
return statement with a semicolon [ADA83, sec 5.1, sec 5.3,
5.9].) In order to allow for padding, the expression for
length of the outgoing datagram should
(((from_ULP.length + (number of bytes of option data) + 20)
+ 3)/4 * 4)
Another place that this problem arises is in the action
build_and_send [MILS83a, sec 9.4.6.3.2], which
unfragmented datagrams for transmission. To compute the
field header_length, which is expressed in words, i.e., units
four octets [MILS83a, sec 9.3.2], this procedure contains
to_SNP.dtgm.header_length := 5 +
(number of bytes of option data)/4;
In order to allow for padding, this statement should
to_SNP.dtgm.header_length :=
5 + ((number of bytes of option data)+3)/4;
The identical statement appears in the action
fragment_and_send [MILS83a, sec 9.4.6.3.7], which
datagram fragments for transmission, and requires the
correction
Sidhu [Page 13]
RFC 963 November 1985
Some Problems with MIL-STD
The procedure fragment_and_send also has this problem in two
places. In the first, the number of octets in each fragment
computed
data_per_fragment := maximum subnet transmission
- (20 + number of bytes of option data);
In order to allow for padding, this statement should
data_per_fragment := maximum subnet transmission
- (((20 + number of bytes of option data)+3)/4*4);
(Actually, this statement must be changed
data_per_fragment := (maximum subnet transmission
- (((20 + number of bytes of option data)+3)/4*4)/8*8;
in order to accomplish its intended purpose, for reasons
have been discussed above.)
A similar problem occurs in the statement which computes
header length for individual fragments
to_SNP.dtgm.header_length := 5 +
(number of copy options octets/4);
To allow for padding, this should be changed
to_SNP.dtgm.header_length := 5 +
(number of copy options octets+3/4);
Notice that all of these errors can also be corrected if
English phrase "number of bytes of option data", and
phrases, are always understood to include any necessary padding
5.2 Subnetworks with Small Transmission
When an outgoing datagram is too large to be transmitted as
single packet, it must be fragmented. On certain subnetworks,
possibility exists that the maximum number of bytes that may
transmitted at a time is less than the size of an IP packet
for a given datagram. In this case, the datagram cannot be sent
even in fragmented form. Note that this does not necessarily
that the subnetwork cannot send any datagrams at all, since
size of the header may be highly variable. When this
arises, it should be detected by IP. The proper place to
this situation is in the function can_frag
Sidhu [Page 14]
RFC 963 November 1985
Some Problems with MIL-STD
The can_frag decision function [MILS83a, sec 9.4.6.2.2] is used
determine whether a particular outgoing datagram, which is
long to be transmitted as a single fragment, is allowed to
fragmented. In the current specification, this function
of the single
if (from_ULP.dont_fragment = TRUE
then return
else return
end if
(A minor syntax error is that the return statements should
terminated by semicolons; see [ADA83, sec 5.1, sec 5.3, sec 5.9].)
If the above problem occurs, the procedure fragment_and_send
obtain negative numbers for fragment sizes, with
results. This should be prevented by assuring that the
can send the datagram header and at least one block (eight octets
of data. The can_frag function should be recoded
if ((8 + ((number of bytes of option data)+3)/4*4 + 20)
> maximum transmission unit of the local subnetwork
then return NO
elsif (from_ULP.dont_fragment = TRUE
then return
else return
end if
This is similar to the logic of the function need_to_frag
discussed above
5.3 Subnetwork
Provision is made for the subnetwork to report errors to
[MILS83a, sec 6.3.6.2], but no provision is made for the IP
to take any action when such errors occur
In addition, the specification [MILS83a, sec 8.2.1.1] calls
the subnetwork to accept type-of-service indicators (precedence
reliability, delay, and throughput), which may be difficult
implement on many local networks
Sidhu [Page 15]
RFC 963 November 1985
Some Problems with MIL-STD
5.4 ULP
The IP specification [MILS83a, sec 9.4.6.3.6]
The format of error reports to a ULP is
dependent. However, included in the report should be a
indicating the type of error, and some information to
the associated data or datagram
The most natural way to provide the latter information would be
return the datagram identifier to the upper-level protocol,
this identifier is normally supplied by the sending ULP [MILS83a
sec 9.3.5]. However, the to_ULP data structure makes no
for this information [MILS83a, sec 9.4.4.3], probably because
information is irrelevant for datagrams received from
subnetwork. Implementors may feel a need to add this field to
to_ULP data structure
5.5 Initialization of Data
The decision function reass_done [MILS83a, sec 9.4.6.2.6]
the implicit assumption that data structures within each
state machine are initialized to zero when the machine is created
In particular, this routine will not function properly
state_vector.reassembly_map and state_vector.total_data_length
so initialized. Since this assumption is not stated explicitly
implementors should be aware of it. There may be
initialization assumptions that we have not discovered
5.6 Locally Defined
The procedures error_to_source [MILS83a, sec 9.4.6.3.5]
error_to_ULP [MILS83a, sec 9.4.6.3.6] define enumeration types
comments. The former contains the
error_param : (PARAM_PROBLEM, EXPIRED_TTL, PROTOCOL_UNREACH);
and the
error_param : (PARAM_PROBLEM, CAN'T_FRAGMENT, NET_UNREACH
PROTOCOL_UNREACH, PORT_UNREACH);
These enumerated values are used before they are
[MILS83a, sec 9.4.6.1.1, sec 9.4.6.1.2, sec 9.4.6.1.3, et al.];
implementors will probably wish to define some error
globally
Sidhu [Page 16]
RFC 963 November 1985
Some Problems with MIL-STD
5.7 Miscellaneous
The specification contains many Ada syntax errors, some of
have been shown above. We have only mentioned syntax
above, however, when they occurred in conjunction with
problems. One of the main syntactic difficulties that we have
mentioned is that the specification frequently creates
types, by declaring records within records; such declarations
legal in Pascal, but not in Ada [ADA83, sec 3.7].
Another problem is that slice assignments frequently do
contain the same number of elements on the left and right sides
which will raise a run-time exception [ADA83, sec 5.2.1].
we have mentioned some of these, there are others which are
enumerated above
In particular, the procedure error_to_source [MILS83a,
9.4.6.3.5] contains the
to_SNP.dtgm.data [8..N+3] := from_SNP.dtgm.data [0..N-1];
We believe that N+3 is a misprint for N+8, but even so the
side contains one more byte than the right. Implementors
carefully check every slice assignment
6. An Implementation of MIL Standard
In our discussion above, we have pointed out several serious
with the Military Standard IP [MILS83a] specification which must
corrected to produce a running implementation conforming to
standard. We have produced a running C implementation for the
Standard IP, after problems discussed above were fixed in the
specification. An important feature of this implementation is
it was generated semi-automatically from the IP specification
the help of a protocol development system [BLUT82] [BLUT83] [SIDD83].
Since this implementation was derived directly from the
specification with the help of tools, it conforms to the IP
better that any handed-coded IP implementation can do
The problems pointed out in this paper with the current
of the MIL Standard IP [MILS83a] are based on an
investigation of the protocol
Sidhu [Page 17]
RFC 963 November 1985
Some Problems with MIL-STD
[1] Ada is a registered trademark of the U.S. Government - Ada
Program Office
[2] d indicates a "don't care" condition
The author extends his gratitude to Tom Blumer Michael Breslin,
Pollack and Mark J. Vincenzes, for many helpful discussions.
are also due to B. Simon and M. Bernstein for bringing to author'
attention a specification of the DoD Internet Protocol during 1981-82
when a detailed study of this protocol began. The author is
grateful to Jon Postel and Carl Sunshine for several
discussions about DoD IP/TCP during the last few years
[ADA83] Military Standard Ada(R) Programming Language,
States Department of Defense, ANSI/MIL-STD-1815A-1983, 22
January 1983
[BLUT83] Blumer, T. P., and Sidhu, D. P., "Mechanical
and Automatic Implementation of Communication Protocols,"
to appear in IEEE Trans. Softw. Eng
[BLUT82] Blumer, T. P., and Tenney, R. L., "A Formal
Technique and Implementation Method for Protocols,"
Computer Networks, Vol. 6, No. 3, July 1982, pp. 201-217.
[MILS83a] "Military Standard Internet Protocol," United
Department of Defense, MIL-STD-1777, 12 August 1983.
[MILS83b] "Military Standard Transmission Control Protocol,"
States Department of Defense, MIL-STD-1778, 12 August 1983.
[POSJ81] Postel, J. (ed.), "DoD Standard Internet Protocol,"
Advanced Research Projects Agency, Information
Techniques Office, RFC-791, September 1981.
[SDC82] DCEC Protocol Standardization Program:
Specification Report, System Development Corporation
TM-7172/301/00, 29 March 1982
[SIDD83] Sidhu, D. P., and Blumer, T. P., "Verification of NBS
4 Transport Protocol," to appear in IEEE Trans. Comm
Sidhu [Page 18]
RFC 963 November 1985
Some Problems with MIL-STD
[SIDD84] Sidhu, D. P., and Blumer, T. P., "Some Problems with
Specification of the Military Standard Transmission
Protocol," in Protocol Specification, Testing
Verification IV, (ed.) Y. Yemini et al (1984).
Sidhu [Page 19]
if you see any problems within the linking, don't worry be happy,
this is version 0.1 of the Relevance System and you gotta expect some crappy subroutines sometimes,
just be content we did not write this in Java, which would have made this "bigger and better" HAHAHHA.
RFC documents can be found at I.E.T.F.
Relevance System Copyright © 2002 Spectrum WorldResearch
other technical nosh by ServerMasters Corporation
collaboration of BobX