Packages
hackney
3.0.0
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Retired package: Release invalid - Use 3.0.1 instead
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/lsquic/src/liblsquic/lsquic_pr_queue.h
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
/*
* lsquic_pr_queue.h -- a queue of packet requests
*
* Some packets need to be replied to outside of context of existing
* mini or full connections:
*
* 1. A version negotiation packet needs to be sent when a packet
* arrives that specifies QUIC version that we do not support.
* 2. A public reset packet needs to be sent when we receive a
* packet that does not belong to a known QUIC connection.
*
* The replies cannot be sent immediately. They share outgoing
* socket with existing connections and must be scheduled according
* to prioritization rules.
*
* The information needed to generate reply packet -- connection ID,
* connection context, and the peer address -- is saved in the Packet
* Request Queue.
*
* When it is time to send packets, the connection iterator knows to
* call prq_next_conn() when appropriate. What is returned is an
* evanescent connection object that disappears as soon as the reply
* packet is successfully sent out.
*
* There are two limits associated with Packet Request Queue:
* 1. Maximum number of packet requests that are allowed to be
* pending at any one time. This is simply to prevent memory
* blowout.
* 2. Maximum verneg connection objects to be allocated at any one
* time. This number is the same as the maximum batch size in
* the engine, because the packet (and, therefore, the connection)
* is returned to the Packet Request Queue when it could not be
* sent.
*
* We call this a "request" queue because it describes what we do with
* QUIC packets whose version we do not support or those packets that
* do not belong to an existing connection: we send a reply for each of
* these packets, which effectively makes them "requests."
*/
#ifndef LSQUIC_PR_QUEUE_H
#define LSQUIC_PR_QUEUE_H 1
struct lsquic_conn;
struct lsquic_packet_in;
struct lsquic_engine_settings;
struct pr_queue;
struct sockaddr;
enum packet_req_type {
PACKET_REQ_VERNEG,
PACKET_REQ_PUBRES,
PACKET_REQ_RETRY,
N_PREQ_TYPES,
};
extern const char *const lsquic_preqt2str[N_PREQ_TYPES];
struct pr_queue *
lsquic_prq_create (unsigned max_elems, unsigned max_conns,
const struct lsquic_engine_public *);
void
lsquic_prq_destroy (struct pr_queue *);
int
lsquic_prq_new_req (struct pr_queue *, enum packet_req_type,
const struct lsquic_packet_in *, void *conn_ctx,
const struct sockaddr *local_addr,
const struct sockaddr *peer_addr);
struct lsquic_conn *
lsquic_prq_next_conn (struct pr_queue *);
int
lsquic_prq_have_pending (const struct pr_queue *);
int
lsquic_prq_new_req_ext (struct pr_queue *prq, enum packet_req_type type,
unsigned flags, enum lsquic_version version, unsigned short data_sz,
const lsquic_cid_t *dcid, const lsquic_cid_t *scid, void *peer_ctx,
const struct sockaddr *local_addr, const struct sockaddr *peer_addr);
void
lsquic_prq_drop (struct lsquic_conn *);
#endif