mirror of
https://passt.top/passt
synced 2025-05-24 18:15:36 +02:00
udp_flow: Take pif and port as explicit parameters to udp_flow_from_sock()
Currently udp_flow_from_sock() is only used when receiving a datagram from a "listening" socket. It takes the listening socket's epoll reference to get the interface and port on which the datagram arrived. We have some upcoming cases where we want to use this in different contexts, so make it take the pif and port as direct parameters instead. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [sbrivio: Drop @ref from comment to udp_flow_from_sock()] Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
fd844a90bc
commit
159beefa36
3 changed files with 11 additions and 11 deletions
4
udp.c
4
udp.c
|
@ -727,7 +727,9 @@ static void udp_listen_sock_data(const struct ctx *c, union epoll_ref ref,
|
|||
union sockaddr_inany src;
|
||||
|
||||
while (udp_peek_addr(ref.fd, &src) == 0) {
|
||||
flow_sidx_t tosidx = udp_flow_from_sock(c, ref, &src, now);
|
||||
flow_sidx_t tosidx = udp_flow_from_sock(c, ref.udp.pif,
|
||||
ref.udp.port, &src,
|
||||
now);
|
||||
uint8_t topif = pif_at_sidx(tosidx);
|
||||
|
||||
if (pif_is_socket(topif)) {
|
||||
|
|
16
udp_flow.c
16
udp_flow.c
|
@ -161,9 +161,10 @@ cancel:
|
|||
}
|
||||
|
||||
/**
|
||||
* udp_flow_from_sock() - Find or create UDP flow for "listening" socket
|
||||
* udp_flow_from_sock() - Find or create UDP flow for incoming datagram
|
||||
* @c: Execution context
|
||||
* @ref: epoll reference of the receiving socket
|
||||
* @pif: Interface the datagram is arriving from
|
||||
* @port: Our (local) port number to which the datagram is arriving
|
||||
* @s_in: Source socket address, filled in by recvmmsg()
|
||||
* @now: Timestamp
|
||||
*
|
||||
|
@ -172,7 +173,7 @@ cancel:
|
|||
* Return: sidx for the destination side of the flow for this packet, or
|
||||
* FLOW_SIDX_NONE if we couldn't find or create a flow.
|
||||
*/
|
||||
flow_sidx_t udp_flow_from_sock(const struct ctx *c, union epoll_ref ref,
|
||||
flow_sidx_t udp_flow_from_sock(const struct ctx *c, uint8_t pif, in_port_t port,
|
||||
const union sockaddr_inany *s_in,
|
||||
const struct timespec *now)
|
||||
{
|
||||
|
@ -181,9 +182,7 @@ flow_sidx_t udp_flow_from_sock(const struct ctx *c, union epoll_ref ref,
|
|||
union flow *flow;
|
||||
flow_sidx_t sidx;
|
||||
|
||||
ASSERT(ref.type == EPOLL_TYPE_UDP_LISTEN);
|
||||
|
||||
sidx = flow_lookup_sa(c, IPPROTO_UDP, ref.udp.pif, s_in, ref.udp.port);
|
||||
sidx = flow_lookup_sa(c, IPPROTO_UDP, pif, s_in, port);
|
||||
if ((uflow = udp_at_sidx(sidx))) {
|
||||
uflow->ts = now->tv_sec;
|
||||
return flow_sidx_opposite(sidx);
|
||||
|
@ -193,12 +192,11 @@ flow_sidx_t udp_flow_from_sock(const struct ctx *c, union epoll_ref ref,
|
|||
char sastr[SOCKADDR_STRLEN];
|
||||
|
||||
debug("Couldn't allocate flow for UDP datagram from %s %s",
|
||||
pif_name(ref.udp.pif),
|
||||
sockaddr_ntop(s_in, sastr, sizeof(sastr)));
|
||||
pif_name(pif), sockaddr_ntop(s_in, sastr, sizeof(sastr)));
|
||||
return FLOW_SIDX_NONE;
|
||||
}
|
||||
|
||||
ini = flow_initiate_sa(flow, ref.udp.pif, s_in, ref.udp.port);
|
||||
ini = flow_initiate_sa(flow, pif, s_in, port);
|
||||
|
||||
if (!inany_is_unicast(&ini->eaddr) ||
|
||||
ini->eport == 0 || ini->oport == 0) {
|
||||
|
|
|
@ -26,7 +26,7 @@ struct udp_flow {
|
|||
};
|
||||
|
||||
struct udp_flow *udp_at_sidx(flow_sidx_t sidx);
|
||||
flow_sidx_t udp_flow_from_sock(const struct ctx *c, union epoll_ref ref,
|
||||
flow_sidx_t udp_flow_from_sock(const struct ctx *c, uint8_t pif, in_port_t port,
|
||||
const union sockaddr_inany *s_in,
|
||||
const struct timespec *now);
|
||||
flow_sidx_t udp_flow_from_tap(const struct ctx *c,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue