diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2025-02-07 08:59:57 +0100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-02-09 08:16:41 +0100 |
commit | 864be475d9db58c93540eb883ecf656c3eff861f (patch) | |
tree | d81cd8f007ce848f0c182fbf428e84a6f4427eda | |
parent | fe8b6a7c42625ee1fc63186204d32458b1ba31b9 (diff) | |
download | passt-864be475d9db58c93540eb883ecf656c3eff861f.tar passt-864be475d9db58c93540eb883ecf656c3eff861f.tar.gz passt-864be475d9db58c93540eb883ecf656c3eff861f.tar.bz2 passt-864be475d9db58c93540eb883ecf656c3eff861f.tar.lz passt-864be475d9db58c93540eb883ecf656c3eff861f.tar.xz passt-864be475d9db58c93540eb883ecf656c3eff861f.tar.zst passt-864be475d9db58c93540eb883ecf656c3eff861f.zip |
passt-repair: Send one confirmation *per command*, not *per socket*
It looks like me, myself and I couldn't agree on the "simple" protocol
between passt and passt-repair. The man page and passt say it's one
confirmation per command, but the passt-repair implementation had one
confirmation per socket instead.
This caused all sort of mysterious issues with repair mode
pseudo-randomly enabled, and leading to hours of fun (mostly not
mine). Oops.
Switch to one confirmation per command (of course).
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | passt-repair.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/passt-repair.c b/passt-repair.c index 322066a..614cee0 100644 --- a/passt-repair.c +++ b/passt-repair.c @@ -63,6 +63,7 @@ int main(int argc, char **argv) struct cmsghdr *cmsg; struct msghdr msg; struct iovec iov; + int op; prctl(PR_SET_DUMPABLE, 0); @@ -150,25 +151,24 @@ loop: _exit(1); } - for (i = 0; i < n; i++) { - int o = cmd; + op = cmd; - if (setsockopt(fds[i], SOL_TCP, TCP_REPAIR, &o, sizeof(o))) { + for (i = 0; i < n; i++) { + if (setsockopt(fds[i], SOL_TCP, TCP_REPAIR, &op, sizeof(op))) { fprintf(stderr, - "Setting TCP_REPAIR to %i on socket %i: %s", o, + "Setting TCP_REPAIR to %i on socket %i: %s", op, fds[i], strerror(errno)); _exit(1); } /* Close _our_ copy */ close(fds[i]); + } - /* Confirm setting by echoing the command back */ - if (send(s, &cmd, sizeof(cmd), 0) < 0) { - fprintf(stderr, "Reply to command %i: %s\n", - o, strerror(errno)); - _exit(1); - } + /* Confirm setting by echoing the command back */ + if (send(s, &cmd, sizeof(cmd), 0) < 0) { + fprintf(stderr, "Reply to %i: %s\n", op, strerror(errno)); + _exit(1); } goto loop; |