]> git.kaiwu.me - nginx.git/commitdiff
QUIC: ngx_quic_copy_buffer() function.
authorRoman Arutyunyan <arut@nginx.com>
Tue, 31 Jan 2023 10:12:18 +0000 (14:12 +0400)
committerRoman Arutyunyan <arut@nginx.com>
Tue, 31 Jan 2023 10:12:18 +0000 (14:12 +0400)
The function copies passed data to QUIC buffer chain and returns it.
The chain can be used in ngx_quic_frame_t data field.

src/event/quic/ngx_event_quic_frames.c
src/event/quic/ngx_event_quic_frames.h
src/event/quic/ngx_event_quic_ssl.c

index 9a1a6afe52881f73a8d8a87ba0e540b015e97f30..9fcc97e02716bc2a9127d551d5d473f5258d4c9c 100644 (file)
@@ -386,6 +386,39 @@ ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len)
 }
 
 
+ngx_chain_t *
+ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data, size_t len)
+{
+    ngx_buf_t          buf;
+    ngx_chain_t        cl, *out;
+    ngx_quic_buffer_t  qb;
+
+    ngx_memzero(&buf, sizeof(ngx_buf_t));
+
+    buf.pos = data;
+    buf.last = buf.pos + len;
+    buf.temporary = 1;
+
+    cl.buf = &buf;
+    cl.next = NULL;
+
+    ngx_memzero(&qb, sizeof(ngx_quic_buffer_t));
+
+    if (ngx_quic_write_buffer(c, &qb, &cl, len, 0) == NGX_CHAIN_ERROR) {
+        return NGX_CHAIN_ERROR;
+    }
+
+    out = ngx_quic_read_buffer(c, &qb, len);
+    if (out == NGX_CHAIN_ERROR) {
+        return NGX_CHAIN_ERROR;
+    }
+
+    ngx_quic_free_buffer(c, &qb);
+
+    return out;
+}
+
+
 ngx_chain_t *
 ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit)
 {
index fbff68e5d5f37c81e8b97dacb63278699b0df079..2d55af9de8ecc53f4374245166ceab34a903ff9f 100644 (file)
@@ -26,6 +26,8 @@ ngx_int_t ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f,
 ngx_chain_t *ngx_quic_alloc_chain(ngx_connection_t *c);
 void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in);
 
+ngx_chain_t *ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data,
+    size_t len);
 ngx_chain_t *ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
     uint64_t limit);
 ngx_chain_t *ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
index 0c982bc62d497c7b8d4fc45f6d055eccd81cd984..b3059cb4b6494e6b60dc8ff0b172a0fa1bb24a8f 100644 (file)
@@ -160,13 +160,11 @@ ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
 {
     u_char                 *p, *end;
     size_t                  client_params_len;
-    ngx_buf_t               buf;
-    ngx_chain_t            *out, cl;
+    ngx_chain_t            *out;
     const uint8_t          *client_params;
     ngx_quic_tp_t           ctp;
     ngx_quic_frame_t       *frame;
     ngx_connection_t       *c;
-    ngx_quic_buffer_t       qb;
     ngx_quic_send_ctx_t    *ctx;
     ngx_quic_connection_t  *qc;
 #if defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
@@ -243,28 +241,11 @@ ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
 
     ctx = ngx_quic_get_send_ctx(qc, level);
 
-    ngx_memzero(&buf, sizeof(ngx_buf_t));
-
-    buf.pos = (u_char *) data;
-    buf.last = buf.pos + len;
-    buf.temporary = 1;
-
-    cl.buf = &buf;
-    cl.next = NULL;
-
-    ngx_memzero(&qb, sizeof(ngx_quic_buffer_t));
-
-    if (ngx_quic_write_buffer(c, &qb, &cl, len, 0) == NGX_CHAIN_ERROR) {
-        return 0;
-    }
-
-    out = ngx_quic_read_buffer(c, &qb, len);
+    out = ngx_quic_copy_buffer(c, (u_char *) data, len);
     if (out == NGX_CHAIN_ERROR) {
         return 0;
     }
 
-    ngx_quic_free_buffer(c, &qb);
-
     frame = ngx_quic_alloc_frame(c);
     if (frame == NULL) {
         return 0;