mirror of
https://github.com/haproxy/haproxy.git
synced 2026-04-21 06:06:59 -04:00
Send is conducted through qc_send_ppkts() for a QUIC connection. There is two types of error which can be encountered on sendto() or affiliated syscalls : * transient error. In this case, sending is simulated with the remaining data and retransmission process is used to have the opportunity to retry emission * fatal error. If this happens, the connection should be closed as soon as possible. This is done via qc_kill_conn() function. Until this patch, only ECONNREFUSED errno was considered as fatal. Modify the QUIC send API to be able to differentiate transient and fatal errors more easily. This is done by fixing the return value of the sendto() wrapper qc_snd_buf() : * on fatal error, a negative error code is returned. This is now the case for every errno except EAGAIN, EWOULDBLOCK, ENOTCONN, EINPROGRESS and EBADF. * on a transient error, 0 is returned. This is the case for the listed errno values above and also if a partial send has been conducted by the kernel. * on success, the return value of sendto() syscall is returned. This commit will be useful to be able to handle transient error with a quic-conn owned socket. In this case, the socket should be subscribed to the poller and no simulated send will be conducted. This commit allows errno management to be confined in the quic-sock module which is a nice cleanup. On a final note, EBADF should be considered as fatal. This will be the subject of a next commit. This should be backported up to 2.7.
78 lines
2.5 KiB
C
78 lines
2.5 KiB
C
/*
|
|
* include/haproxy/quic_sock.h
|
|
* This file contains declarations for QUIC sockets.
|
|
*
|
|
* Copyright 2020 Frederic Lecaille <flecaille@haproxy.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, version 2.1
|
|
* exclusively.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _HAPROXY_QUIC_SOCK_H
|
|
#define _HAPROXY_QUIC_SOCK_H
|
|
#ifdef USE_QUIC
|
|
#ifndef USE_OPENSSL
|
|
#error "Must define USE_OPENSSL"
|
|
#endif
|
|
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <haproxy/api.h>
|
|
#include <haproxy/connection-t.h>
|
|
#include <haproxy/listener-t.h>
|
|
#include <haproxy/quic_conn-t.h>
|
|
#include <haproxy/quic_sock-t.h>
|
|
|
|
int quic_session_accept(struct connection *cli_conn);
|
|
int quic_sock_get_src(struct connection *conn, struct sockaddr *addr, socklen_t len);
|
|
int quic_sock_get_dst(struct connection *conn, struct sockaddr *addr, socklen_t len);
|
|
int quic_sock_accepting_conn(const struct receiver *rx);
|
|
struct connection *quic_sock_accept_conn(struct listener *l, int *status);
|
|
|
|
struct task *quic_lstnr_dghdlr(struct task *t, void *ctx, unsigned int state);
|
|
void quic_lstnr_sock_fd_iocb(int fd);
|
|
int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t count,
|
|
int flags);
|
|
int qc_rcv_buf(struct quic_conn *qc);
|
|
|
|
/* Set default value for <qc> socket as uninitialized. */
|
|
static inline void qc_init_fd(struct quic_conn *qc)
|
|
{
|
|
qc->fd = -1;
|
|
}
|
|
|
|
/* Returns true if <qc> socket is initialized else false. */
|
|
static inline char qc_test_fd(struct quic_conn *qc)
|
|
{
|
|
/* quic-conn socket should not be accessed once it has been released. */
|
|
BUG_ON(qc->fd == DEAD_FD_MAGIC);
|
|
return qc->fd >= 0;
|
|
}
|
|
|
|
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, int reinit);
|
|
|
|
void quic_accept_push_qc(struct quic_conn *qc);
|
|
|
|
#endif /* USE_QUIC */
|
|
#endif /* _HAPROXY_QUIC_SOCK_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-indent-level: 8
|
|
* c-basic-offset: 8
|
|
* End:
|
|
*/
|