mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-22 09:58:09 +00:00
sockets, inet: Use inet_sk_entry as a reference in inet_sk_info
For PB transition. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
8e195849a3
commit
65570d9559
@ -20,7 +20,7 @@ struct inet_sk_desc {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct inet_sk_info {
|
struct inet_sk_info {
|
||||||
struct inet_sk_entry ie;
|
struct inet_sk_entry *ie;
|
||||||
struct file_desc d;
|
struct file_desc d;
|
||||||
struct list_head rlist;
|
struct list_head rlist;
|
||||||
};
|
};
|
||||||
|
@ -72,6 +72,6 @@ int nf_unlock_connection(struct inet_sk_desc *sk)
|
|||||||
|
|
||||||
int nf_unlock_connection_info(struct inet_sk_info *si)
|
int nf_unlock_connection_info(struct inet_sk_info *si)
|
||||||
{
|
{
|
||||||
return nf_connection_switch_raw(si->ie.src_addr, si->ie.src_port,
|
return nf_connection_switch_raw(si->ie->src_addr, si->ie->src_port,
|
||||||
si->ie.dst_addr, si->ie.dst_port, 0);
|
si->ie->dst_addr, si->ie->dst_port, 0);
|
||||||
}
|
}
|
||||||
|
76
sk-inet.c
76
sk-inet.c
@ -264,10 +264,10 @@ static u32 zero_addr[4];
|
|||||||
static bool is_bound(struct inet_sk_info *ii)
|
static bool is_bound(struct inet_sk_info *ii)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(sizeof(zero_addr) <
|
BUILD_BUG_ON(sizeof(zero_addr) <
|
||||||
max(sizeof(ii->ie.dst_addr), sizeof(ii->ie.src_addr)));
|
max(sizeof(ii->ie->dst_addr), sizeof(ii->ie->src_addr)));
|
||||||
|
|
||||||
return memcmp(zero_addr, ii->ie.src_addr, sizeof(ii->ie.src_addr)) ||
|
return memcmp(zero_addr, ii->ie->src_addr, sizeof(ii->ie->src_addr)) ||
|
||||||
memcmp(zero_addr, ii->ie.dst_addr, sizeof(ii->ie.dst_addr));
|
memcmp(zero_addr, ii->ie->dst_addr, sizeof(ii->ie->dst_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -293,13 +293,17 @@ int collect_inet_sockets(void)
|
|||||||
if (!ii)
|
if (!ii)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ret = read_img_eof(fd, &ii->ie);
|
ii->ie = xmalloc(sizeof(*ii->ie));
|
||||||
|
if (!ii->ie)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ret = read_img_eof(fd, ii->ie);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
file_desc_add(&ii->d, ii->ie.id, &inet_desc_ops);
|
file_desc_add(&ii->d, ii->ie->id, &inet_desc_ops);
|
||||||
|
|
||||||
if (tcp_connection(&ii->ie))
|
if (tcp_connection(ii->ie))
|
||||||
tcp_locked_conn_add(ii);
|
tcp_locked_conn_add(ii);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,25 +321,25 @@ static int open_inet_sk(struct file_desc *d)
|
|||||||
|
|
||||||
ii = container_of(d, struct inet_sk_info, d);
|
ii = container_of(d, struct inet_sk_info, d);
|
||||||
|
|
||||||
show_one_inet_img("Restore", &ii->ie);
|
show_one_inet_img("Restore", ii->ie);
|
||||||
|
|
||||||
if (ii->ie.family != AF_INET && ii->ie.family != AF_INET6) {
|
if (ii->ie->family != AF_INET && ii->ie->family != AF_INET6) {
|
||||||
pr_err("Unsupported socket family: %d\n", ii->ie.family);
|
pr_err("Unsupported socket family: %d\n", ii->ie->family);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ii->ie.type != SOCK_STREAM) && (ii->ie.type != SOCK_DGRAM)) {
|
if ((ii->ie->type != SOCK_STREAM) && (ii->ie->type != SOCK_DGRAM)) {
|
||||||
pr_err("Unsupported socket type: %d\n", ii->ie.type);
|
pr_err("Unsupported socket type: %d\n", ii->ie->type);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = socket(ii->ie.family, ii->ie.type, ii->ie.proto);
|
sk = socket(ii->ie->family, ii->ie->type, ii->ie->proto);
|
||||||
if (sk < 0) {
|
if (sk < 0) {
|
||||||
pr_perror("Can't create unix socket");
|
pr_perror("Can't create unix socket");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tcp_connection(&ii->ie)) {
|
if (tcp_connection(ii->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");
|
||||||
goto err;
|
goto err;
|
||||||
@ -357,26 +361,26 @@ static int open_inet_sk(struct file_desc *d)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii->ie.state == TCP_LISTEN) {
|
if (ii->ie->state == TCP_LISTEN) {
|
||||||
if (ii->ie.proto != IPPROTO_TCP) {
|
if (ii->ie->proto != IPPROTO_TCP) {
|
||||||
pr_err("Wrong socket in listen state %d\n", ii->ie.proto);
|
pr_err("Wrong socket in listen state %d\n", ii->ie->proto);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listen(sk, ii->ie.backlog) == -1) {
|
if (listen(sk, ii->ie->backlog) == -1) {
|
||||||
pr_perror("Can't listen on a socket");
|
pr_perror("Can't listen on a socket");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ii->ie.state == TCP_ESTABLISHED &&
|
if (ii->ie->state == TCP_ESTABLISHED &&
|
||||||
inet_connect(sk, ii))
|
inet_connect(sk, ii))
|
||||||
goto err;
|
goto err;
|
||||||
done:
|
done:
|
||||||
if (rst_file_params(sk, &ii->ie.fown, ii->ie.flags))
|
if (rst_file_params(sk, &ii->ie->fown, ii->ie->flags))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (restore_socket_opts(sk, &ii->ie.opts))
|
if (restore_socket_opts(sk, &ii->ie->opts))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return sk;
|
return sk;
|
||||||
@ -395,15 +399,15 @@ int inet_bind(int sk, struct inet_sk_info *ii)
|
|||||||
int addr_size;
|
int addr_size;
|
||||||
|
|
||||||
memzero(&addr, sizeof(addr));
|
memzero(&addr, sizeof(addr));
|
||||||
if (ii->ie.family == AF_INET) {
|
if (ii->ie->family == AF_INET) {
|
||||||
addr.v4.sin_family = ii->ie.family;
|
addr.v4.sin_family = ii->ie->family;
|
||||||
addr.v4.sin_port = htons(ii->ie.src_port);
|
addr.v4.sin_port = htons(ii->ie->src_port);
|
||||||
memcpy(&addr.v4.sin_addr.s_addr, ii->ie.src_addr, sizeof(ii->ie.src_addr));
|
memcpy(&addr.v4.sin_addr.s_addr, ii->ie->src_addr, sizeof(ii->ie->src_addr));
|
||||||
addr_size = sizeof(addr.v4);
|
addr_size = sizeof(addr.v4);
|
||||||
} else if (ii->ie.family == AF_INET6) {
|
} else if (ii->ie->family == AF_INET6) {
|
||||||
addr.v6.sin6_family = ii->ie.family;
|
addr.v6.sin6_family = ii->ie->family;
|
||||||
addr.v6.sin6_port = htons(ii->ie.src_port);
|
addr.v6.sin6_port = htons(ii->ie->src_port);
|
||||||
memcpy(&addr.v6.sin6_addr.s6_addr, ii->ie.src_addr, sizeof(ii->ie.src_addr));
|
memcpy(&addr.v6.sin6_addr.s6_addr, ii->ie->src_addr, sizeof(ii->ie->src_addr));
|
||||||
addr_size = sizeof(addr.v6);
|
addr_size = sizeof(addr.v6);
|
||||||
} else
|
} else
|
||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
@ -425,17 +429,17 @@ int inet_connect(int sk, struct inet_sk_info *ii)
|
|||||||
int addr_size;
|
int addr_size;
|
||||||
|
|
||||||
memzero(&addr, sizeof(addr));
|
memzero(&addr, sizeof(addr));
|
||||||
if (ii->ie.family == AF_INET) {
|
if (ii->ie->family == AF_INET) {
|
||||||
addr.v4.sin_family = ii->ie.family;
|
addr.v4.sin_family = ii->ie->family;
|
||||||
addr.v4.sin_port = htons(ii->ie.dst_port);
|
addr.v4.sin_port = htons(ii->ie->dst_port);
|
||||||
memcpy(&addr.v4.sin_addr.s_addr,
|
memcpy(&addr.v4.sin_addr.s_addr,
|
||||||
ii->ie.dst_addr, sizeof(ii->ie.dst_addr));
|
ii->ie->dst_addr, sizeof(ii->ie->dst_addr));
|
||||||
addr_size = sizeof(addr.v4);
|
addr_size = sizeof(addr.v4);
|
||||||
} else if (ii->ie.family == AF_INET6) {
|
} else if (ii->ie->family == AF_INET6) {
|
||||||
addr.v6.sin6_family = ii->ie.family;
|
addr.v6.sin6_family = ii->ie->family;
|
||||||
addr.v6.sin6_port = htons(ii->ie.dst_port);
|
addr.v6.sin6_port = htons(ii->ie->dst_port);
|
||||||
memcpy(&addr.v6.sin6_addr.s6_addr,
|
memcpy(&addr.v6.sin6_addr.s6_addr,
|
||||||
ii->ie.dst_addr, sizeof(ii->ie.dst_addr));
|
ii->ie->dst_addr, sizeof(ii->ie->dst_addr));
|
||||||
addr_size = sizeof(addr.v6);
|
addr_size = sizeof(addr.v6);
|
||||||
} else
|
} else
|
||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
|
4
sk-tcp.c
4
sk-tcp.c
@ -436,9 +436,9 @@ static int restore_tcp_conn_state(int sk, struct inet_sk_info *ii)
|
|||||||
int ifd;
|
int ifd;
|
||||||
struct tcp_stream_entry tse;
|
struct tcp_stream_entry tse;
|
||||||
|
|
||||||
pr_info("Restoring TCP connection id %x ino %x\n", ii->ie.id, ii->ie.ino);
|
pr_info("Restoring TCP connection id %x ino %x\n", ii->ie->id, ii->ie->ino);
|
||||||
|
|
||||||
ifd = open_image_ro(CR_FD_TCP_STREAM, ii->ie.id);
|
ifd = open_image_ro(CR_FD_TCP_STREAM, ii->ie->id);
|
||||||
if (ifd < 0)
|
if (ifd < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user