MINOR: quic: extend pn_offset field from quic_rx_packet
pn_offset field was only set if header protection cannot be removed.
Extend the usage of this field : it is now set everytime on packet
parsing in qc_lstnr_pkt_rcv().
This change helps to clean up API of Rx functions by removing
unnecessary variables and function argument.
This change has no functional impact. It is a part of a refactoring
series on qc_lstnr_pkt_rcv(). The objective is facilitate integration of
FD-owned socket patches.
This should be backported up to 2.6.
diff --git a/include/haproxy/quic_conn-t.h b/include/haproxy/quic_conn-t.h
index 75bd2d5..1556863 100644
--- a/include/haproxy/quic_conn-t.h
+++ b/include/haproxy/quic_conn-t.h
@@ -404,6 +404,7 @@
/* Initial desctination connection ID. */
struct quic_cid dcid;
struct quic_cid scid;
+ /* Packet number offset : only valid for Initial/Handshake/0-RTT/1-RTT. */
size_t pn_offset;
/* Packet number */
int64_t pn;
diff --git a/src/quic_conn.c b/src/quic_conn.c
index dcf5eea..3f1e180 100644
--- a/src/quic_conn.c
+++ b/src/quic_conn.c
@@ -5164,16 +5164,23 @@
TRACE_LEAVE(QUIC_EV_CONN_RXPKT, qc);
}
-/* Try to remove the header protection of <pkt> QUIC packet attached to <qc>
- * QUIC connection with <buf> as packet number field address, <end> a pointer to one
- * byte past the end of the buffer containing this packet and <beg> the address of
- * the packet first byte.
- * If succeeded, this function updates <*buf> to point to the next packet in the buffer.
- * Returns 1 if succeeded, 0 if not.
+/* Try to remove the header protection of <pkt> QUIC packet with <beg> the
+ * address of the packet first byte, using the keys from encryption level <el>.
+ *
+ * If header protection has been successfully removed, packet data are copied
+ * into <qc> Rx buffer. If <el> secrets are not yet available, the copy is also
+ * proceeded, and the packet is inserted into <qc> protected packets tree. In
+ * both cases, packet can now be considered handled by the <qc> connection.
+ *
+ * If header protection cannot be removed due to <el> secrets already
+ * discarded, no operation is conducted.
+ *
+ * Returns 1 on success : packet data is now handled by the connection. On
+ * error 0 is returned : packet should be dropped by the caller.
*/
static inline int qc_try_rm_hp(struct quic_conn *qc,
struct quic_rx_packet *pkt,
- unsigned char *buf, unsigned char *beg,
+ unsigned char *beg,
struct quic_enc_level **el)
{
int ret = 0;
@@ -5185,11 +5192,13 @@
qpkt_trace = NULL;
TRACE_ENTER(QUIC_EV_CONN_TRMHP, qc);
+ BUG_ON(!pkt->pn_offset);
+
/* The packet number is here. This is also the start minus
* QUIC_PACKET_PN_MAXLEN of the sample used to add/remove the header
* protection.
*/
- pn = buf;
+ pn = beg + pkt->pn_offset;
tel = quic_packet_type_enc_level(pkt->type);
qel = &qc->els[tel];
@@ -5205,8 +5214,8 @@
goto out;
}
- /* The AAD includes the packet number field found at <pn>. */
- pkt->aad_len = pn - beg + pkt->pnl;
+ /* The AAD includes the packet number field. */
+ pkt->aad_len = pkt->pn_offset + pkt->pnl;
if (pkt->len - pkt->aad_len < QUIC_TLS_TAG_LEN) {
TRACE_PROTO("Too short packet", QUIC_EV_CONN_TRMHP, qc);
goto out;
@@ -5224,7 +5233,6 @@
}
TRACE_PROTO("hp not removed", QUIC_EV_CONN_TRMHP, qc, pkt);
- pkt->pn_offset = pn - beg;
LIST_APPEND(&qel->rx.pqpkts, &pkt->list);
quic_rx_packet_refinc(pkt);
}
@@ -5932,7 +5940,7 @@
struct quic_rx_packet *pkt, int first_pkt,
struct quic_dgram *dgram, struct list **tasklist_head)
{
- unsigned char *beg, *payload;
+ unsigned char *beg;
struct quic_conn *qc;
struct listener *l;
struct proxy *prx;
@@ -6092,8 +6100,11 @@
goto drop;
}
- payload = buf;
- pkt->len = len + payload - beg;
+ /* Packet Number is stored here. Packet Length totalizes the
+ * rest of the content.
+ */
+ pkt->pn_offset = buf - beg;
+ pkt->len = pkt->pn_offset + len;
if (drop_no_conn)
goto drop_no_conn;
@@ -6194,8 +6205,8 @@
buf += QUIC_HAP_CID_LEN;
+ pkt->pn_offset = buf - beg;
/* A short packet is the last one of a UDP datagram. */
- payload = buf;
pkt->len = end - beg;
qc = retrieve_qc_conn_from_cid(pkt, l, &dgram->saddr);
@@ -6275,7 +6286,7 @@
}
}
- if (!qc_try_rm_hp(qc, pkt, payload, beg, &qel)) {
+ if (!qc_try_rm_hp(qc, pkt, beg, &qel)) {
TRACE_PROTO("Packet dropped", QUIC_EV_CONN_LPKT, qc, NULL, NULL, qv);
goto drop;
}
@@ -7177,6 +7188,7 @@
}
pkt->version = NULL;
+ pkt->pn_offset = 0;
LIST_INIT(&pkt->qc_rx_pkt_list);
pkt->time_received = now_ms;