mirror of
https://passt.top/passt
synced 2025-05-24 18:15:36 +02:00
util, pif: Replace sock_l4() with pif_sock_l4()
The sock_l4() function is very convenient for creating sockets bound to a given address, but its interface has some problems. Most importantly, the address and port alone aren't enough in some cases. For link-local addresses (at least) we also need the pif in order to properly construct a socket adddress. This case doesn't yet arise, but it might cause us trouble in future. Additionally, sock_l4() can take AF_UNSPEC with the special meaning that it should attempt to create a "dual stack" socket which will respond to both IPv4 and IPv6 traffic. This only makes sense if there is no specific address given. We verify this at runtime, but it would be nicer if we could enforce it structurally. For sockets associated specifically with a single flow we already replaced sock_l4() with flowside_sock_l4() which avoids those problems. Now, replace all the remaining users with a new pif_sock_l4() which also takes an explicit pif. The new function takes the address as an inany *, with NULL indicating the dual stack case. This does add some complexity in some of the callers, however future planned cleanups should make this go away again. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
204e77cd11
commit
b8d4fac6a2
6 changed files with 84 additions and 72 deletions
34
udp.c
34
udp.c
|
@ -809,8 +809,8 @@ int udp_sock_init(const struct ctx *c, int ns, sa_family_t af,
|
|||
ASSERT(!addr);
|
||||
|
||||
/* Attempt to get a dual stack socket */
|
||||
s = sock_l4(c, AF_UNSPEC, EPOLL_TYPE_UDP_LISTEN,
|
||||
NULL, ifname, port, uref.u32);
|
||||
s = pif_sock_l4(c, EPOLL_TYPE_UDP_LISTEN, PIF_HOST,
|
||||
NULL, ifname, port, uref.u32);
|
||||
udp_splice_init[V4][port] = s < 0 ? -1 : s;
|
||||
udp_splice_init[V6][port] = s < 0 ? -1 : s;
|
||||
if (IN_INTERVAL(0, FD_REF_MAX, s))
|
||||
|
@ -819,28 +819,38 @@ int udp_sock_init(const struct ctx *c, int ns, sa_family_t af,
|
|||
|
||||
if ((af == AF_INET || af == AF_UNSPEC) && c->ifi4) {
|
||||
if (!ns) {
|
||||
r4 = sock_l4(c, AF_INET, EPOLL_TYPE_UDP_LISTEN,
|
||||
addr, ifname, port, uref.u32);
|
||||
union inany_addr aany = inany_any4;
|
||||
|
||||
if (addr)
|
||||
inany_from_af(&aany, AF_INET, addr);
|
||||
|
||||
r4 = pif_sock_l4(c, EPOLL_TYPE_UDP_LISTEN, PIF_HOST,
|
||||
&aany, ifname, port, uref.u32);
|
||||
|
||||
udp_splice_init[V4][port] = r4 < 0 ? -1 : r4;
|
||||
} else {
|
||||
r4 = sock_l4(c, AF_INET, EPOLL_TYPE_UDP_LISTEN,
|
||||
&in4addr_loopback,
|
||||
ifname, port, uref.u32);
|
||||
r4 = pif_sock_l4(c, EPOLL_TYPE_UDP_LISTEN, PIF_SPLICE,
|
||||
&inany_loopback4, ifname,
|
||||
port, uref.u32);
|
||||
udp_splice_ns[V4][port] = r4 < 0 ? -1 : r4;
|
||||
}
|
||||
}
|
||||
|
||||
if ((af == AF_INET6 || af == AF_UNSPEC) && c->ifi6) {
|
||||
if (!ns) {
|
||||
r6 = sock_l4(c, AF_INET6, EPOLL_TYPE_UDP_LISTEN,
|
||||
addr, ifname, port, uref.u32);
|
||||
union inany_addr aany = inany_any6;
|
||||
|
||||
if (addr)
|
||||
inany_from_af(&aany, AF_INET6, addr);
|
||||
|
||||
r6 = pif_sock_l4(c, EPOLL_TYPE_UDP_LISTEN, PIF_HOST,
|
||||
&aany, ifname, port, uref.u32);
|
||||
|
||||
udp_splice_init[V6][port] = r6 < 0 ? -1 : r6;
|
||||
} else {
|
||||
r6 = sock_l4(c, AF_INET6, EPOLL_TYPE_UDP_LISTEN,
|
||||
&in6addr_loopback,
|
||||
ifname, port, uref.u32);
|
||||
r6 = pif_sock_l4(c, EPOLL_TYPE_UDP_LISTEN, PIF_SPLICE,
|
||||
&inany_loopback6, ifname,
|
||||
port, uref.u32);
|
||||
udp_splice_ns[V6][port] = r6 < 0 ? -1 : r6;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue