[PATCH v2 0/5] Handle error events on UDP sockets
Add handling of the error queue for UDP sockets. We certainly need this for the flow table: this is the cause of the epoll loop that Stefano noticed. Even without the flow table it should improve robustness and debugability. Along the way we make a few other clean ups. Changes from v1: * Assorted minor changes based on Stefano's review David Gibson (5): conf: Don't configure port forwarding for a disabled protocol udp: Make udp_sock_recv static udp, tcp: Tweak handling of no_udp and no_tcp flags util: Add AF_UNSPEC support to sockaddr_ntop() udp: Handle errors on UDP sockets conf.c | 5 ++++ tcp.c | 14 ++++++++--- udp.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- util.c | 33 +++++++++++++++++++++++++ util.h | 3 +++ 5 files changed, 125 insertions(+), 7 deletions(-) -- 2.45.2
UDP and/or TCP can be disabled with the --no-udp and --no-tcp options.
However, when this is specified, it's still possible to configure forwarded
ports for the disabled protocol. In some cases this will open sockets and
perform other actions, which might not be safe since the entire protocol
won't be initialised.
Check for this case, and explicitly forbid it.
Signed-off-by: David Gibson
Through an oversight this was previously declared as a public function
although it's only used in udp.c and there is no prototype in any header.
Signed-off-by: David Gibson
We abort the UDP socket handler if the no_udp flag is set. But if UDP
was disabled we should never have had a UDP socket to trigger the handler
in the first place. If we somehow did, ignoring it here isn't really going
to help because aborting without doing anything is likely to lead to an
epoll loop. The same is the case for the TCP socket and timer handlers and
the no_tcp flag.
Change these checks on the flag to ASSERT()s. Similarly add ASSERT()s to
several other entry points to the protocol specific code which should never
be called if the protocol is disabled.
Signed-off-by: David Gibson
Allow sockaddr_ntop() to format AF_UNSPEC socket addresses. There do exist
a few cases where we might legitimately have either an AF_UNSPEC or a real
address, such as the origin address from MSG_ERRQUEUE. Even in cases where
we shouldn't get an AF_UNSPEC address, formatting it is likely to make
things easier to debug if we ever somehow do.
Signed-off-by: David Gibson
Currently we ignore all events other than EPOLLIN on UDP sockets. This
means that if we ever receive an EPOLLERR event, we'll enter an infinite
loop on epoll, because we'll never do anything to clear the error.
Luckily that doesn't seem to have happened in practice, but it's certainly
fragile. Furthermore changes in how we handle UDP sockets with the flow
table mean we will start receiving error events.
Add handling of EPOLLERR events. For now we just read the error from the
error queue (thereby clearing the error state) and print a debug message.
We can add more substantial handling of specific events in future if we
want to.
Signed-off-by: David Gibson
On Wed, 17 Jul 2024 10:35:59 +1000
David Gibson
Add handling of the error queue for UDP sockets. We certainly need this for the flow table: this is the cause of the epoll loop that Stefano noticed. Even without the flow table it should improve robustness and debugability.
Along the way we make a few other clean ups.
Changes from v1: * Assorted minor changes based on Stefano's review
David Gibson (5): conf: Don't configure port forwarding for a disabled protocol udp: Make udp_sock_recv static udp, tcp: Tweak handling of no_udp and no_tcp flags util: Add AF_UNSPEC support to sockaddr_ntop() udp: Handle errors on UDP sockets
Applied. -- Stefano
participants (2)
-
David Gibson
-
Stefano Brivio