MINOR: quic: refactor datagram commit in Tx buffer
This is the final patch on quic-conn Tx refactor. Extend the function
which is used to write a datagram header to save at the same time
written buffer data. This makes sense as the two operations are used at
the same occasion when a pre-written datagram is comitted.
diff --git a/src/xprt_quic.c b/src/xprt_quic.c
index 45c5a9f..cc2afd1 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -2638,18 +2638,6 @@
return 0;
}
-/* Write datagram header used for sending into <buf>. It is composed of the
- * datagram length and address of the first packet in datagram.
- *
- * Caller is responsible that there is enough space in the buffer.
- */
-static inline void qc_set_dg(struct buffer *buf,
- uint16_t dglen, struct quic_tx_packet *pkt)
-{
- write_u16(b_tail(buf), dglen);
- write_ptr(b_tail(buf) + sizeof(dglen), pkt);
-}
-
/* Allocate Tx buffer from <qc> quic-conn if needed.
*
* Returns allocated buffer or NULL on error.
@@ -2672,7 +2660,7 @@
* entirely. It may change in the future but this requires to be able
* to reuse old data.
*/
- BUG_ON(buf && b_data(buf));
+ BUG_ON_HOT(buf && b_data(buf));
if (!b_data(buf)) {
b_free(buf);
@@ -2680,6 +2668,22 @@
}
}
+/* Commit a datagram payload written into <buf> of length <length>. <first_pkt>
+ * must contains the address of the first packet stored in the payload.
+ *
+ * Caller is responsible that there is enough space in the buffer.
+ */
+static void qc_txb_store(struct buffer *buf, uint16_t length,
+ struct quic_tx_packet *first_pkt)
+{
+ const size_t hdlen = sizeof(uint16_t) + sizeof(void *);
+ BUG_ON_HOT(b_contig_space(buf) < hdlen); /* this must not happen */
+
+ write_u16(b_tail(buf), length);
+ write_ptr(b_tail(buf) + sizeof(length), first_pkt);
+ b_add(buf, hdlen + length);
+}
+
/* Returns 1 if a packet may be built for <qc> from <qel> encryption level
* with <frms> as ack-eliciting frame list to send, 0 if not.
* <cc> must equal to 1 if an immediate close was asked, 0 if not.
@@ -2721,7 +2725,7 @@
struct list *frms)
{
struct quic_enc_level *qel;
- unsigned char *end, *pos, *beg;
+ unsigned char *end, *pos;
struct quic_tx_packet *pkt;
size_t total;
/* Each datagram is prepended with its length followed by the address
@@ -2733,7 +2737,7 @@
qel = &qc->els[QUIC_TLS_ENC_LEVEL_APP];
total = 0;
- beg = pos = (unsigned char *)b_tail(buf);
+ pos = (unsigned char *)b_tail(buf);
while (b_contig_space(buf) >= (int)qc->path->mtu + dg_headlen) {
int err, probe, cc;
@@ -2781,9 +2785,7 @@
total += pkt->len;
/* Write datagram header. */
- qc_set_dg(buf, pkt->len, pkt);
- b_add(buf, pos - beg);
- beg = pos;
+ qc_txb_store(buf, pkt->len, pkt);
}
out:
@@ -2810,7 +2812,7 @@
enum quic_tls_enc_level next_tel, struct list *next_tel_frms)
{
struct quic_enc_level *qel;
- unsigned char *end, *pos, *beg;
+ unsigned char *end, *pos;
struct quic_tx_packet *first_pkt, *cur_pkt, *prv_pkt;
/* length of datagrams */
uint16_t dglen;
@@ -2834,7 +2836,7 @@
frms = tel_frms;
dglen = 0;
padding = 0;
- beg = pos = (unsigned char *)b_head(buf);
+ pos = (unsigned char *)b_head(buf);
first_pkt = prv_pkt = NULL;
while (b_contig_space(buf) >= (int)qc->path->mtu + dg_headlen || prv_pkt) {
int err, probe, cc;
@@ -2853,11 +2855,8 @@
probe = qel->pktns->tx.pto_probe;
if (!qc_may_build_pkt(qc, frms, qel, cc, probe, force_ack)) {
- if (prv_pkt) {
- qc_set_dg(buf, dglen, first_pkt);
- b_add(buf, pos - beg);
- beg = pos;
- }
+ if (prv_pkt)
+ qc_txb_store(buf, dglen, first_pkt);
/* Let's select the next encryption level */
if (tel != next_tel && next_tel != QUIC_TLS_ENC_LEVEL_NONE) {
tel = next_tel;
@@ -2904,11 +2903,8 @@
/* If there was already a correct packet present, set the
* current datagram as prepared into <cbuf>.
*/
- if (prv_pkt) {
- qc_set_dg(buf, dglen, first_pkt);
- b_add(buf, pos - beg);
- beg = pos;
- }
+ if (prv_pkt)
+ qc_txb_store(buf, dglen, first_pkt);
goto out;
default:
break;
@@ -2972,9 +2968,7 @@
* prepared into <cbuf>.
*/
if (!prv_pkt) {
- qc_set_dg(buf, dglen, first_pkt);
- b_add(buf, pos - beg);
- beg = pos;
+ qc_txb_store(buf, dglen, first_pkt);
first_pkt = NULL;
dglen = 0;
padding = 0;