I think Section 5.1 of draft-ietf-softwire-map-02.txt, which presents the port mapping algorithm, can be improved a bit. Partly the problem is that a couple of symbols are not explained clearly enough. In addition, it would be helpful to the general reader to explain the underlying strategy represented by the formula before getting into the formula itself. I propose modified text below. Minor changes are marked with ^^^, while larger additions and deletions are delimited by <new> .. </new> and <delete> .. </delete>.

Tom Taylor


5.1.  Port mapping algorithm

   The port mapping algorithm is used in domains whose rules allow IPv4
   address sharing.  Different CEs indexed by Port-Set Identifier
                               ^^^^^^^^^^^^^^                    ^
(PSID) sharing the same external IPv4 address MUST have
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   non-overlapping port-sets.  The two extreme cases are: (1) the port
   numbers are not contiguous for each PSID, but uniformly distributed
   across the port range (0-65535); (2) the port numbers are contiguous
   in a single range for each PSID.
<new>
These two extremes can be encompassed by a single port allocation strategy as follows. The available range of port space is divided into a sequence of blocks of M*R consecutive values, where M is the maximum number of consecutive port values to be allocated to a given CE within a given block, and R is the number of CEs sharing each external IPv4 address. Each CE is then allocated a range of M bits within each successive block. The position of the CE's allocated range is determined by the value of its assigned PSID.
</new>
The port mapping algorithm proposed
   here to implement that strategy is called the Generalized Modulus
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
 Algorithm (GMA).
               ^^^

   For a given sharing ratio (R) and the maximum number of contiguous
   ports (M), the GMA algorithm is defined as:

   1.  The set of port numbers (P) allocated to a given PSID is
           ^^^^^^            ^     ^^^^^^^^^^^^             ^^
 composed of:

<deleted>
   P = R * M * j + M * K + i
</deleted>
<new>
   P = (j * M*R) + (PSID * M) + i

   where j, PSID, and i are indexes with ranges given below. The
   first term of this formula points to the first port number in
   the j'th block of M*R bits. The second term points to the first
   port number in the range allocated to a given PSID within that
   block. Finally, the index i selects a specific port number
   within that range.
</new>

       Where:

       *  PSID = 0 to R - 1
              ^^

       *  Block index: j = (4096 / (M*R)) to ((65536 / (M*R)) - 1,
          ^^^^^                    ^^^^^               ^^^^^
          if the port numbers (0 - 4095) are excluded.
<new>
             If M and R are not powers of 2, the lower end of the
             range of j has to be rounded up and the upper end rounded
             down to avoid allocating port numbers outside the range
             4096-65535. In that case, some port numbers at the ends
             of that range are not allocated (wasted).
</new>

       *  Contiguous Port index: i = 0 to M - 1

<deleted>
   2.  The PSID (K) of a given port number (P) is determined by:

   K = (floor(P/M)) % R
</deleted>

<new>
   2. Given a port number P, the corresponding PSID can be calculated as

   PSID = (floor(P / M)) % R
</new>

       Where:

       *  % is the modulus operator

       *  floor(arg) is a function that returns the largest integer not
          greater than arg.

5.1.1.  Bit Representation of the Algorithm

   Given a sharing ratio (R=2^k) and a maximum number of contiguous
                                 ^^^^^
 ports (M=2^m),

<deleted>
for any PSID (K) and available ports (P) can be represented
   as:
</deleted>

<new>
the binary representation of a given port number P partitions neatly into three fields, as shown in Figure 2 below. The rightmost m bits contain the value of the range index i. The middle k bits contain the value of the PSID. Finally, the leftmost a bits contain the block index j, where a is the number of bits required to represent the quantity
A = (65536 / (M*R)) - 1 which is the upper bound of j.
</new>


   0                          8                         15
   +---------------+----------+------+-------------------+
   |                     P                               |
   ----------------+-----------------+-------------------+
   |        A (j)  |       PSID      |        M  (i)     |
                           ^^^^
   +---------------+----------+------+-------------------+
   |<----a bits--->|<-----k bits---->|<------m bits----->|


                       Figure 2: Bit representation

<deleted>
   Where j and i are the same indexes defined in the port mapping
   algorithm.
</deleted>

   Thus for any port number P, the PSID can be obtained by bit mask
   ^^^^                     ^
operation.

   For a > 0, j MUST be larger than 0.  This ensures that the algorithm
   excludes the system ports ([I-D.ietf-tsvwg-iana-ports]).  For a = 0,
   j MAY be 0 to allow for the provisioning of the system ports.
_______________________________________________
Softwires mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/softwires

Reply via email to