void qc_alloc_fd(struct quic_conn *qc, const struct sockaddr_storage *src,
const struct sockaddr_storage *dst);
-void qc_release_fd(struct quic_conn *qc);
+void qc_release_fd(struct quic_conn *qc, int reinit);
void quic_accept_push_qc(struct quic_conn *qc);
BUG_ON(qc->mux_state == QC_MUX_READY);
/* Close quic-conn socket fd. */
- qc_release_fd(qc);
+ qc_release_fd(qc, 0);
/* in the unlikely (but possible) case the connection was just added to
* the accept_list we must delete it from there.
* peer's address, unless it has previously validated that address.
*/
+ /* Update quic-conn owned socket if in used.
+ * TODO try to reuse it instead of closing and opening a new one.
+ */
+ if (qc_test_fd(qc)) {
+ /* TODO try to reuse socket instead of closing it and opening a new one. */
+ TRACE_STATE("Connection migration detected, allocate a new connection socket", QUIC_EV_CONN_LPKT, qc);
+ qc_release_fd(qc, 1);
+ qc_alloc_fd(qc, local_addr, peer_addr);
+ }
+
qc->local_addr = *local_addr;
qc->peer_addr = *peer_addr;
HA_ATOMIC_INC(&qc->prx_counters->conn_migration_done);
close(fd);
}
-/* Release socket file-descriptor specific for QUIC connection <qc>. */
-void qc_release_fd(struct quic_conn *qc)
+/* Release socket file-descriptor specific for QUIC connection <qc>. Set
+ * <reinit> if socket should be reinitialized after address migration.
+ */
+void qc_release_fd(struct quic_conn *qc, int reinit)
{
if (qc_test_fd(qc)) {
fd_delete(qc->fd);
qc->fd = DEAD_FD_MAGIC;
+
+ if (reinit)
+ qc_init_fd(qc);
}
}