[rtcweb] AD Review: draft-ietf-rtcweb-jsep

Adam Roach <adam@nostrum.com> Wed, 19 April 2017 05:42 UTC

Return-Path: <adam@nostrum.com>
X-Original-To: rtcweb@ietfa.amsl.com
Delivered-To: rtcweb@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 916C21292D0; Tue, 18 Apr 2017 22:42:44 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.879
X-Spam-Level:
X-Spam-Status: No, score=-1.879 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, RP_MATCHES_RCVD=-0.001, T_SPF_HELO_PERMERROR=0.01, T_SPF_PERMERROR=0.01, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
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 hNspbBbl7faX; Tue, 18 Apr 2017 22:42:41 -0700 (PDT)
Received: from nostrum.com (raven-v6.nostrum.com [IPv6:2001:470:d:1130::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 74AD71200C1; Tue, 18 Apr 2017 22:42:41 -0700 (PDT)
Received: from Svantevit.roach.at (cpe-70-122-154-80.tx.res.rr.com [70.122.154.80]) (authenticated bits=0) by nostrum.com (8.15.2/8.15.2) with ESMTPSA id v3J5gb0P053933 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Wed, 19 Apr 2017 00:42:39 -0500 (CDT) (envelope-from adam@nostrum.com)
X-Authentication-Warning: raven.nostrum.com: Host cpe-70-122-154-80.tx.res.rr.com [70.122.154.80] claimed to be Svantevit.roach.at
From: Adam Roach <adam@nostrum.com>
To: draft-ietf-rtcweb-jsep@ietf.org, "rtcweb@ietf.org" <rtcweb@ietf.org>, Ted Hardie <ted.ietf@gmail.com>
Message-ID: <c76dd321-c854-91ce-b101-36ccf794c213@nostrum.com>
Date: Wed, 19 Apr 2017 00:42:37 -0500
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:52.0) Gecko/20100101 Thunderbird/52.0.1
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="------------AFA8241ED78AB574958D38CB"
Content-Language: en-US
Archived-At: <https://mailarchive.ietf.org/arch/msg/rtcweb/4b5hcQtWX1stjFgWJY5W0t4WVjM>
Subject: [rtcweb] AD Review: draft-ietf-rtcweb-jsep
X-BeenThere: rtcweb@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: Real-Time Communication in WEB-browsers working group list <rtcweb.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/rtcweb/>
List-Post: <mailto:rtcweb@ietf.org>
List-Help: <mailto:rtcweb-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/rtcweb>, <mailto:rtcweb-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 19 Apr 2017 05:42:45 -0000

RTCWEB working group --

I have completed my AD review for JSEP. I want to start by saying that 
this is an impressive body of work, and that everyone who has 
contributed to getting it to its current state deserves a round of 
applause. The volume of comments below does not represent that the 
document is of poor quality. Rather, the number of comments reflects on 
the breath, depth, and size of the document itself.

All of that said, I'm going to need to see a new version of this 
document before I put it in front of the IETF for last call. The 
document has a number of issues that I suspect will trip people up in 
their LC reviews. Most of these are feedback that the document authors 
should treat as normal last call comments. The feedback that I consider 
to block progressing the document, in my role as AD, is explicitly 
marked with the prefix "BLOCKER", and these will need to be resolved in 
a new version of the document before progressing it further. Note that 
it is entirely possible that something I have marked "BLOCKER" may stem 
from an error on my part; so recognize that these are not demands for 
change, as much as a need to have things either fixed in the document or 
explained to me.

Some general, top-level comments:

BLOCKER: The nits tool reports (and a cursory hand check supports this) 
that six of the references are unused, and RFC4572 has been (recently) 
obsoleted. The remaining references are largely out of date by many 
versions, which I believe the current tools will automatically handle if 
version numbers are simply pulled out of the source. Finally, a large 
number of the referenced working group documents still use the 
individual name (e.g., draft-nandakumar-rtcweb-sdp instead of 
draft-ietf-rtcweb-sdp).

There is a lot of text that should have been removed when the decision 
to prohibit SDP munging was taken. I will call these out individually, 
but wanted to call it out here at the top since it has impacts in many 
places. (In this sentence and elsewhere, I use "munging" exclusively to 
refer to changing SDP between a createOffer or createAnswer and the 
corresponding setLocalDescription. In particular, I *do* *not* use it to 
refer to changes applied to SDP sent to or received from the remote 
party). Although I repeat it below, I want to be clear in my position: 
if an implementation creates SDP, verifies that it has not changed since 
its creation, and then has difficulty processing it, that is a 
programming error, not a protocol error. It is not appropriate to call 
out how to recover from programming errors in a protocol document.

BLOCKER: Several of the SDP-building procedures in this document call 
out addition of "a=fingerprint" to individual media sections, while the 
canonical definition of "a=fingerprint" allows these to be added at 
either the session level or the media level. The same is true of ice-pwd 
and ice-ufrag. While the process of SDP building in this document 
appears to be prescriptive on purpose, one assumes that it is allowed 
some variation so as to accommodate deployment of future SDP extensions. 
Because of this state of affairs, it is unclear whether implementations 
that consolidate these attributes at the session level when they would 
otherwise be identical among all media sections is such an allowable 
variation. Ambiguity in specifications is never a good thing, so I 
believe that the draft needs to do one of: (a) specifically call out 
this kind of aggregation as allowed; (b) specifically call out this kind 
of aggregation as disallowed; or (c) include a blanket statement that 
implementations are allowed to emit SDP that is semantically equivalent 
to that which is generated by the procedures in this document, but which 
may vary in exact structure. I have a strong preference for (c) -- 
implementations will be required to deal with such variations anyway to 
interop with legacy SDP, so prohibiting JSEP clients from generating 
them serves no goal.

BLOCKER: The text in the third paragraph of section 5.7.1 intentionally 
contradicts language in RFC 5245; as such, this document needs to 
formally update that RFC. Note that updated RFCs are expected to be 
mentioned in the Abstract as well as the document metadata.

The rest of my comments are in document order.

Section 1.1 talks about Jingle as a potential transport, but the 
remainder of the document calls out a slew of MTI SDP features that 
don't have analogs for signaling in Jingle. I recommend either 
qualifying the discussion of Jingle with some mention of it requiring 
as-yet undefined extensions, or removing mention of Jingle altogether.

Section 1.2 uses the term "glare" without describing it. This term may 
be unfamiliar to readers, and should be explained or cited.

Section 3.2 has a paragraph starting "Lastly, while the actual media 
parameters are only know after an offer..."; the entire contents of this 
paragraph appear to be actually false if both ICE and DTLS are in use. I 
know there's conversation underway on MMUSIC and the WebRTC mailing 
lists on this topic, but none of them have yet described a situation in 
which this paragraph is actually true. Please remove it or add a 
sequence diagram showing how it arises.

The state labels in Figure 2 ("Remote-Offer") do not match the state 
names used in the document text ("have-remote-offer"). Please make these 
consistent.

Section 3.3, paragraph 3 is an example of text that should have been 
removed with SDP munging. Please remove it.

The same is true of the final three words in the first paragraph of 
section 3.4.

Section 3.5.1 talks about a "recycled m= section" without any context 
for what this means. Please provide a forward reference to the section 
that discusses m= section recycling.

BLOCKER: The final paragraph in section 3.5.1 says that candidates are 
*only* gathered for m= sections referenced in BUNDLE tags. Section 3.5.4 
talks about gathering more candidates than that under certain 
circumstances. Please make these consistent with each other.

Since it has been the cause of actual interop issues in the field, it is 
probably worth mentioning, in section 3.5.2.1, that the IceCandidate 
strings explicitly *do not* start with "a=".

The second paragraph of section 3.6.1 seems odd when talking about 
creating answers, and downright incorrect when talking about offers. 
Minimally, it needs text to explain why  x=0/y=0 would ever make more 
sense than using "a=sendonly/recvonly/inactive."

Section 3.6.2 talks about "original resolution" where it appears to want 
to reference the current resolution. This happens in three different places.

BLOCKER: Section 3.6.2, second paragraph, second sentence says a sender 
MUST scale to match imageattr. The same section, paragraph seven, says 
it SHOULD scale to match imageattr. There needs to be only one normative 
statement on this topic, so as to avoid confusion among implementors.

Section 3.6.2 would ideally include a disclaimer, like we have for many 
other features, indicating that -- despite normative statements in this 
section -- the remote side might not honor imageattr because of legacy 
behavior, and that implementations MUST be prepared to handle such 
situations.

Section 4.1.9 paragraph one includes an enumeration of things that can 
appear in the "type" field, but omits "rollback" from the list.

Section 4.2.6, second paragraph says that codec preferences cannot add 
formats that were negotiated away in previous offer/answer exchanges. My 
recollection is that this conflicts with the decision taken by the 
WebRTC working group; and a quick read of the description of 
setCodecPreferences() in their current spec seems to confirm this (at 
least, by omitting this restriction). Unless I'm mistaken about the 
state of play, this paragraph should be modified to indicate that codec 
preferences *can* add back in codecs were not negotiated in previous 
offer/answer exchanges.

BLOCKER: The first bullet on page 35 has a normative statement about the 
AVT profile strings that must be accepted, but uses an unspecified 
grammar to actually specify the string. If this is normative, it needs 
to be formal. Either specify the string using a formal and cited 
grammar, or provide an exhaustive list.

Section 5.2.1 contains the statement "both 'o=' and 's=' are 
meaningless" -- this should be qualified with "in JSEP." These fields 
are not generally meaningless in all uses of SDP.

BLOCKER: The first bullet on page 37 says that port 9 "MUST be used," 
which contradicts the behavior required of BUNDLE-only sections (for 
which port 0 MUST be used). Clarify.

Page 37 contains a statement that "attributes of category IDENTICAL or 
TRANSPORT should not be repeated in bundled m= sections". Two issues: 
this reads as normative, so consider "SHOULD NOT" rather than "should 
not." Also, I *think* this is true of bundle-only sections, not bundled 
sections in general.

Page 38, second-to-last bullet refers to "an 'a=rtcp-fb' mechanism" 
where it should say "an 'a=rtcp-fb' line".

Page 41 contains a statement reading "This promotes readability," which 
might be read by some as promoting machine parsing rather than 
troubleshooting. I propose replacing "readability" with "troubleshooting."

BLOCKER: The bullet at the bottom of of page 42 ("If any RtpTranceiver 
has been added...") is normative and redundant with the bullet in the 
middle of page 44 ("If any RtpTranceiver has been added..."), which is 
also normative. Remove one.

BLOCKER: The second bullet on page 43 ("If an RtpTranceiver has been 
stopped and is associated..." is normative and redundant with (and 
slightly contradictory to) the bullet on page 44 starting "If any 
RtpTranceiver has been slopped...") which is also normative. Remove one.

The bullets on page 45 use the construct "MUST only" three times. This 
is confusing, and likely to lead to implementors doing the wrong thing. 
Please rewrite in the form "The 'a=rtcp' line MUST NOT be added unless..."

The paragraph that spans pages 46 and 47 claims that the 
"VoiceActivityDetection" parameter has no impact on whether the local 
endpoint does silence suppression for the audio it sends. The paragraph 
immediately preceding it says that JSEP implementations MUST NOT emit 
"CN" codecs if this parameter is set to "false." This only makes sense 
because RFC 3264 allows SDP to specify codecs that you want to receive 
by do not plan to generate (i.e., you can send CN even if your offer 
doesn't have CN in it, as long as the answer *does*). This is slightly 
counter-intuitive to many implementors, so it probably bears mention.

Page 51, bullet starting "For each supported RTCP feedback...": replace 
"an 'a=rtcp-fb' mechanism" with "an 'a=rtcp-fb' line".

Page 52, bullet starting "An 'a=setup' line": add the words "when 
allowed" to the end of the bullet.

Section 5.5, bullet 4 talks about parsing the local session description. 
This is legacy from when SDP munging was allowed, and should be removed 
(especially the normative statement about parsing errors: the check that 
the SDP has not changed will catch changes, and any implementation that 
cannot parse its own SDP is exhibiting an internal error, not a protocol 
error).

Section 5.7, first paragraph: similar to above, change 
"setLocal/RemoteDescription" to "setRemoteDescription."

BLOCKER: Section 5.7.1, first paragraph: this claims that a= lines are 
order insensitive. Nothing in SDP's base definition makes this true, and 
nothing precludes specific attributes from assigning meaning to the 
order in which they appear. See 
draft-ietf-slim-negotiating-human-language-08 for an example of an SDP 
extension that *does* apply meaning to the order in which attributes 
appear (for better or worse).

Section 5.7.2 should include a statement (probably at the end) that 
implementations may know and process attributes other than those 
described in this section.

Page 62 has a bullet ending "If this is a local description, the 
'ice-lite' attribute MUST NOT be specified." This sentence is leftover 
from before SDP munging was prohibited and should be removed.

Section 5.8 describes the behavior of an implementation processing its 
own unmodified SDP. It contains significant error language that should 
have been removed when SDP munging was removed. In particular, please 
remove all of the following:

  * "If an error is returned, the session MUST be restored to the state
    it was in before performing these steps."
  * "If RTCP mux is not indicated, but was previously negotiated, i.e.,
    the RTCP ICE component no longer exists, this MUST result in an error."
  * "If any indicated RTP header extension is not supported, this MUST
    result in an error."
  * "If any indicated media format is not supported, this MUST result in
    an error."
  * "If any referenced primary payload types are not present, this MUST
    result in an error."

The first bullet of section 5.8 includes: "...unless it has been marked 
as bundle-only...," and the second includes "...and it has not been 
marked as bundle-only..." -- in both cases, I believe the indicated 
behavior is supposed to happen for any bundled section (e.g., in a 
re-offer or re-answer), regardless of whether it is bundle-only.

Section 5.8 contains the sentence: "If there is no RtpTransceiver 
associated with this m= section (which will only happen when applying an 
offer)..." -- it is grammatically ambiguous whether this says that the 
*absence* of an RtpTranceiver can only happen with an offer, or if the 
*presence* of an RtpTranceiver can only happen with an offer. Suggest 
rephrasing as: "If applying an offer and there is no RtpTransceiver 
associated with this m= section, find one..."

BLOCKER: Section 5.9 discusses remote description handling. This means 
that the first bullet on page 65 talks about remote description handling 
in the "have-local-offer" state. This means that the second sentence of 
that bullet talks about remote offer handling when in the 
"have-local-offer" state. That... doesn't seem right. I'm particularly 
concerned that the language regarding ICE restart probably belongs 
somewhere else, since it doesn't appear to belong where it is, but I 
can't quickly figure out where it's missing from.

The bullet in the middle of page 66 (starting "For each specified media 
format...") states that unsupported media formats must be ignored. The 
following bullet specifies that "rtx" media formats that refer to 
"primary payload types [that] are not present" MUST result in an error. 
Read naïvely, implementors may very well discard a payload type for lack 
of understanding, and then discover an "rtx" for that discarded PT, and 
generate an error ("it's not present!"). These bullets need additional 
text regarding how they interact with each other.

It's nice that you describe how you get from AS to TIAS, but as the 
formula here isn't intended to be tuned, please simplify it for 
imlementors as "TIAS = (950 * AS) - 16000". Minimally, include 
parentheses around the first three terms and the final two; while most 
people will assume proper order of operations, leaving these ungrouped 
is asking for trouble. (I once had an argument with an implementor 
reading an RFC who insisted that 96 wasn't an even multiple of 32; they 
asserted, with great vehemence, that 96 is 32 times three, and three is 
odd, so 96 is an *odd* multiple of 32. Don't underestimate the ingenuity 
of some of the people who will end up implement these specifications.)

Page 67 contains the acronym "DTX" without expanding it. Please expand it.

BLOCKER: Page 68 contains a sub-bullet that says "If the m= section 
references any media formats, RTP header extensions, or RTCP feedback 
mechanisms that were not present in the corresponding m= section in the 
offer, this indicates a negotiation problem and MUST result in an 
error." No. This is a violation of RFC 3264. Section 6.1 of that 
document, when talking about generating answers, specifically stipulates:

    The stream MAY indicate additional media formats, not listed in the
    corresponding stream in the offer, that the answerer is willing to
    send or receive (of course, it will not be able to send them at this
    time, since it was not listed in the offer).

Note, for example, that this is *exactly* the behavior that the CN 
handling I describe above relies on. General handling for header 
extensions and (I believe) feedback mechanisms is intended to operate 
the same way. This sub-bullet needs to be remove in its entirety.

BLOCKER: The final bullet of page 68 refers to answer directionality of 
"sendrecv" and "sendonly." These are incorrect when applying remote 
answers, for which these should be "sendrecv" and "recvonly." Please 
rephrase in terms of whether media is to be sent, or fix in some other 
way that doesn't get the sense reversed for remote answers.

BLOCKER: The first bullet on page 70 exhibits the same error.

Section 7 does not acknowledge IPv6. The IAB statement on IPv6 
<https://www.iab.org/2016/11/07/iab-statement-on-ipv6/> has a 
recommendation that all protocol specifications have IPv6 examples in 
them. Since we have a separate example document, and Suhas has indicated 
that he will be including some IPv6 examples in it, I think you can get 
away in this document by amending the final paragraph of section 7 as: 
"More examples of SDP for WebRTC call flows, including examples of IPv6 
addresses, can be found in [I-D.ietf-rtcweb-sdp]." I make no promise 
that other IESG members will find this sufficient, but I'm personally 
okay with it.

For the examples, please expand the acronyms "JS" and "UA".

BLOCKER: This is an issue with all of the examples. Page 37 contains a 
bullet that asserts that (unless excluded by rare circumstances which 
the examples do not stipulate), media formats MUST include those 
specified in [draft-ietf-rtcweb-video], section 5. None of the examples 
comply with this normative requirement.

All examples include telephone-event audio codecs, but omit a 
corresponding "a=fmtp" line. RFC4733 specifies:

    SDP descriptions using the event payload MUST contain an fmtp format
    attribute that lists the event values that the receiver can process.

While this is a little hinky for implementations that plan to send, but 
not to receive, DTMF (and that's the only reason I'm not marking this as 
a blocker), I don't believe that such implementations are exempted from 
the normative requirement (as SDP recipients may not be expecting such a 
situation). Including such fmtp lines in the examples is probably the 
best way to avoid resulting interop issues.

BLOCKER: The example on page 83 includes "a=rid" attributes, but omits a 
corresponding "a=extmap" attribute to indicate which value is to be used 
for the associated header extensions.

/a