net/dump: Separate the NetClientState from the DumpState

With the upcoming dumping-via-netfilter patch, the DumpState
should not be related to NetClientState anymore, so move the
related information to a new struct called DumpNetClient.

Reviewed-by: Yang Hongyang <yanghy@cn.fujitsu.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Thomas Huth 2015-10-13 12:40:00 +02:00 committed by Jason Wang
parent 7bc3074c27
commit 75310e3486
1 changed files with 49 additions and 25 deletions

View File

@ -31,7 +31,6 @@
#include "hub.h"
typedef struct DumpState {
NetClientState nc;
int64_t start_ts;
int fd;
int pcap_caplen;
@ -58,10 +57,8 @@ struct pcap_sf_pkthdr {
uint32_t len;
};
static ssize_t dump_receive_iov(NetClientState *nc, const struct iovec *iov,
int cnt)
static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt)
{
DumpState *s = DO_UPCAST(DumpState, nc, nc);
struct pcap_sf_pkthdr hdr;
int64_t ts;
int caplen;
@ -94,30 +91,12 @@ static ssize_t dump_receive_iov(NetClientState *nc, const struct iovec *iov,
return size;
}
static ssize_t dump_receive(NetClientState *nc, const uint8_t *buf, size_t size)
static void dump_cleanup(DumpState *s)
{
struct iovec iov = {
.iov_base = (void *)buf,
.iov_len = size
};
return dump_receive_iov(nc, &iov, 1);
}
static void dump_cleanup(NetClientState *nc)
{
DumpState *s = DO_UPCAST(DumpState, nc, nc);
close(s->fd);
s->fd = -1;
}
static NetClientInfo net_dump_info = {
.type = NET_CLIENT_OPTIONS_KIND_DUMP,
.size = sizeof(DumpState),
.receive = dump_receive,
.receive_iov = dump_receive_iov,
.cleanup = dump_cleanup,
};
static int net_dump_state_init(DumpState *s, const char *filename,
int len, Error **errp)
{
@ -154,6 +133,49 @@ static int net_dump_state_init(DumpState *s, const char *filename,
return 0;
}
/* Dumping via VLAN netclient */
struct DumpNetClient {
NetClientState nc;
DumpState ds;
};
typedef struct DumpNetClient DumpNetClient;
static ssize_t dumpclient_receive(NetClientState *nc, const uint8_t *buf,
size_t size)
{
DumpNetClient *dc = DO_UPCAST(DumpNetClient, nc, nc);
struct iovec iov = {
.iov_base = (void *)buf,
.iov_len = size
};
return dump_receive_iov(&dc->ds, &iov, 1);
}
static ssize_t dumpclient_receive_iov(NetClientState *nc,
const struct iovec *iov, int cnt)
{
DumpNetClient *dc = DO_UPCAST(DumpNetClient, nc, nc);
return dump_receive_iov(&dc->ds, iov, cnt);
}
static void dumpclient_cleanup(NetClientState *nc)
{
DumpNetClient *dc = DO_UPCAST(DumpNetClient, nc, nc);
dump_cleanup(&dc->ds);
}
static NetClientInfo net_dump_info = {
.type = NET_CLIENT_OPTIONS_KIND_DUMP,
.size = sizeof(DumpNetClient),
.receive = dumpclient_receive,
.receive_iov = dumpclient_receive_iov,
.cleanup = dumpclient_cleanup,
};
int net_init_dump(const NetClientOptions *opts, const char *name,
NetClientState *peer, Error **errp)
{
@ -162,6 +184,7 @@ int net_init_dump(const NetClientOptions *opts, const char *name,
char def_file[128];
const NetdevDumpOptions *dump;
NetClientState *nc;
DumpNetClient *dnc;
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_DUMP);
dump = opts->dump;
@ -195,7 +218,8 @@ int net_init_dump(const NetClientOptions *opts, const char *name,
snprintf(nc->info_str, sizeof(nc->info_str),
"dump to %s (len=%d)", file, len);
rc = net_dump_state_init(DO_UPCAST(DumpState, nc, nc), file, len, errp);
dnc = DO_UPCAST(DumpNetClient, nc, nc);
rc = net_dump_state_init(&dnc->ds, file, len, errp);
if (rc) {
qemu_del_net_client(nc);
}