diff --git a/include/haproxy/quic_sock.h b/include/haproxy/quic_sock.h index e398d384a..8ffe0bafb 100644 --- a/include/haproxy/quic_sock.h +++ b/include/haproxy/quic_sock.h @@ -109,6 +109,40 @@ static inline int quic_increment_curr_handshake(struct listener *l) return next; } +/* Initializes sockaddr_storage from union sockaddr_in46 type. + * Only unspec, IPv4 and IPv6 addresses are supported. + */ +static inline void in46un_to_addr(const union sockaddr_in46 *src, + struct sockaddr_storage *dst) +{ + struct sockaddr_in *in; + struct sockaddr_in6 *in6; + + switch (((struct sockaddr_storage *)src)->ss_family) { + case AF_UNSPEC: + memset(dst, 0, sizeof(*dst)); + break; + + case AF_INET: + in = (struct sockaddr_in *)dst; + in->sin_family = AF_INET; + in->sin_addr = src->in4.sin_addr; + in->sin_port = src->in4.sin_port; + break; + + case AF_INET6: + in6 = (struct sockaddr_in6 *)dst; + in6->sin6_family = AF_INET6; + in6->sin6_addr = src->in6.sin6_addr; + in6->sin6_port = src->in6.sin6_port; + break; + + default: + ABORT_NOW(); + break; + } +} + #endif /* USE_QUIC */ #endif /* _HAPROXY_QUIC_SOCK_H */ diff --git a/src/quic_rx.c b/src/quic_rx.c index 6c1c2733b..45c33c442 100644 --- a/src/quic_rx.c +++ b/src/quic_rx.c @@ -1868,9 +1868,12 @@ static struct quic_conn *quic_rx_pkt_retrieve_conn(struct quic_rx_packet *pkt, pool_free(pool_head_quic_connection_id, conn_id); } else { + struct sockaddr_storage saddr, daddr; + in46un_to_addr(&pkt->saddr, &saddr); + in46un_to_addr(&dgram->daddr, &daddr); + qc = qc_new_conn(l, pkt, &token_odcid, NULL, conn_id, - (struct sockaddr_storage *)&dgram->daddr, - (struct sockaddr_storage *)&pkt->saddr); + &daddr, &saddr); if (qc == NULL) { quic_cid_delete(conn_id); /* Removes CID from global tree as it points to a NULL qc. */ pool_free(pool_head_quic_connection_id, conn_id);