MINOR: quic: adjust quic CID derive API

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.
diff --git a/src/quic_conn.c b/src/quic_conn.c
index 788ba18..710f236 100644
--- a/src/quic_conn.c
+++ b/src/quic_conn.c
@@ -3910,16 +3910,18 @@
 /* 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 @@
 	default:
 		/* TODO to implement */
 		ABORT_NOW();
-		return 0;
 	}
 
 	/* Avoid similar values between multiple haproxy process. */
@@ -3958,10 +3959,14 @@
 	/* 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 @@
 	}
 	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 @@
 	 */
 	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)