Commit 67d548e9 authored by Andrei Vagin's avatar Andrei Vagin Committed by Pavel Emelyanov

tcp: bind tcp sockets after enabling the repair mode

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

v2: move bind() into libsoccr
v3: fix an error message
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 8664130b
...@@ -628,11 +628,6 @@ static int open_inet_sk(struct file_desc *d) ...@@ -628,11 +628,6 @@ static int open_inet_sk(struct file_desc *d)
if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes)) if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes))
goto err; goto err;
if (ie->src_port) {
if (inet_bind(sk, ii))
goto err;
}
if (tcp_connection(ie)) { if (tcp_connection(ie)) {
if (!opts.tcp_established_ok) { if (!opts.tcp_established_ok) {
pr_err("Connected TCP socket in image\n"); pr_err("Connected TCP socket in image\n");
...@@ -649,6 +644,11 @@ static int open_inet_sk(struct file_desc *d) ...@@ -649,6 +644,11 @@ static int open_inet_sk(struct file_desc *d)
goto done; goto done;
} }
if (ie->src_port) {
if (inet_bind(sk, ii))
goto err;
}
/* /*
* Listen sockets are easiest ones -- simply * Listen sockets are easiest ones -- simply
* bind() and listen(), and that's all. * bind() and listen(), and that's all.
......
...@@ -449,6 +449,16 @@ static int libsoccr_set_sk_data_noq(struct libsoccr_sk *sk, ...@@ -449,6 +449,16 @@ static int libsoccr_set_sk_data_noq(struct libsoccr_sk *sk,
if (data->state == TCP_LISTEN) if (data->state == TCP_LISTEN)
return -1; return -1;
if (sk->src_addr->sa.sa_family == AF_INET)
addr_size = sizeof(sk->src_addr->v4);
else
addr_size = sizeof(sk->src_addr->v6);
if (bind(sk->fd, &sk->src_addr->sa, addr_size)) {
loge("Can't bind inet socket back\n");
return -1;
}
if (mstate & (RCVQ_FIRST_FIN | RCVQ_SECOND_FIN)) if (mstate & (RCVQ_FIRST_FIN | RCVQ_SECOND_FIN))
data->inq_seq--; data->inq_seq--;
......
...@@ -224,7 +224,7 @@ int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue_id, char *bytes, ...@@ -224,7 +224,7 @@ int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue_id, char *bytes,
int libsoccr_set_addr(struct libsoccr_sk *sk, int self, union libsoccr_addr *, unsigned flags); int libsoccr_set_addr(struct libsoccr_sk *sk, int self, union libsoccr_addr *, unsigned flags);
/* /*
* Performs restore actions on bind()-ed socket * Performs restore actions on a socket
*/ */
int libsoccr_restore(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size); int libsoccr_restore(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment