struct sockaddr_storage saddr;
struct sockaddr_storage daddr;
struct quic_conn *qc;
- struct list list;
- struct mt_list mt_list;
+
+ struct list recv_list; /* elemt to quic_receiver_buf <dgram_list>. */
+ struct mt_list handler_list; /* elem to quic_dghdlr <dgrams>. */
};
/* The QUIC packet numbers are 62-bits integers */
struct mt_list mt_list;
};
-/* QUIC RX buffer */
-struct rxbuf {
- struct buffer buf;
- struct list dgrams;
- struct mt_list mt_list;
-};
-
/* Status of the connection/mux layer. This defines how to handle app data.
*
* During a standard quic_conn lifetime it transitions like this :
struct tasklet *tasklet; /* task responsible to call listener_accept */
};
+/* Buffer used to receive QUIC datagrams on random thread and redispatch them
+ * to the connection thread.
+ */
+struct quic_receiver_buf {
+ struct buffer buf; /* storage for datagrams received. */
+ struct list dgram_list; /* datagrams received with this rxbuf. */
+ struct mt_list rxbuf_el; /* list element into receiver.rxbuf_list. */
+};
+
#endif /* USE_QUIC */
#endif /* _HAPROXY_QUIC_SOCK_T_H */
struct rx_settings *settings; /* points to the settings used by this receiver */
struct list proto_list; /* list in the protocol header */
#ifdef USE_QUIC
- struct mt_list rxbuf_list; /* The same as ->rxbufs but arranged in a list */
+ struct mt_list rxbuf_list; /* list of buffers to receive and dispatch QUIC datagrams. */
#endif
/* warning: this struct is huge, keep it at the bottom */
struct sockaddr_storage addr; /* the address the socket is bound to */
static int quic_alloc_rxbufs_listener(struct listener *l)
{
int i;
- struct rxbuf *rxbuf;
+ struct quic_receiver_buf *tmp;
MT_LIST_INIT(&l->rx.rxbuf_list);
for (i = 0; i < global.nbthread; i++) {
+ struct quic_receiver_buf *rxbuf;
char *buf;
- struct rxbuf *rxbuf;
- rxbuf = calloc(1, sizeof *rxbuf);
+ rxbuf = calloc(1, sizeof(*rxbuf));
if (!rxbuf)
goto err;
}
rxbuf->buf = b_make(buf, QUIC_RX_BUFSZ, 0, 0);
- LIST_INIT(&rxbuf->dgrams);
- MT_LIST_APPEND(&l->rx.rxbuf_list, &rxbuf->mt_list);
+ LIST_INIT(&rxbuf->dgram_list);
+ MT_LIST_APPEND(&l->rx.rxbuf_list, &rxbuf->rxbuf_el);
}
return 1;
err:
- while ((rxbuf = MT_LIST_POP(&l->rx.rxbuf_list, typeof(rxbuf), mt_list))) {
- pool_free(pool_head_quic_rxbuf, rxbuf->buf.area);
- free(rxbuf);
+ while ((tmp = MT_LIST_POP(&l->rx.rxbuf_list, typeof(tmp), rxbuf_el))) {
+ pool_free(pool_head_quic_rxbuf, tmp->buf.area);
+ free(tmp);
}
return 0;
}
TRACE_ENTER(QUIC_EV_CONN_LPKT);
- while ((dgram = MT_LIST_POP(&dghdlr->dgrams, typeof(dgram), mt_list))) {
+ while ((dgram = MT_LIST_POP(&dghdlr->dgrams, typeof(dgram), handler_list))) {
pos = dgram->buf;
end = pos + dgram->len;
do {
dgram->saddr = *saddr;
dgram->daddr = *daddr;
dgram->qc = NULL;
- LIST_APPEND(dgrams, &dgram->list);
- MT_LIST_APPEND(&quic_dghdlrs[cid_tid].dgrams, &dgram->mt_list);
+
+ /* Attached datagram to its quic_receiver_buf and quic_dghdlrs. */
+ LIST_APPEND(dgrams, &dgram->recv_list);
+ MT_LIST_APPEND(&quic_dghdlrs[cid_tid].dgrams, &dgram->handler_list);
/* typically quic_lstnr_dghdlr() */
tasklet_wakeup(quic_dghdlrs[cid_tid].task);
void quic_sock_fd_iocb(int fd)
{
ssize_t ret;
- struct rxbuf *rxbuf;
+ struct quic_receiver_buf *rxbuf;
struct buffer *buf;
struct listener *l = objt_listener(fdtab[fd].owner);
struct quic_transport_params *params;
if (!(fdtab[fd].state & FD_POLL_IN) || !fd_recv_ready(fd))
return;
- rxbuf = MT_LIST_POP(&l->rx.rxbuf_list, typeof(rxbuf), mt_list);
+ rxbuf = MT_LIST_POP(&l->rx.rxbuf_list, typeof(rxbuf), rxbuf_el);
if (!rxbuf)
goto out;
/* Append this datagram only to the RX buffer list. It will
* not be treated by any datagram handler.
*/
- LIST_APPEND(&rxbuf->dgrams, &dgram->list);
+ LIST_APPEND(&rxbuf->dgram_list, &dgram->recv_list);
/* Consume the remaining space */
b_add(buf, cspace);
b_add(buf, ret);
if (!quic_lstnr_dgram_dispatch(dgram_buf, ret, l, &saddr, &daddr,
- new_dgram, &rxbuf->dgrams)) {
+ new_dgram, &rxbuf->dgram_list)) {
/* If wrong, consume this datagram */
b_del(buf, ret);
}
goto start;
out:
pool_free(pool_head_quic_dgram, new_dgram);
- MT_LIST_APPEND(&l->rx.rxbuf_list, &rxbuf->mt_list);
+ MT_LIST_APPEND(&l->rx.rxbuf_list, &rxbuf->rxbuf_el);
}
/* Send a datagram stored into <buf> buffer with <sz> as size.