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
[email protected]
https://www.ietf.org/mailman/listinfo/spring