86 lines
3.5 KiB
Plaintext
86 lines
3.5 KiB
Plaintext
NORM Rules
|
|
|
|
This file contains descriptions of rules used in the NRL
|
|
NORM implementation for various aspects of protocol
|
|
operation. These rules are related to the nature of the
|
|
NORM protocol and how this particular implementation
|
|
maintains protocol state.
|
|
|
|
Norm Receive Object Status Rules
|
|
====================================
|
|
|
|
When a message for a transport object is received from a
|
|
remote NORM server node, the "status" (based on the object's
|
|
transport identifier - NormObjectId)of the object is
|
|
determined so that appropriate actions may be taken by the
|
|
receiver. The possible status types include:
|
|
|
|
INVALID - the NormObjectId is out-of-range with respect
|
|
to the current state for the sender. Out-of-
|
|
range is defined as an objectId which is
|
|
excessively ordinally less than the range of
|
|
currently pending objects (or last object
|
|
successfully complete if none are pending)
|
|
Note that if the object is the _first_ object
|
|
received for the sender, it is always considered
|
|
"valid", thus establishing an initial
|
|
synchronization point for the sender (sync_id):
|
|
|
|
sender->Synchronized AND
|
|
|
|
objectId < sync_id OR
|
|
objectId > first_pending + bufferRange
|
|
(first_pending = sender->IsPending ?
|
|
first_pending : next_pending)
|
|
|
|
NEW - The objectId is greater than the range of
|
|
currently pending objects (but not too
|
|
much greater) and acceptable for reception.
|
|
Note that is the object is the _first_
|
|
received from the sender, this status
|
|
always results:
|
|
|
|
!sender->Synchronized OR
|
|
|
|
objectId >= next_pending AND
|
|
object_id - first_pending < bufferRange
|
|
(first_pending = sender->IsPending ?
|
|
first_pending : next_pending)
|
|
|
|
PENDING - The objectId corresponds to an object _within_
|
|
the range of currently pending objects for
|
|
the sender and has is marked as still pending:
|
|
|
|
sender->Synchronized AND
|
|
sender->IsPending() AND
|
|
first_pending <= objectId < next_pending AND
|
|
sender->IsPending(objectId)
|
|
|
|
COMPLETE - The objectId is within range of objects which
|
|
have been detected and is not marked as pending:
|
|
|
|
sender->Synchronized AND
|
|
sync_id <= objectId < next_pending AND
|
|
!sender->IsPending(objectId)
|
|
|
|
Note since the sequence of objectId's received from a sender
|
|
is circular, the "sync_id" will eventually need to be
|
|
updated as the sequence of objects progresses. Also note
|
|
that the "sync_id" might be adjusted depending upon the
|
|
receiver synchronisation policy. For example, if the
|
|
synchronization policy is strict, the "sync_id" will be
|
|
fixed to no less than the first object the receiver accepts
|
|
for reception (according to policies) But for a looser
|
|
policy the receiver might permit the sync_id to be
|
|
decremented to fit within the current "bufferRange". An
|
|
even looser policy would be to allow the receiver's buffer
|
|
range to grow as needed. However, for some applications,
|
|
the sender has a finite range of objects for which it
|
|
will maintain repair state.
|
|
|
|
The "bufferRange" is the range (sequential count) of objects
|
|
for which the receiver is maintaining state. That range may
|
|
be application specific and senders/receivers are anticipated
|
|
to use relatively compatible buffer ranges/sizes based on
|
|
application needs.
|