diff src/event/ngx_event_quic_transport.h @ 8333:167d32476737 quic

Crypto buffer frames reordering. If offset in CRYPTO frame doesn't match expected, following actions are taken: a) Duplicate frames or frames within [0...current offset] are ignored b) New data from intersecting ranges (starts before current_offset, ends after) is consumed c) "Future" frames are stored in a sorted queue (min offset .. max offset) Once a frame is consumed, current offset is updated and the queue is inspected: we iterate the queue until the gap is found and act as described above for each frame. The amount of data in buffered frames is limited by corresponding macro. The CRYPTO and STREAM frame structures are now compatible: they share the same set of initial fields. This allows to have code that deals with both of this frames. The ordering layer now processes the frame with offset and invokes the handler when it can organise an ordered stream of data.
author Vladimir Homutov <vl@nginx.com>
date Tue, 14 Apr 2020 12:16:25 +0300
parents 1cdd53532309
children 76e8ec502c69
line wrap: on
line diff
--- a/src/event/ngx_event_quic_transport.h
+++ b/src/event/ngx_event_quic_transport.h
@@ -111,13 +111,6 @@ typedef struct {
 
 
 typedef struct {
-    uint64_t                                    offset;
-    uint64_t                                    len;
-    u_char                                     *data;
-} ngx_quic_crypto_frame_t;
-
-
-typedef struct {
     uint64_t                                    seqnum;
     uint64_t                                    retire;
     uint8_t                                     len;
@@ -126,15 +119,31 @@ typedef struct {
 } ngx_quic_new_conn_id_frame_t;
 
 
+/*
+ * common layout for CRYPTO and STREAM frames;
+ * conceptually, CRYPTO frame is also a stream
+ * frame lacking some properties
+ */
 typedef struct {
+    uint64_t                                    offset;
+    uint64_t                                    length;
+    u_char                                     *data;
+} ngx_quic_ordered_frame_t;
+
+typedef ngx_quic_ordered_frame_t  ngx_quic_crypto_frame_t;
+
+
+typedef struct {
+    /* initial fields same as in ngx_quic_ordered_frame_t */
+    uint64_t                                    offset;
+    uint64_t                                    length;
+    u_char                                     *data;
+
     uint8_t                                     type;
     uint64_t                                    stream_id;
-    uint64_t                                    offset;
-    uint64_t                                    length;
     unsigned                                    off:1;
     unsigned                                    len:1;
     unsigned                                    fin:1;
-    u_char                                     *data;
 } ngx_quic_stream_frame_t;
 
 
@@ -218,6 +227,7 @@ struct ngx_quic_frame_s {
     union {
         ngx_quic_ack_frame_t                    ack;
         ngx_quic_crypto_frame_t                 crypto;
+        ngx_quic_ordered_frame_t                ord;
         ngx_quic_new_conn_id_frame_t            ncid;
         ngx_quic_stream_frame_t                 stream;
         ngx_quic_max_data_frame_t               max_data;