mirror of
https://passt.top/passt
synced 2025-06-20 05:55:33 +02:00
udp: Rework udp_listen_sock_data() into udp_sock_fwd()
udp_listen_sock_data() forwards datagrams from a "listening" socket until there are no more (for now). We have an upcoming use case where we want to do that for a socket that's not a "listening" socket, and uses a different epoll reference. So, adjust the function to take the pieces it needs from the reference as direct parameters and rename to udp_sock_fwd(). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
159beefa36
commit
bd6a41ee76
1 changed files with 14 additions and 15 deletions
29
udp.c
29
udp.c
|
@ -716,37 +716,36 @@ static void udp_buf_sock_to_tap(const struct ctx *c, int s, int n,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* udp_listen_sock_data() - Handle new data from listening socket
|
* udp_sock_fwd() - Forward datagrams from a possibly unconnected socket
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
* @ref: epoll reference
|
* @s: Socket to forward from
|
||||||
|
* @frompif: Interface to which @s belongs
|
||||||
|
* @port: Our (local) port number of @s
|
||||||
* @now: Current timestamp
|
* @now: Current timestamp
|
||||||
*/
|
*/
|
||||||
static void udp_listen_sock_data(const struct ctx *c, union epoll_ref ref,
|
static void udp_sock_fwd(const struct ctx *c, int s, uint8_t frompif,
|
||||||
const struct timespec *now)
|
in_port_t port, const struct timespec *now)
|
||||||
{
|
{
|
||||||
union sockaddr_inany src;
|
union sockaddr_inany src;
|
||||||
|
|
||||||
while (udp_peek_addr(ref.fd, &src) == 0) {
|
while (udp_peek_addr(s, &src) == 0) {
|
||||||
flow_sidx_t tosidx = udp_flow_from_sock(c, ref.udp.pif,
|
flow_sidx_t tosidx = udp_flow_from_sock(c, frompif, port,
|
||||||
ref.udp.port, &src,
|
&src, now);
|
||||||
now);
|
|
||||||
uint8_t topif = pif_at_sidx(tosidx);
|
uint8_t topif = pif_at_sidx(tosidx);
|
||||||
|
|
||||||
if (pif_is_socket(topif)) {
|
if (pif_is_socket(topif)) {
|
||||||
udp_sock_to_sock(c, ref.fd, 1, tosidx);
|
udp_sock_to_sock(c, s, 1, tosidx);
|
||||||
} else if (topif == PIF_TAP) {
|
} else if (topif == PIF_TAP) {
|
||||||
if (c->mode == MODE_VU)
|
if (c->mode == MODE_VU)
|
||||||
udp_vu_sock_to_tap(c, ref.fd, 1, tosidx);
|
udp_vu_sock_to_tap(c, s, 1, tosidx);
|
||||||
else
|
else
|
||||||
udp_buf_sock_to_tap(c, ref.fd, 1, tosidx);
|
udp_buf_sock_to_tap(c, s, 1, tosidx);
|
||||||
} else if (flow_sidx_valid(tosidx)) {
|
} else if (flow_sidx_valid(tosidx)) {
|
||||||
flow_sidx_t fromsidx = flow_sidx_opposite(tosidx);
|
|
||||||
struct udp_flow *uflow = udp_at_sidx(tosidx);
|
struct udp_flow *uflow = udp_at_sidx(tosidx);
|
||||||
|
|
||||||
flow_err(uflow,
|
flow_err(uflow,
|
||||||
"No support for forwarding UDP from %s to %s",
|
"No support for forwarding UDP from %s to %s",
|
||||||
pif_name(pif_at_sidx(fromsidx)),
|
pif_name(frompif), pif_name(topif));
|
||||||
pif_name(topif));
|
|
||||||
} else {
|
} else {
|
||||||
debug("Discarding datagram without flow");
|
debug("Discarding datagram without flow");
|
||||||
}
|
}
|
||||||
|
@ -774,7 +773,7 @@ void udp_listen_sock_handler(const struct ctx *c,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events & EPOLLIN)
|
if (events & EPOLLIN)
|
||||||
udp_listen_sock_data(c, ref, now);
|
udp_sock_fwd(c, ref.fd, ref.udp.pif, ref.udp.port, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue