int send_retry(struct listener *l, struct sockaddr_storage *src,
struct sockaddr_storage *dst,
struct quic_rx_packet *pkt, const struct quic_version *qv);
-int send_stateless_reset(struct listener *l, struct sockaddr_storage *dstaddr,
+int send_stateless_reset(struct listener *l, struct sockaddr_storage *srcaddr,
+ struct sockaddr_storage *dstaddr,
struct quic_rx_packet *rxpkt);
int send_version_negotiation(struct listener *l, struct sockaddr_storage *dst,
struct quic_rx_packet *pkt);
* emits stateless_reset_token in its TPs.
*/
TRACE_PROTO("RX non Initial pkt without connection", QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version);
- if (!send_stateless_reset(l, (struct sockaddr_storage *)&dgram->saddr, pkt))
+ if (!send_stateless_reset(l, (struct sockaddr_storage *)&dgram->daddr,
+ (struct sockaddr_storage *)&dgram->saddr, pkt))
TRACE_ERROR("stateless reset not sent", QUIC_EV_CONN_LPKT, qc);
goto err;
}
static THREAD_LOCAL uint quic_stateless_reset_rate;
/* Send a stateless reset packet depending on <rxpkt> RX packet information
- * from <l> listener socket to <dstaddr>
+ * from <l> listener socket to <dstaddr>. <srcaddr> is the local address
+ * targeted by the peer, used as datagram source if possible (see
+ * quic_lstnr_sock_send()).
* Return 1 if succeeded, 0 if not.
*/
-int send_stateless_reset(struct listener *l, struct sockaddr_storage *dstaddr,
+int send_stateless_reset(struct listener *l, struct sockaddr_storage *srcaddr,
+ struct sockaddr_storage *dstaddr,
struct quic_rx_packet *rxpkt)
{
int ret = 0, pktlen, rndlen;
unsigned char pkt[64];
- const socklen_t addrlen = get_addr_len(dstaddr);
struct proxy *prx;
struct quic_counters *prx_counters;
rxpkt->dcid.data, rxpkt->dcid.len))
goto leave;
- if (sendto(l->rx.fd, pkt, pktlen, 0, (struct sockaddr *)dstaddr, addrlen) < 0)
+ if (quic_lstnr_sock_send(l, pkt, pktlen, srcaddr, dstaddr) < 0)
goto leave;
ret = 1;