git: 04a3ca71ead6 - main - netcat: Add a flag to enable the use of SO_REUSEPORT_LB
Date: Fri, 24 Jan 2025 16:48:28 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=04a3ca71ead61b4ced23a791d3a5e2633ca1ef72
commit 04a3ca71ead61b4ced23a791d3a5e2633ca1ef72
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-01-24 16:37:43 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-01-24 16:37:43 +0000
netcat: Add a flag to enable the use of SO_REUSEPORT_LB
This is handy for testing purposes. Hide it behind a long option so
that it doesn't conflict with upstream, like we do with several other
flags.
Reviewed by: imp, glebius, delphij
MFC after: 2 weeks
Sponsored by: Klara, Inc.
Sponsored by: Stormshield
Differential Revision: https://reviews.freebsd.org/D48543
---
contrib/netcat/nc.1 | 9 ++++++++-
contrib/netcat/netcat.c | 9 ++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/contrib/netcat/nc.1 b/contrib/netcat/nc.1
index 2e34cdc586c3..5801c6fa00e3 100644
--- a/contrib/netcat/nc.1
+++ b/contrib/netcat/nc.1
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 17, 2023
+.Dd January 20, 2025
.Dt NC 1
.Os
.Sh NAME
@@ -40,6 +40,7 @@
.Op Fl e Ar IPsec_policy
.Op Fl I Ar length
.Op Fl i Ar interval
+.Op Fl -lb
.Op Fl -no-tcpopt
.Op Fl -sctp
.Op Fl -crlf
@@ -175,6 +176,12 @@ options.
Additionally, any timeouts specified with the
.Fl w
option are ignored.
+.It Fl -lb
+When using
+.Fl l ,
+put the socket in load-balancing mode.
+In this mode, multiple sockets can bind to the same address and port,
+and incoming connections are distributed among them.
.It Fl M
Collect per-connection TCP statistics using the
.Xr stats 3
diff --git a/contrib/netcat/netcat.c b/contrib/netcat/netcat.c
index 279489a45e92..7035fdf68961 100644
--- a/contrib/netcat/netcat.c
+++ b/contrib/netcat/netcat.c
@@ -89,6 +89,7 @@ int Fflag; /* fdpass sock to stdout */
unsigned int iflag; /* Interval Flag */
int kflag; /* More than one connect */
int lflag; /* Bind to local port */
+int FreeBSD_lb; /* Use SO_REUSEPORT_LB */
int FreeBSD_Mflag; /* Measure using stats(3) */
int Nflag; /* shutdown() network socket */
int nflag; /* Don't do name look up */
@@ -168,6 +169,7 @@ main(int argc, char *argv[])
char unix_dg_tmp_socket_buf[UNIX_DG_TMP_SOCKET_SIZE];
struct option longopts[] = {
{ "crlf", no_argument, &FreeBSD_crlf, 1 },
+ { "lb", no_argument, &FreeBSD_lb, 1 },
{ "no-tcpopt", no_argument, &FreeBSD_Oflag, 1 },
{ "sctp", no_argument, &FreeBSD_sctp, 1 },
{ "tun", required_argument, NULL, FREEBSD_TUN },
@@ -371,6 +373,8 @@ main(int argc, char *argv[])
errx(1, "cannot use -z and -l");
if (!lflag && kflag)
errx(1, "must use -l with -k");
+ if (!lflag && FreeBSD_lb)
+ errx(1, "must use -l with --lb");
if (FreeBSD_sctp) {
if (uflag)
errx(1, "cannot use -u and --sctp");
@@ -800,6 +804,8 @@ local_listen(char *host, char *port, struct addrinfo hints)
res0 = res;
do {
+ int opt;
+
if ((s = socket(res0->ai_family, res0->ai_socktype,
res0->ai_protocol)) < 0)
continue;
@@ -808,7 +814,8 @@ local_listen(char *host, char *port, struct addrinfo hints)
&rtableid, sizeof(rtableid)) == -1))
err(1, "setsockopt SO_SETFIB");
- ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
+ opt = FreeBSD_lb != 0 ? SO_REUSEPORT_LB : SO_REUSEPORT;
+ ret = setsockopt(s, SOL_SOCKET, opt, &x, sizeof(x));
if (ret == -1)
err(1, NULL);