quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

vquic_int.h (3860B)


      1 #ifndef HEADER_CURL_VQUIC_QUIC_INT_H
      2 #define HEADER_CURL_VQUIC_QUIC_INT_H
      3 /***************************************************************************
      4  *                                  _   _ ____  _
      5  *  Project                     ___| | | |  _ \| |
      6  *                             / __| | | | |_) | |
      7  *                            | (__| |_| |  _ <| |___
      8  *                             \___|\___/|_| \_\_____|
      9  *
     10  * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
     11  *
     12  * This software is licensed as described in the file COPYING, which
     13  * you should have received as part of this distribution. The terms
     14  * are also available at https://curl.se/docs/copyright.html.
     15  *
     16  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     17  * copies of the Software, and permit persons to whom the Software is
     18  * furnished to do so, under the terms of the COPYING file.
     19  *
     20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     21  * KIND, either express or implied.
     22  *
     23  * SPDX-License-Identifier: curl
     24  *
     25  ***************************************************************************/
     26 
     27 #include "../curl_setup.h"
     28 #include "../bufq.h"
     29 
     30 #ifdef USE_HTTP3
     31 
     32 #define MAX_PKT_BURST 10
     33 #define MAX_UDP_PAYLOAD_SIZE  1452
     34 
     35 struct cf_quic_ctx {
     36   curl_socket_t sockfd; /* connected UDP socket */
     37   struct sockaddr_storage local_addr; /* address socket is bound to */
     38   socklen_t local_addrlen; /* length of local address */
     39 
     40   struct bufq sendbuf; /* buffer for sending one or more packets */
     41   struct curltime first_byte_at;     /* when first byte was recvd */
     42   struct curltime last_op; /* last (attempted) send/recv operation */
     43   struct curltime last_io; /* last successful socket IO */
     44   size_t gsolen; /* length of individual packets in send buf */
     45   size_t split_len; /* if != 0, buffer length after which GSO differs */
     46   size_t split_gsolen; /* length of individual packets after split_len */
     47 #ifdef DEBUGBUILD
     48   int wblock_percent; /* percent of writes doing EAGAIN */
     49 #endif
     50   BIT(got_first_byte); /* if first byte was received */
     51   BIT(no_gso); /* do not use gso on sending */
     52 };
     53 
     54 #define H3_STREAM_CTX(ctx,data)                                         \
     55   (data ? Curl_uint_hash_get(&(ctx)->streams, (data)->mid) : NULL)
     56 
     57 CURLcode vquic_ctx_init(struct cf_quic_ctx *qctx);
     58 void vquic_ctx_free(struct cf_quic_ctx *qctx);
     59 
     60 void vquic_ctx_update_time(struct cf_quic_ctx *qctx);
     61 
     62 void vquic_push_blocked_pkt(struct Curl_cfilter *cf,
     63                             struct cf_quic_ctx *qctx,
     64                             const uint8_t *pkt, size_t pktlen, size_t gsolen);
     65 
     66 CURLcode vquic_send_blocked_pkts(struct Curl_cfilter *cf,
     67                                  struct Curl_easy *data,
     68                                  struct cf_quic_ctx *qctx);
     69 
     70 CURLcode vquic_send(struct Curl_cfilter *cf, struct Curl_easy *data,
     71                     struct cf_quic_ctx *qctx, size_t gsolen);
     72 
     73 CURLcode vquic_send_tail_split(struct Curl_cfilter *cf, struct Curl_easy *data,
     74                                struct cf_quic_ctx *qctx, size_t gsolen,
     75                                size_t tail_len, size_t tail_gsolen);
     76 
     77 CURLcode vquic_flush(struct Curl_cfilter *cf, struct Curl_easy *data,
     78                      struct cf_quic_ctx *qctx);
     79 
     80 
     81 typedef CURLcode vquic_recv_pkt_cb(const unsigned char *pkt, size_t pktlen,
     82                                    struct sockaddr_storage *remote_addr,
     83                                    socklen_t remote_addrlen, int ecn,
     84                                    void *userp);
     85 
     86 CURLcode vquic_recv_packets(struct Curl_cfilter *cf,
     87                             struct Curl_easy *data,
     88                             struct cf_quic_ctx *qctx,
     89                             size_t max_pkts,
     90                             vquic_recv_pkt_cb *recv_cb, void *userp);
     91 
     92 #endif /* !USE_HTTP3 */
     93 
     94 #endif /* HEADER_CURL_VQUIC_QUIC_INT_H */