1
0
Fork 0
mirror of https://passt.top/passt synced 2025-06-14 03:25:34 +02:00

passt, tap: Add --fd option

This passes a fully connected stream socket to passt.

Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
[sbrivio: reuse fd_tap instead of adding a new descriptor,
 imply --one-off on --fd, add to optstring and usage()]
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Richard W.M. Jones 2022-11-17 18:49:34 +00:00 committed by Stefano Brivio
parent 15119dcf6c
commit 6b4e68383c
5 changed files with 46 additions and 4 deletions

28
conf.c
View file

@ -719,6 +719,7 @@ static void usage(const char *name)
UNIX_SOCK_PATH, 1);
}
info( " -F, --fd FD Use FD as pre-opened connected socket");
info( " -p, --pcap FILE Log tap-facing traffic to pcap file");
info( " -P, --pid FILE Write own PID to the given file");
info( " -m, --mtu MTU Assign MTU via DHCP/NDP");
@ -1079,6 +1080,7 @@ void conf(struct ctx *c, int argc, char **argv)
{"log-file", required_argument, NULL, 'l' },
{"help", no_argument, NULL, 'h' },
{"socket", required_argument, NULL, 's' },
{"fd", required_argument, NULL, 'F' },
{"ns-ifname", required_argument, NULL, 'I' },
{"pcap", required_argument, NULL, 'p' },
{"pid", required_argument, NULL, 'P' },
@ -1138,9 +1140,9 @@ void conf(struct ctx *c, int argc, char **argv)
if (c->mode == MODE_PASTA) {
c->no_dhcp_dns = c->no_dhcp_dns_search = 1;
optstring = "dqfel:hI:p:P:m:a:n:M:g:i:D:S:46t:u:T:U:";
optstring = "dqfel:hF:I:p:P:m:a:n:M:g:i:D:S:46t:u:T:U:";
} else {
optstring = "dqfel:hs:p:P:m:a:n:M:g:i:D:S:461t:u:";
optstring = "dqfel:hs:F:p:P:m:a:n:M:g:i:D:S:461t:u:";
}
c->tcp.fwd_in.mode = c->tcp.fwd_out.mode = 0;
@ -1355,6 +1357,23 @@ void conf(struct ctx *c, int argc, char **argv)
err("Invalid socket path: %s", optarg);
usage(argv[0]);
}
break;
case 'F':
if (c->fd_tap >= 0) {
err("Multiple --fd options given");
usage(argv[0]);
}
errno = 0;
c->fd_tap = strtol(optarg, NULL, 0);
if (c->fd_tap < 0 || errno) {
err("Invalid --fd: %s", optarg);
usage(argv[0]);
}
c->one_off = true;
break;
case 'I':
if (*c->pasta_ifn) {
@ -1590,6 +1609,11 @@ void conf(struct ctx *c, int argc, char **argv)
usage(argv[0]);
}
if (*c->sock_path && c->fd_tap >= 0) {
err("Options --socket and --fd are mutually exclusive");
usage(argv[0]);
}
ret = conf_ugid(runas, &uid, &gid);
if (ret)
usage(argv[0]);