Hi All,

Please see the next part of my review of the draft mentioned in the title – 
this should be read in conjunction with the other part of this review as posted 
in a separate email.  This part of the review covers sections 4.2 through to 
the end of section 6.2.  I will attempt to send the next part as soon as time 
permits.

In Section 4.2 it states:

“The C-SID sequence ends with a last C-SID in the last C-SID container that 
does not have the REPLACE-C-SID flavor, or with the special C-SID value 0, or 
where reaching the end of the segment list, whichever comes first.”

This implies that a container can have parts of it that are not valid C-SID’s 
and are not set to zero.  I found this confusing, and I’d like to understand 
the process for differentiating between a valid C-SID in the container and “a 
part of the C-SID container that does not contain the REPLACE-C-SID flavor.” I 
can fully understand a case where you had:

Second c-sid|first c-sid|0|0 (since that would terminate on the zero) – the 
text however implies that you can have:
Second c-sid|first c-sid|xxxxx – where xxxxxx could be variable length and not 
be a c-sid at all.

Further to this – it implies that in the above the xxxxx may not be the end of 
the c-sid list – since the text states three different conditions –


  1.  When the last C-SID in the last C-SID container does not have a 
REPLACE-C-SID flavour (OR)
  2.  The C-SID has special value zero (OR)
  3.  When reaching the end of the segment list

This implies – that (a) could happen before (c) – so this needs clarity.

As a note – and I realize that this is also syntax used in RFC8986 – the 
pseudo-code at points says effectively If(Segments Left > Last Entry) or 
equivalent.  Now – logically what that means is “Segments Left > Last Entry 
Position” – but – what it says is – “Segments Left > Whatever is in the last 
entry” – and to a programmer who is implementing based entirely on pseudo-code 
without deep understanding of the document (or modifying it) this could 
potentially create confusion.  I may consider submitting an erratum on this 
against other documents where this happens.  (Basically, there is a big 
difference between a comparison between the value of last entry and the 
position of the last entry in code terms – and this is further complicated when 
in section 4.1 there is a comparison between a position and a set value on S09)

As another point about the pseudocode detailed in section 4.2.1 on close 
examination:

After replacing S02 with the given pseudocode – and replacing S09 – S16 we end 
up with this:


When an SRH is processed {

  If (Segments Left == 0 and (DA.Arg.Index == 0 or

         Segment List[0][DA.Arg.Index-1] == 0)) {

     Stop processing the SRH, and proceed to process the next

        header in the packet, whose type is identified by

        the Next Header field in the routing header.

  }

  If (IPv6 Hop Limit <= 1) {

     Send an ICMP Time Exceeded message to the Source Address

        with Code 0 (Hop limit exceeded in transit),

        interrupt packet processing, and discard the packet.

  }

  max_LE = (Hdr Ext Len / 2) - 1

  If (DA.Arg.Index != 0) {

    If ((Last Entry > max_LE) or (Segments Left > Last Entry)) {

      Send an ICMP Parameter Problem to the Source Address,

           Code 0 (Erroneous header field encountered),

           Pointer set to the Segments Left field,

           interrupt packet processing and discard the packet.

    }

    Decrement DA.Arg.Index by 1.

    If (Segment List[Segments Left][DA.Arg.Index] == 0) {

      Decrement Segments Left by 1.

      Decrement IPv6 Hop Limit by 1.

      Update IPv6 DA with Segment List[Segments Left]

      Submit the packet to the egress IPv6 FIB lookup for

          transmission to the new destination.

    }

  } Else {

    If((Last Entry > max_LE) or (Segments Left > Last Entry+1)){

      Send an ICMP Parameter Problem to the Source Address,

           Code 0 (Erroneous header field encountered),

           Pointer set to the Segments Left field,

           interrupt packet processing and discard the packet.

    }

    Decrement Segments Left by 1.

    Set DA.Arg.Index to (128/LNFL - 1).

  }

  Decrement IPv6 Hop Limit by 1.

  Write Segment List[Segments Left][DA.Arg.Index] into the bits

       [LBL..LBL+LNFL-1] of the Destination Address of the IPv6

       header.

  Submit the packet to the egress IPv6 FIB lookup for

       transmission to the new destination.

}

if(Segments Left == 0 AND (DA.Arg.Index == 0 or Segment List[0][DA.Arg.Index-1] 
== 0)) – this is an AND condition – this states that the condition is valid 
when Segments Left is zero in certain cases.

This becomes a problem further down where we get to this:


  If (DA.Arg.Index != 0) {

    If ((Last Entry > max_LE) or (Segments Left > Last Entry)) {

      Send an ICMP Parameter Problem to the Source Address,

           Code 0 (Erroneous header field encountered),

           Pointer set to the Segments Left field,

           interrupt packet processing and discard the packet.

    }

    Decrement DA.Arg.Index by 1.

    If (Segment List[Segments Left][DA.Arg.Index] == 0) {

      Decrement Segments Left by 1.

      Decrement IPv6 Hop Limit by 1.

      Update IPv6 DA with Segment List[Segments Left]

      Submit the packet to the egress IPv6 FIB lookup for

          transmission to the new destination.

    }

Since Segments Left can be zero in the containing IF stanza – you could end up 
decrementing segments left while it is zero – which would be -1 (or in standard 
coding terms if we assume that segments left is unsigned – this would wrap 
setting segments left back to 255 – and causing a significant logic error with 
what you are updating the IPv6 DA with) – This comment applies to anywhere this 
pseudocode is used and modified (as it is in the subsequent sections)

In Section 4.2.2 it states that the pseudo-code in section 4.2.1 is modified by 
replacing S18 and S29 with “S01.  Submit the packet to IPv6 module for 
transmission to the new destination via a member of J”

Firstly – stating it in this manner would throw out the ordering (S18 is still 
S18 and not S01 etc) and secondly – while J is defined in RFC8986 it took some 
searching to find it – I believe for clarity that J needs to be clearly defined 
in this document to make this more readable.

In Section 4.2.3 the comments about ordering and the text remain the same as 
the above comment, in addition, T is defined in section 4.3 of RFC8986 – but 
that definition should be carried over into this document for readability.

Same comment about ordering applies to section 4.2.4

In section 4.2.7 it states

“As per section 6.4, when allocating a C-SID value from a Local Identifiers 
Block (LIB), an extra prefix of Locator_block:FunctionID::/LBL+FL is required 
on the Segment Endpoint node to support LIB matching in forwarding.  The new 
behaviors with REPLACE-C-SID flavor explicitly require the node to do so in SID 
initiation.”

I failed to understand the latter part of this – “explicitly require the node 
to do so” – do WHAT exactly – this failed to get through my parser 😊

In Section 4.2.8 it states that S28 should be modified with the pseudocode 
listed as S28.1.  This is ambiguous – since S28 could then read:

S28.0   Write Segment List[Segments Left][DA.Arg.Index] into the bits
            [LBL..LBL+LNFL-1] of the Destination Address of the IPv6
            header.
S28.1.   If (Segments Left == 0 and (DA.Arg.Index == 0 or
                Segment List[0][DA.Arg.Index-1] == 0)) {
S29.              Submit the packet to the egress IPv6 FIB lookup for
                      transmission to the new destination.
S30.      }
S31. }

OR S28.0 and S28.1 could be swapped reading:

S28.1   If (Segments Left == 0 and (DA.Arg.Index == 0 or
                Segment List[0][DA.Arg.Index-1] == 0)) {

S28.2     Write Segment List[Segments Left][DA.Arg.Index] into the bits
                [LBL..LBL+LNFL-1] of the Destination Address of the IPv6
               header.
S29.        Submit the packet to the egress IPv6 FIB lookup for
                transmission to the new destination.
S30.      }
S31. }

In Section 5.2 it states:

“If N1 and N2 are two different physical nodes of the SRv6 domain and I is the 
local C-SID value, then N1 and N2 may bind two different behaviors to I”

While N1 and N2 here presumably are “Node1 and Node2” – this needs more text to 
clarify this is the actual meaning – basically either needs to be written out 
or defined directly above the text.

In section 6.2 it states:

“The RECOMMENDED Locator-Block sizes for the NEXT-C-SID flavor are 16, 32, or 
48 bits.  The smaller the block length, the higher the compression efficiency.”

I presume that “smaller the block length” is an actual literal reference to 16 
< 32 < 48 – however – this could probably be re-worded in terms of 
shorter/longer – since a /16 is a way larger block than a /32 etc.  I also 
strongly question the recommendation of a /16 locator block if this refers to 
global space – since this is a *vast* amount of space










Internal All Employees
_______________________________________________
spring mailing list
spring@ietf.org
https://www.ietf.org/mailman/listinfo/spring

Reply via email to