[RTG-DIR] RtgDir review: draft-ietf-homenet-dncp-05.txt

Thomas Clausen <ietf@thomasclausen.org> Tue, 16 June 2015 15:45 UTC

Return-Path: <ietf@thomasclausen.org>
X-Original-To: rtg-dir@ietfa.amsl.com
Delivered-To: rtg-dir@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 18F521B3B0B; Tue, 16 Jun 2015 08:45:44 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.202
X-Spam-Level:
X-Spam-Status: No, score=-1.202 tagged_above=-999 required=5 tests=[BAYES_50=0.8, GB_I_INVITATION=-2, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yEj80FL4UeMj; Tue, 16 Jun 2015 08:45:38 -0700 (PDT)
Received: from maila2.tigertech.net (maila2.tigertech.net [208.80.4.152]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id A3CEF1B3B07; Tue, 16 Jun 2015 08:45:38 -0700 (PDT)
Received: from localhost (localhost [127.0.0.1]) by maila2.tigertech.net (Postfix) with ESMTP id 72A6524038D; Tue, 16 Jun 2015 08:45:38 -0700 (PDT)
X-Virus-Scanned: Debian amavisd-new at maila2.tigertech.net
Received: from [192.168.147.78] (mtg91-1-82-227-24-173.fbx.proxad.net [82.227.24.173]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by maila2.tigertech.net (Postfix) with ESMTPSA id CF8202403A3; Tue, 16 Jun 2015 08:45:36 -0700 (PDT)
From: Thomas Clausen <ietf@thomasclausen.org>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Date: Tue, 16 Jun 2015 17:45:34 +0200
Message-Id: <BA8A243F-70C3-43C8-8B5E-B813942BA590@thomasclausen.org>
To: "<rtg-ads@tools.ietf.org>" <rtg-ads@tools.ietf.org>
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2070.6\))
X-Mailer: Apple Mail (2.2070.6)
Archived-At: <http://mailarchive.ietf.org/arch/msg/rtg-dir/Cn3B72KjUOv6j_FoFs8MYxD2gf0>
Cc: "<rtg-dir@ietf.org>" <rtg-dir@ietf.org>, "homenet@ietf.org Group" <homenet@ietf.org>, draft-ietf-homenet-dncp.all@tools.ietf.org
Subject: [RTG-DIR] RtgDir review: draft-ietf-homenet-dncp-05.txt
X-BeenThere: rtg-dir@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: Routing Area Directorate <rtg-dir.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/rtg-dir>, <mailto:rtg-dir-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/rtg-dir/>
List-Post: <mailto:rtg-dir@ietf.org>
List-Help: <mailto:rtg-dir-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/rtg-dir>, <mailto:rtg-dir-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 16 Jun 2015 15:45:44 -0000

Hello,

I have been selected as the Routing Directorate reviewer for this draft. The Routing Directorate seeks to review all routing or routing-related drafts as they pass through IETF last call and IESG review, and sometimes on special request. The purpose of the review is to provide assistance to the Routing ADs. For more information about the Routing Directorate, please see http://trac.tools.ietf.org/area/rtg/trac/wiki/RtgDir

Although these comments are primarily for the use of the Routing ADs, it would be helpful if you could consider them along with any other IETF Last Call comments that you receive, and strive to resolve them through discussion or by updating the draft.

Document: draft-ietf-homenet-dncp-05.txt
Reviewer: Thomas Heide Clausen
Review Date: June 16, 2015
IETF LC End Date: <Reviewed during (just after - apologies) WGLC>

Intended Status: Standards Track

Summary: 

	o	I have significant concerns about this document and recommend that the
		Routing ADs discuss these issues further with the authors.

Comments:

	o	Is there any good reason why the authors have no listed affiliation?
	
	o	It is somewhat contradictory that the abstract talks about 
		"...describes a protocol" and then later "...leaves some details
		 to be specified in profiles, which define actual implementable DNCP
		 based protocols"
		 
		 Does that not mean, then, that this document specifies an algorithm,
		 a framework, and not a protocol?

	o	On that, I see "DNCP protocol" several places. Expanded, that becomes
		"Dynamic Network Configuration Protocol Protocol" ...
		
	o	In general, and despite actually knowing some of the core algorithms
		somewhat before this review, I found the document really tough to
		read, with convoluted sentences, inconsistent requirements-language,
		and a lack of introductory "here's the 1000ft view of the protocol,
		what it does, how it works, and under which conditions it works".
		
	o	On that, I do not find the chosen structure of the document to be
		optimal for conveying an unambiguous protocol specification. For one,
		the same concepts are occasionally described slightly differently.
		For another, it is often hard to find the information needed to
		parse a specific mandated processing (for example). I provide an
		example of what I would suggest a better structure in the below. 
			
		The goal is to provide first concepts and an overview, followed by a
		single, easy to identify place for "precise and unambiguous definitions
		of concepts", and then use those in the detailed expression of the
		protocol. Note that this is just an example, of course:
				
			Section "Terminology:"
				The Network State Hash is a hash value which represents the
				current state of the network, as known by a node.
				
			Section "Protocol Overview and Functioning"
			
				When receiving a FOO TLV, the DNCP node compares the received
				Network State Hash with its own Network State Hash. This
				represents the consistency check rom RFC6206. If same,
				then...if not, then ....
				
			Section "Protocol Information Bases"
				For the purpose of this specification, the Protocol
				Information Bases are orgnaized as sets of tuples ... any
					implementation can chose whatever representation it wants.
				
					The Network State Information Base in a DNCP node is a set
					of tuples:
						(x, y, z, w)
					
					where x is ..., y is ..., z is ..., and w is ...
					
			Section "How to calculate the Network State Hash":
				 
				 The network State Hash is calculated using the information
				 from the Network State Information Base, as follows:
				 
					 	1. First, the tuples in that information base are sorted
				 		   in ascending order based on ....
				 	   
					 	2. Second, .... (concatenation)
				 	
					 	3. Third, the hash function from <profile> is used
				 	
					 	4. Fourth, the first n bits of the resulting hash value, 
					 	   are retained, witn n being from <profile>.

			And then, in remaining sections simply reference the Network
			State Hash, which is now ubiquitously defined in a single place.
			
			I am taking this example, since when reading section 5.3 I found 
			myself chasing through the document, finding multiple slightly
			different definitions of "Network State Hash" --  but beyond this
			example, it generally does apply to the document as a whole, and
			certainly to all of the processing and generation considerations in
			section 5.
	
	o	As a general comment, the document would do well with a good editorial
		overhaul to bring consistency in language usage, consistency in 2119
		terminology, coherence in defined terms and their definition, document
		structure, etc.
		
Major Issues:
	
	o	The introduction does not read well; it contains parts of something that
	 	could be considered as part of an applicability statement (without it
	 	being called out as such, and without forming a complete applicability
		statement), and does not actually introduce the protocol. Reading just 
		the introduction and the abstract, it is very obscure if
		this is a framework, a protocol, a building block, an architecture, an
		algorithm -- and, if either of those, what it is actually accomplishing,
		and why one would chose to use DNCP. It does, however, transpire that
		"whatever it is", it has two "modes" and that it requires something
		(presumably a routing protocol) to provide each "node" with a topology
		map.
		
		Suggest that a proper introduction consisting of three parts would be
		beneficial: (i) what this document is, (ii) what doing DNCP actually
		gets you, and (iii) the operating conditions under which the
		DNCP is applicable.
		
		On the latter point, given that you state that DNCP requires profiles
		to provide "actual implementable DNCP based protocols", it appears
		important to understand what the limits for "what a profile can give 
		you" are.
		
		I am calling this out as a major issue, since I believe that it is
		not just editorial, but is a matter of scoping this document correctly,
		and in particular not falling into the trap of "claiming applicability
		where it's not".

	o	The document, in my understanding, defines an exchange format with
		limited ability to evolve, as simply "a steam of TLVs".

		As long as there's never a need to evolve the TLV format itself, and
		as long as you do not run out of TLV types, that's not going to be
		a problem. The doc sets aside a 16bit TLV type space, that's reasonable
		enough, but I worry if eventually a DNCPv2 will need to evolve the 
		format. One purely hypothetical example could be if a "sequence number"
		would be needed in each DNCP message to detect "link success rates", or
		something of that sort.  
		
		I do not have an actual example in mind -- and that's exactly the point:
		to be evolutive for the unknown future and (at the very least) be able
		to discriminate between "old" and "new".
		
		A discussion could be had if a "version number" in each TLV would do,
		or if a concept of "protocol message with a version number" is
		preferential. I do not believe, however, that "no version number" is
		viable.

	o	Noting that the "overhearing n reduncant transmissions" is a key 
		retransmission suppression mechanism in Trickle, and that this
		seems to assume broad/multicast, using unicast seems to contradict
		the statement of "consists of Trickle", at least in the way the
		algorithm is defined in RFC6206. Note: it's fine to use an algorithm
		outside of its initial scope, but it should be with the caveat of
		"which of the characteristics still hold, and which do not"

	o	DNCP claims to be trickle based, yet supports unicast. It also
		(apparently) is a request/reply protocol.  It doesn't have messages.
		This document needs a good, and pedagogical, "protocol overview and
		functioning" section somewhere: one needs to get through the end of
		Section 5 before having even a vague idea of how DNCP works.
		
	o	The use of normative language is not as tight as could be desired.
		For example, a number of SHOULDs seem to really ought to be "MAYs" since 
		not following the SHOULD won't break the algorithm. It would be good 
		to walk through the document and take a careful look at these to
		either MUST/MAY the SHOULDs, or to qualify the SHOULDs remaining.
		
	o	I am going to go out on a limb here, and say that "the protocol is
		underspecified". That's a deliberately provocative statement, but it
		was honestly how I felt upon having completed the review. 
		
		The document does not help the reader get an intuitive understanding
		of the protocol functioning, but jumps right into minute details --
		requiring the reader to "build up her or his own model of how DNCP
		works". On having read the document a few times, I think that I 
		understand it -- but there's nothing permitting me to verify my
		understanding, and thereby I'd not feel confident to be able to
		provide an interoperable and independent implementation. I've given
		some comments in the "Comments" section as to what I think would be
		viable ways to improve this point.

	 o	Section 5.3, penultimate paragraph:
	 
	 		"If keep-alives specified in Section 6.1 are NOT sent by the peer
		     (either the DNCP profile does not specify the use of keep-alives or
		     the particular peer chooses not to send keep-alives), some other
		     means MUST be employed to ensure its presence.  When the peer is no
		     longer present, the Neighbor TLV and the local DNCP peer state MUST
		     be removed."
		     
		"...some other means MUST be employed to ensure its presence." --
		followed by more MUST verage when a peer disappears...I am not sure that
		that's conductive to interoperable implementations.
		
		Two implementatons may chose different "means" and then turn off keep-
		alives - and be non-interoperable.
		
		For interoperability, we need:
		
				o	A mandatory to implement mechanism, that always is
					present, but can be complemented by another "means", or
					
				o	A mandatory to implement mechanism, which by way of a
					specified negotiation mechanism can be turned off between
					two peers, to allow them to use another "means".
					
		If you argument is "...this will be specified in the profile", then
		you still should provide the two above in this document, with the note
		that "...and a profile may specify which from among these MUST be
		used in a given deployment"

	o	Section 8:
		Interesting; I am not a security expert, but I am very curious to
		see the SEC-DIR review of this document. That said, section 8.3.1 
		contains normative verbage:
		
			"A node MUST be trusted for participating in the DNCP network if and
			only if..."
			
		Which I think needs a qualifier of the "If the certificate based
		trust model is used, then a node must be trusted for ...."
	
		Same goes for the subsequent SHOULD - it really reads as-if this
		certificate based mechanism initially was intended as MTI, but then
		was backed away from subsequently without a complete cleanup of the
		text?
		
		I do actually question the value of having a laundry-list of trust 
		management methods, and for one of those (certs) a laundry-list
		of all sorts of trust relationship establishment methods, in this
		document; this in no small part as the lists are explicitly indicated
		as "non-exhaustive" and that none are listed as "mandatory to
		implement". Was any thought given to factoring this into a seperate
		document, and focusing in this document on one, mandatory-to-implement,
		security mechanism?
		
Minor Issues:

	Introduction:
		o	1st paragraph: "reachable nodes"; two things:
		
				-	I always have a problem with the term "node"; it is often
					used as a shorthand for "routers and hosts, both". I was
					given to understand that homenet specifically did not want
					to consider host changes?
					
				-	"Reachable" - does that mean something as in "radio range",
					does it mean "on the same link", does it mean within a
					specific (DNCP?) domain, or does it mean simply "on the
					Internet somewhere"?
					
		o	2nd paragraph: "nodes that are currently accounted for":
				-	What does that mean?
				
				-	Also, the conclusion "Therefore unlike Time-To-Live (TTL) 	
					based solutions, it does not require periodic re-publishing
					of the data by the nodes" does actually not follow from
					the previous sentence in that paragraph.

				-	I actually do not think that the introduction describes
					what DNCP does, and so the comparison to TTL-based 
					solutions is rather hard to get here.
					
				-	Continuing:
				
						"On the other hand, it does require the topology
						to be visible to every node that wants to be able to
						identify unreachable nodes and therefore remove old,
						stale data."
						
					This reads a lot more like an applicability statement than
					an introduction; the take-away when reading this is:
					
						"Each node must have something that maintains
						 a topology map of the entire network, such as 
						 a (LS) routing protocol, for DNCP to function"
						 
					Is that actually the intent here?
					
				-	"DNCP is most suitable for data that changes only gradually"
					How is the reader to interpret "gradually"? Do you mean
					"infrequently", or do you really mean "gradualy"?
					
		o Last paragraph:
				"DNCP has relatively few requirements for the underlying
				 transport; it requires some way of transmitting either unicast
				 datagram or stream data to a peer"
			
			This is a bit of a forward comment, but we now have "nodes
			that are accounted for" and "peers". I see neither defined in
			the terminology section.
				
				"and, if used in multicast mode, a way of
				 sending multicast datagrams."
			
			This is the first mention of two "modes" of this protocol. This
			loops back to an earlier comment, that the introduction actually
			does not introduce the protocol, but rather is an incomplete
			applicability statement.
				
				"If security is desired and one of the
 	 			 built-in security methods is to be used, support for some
				TLS-derived transport scheme - such as TLS [RFC5246] on top of
				TCP or DTLS [RFC6347] on top of UDP - is also required."
   
   			I am not pretending to be a security expert, but "some
   			TLS-derived...such as ... on top of TCP or DTLS..." (i) does not
   			sound like it could lead to interoperable implementations, and (ii)
   			does not sound sufficiently tight as a MTI security mechanism to
   			pass security reviews. Again, I am no security expert, but perhaps
   			getting one looped in early would be advicable?
			
	Terminology:
		o	Suggest adding "In this document ..." somewhere to this text:

				"For readability, any DNCP profile specific
				 parameters with a profile-specific fixed value are
				 prefixed with DNCP_."
				 
		o	DNCP network: I read this twice, and came away with two different
			understandings, perhaps you can clarify which it is:

				o	A set of nodes running DNCP, within the same domain, and
					for which a path betwen any two DNCP nodes includes only
					other DNCP nodes; i.e., a DNCP network forms a connected
					component with only other DNCP nodes.
					
				o	A set of nodes running DNCP. They may be anywhere on the
					Internet, they are part of the same DNCP network as long
					as they (through other means) have learned of each others
					addresses.
					
			In the former, that'd be (for example) a deployment within my
			home -- in the latter, it could be a node in my home and a node in
			your home forming a DNCP network. 
			
			The text is not quite clear on this point.
	
		o	Link: a point of clarification here. In "DNCP network", there was
			talk about "unidirectional links" and "bidirectional links"; in
			"Link" the definition is somewhat vague "directly connected" and 
			"can communicate". Could something like "without decrementing TTL/
			hop-count" be added, and could a statement on bidirectionality 
			(IOW, that this is just an IP link) be added?
			
			
		o	"Interface" is overloading the term "port" (IP port) which can be
			confusing
			
		o	"Endpoint" - The definition "locally configured use of DNCP" is not
			clear -- are you really not talking about a DNCP process? 
			
			I am not sure that it is clear how a DNCP process can be "attached
			to  ... a specific remote unicast address, or to a range of unicast
			addresses that are allowed to contact"

			I can see how a DNCP process can be configured to allow connections 
			from a specific range of addresses, or can be configured to connect
			to a specific remote unicast address. Is that what you mean instead?
			
			
		o	"Peer" - states that two peers "communicate directly". For link,
			the definition is "directly connected nodes can communicate".
			Would it then not be easier to say "a DNCP node on the same link 
			as ..." ?
		
		o	"Node state"
				"The hash function and the number of bits used are defined 
				 in the DNCP profile."
				 
			Suggest:
				"The hash function and the length of the hash value are defined 
				 in the DNCP profile."
			
			
		o	"Network state hash" - same comment as for node state (above)
		
	Data model:
		o	"Latest update sequence number"
			This may just be my personal taste, but does it hurt to mandate
			a specific way of doing the looping comparison? The reason I 
			suggest this is, that it's one of those things where creativity
			in an implementation seems to simply be an invitation for bugs,
			and for little gain
			
		o	"Relative time delta"
			Document talks about "a 32 bit number on the wire" -- does that
			mean that wireless links are excluded?
			
		o	Related to terminology, there seems to be some fuzzyness around
			node and endpoint. For example, in data model one of the things that
			a DNCP node may have is:

				"Unicast address: the DNCP node it should connect with"
			
			Does that mean *any* DNCP process (i.e., *any* endpoint) at that
			address, or a *specific* DNCP process at that address?
			
			The same, but inverse, for "Range of addresses: the DNCP nodes that
			are allowed to connect" - is this "any DHCP process (i.e., *any*
			endpoint) on any of these addresses?
			
			Following, the same section reads:

				"For each remote (peer, endpoint) pair detected on a local
				endpoint, a DNCP node has..."
		
			the following text indicating that there's some sort of distinction
			between which endpoint.
			
			This whole thing needs some clarification.			
		
	Operation
		
		o	First a generic comment that Trickle itself has some operating
			conditions which scopes its applicability, and it would behove
			this document to, in its own applicability statement, call out
			those.
			
		o	On the same token, while the use of Trickle in an unicast fashion
			is possible, I wonder if (in general) unicast use is advicable. I
			appreciate that some links are point-to-point and so a broadcast 
			across it becomes an unicast -- but, does that necessitate being
			called out?
			
			IF the reason for this "because we can use TCP", then be explicit
			about this - but, also, that you're then not exactly using Trickle
			where and how it was intended. I wonder if you could be explicit 
			as to what consequences this "alternate use of Trickle" have? It
			seems that the use of unicast is directly contradicting the main
			operating consideration of Trickle?
			
		o	2nd paragraph states: 
		
				"the multicast transport does not have to be particularly
				 secure"
		
			What is the definition of "not have to be particularly secure"?
			Is cleartext OK? Authentication? Encryption?
			Should I do something more?
			
	5.1 Trickle-driven status updates
		o 	First paragraph:
		
				"Multicast MUST be employed on a multicast-capable interface;
				 otherwise, unicast can be used as well"
			 
			If the interface is not multicast-capable, then unicast can be
			used as well as what? Certainly not multicast, since the interface
			is not multicast capable...?
			
		o	Continuing:
		
				"If possible, most recent,"
			
			What would make it "not possible"?
				
   				"recently changed, or best of all, all known Node State TLVs"
   			
   			OK, so assuming that for some reason (MTU limitation) it is not
   			possible, does the above represent an order that I MUST respect,
   			or is it "take a pick from among these, according to your whim of
   			the day"?
 
 				"(Section 7.2.3) SHOULD be also included,"
 				
 			SHOULD is a strong statement, especially when prefixed by 
 			"if possible". That, essentially, renders it a MAY.
 			
 				"unless it is defined as undesirable for some reason 
 				 by the DNCP profile
			
			Now it DEFINITELY is a MAY since apparently a profile can state
			that these TLVs MUST NOT be included -- and, I assume, since the
			document permits it to do so, it is possible without breaking the
			algorithm.
			
		o	And, continuing again:
		
				"If the
   				 DNCP profile supports dense broadcast link optimization
				 (Section 6.2), and if a node does not have the highest node
				 identifier on a link, the endpoint may be in a unicast mode in
				 which multicast traffic is only listened to.  In that mode,
				 multicast updates MUST NOT be sent."

			Really hard to parse. Is that not equivalent to saying:
			
				"If a DNCP endpoint is not configured to be in multicast
				  mode, then it MUST NOT send multicast updates"
				  
			?
			
			If it is, then say that -- if it is not, then a rewrite is needed,
			as that's what I manage to extract from the text.

	
	5.2.  Processing of Received TLVs
		o	First paragraph reads:
		
				"The DNCP profile may specify criteria based on which particular 
				 TLVs are ignored."
			
			Criteria for what? Do you perhaps mean:
			
				"The DNCP profile may specify which TLVs to process, and 
				 which to ignore"?
			
			Auxiliary question, then, and related to my penultimate comment 
			to 5.1, are there any constraints on that, any risks from ignoring
			(or not) specific TLVs to the operation of the network?
			
		o	I am also confused by the 3rd sentence in the first paragraph:
		
				"Any ’reply’ mentioned in the steps below denotes sending of
			 	 the specified TLV(s) via unicast to the originator of the TLV
			 	 being processed."
			 	 
			 This confusion is likely due to the lack of a "protocol overview 
			 and functioning" description [either as its own section, or as part
			 of the introduction].
			 
			 I know how trickle works. Trickle is a distributed consistency
			 algorithm. When an inconsistency is detected, then an action is
			 triggered that rectifies that inconsistency.  DNCP claims to be trickle based, but apparently also a sort of request/reply 
			 mechanism. Combined with trickle-over-unicast-links, I am not sure
			 what the protocol logic actually is. Reading through to the end of
			 Section 5, I think that I understand the idea, but I am not sure.
			 
			 And the old "when in doubt, look at the state machines" didn't help
			 either, there aren't any. 
			 
			 The point to this comment is, that the document immediately jumps
			 into the details -- but forgets to give the "10000ft view" of the
			 protocol functioning.
			 
		o	First paragraph states two SHOULD. Would those not be MUST? What
			breaks if not respecting those criteria?
			
		o	2nd paragraph, a "valid address", that definition is rather unclear.
			I understand that that's something specified in "the profile", but
			what is the relationship to the different addresses discussed in
			the data model section?
			
			It is not clear what the parenthesis to this paragraph means, 
			but that is probably again a case of the "use case" and "protocol
			overview" not being documented - the document so far has nowhere 
			described interaction with outside processes.
		
		o	First bullet, but generally through these, and other, bullets:
		
			I had a really hard time deciphering this. First:
			
				"The receiver MUST reply
		         with a Network State TLV (Section 7.2.2) and a Node State TLV
		         (Section 7.2.3) for each node data used to calculate the
		         network state hash"
		    
		    Alright, off to find "network state hash".
		    
		    The terminology tells me that it is:
		    
		    	"a hash value which represents the current state of
  				 the network.  The hash function and the number of
                 bits used are defined in the DNCP profile.
                 Whenever a node is added, removed or updates its
                 published node data this hash value changes as
                 well. It is calculated over each reachable nodes'
                 update number concatenated with the hash value of
                 its node data. For calculation these tuples are
                 sorted in ascending order of the respective node's
                 node identifier.

		    Searching further, I find Section 5.1, but that simply states:
		    
		    	"The Trickle state for all endpoints is
			     considered inconsistent and reset if and only if the locally
			     calculated network state hash changes."

			Next occurence is in these bullets, and then just before Section 6,
			
				"During
			     the grace period, the nodes that were not marked reachable 
			     in the most recent graph traversal MUST NOT be used for
			     calculation of the network state hash, be provided to any
			     applications that need to use the whole TLV graph, or be
			     provided to remote nodes."
			     
			Alright, now I know what I can't use for calculating it.
			
			A few occurences later, in section 7.2.2, in what looks like a
			section laying out the packet -- sorry, TLV -- format, I see for 
			"Network State TLV":
			
				"This TLV contains the current locally calculated network state
				hash. It is calculated over each reachable nodes' update number
   				concatenated with the hash value of its node data in ascending
   				order of the respective node identifiers"
   				
			Phew. Now, it does seem a little at odds with the terminology. The
			terminology states something about tuples that are ordered. While
			those tuples are not defined (they should be), at least what is
			described is clear and possibly can be implemented. What is in 7.2.2
			is not ant cannot.
			
			This is an instance of a general issue that I have with this
			document: that it doesn't take a step back, and properly define
			things in a proper order, but dives into (and repeats) details.
			
			
		o	Also to section 5.2, for each of the cases that are described, could
			a conceptual description of "what this corresponds to" be added? For
			example:
		
				Upon reciept of a Node State TLV:
					If the node identifier matches the local node identifier and
					the TLV has a higher update sequence number than its current
    	     		local value, or the same update sequence number and a 
    	     		different hash, the node SHOULD re-publish its own node data
    	     		with an update sequence number 1000 higher than the received
    	     		one.
			
		 	It's not clear why it is a "SHOULD re-publish" (not MUST, nor what
		 	happens if SHOULD is not followed). And it is not clear why 1000 ...
			
			[I just pick this example, but it applies to all processing bullets]
			
	o	In the same cases, it is a lot more readable (IMO) to do nested bullets:
	
		o	If FOO; and either of:		
	 			- BAR
	 			- GNYF
	 			- BLAB
	 		Then do all of the following:
	 			- ...
	 			- ...
	 			- ...
	 	o 	Otherwise, if not-FOO, ...
	 	
	 	That's a personal preference, though, so feel free to disregard this
	 	comment.
	 		
	 o	Section 5.3 and elsewhere, suggest replacing:
	 
	 		"If it comes via..."
	 	
	 	by:
	 	
	 		"If received over ..."
	 	
		
	o	Last paragraph in 5.3:
			Same comment as 3rd comment to 5.1 made above.
		
	o 	Section 5.4, first sentence:
			"DNCP validates the set of data within it ..."
			
		Should that not be:
			"A DNCP instance validates the data within its data sets ..."
		
		?

		Also, "nodes that are currently accounted for; what's the definition
		of "accounted for"?
		
	o	Section 5.4, first paragraph
		The statement:
		
			"therefore,
   			 unlike Time-To-Live (TTL) based solutions, it does not require
		     periodic re-publishing of the data by the nodes.  On the other
		     hand, it does require the topology to be visible to every node that
		     wants to be able to identify unreachable nodes and therefore remove
		     old, stale data."
		     
		which also appeared in the introduction, is copied verbatimly. Once
		more, the statement is a claim which is not supported, and that which
		follows "therefore" is not a consequence of that which comes before
		"therefore".
	
	o	Section 5.4, first paragraph
	
			"When a Neighbor TLV or a whole node is added or removed, the
			neighbor graph SHOULD be traversed, starting from the local node.
			The edges to be traversed are identified by looking for Neighbor
			TLVs on both nodes, that have the other node’s identifier in the
			neighbor node identifier, and local and neighbor endpoint
			identifiers swapped. Each node reached should be marked currently
			reachable."
			
		First comment, why SHOULD and not MUST?
		
		Second comment, and now you made me go look...."neighbor" sounds like
		"someone on the same link as me" so  the "neighbor graph" is really just
		a set relating "this node" and "another node which is on the same link
		as this node".
	
		Yet, looking in the terminology, I see "Neighbor graph" defined as:
				"the undirected graph of DNCP nodes produced by
                 retaining only bidirectional peer relationships
                 between nodes.
		
		Which doesn't sound as much like a "neighbor graph" as it does a
		"topology graph" for the whole network.
		
		So, is the terminology wrong, or is the definition wrong?
		
	o	Section 5.4, 3rd paragraph
		
		Is it actually important that the content of that graph be "purged"?
		That sounds like an implementation detail -- rather, it sounds like
		the elements of the graph should "not be used for calculations and
		MAY be removed". Or, is there a specific requirement that I am
		missing?
		
	o	Section 6.1, I do not understand the parenthesis in this sentence:
	
			Trickle-driven status updates (Section 5.1) provide a mechanism for
			handling of new peer detection (if applicable) on an endpoint
		
		Under what conditions is that applicable, and under which is it not?
	
	o	Section 6.2:
	
			"An upper bound for the number of neighbors that are allowed for a
   			 (particular type of) link that an endpoint runs on SHOULD be
   			 provided by a DNCP profile, user configuration, or some hardcoded
   			 default in the implementation."
   			 
   		A couple of things to that:
   			1)	Can you explain the parenthesis? What type of link?
   			2)	How does "an endpoint runs on" a link?
   			3)	Why SHOULD?
   			4)	Is this specification seriously suggesting "some hardcoded
   				default in the implementation" as a SHOULD?

		[I am tempted to upgrade this to a "Major issue" simply because of 4) ]   		
		
		
		Also to 6.2, this particular optimization, do you have any
		quantification of its actual benefit? What should I look for to
		determine if this "optimization" yields a benefit or not? What are
		you trying to optimize? Over what link types does this function?
		I am dubious that it "optimizes" much, if anything, across an Ethernet, for example ...
		
	o	Section 7
		As indicated previously, having to search through the frame format
		diagrams for "how to calculate the value" isn't ideal.
		
	o	Section 7.2.3, I worry when I see something like this:
	
			"The whole network should have roughly the same idea about the time
			 since origination of any particular published state."
			
		What is the definition of "roughly"?
		Is the "should" intentionally in non-caps?
		What're the consequences if not?
		[Note that trickle almost mechanically makes information propagate 
		with non-trivial jitter across a network, so how do you ensure this?]
		
	o	Section 7.2.4, CUSTOM-DATA TLV.
	
		Given the description:
			"This TLV can be used to contain anything; the URI used should be
			 under control of the author of that specification."
		
		It seems that (i) the description is self-contradictory: it cannot 
		contain *anything* but can contain an URI?
		
		Secondly, how is this supposed to work, what does it mean [for DNCP]
		that "the URI is under control of the author"?
		
		Thirdly, what does "that specification" refer to?
		
		Fourthly, why lower-case should? Indeed, why is the "control" of the
		URI of any importance to DNCP?

	o	Section 9, the bullet:
	
			"When receiving messages, what sort of messages are dropped, as
			specified in Section 5.2"
		
		Seems at odds with Section 5.2, which discusses TLV processing.
		

Nits:
   		
	Requirement Language:
		o	Please reflect Errata 499 for RFC2119 in the boilerplate
		
		o	The RFC2119 boilerplate could conveniently be in the terminology
			section, given that it is terminology.