Commit 4001a324 authored by Pawel Stradomski's avatar Pawel Stradomski Committed by Pavel Emelyanov

Allow criu page-server to work over ipv6.

Signed-off-by: 's avatarPawel Stradomski <pstradomski@google.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 81a37d05
...@@ -1237,39 +1237,50 @@ void print_data(unsigned long addr, unsigned char *data, size_t size) ...@@ -1237,39 +1237,50 @@ void print_data(unsigned long addr, unsigned char *data, size_t size)
} }
} }
static int get_sockaddr_in(struct sockaddr_in *addr, char *host) static int get_sockaddr_in(struct sockaddr_storage *addr, char *host)
{ {
memset(addr, 0, sizeof(*addr)); memset(addr, 0, sizeof(*addr));
addr->sin_family = AF_INET;
if (!host) if (!host) {
addr->sin_addr.s_addr = INADDR_ANY; ((struct sockaddr_in *)addr)->sin_addr.s_addr = INADDR_ANY;
else if (!inet_aton(host, &addr->sin_addr)) { addr->ss_family = AF_INET;
} else if (inet_pton(AF_INET, host, &((struct sockaddr_in *)addr)->sin_addr)) {
addr->ss_family = AF_INET;
} else if (inet_pton(AF_INET6, host, &((struct sockaddr_in6 *)addr)->sin6_addr)) {
addr->ss_family = AF_INET6;
} else {
pr_perror("Bad server address"); pr_perror("Bad server address");
return -1; return -1;
} }
addr->sin_port = htons(opts.port); if (addr->ss_family == AF_INET6) {
((struct sockaddr_in6 *)addr)->sin6_port = htons(opts.port);
} else if (addr->ss_family == AF_INET) {
((struct sockaddr_in *)addr)->sin_port = htons(opts.port);
}
return 0; return 0;
} }
int setup_tcp_server(char *type) int setup_tcp_server(char *type)
{ {
int sk = -1; int sk = -1;
struct sockaddr_in saddr; struct sockaddr_storage saddr;
socklen_t slen = sizeof(saddr); socklen_t slen = sizeof(saddr);
if (get_sockaddr_in(&saddr, opts.addr)) {
return -1;
}
pr_info("Starting %s server on port %u\n", type, opts.port); pr_info("Starting %s server on port %u\n", type, opts.port);
sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); sk = socket(saddr.ss_family, SOCK_STREAM, IPPROTO_TCP);
if (sk < 0) { if (sk < 0) {
pr_perror("Can't init %s server", type); pr_perror("Can't init %s server", type);
return -1; return -1;
} }
if (get_sockaddr_in(&saddr, opts.addr))
goto out;
if (bind(sk, (struct sockaddr *)&saddr, slen)) { if (bind(sk, (struct sockaddr *)&saddr, slen)) {
pr_perror("Can't bind %s server", type); pr_perror("Can't bind %s server", type);
goto out; goto out;
...@@ -1287,7 +1298,12 @@ int setup_tcp_server(char *type) ...@@ -1287,7 +1298,12 @@ int setup_tcp_server(char *type)
goto out; goto out;
} }
opts.port = ntohs(saddr.sin_port); if (saddr.ss_family == AF_INET6) {
opts.port = ntohs(((struct sockaddr_in *)&saddr)->sin_port);
} else if (saddr.ss_family == AF_INET) {
opts.port = ntohs(((struct sockaddr_in6 *)&saddr)->sin6_port);
}
pr_info("Using %u port\n", opts.port); pr_info("Using %u port\n", opts.port);
} }
...@@ -1346,7 +1362,7 @@ out: ...@@ -1346,7 +1362,7 @@ out:
int setup_tcp_client(char *addr) int setup_tcp_client(char *addr)
{ {
struct sockaddr_in saddr; struct sockaddr_storage saddr;
int sk; int sk;
pr_info("Connecting to server %s:%u\n", addr, opts.port); pr_info("Connecting to server %s:%u\n", addr, opts.port);
...@@ -1354,7 +1370,7 @@ int setup_tcp_client(char *addr) ...@@ -1354,7 +1370,7 @@ int setup_tcp_client(char *addr)
if (get_sockaddr_in(&saddr, addr)) if (get_sockaddr_in(&saddr, addr))
return -1; return -1;
sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); sk = socket(saddr.ss_family, SOCK_STREAM, IPPROTO_TCP);
if (sk < 0) { if (sk < 0) {
pr_perror("Can't create socket"); pr_perror("Can't create socket");
return -1; return -1;
......
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