Return-Path: <noreply@github.com>
X-Original-To: quic-issues@ietfa.amsl.com
Delivered-To: quic-issues@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1])
 by ietfa.amsl.com (Postfix) with ESMTP id 4963D1311DB
 for <quic-issues@ietfa.amsl.com>; Wed, 26 Dec 2018 10:41:42 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -7.086
X-Spam-Level: 
X-Spam-Status: No, score=-7.086 tagged_above=-999 required=5
 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.065, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FROM_EXCESS_BASE64=0.979,
 HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_HI=-5,
 SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key)
 header.d=github.com
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 qy4hdGsA8abj for <quic-issues@ietfa.amsl.com>;
 Wed, 26 Dec 2018 10:41:38 -0800 (PST)
Received: from out-6.smtp.github.com (out-6.smtp.github.com [192.30.252.197])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by ietfa.amsl.com (Postfix) with ESMTPS id C64791311D4
 for <quic-issues@ietf.org>; Wed, 26 Dec 2018 10:41:36 -0800 (PST)
Date: Wed, 26 Dec 2018 10:41:35 -0800
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com;
 s=pf2014; t=1545849695;
 bh=TgxMZVUQqDYJqDtuG1Rg80VbagpRmRWk3lfxNtMKhVw=;
 h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID:
 List-Archive:List-Post:List-Unsubscribe:From;
 b=EGcfrACLWpTFSE5zVZ0I2fRRYEasWgSHYdn6/yI6m2s8UkJgyZWFaHzUBEo5zRn1g
 s2Drlbedf6rT0QUGTAT/+6Z1NIQTOyyggkdOjUW1974W8Z5WBn3obIlF/cypcypzA0
 buftq8qAxFOq97InKQqUW2qmNh2+Lh0UcH8lB9eE=
From: =?UTF-8?B?QmVuY2UgQsOpa3k=?= <notifications@github.com>
Reply-To: quicwg/base-drafts
 <reply+0166e4ab10943793a051e7f5c8829d766f17787d0dfd2d9892cf00000001183b8d5f92a169ce17392ee3@reply.github.com>
To: quicwg/base-drafts <base-drafts@noreply.github.com>
Cc: Subscribed <subscribed@noreply.github.com>
Message-ID: <quicwg/base-drafts/pull/2111/review/187935117@github.com>
In-Reply-To: <quicwg/base-drafts/pull/2111@github.com>
References: <quicwg/base-drafts/pull/2111@github.com>
Subject: Re: [quicwg/base-drafts] Use "Insert Count" rather than "Largest
 Reference" (#2111)
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_5c23cb5f7a6de_58633f9e318d45b4365688";
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: bencebeky
X-GitHub-Recipient: quic-issues
X-GitHub-Reason: subscribed
X-Auto-Response-Suppress: All
X-GitHub-Recipient-Address: quic-issues@ietf.org
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic-issues/mh24gRyFUfFpPXBQj1KGWNU_pC0>
X-BeenThere: quic-issues@ietf.org
X-Mailman-Version: 2.1.29
List-Id: Notification list for GitHub issues related to the QUIC WG
 <quic-issues.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic-issues>,
 <mailto:quic-issues-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic-issues/>
List-Post: <mailto:quic-issues@ietf.org>
List-Help: <mailto:quic-issues-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic-issues>,
 <mailto:quic-issues-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 26 Dec 2018 18:41:42 -0000


----==_mimepart_5c23cb5f7a6de_58633f9e318d45b4365688
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

bencebeky requested changes on this pull request.

I enthusiastically support this change for the following reasons:
* The Required Insert Count concept inherently is zero if there are no dynamic table references ("the lowest possible value of insert count with which this header block can be decoded").  No need for awkward language like what I am proposing at issue #2251 (which I'm happy to abandon in favor of this PR).  Sure one can add a clarifying note about the zero case, but this flows much better to me.
* This PR silently adds clarity by using distinct terms for the abstract value "Required Insert Count" and its encoding "EncodedInsertCount".  Me having proposed #2250 is a testimony that I feel strongly about this.  (And I'm happy to abandon #2250 in favor of this.)
* While I understand that this is purely editorial, I also feel strongly that dynamic table absolute indexing should be zero based, to match static table indexing, and indexing schemes in the majority of programming languages.  I never voiced this, because issue #1650 was shut down, in large part because 0 for Largest Reference is used to indicate no dynamic table references, making it convenient to start absolute indices with 1.  I support this change because it gets rid of this fairly artificial restriction, unblocking the discussion to change absolute indexing to more natural zero-based.

Couple of humble suggestions below.

> -index in the dynamic table becomes greater than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the stream.
-If the decoder encounters a header block where the actual largest reference is
-not equal to the Largest Reference declared in the prefix, it MAY treat this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dynamic
+table - the Required Insert Count - which identifies the table state necessary
+for decoding (see {{header-prefix}}). If the Required Insert Count is greater
+than the number of dynamic table entries received, the stream is considered
+"blocked."  While blocked, header field data SHOULD remain in the blocked
+stream's flow control window.  When the Required Insert Count is zero, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inserted in
+the dynamic table becomes greater than or equal to the Required Insert Count for
+all header blocks the decoder has started reading from the stream.  If the
+decoder encounters a header block where the largest Absolute Index used not

s/not equal to/is not equal to/ or s/not equal to/does not equal/

> -index in the dynamic table becomes greater than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the stream.
-If the decoder encounters a header block where the actual largest reference is
-not equal to the Largest Reference declared in the prefix, it MAY treat this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dynamic
+table - the Required Insert Count - which identifies the table state necessary
+for decoding (see {{header-prefix}}). If the Required Insert Count is greater
+than the number of dynamic table entries received, the stream is considered
+"blocked."  While blocked, header field data SHOULD remain in the blocked
+stream's flow control window.  When the Required Insert Count is zero, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inserted in
+the dynamic table becomes greater than or equal to the Required Insert Count for
+all header blocks the decoder has started reading from the stream.  If the
+decoder encounters a header block where the largest Absolute Index used not

"where the Required Insert Count does not match the definition in {{conventions-and-definitions}}, it MAY" to avoid having to talk explicitly about the case of no dynamic table references.

> -Reference for all header blocks the decoder has started reading from the stream.
-If the decoder encounters a header block where the actual largest reference is
-not equal to the Largest Reference declared in the prefix, it MAY treat this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dynamic
+table - the Required Insert Count - which identifies the table state necessary
+for decoding (see {{header-prefix}}). If the Required Insert Count is greater
+than the number of dynamic table entries received, the stream is considered
+"blocked."  While blocked, header field data SHOULD remain in the blocked
+stream's flow control window.  When the Required Insert Count is zero, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inserted in
+the dynamic table becomes greater than or equal to the Required Insert Count for
+all header blocks the decoder has started reading from the stream.  If the
+decoder encounters a header block where the largest Absolute Index used not
+equal to the largest value permitted by the Required Insert Count, it MAY treat

s/permitted/communicated/ or s/permitted/specified/

>  +---+---------------------------+
 |      Compressed Headers     ...
 +-------------------------------+
 ~~~~~~~~~~
 {:#fig-base-index title="Frame Payload"}
 
-#### Largest Reference
+#### Insert Count

s/Insert Count/Required Insert Count/ here and below throughout.

>  
-`Largest Reference` identifies the largest absolute dynamic index referenced in
-the block.  Blocking decoders use the Largest Reference to determine when it is
-safe to process the rest of the block.  If Largest Reference is greater than
-zero, the encoder transforms it as follows before encoding:
+`Insert Count` identifies the state of the dynamic table needed to process the
+header block successfully.  Blocking decoders use the Insert Count to determine
+when it is safe to process the rest of the block.  If Insert Count is greater

Explicitly include the case of RequiredInsertCount == 0.  (Currently EncodedInsertCount is undefined in that case.)

>  
 ~~~~~~~~~~  drawing
   0   1   2   3   4   5   6   7
 +---+---+---+---+---+---+---+---+
-|     Largest Reference (8+)    |
+|   Required Insert Count (8+)  |

s/Required Insert Count/EncodedInsertCount/

> @@ -784,29 +798,29 @@ streams emit the headers for an HTTP request or response.
 
 ### Header Data Prefix {#header-prefix}
 
-Header data is prefixed with two integers, `Largest Reference` and `Base Index`.
+Header data is prefixed with two integers, `Required Insert Count` and `Base`.

In wire format sections I usually see an explicit textual description of all fields.  Consider adding some text similar to https://github.com/quicwg/base-drafts/pull/2250/files#diff-c3ed24528f71fade042cdefbeadbd7b9R787.

> @@ -249,18 +250,19 @@ Because QUIC does not guarantee order between data on different streams, a
 header block might reference an entry in the dynamic table that has not yet been
 received.
 
-Each header block contains a Largest Reference ({{header-prefix}}) which
-identifies the table state necessary for decoding. If the greatest absolute
-index in the dynamic table is less than the value of the Largest Reference, the
-stream is considered "blocked."  While blocked, header field data SHOULD remain
-in the blocked stream's flow control window.  When the Largest Reference is
-zero, the frame contains no references to the dynamic table and can always be
-processed immediately. A stream becomes unblocked when the greatest absolute
-index in the dynamic table becomes greater than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the stream.
-If the decoder encounters a header block where the actual largest reference is
-not equal to the Largest Reference declared in the prefix, it MAY treat this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dynamic

Maybe "Each header block contains a Required Insert Count, the lowest possible value for the Insert Count with which the header block can be decoded.  For a header block with no references to the dynamic table, the Required Insert Count is zero."?

>  
 n = count of entries inserted
 d = count of entries dropped
 ~~~~~
 {: title="Example Dynamic Table Indexing - Control Stream"}
 
 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the Base
-Index at the beginning of the header block (see {{header-prefix}}). The Base
-Index is an absolute index. When interpreting the rest of the frame, the entry
-identified by Base Index has a relative index of zero.  The relative indices of
-entries do not change while interpreting headers on a request or push stream.
+instructions on the encoder stream, relative indices are relative to the Base at
+the beginning of the header block (see {{header-prefix}}). The Base is encoded

"Unlike on the encoder stream, relative indices on push and request streams are relative to the Base at the beginning of the header block (see bla).  This allows for the mapping from relative indices to absolute indices to not be affected by dynamic table insertions on the encoder stream, regardless of what order the decoder processes request stream and encoder stream instructions.", and scratch the paragraph "Though new entries..." below.  Processing order encompasses on-the-wire reordering as well as the parallel processing case, and specifically talking about "mapping" makes it unnecessary to mention blocking in this sentence.

> @@ -923,10 +948,9 @@ header field name matches the header field name of an entry stored in the static
 table or the dynamic table.
 
 If the entry is in the static table, or in the dynamic table with an absolute
-index less than or equal to Base Index, this representation starts with the '01'
-two-bit pattern.  If the entry is in the dynamic table with an absolute index
-greater than Base Index, the representation starts with the '0000' four-bit
-pattern.
+index less than the Base, this representation starts with the '01' two-bit

Are you changing one-based absolute indexing to zero-based in this PR?  Then update 3.2.4 Absolute Indexing, #indexing.  Or maybe do this in a separate PR?

>  
 ### Literal Header Field With Post-Base Name Reference
 
-For entries in the dynamic table with an absolute index greater than Base Index,
+For entries in the dynamic table with an absolute index greater than the Base,

If you change "less than or equal to" to "less than" above, maybe "greate than" here should be changed to "greater than or equal to"?

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2111#pullrequestreview-187935117
----==_mimepart_5c23cb5f7a6de_58633f9e318d45b4365688
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<p><b>@bencebeky</b> requested changes on this pull request.</p>

<p>I enthusiastically support this change for the following reasons:</p>
<ul>
<li>The Required Insert Count concept inherently is zero if there are no =
dynamic table references ("the lowest possible value of insert count with=
 which this header block can be decoded").  No need for awkward language =
like what I am proposing at issue <a class=3D"issue-link js-issue-link" d=
ata-error-text=3D"Failed to load issue title" data-id=3D"393781280" data-=
permission-text=3D"Issue title is private" data-url=3D"https://github.com=
/quicwg/base-drafts/issues/2251" data-hovercard-type=3D"pull_request" dat=
a-hovercard-url=3D"/quicwg/base-drafts/pull/2251/hovercard" href=3D"https=
://github.com/quicwg/base-drafts/pull/2251">#2251</a> (which I'm happy to=
 abandon in favor of this PR).  Sure one can add a clarifying note about =
the zero case, but this flows much better to me.</li>
<li>This PR silently adds clarity by using distinct terms for the abstrac=
t value "Required Insert Count" and its encoding "EncodedInsertCount".  M=
e having proposed <a class=3D"issue-link js-issue-link" data-error-text=3D=
"Failed to load issue title" data-id=3D"393781071" data-permission-text=3D=
"Issue title is private" data-url=3D"https://github.com/quicwg/base-draft=
s/issues/2250" data-hovercard-type=3D"pull_request" data-hovercard-url=3D=
"/quicwg/base-drafts/pull/2250/hovercard" href=3D"https://github.com/quic=
wg/base-drafts/pull/2250">#2250</a> is a testimony that I feel strongly a=
bout this.  (And I'm happy to abandon <a class=3D"issue-link js-issue-lin=
k" data-error-text=3D"Failed to load issue title" data-id=3D"393781071" d=
ata-permission-text=3D"Issue title is private" data-url=3D"https://github=
.com/quicwg/base-drafts/issues/2250" data-hovercard-type=3D"pull_request"=
 data-hovercard-url=3D"/quicwg/base-drafts/pull/2250/hovercard" href=3D"h=
ttps://github.com/quicwg/base-drafts/pull/2250">#2250</a> in favor of thi=
s.)</li>
<li>While I understand that this is purely editorial, I also feel strongl=
y that dynamic table absolute indexing should be zero based, to match sta=
tic table indexing, and indexing schemes in the majority of programming l=
anguages.  I never voiced this, because issue <a class=3D"issue-link js-i=
ssue-link" data-error-text=3D"Failed to load issue title" data-id=3D"3496=
11518" data-permission-text=3D"Issue title is private" data-url=3D"https:=
//github.com/quicwg/base-drafts/issues/1650" data-hovercard-type=3D"pull_=
request" data-hovercard-url=3D"/quicwg/base-drafts/pull/1650/hovercard" h=
ref=3D"https://github.com/quicwg/base-drafts/pull/1650">#1650</a> was shu=
t down, in large part because 0 for Largest Reference is used to indicate=
 no dynamic table references, making it convenient to start absolute indi=
ces with 1.  I support this change because it gets rid of this fairly art=
ificial restriction, unblocking the discussion to change absolute indexin=
g to more natural zero-based.</li>
</ul>
<p>Couple of humble suggestions below.</p><hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244027700">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; -index in the dynamic table becomes greate=
r than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the=
 stream.
-If the decoder encounters a header block where the actual largest refere=
nce is
-not equal to the Largest Reference declared in the prefix, it MAY treat =
this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dyna=
mic
+table - the Required Insert Count - which identifies the table state nec=
essary
+for decoding (see {{header-prefix}}). If the Required Insert Count is gr=
eater
+than the number of dynamic table entries received, the stream is conside=
red
+&quot;blocked.&quot;  While blocked, header field data SHOULD remain in =
the blocked
+stream&#39;s flow control window.  When the Required Insert Count is zer=
o, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inser=
ted in
+the dynamic table becomes greater than or equal to the Required Insert C=
ount for
+all header blocks the decoder has started reading from the stream.  If t=
he
+decoder encounters a header block where the largest Absolute Index used =
not
</pre>
<p>s/not equal to/is not equal to/ or s/not equal to/does not equal/</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244027914">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; -index in the dynamic table becomes greate=
r than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the=
 stream.
-If the decoder encounters a header block where the actual largest refere=
nce is
-not equal to the Largest Reference declared in the prefix, it MAY treat =
this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dyna=
mic
+table - the Required Insert Count - which identifies the table state nec=
essary
+for decoding (see {{header-prefix}}). If the Required Insert Count is gr=
eater
+than the number of dynamic table entries received, the stream is conside=
red
+&quot;blocked.&quot;  While blocked, header field data SHOULD remain in =
the blocked
+stream&#39;s flow control window.  When the Required Insert Count is zer=
o, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inser=
ted in
+the dynamic table becomes greater than or equal to the Required Insert C=
ount for
+all header blocks the decoder has started reading from the stream.  If t=
he
+decoder encounters a header block where the largest Absolute Index used =
not
</pre>
<p>"where the Required Insert Count does not match the definition in {{co=
nventions-and-definitions}}, it MAY" to avoid having to talk explicitly a=
bout the case of no dynamic table references.</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244027977">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; -Reference for all header blocks the decod=
er has started reading from the stream.
-If the decoder encounters a header block where the actual largest refere=
nce is
-not equal to the Largest Reference declared in the prefix, it MAY treat =
this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dyna=
mic
+table - the Required Insert Count - which identifies the table state nec=
essary
+for decoding (see {{header-prefix}}). If the Required Insert Count is gr=
eater
+than the number of dynamic table entries received, the stream is conside=
red
+&quot;blocked.&quot;  While blocked, header field data SHOULD remain in =
the blocked
+stream&#39;s flow control window.  When the Required Insert Count is zer=
o, the frame
+contains no references to the dynamic table and can always be processed
+immediately. A stream becomes unblocked when the number of entries inser=
ted in
+the dynamic table becomes greater than or equal to the Required Insert C=
ount for
+all header blocks the decoder has started reading from the stream.  If t=
he
+decoder encounters a header block where the largest Absolute Index used =
not
+equal to the largest value permitted by the Required Insert Count, it MA=
Y treat
</pre>
<p>s/permitted/communicated/ or s/permitted/specified/</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244028403">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt;  +---+---------------------------+
 |      Compressed Headers     ...
 +-------------------------------+
 ~~~~~~~~~~
 {:#fig-base-index title=3D&quot;Frame Payload&quot;}
 =

-#### Largest Reference
+#### Insert Count
</pre>
<p>s/Insert Count/Required Insert Count/ here and below throughout.</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244028551">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt;  =

-`Largest Reference` identifies the largest absolute dynamic index refere=
nced in
-the block.  Blocking decoders use the Largest Reference to determine whe=
n it is
-safe to process the rest of the block.  If Largest Reference is greater =
than
-zero, the encoder transforms it as follows before encoding:
+`Insert Count` identifies the state of the dynamic table needed to proce=
ss the
+header block successfully.  Blocking decoders use the Insert Count to de=
termine
+when it is safe to process the rest of the block.  If Insert Count is gr=
eater
</pre>
<p>Explicitly include the case of RequiredInsertCount =3D=3D 0.  (Current=
ly EncodedInsertCount is undefined in that case.)</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244028589">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt;  =

 ~~~~~~~~~~  drawing
   0   1   2   3   4   5   6   7
 +---+---+---+---+---+---+---+---+
-|     Largest Reference (8+)    |
+|   Required Insert Count (8+)  |
</pre>
<p>s/Required Insert Count/EncodedInsertCount/</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244028769">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; @@ -784,29 +798,29 @@ streams emit the hea=
ders for an HTTP request or response.
 =

 ### Header Data Prefix {#header-prefix}
 =

-Header data is prefixed with two integers, `Largest Reference` and `Base=
 Index`.
+Header data is prefixed with two integers, `Required Insert Count` and `=
Base`.
</pre>
<p>In wire format sections I usually see an explicit textual description =
of all fields.  Consider adding some text similar to <a href=3D"https://g=
ithub.com/quicwg/base-drafts/pull/2250/files#diff-c3ed24528f71fade042cdef=
beadbd7b9R787">https://github.com/quicwg/base-drafts/pull/2250/files#diff=
-c3ed24528f71fade042cdefbeadbd7b9R787</a>.</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244030903">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; @@ -249,18 +250,19 @@ Because QUIC does no=
t guarantee order between data on different streams, a
 header block might reference an entry in the dynamic table that has not =
yet been
 received.
 =

-Each header block contains a Largest Reference ({{header-prefix}}) which=

-identifies the table state necessary for decoding. If the greatest absol=
ute
-index in the dynamic table is less than the value of the Largest Referen=
ce, the
-stream is considered &quot;blocked.&quot;  While blocked, header field d=
ata SHOULD remain
-in the blocked stream&#39;s flow control window.  When the Largest Refer=
ence is
-zero, the frame contains no references to the dynamic table and can alwa=
ys be
-processed immediately. A stream becomes unblocked when the greatest abso=
lute
-index in the dynamic table becomes greater than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the=
 stream.
-If the decoder encounters a header block where the actual largest refere=
nce is
-not equal to the Largest Reference declared in the prefix, it MAY treat =
this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dyna=
mic
</pre>
<p>Maybe "Each header block contains a Required Insert Count, the lowest =
possible value for the Insert Count with which the header block can be de=
coded.  For a header block with no references to the dynamic table, the R=
equired Insert Count is zero."?</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244031965">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt;  =

 n =3D count of entries inserted
 d =3D count of entries dropped
 ~~~~~
 {: title=3D&quot;Example Dynamic Table Indexing - Control Stream&quot;}
 =

 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the=
 Base
-Index at the beginning of the header block (see {{header-prefix}}). The =
Base
-Index is an absolute index. When interpreting the rest of the frame, the=
 entry
-identified by Base Index has a relative index of zero.  The relative ind=
ices of
-entries do not change while interpreting headers on a request or push st=
ream.
+instructions on the encoder stream, relative indices are relative to the=
 Base at
+the beginning of the header block (see {{header-prefix}}). The Base is e=
ncoded
</pre>
<p>"Unlike on the encoder stream, relative indices on push and request st=
reams are relative to the Base at the beginning of the header block (see =
bla).  This allows for the mapping from relative indices to absolute indi=
ces to not be affected by dynamic table insertions on the encoder stream,=
 regardless of what order the decoder processes request stream and encode=
r stream instructions.", and scratch the paragraph "Though new entries...=
" below.  Processing order encompasses on-the-wire reordering as well as =
the parallel processing case, and specifically talking about "mapping" ma=
kes it unnecessary to mention blocking in this sentence.</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244033195">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt; @@ -923,10 +948,9 @@ header field name mat=
ches the header field name of an entry stored in the static
 table or the dynamic table.
 =

 If the entry is in the static table, or in the dynamic table with an abs=
olute
-index less than or equal to Base Index, this representation starts with =
the &#39;01&#39;
-two-bit pattern.  If the entry is in the dynamic table with an absolute =
index
-greater than Base Index, the representation starts with the &#39;0000&#3=
9; four-bit
-pattern.
+index less than the Base, this representation starts with the &#39;01&#3=
9; two-bit
</pre>
<p>Are you changing one-based absolute indexing to zero-based in this PR?=
  Then update 3.2.4 Absolute Indexing, #indexing.  Or maybe do this in a =
separate PR?</p>

<hr>

<p>In <a href=3D"https://github.com/quicwg/base-drafts/pull/2111#discussi=
on_r244033262">draft-ietf-quic-qpack.md</a>:</p>
<pre style=3D'color:#555'>&gt;  =

 ### Literal Header Field With Post-Base Name Reference
 =

-For entries in the dynamic table with an absolute index greater than Bas=
e Index,
+For entries in the dynamic table with an absolute index greater than the=
 Base,
</pre>
<p>If you change "less than or equal to" to "less than" above, maybe "gre=
ate than" here should be changed to "greater than or equal to"?</p>

<p style=3D"font-size:small;-webkit-text-size-adjust:none;color:#666;">&m=
dash;<br />You are receiving this because you are subscribed to this thre=
ad.<br />Reply to this email directly, <a href=3D"https://github.com/quic=
wg/base-drafts/pull/2111#pullrequestreview-187935117">view it on GitHub</=
a>, or <a href=3D"https://github.com/notifications/unsubscribe-auth/AWbkq=
_ZjaCevvklbsU7S9SoWMVdkXhyBks5u88LfgaJpZM4ZMydb">mute the thread</a>.<img=
 src=3D"https://github.com/notifications/beacon/AWbkq_xqNJNWyop5oqD2L8wLo=
I1qd8M0ks5u88LfgaJpZM4ZMydb.gif" height=3D"1" width=3D"1" alt=3D"" /></p>=

<script type=3D"application/json" data-scope=3D"inboxmarkup">{"api_versio=
n":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name"=
:"GitHub"},"entity":{"external_key":"github/quicwg/base-drafts","title":"=
quicwg/base-drafts","subtitle":"GitHub repository","main_image_url":"http=
s://github.githubassets.com/images/email/message_cards/header.png","avata=
r_image_url":"https://github.githubassets.com/images/email/message_cards/=
avatar.png","action":{"name":"Open in GitHub","url":"https://github.com/q=
uicwg/base-drafts"}},"updates":{"snippets":[{"icon":"PERSON","message":"@=
bencebeky requested changes on #2111"}],"action":{"name":"View Pull Reque=
st","url":"https://github.com/quicwg/base-drafts/pull/2111#pullrequestrev=
iew-187935117"}}}</script>
<script type=3D"application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/quicwg/base-drafts/pull/2111#pullrequestrev=
iew-187935117",
"url": "https://github.com/quicwg/base-drafts/pull/2111#pullrequestreview=
-187935117",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>=

----==_mimepart_5c23cb5f7a6de_58633f9e318d45b4365688--

