[Devel] [PATCH criu-ovz] tcp: bind tcp sockets after enabling the repair mode
Andrey Vagin
avagin at openvz.org
Thu Dec 15 10:46:03 PST 2016
From: Andrei Vagin <avagin at 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 <avagin at 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
More information about the Devel
mailing list