From: Andrei Vagin <ava...@virtuozzo.com>

Only sockets in the repair mode can be bound to the same
port a few time, what is required to restore tcp connects.

Signed-off-by: Andrei Vagin <ava...@virtuozzo.com>
---
 criu/sk-inet.c | 10 +++++-----
 soccr/soccr.c  | 10 ++++++++++
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/criu/sk-inet.c b/criu/sk-inet.c
index b056e31..cc5a4d6 100644
--- a/criu/sk-inet.c
+++ b/criu/sk-inet.c
@@ -656,11 +656,6 @@ static int open_inet_sk(struct file_desc *d)
        if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes))
                goto err;
 
-       if (ie->src_port) {
-               if (inet_bind(sk, ii))
-                       goto err;
-       }
-
        if (tcp_connection(ie)) {
                if (!opts.tcp_established_ok) {
                        pr_err("Connected TCP socket in image\n");
@@ -677,6 +672,11 @@ static int open_inet_sk(struct file_desc *d)
                goto done;
        }
 
+       if (ie->src_port) {
+               if (inet_bind(sk, ii))
+                       goto err;
+       }
+
        /*
         * Listen sockets are easiest ones -- simply
         * bind() and listen(), and that's all.
diff --git a/soccr/soccr.c b/soccr/soccr.c
index 6be8f7d..2c85ddc 100644
--- a/soccr/soccr.c
+++ b/soccr/soccr.c
@@ -412,6 +412,16 @@ int libsoccr_set_sk_data_noq(struct libsoccr_sk *sk,
        if (data->state == TCP_LISTEN)
                return -1;
 
+       if (data->src_addr.sa.sa_family == AF_INET)
+               addr_size = sizeof(data->src_addr.v4);
+       else
+               addr_size = sizeof(data->src_addr.v6);
+
+       if (bind(sk->fd, &data->src_addr.sa, addr_size) == -1) {
+               loge("Can't bind inet socket back\n");
+               return -1;
+       }
+
        if (mstate & (RCVQ_FIRST_FIN | RCVQ_SECOND_FIN))
                data->inq_seq--;
 
-- 
1.8.3.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to