passt: Relicense to GPL 2.0, or any later version
In practical terms, passt doesn't benefit from the additional
protection offered by the AGPL over the GPL, because it's not
suitable to be executed over a computer network.
Further, restricting the distribution under the version 3 of the GPL
wouldn't provide any practical advantage either, as long as the passt
codebase is concerned, and might cause unnecessary compatibility
dilemmas.
Change licensing terms to the GNU General Public License Version 2,
or any later version, with written permission from all current and
past contributors, namely: myself, David Gibson, Laine Stump, Andrea
Bolognani, Paul Holzinger, Richard W.M. Jones, Chris Kuhn, Florian
Weimer, Giuseppe Scrivano, Stefan Hajnoczi, and Vasiliy Ulyanov.
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2023-04-05 20:11:44 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later
|
2022-09-24 11:08:16 +02:00
|
|
|
* Copyright Red Hat
|
|
|
|
* Author: Stefano Brivio <sbrivio@redhat.com>
|
|
|
|
* Author: David Gibson <david@gibson.dropbear.id.au>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef PORT_FWD_H
|
|
|
|
#define PORT_FWD_H
|
|
|
|
|
2022-09-24 11:08:22 +02:00
|
|
|
/* Number of ports for both TCP and UDP */
|
|
|
|
#define NUM_PORTS (1U << 16)
|
|
|
|
|
2022-09-24 11:08:16 +02:00
|
|
|
enum port_fwd_mode {
|
|
|
|
FWD_SPEC = 1,
|
|
|
|
FWD_NONE,
|
|
|
|
FWD_AUTO,
|
|
|
|
FWD_ALL,
|
|
|
|
};
|
|
|
|
|
2022-09-24 11:08:22 +02:00
|
|
|
#define PORT_BITMAP_SIZE DIV_ROUND_UP(NUM_PORTS, 8)
|
2022-09-24 11:08:16 +02:00
|
|
|
|
2022-09-24 11:08:17 +02:00
|
|
|
/**
|
|
|
|
* port_fwd - Describes port forwarding for one protocol and direction
|
|
|
|
* @mode: Overall forwarding mode (all, none, auto, specific ports)
|
2023-11-03 03:23:02 +01:00
|
|
|
* @scan4: /proc/net fd to scan for IPv4 ports when in AUTO mode
|
|
|
|
* @scan6: /proc/net fd to scan for IPv6 ports when in AUTO mode
|
2022-09-24 11:08:17 +02:00
|
|
|
* @map: Bitmap describing which ports are forwarded
|
|
|
|
* @delta: Offset between the original destination and mapped port number
|
|
|
|
*/
|
|
|
|
struct port_fwd {
|
|
|
|
enum port_fwd_mode mode;
|
2023-11-03 03:23:02 +01:00
|
|
|
int scan4;
|
|
|
|
int scan6;
|
2022-09-24 11:08:17 +02:00
|
|
|
uint8_t map[PORT_BITMAP_SIZE];
|
2022-09-24 11:08:22 +02:00
|
|
|
in_port_t delta[NUM_PORTS];
|
2022-09-24 11:08:17 +02:00
|
|
|
};
|
|
|
|
|
2023-11-03 03:23:03 +01:00
|
|
|
void port_fwd_scan_tcp(struct port_fwd *fwd, const struct port_fwd *rev);
|
|
|
|
void port_fwd_scan_udp(struct port_fwd *fwd, const struct port_fwd *rev,
|
port_fwd, util: Don't bind UDP ports with opposite-side bound TCP ports
When pasta periodically scans bound ports and binds them on the other
side in order to forward traffic, we bind UDP ports for corresponding
TCP port numbers, too, to support protocols and applications such as
iperf3 which use UDP port numbers matching the ones used by the TCP
data connection.
If we scan UDP ports in order to bind UDP ports, we skip detection of
the UDP ports we already bound ourselves, to avoid looping back our
own ports. Same with scanning and binding TCP ports.
But if we scan for TCP ports in order to bind UDP ports, we need to
skip bound TCP ports too, otherwise, as David pointed out:
- we find a bound TCP port on side A, and bind the corresponding TCP
and UDP ports on side B
- at the next periodic scan, we find that UDP port bound on side B,
and we bind the corresponding UDP port on side A
- at this point, we unbind that UDP port on side B: we would
otherwise loop back our own port.
To fix this, we need to avoid binding UDP ports that we already
bound, on the other side, as a consequence of finding a corresponding
bound TCP port.
Reproducing this issue is straightforward:
./pasta -- iperf3 -s
# Wait one second, then from another terminal:
iperf3 -c ::1 -u
Reported-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
Analysed-by: David Gibson <david@gibson.dropbear.id.au>
Fixes: 457ff122e33c ("udp,pasta: Periodically scan for ports to automatically forward")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2023-11-21 17:18:26 +01:00
|
|
|
const struct port_fwd *tcp_fwd,
|
|
|
|
const struct port_fwd *tcp_rev);
|
2023-11-03 03:22:56 +01:00
|
|
|
void port_fwd_init(struct ctx *c);
|
|
|
|
|
2022-09-24 11:08:16 +02:00
|
|
|
#endif /* PORT_FWD_H */
|