From cdc6f4c107454e40fc86fe671ee818119ae69ef4 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Thu, 1 Dec 2016 11:32:25 +0300 Subject: [PATCH] soccr: add source and destination addresses to libsoccr_sk_data These addresses will be used to restore half-closed sockets, we will need to send a fake fin packet for that. And in the next patch connect() will be moved into soccr. Signed-off-by: Andrei Vagin Signed-off-by: Pavel Emelyanov --- criu/include/sk-inet.h | 4 ++++ criu/sk-inet.c | 13 +++++-------- criu/sk-tcp.c | 9 +++++++++ soccr/soccr.h | 10 ++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/criu/include/sk-inet.h b/criu/include/sk-inet.h index a06a8ac16..db3317f7d 100644 --- a/criu/include/sk-inet.h +++ b/criu/include/sk-inet.h @@ -85,4 +85,8 @@ struct rst_tcp_sock { bool reuseaddr; }; +union libsoccr_addr; +int restore_sockaddr(union libsoccr_addr *sa, + int family, u32 pb_port, u32 *pb_addr, u32 ifindex); + #endif /* __CR_SK_INET_H__ */ diff --git a/criu/sk-inet.c b/criu/sk-inet.c index 084eee7d3..1336405a2 100644 --- a/criu/sk-inet.c +++ b/criu/sk-inet.c @@ -11,6 +11,8 @@ #include #include +#include "../soccr/soccr.h" + #include "libnetlink.h" #include "cr_options.h" #include "imgset.h" @@ -655,12 +657,7 @@ err: return -1; } -union sockaddr_inet { - struct sockaddr_in v4; - struct sockaddr_in6 v6; -}; - -static int restore_sockaddr(union sockaddr_inet *sa, +int restore_sockaddr(union libsoccr_addr *sa, int family, u32 pb_port, u32 *pb_addr, u32 ifindex) { BUILD_BUG_ON(sizeof(sa->v4.sin_addr.s_addr) > PB_ALEN_INET * sizeof(u32)); @@ -695,7 +692,7 @@ static int restore_sockaddr(union sockaddr_inet *sa, int inet_bind(int sk, struct inet_sk_info *ii) { bool rst_freebind = false; - union sockaddr_inet addr; + union libsoccr_addr addr; int addr_size, ifindex = 0; if (ii->ie->ifname) { @@ -751,7 +748,7 @@ int inet_bind(int sk, struct inet_sk_info *ii) int inet_connect(int sk, struct inet_sk_info *ii) { - union sockaddr_inet addr; + union libsoccr_addr addr; int addr_size; addr_size = restore_sockaddr(&addr, ii->ie->family, diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c index bd3b0da9e..3e8984816 100644 --- a/criu/sk-tcp.c +++ b/criu/sk-tcp.c @@ -338,6 +338,15 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_ data.rcv_wup = tse->rcv_wup; } + if (restore_sockaddr(&data.src_addr, + ii->ie->family, ii->ie->src_port, + ii->ie->src_addr, 0) < 0) + goto err_c; + if (restore_sockaddr(&data.dst_addr, + ii->ie->family, ii->ie->dst_port, + ii->ie->dst_addr, 0) < 0) + goto err_c; + (void)data; if (libsoccr_set_sk_data_unbound(socr, &data, sizeof(data))) diff --git a/soccr/soccr.h b/soccr/soccr.h index 4e272d567..c5c3e1be7 100644 --- a/soccr/soccr.h +++ b/soccr/soccr.h @@ -1,6 +1,7 @@ #ifndef __LIBSOCCR_H__ #define __LIBSOCCR_H__ #include +#include #include #include "config.h" @@ -57,6 +58,12 @@ void libsoccr_set_log(unsigned int level, void (*fn)(unsigned int level, const c */ struct libsoccr_sk; +union libsoccr_addr { + struct sockaddr sa; + struct sockaddr_in v4; + struct sockaddr_in6 v6; +}; + /* * Connection info that should be saved after fetching from the * socket and given back into the library in two steps (see below). @@ -80,6 +87,9 @@ struct libsoccr_sk_data { __u32 max_window; __u32 rcv_wnd; __u32 rcv_wup; + + union libsoccr_addr src_addr; + union libsoccr_addr dst_addr; }; /*