mirror of
https://passt.top/passt
synced 2025-06-11 18:15:34 +02:00

Currently we have an asymmetry in how we handle UDP sockets. For flows where the target side is a socket, we create a new connect()ed socket - the "reply socket" specifically for that flow used for sending and receiving datagrams on that flow and only that flow. For flows where the initiating side is a socket, we continue to use the "listening" socket (or rather, a dup() of it). This has some disadvantages: * We need a hash lookup for every datagram on the listening socket in order to work out what flow it belongs to * The dup() keeps the socket alive even if automatic forwarding removes the listening socket. However, the epoll data remains the same including containing the now stale original fd. This causes bug 103. * We can't (easily) set flow-specific options on an initiating side socket, because that could affect other flows as well Alter the code to use a connect()ed socket on the initiating side as well as the target side. There's no way to "clone and connect" the listening socket (a loose equivalent of accept() for UDP), so we have to create a new socket. We have to bind() this socket before we connect() it, which is allowed thanks to SO_REUSEADDR, but does leave a small window where it could receive datagrams not intended for this flow. For now we handle this by simply discarding any datagrams received between bind() and connect(), but I intend to improve this in a later patch. Link: https://bugs.passt.top/show_bug.cgi?id=103 Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright Red Hat
|
|
* Author: David Gibson <david@gibson.dropbear.id.au>
|
|
*/
|
|
|
|
#ifndef EPOLL_TYPE_H
|
|
#define EPOLL_TYPE_H
|
|
|
|
/**
|
|
* enum epoll_type - Different types of fds we poll over
|
|
*/
|
|
enum epoll_type {
|
|
/* Special value to indicate an invalid type */
|
|
EPOLL_TYPE_NONE = 0,
|
|
/* Connected TCP sockets */
|
|
EPOLL_TYPE_TCP,
|
|
/* Connected TCP sockets (spliced) */
|
|
EPOLL_TYPE_TCP_SPLICE,
|
|
/* Listening TCP sockets */
|
|
EPOLL_TYPE_TCP_LISTEN,
|
|
/* timerfds used for TCP timers */
|
|
EPOLL_TYPE_TCP_TIMER,
|
|
/* UDP "listening" sockets */
|
|
EPOLL_TYPE_UDP_LISTEN,
|
|
/* UDP socket for a specific flow */
|
|
EPOLL_TYPE_UDP,
|
|
/* ICMP/ICMPv6 ping sockets */
|
|
EPOLL_TYPE_PING,
|
|
/* inotify fd watching for end of netns (pasta) */
|
|
EPOLL_TYPE_NSQUIT_INOTIFY,
|
|
/* timer fd watching for end of netns, fallback for inotify (pasta) */
|
|
EPOLL_TYPE_NSQUIT_TIMER,
|
|
/* tuntap character device */
|
|
EPOLL_TYPE_TAP_PASTA,
|
|
/* socket connected to qemu */
|
|
EPOLL_TYPE_TAP_PASST,
|
|
/* socket listening for qemu socket connections */
|
|
EPOLL_TYPE_TAP_LISTEN,
|
|
/* vhost-user command socket */
|
|
EPOLL_TYPE_VHOST_CMD,
|
|
/* vhost-user kick event socket */
|
|
EPOLL_TYPE_VHOST_KICK,
|
|
/* TCP_REPAIR helper listening socket */
|
|
EPOLL_TYPE_REPAIR_LISTEN,
|
|
/* TCP_REPAIR helper socket */
|
|
EPOLL_TYPE_REPAIR,
|
|
|
|
EPOLL_NUM_TYPES,
|
|
};
|
|
|
|
#endif /* EPOLL_TYPE_H */
|