Commit 8d92c2c3 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

protobuf: Convert inet sockets to PB engine

Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent c9ea79db
...@@ -84,23 +84,6 @@ struct sk_opts_entry { ...@@ -84,23 +84,6 @@ struct sk_opts_entry {
u64 so_rcv_tmo[2]; u64 so_rcv_tmo[2];
}; };
struct inet_sk_entry {
u32 id;
u32 ino;
u8 family;
u8 type;
u8 proto;
u8 state;
u16 src_port;
u16 dst_port;
u32 flags;
u32 backlog;
fown_t fown;
u32 src_addr[4];
u32 dst_addr[4];
struct sk_opts_entry opts;
} __packed;
struct vma_entry { struct vma_entry {
u64 start; u64 start;
u64 end; u64 end;
......
#ifndef __CR_SK_INET_H__ #ifndef __CR_SK_INET_H__
#define __CR_SK_INET_H__ #define __CR_SK_INET_H__
#include "protobuf.h"
#include "../protobuf/sk-inet.pb-c.h"
#define INET_ADDR_LEN 40 #define INET_ADDR_LEN 40
struct inet_sk_desc { struct inet_sk_desc {
...@@ -20,7 +23,7 @@ struct inet_sk_desc { ...@@ -20,7 +23,7 @@ struct inet_sk_desc {
}; };
struct inet_sk_info { struct inet_sk_info {
struct inet_sk_entry *ie; InetSkEntry *ie;
struct file_desc d; struct file_desc d;
struct list_head rlist; struct list_head rlist;
}; };
......
...@@ -41,6 +41,7 @@ PROTO_FILES += itimer.proto ...@@ -41,6 +41,7 @@ PROTO_FILES += itimer.proto
PROTO_FILES += mm.proto PROTO_FILES += mm.proto
PROTO_FILES += sk-opts.proto PROTO_FILES += sk-opts.proto
PROTO_FILES += sk-unix.proto PROTO_FILES += sk-unix.proto
PROTO_FILES += sk-inet.proto
HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES)) HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES))
SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES)) SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES))
......
import "fown.proto";
import "sk-opts.proto";
message inet_sk_entry {
required uint32 id = 1;
required uint32 ino = 2;
required uint32 family = 3;
required uint32 type = 4;
required uint32 proto = 5;
required uint32 state = 6;
required uint32 src_port = 7;
required uint32 dst_port = 8;
required uint32 flags = 9;
required uint32 backlog = 10;
repeated uint32 src_addr = 11;
repeated uint32 dst_addr = 12;
required fown_entry fown = 13;
required sk_opts_entry opts = 14;
}
...@@ -33,7 +33,7 @@ static void show_one_inet(const char *act, const struct inet_sk_desc *sk) ...@@ -33,7 +33,7 @@ static void show_one_inet(const char *act, const struct inet_sk_desc *sk)
sk->state, src_addr); sk->state, src_addr);
} }
static void show_one_inet_img(const char *act, const struct inet_sk_entry *e) static void show_one_inet_img(const char *act, const InetSkEntry *e)
{ {
char src_addr[INET_ADDR_LEN] = "<unknown>"; char src_addr[INET_ADDR_LEN] = "<unknown>";
...@@ -167,7 +167,10 @@ err: ...@@ -167,7 +167,10 @@ err:
static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p) static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p)
{ {
struct inet_sk_desc *sk; struct inet_sk_desc *sk;
struct inet_sk_entry ie; InetSkEntry ie = INET_SK_ENTRY__INIT;
SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
FownEntry fown;
int ret = -1;
sk = (struct inet_sk_desc *)lookup_socket(p->stat.st_ino); sk = (struct inet_sk_desc *)lookup_socket(p->stat.st_ino);
if (!sk) { if (!sk) {
...@@ -181,7 +184,7 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -181,7 +184,7 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p)
BUG_ON(sk->sd.already_dumped); BUG_ON(sk->sd.already_dumped);
memset(&ie, 0, sizeof(ie)); pb_prep_fown(&fown, &p->fown);
ie.id = id; ie.id = id;
ie.ino = sk->sd.ino; ie.ino = sk->sd.ino;
...@@ -193,14 +196,26 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -193,14 +196,26 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p)
ie.dst_port = sk->dst_port; ie.dst_port = sk->dst_port;
ie.backlog = sk->wqlen; ie.backlog = sk->wqlen;
ie.flags = p->flags; ie.flags = p->flags;
ie.fown = p->fown;
ie.fown = &fown;
ie.opts = &skopts;
ie.n_src_addr = 4;
ie.n_dst_addr = 4;
ie.src_addr = xmalloc(pb_repeated_size(&ie, src_addr));
ie.dst_addr = xmalloc(pb_repeated_size(&ie, dst_addr));
if (!ie.src_addr || !ie.dst_addr)
goto err;
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)) if (pb_dump_socket_opts(lfd, &skopts))
goto err; goto err;
if (write_img(fdset_fd(glob_fdset, CR_FD_INETSK), &ie)) if (pb_write(fdset_fd(glob_fdset, CR_FD_INETSK), &ie, inet_sk_entry))
goto err; goto err;
pr_info("Dumping inet socket at %d\n", p->fd); pr_info("Dumping inet socket at %d\n", p->fd);
...@@ -209,12 +224,13 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -209,12 +224,13 @@ static int dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p)
sk->sd.already_dumped = 1; sk->sd.already_dumped = 1;
if (tcp_connection(sk)) if (tcp_connection(sk))
return dump_one_tcp(lfd, sk); ret = dump_one_tcp(lfd, sk);
else
return 0; ret = 0;
err: err:
return -1; xfree(ie.src_addr);
xfree(ie.dst_addr);
return ret;
} }
static const struct fdtype_ops inet_dump_ops = { static const struct fdtype_ops inet_dump_ops = {
...@@ -263,11 +279,12 @@ static u32 zero_addr[4]; ...@@ -263,11 +279,12 @@ 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) < BUG_ON(sizeof(zero_addr) <
max(sizeof(ii->ie->dst_addr), sizeof(ii->ie->src_addr))); max(pb_repeated_size(ii->ie, dst_addr),
pb_repeated_size(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, pb_repeated_size(ii->ie, src_addr)) ||
memcmp(zero_addr, ii->ie->dst_addr, sizeof(ii->ie->dst_addr)); memcmp(zero_addr, ii->ie->dst_addr, pb_repeated_size(ii->ie, dst_addr));
} }
...@@ -293,11 +310,7 @@ int collect_inet_sockets(void) ...@@ -293,11 +310,7 @@ int collect_inet_sockets(void)
if (!ii) if (!ii)
break; break;
ii->ie = xmalloc(sizeof(*ii->ie)); ret = pb_read_eof(fd, &ii->ie, inet_sk_entry);
if (!ii->ie)
break;
ret = read_img_eof(fd, ii->ie);
if (ret <= 0) if (ret <= 0)
break; break;
...@@ -377,10 +390,10 @@ static int open_inet_sk(struct file_desc *d) ...@@ -377,10 +390,10 @@ static int open_inet_sk(struct file_desc *d)
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 (pb_rst_file_params(sk, ii->ie->fown, ii->ie->flags))
goto err; goto err;
if (restore_socket_opts(sk, &ii->ie->opts)) if (pb_restore_socket_opts(sk, ii->ie->opts))
return -1; return -1;
return sk; return sk;
...@@ -398,16 +411,21 @@ int inet_bind(int sk, struct inet_sk_info *ii) ...@@ -398,16 +411,21 @@ int inet_bind(int sk, struct inet_sk_info *ii)
} addr; } addr;
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) {
BUG_ON(pb_repeated_size(ii->ie, src_addr) < sizeof(addr.v4.sin_addr.s_addr));
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(addr.v4.sin_addr.s_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) {
BUG_ON(pb_repeated_size(ii->ie, src_addr) < sizeof(addr.v6.sin6_addr.s6_addr));
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(addr.v6.sin6_addr.s6_addr));
addr_size = sizeof(addr.v6); addr_size = sizeof(addr.v6);
} else } else
BUG_ON(1); BUG_ON(1);
...@@ -428,18 +446,21 @@ int inet_connect(int sk, struct inet_sk_info *ii) ...@@ -428,18 +446,21 @@ int inet_connect(int sk, struct inet_sk_info *ii)
} addr; } addr;
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) {
BUG_ON(pb_repeated_size(ii->ie, dst_addr) < sizeof(addr.v4.sin_addr.s_addr));
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(addr.v4.sin_addr.s_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) {
BUG_ON(pb_repeated_size(ii->ie, dst_addr) < sizeof(addr.v6.sin6_addr.s6_addr));
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(addr.v6.sin6_addr.s6_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);
...@@ -454,7 +475,7 @@ int inet_connect(int sk, struct inet_sk_info *ii) ...@@ -454,7 +475,7 @@ int inet_connect(int sk, struct inet_sk_info *ii)
void show_inetsk(int fd, struct cr_options *o) void show_inetsk(int fd, struct cr_options *o)
{ {
struct inet_sk_entry ie; InetSkEntry *ie;
int ret = 0; int ret = 0;
pr_img_head(CR_FD_INETSK); pr_img_head(CR_FD_INETSK);
...@@ -463,28 +484,29 @@ void show_inetsk(int fd, struct cr_options *o) ...@@ -463,28 +484,29 @@ void show_inetsk(int fd, struct cr_options *o)
char src_addr[INET_ADDR_LEN] = "<unknown>"; char src_addr[INET_ADDR_LEN] = "<unknown>";
char dst_addr[INET_ADDR_LEN] = "<unknown>"; char dst_addr[INET_ADDR_LEN] = "<unknown>";
ret = read_img_eof(fd, &ie); ret = pb_read_eof(fd, &ie, inet_sk_entry);
if (ret <= 0) if (ret <= 0)
goto out; goto out;
if (inet_ntop(ie.family, (void *)ie.src_addr, src_addr, if (inet_ntop(ie->family, (void *)ie->src_addr, src_addr,
INET_ADDR_LEN) == NULL) { INET_ADDR_LEN) == NULL) {
pr_perror("Failed to translate src address"); pr_perror("Failed to translate src address");
} }
if (ie.state == TCP_ESTABLISHED) { if (ie->state == TCP_ESTABLISHED) {
if (inet_ntop(ie.family, (void *)ie.dst_addr, dst_addr, if (inet_ntop(ie->family, (void *)ie->dst_addr, dst_addr,
INET_ADDR_LEN) == NULL) { INET_ADDR_LEN) == NULL) {
pr_perror("Failed to translate dst address"); pr_perror("Failed to translate dst address");
} }
} }
pr_msg("id %#x ino %#x family %s type %s proto %s state %s %s:%d <-> %s:%d flags 0x%2x\n", pr_msg("id %#x ino %#x family %s type %s proto %s state %s %s:%d <-> %s:%d flags 0x%2x\n",
ie.id, ie.ino, skfamily2s(ie.family), sktype2s(ie.type), skproto2s(ie.proto), ie->id, ie->ino, skfamily2s(ie->family), sktype2s(ie->type), skproto2s(ie->proto),
skstate2s(ie.state), src_addr, ie.src_port, dst_addr, ie.dst_port, ie.flags); skstate2s(ie->state), src_addr, ie->src_port, dst_addr, ie->dst_port, ie->flags);
pr_msg("\t"), show_fown_cont(&ie.fown), pr_msg("\n"); pr_msg("\t"), pb_show_fown_cont(ie->fown), pr_msg("\n");
pb_show_socket_opts(ie->opts);
show_socket_opts(&ie.opts); inet_sk_entry__free_unpacked(ie, NULL);
} }
out: out:
......
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