]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: adjust quic CID derive API
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 13 Apr 2023 13:26:18 +0000 (15:26 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 18 Apr 2023 14:20:47 +0000 (16:20 +0200)
ODCID are never stored in the CID tree. Instead, we store our generated
CID which is directly derived from the CID using a hash function. This
operation is done via quic_derive_cid().

Previously, generated CID was returned as a 64-bits integer. However,
this is cumbersome to convert as an array of bytes which is the most
common CID representation. Adjust this by modifying return type to a
quic_cid struct.

This should be backported up to 2.7.

include/haproxy/quic_conn.h
src/quic_conn.c

index 78a97552f04c5618c8b1c7719f67fc0e8bcdf5df..e1b333ec5a65edd7257c1214f1e79e4a3a871372 100644 (file)
@@ -674,6 +674,8 @@ int quic_set_app_ops(struct quic_conn *qc, const unsigned char *alpn, size_t alp
 int qc_check_dcid(struct quic_conn *qc, unsigned char *dcid, size_t dcid_len);
 int quic_get_dgram_dcid(unsigned char *buf, const unsigned char *end,
                         unsigned char **dcid, size_t *dcid_len);
+struct quic_cid quic_derive_cid(const struct quic_cid *orig,
+                                const struct sockaddr_storage *addr);
 int qc_send_mux(struct quic_conn *qc, struct list *frms);
 
 void qc_notify_close(struct quic_conn *qc);
index 788ba18a2dcc57a0e614ecc09bd8aa7de9f12d4f..710f236b6093115be033e275e7d11dc0be18a68e 100644 (file)
@@ -3910,16 +3910,18 @@ static int quic_stateless_reset_token_init(struct quic_connection_id *conn_id)
 /* Generate a CID directly derived from <orig> CID and <addr> address. The CID
  * is then marked with the current thread ID.
  *
- * Returns a new 64-bits CID value.
+ * Returns the derived CID.
  */
-static uint64_t quic_derive_cid(const struct quic_cid *orig,
+struct quic_cid quic_derive_cid(const struct quic_cid *orig,
                                 const struct sockaddr_storage *addr)
 {
+       struct quic_cid cid;
        const struct sockaddr_in *in;
        const struct sockaddr_in6 *in6;
        char *buf = trash.area;
        size_t idx = 0;
        uint64_t hash;
+       int i;
 
        /* Prepare buffer for hash using original CID first. */
        memcpy(buf, orig->data, orig->len);
@@ -3948,7 +3950,6 @@ static uint64_t quic_derive_cid(const struct quic_cid *orig,
        default:
                /* TODO to implement */
                ABORT_NOW();
-               return 0;
        }
 
        /* Avoid similar values between multiple haproxy process. */
@@ -3958,10 +3959,14 @@ static uint64_t quic_derive_cid(const struct quic_cid *orig,
        /* Hash the final buffer content. */
        hash = XXH64(buf, idx, 0);
 
+       for (i = 0; i < sizeof(hash); ++i)
+               cid.data[i] = hash >> ((sizeof(hash) * 7) - (8 * i));
+       cid.len = sizeof(hash);
+
        /* Mark the current thread id in the CID. */
-       quic_pin_cid_to_tid((uchar *)&hash, tid);
+       quic_pin_cid_to_tid(cid.data, tid);
 
-       return hash;
+       return cid;
 }
 
 /* Allocate a new CID and attach it to <root> ebtree.
@@ -4002,8 +4007,7 @@ static struct quic_connection_id *new_quic_cid(struct eb_root *root,
        }
        else {
                /* Derive the new CID value from original CID. */
-               const uint64_t hash = quic_derive_cid(orig, addr);
-               memcpy(conn_id->cid.data, &hash, sizeof(hash));
+               conn_id->cid = quic_derive_cid(orig, addr);
        }
 
        if (quic_stateless_reset_token_init(conn_id) != 1) {
@@ -6524,8 +6528,8 @@ static struct quic_conn *retrieve_qc_conn_from_cid(struct quic_rx_packet *pkt,
         */
        if (!node && (pkt->type == QUIC_PACKET_TYPE_INITIAL ||
             pkt->type == QUIC_PACKET_TYPE_0RTT)) {
-               uint64_t hash = quic_derive_cid(&pkt->dcid, saddr);
-               node = ebmb_lookup(&quic_dghdlrs[tid].cids, &hash, sizeof(hash));
+               const struct quic_cid derive_cid = quic_derive_cid(&pkt->dcid, saddr);
+               node = ebmb_lookup(&quic_dghdlrs[tid].cids, derive_cid.data, derive_cid.len);
        }
 
        if (!node)