CHANGELOG revision da710add
12018-04-02
2
3    - [FEATURE] Windows support
4
5    - Reduce stack use -- outgoing packet batch is now allocated on the heap.
6
72018-03-09
8
9    - [OPTIMIZATION] Merge series of ACKs if possible
10
11      Parsed single-range ACK frames (that is the majority of frames) are
12      saved in the connection and their processing is deferred until the
13      connection is ticked.  If several ACKs come in a series between
14      adjacent ticks, we check whether the latest ACK is a strict superset
15      of the saved ACK.  If it is, the older ACK is not processed.
16
17      If ACK frames can be merged, they are merged and only one of them is
18      either processed or saved.
19
20    - [OPTIMIZATION] Speed up ACK verification by simplifying send history.
21
22      Never generate a gap in the sent packet number sequence.  This reduces
23      the send history to a single number instead of potentially a series of
24      packet ranges and thereby speeds up ACK verification.
25
26      By default, detecting a gap in the send history is not fatal: only a
27      single warning is generated per connection.  The connection can continue
28      to operate even if the ACK verification code is not able to detect some
29      inconsistencies.
30
31    - [OPTIMIZATION] Rearrange the lsquic_send_ctl struct
32
33      The first part of struct lsquic_send_ctl now consists of members that
34      are used in lsquic_send_ctl_got_ack() (in the absense of packet loss,
35      which is the normal case).  To speed up reads and writes, we no longer
36      try to save space by using 8- and 16-bit integers.  Use regular integer
37      width for everything.
38
39    - [OPTIMIZATION] Cache size of sent packet.
40
41    - [OPTIMIZATION] Keep track of the largest ACKed in packet_out
42
43      Instead of parsing our own ACK frames when packet has been acked,
44      use the value saved in the packet_out structure when the ACK frame
45      was generated.
46
47    - [OPTIMIZATION] Take RTT sampling conditional out of ACK loop
48
49    - [OPTIMIZATION] ACK processing: only call clock_gettime() if needed
50
51    - [OPTIMIZATION] Several code-level optimizations to ACK processing.
52
53    - Fix: http_client: fix -I flag; switch assert() to abort()
54
552018-02-26
56    - [API Change] lsquic_engine_connect() returns pointer to the connection
57      object.
58    - [API Change] Add lsquic_conn_get_engine() to get engine object from
59      connection object.
60    - [API Change] Add lsquic_conn_status() to query connection status.
61    - [API Change] Add add lsquic_conn_set_ctx().
62    - [API Change] Add new timestamp format, e.g. 2017-03-21 13:43:46.671345
63    - [OPTIMIZATION] Process handshake STREAM frames as soon as packet
64      arrives.
65    - [OPTIMIZATION] Do not compile expensive send controller sanity check
66      by default.
67    - [OPTIMIZATION] Add fast path to gquic_be_gen_reg_pkt_header.
68    - [OPTIMIZATION] Only make squeeze function call if necessary.
69    - [OPTIMIZATION] Speed up Q039 ACK frame parsing.
70    - [OPTIMIZATION] Fit most used elements of packet_out into first 64 bytes.
71    - [OPTIMIZATION] Keep track of scheduled bytes instead of calculating.
72    - [OPTIMIZATION] Prefetch next unacked packet when processing ACK.
73    - [OPTIMIZATION] Leverage fact that ACK ranges and unacked list are.
74      ordered.
75    - [OPTIMIZATION] Reduce function pointer use for STREAM frame generation
76    - Fix: reset incoming streams that arrive after we send GOAWAY.
77    - Fix: delay client on_new_conn() call until connection is fully set up.
78    - Fixes to buffered packets logic: splitting, STREAM frame elision.
79    - Fix: do not dispatch on_write callback if no packets are available.
80    - Fix WINDOW_UPDATE send and resend logic.
81    - Fix STREAM frame extension code.
82    - Fix: Drop unflushed data when stream is reset.
83    - Switch to tracking CWND using bytes rather than packets.
84    - Fix TCP friendly adjustment in cubic.
85    - Fix: do not generate invalid STOP_WAITING frames during high packet
86      loss.
87    - Pacer fixes.
88
892017-12-18
90
91    - Fix: better follow cubic curve after idle period
92    - Fix: add missing parts to outgoing packet splitting code
93    - Fix: compilation using gcc 4.8.4
94
952017-10-31
96
97    - Add APIs.txt -- describes LSQUIC APIs
98
992017-10-31
100
101    - [API Change] Sendfile-like functionality is gone.  The stream no
102      longer opens files and deals with file descriptors.  (Among other
103      things, this makes the code more portable.)  Three writing functions
104      are provided:
105
106        lsquic_stream_write
107        lsquic_stream_writev
108        lsquic_stream_writef    (NEW)
109
110      lsquic_stream_writef() is given an abstract reader that has function
111      pointers for size() and read() functions which the user can implement.
112      This is the most flexible way.  lsquic_stream_write() and
113      lsquic_stream_writev() are now both implemented as wrappers around
114      lsquic_stream_writef().
115
116    - [OPTIMIZATION] When writing to stream, be it within or without the
117      on_write() callback, place data directly into packet buffer,
118      bypassing auxiliary data structures.  This reduces amount of memory
119      required, for the amount of data that can be written is limited
120      by the congestion window.
121
122      To support writes outside the on_write() callback, we keep N
123      outgoing packet buffers per connection which can be written to
124      by any stream.  One half of these are reserved for the highest
125      priority stream(s), the other half for all other streams.  This way,
126      low-priority streams cannot write instead of high-priority streams
127      and, on the other hand, low-priority streams get a chance to send
128      their packets out.
129
130      The algorithm is as follows:
131
132      - When user writes to stream outside of the callback:
133        - If this is the highest priority stream, place it onto the
134          reserved N/2 queue or fail.
135            (The actual size of this queue is dynamic -- MAX(N/2, CWND) --
136             rather than N/2, allowing high-priority streams to write as
137             much as can be sent.)
138        - If the stream is not the highest priority, try to place the
139          data onto the reserved N/2 queue or fail.
140      - When tick occurs *and* more packets can be scheduled:
141        - Transfer packets from the high N/2 queue to the scheduled
142          queue.
143        - If more scheduling is allowed:
144          - Call on_write callbacks for highest-priority streams,
145            placing resulting packets directly onto the scheduled queue.
146        - If more scheduling is allowed:
147          - Transfer packets from the low N/2 queue to the scheduled
148            queue.
149        - If more scheduling is allowed:
150          - Call on_write callbacks for non-highest-priority streams,
151            placing resulting packets directly onto the scheduled queue
152
153      The number N is currently 20, but it could be varied based on
154      resource usage.
155
156    - If stream is created due to incoming headers, make headers readable
157      from on_new.
158
159    - Outgoing packets are no longer marked non-writeable to prevent placing
160      more than one STREAM frame from the same stream into a single packet.
161      This property is maintained via code flow and an explicit check.
162      Packets for stream data are allocated using a special function.
163
164    - STREAM frame elision is cheaper, as we only perform it if a reset
165      stream has outgoing packets referencing it.
166
167    - lsquic_packet_out_t is smaller, as stream_rec elements are now
168      inside a union.
169
1702017-10-12
171
172    - Do not send RST_STREAM when stream is closed for reading
173    - Raise maximum header size from 4K to 64K
174    - Check header name and value lengths against maximum imposed by HPACK
175    - Fix NULL dereference in stream flow controller
176
1772017-10-09
178
179    - Hide handshake implementation behind a set of function pointers
180    - Use monotonically increasing clock
181    - Make sure that retx delay is not larger than the max of 60 seconds
182
1832017-09-29
184
185    - A few fixes to code and README
186
1872017-09-28
188
189    - Add support for Q041; drop support for Q040
190
1912017-09-27
192
193    - Fix CMakeLists.txt: BoringSSL include and lib was mixed up
194
1952017-09-26
196
197    - Add support for Mac OS
198    - Add support for Raspberry Pi
199    - Fix BoringSSL compilation: include <openssl/hmac.h> explicitly
200
2012017-09-22
202
203    - Initial release
204