mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Latest changes
- Add support for Q041; drop support for Q040
This commit is contained in:
parent
fc214ce40d
commit
1b97e4af1f
22 changed files with 87 additions and 94 deletions
|
@ -1,3 +1,7 @@
|
|||
2017-09-28
|
||||
|
||||
- Add support for Q041; drop support for Q040
|
||||
|
||||
2017-09-27
|
||||
|
||||
- Fix CMakeLists.txt: BoringSSL include and lib was mixed up
|
||||
|
|
|
@ -11,7 +11,7 @@ our own products: LiteSpeed Web Server and ADC. We think it is free of
|
|||
major problems. Nevertheless, do not hesitate to report bugs back to us.
|
||||
Even better, send us fixes and improvements!
|
||||
|
||||
Currently supported QUIC versions are Q035, Q037, Q038, Q039, and Q040.
|
||||
Currently supported QUIC versions are Q035, Q037, Q038, Q039, and Q041.
|
||||
Support for newer versions will be added soon after they are released.
|
||||
The version(s) specified by IETF QUIC WG will be added once the IETF
|
||||
version of the protocol settles down a little.
|
||||
|
|
|
@ -335,8 +335,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||
<li>LSQVER_039
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">lsquic.h</a>
|
||||
</li>
|
||||
<li>LSQVER_040
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">lsquic.h</a>
|
||||
<li>LSQVER_041
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">lsquic.h</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div><!-- contents -->
|
||||
|
|
|
@ -118,8 +118,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||
<li>LSQVER_039
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">lsquic.h</a>
|
||||
</li>
|
||||
<li>LSQVER_040
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">lsquic.h</a>
|
||||
<li>LSQVER_041
|
||||
: <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">lsquic.h</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div><!-- contents -->
|
||||
|
|
|
@ -142,7 +142,7 @@ Macros</h2></td></tr>
|
|||
<tr class="memitem:a0420e68d347462080cf2e583b77d61a0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="lsquic_8h.html#a0420e68d347462080cf2e583b77d61a0">LSQUIC_SUPPORTED_VERSIONS</a></td></tr>
|
||||
<tr class="separator:a0420e68d347462080cf2e583b77d61a0"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a9c4ad08207bd7865f40eeb18a23e04ed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9c4ad08207bd7865f40eeb18a23e04ed"></a>
|
||||
#define </td><td class="memItemRight" valign="bottom"><b>LSQUIC_EXPERIMENTAL_VERSIONS</b>   ((1 << <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">LSQVER_040</a>))</td></tr>
|
||||
#define </td><td class="memItemRight" valign="bottom"><b>LSQUIC_EXPERIMENTAL_VERSIONS</b>   ((1 << <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">LSQVER_041</a>))</td></tr>
|
||||
<tr class="separator:a9c4ad08207bd7865f40eeb18a23e04ed"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a6fd9104d1ffa8c391dede0a714a5919b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="lsquic_8h.html#a6fd9104d1ffa8c391dede0a714a5919b">LSQUIC_MIN_FCW</a>   (16 * 1024)</td></tr>
|
||||
<tr class="separator:a6fd9104d1ffa8c391dede0a714a5919b"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
|
@ -232,7 +232,7 @@ Enumerations</h2></td></tr>
|
|||
<a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966">LSQVER_038</a>,
|
||||
<a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">LSQVER_039</a>,
|
||||
<br />
|
||||
  <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">LSQVER_040</a>,
|
||||
  <a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">LSQVER_041</a>,
|
||||
<b>N_LSQVER</b>
|
||||
<br />
|
||||
}</td></tr>
|
||||
|
@ -599,11 +599,11 @@ int </td><td class="memItemRight" valign="bottom"><b>lsquic_conn_get_sockad
|
|||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
<b>Value:</b><div class="fragment"><div class="line">((1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba1956abef5d785f45310599e4fcd39c32">LSQVER_035</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7">LSQVER_037</a>) | \</div><div class="line"> (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966">LSQVER_038</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">LSQVER_039</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">LSQVER_040</a>))</div><div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7">LSQVER_037</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:54</div></div>
|
||||
<div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f">LSQVER_040</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:72</div></div>
|
||||
<b>Value:</b><div class="fragment"><div class="line">((1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba1956abef5d785f45310599e4fcd39c32">LSQVER_035</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7">LSQVER_037</a>) | \</div><div class="line"> (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966">LSQVER_038</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">LSQVER_039</a>) | (1 << <a class="code" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">LSQVER_041</a>))</div><div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7">LSQVER_037</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:54</div></div>
|
||||
<div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3">LSQVER_039</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:67</div></div>
|
||||
<div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dba1956abef5d785f45310599e4fcd39c32"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba1956abef5d785f45310599e4fcd39c32">LSQVER_035</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:46</div></div>
|
||||
<div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966">LSQVER_038</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:60</div></div>
|
||||
<div class="ttc" id="lsquic_8h_html_a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3"><div class="ttname"><a href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3">LSQVER_041</a></div><div class="ttdef"><b>Definition:</b> lsquic.h:72</div></div>
|
||||
</div><!-- fragment --><p>We currently support versions 35, 37, 38, 39, and 40. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4db">lsquic_version</a> </dd></dl>
|
||||
|
||||
</div>
|
||||
|
@ -678,8 +678,8 @@ int </td><td class="memItemRight" valign="bottom"><b>lsquic_conn_get_sockad
|
|||
<tr><td class="fieldname"><a class="anchor" id="a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3"></a>LSQVER_039 </td><td class="fielddoc">
|
||||
<p>Q039. Switch to big endian. Do not ack acks. Send connection level WINDOW_UPDATE frame every 20 sent packets which do not contain retransmittable frames. </p>
|
||||
</td></tr>
|
||||
<tr><td class="fieldname"><a class="anchor" id="a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f"></a>LSQVER_040 </td><td class="fielddoc">
|
||||
<p>Q040. RST_STREAM, ACK and STREAM frames match IETF format. </p>
|
||||
<tr><td class="fieldname"><a class="anchor" id="a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3"></a>LSQVER_041 </td><td class="fielddoc">
|
||||
<p>Q041. RST_STREAM, ACK and STREAM frames match IETF format. </p>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -95,8 +95,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||
Include dependency graph for lsquic_types.h:</div>
|
||||
<div class="dyncontent">
|
||||
<div class="center"><img src="lsquic__types_8h__incl.png" border="0" usemap="#include_2lsquic__types_8h" alt=""/></div>
|
||||
<map name="include_2lsquic__types_8h" id="include_2lsquic__types_8h">
|
||||
</map>
|
||||
</div>
|
||||
</div><div class="textblock"><div class="dynheader">
|
||||
This graph shows which files directly or indirectly include this file:</div>
|
||||
|
|
|
@ -89,5 +89,5 @@ var searchData=
|
|||
['lsqver_5f037',['LSQVER_037',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7',1,'lsquic.h']]],
|
||||
['lsqver_5f038',['LSQVER_038',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966',1,'lsquic.h']]],
|
||||
['lsqver_5f039',['LSQVER_039',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3',1,'lsquic.h']]],
|
||||
['lsqver_5f040',['LSQVER_040',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f',1,'lsquic.h']]]
|
||||
['lsqver_5f041',['LSQVER_041',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3',1,'lsquic.h']]]
|
||||
];
|
||||
|
|
|
@ -9,5 +9,5 @@ var searchData=
|
|||
['lsqver_5f037',['LSQVER_037',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba5c2aa78b22ea462ae839566e19a87ea7',1,'lsquic.h']]],
|
||||
['lsqver_5f038',['LSQVER_038',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dba2d39809298e0c7866b21fc7932504966',1,'lsquic.h']]],
|
||||
['lsqver_5f039',['LSQVER_039',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbaa9b8bed8ca169e8a3762308cbf0f3af3',1,'lsquic.h']]],
|
||||
['lsqver_5f040',['LSQVER_040',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac17f226a6a4c61377a5e50710d5ef12f',1,'lsquic.h']]]
|
||||
['lsqver_5f041',['LSQVER_041',['../lsquic_8h.html#a2633ae9ee8d564f4c499f6eb0913d4dbac673a00564784af03b3b9cb747ed8af3',1,'lsquic.h']]]
|
||||
];
|
||||
|
|
|
@ -67,9 +67,9 @@ enum lsquic_version
|
|||
LSQVER_039,
|
||||
|
||||
/**
|
||||
* Q040. RST_STREAM, ACK and STREAM frames match IETF format.
|
||||
* Q041. RST_STREAM, ACK and STREAM frames match IETF format.
|
||||
*/
|
||||
LSQVER_040,
|
||||
LSQVER_041,
|
||||
|
||||
N_LSQVER
|
||||
};
|
||||
|
@ -79,9 +79,9 @@ enum lsquic_version
|
|||
* @see lsquic_version
|
||||
*/
|
||||
#define LSQUIC_SUPPORTED_VERSIONS ((1 << LSQVER_035) | (1 << LSQVER_037) | \
|
||||
(1 << LSQVER_038) | (1 << LSQVER_039) | (1 << LSQVER_040))
|
||||
(1 << LSQVER_038) | (1 << LSQVER_039) | (1 << LSQVER_041))
|
||||
|
||||
#define LSQUIC_EXPERIMENTAL_VERSIONS ((1 << LSQVER_040))
|
||||
#define LSQUIC_EXPERIMENTAL_VERSIONS ((1 << LSQVER_041))
|
||||
|
||||
/**
|
||||
* @struct lsquic_stream_if
|
||||
|
|
|
@ -8,7 +8,7 @@ SET(lsquic_STAT_SRCS
|
|||
lsquic_parse_gquic_common.c
|
||||
lsquic_parse_gquic_le.c
|
||||
lsquic_parse_gquic_be.c
|
||||
lsquic_parse_gquic_Q040.c
|
||||
lsquic_parse_gquic_Q041.c
|
||||
lsquic_packet_in.c
|
||||
lsquic_packet_out.c
|
||||
lsquic_crypto.c
|
||||
|
|
|
@ -20,11 +20,6 @@
|
|||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#ifndef NDEBUG
|
||||
#include <sys/types.h>
|
||||
#include <regex.h> /* For code that loses packets */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#include "lsquic.h"
|
||||
|
|
|
@ -158,7 +158,7 @@ struct parse_funcs
|
|||
extern const struct parse_funcs lsquic_parse_funcs_gquic_le;
|
||||
/* Q039 and later are big-endian: */
|
||||
extern const struct parse_funcs lsquic_parse_funcs_gquic_Q039;
|
||||
extern const struct parse_funcs lsquic_parse_funcs_gquic_Q040;
|
||||
extern const struct parse_funcs lsquic_parse_funcs_gquic_Q041;
|
||||
|
||||
#define select_pf_by_ver(ver) ( \
|
||||
((1 << (ver)) & ((1 << LSQVER_035) | \
|
||||
|
@ -166,7 +166,7 @@ extern const struct parse_funcs lsquic_parse_funcs_gquic_Q040;
|
|||
? &lsquic_parse_funcs_gquic_le : \
|
||||
((1 << (ver)) & (1 << LSQVER_039)) \
|
||||
? &lsquic_parse_funcs_gquic_Q039 \
|
||||
: &lsquic_parse_funcs_gquic_Q040)
|
||||
: &lsquic_parse_funcs_gquic_Q041)
|
||||
|
||||
/* This function is QUIC-version independent */
|
||||
int
|
||||
|
@ -177,7 +177,7 @@ enum QUIC_FRAME_TYPE
|
|||
parse_frame_type_gquic_Q035_thru_Q039 (unsigned char first_byte);
|
||||
|
||||
enum QUIC_FRAME_TYPE
|
||||
parse_frame_type_gquic_Q040 (unsigned char first_byte);
|
||||
parse_frame_type_gquic_Q041 (unsigned char first_byte);
|
||||
|
||||
unsigned
|
||||
parse_stream_frame_header_sz_gquic (unsigned char type);
|
||||
|
|
|
@ -101,12 +101,6 @@ gquic_ietf_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz,
|
|||
|
||||
stream_frame->data_frame.df_fin = !!(type & 0x20);
|
||||
|
||||
if (data_len)
|
||||
{
|
||||
READ_UINT(stream_frame->data_frame.df_size, 16, p, data_len);
|
||||
p += data_len;
|
||||
}
|
||||
|
||||
READ_UINT(stream_frame->stream_id, 32, p, stream_id_len);
|
||||
p += stream_id_len;
|
||||
|
||||
|
@ -115,6 +109,8 @@ gquic_ietf_parse_stream_frame (const unsigned char *buf, size_t rem_packet_sz,
|
|||
|
||||
if (data_len)
|
||||
{
|
||||
READ_UINT(stream_frame->data_frame.df_size, 16, p, data_len);
|
||||
p += data_len;
|
||||
CHECK_SPACE(stream_frame->data_frame.df_size, p, pend);
|
||||
stream_frame->data_frame.df_data = p;
|
||||
p += stream_frame->data_frame.df_size;
|
||||
|
@ -198,8 +194,6 @@ gquic_ietf_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream
|
|||
CHECK_SPACE(1 + olen + slen + dlen +
|
||||
+ 1 /* We need to write at least 1 byte */, buf, buf + buf_len);
|
||||
|
||||
p += dlen; /* Save room for data length */
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
stream_id = bswap_32(stream_id);
|
||||
#endif
|
||||
|
@ -213,7 +207,7 @@ gquic_ietf_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream
|
|||
p += olen;
|
||||
|
||||
/* Read as much as we can */
|
||||
nr = gsf_read(stream, p, n_avail, &fin);
|
||||
nr = gsf_read(stream, p + dlen, n_avail, &fin);
|
||||
assert(nr != 0);
|
||||
|
||||
if (dlen)
|
||||
|
@ -222,17 +216,15 @@ gquic_ietf_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream
|
|||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
nr_copy = bswap_16(nr_copy);
|
||||
#endif
|
||||
memcpy(p - slen - olen - 2, &nr_copy, 2);
|
||||
memcpy(p, &nr_copy, 2);
|
||||
}
|
||||
|
||||
p += nr;
|
||||
p += dlen + nr;
|
||||
}
|
||||
else
|
||||
{
|
||||
dlen = 2;
|
||||
CHECK_SPACE(1 + slen + olen + 2, buf, buf + buf_len);
|
||||
memset(p, 0, 2);
|
||||
p += 2;
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
stream_id = bswap_32(stream_id);
|
||||
#endif
|
||||
|
@ -243,6 +235,8 @@ gquic_ietf_gen_stream_frame (unsigned char *buf, size_t buf_len, uint32_t stream
|
|||
#endif
|
||||
memcpy(p, (unsigned char *) &offset + 8 - olen, olen);
|
||||
p += olen;
|
||||
memset(p, 0, 2);
|
||||
p += 2;
|
||||
}
|
||||
|
||||
/* Convert slen to bit representation: 0 - 3: */
|
||||
|
@ -279,7 +273,7 @@ gquic_ietf_parse_ack_high (const unsigned char *buf, size_t buf_len)
|
|||
type = buf[0];
|
||||
largest_obs_len = twobit_to_1248((type >> 2) & 3);
|
||||
n_blocks_len = !!(type & 0x10);
|
||||
assert(parse_frame_type_gquic_Q040(type) == QUIC_FRAME_ACK);
|
||||
assert(parse_frame_type_gquic_Q041(type) == QUIC_FRAME_ACK);
|
||||
assert(buf_len >= 1 + n_blocks_len + 1 + largest_obs_len);
|
||||
READ_UINT(packno, 64, buf + 1 + n_blocks_len + 1, largest_obs_len);
|
||||
return packno;
|
||||
|
@ -540,7 +534,7 @@ gquic_ietf_gen_ack_frame (unsigned char *outbuf, size_t outbuf_sz,
|
|||
}
|
||||
|
||||
|
||||
const struct parse_funcs lsquic_parse_funcs_gquic_Q040 =
|
||||
const struct parse_funcs lsquic_parse_funcs_gquic_Q041 =
|
||||
{
|
||||
.pf_gen_ver_nego_pkt = gquic_be_gen_ver_nego_pkt,
|
||||
.pf_gen_reg_pkt_header = gquic_be_gen_reg_pkt_header,
|
||||
|
@ -570,5 +564,5 @@ const struct parse_funcs lsquic_parse_funcs_gquic_Q040 =
|
|||
.pf_write_float_time16 = gquic_be_write_float_time16,
|
||||
.pf_read_float_time16 = gquic_be_read_float_time16,
|
||||
#endif
|
||||
.pf_parse_frame_type = parse_frame_type_gquic_Q040,
|
||||
.pf_parse_frame_type = parse_frame_type_gquic_Q041,
|
||||
};
|
|
@ -389,7 +389,7 @@ static const enum QUIC_FRAME_TYPE byte2frame_type_Q035_thru_Q039[0x100] =
|
|||
};
|
||||
|
||||
|
||||
static const enum QUIC_FRAME_TYPE byte2frame_type_Q040[0x100] =
|
||||
static const enum QUIC_FRAME_TYPE byte2frame_type_Q041[0x100] =
|
||||
{
|
||||
[0x00] = QUIC_FRAME_PADDING,
|
||||
[0x01] = QUIC_FRAME_RST_STREAM,
|
||||
|
@ -658,9 +658,9 @@ parse_frame_type_gquic_Q035_thru_Q039 (unsigned char b)
|
|||
|
||||
|
||||
enum QUIC_FRAME_TYPE
|
||||
parse_frame_type_gquic_Q040 (unsigned char b)
|
||||
parse_frame_type_gquic_Q041 (unsigned char b)
|
||||
{
|
||||
return byte2frame_type_Q040[b];
|
||||
return byte2frame_type_Q041[b];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ static const unsigned char version_tags[N_LSQVER][4] =
|
|||
[LSQVER_037] = { 'Q', '0', '3', '7', },
|
||||
[LSQVER_038] = { 'Q', '0', '3', '8', },
|
||||
[LSQVER_039] = { 'Q', '0', '3', '9', },
|
||||
[LSQVER_040] = { 'Q', '0', '4', '0', },
|
||||
[LSQVER_041] = { 'Q', '0', '4', '1', },
|
||||
};
|
||||
|
||||
|
||||
|
@ -61,7 +61,7 @@ const char *const lsquic_ver2str[N_LSQVER] = {
|
|||
[LSQVER_037] = "Q037",
|
||||
[LSQVER_038] = "Q038",
|
||||
[LSQVER_039] = "Q039",
|
||||
[LSQVER_040] = "Q040",
|
||||
[LSQVER_041] = "Q041",
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -916,9 +916,9 @@ set_engine_option (struct lsquic_engine_settings *settings,
|
|||
settings->es_versions |= 1 << LSQVER_039;
|
||||
return 0;
|
||||
}
|
||||
if (0 == strcmp(val, "Q040"))
|
||||
if (0 == strcmp(val, "Q041"))
|
||||
{
|
||||
settings->es_versions |= 1 << LSQVER_040;
|
||||
settings->es_versions |= 1 << LSQVER_041;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include "lsquic_logger.h"
|
||||
#include "lsquic.h"
|
||||
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_040);
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_041);
|
||||
|
||||
static void
|
||||
test1 (void) /* Inverse of quic_framer_test.cc -- NewAckFrameOneAckBlock */
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "lsquic_util.h"
|
||||
#include "lsquic.h"
|
||||
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_040);
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_041);
|
||||
|
||||
|
||||
static lsquic_packno_t
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "lsquic_alarmset.h"
|
||||
#include "lsquic_parse.h"
|
||||
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_040);
|
||||
static const struct parse_funcs *const pf = select_pf_by_ver(LSQVER_041);
|
||||
|
||||
|
||||
/* The test is both for generation and parsing: */
|
||||
|
|
|
@ -506,7 +506,7 @@ static const struct test tests[] = {
|
|||
* IETF:
|
||||
*/
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 1, },
|
||||
.offset = 0x0807060504030201UL,
|
||||
.stream_id = 0x210,
|
||||
|
@ -517,9 +517,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 1 << 3 | 3 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 8 + 2 + 10,
|
||||
|
@ -527,7 +527,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0x0807060504030201UL,
|
||||
.stream_id = 0x210,
|
||||
|
@ -538,9 +538,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 1 << 3 | 3 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 8 + 2 + 10,
|
||||
|
@ -548,7 +548,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 1, 0, },
|
||||
.offset = 0x0807060504030201UL,
|
||||
.stream_id = 0x210,
|
||||
|
@ -559,9 +559,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 1 << 3 | 3 << 1 | 1,
|
||||
0x00, 0x00, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x00, 0x00, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 8 + 2,
|
||||
|
@ -569,7 +569,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 1, 0, },
|
||||
.offset = 0x0807060504030201UL,
|
||||
.stream_id = 0x21,
|
||||
|
@ -580,9 +580,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 0 << 3 | 3 << 1 | 1,
|
||||
0x00, 0x00, /* Data length */
|
||||
0x21, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x00, 0x00, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 1 + 8 + 2,
|
||||
|
@ -590,7 +590,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0x77,
|
||||
.stream_id = 0x210,
|
||||
|
@ -601,9 +601,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 1 << 3 | 1 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x00, 0x77, /* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 2 + 2 + 10,
|
||||
|
@ -611,7 +611,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0x0,
|
||||
.stream_id = 0x210,
|
||||
|
@ -622,9 +622,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 1 << 3 | 0 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
/* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 0 + 2 + 10,
|
||||
|
@ -632,7 +632,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 1, },
|
||||
.offset = 0x0,
|
||||
.stream_id = 0x210,
|
||||
|
@ -643,9 +643,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 1 << 3 | 0 << 1 | 1,
|
||||
0x00, 0x01, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
/* Offset */
|
||||
0x00, 0x01, /* Data length */
|
||||
'0',
|
||||
},
|
||||
.len = 1 + 2 + 0 + 2 + 1,
|
||||
|
@ -653,7 +653,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0xFFFFFF,
|
||||
.stream_id = 0x210,
|
||||
|
@ -664,9 +664,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 1 << 3 | 2 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x00, 0xFF, 0xFF, 0xFF, /* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 4 + 2 + 10,
|
||||
|
@ -674,7 +674,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0xFFFFFFFFULL + 1,
|
||||
.stream_id = 0x210,
|
||||
|
@ -685,9 +685,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 1 << 3 | 3 << 1 | 1,
|
||||
0x00, 0x0A, /* Data length */
|
||||
0x02, 0x10, /* Stream ID */
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, /* Offset */
|
||||
0x00, 0x0A, /* Data length */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
},
|
||||
.len = 1 + 2 + 8 + 2 + 10,
|
||||
|
@ -695,7 +695,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 0, 0, },
|
||||
.offset = 0xFFFFFFFFULL + 1,
|
||||
.stream_id = 0x210,
|
||||
|
@ -715,7 +715,7 @@ static const struct test tests[] = {
|
|||
},
|
||||
|
||||
{ .lineno = __LINE__,
|
||||
.pf = select_pf_by_ver(LSQVER_040),
|
||||
.pf = select_pf_by_ver(LSQVER_041),
|
||||
.fin = { 1, 0, },
|
||||
.offset = 0xB4,
|
||||
.stream_id = 0x01,
|
||||
|
@ -726,9 +726,9 @@ static const struct test tests[] = {
|
|||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 0 << 3 | 1 << 1 | 1,
|
||||
0x00, 0x00, /* Data length */
|
||||
0x01, /* Stream ID */
|
||||
0x00, 0xB4, /* Offset */
|
||||
0x00, 0x00, /* Data length */
|
||||
},
|
||||
.len = 6,
|
||||
.min_sz = 6,
|
||||
|
|
|
@ -444,13 +444,13 @@ static const struct test tests[] = {
|
|||
*/
|
||||
{ "Balls to the wall: every possible bit is set",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 3 << 3 | 3 << 1 | 1,
|
||||
0x01, 0xC4, /* Data length */
|
||||
0x00, 0x00, 0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x01, 0xC4, /* Data length */
|
||||
},
|
||||
1 + 4 + 8 + 2,
|
||||
0x200,
|
||||
|
@ -464,13 +464,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Balls to the wall #2: every possible bit is set, except FIN",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 3 << 3 | 3 << 1 | 1,
|
||||
0x01, 0xC4, /* Data length */
|
||||
0x00, 0x00, 0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x01, 0xC4, /* Data length */
|
||||
},
|
||||
1 + 4 + 8 + 2,
|
||||
0x200,
|
||||
|
@ -484,12 +484,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Data length is zero",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 3 << 3 | 3 << 1 | 0,
|
||||
0x00, 0x00, 0x02, 0x10, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0xC4, 0x01, /* Data length: note this does not matter */
|
||||
},
|
||||
1 + 4 + 8 + 0,
|
||||
0x200,
|
||||
|
@ -503,13 +504,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Stream ID length is 1",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 0 << 3 | 3 << 1 | 1,
|
||||
0x01, 0xC4, /* Data length */
|
||||
0xF0, /* Stream ID */
|
||||
0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, /* Offset */
|
||||
0x01, 0xC4, /* Data length */
|
||||
},
|
||||
1 + 1 + 8 + 2,
|
||||
0x200,
|
||||
|
@ -523,12 +524,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "All bits are zero save offset length",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 0 << 3 | 1 << 1 | 0,
|
||||
0xF0, /* Stream ID */
|
||||
0x02, 0x55, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Offset */
|
||||
0xC4, 0x01, /* Data length */
|
||||
},
|
||||
1 + 1 + 2 + 0,
|
||||
0x200,
|
||||
|
@ -542,7 +544,7 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Sanity check: either FIN must be set or data length is not zero #1",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 0 << 3 | 1 << 1 | 0,
|
||||
|
@ -564,13 +566,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Sanity check: either FIN must be set or data length is not zero #2",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 0 << 3 | 1 << 1 | 1,
|
||||
0x00, 0x00,
|
||||
0xF0, /* Stream ID */
|
||||
0x02, 0x55, /* Offset */
|
||||
0x00, 0x00,
|
||||
},
|
||||
1 + 1 + 2 + 2,
|
||||
200,
|
||||
|
@ -584,13 +586,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Sanity check: either FIN must be set or data length is not zero #3",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 1 << 5 | 0 << 3 | 1 << 1 | 1,
|
||||
0x00, 0x00,
|
||||
0xF0, /* Stream ID */
|
||||
0x02, 0x55, /* Offset */
|
||||
0x00, 0x00,
|
||||
},
|
||||
1 + 1 + 2 + 2,
|
||||
200,
|
||||
|
@ -604,13 +606,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Check data bounds #1",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 0 << 3 | 1 << 1 | 1,
|
||||
0x01, 0xFA, /* Data length */
|
||||
0xF0, /* Stream ID */
|
||||
0x02, 0x55, /* Offset */
|
||||
0x01, 0xFA, /* Data length */
|
||||
},
|
||||
1 + 1 + 2 + 2,
|
||||
0x200,
|
||||
|
@ -624,13 +626,13 @@ static const struct test tests[] = {
|
|||
|
||||
{ "Check data bounds #2",
|
||||
__LINE__,
|
||||
select_pf_by_ver(LSQVER_040),
|
||||
select_pf_by_ver(LSQVER_041),
|
||||
/* 11 F SS OO D 11FSSOOD */
|
||||
/* TYPE FIN SLEN OLEN DLEN */
|
||||
{ 0xC0 | 0 << 5 | 0 << 3 | 1 << 1 | 1,
|
||||
0x01, 0xFB, /* <--- One byte too many */
|
||||
0xF0, /* Stream ID */
|
||||
0x02, 0x55, /* Offset */
|
||||
0x01, 0xFB, /* <--- One byte too many */
|
||||
},
|
||||
1 + 1 + 2 + 2,
|
||||
0x200,
|
||||
|
|
Loading…
Reference in a new issue