Commit 65570d95 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

sockets, inet: Use inet_sk_entry as a reference in inet_sk_info

For PB transition.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 8e195849
...@@ -20,7 +20,7 @@ struct inet_sk_desc { ...@@ -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) ...@@ -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);
} }
...@@ -264,10 +264,10 @@ static u32 zero_addr[4]; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
...@@ -436,9 +436,9 @@ static int restore_tcp_conn_state(int sk, struct inet_sk_info *ii) ...@@ -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;
......
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