Commit 33051cd3 authored by Pavel Emelyanov's avatar Pavel Emelyanov

sockopt: Add basic options dump/restore

Only snd and rcv bufs and timeouts. Just as an example, others will be adder
sequentially.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 7f82ae11
...@@ -169,6 +169,10 @@ struct pipe_data_entry { ...@@ -169,6 +169,10 @@ struct pipe_data_entry {
#define USK_EXTERN (1 << 0) #define USK_EXTERN (1 << 0)
struct sk_opts_entry { struct sk_opts_entry {
u32 so_sndbuf;
u32 so_rcvbuf;
u64 so_snd_tmo[2];
u64 so_rcv_tmo[2];
}; };
struct unix_sk_entry { struct unix_sk_entry {
......
...@@ -126,6 +126,9 @@ int dump_one_inet(struct socket_desc *_sk, struct fd_parms *p, ...@@ -126,6 +126,9 @@ int dump_one_inet(struct socket_desc *_sk, struct fd_parms *p,
memcpy(ie.src_addr, sk->src_addr, sizeof(u32) * 4); memcpy(ie.src_addr, sk->src_addr, sizeof(u32) * 4);
memcpy(ie.dst_addr, sk->dst_addr, sizeof(u32) * 4); memcpy(ie.dst_addr, sk->dst_addr, sizeof(u32) * 4);
if (dump_socket_opts(lfd, &ie.opts))
goto err;
if (write_img(fdset_fd(glob_fdset, CR_FD_INETSK), &ie)) if (write_img(fdset_fd(glob_fdset, CR_FD_INETSK), &ie))
goto err; goto err;
...@@ -134,9 +137,6 @@ int dump_one_inet(struct socket_desc *_sk, struct fd_parms *p, ...@@ -134,9 +137,6 @@ int dump_one_inet(struct socket_desc *_sk, struct fd_parms *p,
show_one_inet_img("Dumped", &ie); show_one_inet_img("Dumped", &ie);
sk->sd.already_dumped = 1; sk->sd.already_dumped = 1;
if (dump_socket_opts(lfd, &ie.opts))
goto err;
if (tcp_connection(sk)) if (tcp_connection(sk))
return dump_one_tcp(lfd, sk); return dump_one_tcp(lfd, sk);
......
...@@ -66,14 +66,60 @@ int sk_collect_one(int ino, int family, struct socket_desc *d) ...@@ -66,14 +66,60 @@ int sk_collect_one(int ino, int family, struct socket_desc *d)
return 0; return 0;
} }
static int do_restore_opt(int sk, int name, void *val, int len)
{
if (setsockopt(sk, SOL_SOCKET, name, val, len) < 0) {
pr_perror("Can't set SOL_SOCKET:%d (len %d)", name, len);
return -1;
}
return 0;
}
#define restore_opt(s, n, f) do_restore_opt(s, n, f, sizeof(*f))
int restore_socket_opts(int sk, struct sk_opts_entry *soe) int restore_socket_opts(int sk, struct sk_opts_entry *soe)
{ {
int ret = 0;
ret |= restore_opt(sk, SO_SNDBUFFORCE, &soe->so_sndbuf);
ret |= restore_opt(sk, SO_RCVBUFFORCE, &soe->so_rcvbuf);
ret |= restore_opt(sk, SO_SNDTIMEO, &soe->so_snd_tmo);
ret |= restore_opt(sk, SO_RCVTIMEO, &soe->so_rcv_tmo);
return ret;
}
static int do_dump_opt(int sk, int name, void *val, int len)
{
socklen_t aux = len;
if (getsockopt(sk, SOL_SOCKET, name, val, &aux) < 0) {
pr_perror("Can't get SOL_SOCKET:%d opt", name);
return -1;
}
if (aux != len) {
pr_err("Len mismatch on SOL_SOCKET:%d : %d, want %d\n",
name, aux, len);
return -1;
}
return 0; return 0;
} }
#define dump_opt(s, n, f) do_dump_opt(s, n, f, sizeof(*f))
int dump_socket_opts(int sk, struct sk_opts_entry *soe) int dump_socket_opts(int sk, struct sk_opts_entry *soe)
{ {
return 0; int ret = 0;
ret |= dump_opt(sk, SO_SNDBUF, &soe->so_sndbuf);
ret |= dump_opt(sk, SO_RCVBUF, &soe->so_rcvbuf);
ret |= dump_opt(sk, SO_SNDTIMEO, &soe->so_snd_tmo);
ret |= dump_opt(sk, SO_RCVTIMEO, &soe->so_rcv_tmo);
return ret;
} }
int dump_socket(struct fd_parms *p, int lfd, const struct cr_fdset *cr_fdset) int dump_socket(struct fd_parms *p, int lfd, const struct cr_fdset *cr_fdset)
...@@ -337,6 +383,26 @@ char *skstate2s(u32 state) ...@@ -337,6 +383,26 @@ char *skstate2s(u32 state)
return unknown(state); return unknown(state);
} }
static void sk_show_timeval(char *name, u64 *tmo)
{
struct timeval tv;
tv.tv_sec = tmo[0];
tv.tv_usec = tmo[1];
pr_msg("%s: %lu.%lu ", name, tv.tv_sec, tv.tv_usec);
}
void show_socket_opts(struct sk_opts_entry *soe) void show_socket_opts(struct sk_opts_entry *soe)
{ {
struct sk_option *o;
pr_msg("\t");
pr_msg("sndbuf: %u ", soe->so_sndbuf);
pr_msg("rcvbuf: %u ", soe->so_rcvbuf);
sk_show_timeval("sndtmo", soe->so_snd_tmo);
sk_show_timeval("rcvtmo", soe->so_rcv_tmo);
pr_msg("\n");
} }
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