Subject: [mpls] RFC5036 and "exceeds" / "reaches" limits on send and receive

From: Sandra Murphy <[email-masked]>
Date: Tue, 14 Nov 2017 22:39:38 -0500

I am reading RFC5036, the LDP spec.

I’m finding the language about the loop detection to be a bit ambiguous.

The text varies as to whether a loop is detected when something “exceeds” the limit or when something “reaches” the limit.

Some examples below.

I read the algorithms in the Appendix as requiring a check for “exceeds” on receipt, but no check for either “exceeds” or “reaches” on send. I don’t see a requirement when sending any message to check the hop count or the path vector length to see if it has reached/exceeded the limit.  [The Appendix A procedure descriptions are said to take precedence over any description in the text.]

Does that mean that an LSR might send a message that was doomed to be rejected upon receipt?  Is that the intent?

For the hop count in particular - the hop count field, if I read the spec correctly, is one octet, so a maximum value of 255.  I have not found a requirement that the “configured maximum value” for the hop count MUST be strictly less than the Hop Count TLV’s largest possible hop count value.

So if an LSR is propagating a Label Request message that had a hop count of 255, it should increment the hop count when sending to its neighbor.  What happens then - what value is sent?  I don’t see this covered in the Appendix’s algorithms, and the text is ambiguous.

If an LSR is checking to see if a received message’s Hop Count TLV has a HC Value that exceeds the “configured maximum value”, and the configured maximum value is configured to be 255, would the test ever succeed?

I figure I’ve missed something fundamental, as implementors would have to have figured this out.  And the usual configured maximum values are not going to push either limit.  But still, it would be good to understand.

Thanks.

—Sandy

Some examples of “exceeds” and “reaches”

Section 2.8.2, p 26

      If R receives a Label Mapping message from its next hop with a Hop
      Count TLV that exceeds the configured maximum value, or with a
      Path Vector TLV containing its own LSR Id or that exceeds the
      maximum allowable length, then R detects that the corresponding
      LSP contains a loop.

Section 3.4.4.1, p 40

   If an LSR receives a message containing a Hop Count TLV, it MUST
   check the hop count value to determine whether the hop count has
   exceeded its configured maximum allowable value.  If so, it MUST
   behave as if the containing message has traversed a loop by sending a
   Notification message signaling Loop Detected in reply to the sender
   of the message.

Section 2.8, p 23

                                               an LSR that detects a
         Path Vector has reached the maximum length behaves as if the
         containing message has traversed a loop.

         An LSR that detects a Hop Count has reached a configured
         maximum value behaves as if the containing message has
         traversed a loop.

<In this case, there’s no indication if the LSR is checking the maximum on receipt of
a message or on sending after having incremented the value.>

Section 3.4.5.1.1, p 42

   Note that a Label Request message with a Path Vector TLV is forwarded
   until:

      1. A loop is found,

      2. The LSP egress is reached, or

      3. The maximum Path Vector limit or maximum Hop Count limit is
         reached.  This is treated as if a loop had been detected.

---

From: Eric Gray <[email-masked]>
Date: Mon, 20 Nov 2017 15:55:15 +0000

Sandy,

	There is some inconsistency in the handling of Hop Count TLV  "greater than configured maximum" and a Path Vector TLV greater than Path Vector Limit (PVLim).

	However, there is some justification for this.  

	Ideally, the Hop Count TLV "configured maximum" should be the same for all LSRs in a network, but - even if that is not the case - there is no particular reason to check it twice.  In this respect "hop count" is treated in a similar fashion to TTL.
__  

	As a side note, the difference is that TTL (at one time) counted both the time that a packet "resided" on a forwarding device and the fact that it resided _at all_ on the device - hence the processing rule that TTL would be bumped up by at least 1 at each hop.  The "time" that a packet lived in the network in the days of relative "slow forwarding" was also important. 

	In today's forwarding devices, an IP packet would be considered extremely stale if it spent more than a second at any single forwarding device - hence bumping TTL by more than 1 at a forwarder might still happen, but would not typically happen as a result of multi-second latency.

	Hop count, on the other hand, counts only the hops on a path - mostly because it is part of a control message, so the time it takes is not as relevant.  Whether it is actually bumped and checked at ingress or egress is not even externally visible - though checking at ingress saves both resources (not using fabric slots only to discard after doing so) and complexity (since discard requires returning a control message to the sender - which is often easier at ingress).

	Note that - in the common case where hop count limit is configured consistently in a network - checking before bumping hop count would result in a control packet going one additional hop in comparison  with checking it after bumping hop count.  Even a very badly configured case, the packet would make at most one additional circuit around the loop before being discarded and reported.

	Since the intention with TTL was (originally at least) to take into account both the hop and the time a packet spent at the hop, it should be bumped and checked on leaving the hop.
__

	The Path Vector Limit is different.  A Path Vector TLV grows with each hop that a control message traverses.  Therefore the vector limit should be checked at any point where the resulting Path Vector size might be a problem.  Since not every control message traverses the same hardware, it makes sense to recognize that there might be different limits established at different places - both within a device and within a network.

--
Eric Gray

-----Original Message-----
From: mpls [mailto:[email-masked]] On Behalf Of Sandra Murphy
Sent: Tuesday, November 14, 2017 10:40 PM
To: [email-masked]
Cc: Sandra Murphy <[email-masked]>
Subject: [mpls] RFC5036 and "exceeds" / "reaches" limits on send and receive

Some examples below.

Thanks.

—Sandy

Section 2.8.2, p 26

Section 3.4.4.1, p 40

Section 2.8, p 23

                                               an LSR that detects a

<In this case, there’s no indication if the LSR is checking the maximum on receipt of a message or on sending after having incremented the value.>

Section 3.4.5.1.1, p 42

      1. A loop is found,

      3. The maximum Path Vector limit or maximum Hop Count limit is
         reached.  This is treated as if a loop had been detected.
_______________________________________________
mpls mailing list
[email-masked]
https://www.ietf.org/mailman/listinfo/mpls

---

From: Eric Gray <[email-masked]>
Date: Mon, 20 Nov 2017 16:31:11 +0000

Sandy,

	To answer the part of your question regarding whether the maximum (less than or equal to 255) could ever be exceeded, yes it could.  The procedure was written to support any non-zero maximum less than the maximum value possible.  However, it should say "that is greater than or equal to" the configured maximum, rather than "that exceeds" it.  

	I would be a bit surprised to discover that there are implementations where the implementer has not worked that out, but it is possible.  With loop-detection enabled, if you check to see if the received hop count is greater than or equal to the configured maximum, the test would detect the condition, even if the maximum was set to 255.

	In a manner of speaking - since the text 3.4.5.1.1 uses "reached" with respect to "maximum Hop Count limit" - one could argue that "greater than or equal to" is implicit.  Since Loop detection is only enabled if using Path Vectors, this check would be performed if attempting to detect a loop during setup.

	Note that an implementation can easily avoid this situation by treating any attempt to set a maximum value greater than MAX-Field-Value-minus-one as an error.

--
Eric Gray

-----Original Message-----
From: mpls [mailto:[email-masked]] On Behalf Of Sandra Murphy
Sent: Tuesday, November 14, 2017 10:40 PM
To: [email-masked]
Cc: Sandra Murphy <[email-masked]>
Subject: [mpls] RFC5036 and "exceeds" / "reaches" limits on send and receive

Some examples below.

Thanks.

—Sandy

Section 2.8.2, p 26

Section 3.4.4.1, p 40

Section 2.8, p 23

                                               an LSR that detects a

Section 3.4.5.1.1, p 42

      1. A loop is found,