[CRIU] [PATCH 2/2] tcp: Get TCP_INFO once per socket
Pavel Emelyanov
xemul at virtuozzo.com
Tue Mar 29 12:51:22 PDT 2016
Right now we get SOL_TCP.TCP_INFO option twice, but one time
is enough.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/sk-tcp.c | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c
index 66ca708..6611bf2 100644
--- a/criu/sk-tcp.c
+++ b/criu/sk-tcp.c
@@ -75,17 +75,16 @@ static int tcp_repair_on(int fd)
return ret;
}
-static int refresh_inet_sk(struct inet_sk_desc *sk)
+static int refresh_inet_sk(struct inet_sk_desc *sk, struct tcp_info *ti)
{
int size;
- struct tcp_info info;
- if (dump_opt(sk->rfd, SOL_TCP, TCP_INFO, &info)) {
+ if (dump_opt(sk->rfd, SOL_TCP, TCP_INFO, ti)) {
pr_perror("Failed to obtain TCP_INFO");
return -1;
}
- switch (info.tcpi_state) {
+ switch (ti->tcpi_state) {
case TCP_ESTABLISHED:
case TCP_CLOSE:
break;
@@ -263,31 +262,25 @@ err_recv:
goto err_buf;
}
-static int tcp_stream_get_options(int sk, TcpStreamEntry *tse)
+static int tcp_stream_get_options(int sk, struct tcp_info *ti, TcpStreamEntry *tse)
{
int ret;
socklen_t auxl;
- struct tcp_info ti;
int val;
- auxl = sizeof(ti);
- ret = getsockopt(sk, SOL_TCP, TCP_INFO, &ti, &auxl);
- if (ret < 0)
- goto err_sopt;
-
auxl = sizeof(tse->mss_clamp);
ret = getsockopt(sk, SOL_TCP, TCP_MAXSEG, &tse->mss_clamp, &auxl);
if (ret < 0)
goto err_sopt;
- tse->opt_mask = ti.tcpi_options;
- if (ti.tcpi_options & TCPI_OPT_WSCALE) {
- tse->snd_wscale = ti.tcpi_snd_wscale;
- tse->rcv_wscale = ti.tcpi_rcv_wscale;
+ tse->opt_mask = ti->tcpi_options;
+ if (ti->tcpi_options & TCPI_OPT_WSCALE) {
+ tse->snd_wscale = ti->tcpi_snd_wscale;
+ tse->rcv_wscale = ti->tcpi_rcv_wscale;
tse->has_rcv_wscale = true;
}
- if (ti.tcpi_options & TCPI_OPT_TIMESTAMPS) {
+ if (ti->tcpi_options & TCPI_OPT_TIMESTAMPS) {
auxl = sizeof(val);
ret = getsockopt(sk, SOL_TCP, TCP_TIMESTAMP, &val, &auxl);
if (ret < 0)
@@ -299,9 +292,9 @@ static int tcp_stream_get_options(int sk, TcpStreamEntry *tse)
pr_info("\toptions: mss_clamp %x wscale %x tstamp %d sack %d\n",
(int)tse->mss_clamp,
- ti.tcpi_options & TCPI_OPT_WSCALE ? (int)tse->snd_wscale : -1,
- ti.tcpi_options & TCPI_OPT_TIMESTAMPS ? 1 : 0,
- ti.tcpi_options & TCPI_OPT_SACK ? 1 : 0);
+ ti->tcpi_options & TCPI_OPT_WSCALE ? (int)tse->snd_wscale : -1,
+ ti->tcpi_options & TCPI_OPT_TIMESTAMPS ? 1 : 0,
+ ti->tcpi_options & TCPI_OPT_SACK ? 1 : 0);
return 0;
@@ -313,11 +306,12 @@ err_sopt:
static int dump_tcp_conn_state(struct inet_sk_desc *sk)
{
int ret, aux;
+ struct tcp_info ti;
struct cr_img *img;
TcpStreamEntry tse = TCP_STREAM_ENTRY__INIT;
char *in_buf, *out_buf;
- ret = refresh_inet_sk(sk);
+ ret = refresh_inet_sk(sk, &ti);
if (ret < 0)
goto err_r;
@@ -350,7 +344,7 @@ static int dump_tcp_conn_state(struct inet_sk_desc *sk)
*/
pr_info("Reading options for socket\n");
- ret = tcp_stream_get_options(sk->rfd, &tse);
+ ret = tcp_stream_get_options(sk->rfd, &ti, &tse);
if (ret < 0)
goto err_opt;
--
2.5.0
More information about the CRIU
mailing list