int qc_dgrams_retransmit(struct quic_conn *qc);
void qc_prep_hdshk_fast_retrans(struct quic_conn *qc,
struct list *ifrms, struct list *hfrms);
-int send_retry(int fd, struct sockaddr_storage *addr,
+int send_retry(struct listener *l, 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,
struct quic_rx_packet *rxpkt);
-int send_version_negotiation(int fd, struct sockaddr_storage *addr,
+int send_version_negotiation(struct listener *l, struct sockaddr_storage *dst,
struct quic_rx_packet *pkt);
/* The TX packets sent in the same datagram are linked to each others in
/* Validate the token, retry or not only when connection is unknown. */
if (!quic_token_validate(pkt, dgram, l, qc, &token_odcid)) {
if (dgram->flags & QUIC_DGRAM_FL_SEND_RETRY) {
- if (send_retry(l->rx.fd, (struct sockaddr_storage *)&dgram->saddr, pkt, pkt->version)) {
+ if (send_retry(l, (struct sockaddr_storage *)&dgram->saddr, pkt, pkt->version)) {
TRACE_ERROR("Error during Retry generation",
QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version);
}
TRACE_PROTO("Initial without token, sending retry",
QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version);
- if (send_retry(l->rx.fd, (struct sockaddr_storage *)&dgram->saddr, pkt, pkt->version)) {
+ if (send_retry(l, (struct sockaddr_storage *)&dgram->saddr, pkt, pkt->version)) {
TRACE_ERROR("Error during Retry generation",
QUIC_EV_CONN_LPKT, NULL, NULL, NULL, pkt->version);
goto out;
*/
if (l && !pkt->version) {
/* unsupported version, send Negotiation packet */
- if (send_version_negotiation(l->rx.fd, (struct sockaddr_storage *)&dgram->saddr, pkt)) {
+ if (send_version_negotiation(l, (struct sockaddr_storage *)&dgram->saddr, pkt)) {
TRACE_ERROR("VN packet not sent", QUIC_EV_CONN_LPKT);
goto drop_silent;
}
}
/*
- * Send a Version Negotiation packet on response to <pkt> on socket <fd> to
- * address <addr>.
+ * Send a Version Negotiation packet on response to <pkt> on <l> listener
+ * socket to <dst> address.
* Implementation of RFC9000 6. Version Negotiation
*
* TODO implement a rate-limiting sending of Version Negotiation packets
*
* Returns 0 on success else non-zero
*/
-int send_version_negotiation(int fd, struct sockaddr_storage *addr,
+int send_version_negotiation(struct listener *l, struct sockaddr_storage *dst,
struct quic_rx_packet *pkt)
{
char buf[256];
int ret = 0, i = 0, j;
uint32_t version;
- const socklen_t addrlen = get_addr_len(addr);
+ const socklen_t addrlen = get_addr_len(dst);
TRACE_ENTER(QUIC_EV_CONN_TXPKT);
/*
i += sizeof(version);
}
- if (sendto(fd, buf, i, 0, (struct sockaddr *)addr, addrlen) < 0)
+ if (sendto(l->rx.fd, buf, i, 0, (struct sockaddr *)dst, addrlen) < 0)
goto out;
ret = 1;
static THREAD_LOCAL struct freq_ctr quic_stateless_reset_freq_ctr;
static THREAD_LOCAL uint quic_stateless_reset_rate;
-/* Send a stateless reset packet depending on <pkt> RX packet information
- * from <fd> UDP socket to <dst>
+/* Send a stateless reset packet depending on <rxpkt> RX packet information
+ * from <l> listener socket to <dstaddr>
* Return 1 if succeeded, 0 if not.
*/
int send_stateless_reset(struct listener *l, struct sockaddr_storage *dstaddr,
}
-/* Generate a Retry packet and send it on <fd> socket to <addr> in response to
- * the Initial <pkt> packet.
+/* Generate a Retry packet and send it on <l> listener socket to <dst> in
+ * response to the Initial <pkt> packet.
*
* Returns 0 on success else non-zero.
*/
-int send_retry(int fd, struct sockaddr_storage *addr,
+int send_retry(struct listener *l, struct sockaddr_storage *dst,
struct quic_rx_packet *pkt, const struct quic_version *qv)
{
int ret = 0;
unsigned char buf[128];
int i = 0, token_len;
- const socklen_t addrlen = get_addr_len(addr);
+ const socklen_t addrlen = get_addr_len(dst);
struct quic_cid scid;
TRACE_ENTER(QUIC_EV_CONN_TXPKT);
/* token */
if (!(token_len = quic_generate_retry_token(&buf[i], sizeof(buf) - i, qv->num,
- &pkt->dcid, &pkt->scid, addr))) {
+ &pkt->dcid, &pkt->scid, dst))) {
TRACE_ERROR("quic_generate_retry_token() failed", QUIC_EV_CONN_TXPKT);
goto out;
}
i += QUIC_TLS_TAG_LEN;
- if (sendto(fd, buf, i, 0, (struct sockaddr *)addr, addrlen) < 0) {
+ if (sendto(l->rx.fd, buf, i, 0, (struct sockaddr *)dst, addrlen) < 0) {
TRACE_ERROR("quic_tls_generate_retry_integrity_tag() failed", QUIC_EV_CONN_TXPKT);
goto out;
}